网上科普有关“文件存储空间管理”话题很是火热,小编也是针对文件存储空间管理寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。
上篇文章介绍了文件的物理结构并介绍了文件分配的三种方式——连续分配、链接分配和索引分配。
本文介绍操作系统对文件存储空间的管理。
本文内容
存储空间的划分: 将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘) 。
在存储空间初始化时,需要将各个文件卷划分为目录区、文件区。
有些系统支持超大型文件,可支持由多个物理磁盘组成一个文件卷。
空闲表法:即用一张表记录磁盘中空闲的盘块。空闲表的表项由 空闲盘的起始块号 和 空闲盘块数 组成。如下图所示
如何分配磁盘块:与内存管理中的动态分区分配类似,为一个文件分配连续的存储空间。同样可以采用 首次适应算法、最佳适应算法、最坏适应算法,临近适应算法 来决定要为文件分配哪些区间。
空闲表法适用于连续分配方式。
例如,如果新创建的文件请求3个块,按照首次适用算法,从10号块开始有5个连续的块可以满足需求,所以把10、11、12三个块分配给文件,分配后的空闲盘块表如下
这里以回收区前后都是空闲区为例,磁盘是第一幅图的状态,如果回收21、22号磁盘块,那么回收后的空闲盘块表如下图所示。
空闲链表法分为两种: 空闲盘块链和空闲盘区链
下图分别表示空闲盘块链和空闲盘区链。
操作系统保存着 链头、链尾指针。
如何分配:如过某文件申请K个盘块,则从链头开始依次摘下K个盘块分配,并修改空闲链的链头指针。
如何回收:回收的盘块依次挂到链尾,并修改空闲链的链尾指针。
下图表示分配了3个盘块
从上面可以看出,空闲盘块法适用于 离散分配 的物理结构。为文件分配多个盘块时可能要重复多次操作。
操作系统保存着 链头、链尾指针 。
如何分配:若某文件申请K个盘块,由于空闲盘区链将连续的盘块组成一个盘区,所以若某个盘区大小满足可以实现一次分配,同样可以采用首次适用、最佳适用等算法,从链头开始检索,按照一定的规则找到一个大小符合要求的空闲盘区分配给文件。若没有合适的连续空闲块,也可以将不同的盘区的盘同时分配给一个文件,同样分配后也需要修改相应的指针链和盘区大小等数据。
如何回收:若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若回收区没有和任何空闲区相邻,将回收区作为一个单独的一个空闲盘区挂到链尾。同样也需要修改链表指针和盘区大小等信息。
下图表示按照首次适用算法分配3个盘区
从上面可以看出,空闲盘区链对 离散分配、连续分配 都适用。为一个文件分配多个盘块时 效率更高 。
位示图:磁盘内存被划分为一个个磁盘块,可以用二进制位对应一个盘块。“0”代表盘块空闲,“1”代表盘块已分配。位示图一般用连续的“字”来表示,下图中一个字的字长是16位,字中的每一位对应一个盘块。因此可以用(字号,位号)对应一个盘块号。
如何分配:若文件需要K个块,①顺序扫描位示图,找到K个相邻或不相邻的“0”;②根据字号、位号算出对应的盘块号,将相应的盘块分配给文件;③将相应的位设置为“1”。
如何回收:①根据回收的盘块号计算出对应的字号、位号;②将相应的二进制位设置为“0”。
从上面可以看出:位示图法对 连续分配和离散分配 都适用。
空闲表法、空闲链表法不适用大型文件系统,因为空闲表或空闲联保可能过大。UNIX系统中采用了 成组链接法 对磁盘空闲块进行管理。这是将上述两种方法相结合的而形成的一种空闲管理方法。
文件卷的目录区中专门用一个磁盘块作为 超级块 ,当系统启动时需要将 超级块读入内存 。并且要保证与外存中的“超过块”的数据一致。
内存的分配过程:分配过程是从栈顶取出一空闲盘块号,将与之对应的盘块分配给用户,然后将栈顶指针下移一格,若该盘块号已是栈底(即第一个盘块),这是当前栈中最后一个可分配的盘块号。由于在该盘块号所对应的盘块中记有下一组可用的盘块号,因此,不能直接将它分配掉,需要将它记录的下一组信息保存下来,所以比须调用磁盘读过程,将栈底盘块号所对应盘块的内容读入栈中,作为新的盘块号栈的内容,并把原栈底对应的盘块分配出去(其中的有用数据已读入栈中)。然后,再分配一相应的缓冲区(作为该盘块的缓冲区)。最后,把栈中的空闲盘块数减1 并返回。
下面举例说明
如果此时新建一个文件需要一个磁盘块,那么此时第一组有100个空闲块,所以是足够分配的,将栈顶的盘块号即201号盘块对应的盘块分配出去,如下图
如果此时又创建一个新的文件,需要99个磁盘块,就需要将剩下的99个盘块全部分配出去,但是此时300号盘块记录了下一组信息,如果分配出去,信息就是丢失,所以需要将300号盘块从外存(磁盘)读入内存,将300号盘块记录的信息,写入空闲盘块号栈,然后才能将这99块空闲块分配出去。具体过程如下图所示
内存的回收过程:在系统回收空闲盘块时,须调用盘块回收过程进行回收。它是将回收盘块的盘块号记入空闲盘块号栈的顶部,并执行空闲盘块数加 1 操作。当栈中空闲盘块号数目已达 100 时,表示栈已满,便将现有栈中的100 个盘块号记入新回收的盘块中,再将其盘块号作为新栈底。
以分配的第一个图为例,201盘块被分配出去了,如果此刻有个文件被删除了,其占用的盘块是199号,系统需要回收这个盘块,发现此时空闲盘块号栈中记录空闲块数为99,直接将盘块号记录栈顶,将空闲盘块数加1即可。
如果此时又有一个文件被删除了,其占用的盘块是190,此时空闲盘块号数已经达到100了,就需要将现在空闲盘块栈中信息记入新回收的块中。
在动态分区分配方式中,应如何将各空闲分区链接成空闲
最佳适应算法产生的碎片是:外部碎片,因为最佳适应算法虽然称为“最佳”,但是性能通常很差,所以每次最佳的分配会留下很小的难以利用的内存块,它会产生最多的外部碎片。
并且最坏适应算法与最佳适应算法相反,选择最大的可用块,这看起来最不容易产生碎片,但是却把最大的连续内存划分开,会很快导致没有可用的大的内存块,因此性能也非常差。
所以首次适应算法可能比最佳适应法效果好,而它们两者一定比最大适应法效果好。另外注意,在算法实现时,分配操作中最佳适应法和最大适应法需要对可用块进行排序或遍历查找,而首次适应法和邻近适应法只需要简单查找。
回收操作中,当回收的块与原来的空闲块相邻时,需要将这些块合并。在算法实现时,使用数组或链表进行管理。除了内存的利用率,这里的算法开销也是操作系统设计需要考虑的一个因素。
最佳适应算法中动态分区的分配策略是:
在进程装入或换入主存时,如果内存中有多个足够大的空闲块,操作系统必须确定分配哪个内存块给进程使用,这就是动态分区的分配策略。
1、首次适应:地址递增,顺序查找,第一个能满足的即分配给进程。
2、最佳适应:容量递增,找到第一个能满足要求的空闲分区。
3、最坏适应:容量递减,找到第一个能满足要求的分区。
4、邻近适应:循环首次适应算法。
在动态分区分配中,介绍了七种算法,其中首次适应、循环首次适应算法需要按照地址递增的顺序链接分区,最佳适应、最坏适应算法需要按照分区的大小来链接分区,快速适应、伙伴系统、哈希算法需要按照分区的大小分类链接成不同种类的空闲分区链。
关于“文件存储空间管理”这个话题的介绍,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!
本文来自作者[乐安]投稿,不代表平和号立场,如若转载,请注明出处:https://resphina.com/cshi/202603-106064.html
评论列表(4条)
我是平和号的签约作者“乐安”!
希望本篇文章《文件存储空间管理》能对你有所帮助!
本站[平和号]内容主要涵盖:国足,欧洲杯,世界杯,篮球,欧冠,亚冠,英超,足球,综合体育
本文概览:网上科普有关“文件存储空间管理”话题很是火热,小编也是针对文件存储空间管理寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。 上篇文章介绍...