软件设计师考点——磁盘和文件系统

1,437 阅读13分钟

磁盘组成

盘片、 盘片 、 磁头、记录面

硬盘中一般会有多个盘片组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头。受到硬盘整体体积和生产成本的限制,盘片数量都受到限制,一般都在5片以内。盘片的编号自下向上从0开始,如最下边的盘片有0面和1面,再上一个盘片就编号为2面和3面。

每个盘片有2面啊,但是1个磁头只能记录在一个面上 。如果3个盘片只有中间有4个磁头,那么最外面的盘面不记录,所以3个盘片可能只有 4 个记录面

image-20200909162651350

扇区 、 磁道、簇

磁道是磁盘一个面上的单个数据存储圆圈。如果将磁道作为一个存储单元,从数据管理效率看实在是太大了。许多盘片的一个磁道能存储100,000字节甚至更多的数据,用于小文件存储时的效率就太低了。因此,磁道被分成若干编上号的圆弧段,称为扇区。 扇区是磁盘的最小组成单元,通常是512字节

在磁盘中个磁道记录的信息量是相同的,也就是说,虽然内层磁道的周长最小,但是内层磁道记录的信息量和外层磁道记录的信息量是相同的。

于是可以有以下公式求存储容量。

  • 每磁道的信息量=内层位密度×内层周长

簇是操作系统中最小的逻辑存储单位,即:簇是操作系统可以识别的最小单位。

每个簇可以包括2、4、8、16、32或64个扇区。显然,簇是操作系统所使用的逻辑概念,而非磁盘的物理特性。

![cipan (1)](pic-1251784200.cos.ap-nanjing.myqcloud.com/img/cipan (1).jpg)

柱面

硬盘通常由重叠的一组盘片构成,每个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。磁盘的柱面数与一个盘面上的磁道数是相等的。

image-20200909165726131

磁盘计算公式

  • 有效储存区域=(外直径-内直径)÷2

  • 一个记录面磁道数=有效储存区域×磁道密度

  • 总磁道数=一个记录面磁道数 × 记录面数 = 记录面数 × 有效储存区域 × 磁道密度

  • 每磁道的信息量 = 内层位密度×内层周长

  • 一个记录面信息量 = 一个记录面的磁道数 × 每磁道信息量

  • 非格式化盘组总容量= 一个记录面信息量 × 记录面数

  • 总格式化容量 = 总磁道数 × 每道扇区数 × 扇区容量

假设某硬盘由5个盘片构成(共有8个记录面),盘面有效记录区域的外直径为30cm,内直径为10cm,记录位密度为250位/mm,磁道密度为16道/mm,每磁道分16个扇区,每扇区512字节,则该硬盘的格式化容量约为()MB。


有效储存区域 =( 30 - 102 
一个记录面磁道数 = 有效储存区域 ×  磁道密度 =  ( 30 - 102 * 10 *16
总磁道数=一个记录面磁道数 × 记录面数  = ( 30 - 102 * 10 *16 * 8

总格式化容量 = 总磁道数 × 每道扇区数 × 扇区容量 = ( 30 - 102 * 10 *16 * 8 * 16 * 512 byte  = 

 ( 30 - 102 * 10 *16 * 8 * 16 * 512  / 1024 * 1024

读写磁盘需要的时间

寻找时间 TsT_s:活动头磁盘在读写信息前,将磁头移动到指定磁道所需要的时间。(这时间包含两个部分)

①启动磁头臂是需要时间的。假设耗时为 s;


②移动磁头也是需要时间的。假设磁头匀速移动,每跨越一个磁道耗时为m,总共需要跨越n条磁道。

则∶寻道时间 Ts=s+mnT_s =s+m*n

延迟时间 TrT_r :磁头定位到某一磁道的扇区(块号)所需要的时间,设磁盘转速为r(单位∶转/秒,或 转/分),平均所需的延迟时间 Tr=(1/2)(1/r)=1/2rT_r = (1/2)*(1/r) = 1/2r 1/r1/r 就是转一圈需要的时间。找到目标扇区平均需要转半圈,因此再乘以 1/2
。

传输时间 TtT_t:从磁盘读出或向磁盘写入数据**所经历的时间,

假设磁盘转速为r,此次读/写的字节数为b,每个磁道上的字节数为N。

则∶ Tt=(1/r)(b/N)=b/(rN)T_t = (1/r) * (b/N) = b/(rN) (每个磁道要可存N字节的数据,因此b字节的数据需要b/N个磁道才能存储。而 读/写一个磁道所需的时间刚好又是转一圈所需要的时间1/r)

磁盘调度算法


先来先服务算法(FCFS)

算法思想:根据进程请求访问磁盘的先后顺序进行调度。 假设磁头的初始位置是100号磁道,有多个进程先后陆续地请求访问55、58、39、18、90、160、150、38、184号磁道。 按照先来先服务算法规则,按照请求到达的顺序,磁头需要一次移动到55、58、39、18、90、160、150、38、184号磁道。

image-20200910210042933

磁头共移动了 45 + 3 + 19 + 21 + 72 + 70 + 10 + 112 + 146 = 498个磁道。响应一个请求平均需要移动498 / 9 = 55.3个磁道(平均寻找长度)。 优点:公平;如果请求访问的磁道比较集中的话,算法性能还算可以。 缺点:如果大量进程竞争使用磁盘,请求访问的磁道很分散,FCFS在性能上很差,寻道时间长

最短寻找时间优先(SSTF)

算法思想:优先处理的磁道是与当前磁头最近的磁道。可以保证每次寻道时间最短,但是不能保证总的寻道时间最短。(其实是贪心算法的思想,只是选择眼前最优,但是总体未必最优)。

假设磁头的初始位置是100号磁道,有多个进程先后陆续地请求访问55、58、39、18、90、160、150、38、184号磁道。

image-20200910210303119

磁头总共移动了(100 -18)+ (184 -18) = 248个磁道。响应一个请求平均需要移动248 / 9 = 27.5个磁道(平均寻找长度)。

缺点:可能产生饥饿现象

本例中,如果在处理18号磁道的访问请求时又来了一个38号磁道的访问请求,处理38号磁道的访问请求又来了一个18号磁道访问请求。如果有源源不断的18号、38号磁道访问请求,那么150、160、184号磁道请求的访问就永远得不到满足,从而产生饥饿现象。这里产生饥饿的原因是磁头在一小块区域来回移动。

扫描算法(SCAN)

SSTF算法会产生饥饿的原因在于:磁头有可能再一个小区域内来回得移动。为了防止这个问题,可以规定:磁头只有移动到请求最外侧磁道或最内侧磁道才可以反向移动,如果在磁头移动的方向上已经没有请求,就可以立即改变磁头移动,不必移动到最内/外侧的磁道。这就是扫描算法的思想。由于磁头移动的方式很像电梯,因此也叫电梯算法

假设某磁盘的磁道为0~200号,磁头的初始位置是100号磁道,且此时磁头正在往磁道号增大的方向移动,有多个进程先后陆续的访问55、58、39、18、90、160、150、38、184号磁道

image-20200910210806262

磁头总共移动了(200-100)+(200-18)=282个磁道。响应一个请求平均需要移动282/9=31.3个磁道(平均寻找长度)

优点:性能较好,平均寻道时间较短,不会产生饥饿现象 缺点

  1. 只有到达最边上的磁道时才能改变磁头移动万问,事实上,处理184号磁道的访问请求之后就不需要再往右移动磁头了。
  2. SCAN算法对于各个位置磁道的响应频率不平均(如:假设此时磁头正在往右移动,且刚处理过90号磁道,那么下次处理90号磁道的请求就需要等磁头移动很长一段距离;而响应了184号磁道的请求之后,很快又可以再次响应184号磁道的请求了)

LOOK 调度算法

算法思想:扫描算法(SCAN)中,只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请求之后就不需要再往右移动磁头了。LOOK调度算法就是为了解决这个问题,如果在磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向。(边移动边观察,因此叫LOOK

假设某磁盘的磁道为0~200号,磁头的初始位置是100号磁道,且此时磁头正在往磁道号增大的方向移动,有多个进程先后陆续地请求访问55、58、39、18、90、160、150、38、184号磁道

image-20200910211145487

磁头总共移动了(184-100)+(184-18)=250个磁道。响应一个请求平均需要移动250/9=27.5个磁道(平均寻找长度)

比起SCAN算法来,不需要每次都移动到最外侧或最内侧才改变磁头万问,使寻道时间进一步缩短

循环扫描算法(C-SCAN)

算法思想SCAN算法对于各个位置磁道的响应频率不平均,而C-SCAN算法就是为了解决这个问题。规定只有磁头朝某个特定方向移动时才处理磁道访问请求,而返回时直接快速移动至起始端而不处理任何请求。

假设某磁盘的磁道为0~200号,磁头的初始位置是100号磁道,且此时磁头正在往磁道号增大的方向移动,有多个进程先后陆续地请求访问55、58、39、18、90、160、150、38、184号磁道

image-20200910211426709

磁头总共移动了(200-100)+(200-0)+(90-0)=390个磁道。响应一个请求平均需要移动390/9=43.3个磁道(平均寻找长度)

优点:比起SCAN来,对于各个位置磁道的响应频率很平均。 缺点:只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请求之后就不需要再往右移动磁头了;并且,磁头返回时其实只需要返回到18号磁道即可,不需要返回到最边缘的磁道。另外,比起SCAN算法来,平均寻道时间更长。

C-LOOK 调度算法

算法思想C-SCAN算法的主要缺点是只有到达最边上的磁道时才能改变磁头移动方向,并且磁头返回时不一定需要返回到最边缘的磁道上。C-LOOK算法就是为了解决这个问题。如果磁头移动的方向上已经没有磁道访问请求了,就可以立即让磁头返回,并且磁头只需要返回到有磁道访问请求的位置即可。

假设某磁盘的磁道为0~200号,磁头的初始位置是100号磁道,且此时磁头正在往磁道号增大的方向移动,有多个进程先后陆续地请求访问55、58、39、18、90、160、150、38、184号磁道

image-20200910211550822

磁头总共移动了(184-100)+(184-18)+(90-18)=322个磁道。响应一个请求平均需要移动322/9=35.8个磁道(平均寻找长度)

优点:比起C-SCAN算法来,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间进一步缩短

文件存储空间管理

空闲表法

适用于“连续分配方式”

某时刻磁盘使用如下:

image-20200920212017493

对应的空闲表

image-20200920213943400

如何分配磁盘块: 与内存管理中的动态分区分配很类似,为一个文件分配连续的存储空间。同样可采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间。

如何回收磁盘块: 与内存管理中的动态分区分配很类似

空闲链表法

image-20200920214725906

位示图法

位示图:每个二进制位对应一个盘块。

image-20200920215029721

在本例中,“0”代表盘块空闲,“1”代表盘块已分配。位示图一般用连续的“字”来表示,如本例中一个字的字长是16位,字中的每一位对应一个盘块。因此可以用(字号,位号)对应一个盘块号。当然有的题目中也描述为(行号,列号)

重点重点:要能自己推出盘块号与(字号位号)相互转换的公式。 注意题目条件:盘块号、字号、位号到底是从0开始还是从1开始 如本例中盘块号、字号、位号从0开始,若n表示字长,则. (字号,位号)=(i,j)的二进制位对应的盘块号b=ni+j

某文件管理系统在磁盘上建立了位示图(bitmap),记录磁盘的使用情况。若系统的字长为32位,磁盘上的物理块依次编号为0、1、2、…,那么4096号物理块的使用情况在位示图中的第 (129) 个字中描述;若磁盘的容量为200GB,物理块的大小为1MB,那么位示图的大小为 (  6400  ) 个字。

(4096+1)/32  = 128.03125  因为物理快编号从 0 开始,所以 4096号物理块 ,表示一共有 4096+1 个物理块。

若磁盘的容量为200GB,物理块的大小为1MB。那么有 $200 * 2^{30} /  2^{20} = 200 * 2^{10} = 204800 $  位示图的大小为  204800 / 32  = 6400  个字