第5章 输入/输出

除了提供抽象(例如,进程(和线程)、地址空间和文件)以外,操作系统还要控制计算机的所有I/O(输入/输出)设备。操作系统必须向设备发送命令,捕捉中断,并处理设备的各种错误。它还应该在设备和系统的其他部分之间提供简单且易于使用的接口。如果有可能,这个接口对于所有设备都应该是相同的,这就是所谓的设备无关性。I/O部分的代码是整个操作系统的重要组成部分。操作系统如何管理I/O是本章的主题。

本章的内容是这样组织的:首先介绍I/O硬件的基本原理,然后介绍一般的I/O软件。I/O软件可以分层构造,每层都有明确的任务。我们将对这些软件层进行研究,看一看它们做些什么,以及如何在一起配合工作。

在此之后将详细介绍几种I/O设备:磁盘、时钟、键盘和显示器。对于每一种设备我们都将从硬件和软件两方面加以介绍。最后,我们还将介绍电源管理。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

5.1 I/O硬件原理

不同的人对于I/O硬件的理解是不同的。对于电子工程师而言,I/O硬件就是芯片、导线、电源、电机和其他组成硬件的物理部件。对程序员而言,则只注意I/O硬件提供给软件的接口,如硬件能够接收的命令、它能够完成的功能以及它能够报告的错误。本书主要介绍怎样对I/O设备编程,而不是如何设计、制造和维护硬件,因此,我们的讨论限于如何对硬件编程,而不是其内部的工作原理。然而,很多I/O设备的编程常常与其内部操作密切相关。在下面三节中,我们将介绍与I/O硬件编程有关的一般性背景知识。这些内容可以看成是对1.4节介绍性材料的复习和扩充。

5.1.1 I/O设备

I/O设备大致可以分为两类:块设备(block device)和字符设备(character device)。块设备把信息存储在固定大小的块中,每个块有自己的地址。通常块的大小在512字节至32 768字节之间。所有传输以一个或多个完整的(连续的)块为单位。块设备的基本特征是每个块都能独立于其他块而读写。硬盘、CD-ROM和USB盘是最常见的块设备。

如果仔细观察,块可寻址的设备与其他设备之间并没有严格的界限。磁盘是公认的块可寻址的设备,因为无论磁盘臂当前处于什么位置,它总是能够寻址其他柱面并且等待所需要的磁盘块旋转到磁头下面。现在考虑一个用来对磁盘进行备份的磁带机。磁带包含按顺序排列的块。如果给出命令让磁带机读第N块,它可以首先向回倒带,然后再前进直到第N块。该操作与磁盘的寻道相类似,只是花费的时间更长。不过,重写磁带中间位置的块有可能做得到,也有可能做不到。即便有可能把磁带当作随机访问的块设备来使用,也是有些勉为其难的,毕竟通常并不这样使用磁带。

另一类I/O设备是字符设备。字符设备以字符为单位发送或接收一个字符流,而不考虑任何块结构。字符设备是不可寻址的,也没有任何寻道操作。打印机、网络接口、鼠标(用作指点设备)、老鼠(用作心理学实验室实验),以及大多数与磁盘不同的设备都可看作是字符设备。

这种分类方法并不完美,有些设备就没有包括进去。例如,时钟既不是块可寻址的,也不产生或接收字符流。它所做的工作就是按照预先规定好的时间间隔产生中断。内存映射的显示器也不适用于此模型。但是,块设备和字符设备的模型具有足够的一般性,可以用作使处理I/O设备的某些操作系统软件具有设备无关性的基础。例如,文件系统只处理抽象的块设备,而把与设备相关的部分留给较低层的软件。

I/O设备在速度上覆盖了巨大的范围,要使软件在跨越这么多数量级的数据率下保证性能优良,给软件造成了相当大的压力。图5-1列出了某些常见设备的数据率,这些设备中大多数随着时间的推移而变得越来越快。

阅读 ‧ 电子书库
图 5-1 某些典型的设备、网络和总线的数据率