千家信息网

Linux分区页框分配器怎么使用

发表于:2024-11-17 作者:千家信息网编辑
千家信息网最后更新 2024年11月17日,这篇文章主要讲解了"Linux分区页框分配器怎么使用",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Linux分区页框分配器怎么使用"吧!分区页框分配器
千家信息网最后更新 2024年11月17日Linux分区页框分配器怎么使用

这篇文章主要讲解了"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
  1. __GFP_DMA:请求在ZONE_DMA区域中分配页面;
  2. __GFP_HIGHMEM:请求在ZONE_HIGHMEM区域中分配页面;
  3. __GFP_MOVABLE:ZONE_MOVALBE可用时在该区域分配页面,同时表示页面分配后可以在内存压缩时进行迁移,也能进行回收;
  4. __GFP_RECLAIMABLE:请求分配到可恢复页面;
  5. __GFP_HIGH:高优先级处理请求;
  6. __GFP_IO:请求在分配期间进行 I/O 操作;
  7. __GFP_FS:请求在分配期间进行文件系统调用;
  8. __GFP_ZERO:请求将分配的区域初始化为 0;
  9. __GFP_NOFAIL:不允许请求失败,会无限重试;
  10. __GFP_NORETRY:请求不重试内存分配请求;
  • alloc_flags
  1. ALLOC_WMARK_MIN:仅在最小水位water mark及以上限制页面分配;
  2. ALLOC_WMARK_LOW:仅在低水位water mark及以上限制页面分配;
  3. ALLOC_WMARK_HIGH:仅在高水位water mark及以上限制页面分配;
  4. ALLOC_HARDER:努力分配,一般在gfp_mask设置了__GFP_ATOMIC时会使用;
  5. ALLOC_HIGH:高优先级分配,一般在gfp_mask设置了__GFP_HIGH时使用;
  6. ALLOC_CPUSET:检查是否为正确的 cpuset;
  7. 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分配页面:如果上面没有分配到空间,调用下面函数慢速分配,允许等待和回收
......
}

在页面分配时,有两种路径可以选择,如果在快速路径中分配成功了,则直接返回分配的页面;快速路径分配失败则选择慢速路径来进行分配。总结如下:

  • 正常分配(或叫快速分配):
  1. 如果分配的是单个页面,考虑从per CPU缓存中分配空间,如果缓存中没有页面,从伙伴系统中提取页面做补充。

  2. 分配多个页面时,从指定类型中分配,如果指定类型中没有足够的页面,从备用类型链表中分配。最后会试探保留类型链表。

  • 慢速(允许等待和页面回收)分配:
当上面两种分配方案都不能满足要求时,考虑页面回收、杀死进程等操作后在试。

感谢各位的阅读,以上就是"Linux分区页框分配器怎么使用"的内容了,经过本文的学习后,相信大家对Linux分区页框分配器怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0