关于Buddy(伙伴)算法的讨论

对伙伴系统种的位图的作用没有搞的清楚
就是说:系统在确定一个块的伙伴块是否是空闲时,是在空闲链表种查找有无
伙伴块呢还是利用位图种的状态来判断,
总觉得是和位图有关,可是位图中的一位表示一对伙伴块的状态
又觉得好象信息不太够用。
当位图中的一位为0,表示两块都空或都闲
当位图中的一位为1,表示有一块为忙
哪位大侠能详细谈谈位图的动作哪?
到底是怎么异或的?
 
位图的某位对应于两个伙伴块,为1就表示其中一块忙,为0表示两块都闲。
所谓异或,是指刚开始两块都闲为0,后来其中一块用了异或一下得1,后来另一块也用
了异或一下得0,后来前面一块回收了异或一下得1,后来另一块也回收了异或一下得0,
这样(如果为1就不合并)就又可以和前面一块合并成一大块了。
位图的主要用途是在回收算法中指示是否可以和伙伴块合并,分配时只要搜索空闲链表
就足够了。当然,分配的同时还要对相应位异或一下了,这是为回收算法服务。

讲的太好了,一下清楚了许多,谢谢了。
我对分配时相应的位异或这个地方还有点晕,就是说对位图的位异或时
是只对该大小队列的位图进行呢?还是所有10条中可能用到该块的都进行处理呢?
比如说:4页这个位置,如果是1页大小的块,其伙伴块是第5页,如果是2页大小的块时
其伙伴块是6,7页组成的,如果是4页大小的块时,其伙伴块是以0页大头的块
那么当第4页(一页大小)回收时(或释放时),其一页大小队列的位图肯定是处理了
那么其它大小的位图是否变化呢?比方说第二条队列位图的第2位是不是也要异或呀?
总感觉不太连冠似的

就拿你的例子来说明吧。
对于回收算法:
1. 当回收序号为4的1页块时,先找到order为0的area,把该页面块加入到该area的空闲
链表中,然后判断其伙伴块(序号为5的1页块)的状态,读该area(不是其它area! )
 的map的第2位( 4>>(1+order) ),假设伙伴块被占,则该位为0(回收4块前,4、5块
都忙),现异或一下得1,并不再向上合并。
2. 当回收序号为5的1页块时,同理,先找到order为0的area,把该页面块加入到该are
a的空闲链表中,然后判断其伙伴块(序号为4的1页块)的状态,读该area的map的第2位
( 5>>(1+order) ), 这时该位为1(4块已回收),现异或一下得0,并向上合并,把序
号为4的1页块和序号为5的1页块从该area的空闲链表中摘除,合并成序号为4的2页块,
并放到order为1的area的空闲链表中。同理,此时又要判断合并后的块的伙伴块(序号
为6的2页块)的状态,读该area( order为1的area,不是其它! ) 的map的第1位( 
4>>(1+order) ),假设伙伴块在此之前已被回收,则该位为1,现异或一下得0,并向上
合并,把序号为4的2页块和序号为6的2页块从order为1的area的空闲链表中摘除,合并
成序号为4的4页块,并放到order为2的area的空闲链表中。然后再判断其伙伴块状态,
如此反复。
本来还想再说一下分配算法的,发现已经这么多了,我想也应该能明白了。

多谢了,现在清楚了许多
看来:
1。通过异或后是否为0判断是否继续向上合并
2。初始状态位图为全0
3。每次无论分配还是回收,都只对相应大小的位图处理(在没有分裂或合并的情况)
而并不是同时处理全部10条队列的。

现在再来举例谈一谈分配算法。
假设在初始阶段,全是大小为2^9大小的块( MAX_ORDER为10),序号依次为0, 512, 1
024等等,并且所有area的map位都为0(实际上操作系统代码要占一部分空间,但这里只
是举例),现在要分配一个2^3大小的页面块,有以下动作:
1. 从order为3的area的空闲链表开始搜索,没找到就向高一级area搜索,依次类推,按
照假设条件,会一直搜索到order为9的area,找到了序号为0的2^9页块。
2. 把序号为0的2^9页块从order为9的area的空闲链表中摘除并对该area的第0位( 0>>
(1+9) )异或一下得1。
3. 把序号为0的2^9页块拆分成两个序号分别为0和256的2^8页块,前者放入order为8的
area的空闲链表中,并对该area的第0位( 0>>(1+8) )异或一下得1。
4. 把序号为256的2^8页块拆分成两个序号分别为256和384的2^7页块,前者放入order为
7的area的空闲链表中,并对该area的第1位( 256>>(1+7) )异或一下得1。
5. 把序号为384的2^7页块拆分成两个序号分别为384和448的2^6页块,前者放入order为
6的area的空闲链表中,并对该area的第3位( 384>>(1+6) )异或一下得1。
6. 把序号为448的2^6页块拆分成两个序号分别为448和480的2^5页块,前者放入order为
5的area的空闲链表中,并对该area的第7位( 448>>(1+5) )异或一下得1。
7. 把序号为480的2^5页块拆分成两个序号分别为480和496的2^4页块,前者放入order为
4的area的空闲链表中,并对该area的第15位( 480>>(1+4) )异或一下得1。
8. 把序号为496的2^4页块拆分成两个序号分别为496和504的2^3页块,前者放入order为
3的area的空闲链表中,并对该area的第31位( 496>>(1+3) )异或一下得1。
9. 序号为504的2^3页块就是所求的块。

如果有兴趣可以分配和回收一起演算举例,我就不再赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值