深入浅出内存管理--alloc_pages与free_page分析(框图)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rikeyone/article/details/85409092

alloc_pages

从前面文章的介绍来看,alloc_pages用于连续物理内存的分配,它的实现如下图所示:
从页分配器到伙伴系统
从这个流程图来分析,函数是一步一步调用到buffered_rmqueue的,alloc_pages是页分配器的对外接口,系统中很多模块和驱动可以直接调用它申请到内存,而buffered_rmqueue是底层伙伴系统算法的实现。它的流程图如下所示:
伙伴系统框架
这里框图介绍了buffered_rmqueue的实现,从它的命名可以看出,它是带有buffer功能的,为什么要这么操作呢,我们知道伙伴系统这一套算法是有一定复杂度的,如果每次申请都要执行算法扫描一下系统中的内存,那么将会比较耗时,所以加上per cpu高速缓存,当我们申请单个page时,优先从缓存中获取,这样就提升了效率,同时作为per cpu的缓冲,也将提升CPU效率,因为不用频繁进行cache的切换,提升cache命中的概率。

free_page

free page是释放page的接口,它的实现如下图:
伙伴系统

释放过程是申请的逆过程,当释放单个page时,优先释放给per cpu高速缓冲区管理,如果高速缓存内的内存大小超出一个设定值,那么高速缓存也会释放一部分给到伙伴系统,而伙伴系统通过循环执行__free_one_page来释放内存到对应的空闲free_area。

猜你喜欢

转载自blog.csdn.net/rikeyone/article/details/85409092
今日推荐