动态存储器分配伙伴系统(buddy system)

伙伴系统是分离适配器的一个特例,其中每个大小类都是2的幂。
1>假设一个堆的大小为2^m个字
2>我们为每个块的大小2^k维护一个分离空闲链表,其中0<=k<=m。
3>请求块的大小向上舍入到最接近的2 的幂,最开始时,只有一个大小 为 2^m个字的块。
4>为了分配一个大小为2^k的块,我们找到一个可用的大小为2^j的块,其中k<=j<=m,如果j = k 我们就完成了。否则,我们递归的二分割这个块,知道j = k。当我们进行这样的分割的时候 ,每个剩下的半块(也叫做伙伴)被放置在相应的空闲链表中。
5>要释放一个大小为2^k的块我们继续合并空闲的伙伴。当我们遇到一个已分配的伙伴时,我们就停止合并。

伙伴系统的优点是给定地址和块的大小时,很容易计算出它的伙伴的地址。例如一个块大小为32字节 地址为
xxx…00000
它的伙伴的地址为
xxx…10000
一个块的地址和它的伙伴的地址只有一位不相同。
伙伴系统分配器的主要优点是快速搜索快速合并。
缺点:要求块的大小为2的幂可能导致显著的内碎片。不适合通用目的的工作负载。
(下面源自百度)
把所有的空闲页框分组为11个块链表,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256,512和1024个连续页框的页框块。最大可以申请1024个连续页框,对应4MB大小的连续内存。每个页框块的第一个页框的物理地址是该块大小的整数倍。

假设要申请一个256个页框的块,先从256个页框的链表中查找空闲块,如果没有,就去512个页框的链表中找,找到了则将页框块分为2个256个页框的块,一个分配给应用,另外一个移到256个页框的链表中。如果512个页框的链表中仍没有空闲块,继续向1024个页框的链表查找,如果仍然没有,则返回错误。

页框块在释放时,会主动将两个连续的页框块合并为一个较大的页框块。

发布了13 篇原创文章 · 获赞 6 · 访问量 9403

猜你喜欢

转载自blog.csdn.net/u010843408/article/details/45888991