操作系统-对空闲磁盘块的管理
基本概念
文件卷:应该是能在系统上看到的磁盘分区(如C盘、D盘、E盘),又称逻辑卷和逻辑盘
一般是把一个物理磁盘分成多个文件卷(如windows操作系统会把磁盘划分成C盘、D盘、E盘等)
一个文件卷也可由多个物理磁盘组成,即多个物理磁盘构成了一个大的文件卷
文件卷结构:包括目录区、文件区
目录区:存放FCB(文件控制块)即文件目录信息、磁盘存储空间管理的信息
文件区:存放文件数据
空闲空间管理方法-空闲表法
该方法适合连续分配方式
1.系统如何记录空闲磁盘块的信息
空闲磁盘块连续就被放到一起,即多个空闲磁盘块相互挨着就只记录成一个表项,然后再记录第一个空闲块的块号和连续的空闲块数
如下所示:0、1空闲块连续,被记录成一个表项0,空闲块数为2,5前后没有空闲块,即不连续单独记录第一个空闲块号为5,空闲块数为1,10、11、12、13、14、15连续第一块为10,块数为5,,,,,依次类推
2.当请求空闲磁盘块时,如何分配空闲磁盘块
有多个空闲表项,即有多个空闲块,当有请求分配空闲块时,具体怎么分配要根据采用的分配算法
1》分配算法:
首次适应、最佳适应、最坏适应
首次适应:根据空闲表项依次往下找,找到第一个满足请求条件的就不再找了
最佳适应:找到一个满足使用要求并且最小连续空间块的分配
最坏适应:找到一个满足要求并且最大的连续空间的分配
如下新创建的文件请求3个空闲块,采用首次适应,会先找到0号块,发现空闲块数为2不满足条件,继续往下找,然后是5,只有1个空闲块不满足条件,继续往下10,有5个空闲块满足要3个空闲块条件,则分配10、11、12空闲块,不再往下找,当10、11、12被占用了之后,空闲表项更改,第一个空闲块号10,改成13,对应的空闲块数5改成2
空闲块被占用,表项更改:
3.当磁盘块不再被使用了,如何回收磁盘块
1》表项合并:
根据4种情况回收磁盘块:
1.回收区前后都没有相邻空闲区,空闲表项数量+1
2.回收区前后都有空闲区,空闲表项数量-1
3.回收区前面是空闲区,空闲表项数量不变
4.回收区后面是空闲区,空闲表项数量不变
回收前:
回收后:
空闲链表法-管理空闲块方法
分为2种方式:
1.空间盘快链:以每一个空闲块为单位组成一条空闲链,每个空闲盘块中记录着指向下一个空闲盘块的指针
2.空间盘区链:连续的多个空闲块被认为成一个空闲区,每个空闲盘区记录着指向下一个空闲盘区的指针
空间盘快链分配与回收
分配(适合离散分配,不适合连续分配,是因为这种链接方式不知道有哪些空闲块是否连续吗?):
因为是链,操作系统会记录链头和链尾指针,当请求n个空闲块时,从链头开始依次摘下n个空闲块,然后修改空闲链链头指针,
回收:
当要回收磁盘块时,把回收到的磁盘块依次放在链尾然后修改空闲链链尾指针。只能一个个往下摘空闲块
空闲盘区链分配与回收
分配(离散分配、连续分配都适用,可能意思是如果请求是连续的块,那可以找连续的空闲盘区,找到了之后再分配给文件,如果是请求离散的块,那就不用注意是连续的块还是不连续了):
因为是链,操作系统会保存着链头、链尾指针,假如有请求需要n个空闲块,按照算法规则(首次适应、最佳适应和最坏适应算法)找到一个满足条件的空闲区,如果找不到,比如如下图所示创建文件的时候请求6个连续的磁盘块,但是0号区和6号区以及12号区、21号区都没有连续的6个空闲块,那可以把12号区和21号区的块凑到一起是6个都给这个文件,给了之后修改空闲区的指针和盘快数量
回收(表项合并):
因为是盘区链,一个盘区好几个块,所以涉及到表项合并问题,如果回收区和某个空闲区相邻,则直接将回收区合并到空闲区,再修改空闲区数量,如果回收区不和任何空闲区相邻,则要把回收区作为单独一个空闲盘区放到盘区链末尾,即要修改盘区链链尾指针
位示图法-管理空闲块的方法(最常考)()
即用一个二进制位0或1来表示一个磁盘块的空闲状态,如用0表示空闲,1表示不空闲
位示图的存储在系统中一般用连续的字来表示,即如下图所示,1个字字号为0的由16个二进制位表示,因此可用(字号,位号)二元组来定位一个二进制位,比如0号块空闲二进制位为0,1号不空闲二进制位为1,2空闲3不空闲,二进制位为0和1,4、5、6、7、8、9、10、11都是不空闲,则有8个1.。。。。。。。
盘块号和字号、位号的相互转换
字号、位号从0开始,已知字号、位号、字长,求盘块号:
对应的块号b=字长x字号+位号
如上图中的(0,1)字号位号,字长为16,即b=16x0+1=1号块
(1,10),字长为16,盘块号b=16x1+10=26,即磁盘块号26对应的二进制位为0为空闲
字号、位号从0开始,已知盘块号、字长,求字号、位号:
字号=块号除以字长取整,位号=块号对字长取余
如上图中的盘块号为13,字长为16,字号=13/16=0,位号=13%16=13,即二元组(0,13),对应二进制位0,13块号空闲
盘块号31,字长16,字号=31/16=1,位号=31%16=15,二元组(1,15),对应二进制位0,31块号空闲
盘块号22,字长16,字号=22/16=0,位号=22%16=6,二元组(0,6),对应二进制位1,22块号不空闲
常考点:
怎么从字号和位号确定对应的盘块号 以及怎么从盘块号逆推出对应的字号和位号
分配空闲块号(离散分配、连续分配都适用):
文件请求k个空闲块时,如果是请求连续的块,那就顺序扫描位示图,找k个相邻的二进制位为0的,然后根据字号、位号计算出对应的磁盘块号,再将磁盘块分配给文件,最后将位示图中的相应位置设为1不空闲,如果是请求不连续的块,直接找符合条件的块再依次计算出磁盘块号+分配+位示图对应位置设为1
回收不再使用的块号:
根据回收的块号计算出对应的字号、位号,将相应的位示图上的二进制位设为0即空闲
成组链接法-管理空闲块的方法(理解即可)
使用原因:因为空闲表法、空闲链表法不适合大文件系统,所以unix系统中使用了成组链接法
如何记录空闲磁盘块的信息:
文件卷(即各个磁盘分区)专门用了一个盘快作为超级块,在系统启动时将超级块(充当链头作用,指向下一组空闲块信息)读入内存,并保持内存与外存中的超级块数据一致。超级块中记录了下一组空闲磁盘块的数量+数量对应的磁盘块号,如下图中超级块中记录了下一组空闲磁盘块数为100和磁盘块号(300、299。。。201都是下一组中的空闲磁盘块号,注意每一组中的空闲磁盘块块号不用连续,可以是离散的磁盘块,即块号可以是1,200,2,30,5,。。。。),然后这一组中的每个空闲磁盘块又记录了每个磁盘块对应的下一组的磁盘块数量+磁盘块号,如300这个磁盘块(超级块)记录了下一组空闲的磁盘块数量是100,下一组的空闲的磁盘块号为400,399,。。。。,400又记录了下一组的空闲磁盘块数量+磁盘块号,依次类推,直到下一组没有空闲块了,块号就记为特殊值-1,每个分组的空闲磁盘块数量都有限制
分配空闲磁盘块:
请求需要1个空闲块,因为在系统启动时已经把超级块读入内存,所以首先只需找到内存中的超级块来判断第一组中的磁盘块数量满不满足条件,1<100满足条件只需要把第一个空闲块分组中的最后一个空闲块201分配出去,然后修改超级块中的空闲块数量为99(那201对应的下一组空闲块信息不也就丢失了吗?估摸跟下边讲解的一样,把201块指向的下一组超级块信息放到了第一组超级块100中)
如下图所示:201被分配出去了,超级块中的空闲块号中没201了,并且空闲块数量变成99了
请求需要100个空闲块,因为在系统启动时已经把第一组超级块读入内存,所以首先只需找到内存中的超级块来判断第一组中的磁盘块数量满不满足条件,100=100满足条件只需要把第一组空闲块的100个空闲块都分配出去,但是因为第一组空闲块都被分配出去了,下一组空闲块的指向信息就没了,为了避免下一组信息没,如300号块的下一组信息就会把300号块的下一组信息复制超级块中,如复制300下边的400空闲块到100超级块下边了(那其他的指向下一组的磁盘块中的数据都复制到第一组超级块中吗?)
回收不再使用的块号:
情况1:第一组超级块中假设空闲块数量限制为100,目前有99个块,现在要回收一个空闲块,则只需将空闲块放到第一组超级块中即可
情况2:第一组超级块空闲块数量限制为100,目前已有100个空闲块了,再回收一个空闲块,则把超级块中的数组复制到新分组里边,然后让新回收的块放到超级块中,即超级块中的空闲块目前就一个刚回收的块,然后让刚回收的空闲块指向复制的新分组
总结
记录一下,但是记录了我会会吗。。。。。。。。。