Buddy System
linux伙伴算法解决的问题是频繁地请求和释放不同大小的一组连续页框,必然导致在已分配的页框块内分散了很多小块的空闲页面,导致程序运行到后面,无法分配出满足要求的大块连续页框。
为了避免这种情况,linux引入了伙伴系统算法,它把所有的空闲页框分为11个块链表,每个块链表分别包含大小为2^0、2^1、2^2……2^10,即1、2、4、……、1024个连续页框的页框块,每块能申请最大的1024个页框对应4M大小的连续内存。另外伙伴算法每次只能分配2的幂次页的空间,比如分配1页,2页,4页……1024页等。因此,伙伴算法最多能一次分配4M的内存空间。
比如申请一个256页框的块,那么会从256页框的链表中查找,如果没有就去512链表找,找到则把512分为2分256,一个分配出去,一个移到256链表中;相反,页框块在释放时,会主动将联系的页框块合并成一个较大的页框块。
本质上伙伴算法就是在做内存块的拆拆分分的工作
空闲内存信息我们可以通过cat /proc/buddyinfo获取
具体代码再行分析
CMA
随着系统的运行,伙伴算法对内存拆拆分分,势必会造成碎片化的现象,那如果对于一些需要大块连续物理内存的模块,比如camera、GPU等,岂不是没有办法使用了,所以又引入了CMA(Contiguous Memory Allocator),它是内存管理子系统中的一个模块,负责物理地址连续的内存分配,它的核心不是通过精巧的算法来管理地址连续的内存块,底层还是依赖伙伴系统算法,它只是预留了一块连续内存,没有驱动使用的时候,CMA区域可以分配给其他驱动使用,而当驱动需要分配CMA内存时,那些模块需要把内存还回来,供驱动使用。
后续具体分析下相关代码……