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。
本文深入探讨了Linux内核中的alloc_pages和free_page函数,详细分析了连续物理内存分配及释放的过程。alloc_pages通过调用buffered_rmqueue实现高效内存分配,利用percpu高速缓存提升性能;free_page则负责释放内存,逆过程执行,确保内存资源的有效回收。
479

被折叠的 条评论
为什么被折叠?



