磁盘优点
- 容量很大
- 每位的价格非常低
- 当关掉电源后存储信息不丢失
物理特性
磁盘表面覆盖着磁性物质,信息记录在磁表面上。固定头磁盘的每个磁道单独有一个磁头,这样就能使得计算机可以很快地从一个磁道转换到另一个磁道。但是这需要大量的头,设备成本很高。更通用的方式是每个盘面只有一个头,让它从一道移向另一道。这种动头设备需要硬件设备移动头。
磁盘一般用于文件存储,设计原则是:成本低、容量大、速度高。扩大存储容量:a.增加每英寸磁道数目; b. 双面记录。
存取盘块中的信息一般要有三部分时间:系统首先要把磁头移到相应的道上或柱面上,这个时间叫做寻道时间;一旦磁头到达指定磁道,必须等待所需要的扇区转到读/写头下,这个延迟时间叫做旋转延迟时间;最后,信息实际在磁盘和内存之间进行传送也要花费时间,这部分时间叫做传送时间。一次磁盘服务的总时间就是这三者之和。
要使磁盘服务尽可能地快,操作系统要提供合适的调度算法,改善磁盘服务的平均时间。
进程需要和磁盘交换信息时必须要操作系统发出系统调用,对磁盘的请求一般要有下述几部分内容:
1. 输入和输出;
2. 磁盘地址(驱动器、柱面、面号、扇区);
3. 内存地址;
4. 传送长度。
磁盘调度算法
1、先来先服务调度(FCFS)
FCFS 算法是优先为最先到达的请求服务。例如,有如下请求磁盘服务队列,要访问的磁道数分别是:
98,183,37,122,14,124,65,67
排在前面的是先到达的请求,假设磁头目前停留在53磁道上,按照先来先服务的算法,接下来磁头的移动顺序依次是:
53—>98—>183—>37—>122—>14—>124—>65—>67
这个过程总共移动了(98-53)+(183-98)+(183-37)+(122-37)+(122-14)+(124-14)+(124-65)+(67-65)=640个磁道
这种调度法产生的磁头移动服务太大,磁头频繁的大幅度移动,容易产生机械振动和误差,对使用寿命有损害。所以,要设计好的算法来减少磁头移动幅度,减少服务时间,改善磁盘的吞吐量。
2、最短寻道时间优先法(SSTF)
优先服务接近于磁头当前位置的请求。SSTF从本质上将是SJF(最短作业优先算法)调度的形式。使用SSTF调度算法,上面那个请求队列的执行顺序是:
53—>65—>67—>37—>14—>98—>122—>124—>183
总共移动了236个磁道,比FCFS的三分之一多一点,明显改善了磁盘服务。
但是这种算法并不是最优的。例如,若把磁头从53道移动到37道(尽管不是靠的最近的),然后移动到14,接下去是65,67,98,122,124,183,总共移动了208个磁道<236。
SSTF也可能导致某些请求长期得不到服务(即“饥饿”问题)。如果当前磁头附近总会不断的到来新的请求,那么距离磁头远的请求将会一直等待下去。
3、扫描法(SCAN)
由于请求服务的队列具有动态性质,总会有新的请求到达 ,因此可采用扫描算法。读/写磁头从磁盘的一端出发,向另一端移动,遇到所需的磁道时就进行服务,直至到达磁盘的另一端。在另一端上,磁头移动方向反过来,继续做下面的服务。这样磁头就连续从盘的一端扫到另一端。
根据前面的例子,但要知道磁头移动的方向和它最近的位置。如果磁头向0道方向移动,则先为37道和14道服务。到达0道,磁头移动方向反过来,并移向磁盘的另一端,接下来服务序列分别是65,67,98,122,124,183。
在具体实现算法时,没有必要让磁头总是从磁盘的一端移到另一端。更通常的做法是:磁头仅移到每个方向上最远的请求磁道上,一旦在当前方向上没有进一步的服务请求了,磁头的移动方向就会反过来,继续为下面的请求服务。这种算法也称为“电梯算法”。例如上面的例子,磁头服务了37,14后发现前面没有新的请求了,就不会向前继续移动到0道,立即掉头服务65道……
这种算法会产生的问题是:假定对磁道的请求是均匀分布的,当磁头到达一方最远端并反过方向时,立即落在磁盘后面的请求相对而言很少,因为这些磁道刚刚得到过服务,而在盘的另一端却有较多的请求,其等待的时间也最长。
4、巡回扫描法(C-SCAN)
C-SCAN是SCAN的变种,可使得等待的时间变的均匀。与SCAN的区别是,它移动到一端,方向放过来,但是在返回的过程中不进行服务,就是直接从一端切换到另一段,然后再按照刚才的方向移动,遇到请求的磁道就服务。例如上面的例子,先向0道移动,53–>37–>14,然后反方向,换到另一端,183–>124–>122–>98–>67–>65。
磁盘调度算法的选择
任何调度算法的性能都紧紧的依赖于I/O请求的数量和类型,对于磁盘负荷很重的系统来说选择电梯算法和C-SCAN算法更为合适。在极个别情况下,若队列中很少有对于一个未完成的请求,那么所有算法实际上都是等效的。研究表明,通常情况下队列中仅有一个请求。这时,FCFS也是很合适的算法。
磁盘服务的请求受文件分配方式的影响很大。读连续文件的程度将产生大量的在盘上挤在一起的请求,磁头的移动有限。而对于串连或索引文件来说,可能涉及在盘上广泛分配的盘块,要靠减少磁头移动来获取较好的磁盘使用效率。
目录和索引块的位置对I/O请求的队列有很重要的影响。如果文件的数据和它的目录项在盘上的位置相距很远,则磁头移动距离很长。如果把目录和索引块放在缓存中,则可明显减少磁头的移动,尤其对读请求更是如此。
以上仅考虑寻道距离对调度算法的影响。但对于现代磁盘,旋转延迟几乎接近平均寻道时间。然而操作系统很难通过调度来改善旋转延迟时间,因为逻辑块的物理位置对外并未公布。当然,磁盘制造商通过在控制器硬件中实现调度算法可以缓减这个问题。
[以上整理自《操作系统教程—Linux实例分析》 孟庆昌]