I/O管理和磁盘调度

I/O

大体分为下面三类:

  • 人可读:适用于计算机用户间的交互,如打印机和终端(显示器、键盘、鼠标)
  • 机器可读:适用于与电子设备通信,如磁盘驱动器、USB密钥、传感器、执行器
  • 通信:适用于与远程设备通信,如数字线路驱动器、调制解调器

各类设备间很大差别,甚至同一类里也很大

  • 数据传输速率
  • 应用
  • 控制的复杂性
  • 传送单元
  • 数据表示
  • 错误条件

I/O功能的组织

三种控制方式

  • 程序控制I/O:处理器代表一个进程给I/O模块发送一个I/O命令;该进程进入忙等待,知道操作完成后才能继续执行
  • 中断驱动I/O:处理器代表进程向I/O模块发出一个I/O命令。有两种可能性:若来自进程的I/O指令是非阻塞的,则处理器继续执行发出I/O命令的进程的后续指令。若指令是阻塞的,则处理器执行的下一条指令来自OS,它将当前的进程设置为阻塞态并调度其他进程
  • 直接存储器访问(DMA):一个DMA模块控制内存和I/O模块之间的数据交换。为传送一块数据,处理器给DMA模块发请求,且只有在整个数据块传送结束后,它才被中断

操作系统设计问题

设计I/O目标:效率和通用性(使用一种统一的方式处理所有的设备)

I/O功能的逻辑结构

image-20220611174914911.png

对于逻辑外部设备:

逻辑I/O:代表用户进程管理的普通I/O功能,允许用户进程根据设备标识符及诸如打开、关闭、读、写之类的简单命令与设备打交道

设备I/O:请求的操作和数据被转换为适当的I/O指令序列、通道命令和控制器指令

调度和控制:I/O操作的排队、调度实际上发生在这一层,是与I/O模块和设备硬件真正发生交互的软件层

I/O缓冲

讨论缓冲需要区分两类I/O设备:

  • 面向块(block-oriented):将信息保存在块中,块的大小通常固定,一次传送一块,可以通过块号来访问数据

eg:磁盘、USB智能卡

  • 面向流(stream-oriented):以字节流的方式输入/输出数据,没有块结构,

eg:终端、打印机、通信端口、鼠标和其他指示设备及其他大多数非辅存设备

不同缓冲

  • 单缓冲:当用户进程发出I/O请求时,OS为该操作分配一个位于内存中的系统部分的缓冲区
  • 双缓冲:在一个进程向一个缓冲区传送数据的同时,操作系统正在清空另一个缓冲区
  • 循环缓冲:使用多于两个缓冲区的方案来弥补需求的不足

缓冲作用:平滑I/O需求的峰值的一种技术

image-20220611195927411.png

磁盘调度

磁盘性能参数

寻道时间:将磁头臂移到指定磁道所需要的时间

旋转延迟:将磁盘的待访问地址区域旋转到读/写磁头可访问的位置所需要的时间

传输时间:像磁盘传送或从磁盘传送的时取决于磁盘的旋转速度,$T=\frac{b}{rN}$,b为传送的字节数,N表示一个磁道中的字节数,r表示旋转速度,转/秒

image-20220611200028927.png

磁盘调度策略

磁盘产生性能差异的原因主要是寻道时间

  • 随机调度(RSS,random scheduling):磁道完全被随机访问,性能最差
  • 先进先出(FIFO):按顺序处理,公平
  • 优先级(PRI):基于优先级调度
  • 后进先出(LIFO):反而可以利用局部性提高吞吐量并缩短队列长度

以上仅基于队列或请求者的属性,如果调度程序知道当前轨道位置,可以采用基于请求项的调度

  • 最短服务时间优先(SSTF):选择使磁头臂从当前位置开始移动最少的磁盘I/O请求
  • SCAN:除FIFO外,其他策略都可能使得某些请求直到整个队列为空时才可完成,导致饥饿,可以使用该方法要求磁头臂仅沿一个方向移动,并在途中满足所有未完成的请求,知道达到这个方向上最后一个磁道,或者这个方向上没有其他请求为止
  • C-SCAN:循环SCAN,把扫描限定在一个方向上,当访问到沿某个方向的最后一个磁道时,磁头臂会返回到磁盘相反方向某段的磁道,并再次开始扫描;这样减少了新请求的最大延迟

为避免“磁头臂的黏性”,磁盘队列分成多段,一次只有一段被完全处理:

  • N步SCAN:把请求队列分成长度为N的几个子队列,每次用SCAN处理一个子队列
  • FSCAN:使用两个子队列,扫描开始时,所有请求在一个队列里,另一个队列为空,扫描过程中,新到的放入另一个队列;新请求的服务延迟到处理完所有老请求后

image-20220611202502680.png

最后修改:2022 年 06 月 11 日
如果觉得我的文章对你有用,请随意赞赏