Chinaunix首页 | 论坛 | 博客
  • 博客访问: 765481
  • 博文数量: 370
  • 博客积分: 2334
  • 博客等级: 大尉
  • 技术积分: 3222
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-06 16:56
文章分类

全部博文(370)

文章存档

2013年(2)

2012年(368)

分类:

2012-05-18 11:38:26

如上图所示(标记为阴影的代表空闲块),此时系统将第4个单页表释放到伙伴系统.

首先,它会到相应大小的(2^0)的空闲链表入队.判断相邻块的空闲情况,此时,因为第三个是空闲的,所以可以合并为一块2^1的空闲块.继续判断2^1链中相邻块是否是空闲的,上图中可以将2^1的两个块合成一个大块,然后继续判断2^2中是否可以继续合并,依次类推.

上述代码中,涉及到几个位操作,分析如下:

1:得到相邻块的的起始page:

buddy1 = base + (page_idx ^ (1 << order))

如下图示:

 

根据上面的分析,可得知page_idx本身就是order位对齐的,所以,它的低order位为零.此外,再根据0与任何数异或值不变,1与数异或都相反的规律,我们可以得知,位运算结果只跟order+1位有关.据此就可以计算出它的“伙伴块”

2:得到高一级空闲链的首空闲块序号:

mask <<= 1;

page_idx &= mask;

只要按着高一级链表的order位对齐就行了

3:得到空闲块在高一级链表中对应的分配位图位

index >>= 1;

在前面分析过对应位的计算方法,在高一级空闲链中的位对应当前除二

其实这一个过程在操作系统设计中也叫“内存拼凑”,就是把剩余小内存,拼成连续的大内存,以满足某些程序的需要。

总结:

Linux采用页面为基本对应进行大内存的管理,其中26内核新加的pcp结构缓解了单页面频繁分配与释放对内存造成的压力。但是,内存分配与释放是很费时间的操作,特别是内存释放,要引发内存拼凑,因此,在编写程序的时候,尽量避免大内存的频繁操作。但仔细一想,linux内存管理还是有很多不如人意的地方:比如说释放内存的时候,效率十分低下,所以,很多公司在做嵌入式开发的时候,都自己修改了大页面的管理算法

 

阅读(313) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~