操作系统-I/O(5)I/O软件的层次结构

IO软件的设计目标:
(1)高效率:改善设备效率,尤其是磁盘I/O操作的效率
(2)通用性:用统一的标准来管理所有设备
IO软件的设计思路: 把软件组织成层次结构,低层软件用来屏蔽硬件细节,高层软件向用户提供简洁、友善的界面
IO软件设计中主要考虑的问题:
(1)设备无关性:编写访问文件的程序与具体设备无关
(2)出错处理:低层软件能处理的错误不让高层软件感知
(3)同步/异步传输:支持阻塞和中断驱动两种工作方式
(4)缓冲技术:建立数据缓冲区,提高吞吐率
I/O软件的层次结构:
  • I/O中断处理程序
位于操作系统底层,与硬件设备密切相关,与系统其余部分尽可能少地发生联系
进程请求I/O操作时,通常被挂起,直到数据传输结束后并产生I/O中断时,操作系统接管CPU后转向中断处理程序
当设备向CPU提出中断请求时,CPU响应请求并转入中断处理程序
功能:检查设备状态寄存器内容,判断产生中断的原因,根据I/O操作的完成情况进行相应的处理
  1. 如果数据传输有错,向上层软件报告设备的出错信息,实施重新执行
  2. 如果正常结束,唤醒等待传输的进程,使其转换为就绪态
  3. 如果有等待传输的I/O命令,通知相关软件启动下一个I/O请求
  • 设备驱动程序
包括与设备密切相关的所有代码,从独立于设备的软件中接收并执行I/O请求
把用户提交的逻辑I/O请求转化为物理I/O操作的启动和执行;监督设备是否正确执行,管理数据缓冲区,进行必要的纠错处理
功能:
  1. 设备初始化:在系统初次启动或设备传输数据时,预置设备和控制器以及通道状态
  2. 执行设备驱动例程:负责启动设备,进行数据传输;对于具有通道方式,还负责生成通道指令和通道程序,启动通道工作
  3. 调用和执行中断处理程序:负责处理设备和控制器及通道所发出的各种中断
设备驱动程序分为:
(1)整体驱动程序直接向操作系统提供接口和控制硬件。适用于功能简单的驱动程序,效率较高,但较难迁移
(2)分层驱动程序将驱动程序分成多层,放在栈中,系统接到I/O请求时先调用栈顶的驱动程序,栈顶的驱动程序可以直接处理请求或向下调用更低层的驱动程序,直至请求被处理,适用于功能复杂、重用性要求较高的驱动程序,结构清晰且便于移植,但会增加一部分系统开销。
外设种类繁多、其控制接口不一,导致不同外设的设备驱动程序千差万别, 因而设备驱动程序与设备相关每个设备驱动程序只处理一种设备,或者一类紧密相关的设备。每个外设或每类外设都有一个设备控制器,其中包含各种I/O端口。 CPU通过执行设备驱动程序中的I/O指令访问各种I/O端口。设备所采用的I/O控制方式不同,驱动程序的实现方式也不同:
  1. 程序直接控制:驱动程序完成用户程序的I/O请求后才结束。这种情况下,用户进程在I/O过程中不会被阻塞,内核空间的I/O软件一直代表用户进程在内核态进行I/O处理 。
  2. 中断控制:驱动程序启动第一次I/O操作后,将调出其他进程执行,而当前用户进程被阻塞。在CPU执行其他进程的同时,外设进行I/O操作,此时, CPU和外设并行工作。外设完成I/O时,向CPU发中断请求,然后CPU调出相应中断服务程序执行。在中断服务程序中再次启动I/O操作。
  3. DMA控制:驱动程序对DMA控制器初始化后,便发送“启动DMA传送” 命令,外设开始进行I/O操作并在外设和主存间传送数据。同时CPU执行处理器调度程序,转其他进程执行,当前用户进程被阻塞。DMA控制器完成所有I/O任务后,向CPU发送一个“DMA完成”中断请求信号。
  • 独立于设备的I/O软件
执行适用于所有设备的常用I/O功能,功能包括:
(1)设备驱动程序统一接口:
操作系统为所有外设的设备驱动程序规定一个统一接口,这样,新设备的驱动程序只要按统一接口规范来编制,就可在不修改操作系统的情况下,添加新设备驱动程序并使用新的外设进行I/O。
所有设备都抽象成文件,设备名和文件名在形式上没有差别,设备和文件具有统一的接口,不同设备名和文件名被映射到对应设备驱动程序。
(2)设备命名:通过路径名寻址设备
(3)设备保护:检查用户是否有权访问所申请设备
(4)提供与设备无关的数据单位:字符数量,块尺寸
例如,为了为所有的块设备、字符设备提供一个统一的抽象视图,以隐藏不同块设备、字符设备之间的差异,与设备无关的I/O软件为所有块设备、字符设备设置统一的逻辑块大小。这样,高层I/O软件就只需处理简化的抽象设备,从而在高层软件中简化了数据定位等处理 。
(5)缓冲技术:传输速率、时间约束,不能直接送达目的地。每个设备的I/O都需使用内核缓冲区,因而缓冲区的申请和管理等处理是所有设备公共的,可包含在与设备无关的I/O软件部分
(6)设备分配和状态跟踪:分配不同类型的设备
(7)错误处理和报告:
I/O操作在内核态执行时所发生的错误信息,都通过与设备无关的I/O软件返回给用户进程,也即:错误处理框架与设备无关。
直接返回编程等错误,无需设备驱动程序处理,如请求了不可能的I/O操作、写信息到一个输入设备或从一个输出设备读信息、指定了一个无效缓冲区地址或者参数、指定了不存在的设备等。
有些错误由设备驱动程序检测出来并处理,若驱动程序无法处理,则将错误信息返回给设备无关I/O软件,再由设备无关I/O软件返回给用户进程,如写一个已被破坏的磁盘扇区、打印机缺纸、读一个已关闭的设备等。
(8)打开和关闭文件:
对设备或文件进行打开或关闭等I/O函数所对应的系统调用,并不涉及具体的I/O操作,只要直接对主存中的一些数据结构进行修改即可 ,这部分工作也由设备无关软件来处理。
  • 用户空间的I/O软件
库函数:一小部分I/O软件不在操作系统中,是与应用程序链接在一起的库函数,甚至完全由运行于用户态的程序组成。系统调用通常由库函数封装后供用户使用,封装函数只是将系统调用所用的参数放在合适位置,然后执行访管指令来陷入内核,再由内核函数实现真正的I/O操作。
SPOOLing软件:在内核外运行的系统I/O软件,采用预输入、缓输出和井管理技术,通过创建守护进程和特殊目录解决独占型设备的空占问题
原文地址:https://www.cnblogs.com/yangyuliufeng/p/9328087.html