快速了解 存储管理——连续分配方式

连续分配之顺序搜索法

(1)单一连续分配:只能用于单用户、单任务的操作系统中。采用这: 种存储管理方式时,可把内存分为系统区和用户区两部分,系统区仅提供给OS使用,通常是放在内存的低址部分;用户区是指除系统区以外的全部内存空间,提供给用户使用。

(2)固定分区分配:最简单的一种可运行多道程序的存储管理方式。将内存分成大小相等的区块,或者大小不等的区块,每个分区中只放一个作业。此时,一般用一张分区说表来统计内存占用情况,并依据它给进程分配内存: 

快速了解 存储管理——连续分配方式

(3)动态分区分配:根据进程的实际需要,动态地为之分配内存空间。有以下几种算法:

     1) 首次适应算法(first fit):假设下列内存分区里的数字就是分区的大小。给定一个作业大小为12,则从链表的端首依次查找,直到找到第一个满足要求的分区;而且当有一个新进程时,还是一样从链表的段首开始查找。这就是首次适应算法。

快速了解 存储管理——连续分配方式

      2) 循环首次适应算法(next fit):只是在首次适应算法的基础上增加一个条件——将链表的首末两个端点连在一起,每次查找的开头是以上次查找到空闲区的下一个空闲区开始。

快速了解 存储管理——连续分配方式

      3) 最佳适应算法(best fit):该算法只是在首次适应算法的基础上将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链表,即将空闲链表的空闲分区按从小到大顺序排序。

      4) 最坏适应算法(worst fit):与3恰恰相反,将顺序调为从大到小即可。

      5) 快速适应算法(quick fit):是3的优化,只是将大小相等的分区放到了一个组里(因为有相等的分区时,最佳适应算法的排列顺序并不严格)。这使得查找的查找对象减少了很多(相等的分区只查找一次)。

但是,算法具体是怎么操作的呢?

      1)内存分配:见下图

快速了解 存储管理——连续分配方式

备注:请求的分区大小为u.size,表中每个空闲分区的大小可表示为m.size,size是事先规定的不再切割的剩余分区的大小。

      2)内存回收:F1,F2为空闲区;填充相同表示空闲分区的合并,红色箭头表示合并空闲区的起始地址。内存回收完成后一定要更新空闲分区表或空闲分区链表。

快速了解 存储管理——连续分配方式

【我认为,任何内存分配模型都涉及3个问题:1 分配模型涉及的数据结构;2 分配算法;3 算法实现,即就是分配操作。】

(3)' 伙伴系统——动态分区算法的特例

      伙伴系统规定:无论已分配分区或空闲分区,其大小均为2的k次幂,k为整数,l≤k≤m,其中, 2^1 表示分配的最小分区的大小,2^m表示分配的最大分区的大小,通常2^m是整个可分配内存的大小。

       为了探究伙伴系统的本质,我们考虑这样的过程:

设2^n<i<2^(n+1), i为一个进程的大小,则剩余内存大小就形如2^k-i、2^j两种形式的分区。我们按大小给他们分组排序形成一个链表:2^j很好排序;对于2^k-i这样的,若满足:2^l≤2^k-i≤2^(l+1),则将它分组到2^l里。此时,所有的空闲分区就都是2^j的形式了。

       因此,伙伴系统的分配流程为:新进入一个大小为q的进程,则计算出i,使得:

                                                                                         2^(i-1)<q<2^i

若链表里有2^i组,则将其分配给该进程;否则,检查是下一个元素是否满足上述关系,如满足,将其分配给该进程;否则继续检查下一个元素是否满足。依次递推,若遍历完整个空闲分区链表都没有,则分配失败。


后记连续分配方式会形成许多“碎片”,虽然可通过“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大开销。如果允许将一个进程直接分散地装入到许多不相邻接的分区中,则无须再进行“紧凑”。基于这一思想而产生了离散分配方式。离散分配的基本单位主要有两种:页、段。对比连续分配的思路,离散分配方式也可分为静态离散分配和动态离散分配——静态离散分配不支持“动态执行时装入方式”,不具备对换功能,必须将所有装入模块转入内存后才能运行;动态离散分配方式是虚拟存储管理的基础。