第14章 I/O子系统
14.1 I/O特点
- 常见设备接口类型:
- 字符设备:键盘鼠标、串口
a.以字节为单位顺序访问
b.I/O命令,get(),put()等。通常使用文件访问接口和语义
c.通常速度很慢 - 块设备:磁盘、磁带、光驱
a.均匀的数据块访问
b.I/O命令通常使用文件系统接口,也可以使用内存映射访问 - 网络设备:以太网、无线、蓝牙
a.格式化的报文交换
b.I/O命令:send/receive 网络报文,通过网络接口支持多种网络协议。
- 同步与异步I/O:
1、阻塞I/O:Wait; 发出请求后等待数据读出或写入完毕
- 注意,上图中的用户发出I/O请求时向下处理是绕过中断处理的,由设备驱动把用户请求转换成实际的硬件控制命令。返回时才产生中断请求,转到设备驱动,然后转到用户态。
2、非阻塞I/O:“Don’t Wait”;发出请求后不等待立即返回,返回值为成功传输的字节数
3、异步I/O:“Tell me later”; 读数据时,使用指针标记好用户缓冲区,立即返回,稍后内核将填充缓冲区并通知用户;写数据内核写入完毕后通知用户。
14.2 I/O结构
-
北桥连高速设备,南桥连I/O设备
-
CPU与设备的连接
-
DMA,“Direct Memory Access(存储器直接访问)。这是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据。整个数据传输操作在一个称为"DMA控制器"的控制下进行的。CPU除了在数据传输开始和结束时做一点处理外(开始和结束时候要做中断处理),在传输过程中CPU可以进行其他的工作(前提是未设置停止CPU访问)。这样,在大部分时间里,CPU和输入输出都处于并行操作。因此,使整个计算机系统的效率大大提高”。
-
I/O指令
- 通过I/O端口号访问访问设备寄存器
- 特殊的CPU指令
- out 0x21,AL
-
内存映射I/O
- 设备的寄存器/存储器被映射到内存物理地址空间
- 通过内存load/store指令完成I/O操作
- MMU设置映射,硬件跳线或程序在启动时设置地址
-
内核I/O结构
-
I/O请求生存周期
14.3 I/O数据传输
- CPU与设备控制器的数据传输:
- 程序控制I/O:
a. 通过CPU的in/out或者load/store传输所有数据
b. 特点是硬件简答,编程容易,但是消耗CPU时间和数据量成正比
c.适用于简单的小型的设备I/O - 直接内存访问(DMA)
a. 设备控制器可直接访问系统总线
b. 控制器直接与内存互相传输数据
c. 特点是设备传输数据不影响CPU,只需要在开始和结束的时候CPU参与设置,适用于高吞吐量的I/O。
- I/O设备通知操作系统的机制
- 操作系统需要了解设备状态
- I/O操作完成时间
- I/O操作遇到错误
- 操作系统需要了解设备状态
- 两种方式
- CPU主动轮询
a. I/O设备在特定状态寄存器中放置状态和错误信息
b. 操作系统定期检测状态寄存器
c. 特点是简单,I/O操作频繁或不可预测时开销较大,并且延时较大 - 设备中断
a. CPU在I/O之前设置任务参数
b. CPU在发出I/O请求之后继续执行其他任务
c. I/O设备处理I/O请求
d. I/O设备处理完成时,触发CPU中断请求
e. CPU接收中断,分发到相应中断处理例程
f. 特点是处理不可预测事件事件效果好,但是中断较多时开销较高
- CPU主动轮询
- 实际操作系统中一些设备可能结合了轮询和设备中断;
- 如:高带宽网络设备
- 第一次传入数据包之前采用中断;然后轮询后面的数据包直到硬件缓存为空。
- 如:高带宽网络设备
- 设备中断I/O处理流程
14.4 磁盘调度
-
磁盘工作机制和性能参数
-
磁盘I/O传输时间
-
上图中的公式,Ta是访问时间,Ts是寻道时间,1/2r是旋转延时,1/r是旋转一周的时间,b/rN是传输时间,其中b是传输的比特数,N是磁道上的比特数,r是磁道转数。
-
磁盘调度算法
-
通过优化磁盘访问请求顺序来提高磁盘访问性能。
- 寻道时间是磁盘访问最耗时的部分
- 同时会有多个在同一磁盘上的I/O请求
- 随机处理磁盘访问请求的性能表现很差
-
-
调度算法:
-
FIFO(先进先出算法):按顺序处理请求;公平对待所有进程;
-
SSTF(最短服务时间优先):选择离磁臂当前位置最近的请求执行;总是选择最短寻道时间;
-
扫描算法:磁臂在一个方向上移动,访问所有未完成的请求,直到磁臂到达该方向上最后的磁道,也称电梯算法
-
循环扫描算法(C-SCAN):限制为仅在一个方向上扫描;当最后一个磁道也被访问过了后,磁臂返回到磁道的另外一端再次进行。
-
C-LOOK算法:磁臂先到达该方向上最后一个请求的位置,然后立即反转,而不是先到最后点路径上的所有请求。
-
N步扫描算法:一侧请求过多时,磁头会有粘着现象,后面磁道无法响应,将磁盘请求队列分成长度为N的子队列,按FIFO算法依次处理所有队列,扫描算法处理每个队列
- 磁头粘着(Arm Stickiness)现象
- SSTF,SCAN及CSCAN等算法中,如果一直在磁头所在位置的边上有请求,在这个位置的请求会优先响应,使其它位置得不到响应。可能出现磁头停留在某处不动的情况。
- SSTF,SCAN及CSCAN等算法中,如果一直在磁头所在位置的边上有请求,在这个位置的请求会优先响应,使其它位置得不到响应。可能出现磁头停留在某处不动的情况。
- 磁头粘着(Arm Stickiness)现象
-
双队列扫描算法:只有两个队列,交替使用扫描算法处理两个队列,新生成的I/O请求放入另一个队列中。
14.5 磁盘缓存
-
概念:
- 缓存是数据传输双方访问速度差异较大时引入的速度匹配中间层。
- 磁盘缓存是磁盘扇区在内存中的缓存区。类似于虚拟内存管理,只是方向相反。但是磁盘的访问频率是远低于虚拟存储中的内存访问频率,因此磁盘缓存调度算法会比虚拟存储复杂。
-
单缓存与双缓存:
-
单缓存只有一个缓存区,任意时刻只有一端可以对缓存区进行操作,速度受到限制;
-
双缓存包含两个缓存区,设备与用户进程可以分别操作一个缓冲区,当一个缓冲区1写完并且缓冲区2读完了,可以将两个缓冲区交换,继续操作。
-
访问频率置换算法
-
问题
- 在一段密集磁盘访问之后, LFU算法的引用计数会增加到很大,之后的变化无法反应当前的引用情况。
-
算法思路
- 该算法考虑磁盘访问的密集特征,对密集引用不计数。
- 在短周期内使用LRU算法,在长周期中使用LFU算法。