开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
外存空间管理
主要就是空闲块的管理,有以下方法:
- 空闲表法
- 空闲链表法
- 位示图法
- 成组链接法
空闲表法
与内存管理中的动态分区分配方式是相同的
空闲盘块的分配与内存的动态分配类似,同样可以用首次﹑最佳﹑最坏适应法。盘块的回收也同内存的回收方式类似。
空闲链表法
空闲块链是另一种空闲块的组织方法,它用一种链结构把所有空闲块链接在一起。
- 分配:当系统建立文件需分配空闲块时,从链首摘取所需的空闲块,然后调整链首指针。- 回收:当回收空闲块时,把释放的空闲块逐个插入链首。
这种方法只需在系统中保留一个链首指针,令其指向第一个空闲块。
- 优点是简单,但工作效率较低,因为每次在链上增加和移出空闲块时,需要做IO操作。
- 例如把一空闲块插入链时,要把链首指针(指向原第一个空闲块)写该空闲块中,然后让链首指针指向该空闲块。从链中摘取空闲块时也要读取下一个空闲块的指针。
位示图法
系统为磁盘建立一张位示图,在该图中每个物理块占1位,按物理块的顺序排列。"1”表示对应的物理块已占用,"O”表示空闲。
-
分配时首先在位示图中找到为“O”的位,然后转换成对应的物理块号,分配给申请者,并把相应的位置为“1”。
- i-1 * n+ j-1 =b
-
回收时先将释放的物理块号转换成相应的位,并把这一位置为“o”。
- i= b/n + 1,j=(b mod n)+1
-
位示图的大小依据物理磁盘的容量而定·如360KB的软盘,每个物理块为512字节,位示图只占用90个字节。
-
因占用空间小,可以直接放入内存。
成组链接法
在UNIX中有一个整型数组s_free[lo0]和一个整型变量s_nfree 。
- 将所有的空闲盘块分组,每100个空闲盘块为一组。最后一组的块号填入s_free[]·块数赋于s_nfree 。其余各组的块号则分别存放在它的下一组的第一个盘块中。
- 分配空闲盘块时,总是分配s_free[s_nfree]所指的盘块,并且s_nfree减1 。
- 当发现是直接管理的最后一个盘块时,即s_nfree=l时,就将该盘块中的索引表写入到s_nfree和s_free[中,使得下一组变为直接管理。如此类推直到最后一组。
释放
释放空闲盘块时,将其块号登记在s_free[]表中第一个未被占用的项。
例如,若s_nfree 的原先值为87,则将释放块号登记在s_free[88]中,然后s_nfree加 1 0
- 若在登记之前发现s_free已满﹐则将s_free[1]至s_free[100]的内容复写到要释放的盘块中。这样原来直接管理的100个空闲盘块变为由释放块间接管理。然后将此该释放块的块号填入s_free[1],把s_nfree 置为1 。