【欢迎关注微信公众号: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】