
第28讲文件管理之文件存储空间管理.docx
4页第二十八讲文件管理之文件存储空间管理文件存储空间的管理,就是空闲空间的管理卜-而介绍儿个常用的管理方法:1空闲表法和空闲链表法1.1空闲表法空闲表:系统为空闲区建立--张空闲表,每个空闲区对应于一个空闲表项,其中包括表项序 号、该空闲区的第一个盘块号、该区的空闲盘块数等信息再将所有空闲区按其起始盘块号 递增的次序排列,如下图序号第一空闲盘块号空闲盘块数12429331554——存储空间的分配和回收:> 与内存的动态分配类似,同样是采用首次适应算法、循环首次适应算法等> 内存管理中虽然很少采用连续分配方式,然而在外存的管理中,山于它具有较高的 分配速度,可减少访问磁盘的I/O频率,故仍可采用连续分配算法1.2空闲链表法空闲链表法是将所有空闲盘区拉成一条空闲链根据构成链所用基本元素的不同,町把链表 分成两种形式:1. 空闲盘块链:将磁盘上的所有空闲空间,以盘块为单位拉成一条链分配存储空间吋,系统从链首开始,依次摘下适当数目的空闲盘块分配给用户释放存储空间时,系统将回收的盘块依次插入空闲盘块链的末尾优点:是用于分配和回收一个盘块的过程非常简单缺点:是分配盘块时,可能要重复操作多次2. 空闲盘区链:将磁盘上的所有空闲盘区(每个盘区可包含若干盘块)拉成一条链。
> 在每个盘区上除含有用于指示下一个空闲盘区的指针外,还应有能指明本盘区大小 的信息> 分配盘区的方法与内存动态分区分配类似,通常采用首次适应算法> 在冋收盘区时,同样也要将冋收区与相邻的空闲盘区相合并> 在采用首次适应算法时,为提髙对空闲盘区的检索速度,可以采用显式链接方法, 亦即,在内存中为空闲盘区建立一张链表2位示图法2.1什么是位不图?位示图是利用二进制的一位来表示磁盘中一个盘块的使用情况0表示盘块空闲,1表示已 分配磁盘上所有盘块所对应的位构成一个集合,称为位示图通常可用个位数来构 成位示图,并使m*n等于磁盘的总块数可看成是二维数组1 2 3 4 5 6 7 8 9 10 11 12110010nn111n、丿JLvz1000001011 二0011 二nnfl11n1011u2.2盘块的分配根据位示图进行盘块分配时,可分三步进行:1) 顺序扫描位示图找到0二进制位2) 将所找到的一个或一组二进制位,转换成与Z对应的盘块号 盘块号=列数* (i-1) +j; ( ij,b (盘块号)都从1开始)盘块号二列数*i+j+l; ( i,j从0开始,b从1开始)3) 修改位示图令map[I,j]=li,j,b (盘块号)都从1开始。
2.3盘块的回收盘块的回收分两步:1) 将冋收盘块的盘块号转换成位示图中的行号和列号转换公式为(i,j,b (盘块号)都从1开始):匸(盘块号・1)\列数+1j=(盘块号-l)mod列数+1i,j从0开始,b从1开始:i=(盘块号・1)\列数j=(盘块号-1 )mod列数2) 修改位示图令maplI,jJ=0公式中减1加1的目的是凑齐最后一列的得数!优点是从位示图中很容易找到一个或一•纟II相邻接的空闲盘块常用于微型机和小型机中3成组链接法3.1引入空闲表法和空闲链表法都不适川于大型文件系统,因为这会使空闲表或空闲链表太长在UNIX系统中采用的是成组链接法是将上述两种方法结合而形成的一种空闲盘块管理方法,它兼备了上述方法的优点而克服了 表太长的缺点3.2空闲盘块的组织> 空闲盘块号栈用来存放当前可用的一组空闲盘块的盘块号(最多含100住), 以及栈中尚有的空闲盘块号数N引入一个数据结构,栈> N述兼作栈顶指针例如当N=100时,它指向S.free(99)o S.free(O)是栈底,栈满时 栈顶为S.free(99)o实际上就是利用N - 1来做下标> 文件中的所有空闲盘块,被分成若干个组,如有100000个盘块,每100块为1组, 将会分成1000个组。
> 将每一组含有的盘块总数N和该组的盘块号,记入其前一组的第一个盘块的S.free(0)~S.free(99)中这样由各组的第一个盘块形成了一条链> 将第一组的盘块总数和所有的盘块号,记入空闲盘块号栈中,作为当前可供分配的 空闲盘块号> 最末一组只有99个盘块,其盘块号分别记入其前一组的S.free(l)〜S.free(99)中,而 在S.free(O)中则存放0,作为空闲盘块链的结束标志空闲盘块的成组链接法示意图100400 •399 •栈301 —I r30029920140039933空闲盘块的分配> 首先检查空闲盘块号栈是否上锁,如没有,便从栈顶取出一空闲盘块号,将与之对 应的盘块分配给川户,然后将栈顶指针下移一格> 若该盘块号己是栈底,即S.free(O),这是当前栈中最后一个可供分配的盘块号山 于在该盘块号所对应的盘块中即有下一组可用的盘块号,因此须调用磁盘读过程, 将该盘块内容读入栈中,作为盘块号栈的新内容,并把原栈底盘块分配出去3.4空闲盘块的回收> 将回收盘块的盘块号记入空闲盘块号栈的顶部,并执行空闲盘块号加1操作> 当栈中空闲盘块号数廿已达100时,表示栈已满,便将现有栈中的100个盘块号, 记入新冋收的盘块中,再将其盘块号作为新栈底。












