I/O子系统
1.IO接口设备类型
1.1字符设备
如: 键盘/鼠标, 串口等
以字节为单位顺序访问
I/O命令:get()、put()等;通常使用文件访问接口和语义
1.2块设备
如: 磁盘驱动器、磁带驱动器、光驱等
I/O命令:原始I/O或文件系统接口;内存映射文件访问
1.3网络设备
如: 以太网、无线、蓝牙等
格式化报文交换
I/O命令:send/receive 网络报文;通过网络接口支持多种网络协议
2.IO通信方式
2.1阻塞I/O
读数据(read)时,进程将进入等待状态,直到完成数据读出
写数据(write)时,进程将进入等待状态,直到设备完成数据写入处理
进程在设备读写过程中处于等待状态,直到IO操作完成。
2.2非阻塞I/O
立即从read或write系统调用返回,返回值为成功传输字节数
read或write的传输字节数可能为零
2.3异步I/O
读数据时,使用指针标记好用户缓冲区,立即返回;稍后内核将填充缓冲区并通知用户
写数据时,使用指针标记好用户缓冲区,立即返回;稍后内核将处理数据并通知用户
3.IO结构
CPU通过总线与内存以及IO设备连接
3.1CPU与设备的连接
设备控制器:CPU和I/O设备间的接口;向CPU提供特殊指令和寄存器;
I/O地址:CPU用来控制I/O硬件;
内存地址或端口号:I/O指令;内存映射I/O;
CPU与设备的通信方式:轮询、设备中断和DMA
I/O指令:通过I/O端口号访问设备寄存器;特殊的CPU指令:out 0x21,AL
内存映射I/O:设备的寄存器/存储被映射到内存物理地址空间中;通过内存load/store指令完成I/O操作;MMU设置映射,硬件跳线或程序在启动时设置地址
3.2内核I/O结构
IO设备,设备控制器,总线,设备驱动程序,IO子系统,内核
IO子系统完成对于IO设备的管理,缓存等操作。
3.3I/O请求生存周期
由上到下依次为用户进程,内核IO子系统,设备驱动,中断处理黎城,硬件设备;
用户进程发出IO请求,通过系统调用陷入内核态,首先判断IO子系统中是否已有IO请求结果,如果有则直接返回即可;
否则向设备驱动发送IO请求,设备驱动向设备发出控制命令,硬件设备完成IO操作,由设备控制器控制生成中断请求,进入中断处理例程,保存结果,通知设备驱动,进而通知内核IO子系统,进而返回给用户进程;
4.IO数据传输
CPU与设备控制器的数据传输
4.1程序控制I/O(PIO, Programmed I/O)
通过CPU的in/out或者load/store传输所有数据;
硬件简单,编程容易;消耗的CPU时间和数据量成正比;
适用于简单的、小型的设备I/O;
4.2直接内存访问(DMA)
设备控制器可直接访问系统总线
控制器直接与内存互相传输数据
设备传输数据不影响CPU;需要CPU参与设置
适用于高吞吐量I/O
DMA方式数据传输的步骤
4.3I/O 设备通知操作系统机制
轮询
I/O 设备在特定的状态寄存器中放置状态和错误信息,操作系统定期检测状态寄存器;
简单,I/O操作频繁或不可预测时,开销大和延时长;
设备中断
设备中断处理流程
CPU在I/O之前设置任务参数;
CPU发出I/O请求后,继续执行其他任务;
I/O设备处理I/O请求;
I/O设备处理完成时,触发CPU中断请求;
CPU接收中断,分发到相应中断处理例程;
处理不可预测事件效果好;开销相对较高;
一些设备可能结合了轮询和设备中断,如:高带宽网络设备,第一个传入数据包到达前采用中断,轮询后面的数据包直到硬件缓存为空。
5.磁盘调度
磁盘工作机制和性能参数
读取或写入时,磁头必须被定位在期望的磁道,并从所期望的柱面和扇区的开始
寻道时间,定位到期望的磁道所花费的时间
旋转延迟,从零扇区开始处到达目的地花费的时间,平均旋转延迟时间=磁盘旋转一周时间的一半
磁盘I/O传输时间
传输时间主要包括等待设备可用,等待通道可用,寻道时间Ts,旋转延时和数据传输的时间。
优化磁盘IO效率,主要是优化寻道时间。
磁盘调度算法 通过优化磁盘访问请求顺序来提高磁盘访问性能
寻道时间是磁盘访问最耗时的部分;同时会有多个在同一磁盘上的I/O请求;随机处理磁盘访问请求的性能表现很差
5.1先进先出(FIFO)算法
按顺序处理请求,公平对待所有进程,在有很多进程的情况下,接近随机调度的性能
5.2最短服务时间优先(SSTF)
选择从磁臂当前位置需要移动最少的I/O请求,总是选择最短寻道时间
5.3扫描算法(SCAN)
磁臂在一个方向上移动,访问所有未完成的请求,直到磁臂到达该方向上最后的磁道,调换方向。电梯算法。
循环扫描算法(C-SCAN)
限制了仅在一个方向上扫描,当最后一个磁道也被访问过了后,磁臂返回到磁盘的另外一端再次进行。
C-LOOK算法
磁臂先到达该方向上最后一个请求处,然后立即反转,而不是先到最后点路径上的所有请求。
N步扫描(N-step-SCAN)算法
将磁盘请求队列分成长度为N的子队列,按FIFO算法依次处理所有子队列,扫描算法处理每个队列。
双队列扫描(FSCAN)算法
把磁盘I/O请求分成两个队列,交替使用扫描算法处理一个队列,新生成的磁盘I/O请求放入另一队列中,所有的新请求都将被推迟到下一次扫描时处理。
6.磁盘缓存
磁盘缓存是磁盘扇区在内存中的缓存区
单缓存与双缓存
对于单缓存,当IO设备使用缓存区时,缓存不能同时传送给用户进程;对于双缓存,用户进程和IO设备可以同时与缓存区进行数据传输。
6.1访问频率置换算法(Frequency-based Replacement)
LRU算法,选择最长时间没有被引用的缓存块进行置换;如某些缓存块长时间未被访问,则它们在将来还可能会长时间不会访问
LFU算法,选择使用次数最少的缓存块来进行置换。
LFU算法存在的问题:在一段密集磁盘访问后,LFU算法的引用计数变化无法反映当前的引用情况。
解决思路:考虑磁盘访问的密集特征,对密集引用不计数,在短周期中使用LRU算法,而在长周期中使用LFU算法。
把LRU算法中的特殊栈分成三部分,并在每个缓存块增加一个引用计数:
新区域(New Section),中间区域(Middle Section),旧区域(Old Section)
栈中缓存块被访问时移到栈顶;如果该块在新区域,引用计数不变;否则,引用计数加1;
未缓存数据块读入后放在栈顶,引用计数为1;
在旧区域中引用计数最小的缓存块被置换;
在新区域中引用计数不变的目的是避免密集访问对引用计数不利影响,在中间区域和旧区域中引用计数加1是为了使用LFU算法。
中间区域的定义是为了避免新读入的缓存块在第一次出新区域时马上被置换,有一个过渡期。
参考:清华大学 操作系统 陈渝 http://os.cs.tsinghua.edu.cn/oscourse/OS2015/