I/O 硬件原理
I/O 设备
I/O 设备大致可以分为两类:块设备和字符设备。
块设备把信息存储在固定大小的块中,每个块有自己的地址。通常块的大小在521字节至65536字节之间。所有传输以一个或多个完整的连续的块为单位。块设备的基本特征是每个块都能独立于其他块而读写。硬盘、蓝光光盘和 USB 盘是最常见的块设备。
字符设备以字符为单位发送或接收一个字符流,而不考虑任何块结构。字符设备是不可寻址的,也没有任何寻道操作。打印机、网络接口、鼠标可看做字符设备。
设备控制器
I/O 设备一般由机械部件和电子部件两部分组成。电子部件称作设备控制器或适配器。
控制器的任务是把串行的位流转换为字节块,并进行必要的错误校正工作。
内存映射 I/O
设备控制器中有控制寄存器和数据缓冲区用来与 CPU 进行通信。
- 单独的 I/O 和内存空间
- 每个控制寄存器被分配一个 I/O 端口号,所有的 I/O 端口形成 I/O 端口空间,并且受到保护使得普通用户程序不能对其进行访问,只有操作系统可以访问。
- 内存映射 I/O
- 将所有控制寄存器映射到内存空间中,每个控制寄存器被分配唯一的一个内存地址,并且不会有内存被分配这一地址。
- 在大多数系统中,分配给控制寄存器的地址位于或者靠近地址空间的顶端。
- 混合方案
内存映射 I/O 的优点:
- 对于内存映射 I/O,设备控制寄存器只是内存中的变量,在 C 语言中可以和任何其他变量一样寻址,因此 I/O 设备驱动程序可以完全用 C 语言编写。否则,就要用到某些汇编代码。
- 对于内存映射 I/O,不需要特殊的保护机制来阻止用户进程执行 I/O 操作,操作系统必须要做的全部事情只是避免把包含控制寄存器的那部分地址空间放入任何用户的虚拟地址空间之中。
- 对于内存映射 I/O,可以引用内存的每一条指令也可以引用控制寄存器。
中断
当一个 I/O 设备完成交给它的工作时,它就产生一个中断。
中断信号导致 CPU 停止当前正在做的工作并且开始做其他的事情。地址线上的数字被用做指向一个称为中断向量的表格的索引,以便读取一个新的程序计数器。这一程序计数器指向相应的中断服务过程的开始。一般情况下,陷阱和中断从这一点上看使用相同的机制,并且常常共享相同的中断向量。中断向量的位置可以硬布线到机器中,也可以在内存中的任何地方通过一个 CPU 寄存器(由操作系统装载)指向其起点。
I/O 软件原理
I/O 软件的目标
- 设备独立性:程序可以访问任意 I/O 设备而无需事先指定设备。
- 统一命名:一个文件或一个设备的名字应该是一个简单的字符串或整数,它不应依赖于设备。
- 错误处理:错误应该尽可能地在接近硬件的层面得到处理,如果设备控制器处理不了,那么设备驱动程序应当予以处理。
- 同步(阻塞)和异步传输(中断驱动): 操作系统使实际上是中断驱动(异步)的操作变为在用户程序看来是阻塞式(同步)的操作。
- 缓冲:数据离开一个设备之后通常并不能直接存放到其最终的目的地。
- 共享设备和设备独占:有些设备局无法共享,如写入磁带;而独占设备又会带来各种问题,如死锁。
程序控制 I/O
I/O 可以采用三种根本上不同的方式来实现:程序控制 I/O、中断驱动 I/O 和使用 DMA 的 I/O。
以打印一个字符串为例:首先,数据被复制到内核空间。然后,操作系统进入一个密闭的循环,一次输出一个字符。在输出一个字符之后,CPU 要不断地查询设备以了解它是否就绪准备接收另一个字符。这一行为通常称为轮询或忙等待。
程序控制 I/O 十分简单但是有缺点:直到全部 I/O 完成之前要占用 CPU 的全部时间。
中断驱动 I/O
这种允许 CPU 在等待打印机变为就绪的同时做某些其他事情的方式就是使用中断。
当打印字符串的系统调用发出时,字符串缓冲区被复制到内核空间,并且一旦打印机准备好接收一个字符时就将第一个字符复制到打印机中。这时,CPU 要调用调度程序,并且某个其他进程将运行,请求打印字符串的进程将被阻塞,直到整个字符串打印完。
当打印机将字符打印完并且准备好接收下一个字符时,它将产生一个中断。这一中断将停止当前进程并且保存其状态。然后,打印机中断服务过程将运行。如果没有更多的字符要打印,中断处理程序就采取某个操作将用户进程解除阻塞。否则,它将输出下一个字符,应答中断,并且返回到中断之前正在运行的进程,该进程将从其停止的地方继续运行。
使用 DMA 的 I/O
中断驱动 I/O 的一个明显缺点是中断发生在每个字符上。中断要花费时间,所以这一方法将浪费一定数量的 CPU 时间。这一问题的一种解决方法是使用直接存储器 DMA。
DMA 控制器能够独立于 CPU 而访问系统总线。
让 DMA 控制器一次给打印机提供一个字符,而不必打扰 CPU。本质上,DMA 是程序控制 I/O,只是由 DMA 控制器而不是主 CPU 做全部工作。这一策略需要特殊的硬件(DMA 控制器),但是使 CPU 获得自由从而可以在 I/O 期间做其他工作。
DMA 的重大成功是将中断的次数从打印每个字符一次减少到打印每个缓冲区一次。
使用通道的 I/O
I/O 软件层次
- I/O 软件系统的层次
用户级 I/O 软件 |
---|
与设备无关的操作系统软件 |
设备驱动程序 |
中断处理程序 |
硬件 |
中断处理程序
当中断发生时,中断处理程序将做它必须要做的全部工作以便对中断进行处理。然后,它可以将启动中断的驱动程序接触阻塞。
设备驱动程序
每个连接到计算机上的 I/O 设备都需要某些设备特定的代码来对其进行控制。这样的代码称为设备驱动程序,它一般由设备的制造商编写并随同设备一起交付。因为每一个操作系统都需要自己的设备驱动程序,所以设备制造商通常要为若干流行的操作系统提供驱动程序。
为了访问设备的硬件,意味着访问设备控制器的寄存器,设备驱动程序通常必须是操作系统内核的一部分,至少对目前的体系结构是如此。
与设备无关的 I/O 软件
虽然 I/O 软件中有一些是设备特定的,但是其他部分 I/O 软件都是与设备无关的。
与设备无关的软件的基本功能是执行对所有设备公共的 I/O 功能,并且向用户层软件提供一个统一的接口。
与设备无关的 I/O 软件的功能:
- 设备驱动程序的统一接口
- 设备驱动程序与操作系统其余部分之间的接口。
- 如何给 I/O 设备命名,把符号化的设备名映射到适当的驱动程序上。
- 缓冲
- 缓冲可以提高应用的性能。
- 错误报告
- 错误在 I/O 上下文中比在其他上下文中要常见得多。当错误发生时,操作系统必须尽最大努力对它们进行处理。许多错误是设备特定的并且必须由适当的驱动程序来处理,但是错误处理的框架是设备无关的。
- 错误的类型:
- 编程错误
- 实际的 I/O 错误
- 分配与释放专用设备
- 提供与设备无关的块大小
- 不同的磁盘可能具有不用的扇区大小。应该由与设备无关的软件来隐藏这一事实并且向高层提供一个统一的块大小。
用户空间的 I/O 软件
尽管大部分 I/O 软件都在操作系统内部,但是仍然有一小部分在用户空间,包括与用户程序连接在一起的库,甚至完全运行于内核之外的程序。有一个重要的类别是假脱机系统,假脱机是多道程序设计系统中处理独占 I/O 设备的一种方法。
I/O 系统的层次以及每一层的主要功能
I/O 请求 | 层次 | I/O 应答 | I/O 功能 |
---|---|---|---|
↓ | 用户进程 | ↑ | 产生 I/O 请求;对 I/O 进行格式化;假脱机 |
↓ | 与设备无关的软件 | ↑ | 命名、保护、分块、缓冲、分配 |
↓ | 设备驱动程序 | ↑ | 设置设备寄存器;检查状态 |
↓ | 中断处理程序 | ↑ | 当 I/O 完成时唤醒驱动程序 |
↓ | 硬件 | ↑ | 执行 I/O 操作 |
盘
磁盘
磁盘被组织成柱面,每一个柱面包含若干磁道,磁道数与垂直堆叠的磁头个数相同,磁道又被分成若干个扇区。
- IDE:Integrated Drive Electronics,集成驱动电子设备
- SATA:Serial ATA,串行 ATA
对磁盘驱动程序有重要意义的一个设备特性是:控制器是否可以同时控制两个或多个驱动程序进行寻道,这就是重叠寻道。
(x,y,z):x 个柱面、y 个磁头、每磁道 z 个扇区。所有现代的磁盘都支持逻辑块寻址系统,在这样的系统中,磁盘扇区从0开始连续编号,而不管磁盘的几何规格如何。
磁盘臂调度算法
读写磁盘的时间由以下三个因素决定:
- 寻道时间:将磁盘臂移动到适当的柱面上所需的时间。
- 旋转延迟:等待适当扇区旋转到磁头下所需的时间。
- 实际数据传输时间。
对大多数磁盘而言,寻道时间与另外两个时间相比占主导地位,所以减少平均寻道时间可以充分改善系统性能。
许多磁盘驱动程序都维护着一张表,该表按柱面号索引。每一柱面的未完成的请求组成一个链表,链表头存放在表的相应表目中。
- 先来先服务,FCFS
- 最短寻道优先,SSF
- 电梯算法
RAID
- Redundant Array of Inexpensive Disk(廉价磁盘冗余阵列)
- Redundant Array of Independent Disk(独立磁盘冗余阵列)
改进磁盘的性能和可靠性。
将数据分布在多个驱动器上称为划分条带。
- 0级 RAID:将连续的条带以轮转方式写到全部驱动器上。
- 1级 RAID:复制了所有的磁盘。
稳定存储器
目标是不惜一切代价保持磁盘的一致性。并且是在软件中实现的。
稳定存储器使用一对完全相同的磁盘,对应的块一同工作以形成一个无差错的块。当不存在错误时,在两个驱动器上对应的块是相同的,读取任意一个都可以得到相同的结果。为了达到这一目的,定义了下述三种操作:
- 稳定写
- 稳定读
- 崩溃恢复
时钟
- 时钟硬件:根据已知的时间间隔产生中断
- 时钟软件(时钟驱动程序):
- 维护日时间
- 防止进程超时运行
- 对 CPU 的使用情况记账
- 处理用户进程提出的 alarm 系统调用
- 为系统本身的各个部分提供监控定时器
- 完成概要剖析、监视和统计信息收集
用户界面
- 输入设备
- 键盘
- 鼠标
- 输出设备
- 监视器
- 终端
- 文本窗口
- 图形用户界面(GUI)
- X 窗口系统
电源管理
两种减少能量消耗的一般方法:
- 当计算机的某些部件(主要是 I/O 设备)不用的时候由操作系统关闭它们。
- 应用程序使用较少的能力,但可能会降低用户体验的质量。
- 显示器
- 硬盘
- CPU
- 内存
- 无线通信
- 热量管理
- 电池管理
- 节能模式