伙伴算法

伙伴算法在内存管理中用来消除外部碎片,伙伴系统基于一种相对简单然而令人吃惊的强大算法。它结合了优秀内存分配器的两个关键特征:速度和效率。

首先先来了解下linux内存管理的架构,用于了解伙伴算法所在的位置:

伙伴算法 - yangfan876@126 - yangfan876@126的博客
这张图的原型来自ULK p303,这张图能较直观的反映伙伴系统在内存管理中所处的位置。可以看出伙伴系统是处于不同域内进行管理的角色。

1.原理

Linux的伙伴算法把所有的空闲页面分为10个块组,每组中块的大小是2的幂次方个页面,例如,第0组中块的大小都为2(1个页面),第1组中块的大小为都为21(2个页面),第9组中块的大小都为29(512个页面)。也就是说,每一组中块的大小是相同的,且这同样大小的块形成一个链表。

我们通过一个简单的例子来说明该算法的工作原理。

假设要求分配的块其大小为128个页面(由多个页面组成的块我们就叫做页面块)。该算法先在块大小为128个页面的链表中查找,看是否有这样一个空闲块。如果有,就直接分配;如果没有,该算法会查找下一个更大的块,具体地说,就是在块大小为256个页面的链表中查找一个空闲块。如果存在这样的空闲块,内核就把这256个页面分为两等份,一份分配出去,另一份插入到块大小为128个页面的链表中。如果在块大小为256个页面的链表中也没有找到空闲页块,就继续找更大的块,即512个页面的块。如果存在这样的块,内核就从512个页面的块中分出128个页面满足请求,然后从384个页面中取出256个页面插入到块大小为256个页面的链表中。然后把剩余的128个页面插入到块大小为128个页面的链表中。如果512个页面的链表中还没有空闲块,该算法就放弃分配,并发出出错信号。

       以上过程的逆过程就是块的释放过程,这也是该算法名字的来由。满足以下条件的两个块称为伙伴:

·      两个块的大小相同

·      两个块的物理地址连续

伙伴算法把满足以上条件的两个块合并为一个块,该算法是迭代算法,如果合并后的块还可以跟相邻的块进行合并,那么该算法就继续合并。


2 .数据结构
那么先来介绍几个有关伙伴系统的一些数据结构,首先是zone数据结构,但是在zone中主要关心的是下面的这个结构体数组:
329 struct zone {
                         ..........
383                      struct free_area    free_area[MAX_ORDER];  
                         ..........
                 }
我们再次对 free_area_t 给予较详细的描述:

83 struct free_area { 84 struct list_head free_list[MIGRATE_TYPES]; 85 unsigned long nr_free; 86 };

其中free_list用来连接不用的页描述符,nr_free指定了当前区中空闲页的数目,free_list用于连接空闲页的链表。而在free_area数组中MAX_ORDER定义为11,其数组下标对应为该内存块的阶。可能叙述有点不清楚,还是用图来表述吧:
伙伴算法 - yangfan876@126 - yangfan876@126的博客
这张图来自《深入linux内核架构》可以清楚的看出在free_area数组中0阶对应的双向循环链表中的页都为单页,在2阶中对应的页都是四个页连在一起的页块。
下面详细叙述伙伴系统的工作原理:

    比如说我们要申请一个b阶大小的页块,那么系统会直接在b阶块中查找看这个链表是否为空,如果不为空则说明恰好有这么大的页可以用于分配。如果该链表为空,则会在b+1阶中寻找,如过b+1阶链表不为空,则将b+1中页块一分为二,一半用于分配,另一半加入b阶链表中。如果b+1阶链表也为空那么就继续向上寻找,如果都没找到空闲地址,就只能返回NULL。

上面的过程是分配空间的过程,在释放页的时候正好是分配的一个逆过程,内核会试图将两个b阶的页块合并程一个2b阶的大页块,如果可以合并就将这两个页块称为伙伴,满足伙伴的的要求如下:
1)两个块具有相同的大小,记作b。
2)它们的物理地址是连续的。
3) 第一块的第一个页的物理地址是2*b*PAGE_SIZE的倍数即第0块和第1块是伙伴,第2块和第3块是伙伴,但是第1块和第2块不是伙伴。这样规定的目的是确保一对伙伴中的两个块可以合并成更高级的大块。

这就是伙伴的工作原理以及在内存管理中的相关数据结构,后面会分析伙伴系统在分配页框函数中具体如何工作....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值