当前位置: 技术问答>linux和unix
linux伙伴buddy算法的一个疑问?
来源: 互联网 发布时间:2016-05-01
本文导语: 假如内存中只按照了1页面和2页面划分, 按照2页面划分时,是按照页面的顺序,0-1和2-3是一个Buddy、4-5和6-7是一个Buddy,还是是有可能是打乱的, 比如说 (1和2)与(5和7)组成了一个Buddy 如果是按照页面的顺序...
假如内存中只按照了1页面和2页面划分,
按照2页面划分时,是按照页面的顺序,0-1和2-3是一个Buddy、4-5和6-7是一个Buddy,还是是有可能是打乱的,
比如说 (1和2)与(5和7)组成了一个Buddy
如果是按照页面的顺序来组成Buddy,过了一段时间后0-1,6-7都分配了。2-3和4-5都只分配了2和5
3和4没分配。那如果系统现在请求分配两个页面大小的空间。但是现在没有两个页面是按照buddy连在一起(假设最大的buddy是两个页面),那系统会怎样去分配内存?? 请大家指教,先谢过了。
按照2页面划分时,是按照页面的顺序,0-1和2-3是一个Buddy、4-5和6-7是一个Buddy,还是是有可能是打乱的,
比如说 (1和2)与(5和7)组成了一个Buddy
如果是按照页面的顺序来组成Buddy,过了一段时间后0-1,6-7都分配了。2-3和4-5都只分配了2和5
3和4没分配。那如果系统现在请求分配两个页面大小的空间。但是现在没有两个页面是按照buddy连在一起(假设最大的buddy是两个页面),那系统会怎样去分配内存?? 请大家指教,先谢过了。
|
有一点是没有疑问的,即Buddy是按照页面顺序来组织的。
Buddy系统有两个很重要的作用:
(1) 分配连续页,这也决定了谁和谁是Buddy只能按顺序来组织;
(2) 碎片问题:Buddy能很好的处理碎片问题,但并不能完全解决,你举的例子如果不考虑PFRA的话,内核分配器只能报OOM,不过即便有PFRA进行页面的回收,OOM也不可能完全解决,庆幸的是,实际系统一般不会出现OOM这么糟糕的情况。
Buddy系统有两个很重要的作用:
(1) 分配连续页,这也决定了谁和谁是Buddy只能按顺序来组织;
(2) 碎片问题:Buddy能很好的处理碎片问题,但并不能完全解决,你举的例子如果不考虑PFRA的话,内核分配器只能报OOM,不过即便有PFRA进行页面的回收,OOM也不可能完全解决,庆幸的是,实际系统一般不会出现OOM这么糟糕的情况。
|
看不是很懂你的问题,
你可以参看
Understanding the Linux Kernel的 “8.1.7. The Buddy System Algorithm”
你可以参看
Understanding the Linux Kernel的 “8.1.7. The Buddy System Algorithm”
|
系统在设计buddy算法的时候,采用了1/2/4/8/16这种递进关系的页面管理,也就是说有若干个4K的页面分成一组,有若干个16*4K页内存大小的页面入在一组,以此类推,假定你需要申请8K的连续物理内存,那么系统就在所有以8K页面连续的那个组当中找一个没有使用的页面给你,但有可能所有8K的页面全部被使用了,那怎么办呢?就直接在16K所在的组内找一个,若还没有,就等到找到最后的最大的那一个为止,当然也有可能找遍了所有的组,依然没有找到,这个时候就采用两种策略,一种是等待系统有空闲的为止,另一种就直接返回失败(kmalloc不是有很多参数吗?有一种参数就是不等待直接返回失败,主要由于中断上下文当中)
那么系统如何保证内存回收的呢?也就是当某个时候系统只留有4K连续内存的页的时候,怎么办?你要相信,只要你系统对内存的使用量不超过物理内存加上swap空间的总和,总会有内存释放的时候,一旦内存释放,系统就会把释放的那个页与它相领的页连接起来,假定你的内存全是页1,页3,页5.....,被使用,而页2,页4,页6......是空闲的,当你释放页3时,那么页3与页2就形成了一个2K的页,就把这个合并后的页放入8K内存管理的队列中,以此类推,LZ所说的那种情况是很难出现的,就算出现了也会被自动解决的(要么返回失败,要么等待)
最后再说一说内存切割的问题,也即是分配的问题,假定系统中在某个时候只留有32K连续的物理空闲页,现在系统需要一个连续8K的页,那么系统就会进行切割,从32K的页中切割一个8K出来,然后把余下的24K页再分成8K与16K,从而归入两个页面管理队列中...........
那么系统如何保证内存回收的呢?也就是当某个时候系统只留有4K连续内存的页的时候,怎么办?你要相信,只要你系统对内存的使用量不超过物理内存加上swap空间的总和,总会有内存释放的时候,一旦内存释放,系统就会把释放的那个页与它相领的页连接起来,假定你的内存全是页1,页3,页5.....,被使用,而页2,页4,页6......是空闲的,当你释放页3时,那么页3与页2就形成了一个2K的页,就把这个合并后的页放入8K内存管理的队列中,以此类推,LZ所说的那种情况是很难出现的,就算出现了也会被自动解决的(要么返回失败,要么等待)
最后再说一说内存切割的问题,也即是分配的问题,假定系统中在某个时候只留有32K连续的物理空闲页,现在系统需要一个连续8K的页,那么系统就会进行切割,从32K的页中切割一个8K出来,然后把余下的24K页再分成8K与16K,从而归入两个页面管理队列中...........