磁盘调度
磁盘的物理结构
经典的温彻斯特盘
其中的几个概念:
- 盘面:可以看成是一个操场的平面,不同的盘面通过中间的轴串在一起
- 磁道:磁道可以看成是操场的跑道,我们知道操场上有外道和内道,最内道中间往往是足球场,而一个个跑道呈圆环状,且外道比内道距离更远,跑起来更费力。磁道类似,如图所示,磁道往往有很多条,但是不同磁道的数据总量一致,所以内道的位密度要比外道大。
- 扇区:指按照一定的角度,将磁道划分成不同的扇区,每个扇区包含磁道的一部分,也就是磁盘块。扇区是磁盘的最小组成单元,通常是512字节。
- 柱面:是指不同盘面中相对位置相同的磁道,这些磁道可以立体得看成一个圆柱,形象称之为柱面
- 磁头:只能水平移动,每次读写数据前,需要靠磁臂移动到相应的磁道。一般的盘片可以正反读写,所以会有一正一反两个磁头。
由于磁盘在组成原理里面也会有所涉及,所以有关磁盘物理结构和其中的逻辑关系这里不在阐述,需要深入的同学可以看看计组。
磁盘的性能参数
类似于CPU的进程调度,磁盘是一个共享结构,对应有一个就绪队列,不同的I/O请求需要磁盘调度。
访问时间
- 寻道/定位时间:Ts,磁头移动到指定柱面的时间
- 旋转延迟:Td = 1/2r,磁头到访问扇区的时间
- 传送时间:Tt = b/rN,传输数据的时间
时间性能计算
一般b可能需要连续扇区读取,具体的读写时间取决于磁盘扇区的结构;这里的m是一个常数,n是需要跨越的磁道数,s为启动时间
题目分析:
已知扇区是磁盘的最小组成单元,通常是512字节,1280KB/512B= 2560个扇区
- 如果数据连续分配,那么也就是占2560/320=8个磁道,由于是连续磁道,并且扇区是磁道上的连续扇区,那么只考虑第一次的寻道时间、8个磁道的旋转延迟和数据传输即可,所以总时间是9+(4.15+8.3)* 8 = 108.6ms
- 而如果2560扇区是随机分布的,那么每次都要考虑寻道时间、旋转延迟时间和数据传输时间,(9+4.15+8.3/320)* 2560 = 333730.56 ms
这里的0.026 = 8.3/320是读取一个扇区数据的时间,通过上述计算可以发现磁盘的性能和数据存储方式有很大关系
磁盘调度策略
我们假设静态的9个就绪进程,需要访问:55, 58, 39, 18, 90, 160, 150, 38, 184的磁道,通过平均跨越的磁道数来理解和比较不同算法之间的差距。
先进先出算法(FIFO)
到目前为止,几乎所有的操作系统内部的算法集锦都会涉及到FIFO,这里也不例外。顾名思义,就是每次只顾眼前人,谁先来处理谁。
按照每次的移动距离取平均值得到55.3
优点如下:
缺点也很明显,就是效率不够高,考虑一个极端的情况,如果10,100,20,70,30,80,这样的话指针反复横跳肯定不是最优解。
最短查找时间优先(SSTF)
每次都找离得最近的磁道去查找时间(贪心的思想)
一开始在100,第一个全局最近的就是90,然后是58,55……
优点:基于贪心,SSTF在效率上有所提升,但也不是最优的算法。
缺点:对中间磁道有利,边缘磁道可能长期得不到响应,不公平。
因为基于贪心,假设一开始磁道的位置处于中心,那么先来的边缘磁道访问请求不占优势,如果访问中间磁道的请求源源不断来,就一直被优先处理。
扫描算法(SCAN)
扫描算法,顾名思义移动臂在一个方向上移动,满足所有未完成的请求直到到达此方向的最后一个磁道(或没有请求为止,Look策略),然后反向处理
对于即将掉头的扫描点附近的磁道会有偏向或者是不公平:对扫描前进方向上刚刚出现的进程有偏向,而对于刚刚扫描过的磁道的进程请求,进程需要等待很久才会被响应。
SCAN算法,又被称为电梯调度算法。移动臂在往一个方向移动的过程中,类似于电梯往下接人的时候,明知道最下面一层是没有人的,它是不会再往下走的。而对于电梯下降方向来的人都能坐上,但是刚刚走过的楼层就必须等到电梯把所有向下的人带走才能重新回来。
循环扫描算法(C-SCAN)
由于SCAN算法的偏向性,会增加等待的时间。为了解决这样的情况,CSCAN算法的思想是,访问完最里面一个要求服务的序列之后,立即回到最外层欲访问磁道。始终保持一个方向,故也称之为单向扫描调度算法。从最里面的一个磁道立即回到最外层欲访问的磁道,这步的距离是两者磁道号差的绝对值。
简单来说,就两点
- 在一个方向上使用扫描(初始化需要确定)
- 当到达最后一个磁道时,移动臂直接移动到另一沿的第一个位置,开始扫描。
然后,我们综合以上四种算法,加以比较
- 效率:从平均寻道长度来看,SSTF和SCAN表现最好,因为它们的平均寻道长度较短。
- 公平性:SCAN和C-SCAN提供更高的公平性,尤其是C-SCAN,它通过循环单向处理避免了长时间的磁道等待。
- 选择建议 :
- 对于寻道时间敏感的系统,SSTF可能是最佳选择。
- 如果需要平衡寻道时间和公平性,SCAN是一个好的选择。
- 对于需要避免磁道饥饿并保证访问周期性的环境,C-SCAN将是更合适的选择。
N步扫描算法(N-step-SCAN)
把I/O请求队列分列(局部子队列),可以防止磁臂黏着现象,了解即可
当N = 1时,那就是FCFS先来先服务,而N = 请求数,相当于SCAN算法
分步电梯调度算法(FSCAN)
FSCAN算法将磁盘请求队列分成两个子队列,一个是由当前所有请求磁盘I/O形成的队列,由磁盘调度按SCAN算法进行处理。另一个是在扫描期间,新出现的所有请求I/O磁盘的进程进入等待处理的请求队列中,将所有新的请求会推迟到下一次扫描时处理。该算法同样也可以解决磁臂黏着的问题。了解一下即可
多磁盘管理
RAID( Redundant Array of Independent Disks )即独立磁盘冗余阵列,简称为「磁盘阵列」,其实就是用多个独立的磁盘组成在一起形成一个大的磁盘系统,从而实现比单块磁盘更好的存储性能和更高的可靠性。
RAID 层级的命名会以 RAID 开头并带数字,例如:RAID 0、RAID 1、RAID 5、RAID 6、RAID 7、RAID 01、RAID 10、RAID 50、RAID 60。每种等级都有其理论上的优缺点,不同的等级在两个目标间获取平衡,分别是增加资料可靠性以及增加存储器(群)读写性能。
采用RAID的主要优势是:
- 可靠性高
- 磁盘I/O速度快
- 性能/价格比高
磁盘缓存
磁盘缓存,主存中为磁盘扇区设置的缓冲区,含有磁盘中某些扇区的副本。
磁盘缓存的置换算法,和虚拟存储的淘汰算法类似,比如LRU和LFU,简单了解一下。