文章目录
- 前言
- 连续分配管理的方式
- 单一连续分配
- 固定分区分配
- 动态分区分配
- 如何记录内存的使用情况
- 如何选择分区
- 如何对分区进行回收
前言
当我们的进程在完成编译以后,需要装入内存,此时就有两种方式来进行内存的分配:连续分配、非连续分配。
连续分配管理的方式
单一连续分配
首先,整个内存被分为了系统区与用户区两部分。用户进程只能分配到用户区中,而且只能分配一个进程到用户区。这就是所谓的单一连续分配方式。
- 优点:实现简单;无外部碎片(主要是因为整个用户区都分配给一个进程了,自然没呀外部的碎片空间)、不一定需要内存保护;
- 缺点:只能用于单用户、单任务的操作系统;
- 有内部碎片(用户区都分配给一个进程,导致没利用的空间直接空闲);
- 存储器利用率低;
固定分区分配
与单一连续分配方式对应的是固定分配分区。在装入多个进程时,操作系统直接给每个进程分配固定大小的内存空间即为固定分配分区方式。为了让操作系统知道这些分区的具体位置,操作系统会维护相关信息,并将其放入分区说明表中。分区说明表的内容概括如下图:
- 优点:实现简单;无外部碎片;
- 缺点:较大用户程序时,需要采用覆盖技术扩充内存,降低了性能;会产生内部碎片,导致内存利用率降低;
动态分区分配
以上两种方式在分配内存空间时,都相当于是分配了固定大小的内存区域。那么要实现动态的分配内存区域?
我们可以从三个方面来思考:
- 如何记录内存的使用情况?
- 选择哪个分区给新进程?
- 已使用的分区怎么回收?
如何记录内存的使用情况
在记录内存使用情况方面,对固定分区分配的方式做了优化。通过空闲分区表记录内存的使用情况。
其底层数据结构可以是数组,也可以是双向链表。采用双向链表时,进程进程分配内存空间时,可以向前或者向后查询(方便使用多个分区,看相邻的那几个分区大小更适合当前进程)。
如何选择分区
因此就涉及到了该如何判断哪些分区更适合装入当前进程的方式。具体有以下几种(不同的算法表示了上图链表的排序方式):
- 首次适应算法:从低地址查找合适空间;
- 最佳适应算法:优先使用最小空闲空间;
- 最坏适应算法:优先使用最大连续空间;
- 临近适应算法:从上次查找处向后查找;
以上几种算法做一个对比,如下图:
如何对分区进行回收
假如当前存在下图的一个内存分配情况:
此时用户区存在五个分区,空闲分区仅剩一个,此时的空闲分区表如下:
如果现在P1进程被回收,那么之前P1进程分配的内存分区信息将会更新到空闲分区表中。
接下来,P3进程也进行了回收操作,同样的,空闲分区表将会更新P3进程之前所分配的内存分区信息。
以上两个进程的相继回收以后,假如P2或者P4进程继续回收,会使得空闲分区变得连贯,操作系统会将相邻空间合并,同时更新空闲分区表。