zoukankan      html  css  js  c++  java
  • 操作系统-文件系统(4)文件空间管理

    文件外存空间管理方法主要有:
    (1)位示图
    用若干字节构成一张位示图,其中每个字节对应一个物理块,字节的顺序与块的相对顺序一致,1表示占用0表示空闲。
    优点:可以把位示图全部或大部分保存在主存中,再配合现代计算机都具有的位操作指令,可实现高速物理块分配和去配
    (2)空闲区表
    将空闲物理块的位置及连续空闲的物理块数构成一张表。
    分配时,系统依次扫描空闲区表,寻找合适的空闲物理块并修改登记项;删除文件并释放空闲区时,把空闲区位置及连续空闲区长度填入空闲区表,出现邻接的空闲区时,还需执行合并操作并修改登记项。
    空闲区表的搜索算法与可变分区方式的内存分配算法相似。
    (3)空闲块链
    把所有空闲块链接在一起,系统保持指针指向第一个空闲块,每一个空闲块中包含指向下一空闲块的指针。
    (4)空闲块列表
    把所有空闲块物理地址放到一个空闲块列表文件中,可以:
    ①列表用下推栈实现,栈中靠前数千元素保留在内存专用区。分配新内存块时从栈顶弹出,解除物理块分配时,压入内存专用区的栈尾。当下推栈中在内存的部分满或者空时,才需要在内存、磁盘间传送。
    ②列表用FIFO队列实现,队列头和队列尾的数千元素保留在内存专用区。分配新内存块时从队列头取首项,解除物理块分配时添加在内存专用区队列尾。当内存中的队列头空/队列尾满时,才需要在内存、磁盘间传送。
    (5)成组空闲块链接法
    克服了空闲块链表太长的缺点,但是保持了其优点,即分配和回收一个盘块比较简单。
    它是Unix/Linux系统中常见的管理空闲盘区的方法,它把空闲块分为若干组,每100个空闲块为一组,每组的第一个空闲块记录了该组空闲块总数和下一组物理空闲块的物理盘块号。
    左边绿色的超级块存放空闲盘块号栈,它是在内存中的。
    S.free的值s_nfree表示该组还有的空闲块数目,也是栈顶指针,当s_nfree=100时它指向s_free[99];
    S.free[0]里的300表示下一组物理空闲块的物理盘块号为300,S.free[1]-S.free[99]里的盘块号对应的黄色的块才是真正可用的空闲块。也就是说每组100个块里只有99个块是空闲的。
    特别要注意的是,最后一组的下一组盘块号没有,S.free[0]里是结束标记“0”,也就是最右边一个蓝色块的第一项为99、第二项为0。
    磁盘块分配过程:
    首先检查超级空闲盘块号栈是否已上锁,(栈是临界资源,每次只允许一个进程访问),若已上锁则进程睡眠等待;否则,给空闲磁盘块号栈上锁后,将s_nfree减1,若s_nfree仍大于0,即第一组不止一个空闲盘块,则将s_free[s_nfree]中登记的空闲盘块分配出去;若s_nfree为0,即当前空闲盘块号栈中只剩下最后一个空闲盘块(该盘块中登记有下一组空闲盘块的盘块号和盘块数),因此内核先将该盘块的内容读入超级块的空闲盘块号栈,再将该盘块分配出去。最后将空闲盘块号栈解锁,并唤醒所有等待其解锁的进程。
    若s_nfree为0,而且栈底S.free[0]登记的盘块号为0,则表示系统中无空闲盘块可分配,此时也让进程睡眠等待其他进程释放盘块。
    磁盘回收过程:
    系统回收空闲盘块时,若第一组不满100块,则只需将回收块的块号填入超级块的空闲盘块号栈栈顶,并将其中的空闲盘块数s_nfree加1;若第一组已有100块,则必须先将超级块中的空闲盘块数和空闲盘块号写入回收块中,然后将盘块数1和回收块号记入超级块中。
    分配过程是从前往后分配,先分配第一组,然后分配第二组……回收过程是正好相反,从后往前分配,先将释放的空闲块放入第一组,第一组满了,再开辟一组,之前的第一组变为第二组……
  • 相关阅读:
    Hadoop 解除 “Name node is in safe mode”
    ubuntu永久修改主机名
    ssh免密码登录
    su 和 su- 会影响环境变量
    卸载ubuntu自带openJDK,更改成自己的JDK版本
    ubuntu安装jdk 1.6
    147.Insertion Sort List
    145.Binary Tree Postorder Traversal
    144.Binary Tree Preorder Traversal
    143.Reorder List
  • 原文地址:https://www.cnblogs.com/yangyuliufeng/p/9339096.html
Copyright © 2011-2022 走看看