标签:内存分配算法 临界资源 否则 物理地址 从后往前 进程睡眠 提示 strong .com
文件外存空间管理方法主要有:
(1)位示图
用若干字节构成一张位示图,其中每个字节对应一个物理块,字节的顺序与块的相对顺序一致,1表示占用0表示空闲。
优点:可以把位示图全部或大部分保存在主存中,再配合现代计算机都具有的位操作指令,可实现高速物理块分配和去配
(2)空闲区表
将空闲物理块的位置及连续空闲的物理块数构成一张表。
分配时,系统依次扫描空闲区表,寻找合适的空闲物理块并修改登记项;删除文件并释放空闲区时,把空闲区位置及连续空闲区长度填入空闲区表,出现邻接的空闲区时,还需执行合并操作并修改登记项。
空闲区表的搜索算法与可变分区方式的内存分配算法相似。
(3)空闲块链
把所有空闲块链接在一起,系统保持指针指向第一个空闲块,每一个空闲块中包含指向下一空闲块的指针。
(4)空闲块列表
把所有空闲块物理地址放到一个空闲块列表文件中,可以:
①列表用下推栈实现,栈中靠前数千元素保留在内存专用区。分配新内存块时从栈顶弹出,解除物理块分配时,压入内存专用区的栈尾。当下推栈中在内存的部分满或者空时,才需要在内存、磁盘间传送。
②列表用FIFO队列实现,队列头和队列尾的数千元素保留在内存专用区。分配新内存块时从队列头取首项,解除物理块分配时添加在内存专用区队列尾。当内存中的队列头空/队列尾满时,才需要在内存、磁盘间传送。
(5)成组空闲块链
克服了空闲链表法表太长的缺点,但是保持了其优点,即分配和回收一个盘块比较简单。
它是Unix系统中常见的管理空闲盘区的方法,它把空闲块分为若干组,每100个空闲块为一组,每组的第一个空闲块记录了空闲块总数和下一组物理空闲块的物理盘块号。
左边绿色的空闲盘块号栈,这是第一组(唯一进入内存的一组,只有它会占据存储空间)。S.free = 100表示该组有100个空闲块数目;第0号对应的是300,表示下一组物理空闲块的物理盘块号为300,它指向的是300号对应的磁盘块。再看黄色的块,这些块里保存的才是真正的可用的空闲块,也就是说每组中只有99个块可用。尽管如此,每组还是有100个块的。
特别要注意的是,最后一组的下一组盘块号没有么,采用的是结束标记“0”,也就是最右边一个蓝色块的第二项为0。
磁盘块分配过程:
首先检查超级空闲盘块号(第一组)栈是否已上锁,(提示:这是临界资源),若已上锁则进程睡眠等待;否则,给空闲磁盘块号栈上锁后,将S.free减1,若S.free仍大于0,即第一组不止一个空闲盘块,则将s_free[s_nfree]中登记的空闲盘块分配出去;若S.free为0,即当前空闲盘块号栈中只剩下最后一个空闲盘块,由于该盘块中登记有下一组空闲盘块的盘块号和盘块数,因此核心在给超级块的空闲盘块号栈上锁后,先将该盘块的内容读入超级块的空闲盘块号栈,再将该盘块分配出去。另外,还需将空闲盘块号栈解锁,并唤醒所有等待其解锁的进程。若s_nfree为0,而且栈底登记的盘块号为0,则表示系统中无空闲盘块可分配,此时也让进程睡眠等待其他进程释放盘块。
磁盘回收过程:
系统回收空闲盘块时,若第一组不满100块,则只需将回收块的块号填入超级块的空闲盘块号栈栈顶,并将其中的空闲盘块数加1;若第一组已有100块,则必须先将超级块中的空闲盘块数和空闲盘块号写入回收块中,然后将盘块数1和回收块号记入超级块中。
分配过程是从前往后分配,先分配第一组,然后分配第二组……回收过程是正好相反,从后往前分配,先将释放的空闲块放入第一组,第一组满了,再开辟一组,之前的第一组变为第二组……
操作系统-文件系统(4)文件空间管理
标签:内存分配算法 临界资源 否则 物理地址 从后往前 进程睡眠 提示 strong .com
原文地址:https://www.cnblogs.com/yangyuliufeng/p/9339096.html