文件是放在磁盘上的,因此磁盘的性能是对操作文件有很大的影响。下图是一个磁盘的结构示意图,很多个磁盘platter
围绕着一个轴spindle
旋转,磁盘旁边有磁柱arm assembly
,磁柱上有磁臂arm
,磁臂的末端有磁头read-write head
,每个磁头就可以访问盘面上的相关信息:
对磁盘划分时,我们把磁盘划分为很多个同心的圆环叫做磁道track
,每个磁道上又划分了很多等大小的块叫扇区sector
,在各个同心圆环上同一个磁道上的磁盘叫做柱面cylinder
。
磁盘储存数据的原理和盒式磁带类似,只不过盒式磁带上存储是模拟格式的音乐,而硬盘上存储的是数字格式的数据。写入时,磁头线圈上加电,在周围产生磁场,磁化其下的磁性材料;电流的方向不同,所以磁场的方向也不同,可以表示 0 和 1 的区别。读取时,磁头线圈切割磁场线产生感应电流,磁性材料的磁场方向不同,所以产生的感应电流方向也不同。
磁盘由若干磁盘组成,绕枢轴高速旋转,目前主流磁盘转速7200转/分;我们在定位磁盘上的某个记录时,往往需要如下三个参数:
磁盘设备是以一种逻辑块的一维大数组的形式编址的,这里的逻辑块是传输的最小单位。逻辑块的一维数组映射到磁盘上一些相连的扇区。0扇区是最外边柱面的第一个磁道的第一个扇区。数据首先都映射到一个磁道,其余的数据映射到同一柱面的其他磁道,然后按照从外向里的顺序映射到其余的柱面。
磁盘I/O速度的高低,将直接影响文件系统的性能。提高磁盘I/O速度的主要途径有:
前两种方法都是在硬件上下功夫,最后一种方法是可以由操作系统来控制的,因此我们主要讨论磁盘调度算法。
好的磁盘调度算法可以缩短磁盘的访问时间,磁盘的访问时间分为如下三种:
在上面提到的磁盘访问三个时间中,操作系统能够改变的时间只有寻道时间,在设计磁盘调度算法时,目的就是为了减少寻道时间(寻道距离)。
先来先服务调度算法的思想如字面意思一样,这里不再解释,假设磁盘的请求序列为 98, 183, 37, 122, 14, 124, 65, 67
,且磁头当前的位置在53
,磁头移动轨迹示意图如下:
根据磁头移动的轨迹图,可以计算出磁头总共移动了640
个柱面的距离。
最短寻道时间优先的思想就是选择从当前磁头位置所需寻道时间最短的请求,假设磁盘的请求序列为 98, 183, 37, 122, 14, 124, 65, 67
,且磁头当前的位置在53
,磁头移动轨迹示意图如下:
根据磁头移动的轨迹图,可以计算出磁头总共移动了208
个柱面的距离。最短寻道时间优先算法思想类似于短作业优先算法,有可能引起某些请求的饥饿。
为了解决最短寻道时间优先算法造成的饥饿问题,这里引入了扫描算法,它不仅考虑到欲访问的磁道与磁头当前位置间的距离,更优先考虑的是磁头当前的移动方向。算法所选择的访问对象应当是与磁头当前的移动方向一致且距离最近的。具体来说就是磁头从磁盘的一端开始向另一端移动,沿途响应访问请求,直到到达了磁盘的另一端,此时磁头反向移动并继续响应服务请求。由于扫描算法类似于现实中的电梯工作过程,有时也称为电梯算法 。
假设磁盘的请求序列为 98, 183, 37, 122, 14, 124, 65, 67
,且磁头当前的位置在53
且朝磁道号减小的方向移动,磁头移动轨迹示意图如下:
根据磁头移动的轨迹图,可以计算出磁头总共移动了236
个柱面的距离。扫描算法存在着等待问题,也就是若磁头朝一个方向移动时,又来了大量另一方向的请求,那么这些请求就要等待较长时间磁头才能过来。
为了解决这个问题,引入了 C-SCAN 算法,C的意思就是循环的意思,它提供比扫描算法更均衡的等待时间。它的办法是磁头从磁盘的一段向另一端移动,沿途响应请求。当它到了另一端,就立即回到磁盘的开始处,在返回的途中不响应任何请求。
假设磁盘的请求序列为 98, 183, 37, 122, 14, 124, 65, 67
,且磁头当前的位置在53
且朝磁道号增加的方向移动,磁头移动轨迹示意图如下:
不管是 SCAN 算法还是 C-SCAN算法,都需要磁头从一端移到另外一端,如上图,其实没有必要返回到 0
处,再到 14
,为了解决这个问题,引入了 LOOK算法,它的办法是磁臂在每个方向上仅仅移动到最远的请求位置,然后立即反向移动,而不需要移动到磁盘的一端。
假设磁盘的请求序列为 98, 183, 37, 122, 14, 124, 65, 67
,且磁头当前的位置在53
且朝磁道号减小的方向移动,磁头移动轨迹示意图如下:
根据磁头移动的轨迹图,可以计算出磁头总共移动了198
个柱面的距离。
此外还有 C-LOOK 算法是对 C-SCAN 算法的改进,C-LOOK 的办法是让磁臂在每个方向上仅仅移动到最远的请求位置,然后立即反向移动,而不需要移动到磁盘的一端。
假设磁盘的请求序列为 98, 183, 37, 122, 14, 124, 65, 67
,且磁头当前的位置在53
且朝磁道号增加的方向移动,磁头移动轨迹示意图如下: