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内存-伙伴系统的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段