DAY47-内存水位管理和分配优先级

【欢迎关注微信公众号:qiubinwei-1986】

内存水位管理和分配优先级

zone水位划分

页面分配器是按照zone的水位来管理的。

zone的水位分成3个等级

  • 高水位WMARK_HIGH

  • 低水位WMARK_LOW

  • 最低警戒水位WMARK_MIN

分配请求与内存分配对应关系

最低境界水位下的内存是系统预留的内存,通常普通优先级的分配请求是不能访问这些内存的。但在特殊情况下可以应急分配。

页面分配器可以通过分配掩码gfp_mask的不同来访问最低警戒水位以下的内存,如__GFP_HIGH, __GFP_ATMOIC以及__GFP_MEMALLOC

zone水位管理流程概述

页面分配器的zone水位管理流程如下:

1)当zone的空闲内存大小高于高水位线时,zone的空闲页面比较充足,页面分配器处于快速路径上

2) 当zone空闲页面的水位达到了低水位时,若分配不成功,则进入慢速路径。页面分配器中的快速和慢速路径是以低水位线能否成功分配为分界线的。

3)在慢速路径上,首先会唤醒kswapd内核线程,异步扫描LRU链表和回收页面(kswapd一般一个numa节点会启一个线程)

4)若在慢速路径上分配失败,则会进行如下多种尝试

  • 使用最低警戒水位线来判断是否可以分配内存,根据分配优先级,会有如下几种策略

    a.对于普通优先级分配请求,不能访问最低警戒水位线的预留内存

    b.对于优先级为HIGH的分配请求,可以访问预留内存的1/2

    c.对于优先级为HARDER的分配请求,可以访问预留内存的5/8

    d.如果线程组中有线程在分配之前被终止了(oom), 则本次分配可以e.适当补偿,可访问预留内存的3/4

    f.若分配请求中设置了标志位__GFP_MEMALLOC或者进程设置了标志位PF_MEMALLOC, 则可访问全部预留内存

  • 启用直接页面回收机制

  • 尝试访问最低警戒水位以下的系统预留的内存

  • 启动直接内存规整机制

  • 启动OOM Killer机制

  • 多次尝试上述机制

5)若上述步骤都不能分配成功,则输出错误信息,返回NULL

6)随着kswapd内核线程不断回收内存,zone中的空闲内存会越来越多,当zone水位重新回到高水位之上,zone的水位平衡了,kswapd内核线程会停止工作,进入睡眠状态。

具体可以用下图表示

【欢迎关注微信公众号:qiubinwei-1986】

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值