13.大容量存储结构(磁盘管理)
大容量存储结构
本章讨论文件系统的最底层:次级存储(外存)结构。
首先是大容量存储结构概述,不做过多介绍。
其次是磁盘的各种调度算法。
最后是磁盘管理。
1 大容量存储结构概述
磁盘
固态磁盘(SSD)、磁带。
2 磁盘调度算法
对于磁盘驱动器,我们需要它又较快的访问速度和较宽的磁盘带宽。
对于磁盘,访问时间包括寻道时间和旋转延迟。
磁盘带宽是传输字节的总数除以从服务请求开始到最后传递结束时的总时间。
每当进程需要进行磁盘I/O操作时,它就向操作系统发出一个系统调用。
如果磁盘驱动器和控制器空闲,就立即处理请求。如果磁盘驱动器和控制器忙,则服务请求会添加到磁盘驱动器的待处理请求队列中。
当一个请求完成时,操作系统选择哪一个待处理的请求服务?就需要磁盘调度算法。
(1)FCFS调度
FCFS算法根据进程请求访问磁盘的先后顺序进行调度,这是一种最简单的调度算法。
如果只有少量进程需要访问,且大部分请求都是访问簇聚的文件扇区,则有望达到较好的性能;但如果有大量进程竞争使用磁盘,那么这种算法在性能上往往接近于随机调度。
(2)最短寻找时间优先(Shortest Seek Time First, SSTF)算法
SSTF算法选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以使每次的寻找时间最短。即SSTF选择最接近磁头位置的待处理请求。
SSTF算法本质上时一种最短作业优先(SJF)调度;与SJF调度一样,可能会导致“饥饿”现象。
(3)SCAN调度
SCAN算法在磁头当前移动方向上选择与当前磁头所在磁道距离最近的请求作为下一次服务的对象。磁臂从磁盘的一端开始,向另一端移动;移动每个柱面时,请求处理;当达到磁盘的另一端时,磁头移动方向反转。
由于磁头移动规律与电梯运行相似,故又称为电梯调度算法。SCAN算法对最近扫描过的区域不公平,因此,它在访问局部性方面不如FCFS算法和 SSTF算法好。
(4)C-SCAN调度
在扫描算法的基础上规定磁头单向移动来提供服务,回返时直接快速移动至起始端而不服务任何请求。由于SCAN算法偏向于处理那些接近最里或最外的磁道的访问请求,所以使用改进型的C-SCAN算法来避免这个问题。
(5)LOOK调度
釆用SCAN算法和C-SCAN算法时磁头总是严格地遵循从盘面的一端到另一端,显然,在实际使用时还可以改进,即磁头移动只需要到达最远端的一个请求即可返回,不需要到达磁盘端点。
这种形式的SCAN算法和C-SCAN算法称为LOOK和C-LOOK调度。这是因为它们在朝一个给定方向移动前会查看是否有请求。
SSTF是常见的。
3 磁盘管理
(1)磁盘格式化
一个新的磁盘只是一个含有磁性记录材料的空白盘。在磁盘能存储数据之前,它必须分成扇区以便磁盘控制器能进行读和写操作,这个过程称为低级格式化(物理分区)。
低级格式化为磁盘的每个扇区釆用特别的数据结构。每个扇区的数据结构通常由头、数据区域(通常为512B大小)和尾部组成。头部和尾部包含了一些磁盘控制器所使用的信息。
为了使用磁盘存储文件,操作系统还需要将自己的数据结构记录在磁盘上:
第一步:将磁盘分为由一个或多个柱面组成的分区(即我们熟悉的C盘、D盘等形式的分区);
第二步:对物理分区进行逻辑格式化(创建文件系统),操作系统将初始的文件系统数据结构存储到磁盘上,这些数据结构包括空闲和已分配的空间以及一个初始为空的目录。
(2)引导块
计算机启动时需要运行一个初始化程序(自举程序),它初始化CPU、寄存器、设备控制器和内存等,接着启动操作系统。为此,该自举程序应找到磁盘上的操作系统内核,装入内存,并转到起始地址,从而开始操作系统的运行。
(关于计算机的启动过程,请看《计算机是如何启动的?》)
自举程序通常保存在ROM中,为了避免改变自举代码需要改变ROM硬件的问题,故只在ROM中保留很小的自举装入程序,将完整功能的自举程序保存在磁盘的启动块上,启动块位于磁盘的固定位。拥有启动分区的磁盘称为启动磁盘或者系统磁盘。
(3)坏块
由于磁盘有移动部件且容错能力弱,所以容易导致一个或多个扇区损坏。部分磁盘甚至从出厂时就有坏扇区。根据所使用的磁盘和控制器,对这些块有多种处理方式。
对于简单磁盘,如电子集成驱动器(IDE)。坏扇区可手工处理,如MS-DOS的Format 命令执行逻辑格式化时便会扫描磁盘以检查坏扇区。坏扇区在FAT表上会标明,因此程序不会使用。
对于复杂的磁盘,如小型计算机系统接口(SCSI),其控制器维护一个磁盘坏块链表。该链表在出厂前进行低级格式化时就初始化了,并在磁盘的整个使用过程中不断更新。低级格式化将一些块保留作为备用,对操作系统透明。控制器可以用备用块来逻辑地替代坏块,这种方案称为扇区备用。
参考:http://c.biancheng.net/cpp/html/2628.html