磁盘存储器的性能和调度
目录
参考资料:
磁盘 I/O 速度的高低和磁盘系统的可靠性,将直接影响到系统的性能。
可以通过多种途经来改善磁盘系统的性能。首先可通过选择好的磁盘调度算法,以减少磁盘的寻道时间;其次是提高磁盘 I/O 速度,以提高对文件的访问速度;第三采取冗余技术,提高磁盘系统的可靠性,建立高度可靠的文件系统。
1 磁盘的数据组织和格式
磁盘设备可包括一个或多个物理盘片,每个磁盘片分一个或两个存储面(Surface),每个盘面上有若干个磁道(Track),磁道之间留有必要的间隙(Gap)。
为使处理简单起见,在每条磁道上可存储相同数目的二进制位。这样,磁盘密度即每英寸中所存储的位数,显然是内层磁道的密度较外层磁道的密度高。
每条磁道又被从逻辑上划分成若干个扇区(Sectors),软盘大约为 8 至 32 个扇区,硬盘则可多达数百个。一个扇区称为一个盘块(或数据块),各扇区之间保留一定的间隙(Gap)。
一个物理记录存储在一个扇区上,磁盘上能存储的物理记录块数目是由扇区数、磁道数以及磁盘面数所决定的。例如,一个 10GB 容量的磁盘,有 8 个双面可存储盘片,共 16 个存储面(盘面),每面有 16383 个磁道(也称柱面),63 个扇区。
10G/16 = 640M/存储面
2 磁盘格式化和磁盘分区
为了在磁盘上存储数据,必须先将磁盘低级格式化。
下边为一条磁道格式化的情况。其中每条磁道(Track)含有 30 个固定大小的扇区(Sectors),每个扇区容量为 600 个字节,其中 512 个字节存放数据,其余的用于存放控制信息。
每个扇区包括两个字段:
- 标符字段(ID Field):其中一个字节的 SYNCH 具有特定的位图像,作为该字段的定界符,利用磁道号(Track)、磁头号(Head #)及扇区号(Sectors #)三者来标识一个扇区;CRC 字段用于段校验。
- 数据字段(Data Field):存放 512 个字节的数据。
值得强调的是,在磁盘一个盘面的不同磁道(Track)、每个磁道的不同扇区(Sector),以及每个扇区的不同字段(Field)之间,为了简化和方便磁头的辨识,都设置了一个到若干个字节不同长度的间距(Gap,也称间隙)。
磁盘分区:在磁盘格式化完成后,一般要对磁盘进行分区。在逻辑上,每个分区就是一个独立的逻辑磁盘。每个分区的起始扇区和大小都记录在分区表中。
磁盘分区,就是把物理磁盘分为多个逻辑磁盘
3 磁盘调度算法
磁盘调度算法的目的:减少对文件的访问时间,使各进程对磁盘的平均访问时间最小。
由于在访问磁盘的时间中主要是寻道时间,因此,磁盘调度的目标是使磁盘的平均寻道时间最少。
3.1 先来先服务(FCFS)
最简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次地得到处理,不会出现某一进程的请求长期得不到满足的情况。
但此算法未对寻道进行优化,致使平均寻道时间可能较长。
3.2 最短寻道时间优先(SSTF)
该算法选择要求访问的磁道与当前磁头所在的磁道距离最近的进程进程处理,以使每次的寻道时间最短,但这种算法并不能保证平均寻道时间最短。
可能出现饥饿现象
3.3 磁盘扫描(SCAN)算法
SSTF 算法的实质是基于优先级的调度算法,因此就可能导致优先级低的进程发生“饥饿”(Starvation)现象。
扫描(SCAN)算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。
距离+移动方向
磁头自里向外移动,到达最外磁道后,又从外向里移动,对整个磁盘进行扫描,这种算法中磁头移动的规律颇似电梯的运行,因而又常称之为电梯调度算法。
问题在于,每次都会扫描到最外层,尽管此时已经没有必要
3.4 循环扫描(C-SCAN)算法
SCAN 算法既能获得较好的寻道性能,又能防止“饥饿”现象,但是当磁头刚从里向外移动而越过了某一磁道时,恰好又有一进程请求访问此磁道,这时,该进程必须等待,待磁头继续从里向外,然后再从外向里扫描完处于外面的所有要访问的磁道后,才处理该进程的请求,致使该进程的请求被大大地推迟。
进程请求被推迟
为了减少这种延迟,C-SCAN 算法规定磁头单向移动,例如,只是自里向外移动,当磁头移到最外的磁道并访问后,磁头立即返回到最里的欲访问磁道,亦即将最小磁道号紧接着最大磁道号构成循环,进行循环扫描。
此时,磁头不再回到一个固定的外层起点
3.5 NStep-SCAN 调度算法
在 SSTF、SCAN 及 C-SCAN 几种调度算法中都可能出现磁臂停留在某处不动的情况。例如,有一个或几个进程对某一磁道有较高的访问频率,即反复请求对某一磁道的 I/O 操作,从而垄断了整个磁盘设备。我们把这一现象称为磁臂粘着(Armstickiness)。在高密度磁盘上容易出现此情况。
N 步 SCAN 算法将磁盘请求队列分成若干个长度为 N 的子队列,磁盘调度将按 FCFS 算法依次处理这些子队列。而每处理一个队列时按照 SCAN 算法,对一个队列处理完后,再处理其他队列。当正在处理某子队列时,如果又出现新的磁盘 I/O 请求,便将新请求进程放入其他队列,这样就可避免出现粘着现象。
先处理前一个队列中的进程请求,再处理下一个队列中的进程请求,每个队列固定容量
当 N 值取得很大时,会使 N 步扫描法的性能接近于 SCAN 算法的性能;当 N = 1 时,N 步 SCAN 算法便蜕化为 FCFS 算法。
3.6 F-SCAN 调度算法
F-SCAN 算法实质上是 N 步 SCAN 算法的简化,即 F-SCAN 只将磁盘请求队列分成两个子队列。一个是由当前所有请求磁盘 I/O 的进程形成的队列,由磁盘调度按 SCAN 算法进行处理。另一个是在扫描期间,将新出现的所有请求磁盘 I/O 的进程放入等待处理的请求队列。这样,所有的新请求都将被推迟到下一次扫描时处理。
当前进程队列+扫描期间的进程队列