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. 分配多个页面时,从指定类型中分配,如果指定类型中没有足够的页面,从备用类型链表中分配。最后会试探保留类型链表。

  • 慢速(允许等待和页面回收)分配:

  1. 当上面两种分配方案都不能满足要求时,考虑页面回收、杀死进程等操作后在试。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值