前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux分区页框分配器

Linux分区页框分配器

作者头像
刘盼
发布2020-07-14 15:51:43
1.4K0
发布2020-07-14 15:51:43
举报
文章被收录于专栏:人人都是极客人人都是极客

我们现在知道物理内存是以页框为最小单位存在的,那么内核中分配页框的方法是什么呢?

分区页框分配器

页框分配在内核里的机制我们叫做分区页框分配器(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

代码语言:javascript
复制
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. 分配多个页面时,从指定类型中分配,如果指定类型中没有足够的页面,从备用类型链表中分配。最后会试探保留类型链表。
  • 慢速(允许等待和页面回收)分配:
  1. 当上面两种分配方案都不能满足要求时,考虑页面回收、杀死进程等操作后在试。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 人人都是极客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分区页框分配器
  • 其函数接口
  • __alloc_pages_nodemask
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档