Linux内存-伙伴系统

Posted guoxianqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux内存-伙伴系统相关的知识,希望对你有一定的参考价值。

一、外部碎片

 

 

假设这是一段连续的页框,阴影部分表示已经被使用的页框,现在需要申请一个连续的5个页框。
这个时候,在这段内存上不能找到连续的5个空闲的页框,就会去另一段内存上去寻找5个连续的页框,这样子,久而久之就形成了页框的浪费。称为外部碎片

二、伙伴系统
Linux内核通过伙伴算法来管理物理内存。
伙伴系统(BuddySystem)在理论上是非常简单的内存分配算法。
它的用途主要是尽可能减少外部碎片,同时允许快速分配与回收物理页面。
伙伴系统的宗旨就是用最小的内存块来满足内核的对于内存的请求
 
三、伙伴算法分配原理
伙伴算法把内存所有的空闲页框分组为11个块链表,每个块链表分别包含大小为1、2、4、8、16、32、64、128、256、512和1024个连续页框的页框块。
最大可以申请1024个连续页框,也即4MB大小的连续空间。
 
假设要申请一个256个页框的块,
1、先从256个页框的链表中查找空闲块,如果有,则分配
2、如果没有,就去512个页框的链表中找,找到了即将页框分为两个256个页框的块,一个分配给应用,另外一个移到256个页框的链表中。
3、如果512个页框的链表中仍没有空闲块,继续向1024个页框的链表查找,如果仍然没有,则返回错误。
 
三、伙伴算法释放原理
内存的释放是分配的逆过程,也可以看作是伙伴的合并过程。
当释放一个块时,
1、先在其对应的链表中考查是否有伙伴存在,如果没有伙伴块,就直接把要释放的块挂入链表头
2、如果有,则从链表中摘下伙伴,合并成一个大块,
3、继续考察合并后的块在更大一级链表中是否有伙伴存在,直到不能合并或者已经合并到了最大的块。
 
四、查看各个连续页框的数量
# cat /proc/buddyinfo 
Node 0, zone      DMA      1      0      1      0      2      1      1      0      1      1      3 
Node 0, zone    DMA32    389    319    319    239    272    194    283    296    220      0      0 
Node 0, zone   Normal 428672 598338 153982  10634   1440    386    109     48     11      0      0 
Node 1, zone   Normal 778744 1170289 240097  16045   1986    251     35      2      0      0      0 

我们拿Normal区域进行分析,

第二列值,表示当前系统中normal区域,可用的连续两页的数量为598338
第三列值,表示当前系统中normal区域,可用的连续四页的数量为153982
 
五、优点和缺点
1、优点
  • 解决内存碎片问题
  • 避免把内存拆得太碎得同时,使内存的分配和释放过程迅速
 
2、缺点
  • 虽然解决了内存碎片问题,但是该算法中,一个很小的块往往会阻碍一个大块的合并。(一片内存中仅一个小的内存块没有释放,旁边两个大的就不能合并。)
  • 算法中有一定的浪费现象,伙伴算法是按2的幂次方大小进行分配内存块。
  • 另外拆分和合并涉及到 较多的链表和位图操作,开销还是比较大的。
 

以上是关于Linux内存-伙伴系统的主要内容,如果未能解决你的问题,请参考以下文章

Linux内存-伙伴系统

Linux内存分配机制——伙伴系统和SLAB

12 Linux的伙伴系统和SLAB分配器

Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段

linux内核源码分析之伙伴系统

Linux内存从0到1学习笔记(6.8,物理内存初始化之buddy伙伴系统)