空闲内存管理

学习自《现代操作系统》

操作系统在动态分配内存时(malloc,new),需要对空间内存进行管理。一般采用了两种方式:位图和空间链表。

1、使用位图的存储管理

内存被划分为若干个几字节大小的分配单元,每个分配单元是否是空闲的情况采用位图来进行描述,如果已分配,相应位置1,未分配,置0。当需要分配新内存时,从位图中遍历找到满足大小的连续个0所在位置的内存,将其分配。

很显然,如果分配单元越小,则位图将会越大,位图自身所需占用的内存大小也就越大。而且上述方式会存在一个弊端,即如果进程大小不是分配单元的整数倍,则最后一个分配单元的内存会因为部分内存未分配而被浪费了。而且,在位图中查找指定长度的连续0串是较为耗时的操作,这也是位图的一个缺点。

2、使用链表的存储管理

如图3-6 c),采用链表形式记录内存是被分配还是空闲,以及对应的起始地址和长度。一般来说,采用双向链表的方式比单链表较为高效。其中对空闲内存的分配一般有如下算法:

首次适配算法:在链表中进行搜索,直到找到最初的一个足够大的空闲区,将其分配。除非进程大小和空间区大小恰好相同,否则会将空闲区分为两部分,一部分为进程使用,一部分成为新的空闲区。该方法是速度很快的算法,因为索引链表结点的个数较少。

下次适配算法:工作方式与首次适配算法相同,但每次找到新的空闲区位置后都记录当前位置,下次寻找空闲区从上次结束的地方开始搜索,而不是与首次适配放一样从头开始;

最佳适配算法:搜索整个链表,找出能够容纳进程分配的最小的空闲区。这样存在的问题是,尽管可以保证为进程找到一个最为合适的空闲区进行分配,但大多数情况下,这样的空闲区被分为两部分,一部分用于进程分配,一部分会生成很小的空闲区,而这样的空闲区很难再被进行利用。

最差适配算法:与最佳适配算法相反,每次分配搜索最大的空闲区进行分配,从而可以使得空闲区拆分得到的新的空闲区可以更好的被进行利用。

posted on 2017-10-27 14:54  chenjx_ucs  阅读(1313)  评论(0编辑  收藏  举报

导航