对操作系统和编译程序来说,存储管理都是一个复杂而又重要的问题。不同语言的编译程序和不同的操作系统可以采用不同的存储管理方法。
动态存储管理的基本问题是系统如何应用户提出的"请求”分配内存?又如何回收那些用户不再使用而“释放”的内存,以备新的“请求”产生时重新进行分配?提出请求的用户可能是进入系统的一个作业,也可能是程序执行过程中的一个动态变量。因此,在不同的动态存储管理系统中,请求分配的内存量大小不同。通常在编译程序中是一个或几个字,而在系统中则是几千,几万,甚至是几十万。然而,系统每次分配给用户(不论大小)都是一个地址连续的内存区。为了方便起见,在下面的文章中,将统称已分配给用户使用的地址连续的内存区为“占用块”,称未曾分配的地址连续的内存区为“可利用空间块”或“空闲块”。
显然,不管什么样的动态存储管理系统,在刚开工时,整个内存区是一个“空闲块”(在编译程序中称之为“堆”)。随着用户进入系统,先后提出存储请求,系统则依次进行分配。因此,在系统运行的初期,整个内存区基本上分隔成两大部分:低地址区包含若干占用块;高地址区(即分配后的剩余部分)是一个“空闲块”。例如图1(a)所示为依次给8个用户进行分配后的系统的内存状态。经过一段时间以后,有的用户运行结束,它所占用的内存区变成空闲块,这就使整个内存区呈现出占用块和空闲块犬牙交错的状态。如图1(b)
假如此时又有新的用户进入系统请求分配内存,那么,系统将如何做呢?</