这篇文章主要讲解了“Linux分区页框分配器怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux分区页框分配器怎么使用”吧!
分区页框分配器
页框分配在内核里的机制我们叫做分区页框分配器(zoned page frame allocator),在linux系统中,分区页框分配器管理着所有物理内存,无论你是内核还是进程,都需要请求分区页框分配器,这时才会分配给你应该获得的物理内存页框。当你所拥有的页框不再使用时,你必须释放这些页框,让这些页框回到管理区页框分配器当中。
有时候目标管理区不一定有足够的页框去满足分配,这时候系统会从另外两个管理区中获取要求的页框,但这是按照一定规则去执行的,如下:
-
如果要求从DMA区中获取,就只能从ZONE_DMA区中获取。 -
如果没有规定从哪个区获取,就按照顺序从 ZONE_NORMAL -> ZONE_DMA 获取。 -
如果规定从HIGHMEM区获取,就按照顺序从 ZONE_HIGHMEM -> ZONE_NORMAL -> ZONE_DMA 获取。
其函数接口
内核中根据不同的分配需求有6个函数接口来请求页框,最终都会调用到__alloc_pages_nodemask。
可以看页框分配器的核心函数是__alloc_pages_nodemask,在讲这个函数之前我们先看下两个标志:
-
gfp_mask
-
__GFP_DMA:请求在ZONE_DMA区域中分配页面; -
__GFP_HIGHMEM:请求在ZONE_HIGHMEM区域中分配页面; -
__GFP_MOVABLE:ZONE_MOVALBE可用时在该区域分配页面,同时表示页面分配后可以在内存压缩时进行迁移,也能进行回收; -
__GFP_RECLAIMABLE:请求分配到可恢复页面; -
__GFP_HIGH:高优先级处理请求; -
__GFP_IO:请求在分配期间进行 I/O 操作; -
__GFP_FS:请求在分配期间进行文件系统调用; -
__GFP_ZERO:请求将分配的区域初始化为 0; -
__GFP_NOFAIL:不允许请求失败,会无限重试; -
__GFP_NORETRY:请求不重试内存分配请求;
-
alloc_flags
-
ALLOC_WMARK_MIN:仅在最小水位water mark及以上限制页面分配; -
ALLOC_WMARK_LOW:仅在低水位water mark及以上限制页面分配; -
ALLOC_WMARK_HIGH:仅在高水位water mark及以上限制页面分配; -
ALLOC_HARDER:努力分配,一般在gfp_mask设置了__GFP_ATOMIC时会使用; -
ALLOC_HIGH:高优先级分配,一般在gfp_mask设置了__GFP_HIGH时使用; -
ALLOC_CPUSET:检查是否为正确的 cpuset; -
ALLOC_CMA:允许从 CMA 区域进行分配;
__alloc_pages_nodemask
struct page *
__alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, int preferred_nid,
nodemask_t *nodemask)
{
page = get_page_from_freelist(alloc_mask, order, alloc_flags, &ac);//fastpath分配页面:从pcp(per_cpu_pages)和伙伴系统中正常的分配内存空间
......
page = __alloc_pages_slowpath(alloc_mask, order, &ac);//slowpath分配页面:如果上面没有分配到空间,调用下面函数慢速分配,允许等待和回收
......
}
在页面分配时,有两种路径可以选择,如果在快速路径中分配成功了,则直接返回分配的页面;快速路径分配失败则选择慢速路径来进行分配。总结如下:
-
正常分配(或叫快速分配):
-
如果分配的是单个页面,考虑从per CPU缓存中分配空间,如果缓存中没有页面,从伙伴系统中提取页面做补充。
-
分配多个页面时,从指定类型中分配,如果指定类型中没有足够的页面,从备用类型链表中分配。最后会试探保留类型链表。
-
慢速(允许等待和页面回收)分配:
感谢各位的阅读,以上就是“Linux分区页框分配器怎么使用”的内容了,经过本文的学习后,相信大家对Linux分区页框分配器怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
原创文章,作者:506227337,如若转载,请注明出处:https://blog.ytso.com/223373.html