Principles of I/O Hardware
I/O Device
块设备(block device):把信息存储在固定大小的块中,每个块有自己的地址。按块寻址的。磁盘是公认块可寻址设备。
字符设备(character device):以字符为单为发送or接收一个字符流,而不考虑任何块结构。字符设备不可寻址,也没有寻道操作。如:打印机、网络接口、鼠标、老鼠???,和大多数与磁盘不同的设备。
其他设备:clocks(既不是块可寻址,也不产生or接收字符流)
Device Controllers
I/O设备由机械部件和电子部件组成
机械部件
电子部件:称为设备控制器(device controller) or 适配器(adapter),
I/O port:每个控制寄存器被分配一个I/O端口号,是一个8位/16位的整数。
I/O端口空间:所有的I/O端口形成I/O端口空间,并且受到保护使得普通用户程序不能对其访问(只有OS能访问)
特殊的I/O指令,例如:
“IN REG,PORT”
CPU可以读取控制寄存器PORT的内容并将结果存入到CPU寄存器REG中。
“OUT PORT,REG”
CPU可以将REG的内容写入控制寄存器中
内存地址空间和I/O地址空间映射
“IN R0,4”读取I/O端口4的内容放入R0 (5-2a)
“MOV R0,4”读取内存字4的内容放入R0 (5-2b)
内存映射 I/O
将所有控制寄存器映射到内存空间中,每个控制寄存器被分配唯一的一个内存地址,并且不会有内存被分配这一地址。
优点:
- I/O设备驱动程序可以用C语言来写,如果不是内存映射IO,就得用汇编。
- 不需要特殊的保护机制来组织用户进程执行I/O操作
- 可以引用内存的每一条指令也可以引用控制寄存器。否则要看控制寄存器,就需要先读入CPU,再查看值。
缺点:
- 内存高速缓存给设备控制寄存器有问题,循环的时候从高速缓存中取值后不在查询设备,导致不能发现设备状态。
- 内存模块和I/O设备必须检查内存引用,看谁作出反应。

Interrupt
当I/O设备完成工作时,就产生一个中断。
- 设备完成工作→通知中断控制器
- 中断控制器发出中断信号→CPU
- CPU响应中断→中断控制器
中断向量:地址线上的数字被用作指向中断向量的表格的索引
中断 & 陷阱
| 中断 | 陷阱 | |
|---|---|---|
| 中断原因 | 外部中断,无法预知什么时候发生 | 当前运行的软件软件主动产生的中断,要求陷入内核态 |
| 中断处理机制 | 由中断控制器响应 | 系统调用,陷入内核态 |
| 行动时间 | 程序运行中,无法预知时间 | 知道发生时间,程序预先设定 |
| 发生环境 |
精确中断 & 不精确中断
精确中断:将机器留在一个明确状态的中断
- PC(程序计数器)在存在一个已知的地方
- PC所指向的指令之前的所有指令已经完全执行
- PC所指向的指令之后的所有指令都没有执行
- PC所指向的指令的执行状态是已知的
不精确中断:不满足上面那些要求的中断
Principles of I/O Software
I/O软件的目标
设备独立性:应该能够编写出程序:可以访问任意I/O设备而无需事先制定设备。(例如,硬盘、CD-ROM、USB无需为每一个设备独立编写程序)
统一命名:一个文件或一个设备的名字应该是一个简单的字符串或一个整数, 它不应依赖于设备
错误处理:错误应该尽可能地再接近硬件地层面得到处理
同步(阻塞)&异步(中断驱动)传输
缓冲(buffering):数据离开一个设备之后通常并不能直接存放到其最终的目的地
共享(shareable)设备:磁盘可以共享
独占(dedicated)设备:磁带机不能共享
程序控制I/O(忙等待)
让CPU做全部工作
CPU把任务交给I/O设备,等待完成,等待过程需要 轮询(polling) or 忙等待(busy waiting)
中断驱动I/O
CPU将任务交给I/O设备后,继续运行其他进程,当I/O设备完成后发送中断请求,调用中断服务过程,CPU保存现场→响应中断→恢复现场 继续执行之前的进程。
使用DMA的I/O
DMA控制器本质是程序控制I/O,但是由DMA控制器处理全部工作,CPU获得自由,可以在I/O期间做其他工作。
DMA 模式
Burst mode:突发模式,burst只需要提供一个起始地址就行了,以后的地址依次加1,而非burst操作每次都要给出地址,以及需要中间的一些应答、等待状态等等。如果是对地址连续的读取,burst效率高得多,但如果地址是跳跃的,则无法采用burst操作
Fly-by mode:被传输的数据既 不通过 DMA 芯片,也不存储在 DMA 芯片中。因此,DMA 只能在 I/O 端口和内存地址间传输数据,而不是在两个I/O端口或者两块内存间。
使用管道的I/O
CPU干预最少的I/O操作
磁盘读写时间决定因素
- 寻道时间:将磁盘臂移动到适当的柱面上所需的时间
- 旋转延迟:等待适当扇区旋转到磁头下所需的时间
- 实际数据传输时间
对大多数磁盘,寻道时间与另外两个时间相比占主导地位,所以减少寻道时间可以充分改善系统性能
许多磁盘驱动程序都维护着一张表,该表按柱面号索引。每一柱面的未完成的请求组成一个链表,链表头存放在表的相应表目中。
I/O Software Layers
中断处理程序
- 保存没有被中断硬件保存的所有寄存器(包括PSW)。、
- 为中断服务过程设置上下文,可能包括设置TLB、MMU和页表。
- 为中断服务过程设置堆栈
- 应答中断控制器,如果不存在集中的中断控制器,则再次开放中断。
- 将寄存器从它们被保存的地方(可能是某个堆栈)复制到进程表中。
- 运行中断服务过程,从发出中断的设备控制器的寄存器中提取信息。
- 选择下一次运行哪个进程,如果中断导致某个被阻塞的高优先级进程变为就绪,则可能选择它现在就运行
- 为下一次要运行的进程设置MMU上下文,也许还需要设置某个 TLB。
- 装入新进程的寄存器,包括其PSW。
- 开始运行新进程
设备响应程序(就是设备驱动)
设备相应程序:每个连接到计算机上的I/O设备都需要某些设备特定的代码来对其进行控制。这样的代码称为设备驱动程序。
每个I/O设备关联一个计算机需要一个特定的设备响应程序
每个设备驱动一般只能处理一种设备,最多是一类相似的设备
为了响应硬件设备(控制寄存器),设备驱动通常都需要进入内核态
与设备无关的I/O软件
设备驱动程序的统一接口
- 没有标准驱动的程序接口:需要大量全新的编程工作,为每个设备编写驱动程序。
- 有标准的驱动程序接口:只需要直到驱动程序接口什么亚子,就很轻松容易。
缓冲
- 没缓冲:对于每个到来的字符,都必须启动用户进程
- 用户缓冲:放入缓冲区直到字符填满。(如果缓冲区被分页调出内存,就把缓冲区锁定在内存中,可能会下降系统性能)
- 内核空间缓冲复制到用户空间:一个不够就来俩
- 双缓冲:一个满了放另一个,一个复制给用户缓冲。另一个满了这一个复制完了也清空了。
- 循环缓冲区:一个指针指向下一个空闲的字,另一个指针指向缓冲区数据第一个字。
错误报告
错误在I/O环境中更为常见
I/O错误类型
- 编程错误:只是将一个错误代码报告返回给调用者
- 实际I/O错误:由驱动程序决定做什么,驱动不知道就向上传递
与设备无关的块大小
不同磁盘有不同的扇区大小
与设备无关快重组一个逻辑块映射提供给更高层,而与物理块无关
用户空间I/O软件
Disks
硬件
磁盘
磁盘被组织成柱面,每个柱面包含若干磁道,磁道与垂直堆叠的磁头个数相同
磁道被分成若干扇区
重叠寻道:控制器可以同时控制两个或多个驱动器进行寻道
逻辑地址:(x, y, z)
x个柱面;y个磁头;每个磁道z个扇区
$磁盘容量 = 磁头数 × 柱面数 × 每道扇区数 × 每扇区字节数$
RAID
CD-ROM
磁盘臂调度算法
磁盘读写时间决定因素
- 寻道时间:将磁盘臂移动到适当的柱面上所需的时间
- 旋转延迟:等待适当扇区旋转到磁头下所需的时间
- 实际数据传输时间
对大多数磁盘,寻道时间与另外两个时间相比占主导地位,所以减少寻道时间可以充分改善系统性能
许多磁盘驱动程序都维护着一张表,该表按柱面号索引。每一柱面的未完成的请求组成一个链 表,链表头存放在表的相应表目中。
先来先服务 FCFS
很难优化寻道时间
最短寻道优先(SSF)

移动了61个柱面
下一次总是处理与磁头距离最近的请求以使寻道时间最小化
不断有其他请求到达,那么磁盘更容易停留在中部区域,
电梯算法(elevator algorithm)
维护一个二进制位:UP 或者 DOWN
当一个请求处理完成后,磁盘or电梯 驱动检查位,如果是UP,就移到下一个更高的未完成的请求。如果更高位置没有未完成请求,方向位取反,变为DOWN,同时存在一个地位置请求,就移向该位置。
移动了60个柱面
Clocks
User Interfaces
Power Management
假脱机技术
脱机技术
脱离主机的控制进行的I/O操作(使用外围控制机实现的)
缓解了CPU与慢速I/O设备的速度矛盾
即使CPU忙碌,也可以提前将数据输入到磁带(比外围设备快一点的设备);即使慢速输出设备忙碌,也可以提前将数据输出到磁带(比慢速输出设备快的设备)
假脱机技术——输入井、输出井
- 假脱机技术,SPOOLing技术,使用软件的方式模拟脱机技术。
- 输入井:模拟脱机输入时候的磁带,用于收容I/O设备输入的数据
- 输出井:模拟脱机输出时候的磁带,收容用户进程输出的数据
- 输入进程:模拟脱机输入时候的外围控制机
- 输出进程:模拟脱机输出时候的外围控制机
在磁盘上开辟两个存储区域“输入井、输出井”
假脱机应用
独占是设备
共享设备:允许多个进程“同时”使用的设备
SPOOLing能把独占式设备(打印机)改装成共享设备。
SPOOLing能把一台物理设备 虚拟成 逻辑上的多台设备
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!