接下来要涉及具体的存储分配。结构中的每个数据元素都占有一定的内存位置。
在程序执行的过程当中数据元素的存取是通过对应的存储单元来进行的。
有了高级语言之后,程序员不需要直接和内存地址打交道了。
程序中使用的存储单元都由逻辑变量(标识符)来表示。
它们对应的内存地址都是由编译程序在编译或执行的时候进行分配的。
在多用户分时并发系统中,多个用户程序共享一个内存区域,此时每个用户程序使用的内存就由操作系统来进行分配了。
对于操作系统和编译程序来说,存储管理都是一个复杂又重要的问题。
不同语言的编译程序和不同的操作系统可以采用不同的存储管理方法。
它们采用的具体做法可以在编译原理和操作系统中学习。
这里仅就动态存储管理中涉及的一些基本技术进行讨论。
=====================================================
动态存储管理的基本问题是:系统如何应用用户提出的“请求”分配内存?又如何回收那些用户不再使用而“释放”的内存,以备新的“请求”产生时重新进行分配。
在不同的动态存储管理系统中,请求分配的内存量大小不同。
这里统一描述:已分配给用户使用的地址连续的内存区为“占用块”,未曾分配的地址连续的内存区为“可利用空闲块”或“空闲块”。
在刚开工时,整个内存区是一个“空闲块”,编译程序中称之为“堆”。
随着用户进入系统,先后提出存储请求,系统则依次进行分配。
在系统运行的初期,整个内存区基本分成两大部分,低地址区包含若干占用块,高地址区是一个“空闲块”。
经过一段时间之后有的用户运行结束,它所占用的内存区变成空闲块。这就使得整个内存区呈现出占用块和空闲块犬牙交错的状态。
=====================================================
假如此时有新的用户进入系统请求分配内存,那么,系统将如何做呢?
有两种做法:
1)系统继续从高地址的空闲块中进行分配,而不理会已分配给用户的内存区是否已空闲,直到分配无法进行时,系统才去回收所有用户不再使用的空闲块,并且重新组织内存,将所有空闲的内存区连接在一起成为一个大的空闲块。
2)用户一旦运行结束,便将它所占的内存区释放成为空闲块,同时,每当新的用户请求分配内存时,系统需要巡视整个内存区中所有空闲块,并从中找出一个合适的空闲块分配之。
并且系统需要建立一张记录所有空闲块的“可利用空间表”,此表的结构可以是“目录表”或者“链表”。