【操作系统】第十三章 I/O输入系统
分类:
文章
•
2024-03-23 15:28:40
13.1概述
- I/O 设备技术呈现两个相矛盾的趋势:
- 一方面,可以看到硬件与软件接口日益增长的标准化。这一趋势有助于将设备集成到现有计算机和操作系统。
- 方面,也可以看到I/ O设备日益增长的多样性。
- 为了封装不同设备的细节与特点,操作系统内核设计成使用设备驱动程序模块的结构。设备驱动程序为I/ O 于系统提供了统一设备访问接口,就像系统调用为应用程序与操作系统之间提供了统一的标准接口→样。
13.2I/O硬件
- 大多数设备都属于存储设备(磁盘、磁带)、传输设备(网卡、 Modem) 和人机交互设备(屏幕、键盘、鼠标)。其他设备则比较特殊,例如控制军用战斗机或航天飞机的设备。
- 端口:设备与计算机通过端口来通信。
- 总线:是一组线和一组严格定义的可以描述在线上传输信息的协议。
- 链环 (daisy chain):通常按总线方式工作。
- 控制器 (controller) 是用于操作端口、总线或设备的一组电子器件。
-
串行端口控制器是简单的设备控制器。它是计算机上的一块芯片或部分芯片,用以控制串行端口线上的信号。
- 由于 SCSI 协议的复杂性, SCSI 总线控制器常常实现为与计算机相连接的独立的线路板或主机适配器 (host adapter)。该适配器通常有处理器、微码及一部分私有内存。
- 处理器与控制器通信的方法:
- 这种通信的一种方法是通过使用特殊 I/O 指令来向指定的 I/O 端口地址传输一个字节或字。
- 设备控制器也可支持内存映射 I/O。
- I/O 端口通常有 4 种寄存器,即状态寄存器、控制寄存器、数据输入寄存器与数据输出寄存器。
-
数据输入寄存器被主机读出以获取数据。
-
数据输出寄存器被主机写入以发送数据。数据寄存器通常为 1~4B。
-
状态寄存器包含一些主机可读取的位 (bit)。这些位指示各种状态,例如,当前任务是否完成,数据输入寄存器中是否有数据可以读取,是否出现设备故障等。
-
控制寄存器可以被主机用来向设备发送命令或改变设备状态。
13.2.1轮询(CPU和设备控制器不能并行)
- 当主机需要通过端口来写输出数据时,主机与控制器之间握手协调如下:
- ①主机不断地读取忙位(设备控制器中的状态寄存器),直到该位被清除。
- ②主机设置命令寄存器中的写位并向数据输出寄存器中写入一个字节。
- ③主机设置命令就绪位。
- ④当控制器注意到命令就绪位己被设置,则设置忙位。
- ⑤控制器读取命令寄存器,并看到写命令。它从数据输出寄存器中读取一个字节,并向设备执行I/O操作。
- ⑥控制器清除命令就绪位,清除状态寄存器的故障位表示设备I/O 成功,清除忙位表示完成。
- 在步骤①中,主机处于忙等待( busy-waiting) 或轮询 (polling): 在该循环中,不断地读取状态寄存器直到忙位被清除。
- 对许多计算机体系结构,轮询设备只要使用三个 CPU 指令周期就足够了:读取设备寄存器,逻辑AND 以提取状态位,如果不为 0进行跳转。
- 如果让设备准备好时再通知处理器而不是由 CPU 轮询外设I/O 是否已完成,那么效率就会更好。能使外设通知 CPU 的硬件机制称为中断 (interrupt)
13.2.2中断(CPU和设备可以并行)
- CPU每执行完一条指令就会检查有没有中断。
- 设备控制器通过中断请求线(IRL)发送信号而引起(raise) 中断, CPU 捕获(catch) 中断并分发 (dispatch) 到中断处理程序中,中断处理程序通过处理设备请求来清除 (clear) 中断。
- 对于现代操作系统,需要更为成熟的中断处理特性:
- ①在进行关键处理时,能够延迟中断处理。
- ②更为有效地将中断分发到合适的中断处理程序,而不是检查所有设备以决定哪个设备引起中断。
- ③需要多级中断,这样操作系统能区分高优先级或低优先级的中断,能根据紧迫性的程度来响应。
- 对现代计算机硬件来说,这三个特性是由 CPU 与中断控制器 (interupt-controller) 硬件提供的。
- 绝大多数CPU有两个中断请求线:
-
非屏蔽中断。
-
可屏蔽中断 。可以在CPU执行不可中断的指令序列前加以屏蔽。
-
中断向量:包含了特殊中断处理程序的内存地址。
-
中断链接技术中断向量内的每个元素都指向中断处理程序列表的头。
- 当有中断发生时,相应链表上的所有中断处理程序都将一 一调用,直到发现可以处理请求的为止。
- I/O 过程中,各种设备控制器如果准备好服务就会触发中断。这些中断表示输出己完成,或输入数据己准备好,或己检测到错误。
- 中断机制也用来处理各种异常,如被 0 除,访问一个受保护的或不存在的内存地址,企图从用户态执行一个特权指令。
- 另一个例子是系统调用的实现。通常一个程序使用库调用来执行系统调用。库程序检查应用程序所给的参数,建立一个数据结构将参数传递给内核,并执行一个称为软中断(software interrupt) 或者陷阱指令(trap) 的特殊指令。优先级较低。
- 中断也可以用来管理内核的控制流。
- 多线程的内核体系结构非常适合实现多优先级中断,并确保中断处理的优先级要高于内核后台处理和用户程序的优先级。
-
外中断是和外设有关的中断,与当前正在执行的指令都没有关系。
-
内中断或异常是由当前指令引起的中断,例如,除零,用户态下执行特权指令,缺页中断。
- 总而言之,中断在现代操作系统中用来处理异步事件和设置陷阱进入内核模式的管理程序。为了能使最紧迫的工作先做,现代计算机都使用中断优先级。设备控制器、硬件错误、系统调用都可以引起中断并触发内核程序。由于中断大量地用于时间敏感的处理,所以高性能系统需要高效中断处理。
13.2.3直接内存访问
- 传输完成一段连续的数据,发生一次中断。
- DMA控制器:内存始址寄存器,数据长度寄存器,控制寄存器。
- 许多计算机为了避免用 PIO 增加 CPU 的负担,将一部分任务下放给一个的专用处理器,称之为直接内存访问 (direct-memory access, DMA) 控制器。
- 在开始 DMA 传输时,主机向内存中写入 DMA 命令块。该块包括传输的源地址指针、传输的目的地指针、传输的宇节数。 CPU 在将该命令块的地址写入到 DMA 控制器中后,就继续其他工作。
- DMA 控制器与设备控制器之间的握手通过一对被称为 DMA-request 和 DMAacknowledge 的线来进行。
- 当整个传输完成后, DMA 控制器中断 CPU。
- 优点:DMA可以处理一批数据后发生一次中断。
- 发生中断后CPU会查是发生了错误还是传输完成了。
- 通道,PPU,可以处理完多段不连续数据传输后发生一次中断。
-
四种CPU传输方式:
13.3I/O应用接口
- 每新加一个设备,需要安装相应的驱动程序。
- 方式包括抽象、封装与软件分层。
- 这些设备驱动程序一方面可以定制以适合各种设备,另一方面也提供了一组标准接口。
- 设备驱动程序层的作用是为内核I/O 子系统隐藏设备控制器之间的差异。

- 对应用程序访问而言,许多差别都被操作系统所隐藏,设备也分为几种传统类型。
块与字符设备
- 块设备包括磁盘驱动器, 内存映像文件。
-
原始I/O:操作系统本身和特殊应用程序(如数据库管理系统)可能更加倾向于将块设备当做一个简单的线性块数组来访问。
-
直接I/O: 一种越来越常见的折中办法是允许禁止缓存和锁的文件操作模式。
- 内存映射文件访问是建立在块设备驱动程序之上的。
- 字符设备
13.3.3 时钟与定时器
- 许多计算机都有硬件时钟和定时器以提供如下三个基本函数:
- 获取当前时间。
- 获取已经逝去的时间。
- 设置定时器,以在T时触发操作X。
- 这些函数被操作系统和时间敏感的应用程序大量使用。不过,实现这些函数的系统调用并没有在操作系统之间实现标准化。
- 测量逝去时间和触发操作的硬件称为可编程间隔定时器 (programmable intervaltimer) 。
- 。它可被设置为等待一定的时间,然后触发中断。它也可以设置成做一次或重复多次,以产生周期性中断。
13.3.4阻塞与非阻塞I/O
- 当应用程序发出一个阻塞系统调用时,应用程序的执行就被挂起。应用程序将会从操作系统的运行队列移到等待队列上去。在系统调用完成后,应用程序就移回到运行队列,并在适合的时候继续执行并能收到系统调用返回的值。
- 应用程序重叠 I/O 执行的方法之一是编写多线程应用程序。
- 一个非阻塞调用在程序执行过长时间时并不中止应用程序,它会很快返回,其返回值表示已经传输了多少字节。
- 除了非阻塞系统调用外,还有异步系统调用。异步系统调用不必等待I/O 完成就可立即返回。
-
非阻塞与异步系统调用的差别是非阻塞 read()调用会马上返回任何可用的数据,其所读的数据可以等于或少于所要求的,或为零。异步 read() 调用所要求的传输应完整地执行,但其具体执行可以是将来某个特定时间。
13.4I/O内核子系统
13.4.1I/O调度
- 操作系统开发人员通过为每个设备维护一个请求队列来实现调度。
- 当一个应用程序执行阻塞I/O 系统调用时,该请求就加到相应设备的队列 s上,I/O 调度重新安排队列顺序改善系统总体效率和应用程序的平均响应时间。
- 支持异步I/ O的内核同时也要能够跟踪许多I/O 请求。为此,操作系统为设备状态表(device status table) 配备等待队列。
- 每一个表条目表明了设备类型、地址和状态(不工作、空闲或忙)。如果
设备在忙于一个请求,那么请求的类型和其他参数将会被保存在该设备相应的表条目中。
- I/ 子系统改善计算机效率的一种方法是进行I/ 操作调度。另→种方法是使用主存或磁盘上的存储空间的技术,如缓冲、高速缓存、假脱机。
13.4.2缓冲
- 采用缓冲有三个理由:
-
处理数据流的生产者与消费者之间的速度差异 。双缓冲将生产者与消费者进行分离解藕,因而缓和两者之间的时序要求。
-
是协调传输数据大小不一致的设备,网络数据传输,在发送端,一个大消息分成若干小网络包。这些包通过网络传输,接收端将它们放在重组缓冲区内,以生成完整的源数据镜像。
-
支持应用程序I/O 的复制语义:将应用程序缓冲区的数据复制到内核缓冲区。保证写入磁盘的数据是正确的。
13.4.3高速缓存
- 高速缓存 (cache) 是可以保留数据副本的高速存储器。
- 缓冲与高速缓存的差别是缓冲可能是数据项的唯一的副本,而根据定义高速缓存只是提供了一个驻留在其他地方的数据在高速存储上的一个副本。
13.4.4假脱机与设备预留
- 假脱机( Spooling) 是用来保存设备输出的缓冲区,这些设备(如打印机)不能接收交叉的数据流。
- 用程序的输出先是假脱机到一个独立的磁盘文件上。当应用程序完成打印时,假脱机系统将对相应的待送打印机的假脱机文件进行排队。假脱机系统一次复制一个己排队的假胁机文件到打印机上。
- 处理并发设备访问的另一个方法是提供协调所需要的工具。
13.4.5错误处理
- 作为一个规则, I/O 系统调用通常返回一个位来表示调用状态信息,以表示成功或失败。
- 有的硬件能提供很详细的出错信息,虽然目前许多操作系统并不将这些信息传递给应用程序。
13.4.6I/O保护
- 为了防止用户执行非法I/ O,定义所有I/O 指令为特权指令。因此,用户不能直接发出I/ O指令,它们必须通过操作系统来进行。要进行I/O ,用户程序执行系统调用来请求操作系统代表用户程序执行 I/o 操作.
- 另外,所有的内存映射和 I/O 端口内存位置都受到内存保护系统的保护,以阻止用户访问。注意,内核不能简单地拒绝所有用户访问,有的可以用加锁的办法来解决。
13.4.7内核数据结构