第八章 磁盘存储器的管理(二)——文件存储空间的管理
为实现存储空间分配,系统需要:
记住空闲存储空间使用情况;为空间设置相应的数据结构;
提供对存储空间分配、回收的操作手段。
典型的管理方法:
1)空闲表和空闲链表法
空闲表法:常用于连续分配管理方式
数据结构:系统为外存上的所有空闲区建立一张空闲表,每个空闲区对应一个空闲表项(表项包括序号、空闲区的第一个盘块号、空闲盘块数等。)将所有空闲区按其起始盘块号递增的次序排列。
存储空间的分配与回收操作:
与内存的动态分配类似,同样可采用首次适应算法、循环首次适应算法等。
回收主要解决对数据结构的数据修改。
应该说明,虽然很少采用连续分配方式,然而在外存的管理中,由于它具有较高的分配速度,可减少访问磁盘的I/O频率,故它在诸多分配方式中仍占有一席之地。(如实现虚拟用的部分外存就是连续分配方式)
空闲链表法:将所有空闲盘区拉成一条空闲链。
数据结构:链 根据构成链所用基本元素的不同,可把链表分成两种形式:
空闲盘块链;空闲盘区链
空闲盘块链:分配回收简单。链表长,大量分配时需要操作的指针多
空闲盘区链:链表长度不定,分配时操作的指针数量相对较少,但分配回收操作相对复杂。
2)位示图法
利用二进制的一位来表示一个盘块的使用情况。
值为0表示对应的盘块空闲,为1表示已分配。有的系统则相反。
磁盘上的所有盘块都有一个二进制位与之对应,这样由所有盘块所对应的位构成一个集合,称为位示图。
总块数=mn。可用mn个位数来构成位示图,可看成是二维数组(数据结构)。
盘块的分配与回收
根据位示图进行盘块分配:
1.顺序扫描位示图。找到为0的二进制位。
2.将所找到的一个或一组二进制位,转换成与之对应的盘块号。进行分配操作。盘块号计算公式为:盘块号 = 列总数*(i-1)+ j;(注意下标i,j从1开始)
3.修改位示图。
根据位示图进行盘块回收:
1.将回收盘块的盘块号转换成位示图中的行号和列号。转换公式为:i=(盘块号-1)div列数+1;j=(盘块号-1)mod列数+1。Div 求商,mod 取余,公式中的i、j都是从1开始的(如12号盘块转换后为1,12)
2.修改位示图。
优点:从位示图中很容易找到一个或一组相邻接的空闲盘块。
缺点:限于容量问题,常用于微型机和小型机中。
3)成组链接法
大型文件系统,空闲表或空闲链表太长不方便管理操作。,UNIX系统中采用成组链接法,这是将两种方法结合而形成的一种空闲盘块管理方法。
中心思想:
所有盘块按规定大小划分为组;
组间建立链接;
组内的盘块借助一个系统栈可快速处理,且支持离散分配回收。
所有空闲盘块,被分成若干个组,设有10000个盘块,每100个分为1组,则分成100个组。201-7999为文件区,各组链接起来。
例题:
例:某系统采用成组链接法管理磁盘空闲空间,目前状态如上图,问:
还有多少空闲盘块?
答:若从当前状态下,系统分配3个盘块给某文件后,又删除另一文件,回收了第700,711,703,788,701这5个盘块。则磁盘空间的状态图中的链接情况又如何?
1.空闲盘块的组织
空闲盘块号栈。
用来存放当前可用的一组空闲盘块的盘块号(最多含100个号)
栈中尚有的空闲盘块号数N。(N兼具栈顶指针用。栈底为S.free(0),栈满时栈顶到达S.free(99),N=100,表示有100个盘块供使用。
链接
每一组的第一个盘块记录下一组的盘块号,形成了一条链。
总将链的第一组盘块总数和所有的盘块号,记入栈,作为当前可供分配的空闲盘块号。
空闲盘块的分配与回收
分配盘块时,须调用分配过程来完成。
先检查空闲盘块号栈是否上锁,如没有,便从栈顶取出一空闲盘块号,将与之对应的盘块分配给用户,然后将栈顶指针下移一格。
若该盘块号已是栈底,即S.free(0),到达当前栈中最后一个可供分配的盘块号。
读取该盘块号所对应的盘块中的信息:即下一组可用的盘块号入栈。
原栈底盘块分配出去。修改栈中的空闲盘块数。
回收
回收盘块号记入栈顶,空闲数N加1
N达到100时,若再回收一块,则将该100条信息填写入新回收块。
第八章 磁盘存储器的管理(二)——文件存储空间的管理
为实现存储空间分配,系统需要:
记住空闲存储空间使用情况;为空间设置相应的数据结构;
提供对存储空间分配、回收的操作手段。
典型的管理方法:
1)空闲表和空闲链表法
空闲表法:常用于连续分配管理方式
数据结构:系统为外存上的所有空闲区建立一张空闲表,每个空闲区对应一个空闲表项(表项包括序号、空闲区的第一个盘块号、空闲盘块数等。)将所有空闲区按其起始盘块号递增的次序排列。
存储空间的分配与回收操作:
与内存的动态分配类似,同样可采用首次适应算法、循环首次适应算法等。
回收主要解决对数据结构的数据修改。
应该说明,虽然很少采用连续分配方式,然而在外存的管理中,由于它具有较高的分配速度,可减少访问磁盘的I/O频率,故它在诸多分配方式中仍占有一席之地。(如实现虚拟用的部分外存就是连续分配方式)
空闲链表法:将所有空闲盘区拉成一条空闲链。
数据结构:链 根据构成链所用基本元素的不同,可把链表分成两种形式:
空闲盘块链;空闲盘区链
空闲盘块链:分配回收简单。链表长,大量分配时需要操作的指针多
空闲盘区链:链表长度不定,分配时操作的指针数量相对较少,但分配回收操作相对复杂。
2)位示图法
利用二进制的一位来表示一个盘块的使用情况。
值为0表示对应的盘块空闲,为1表示已分配。有的系统则相反。
磁盘上的所有盘块都有一个二进制位与之对应,这样由所有盘块所对应的位构成一个集合,称为位示图。
总块数=mn。可用mn个位数来构成位示图,可看成是二维数组(数据结构)。
盘块的分配与回收
根据位示图进行盘块分配:
1.顺序扫描位示图。找到为0的二进制位。
2.将所找到的一个或一组二进制位,转换成与之对应的盘块号。进行分配操作。盘块号计算公式为:盘块号 = 列总数*(i-1)+ j;(注意下标i,j从1开始)
3.修改位示图。
根据位示图进行盘块回收:
1.将回收盘块的盘块号转换成位示图中的行号和列号。转换公式为:i=(盘块号-1)div列数+1;j=(盘块号-1)mod列数+1。Div 求商,mod 取余,公式中的i、j都是从1开始的(如12号盘块转换后为1,12)
2.修改位示图。
优点:从位示图中很容易找到一个或一组相邻接的空闲盘块。
缺点:限于容量问题,常用于微型机和小型机中。
3)成组链接法
大型文件系统,空闲表或空闲链表太长不方便管理操作。,UNIX系统中采用成组链接法,这是将两种方法结合而形成的一种空闲盘块管理方法。
中心思想:
所有盘块按规定大小划分为组;
组间建立链接;
组内的盘块借助一个系统栈可快速处理,且支持离散分配回收。
所有空闲盘块,被分成若干个组,设有10000个盘块,每100个分为1组,则分成100个组。201-7999为文件区,各组链接起来。
例题:
例:某系统采用成组链接法管理磁盘空闲空间,目前状态如上图,问:
还有多少空闲盘块?
答:若从当前状态下,系统分配3个盘块给某文件后,又删除另一文件,回收了第700,711,703,788,701这5个盘块。则磁盘空间的状态图中的链接情况又如何?
1.空闲盘块的组织
空闲盘块号栈。
用来存放当前可用的一组空闲盘块的盘块号(最多含100个号)
栈中尚有的空闲盘块号数N。(N兼具栈顶指针用。栈底为S.free(0),栈满时栈顶到达S.free(99),N=100,表示有100个盘块供使用。
链接
每一组的第一个盘块记录下一组的盘块号,形成了一条链。
总将链的第一组盘块总数和所有的盘块号,记入栈,作为当前可供分配的空闲盘块号。
空闲盘块的分配与回收
分配盘块时,须调用分配过程来完成。
先检查空闲盘块号栈是否上锁,如没有,便从栈顶取出一空闲盘块号,将与之对应的盘块分配给用户,然后将栈顶指针下移一格。
若该盘块号已是栈底,即S.free(0),到达当前栈中最后一个可供分配的盘块号。
读取该盘块号所对应的盘块中的信息:即下一组可用的盘块号入栈。
原栈底盘块分配出去。修改栈中的空闲盘块数。
回收
回收盘块号记入栈顶,空闲数N加1
N达到100时,若再回收一块,则将该100条信息填写入新回收块。