在现代 OS中, 几乎毫无例外地是通过档案系统来组织和管理在计算机中所存储的大量程式和数据的;或者说,档案系统的管理功能,是通过把它所管理的程式和数据组织成一系列档案的方法来实现的。档案空间管理模式是指系统为档案分配存储空间的方法,既要记住存储空间的使用情况,也要对存储空间进行分配和回收,同时应具有较好的访问速度。
基本介绍
- 中文名:档案空间管理模式
- 外文名:File space management mode
- 学科:计算机
- 目的:分配、回收、较好的访问速度
- 有关术语:档案系统
- 领域:作业系统
档案空间管理
为了方便用户的使用,对于一些当前需要使用的系统档案和用户档案,都必须放在可随机存取的磁碟上。在多用户环境下,若由用户自己对档案的存储进行管理,不仅非常困难,而且也必然是十分低效的。因而,需要由档案系统对诸多档案及档案的存储空间实施统一的管理。其主要任务是为每个档案分配必要的外存空间,提高外存的利用率,并能有助于提高档案系统的存、取速度。为此,系统应设定相应的数据结构,用于记录档案存储空间的使用情况,以供分配存储空间时参考;系统还应具有对存储空间进行分配和回收的功能。为了提高存储空间的利用率,对存储空间的分配,通常是採用离散分配方式,以减少外存零头,并以盘块为基本分配单位。盘块的大小通常为 1~8 KB。
常见管理方法
空闲表法
空闲表法属于连续分配方式,它与记忆体的动态分配方式雷同,它为每个档案分配一块连续的存储空间,即系统也为外存上的所有空闲区建立一张空闲表,每个空闲区对应于一个空闲表项,其中包括表项序号、该空闲区的第一个盘块号、该区的空闲盘块数等信息。再将所有空闲区按其起始盘块号递增的次序排列。
空闲盘区的分配与记忆体的动态分配类似,同样是採用首次适应算法、循环首次适应算法等。例如,在系统为某新创建的档案分配空闲盘块时,先顺序地检索空闲表的各表项,直至找到第一个其大小能满足要求的空闲区,再将该盘区分配给用户(进程),同时修改空闲表。系统在对用户所释放的存储空间进行回收时,也採取类似于记忆体回收的方法,即要考虑回收区是否与空闲表中插入点的前区和后区相邻接,对相邻接者应予以合併。
空闲鍊表法
空闲鍊表法是将所有空闲盘区拉成一条空闲链。根据构成链所用基本元素的不同,可把鍊表分成两种形式:空闲盘块链和空闲盘区链。
(1) 空闲盘块链。这是将磁碟上的所有空闲空间,以盘块为单位拉成一条链。当用户因创建档案而请求分配存储空间时,系统从链首开始,依次摘下适当数目的空闲盘块分配给用户。当用户因删除档案而释放存储空间时,系统将回收的盘块依次插入空闲盘块链的末尾。这种方法的优点是用于分配和回收一个盘块的过程非常简单,但在为一个档案分配盘块时,可能要重複操作多次。
(2) 空闲盘区链。这是将磁碟上的所有空闲盘区(每个盘区可包含若干个盘块)拉成一条链。在每个盘区上除含有用于指示下一个空闲盘区的指针外,还应有能指明本盘区大小(盘块数)的信息。分配盘区的方法与记忆体的动态分区分配类似,通常採用首次适应算法。在回收盘区时,同样也要将回收区与相邻接的空闲盘区相合併。在採用首次适应算法时,为了提高对空闲盘区的检索速度,可以採用显式连结方法,亦即,在记忆体中为空闲盘区建立一张鍊表。
位示图法
位示图是利用二进制的一位来表示磁碟中一个盘块的使用情况。当其值为“0”时,表示对应的盘块空闲;为“1”时,表示已分配。有的系统把“0”作为盘块已分配的标誌,把“1”作为空闲标誌。(它们在本质上是相同的,都是用一位的两种状态来标誌空闲和已分配两种情况。)磁碟上的所有盘块都有一个二进制位与之对应,这样,由所有盘块所对应的位构成一个集合,称为位示图。通常可用 m × n 个位数来构成位示图,并使 m × n 等于磁碟的总块数。
位示图也可描述为一个二维数组 map:
Var map: array of bit;
成组连结法
空闲表法和空闲鍊表法都不适用于大型档案系统,因为这会使空闲表或空闲鍊表太长。在 UNIX 系统中採用的是成组连结法,这是将上述两种方法相结合而形成的一种空闲盘块管理方法,它兼备了上述两种方法的优点而克服了两种方法均有的表太长的缺点。
空闲盘块的组织
(1) 空闲盘块号栈用来存放当前可用的一组空闲盘块的盘块号(最多含 100 个号),以及栈中尚有的空闲盘块号数 N。顺便指出,N 还兼作栈顶指针用。例如,当 N=100 时,它指向 S.free(99)。由于栈是临界资源,每次只允许一个进程去访问,故系统为栈设定了一把锁。图 左部示出了空闲盘块号栈的结构。其中,S.free(0)是栈底,栈满时的栈顶为S.free(99)。
(2) 档案区中的所有空闲盘块被分成若干个组,比如,将每 100 个盘块作为一组。假定盘上共有 10 000 个盘块,每块大小为 1 KB,其中第 201~7999 号盘块用于存放档案,即作为档案区,这样,该区的最末一组盘块号应为 7901~7999;次末组为 7801~7900……;第二组的盘块号为 301~400;第一组为 201~300,如图所示。

(3) 将每一组含有的盘块总数 N 和该组所有的盘块号记入其前一组的第一个盘块的S.free(0)~S.free(99)中。这样,由各组的第一个盘块可链成一条链。
(4) 将第一组的盘块总数和所有的盘块号记入空闲盘块号栈中, 作为当前可供分配的空闲盘块号。
(5) 最末一组只有 99 个盘块,其盘块号分别记入其前一组的 S.free(1) ~S.free(99)中,而在 S.free(0)中则存放“0” ,作为空闲盘块链的结束标誌。(注:最后一组的盘块数应为 99,不应是 100,因为这是指可供使用的空闲盘块,其编号应为(1~99),0 号中放空闲盘块链的结尾标誌。)