文件存储空间的管理

前言

【要为新文件分配存储空间,系统必须以某种数据结构记住存储空间的使用情况。此外,系统应提供对存储空间进行分配和回收    的手段。(存储空间分配的基本单位都是盘块而非字节)】因此,才有了【文件存储空间的管理】的概念。

强调文件存储空间管理的方法一定要和文件外存分配方式区分!】

文件存储空间管理是对没有分配出去的空间进行管理】【文件外存分配方式是对分配给文件的空间进行分配的方法

空闲表法

空闲表法属于连续分配方式,它与内存的动态分配方式雷同,即系统也为外存上的所有空闲区建立一张空闲表,每个空闲区对应于一个空闲表项,其中包括表项序号、该空闲区的第一个盘块号、该区的空闲盘块数等信息。再将所有空闲区按其起始盘块号递增的次序排列。

在内存分配上,虽然很少采用连续分配方式,然而在外存的管理中,由于这种分配方式具有较高的分配速度,可减少访问磁盘的I/O 频率,故它在诸多分配方式中仍占有一席之地。

空闲链表法

①空闲盘块链。这是将磁盘上的所有空闲空间,以盘块为单位拉成一条链。

②空闲盘区链。这是将磁盘上的所有空闲盘区(每个盘区可包含若干个盘块)拉成一条链。

位示图法

位示图是利用二进制的一位来表示磁盘中一个盘块的使用情况。当其值为“0”时,表示对应的盘块空闲;为“1”时,表示已分配。有的系统把“0”作为盘块已分配的标志,把“1”作为空闲标志。磁盘上的所有盘块都有一个二进制位与之对应,这样,由所有盘块所对应的位构成一个集合,称为位示图。通常可用m × n 个位数来构成位示图,并使m × n等于磁盘的总块数,如图6-22 所示。

盘块的分配

顺序扫描位示图,找到一个或一组空盘块。 转换为对应的盘块号,公式:块号为b,第i行,第j列,则b=n*(i-1)+j,其中n 为每行的位数。 修改位示图。

盘块的回收

已知盘块号b,得对应的行列号,之后修改位示图对应位的值。 i=(b-1) DIV n + 1,j=(b-1) MOD n + 1

成组链接法

空闲表法和空闲链表法都不适用于大型文件系统,因为这会使空闲表或空闲链表太长。在UNIX 系统中采用的是成组链接法。

空闲盘块的组织

①空闲盘块号栈(只有一个,每一组的第一个盘块的S.free、S.free(0)~S.free(99)记录了下一组的盘块总数N和下一组所有的盘块号)用来存放当前可用的一组空闲盘块的盘块号(最多含100 个号),以及栈中尚有的空闲盘块号数N。顺便指出,N 还兼作栈顶指针用。例如,当N=100 时,它指向S.free(99)。由于栈是临界资源,每次只允许一个进程去访问,故系统为栈设置了一把锁。图6-23 左部示出了空闲盘块号栈的结构。其中,S.free(0)是栈底,栈满时的栈顶为S.free(99)。

②文件区中的所有空闲盘块被分成若干个组,比如,将每100 个盘块作为一组。假定盘上共有10000 个盘块,每块大小为1 KB,其中第201~7999 号盘块用于存放文件,即作为文件区,这样,该区的最末一组盘块号应为7901~7999;次末组为7801~7900……;第二组的盘块号为301~400;第一组为201~300,如图6-23右部所示。

③将每一组含有的盘块总数N 和该组所有的盘块号记入其前一组的第一个盘块的S.free(0)~S.free(99)中。这样,由各组的第一个盘块可链成一条链。

④将第一组的盘块总数和所有的盘块号记入空闲盘块号栈中,作为当前可供分配的空闲盘块号。

⑤最末一组只有99 个盘块,其盘块号分别记入其前一组的S.free(1) ~S.free(99)中,而在S.free(0)中则存放“0”,作为空闲盘块链的结束标志。(注:最后一组的盘块数应为99,不应是100,因为这是指可供使用的空闲盘块,其编号应为(1~99),0号中放空闲盘块链的结尾标志。)

空闲盘块的分配与回收

当系统要为用户分配文件所需的盘块时,须调用盘块分配过程来完成。该过程首先检查空闲盘块号栈是否上锁,如未上锁,便从栈顶取出一空闲盘块号,将与之对应的盘块分配给用户,然后将栈顶指针下移一格。若该盘块号已是栈底,即S.free(0),这是当前栈中最后一个可分配的盘块号。由于在该盘块号所对应的盘块中记有下一组可用的盘块号,因此,须调用磁盘读过程,将栈底盘块号所对应盘块的内容读入栈中,作为新的盘块号栈的内容,并把原栈底对应的盘块分配出去(其中的有用数据已读入栈中)。然后,再分配一相应的缓冲区(作为该盘块的缓冲区)。最后,把栈中的空闲盘块数减1 并返回。


在系统回收空闲盘块时,须调用盘块回收过程进行回收。它是将回收盘块的盘块号记入空闲盘块号栈的顶部,并执行空闲盘块数加1 操作。当栈中空闲盘块号数目已达100 时,表示栈已满,便将现有栈中的100个盘块号记入新回收的盘块中,再将其盘块号作为新栈底。

【例题】某小型文件系统采用成组链接法管理磁盘空间,每个盘块的大小为4KB。空闲盘块号栈中最多可存放6个空闲盘块号。栈底存放当前可用的空闲盘块数。图中给出了当前空闲盘块号栈的内容以及后续两组空闲盘块号。请问: 1)该文件系统当前有多少个空闲盘块?   2)用户A创建了一个新文件A,大小为43KB。画出为文件A分配空间后,图的变化结果。 3)之后用户B删除文件B,文件B占用的盘块号依次为51、52、53、54、55,画出系统回收文件B占用的空间后的进一步变化结果。

解答:

1)14

2)

3)

猜你喜欢

转载自blog.csdn.net/william_munch/article/details/82872245