数据结构~动态存储管理(五)
本人学习笔记,仅供自己查阅
在早期的计算机上,这个存储管理的工作是程序猿自己来完成的。在程序执行之前,首先需将用机器语言或汇编语言编写的程序输送到内存的某个固定区域上,并预先给变量和数据分配好对应的内存地址(绝对地址或相对地址);
在有了高级语言之后,程序猿不需要直接和内存打交道,程序中使用的存储单元都由逻辑变量(标识符)来表示,它们对应的内存地址都是由 编译程序 在编译或执行时 进行分配的。
当计算机是被单个用户使用时,那么整个内存除了操作系统占用一部分之外,都归这个用户的程序使用。但在多用户分时并发系统中,多个用户程序共享一个内存区域,此时每个用户使用的内存就由操作系统来分配了。并且,在总内存不够用时,还可采用自动覆盖技术(不懂???)。
对操作系统和编译程序来说,存储管理都是一个复杂而又重要的问题。不同的语言的编译程序和不同的操作系统可以采用不同的存储管理方法。
动态存储管理的基本问题:
1)系统如何应用户提出的“请求”分配内存?
2)如何回收那些用户不再使用而“释放”的内存,以备新的“请求”产生时重新进行分配?
提出请求的用户可能是进入系统的一个作业,也可能是程序执行过程中的一个动态变量;在不同的动态存储管理系统中,请求分配的内存量大小不同。
通常在编译程序中是一个或几个字,而在系统中则是几千、几万,甚至是几十万。系统每次分配给用户(不论大小)都是一个地址连续的内存区。
不管什么样的动态存储管理系统,在刚开工时,整个内存区是一个“空闲块”(在编译程序中称之为“堆”)。随着用户进入系统,先后提出存储请求,系统则依次进行分配。
假如有新的用户请求系统分配内存,那么系统将如何做呢?
1)系统继续从高地址的空闲块中分配内存,而不理会已分配给用户的内存区是否已空闲,直至分配无法进行(即剩余的空闲块不能满足分配的请求)时,系统才去回收所有用户不再使用的空闲块,并且重新组织内存,将所有空闲的内存区连接在一起成为一个大的空闲块。
2)用户一旦运行结束,便将它所占内存释放成为空闲块,同时,每当新的用户请求分配内存时,系统需要巡视整个内存区中所有空闲块,并从中找出一个“合适”的空闲块分配之。由此,系统需建立一张记录所有空闲块的“可利用空间表”,此表的结构可以是“目录表”,也可以是“链表”。