操作系统-I/O管理
I/O管理
对于操作系统I/O管理部分的基础知识和一些问题的收集和整理。
I/O下与硬件关系密切,上与虚拟存储器系统、文件系统、用户直接交互,是整个操作系统设计中最复杂、最具有挑战性的部分,而且很难有一个通用的设计方案。
I/O设备
重点在于I/O接口的组成及其功能,和I/O端口的相关知识。
I/O设备类型
按照信息交换的单位分类:
- 块设备 常见的如磁盘、磁带。传输速率较高(高速设备)、可寻址(可以随机读/写)。
- 字符设备 如交互式终端机,打印机。传输速率低、不可寻址,时常采用中断I/O。
按照传输速率分类:
- 低速设备 传输速率每秒几字节到数百字节,如鼠标,键盘。
- 中速设备 几千到几万字节。
- 高速设备 数百千字节到千兆字节,如磁盘,磁带,光盘。
I/O接口(设备控制器)
I/O接口(设备控制器)时CPU与设备之间的接口,用于实现设备和计算机之间的数据交换。它接收发自CPU的命令,控制设备工作。
I/O接口的组成
- 设备控制器与CUP之间的接口
该接口有三类信号线:
- 数据线(传送读/写的数据)、
- 控制线(传送读/写的控制信号线)
- 地址线(传送要访问I/O接口种的寄存器编号)
- 设备控制器与设备之间的接口
一个设备控制器可以连接一个或多个设备,因此一个设备控制器种有一个或多个设备接口。每个接口都可以传送数据、控制和状态三种类型的信号。
- I/O逻辑
用于实现对设备的控制。
- 通过一组控制线与CPU交互,对从CPU受到的I/O命令进行解码。
- CPU启动设备时,将启动命令发送给控制器,同时通过地址线将地址发送给控制器,由控制器的I/O逻辑对地址进行译码,并对所选的设备进行控制。
某些时候可能会疏漏,所以,需要强调的是接口都是用来传输数据和信号的,实现设备控制功能的部分实际上是I/O逻辑。
I/O接口的主要功能
- 接收和识别命令
- 数据交换
- 标识和报告设备的状态
- 地址识别
- 数据缓冲
- 差错控制
I/O接口的类型:
按照数据传送方式:
- 并行接口,一个字节或一个字的所有位同时传送
- 串行接口,一个字的所有位依次按照次序传送
按主机访问I/O设备的控制方式:
- 程序查询接口
- 中断接口
- DMA接口
按功能选择的灵活性:
- 可编程接口
- 不可编程接口
I/O端口
I/O端口是指设备控制器中可被CPU直接访问的寄存器
I/O端口的类型
- 数据寄存器
用于缓存从设备送来的输入数据和从CPU送来的输出数据。
- 状态寄存器
保存设备的执行结果或状态信息,以供CPU读取。
- 控制寄存器
由CPU写入,以便启动命令或更改设备模式。
I/O端口编址
I/O端口(设备控制器中可被CPU直接访问的寄存器)若要被CPU访问,就要将各个端口进行编址,每个端口(寄存器)对应一个端口地址(寄存器编号)。
对于I/O端口的编址有两种形式:
- 独立编址
为每一个端口分配一个I/O端口号。I/O端口的地址空间与主存地址空间是两个相对独立的地址空间,其范围可以重叠。普通用户程序无法对端口进行访问,只有操作系统通过特殊的I/O指令才能访问。
优点:
I/O端口数比主存单元少得多,只需要少量的地址线,使得I/O端口译码简单,寻址速度更快。使用专用的I/O指令,可使程序更加清晰,便于检查和理解。缺点:
I/O指令少,只提供简单的传输操作,所以程序设计灵活性较差。此外,CPU需要提供两组独立的存储器和设备的读/写控制信号,增加了控制的复杂性。
- 统一编址(内存映射I/O)
将主存地址空间分出一部分给I/O端口进行编址,I/O端口和主存单元在同一地址空间的不同分段中,根据地址范围就能区分访问的是I/O端口还是主存单元,因此无须设置专门的I/O指令,用统一的访存指令就可访问I/O端口。
优点:
不需要专门的I/O指令,使得CPU访问I/O的操作更加灵活和方便,还使得端口有较大的编址空间。I/O访问的保护机制可由虚拟存储管理系统来实现,无须专门设置。缺点:
端口地址占用了部分主存空间,使主存的可用容量变小。此外,由于在识别I/O端口时全部地址线都参加译码,使得译码电路更复杂,降低了寻址速度。
I/O控制方式
I/O控制是指控制设备与主机之间的数据传送。
对于I/O控制的方式应始终遵循:尽量减少CPU对于I/O控制的干预,将CPU解放出来去尽可能多的执行运算任务。(原因还是在于CPU与I/O设备之间速度的不匹配)
程序轮询
又称程序直接控制方式。CPU对I/O设备采取轮询的I/O方式(这将导致进程的忙等)。
优点: 实现简单
缺点: CPU与I/O设备只能串行工作,CPU将浪费绝大部分的时间在等待I/O设备状态的循环测试中。且CPU与I/O设备以字为单位交换信息,对于块设备这是很低效的。
中断驱动
允许I/O设备主动打断CPU的服务并请求服务(这使得CPU不再需要循环测试I/O设备的状态,使得CPU与设备能够并行工作)。CPU在每个指令周期的末尾检查中断信号,当有来自设备控制器的中断时,CPU保存当前运行的进程的上下文,转去执行中断程序以处理该中断请求。
优点:解放了CPU,使得CPU与设备能够并行执行,CPU的利用率得到提升。
缺点:CPU依旧以字为单位进行I/O的干预,速度受限。
DMA方式(直接存储器存取)
在I/O设备和内存之间开辟直接的数据交换通路,彻底解放CPU。DMA方式的特点如下:
- 基本传送单位为数据块,而不再是字。
- 所传送的数据是从设备直接传送到内存的,或直接从内存直接传送到设备,不经过CPU。
- 仅在传送一个或多个数据块的开始和结束时,才需要CPU的干预。
为了实现主机与控制器之间直接交换成块的数据,需要在DMA控制器中设置如下4类寄存器:
- 命令/状态寄存器(CR)
接收从CPU发来的I/O命令、有关控制信息、或设备的状态。
- 内存地址寄存器(MAR)
存放数据从设备传送到内存的起始目标地址
- 数据寄存器(DR)
暂存从设备到内存或内存到设备的数据
- 数据计数器
存放本次要传送的字数
DMA方式工作的流程:
- CPU接收到设备的DMA请求时,向DMA控制器发送指令,并设置MAR和DC的初值,启动DMA控制器。(此后CPU便继续其他工作)
- DMA控制器获得了I/O控制权,直接与内存交互进行数据的传送,每次传送一个字(这点很重要,实际上还是按字的传输,只不过CPU不再每个字都干预)。
- 数据传送结束,DMA控制器向CPU发送一个中断信号。
优点:
数据传送以块为单位,CPU干预的频率进一步降低(较中断驱动);数据传送不再经过CPU的寄存器(设备直接和内存交互),CPU与设备的并行操作程度进一步提高。
通道控制
I/O通道是一种特殊的处理机,通道指令类型单一,没有自己的内存,通道与主机共享内存,通道所执行的通道程序是放在主机的内存中的。
与DMA方式不同之处在于传输的内存位置、数据块大小等控制信息由通道控制,CPU、通道和I/O设备三者并行运行,进一步减少了CPU对I/O控制的干预。
需要强调的是,I/O通道是一种特殊的处理机,因此属于硬件技术。
I/O软件层次结构
为了使I/O软件具有清晰的结构、良好的可移植性和易适应性,目前普遍采用层次式结构的I/O软件
用户层软件
实现与用户交互的接口,用户可直接调用在用户层提供的、与I/O操作有关的库函数,对设备进行调用。
设备独立性软件
用于实现用户程序与设备驱动程序的统一接口、设备命名、设备保护以及设备的分配与释放等,同时为设备管理和数据传输提供必要的空间(提供缓冲的空间)。
设备独立性
设备独立性又称设备无关性,指应用程序请求使用某类设备的服务时,不局限于某一台具体的物理设备。
为了实现设备独立性,需要引入物理设备与逻辑设备的概念。在应用程序中,使用逻辑设备名来请求使用某类物理设备,而在实际运行过程中,将逻辑设备映射到具体的物理设备。
设备驱动程序
与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动I/O设备工作的驱动程序。
- 通常,每类设备配置一个设备驱动程序,它是I/O进程与设备控制器之间的通信程序,通常以一个进程的形式存在。
- 设备驱动程序接收上层传递的抽象I/O命令,并将其转换为具体要求(转换为具体的硬件操作是设备控制器进行的,对于设备控制器来说,设备驱动设备的命令也就是来自CPU的命令),并发送给I/O接口(设备控制器),由其控制I/O设备工作。
- 设备驱动程序同样将设备控制器发来的信号传递给上层软件,从而为I/O内核隐藏了设备控制器之间的差异。
中断处理程序
用于处理对应的中断。
中断处理程序的主要任务有:
- 进行进程上下文的切换,
- 对处理中断信号源进行测试,
- 读取设备状态和修改进程状态等
应用程序的I/O接口
I/O接口的分类
字符设备接口(流设备)
字符设备是指数据的存取和传输是以字符为单位的设备。
传输速率较低、不可寻址。在输入和输出的时通常采用中断驱动方式。
get与put操作。
由于字符设备不可寻址,只能采用顺序存取的方式,通常为字符设备设置一个缓冲区,用户通过get操作从缓冲区获取字符,通过put操作将字符输出到缓冲区。in-control指令。字符设备种类繁多且差异巨大,因此在接口中提供一种通用的in-control指令来处理它们(包含了许多参数,每个参数表示一个与具体设备相关的特定功能)。
字符设备都属于独占设备,为此在接口中还需要提供打开和关闭操作,以实现互斥共享。
块设备接口
块设备是指数据的存取和传输是以数据块为单位的设备。典型的块设备时磁盘。
传输速率较高、可寻址(可随机访问)。磁盘设备的I/O通常采用DMA方式。
隐藏了磁盘的二维结构(一个扇区的寻址需要磁道号和扇区号)。块设备接口将磁盘的所有扇区从0到n-1编号,这样,就将二维结构变成了一维的线性序列。
网络设备接口(网络通信接口)
- 常见的网络I/O接口是网络套接字接口,套接字接口的调用使应用程序的创建的本地套接字接口连接到远程应用成勋的创建的套接字,通过此链接发送和传输数据。
阻塞I/O与非阻塞I/O
这涉及到I/O的两种模式:
- 阻塞I/O
- 非阻塞I/O
非阻塞I/O实现简单,但需要进程的忙等轮询,CPU利用率较低。阻塞I/O解放了CPU。
设备独立性软件
(他妈的,为了做对照去翻了以前上课的教材,那本书管这玩意叫做与设备无关的I/O软件,这不是纯纯机翻?无语)
设备独立性历年都是考试的重点,所以单独开一节复习。
设备独立性及设备独立性软件
设备独立性
设备独立性又称设备无关性,指应用程序请求使用某类设备的服务时,不局限于某一台具体的物理设备。
为了实现设备独立性,需要引入物理设备与逻辑设备的概念。在应用程序中,使用逻辑设备名来请求使用某类物理设备,而在实际运行过程中,将逻辑设备映射到具体的物理设备。设备独立性软件
用于实现用户程序与设备驱动程序的统一接口、设备命名、设备保护以及设备的分配与释放等,同时为设备管理和数据传输提供必要的空间(提供缓冲的空间)。
题外话——内存和主存的区别
在大部分的语境下内存和主存所指的东西是同一的。而在某些特殊情况下,内存相较主存还包括一些高速缓存。
高速缓存与缓存区
缓冲技术在许多其他层级都使用广泛,比如请求分页管理的页缓冲队列等。
磁盘高速缓存(Disk Cache)
磁盘高速缓存从内存中划分出一块区域存储磁盘内的内容,磁盘高速缓存逻辑上属于磁盘,而在物理上信息存储在内存。磁盘高速存储在内存中有两种存在形式:
- 在内存中开辟一个单独的空间作为缓存区,大小固定。
- 将未利用的空间作为缓存池,供请求分页系统和磁盘I/O共享。
缓冲区 (Buffer)
在设备管理子系统中,引入缓冲区的主要目的如下:
- 缓和CPU与I/O设备之间速度不匹配的问题
- 减少对CPU的中断频率,放宽对CPU中断响应时间的限制
- 解决基本数据单元大小(数据粒度)不匹配的问题
- 提高CPU与I/O设备之间的并行性
缓冲区的实现方法如下:
- 采用硬件缓冲器,但由于成本高,除了一些关键部位外,一般不采用硬件缓冲器。
- 利用内存作为缓冲区
根据系统设置的缓冲区数量,缓冲区技术还可分为三种: