码迷,mamicode.com
首页 > 系统相关 > 详细

Linux内存-伙伴系统

时间:2020-11-10 10:34:50      阅读:12      评论:0      收藏:0      [点我收藏+]

标签:load   分组   最小   java   zone   一个   部分   链表   分表   

一、外部碎片

技术图片

 

 

假设这是一段连续的页框,阴影部分表示已经被使用的页框,现在需要申请一个连续的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内存-伙伴系统

标签:load   分组   最小   java   zone   一个   部分   链表   分表   

原文地址:https://www.cnblogs.com/guoxianqi2020/p/13948324.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!