动态存储管理的基本问题是:系统如何按请求分配内存,如何回收内存再利用。提出请求的用户可能是系统的一个作业,也可能是程序中的一个变量。
空闲块
未曾分配的地址连续的内存区称为“空闲块”。
占用块
已分配给用户使用的地址连续的内存区称为“占用块”。
系统刚刚启动时,整个内存可看做一个大的“空闲块”,随着用户请求的进入,系统依次分配相应的内存。
在系统运行过程中,内存被分为两大部分:低地址区(若干占用块)和高地址区(空闲块)。
经过一段时间后,有的程序运行结束,释放掉它所占用的内存,使之变为空闲块,这就使整个内存中空闲块和占用块之间出现了相互交错的现象。如下图:
当系统进入到图中b),又有新的用户请求分配内存时,系统该如何处理呢?
方法一:系统继续从高地址区的空闲块进行分配,直到无法分配。当剩余的空闲块不能满足分配请求时,系统才去回收所有的不再使用的内存区,并重新组织内存,紧凑所有的空闲块为一个大的空闲块,以备在分配。
方法二:空闲链表。空闲链表中包含了所有空闲块的信息,一个节点对应一个空闲块。当用户请求分配时,系统所作的工作就是搜索空闲链表,按某种策略找到一个合适的空闲块进行分配,并删除对应的节点。当用户释放所占用的内存时,系统回收该内存,并将它插入到空闲链表中。