Linux伙伴地址

Linux伙伴地址


伙伴地址定义:两个大小相同的相邻块合并成一个更大的块时,首地址必须是块(合成后的块)大小的整数倍。


例:

二进制地址为011011110000,大小为4(10进制)和16(10进制)块的伙伴地址的大小分别为多少?


解:

011011110000=0x6F0

1.4字节块

与0x6F0相邻的两个四字节块的首地址分别为0x6F4和0x6EC。

情况一:与前一个块合并,则合并后的块地址为0x6EC,块大小为8,0x6EC不是8的整数倍;

情况二:与后一个块合并,则合并后的块地址为0x6F0,块大小为8,0x6F0是8的整数倍。

综上,0x6F0的四字节伙伴地址为0x6F4。


1.16字节块

与0x6F0相邻的两个十六字节块的首地址分别为0x700和0x6E0。

情况一:与前一个块合并,则合并后的块地址为0x6E0,块大小为32,0x6EC是32的整数倍;

情况二:与后一个块合并,则合并后的块地址为0x700,块大小为32,0x700不是32的整数倍。

综上,0x6F0的十六字节伙伴地址为0x6E0。



伙伴算法:

    内核应该为分配一组连续的页框而建立一种健壮、高效的分配策略。为此,必须解决著名的内存,也就是所谓的外锁片问题(external fragmentation)。频繁的请求和释放不同大小的一组连续页框,必然导致在已分配的块内分散了许多小块的空闲页框。由此带来的问题时,即使有足够的空闲页框可以满足请求,但要分配一个大块的连续页框无法满足。
    从本质上来说,避免外碎片的方法有两种:
(1)利用分页单元把一组非连续的空闲页框映射到连续的线性地址空间;
(2)开发一中适当的技术来记录现存的空闲连续页框快的情况,以尽量满足对小块的请求而分割大的空闲块。
    Linux内核中引入了伙伴系统算法(buddy system)。把所有的空闲页框分组为11个块链表,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256,512和1024个连续页框的页框块。最大可以申请1024个连续页框,对应4MB大小的连续内存。每个页框块的第一个页框的物理地址是该块大小的整数倍。例如,大小为16个页框的块,其起始地址是16*2^12(2^12=4096)的整数倍。
    假设要申请一个256个页框的块,先从256个页框的链表中查找空闲块,如果没有,就去512个页框的链表中找,找到了则将页框块分为2个256个页框的块,一个分配给应用,另外一个移到256个页框的链表中。如果512个页框的链表中仍没有空闲块,继续向1024个页框的链表查找。如果1024块存在,则将其中的256页框作为请求返回,剩余的768分成256块和512块分别插到相应的链表中。如果仍然没有,则返回错误。
    页框块在释放时,会主动大小为相同的一个空闲伙伴块合成为2倍大小的单独块较大的页框块。两个块称为伙伴需要满足一下条件:
(1)两个块具有相同的大小
(2)它们的物理地址是连连续的。
(3)第一块的第一个页框的物理地址是2*b*2^12的倍数。



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值