高效内存管理系列(2)之内存管理理论

来源:互联网 发布:电脑广告录音软件 编辑:程序博客网 时间:2024/05/23 01:23
二、内存管理理论

 由于不能从内存设计方面作出探讨,而是从性能和内存角度分析内存管理,因此本小节从实际应用的角度上讨论内存管理方面的一些理论。

 创建内存管理器时,存在以下功能区域的设计决策:

1、如何获得和存储管理的初始内存
 
 前面,我们已经分析了两种内存管理器的存储方法。在可利用空间表(freelist)示例中,使用了一个空闲内存动态列表,用于满足内存分配请求,而类BigChunkStack使用了一大块内存空间,在存在内存请求时,就把它分成若干小块以满足内存请求需要。当然,我们可以改变上述思想,组合使用上述两种方法,效果会更理想。

2、如何应分配请求选择内存

 在选择好空闲内存块存储方案,且为内存管理器声明了初始化内存后,就可以考虑内存管理器出来内存分配请求的问题了。如果内存管理器申请使用内存,则必须在其管理的内存中选择一块。

(1) 最佳匹配法
 最佳匹配法,需要查询所以空闲的内存块,找到可以满足特定内存请求的最小空闲内存块。例中,显示内存管理器接受到请求,为两个连续的内存请求分配内存空间。
 初始空闲内存块: A(160KB), B(70KB), C(99KB), D(120KB)
 内存请求1)   内存块大小100KB
 最佳匹配:   搜寻后,D(120KB)
 新空闲内存块:  A(160KB), B(70KB), C(99KB), D'(20KB)
 内存请求2)   内存块大小130KB
 最佳匹配:   A(160KB)
 新空闲内存块:  A'(30KB), B(70KB), C(99KB), D'(20KB)
 
 应用最佳匹配的基本思想是尽量选择一块与申请内存块大小最为接近的内存块,避免产生新的内存碎片。从另一角度来分析,应请求分配内存空间后,剩余的内存块应是最小的。使用最佳匹配意味着,可以尽量的保证把最大的空闲内存块保留下来,满足以后对大内存块的请求。当然,最佳匹配也存在一定潜在的不利因素,即内存块分配完后,余下的内存块太小(例如,内存块D'和A'),程序可能再也无法使用它们了。
 
(2)最差匹配法
 最近匹配与最佳匹配完全相反。它总是使用最大的空闲内存块来满足内存请求。
 初始空闲内存块: A(160KB), B(70KB), C(99KB), D(120KB)
 内存请求1):   70KB
 最差匹配:   A(160KB)
 新空闲内存块:  A'(90KB), B(70KB), C(99KB), D(120KB)
 内存请求2):   40KB
 最差匹配:   D(120KB)
 新空闲内存块:  A'(90KB), B(70KB), C(99KB), D'(80KB)
 
 最差匹配,可以尽量保证满足内存请求后,可以再使用剩下的内存块。它同样的存在一定的不利因素,即程序允许一段时间后,在可利用空间表中的内存块都比较小,无法满足对大内存块的请求。
 
(3)首次匹配法
 首次匹配,指在可利用空间表中找到第一个满足内存请求条件的内存块,就将它分配给该内存请求。应该这种方法,是种权宜之计。因为它与最佳匹配和最差匹配不同,在选择内存块时,并非检查所有的内存块。在内存块申请的过程中是否产生内存碎片决定于空闲内存块在可利用空间表中的排列顺序。

3、如何排列和合并释放的内存
 当程序中释放了一块内存块,且将它归还给内存管理器,则需要生成一个经常释放内存的索引,并将它加入到内存管理器的可利用空间表中。确定释放内存在可利用空间表中存放位置的方法对内存管理器的运行具有很大的影响。
 分析一个在可利用空间表中按照大小顺序存放内存块的内存管理器,其中将最大的内存块放在表的最前面,将最小的放在最后。当在此可利用空间表中应该首次匹配法时,内存管理器实际执行的是最差匹配算法,因为在进行内存分配时总是先分配最大的内存块。同样地,当内存管理器把最小的内存块放在空间表的最前面,依序,此时应用首次匹配法,实际上转化成最佳匹配算法。当然,将内存块按大小进行排序需要花费一定时间,但是,如果进行了内存块的排序,内存管理器的性能可以得到优化。
 其它的排序方法有:
 (1)根据内存地址进行排序
 按照每个空闲内存块第一个字节的地址,对可利用空间表进行排序。这种排序方法非常有用。应用它,内存管理器可以把内存碎片重新整合成较大的内存块。无论什么时候,当一块新释放的内存块插入到可利用空间表中时,程序就会对可利用空间表进行快速检查,决定是将前面的内存块还是后面的内存块与刚刚释放的内存块结合。在这种情况下,可利用空间表的几个入口就会被一个新的入口代替(如果新加入的内存块加到可利用空间表的表头,则可利用空间表的入口地址就会改变)。
 (2)根据释放时间进行排序
 这种方法是按照内存块释放时间先后来决定其次序的,执行这种操作的算法非常简洁,直截了当。新释放的内存块总是放在可利用空间表的表头或表尾,如果是表头,内存管理器运行效率非常高。例如,大小相等的内存块频繁连续的分配和释放。
 

总结

 实际上,实现内存管理器的方法有很多,在实际应用中,选择使用哪种方法没什么特别规则,具体情况具体分析。我们也可以选择几种技术的混合应用,也可以开发出其它的新技术。另外一点需要重视的内容是我们可以根据需要在程序中应用适当数量的内存管理技术,不必要创建一个主内存管理器来管理所有的内存请求。事实上,正如在freelist和BigChunkStack示例中看到的,如果程序需要,我们可以为每个类创建一个专门的内存管理器。我们甚至可以使用OS内存管理工具管理大多数内存请求,仅编写自己的内存管理器来管理特定的或关键的类。

 
原创粉丝点击