内存管理是为了有效地利用内存。
最理想的情况是,需要使用的内存都提前分配好,这样就省略了内存管理这一步,简化了工作,也能提高程序的运行效率。但实际上这是不可能的,从硬件角度来说,程序运行的硬件环境可能不同,配置的内存不同。从软件角度来说,所需要的内存可能远远大于物理内存。这就决定了不可能提前分配好所有的内存。从利用率来看,提前分配好所有内存是一个极大的浪费。
内存的分配实际上是在一块较大的、连续的内存中,划分出大小不同的小块内存,提供给程序使用。这个大的内存块通常称为堆,可以口语化的表达为:有一大堆内存。内存管理最主要的内容是分配算法。
算法主要考虑的指标有:
1、平均分配时间。
2、平均回收时间。
3、利用率。算法要控制碎片的产生。使空闲内存尽可能连续。
常见的算法指导思想有:
1、最先适应。这是实际上比较常用的指导思想,就是在扫描空闲内存块的过程中,发现能满足需求的内存块就使用。好处就是,运行效率相对较高。缺点是行为不可控,可能导致最差的结果,也可能出现最好情况,从实际运行情况来看,大多数处于一个可以接受情况。
2、最差适应。可以说这是最不好的指导思想,从大块的内存开始分配,总是将大块的内存拆分,长期运行后,将导致系统中没有较大块的内存。每次分配都要扫描所有的空闲块,所以运行效率并不高。实际上这个指导思想从来没有真正应用,只是在操作系统教科书里存在。
3、最优适应。看似空间利用率高,但实际上由于都是从最接近请求长度的块中分配,反而极易产生碎片,可能导致空间利用率降低。而且每次分配都必须扫描所有的空闲内存块,运行效率并不高。好处就是,可以保留较大的内存块。
4、固定长度分配。好处就是可以做到极高的分配、回收速度。缺点是1、空间利用率低。2、使用范围受限,不能超过预定的分配长度。
在具体的指导思想下,会有各种不同的实现方式。