数据结构与算法——第8章-动态内存管理-伙伴系统管理动态内存(8.3)
一 概述
1 | 1.伙伴系统 |
二 伙伴系统
2.1 伙伴系统
1 | 前面介绍了系统在分配与回收存储空间时采取的边界标识法。本节再介绍一种管理存储空间的方法——伙伴系统。 |
2.2 示例
1 | 例如,系统中整个存储空间为 2m 个字。 |
三 可利用空间表中结点构成
3.1 结点构成
1 | 伙伴系统中可利用空间表中的结点构成如图 1 所示: |
3.2 构成
1 | header 域表示为头部结点,由 4 部分构成: |
3.3 代码表示
1 | typedef struct WORD_b{ |
3.4 伙伴系统的初始状态
1 | 在伙伴系统中,由于系统会不断地接受用户的内存申请的请求,所以会产生很多大小不同但是都是容量为 2m 的内存块, |
可利用空间表的代码表示为
1 | #define m 16//设定m的初始值 |
四 分配算法
4.1 说明
1 | 伙伴系统的分配算法很简单。假设用户向系统申请大小为 n 的存储空间, |
4.2 示例
1 | 例如,用户向系统申请一块大小为 7 个字的空间,而系统总的内存为 24 个字,则此时按照伙伴系统的分配算法得出: |
五 回收算法
5.1 说明
1 | 无论使用什么内存管理机制,在内存回收的问题上都会面临一个共同的问题: |
5.2 判断条件
1 | 判断一个存储块的伙伴的位置时,采用的方法为:如果该存储块的起始地址为 p,大小为 2k,则其伙伴所在的起始地址为: |
5.3 举例
1 | 例如,当大小为 28 ,起始地址为 512 的伙伴块的起始地址的计算方式为: |
六 总结
1 | 使用伙伴系统进行存储空间的管理过程中,在用户申请空间时,由于大小不同的空闲块处于不同的链表中, |
七 参考
- C语言中文网—伙伴系统管理动态内存