深入浅出内存管理--对于lowmem_reserve的理解

2018年12月16日 15:12:35 rikeyone 阅读数:80更多
所属专栏: 深入浅出内存管理
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rikeyone/article/details/85037297

每个内存管理区(zone)都有一个lowmem_reserve字段,它代表本管理区预留的物理内存大小。所谓预留,那就是说肯定还是有用的,只是用的时机不同。

之前的文章中由介绍过water mark水位值,系统中已经为每个管理区(zone)内存大小设定了三个水位值了,分别时WMARK_HIGH/WMARK_LOW/WMARK_MIN。怎么这里又多出来一个lowmem_reserve?

在内存分配时,分配器会根据不同的水位执行不同的动作,首先内存分配器会扫描所有zonelist中的管理区,按照zonelist中的分配顺序依次检查管理区中能否分配对应的内存。这几个值都是用来确定最终要从哪个管理区来分配内存这个问题的。

1.首先以low water mark位标准来循环检测一遍,当发现zonelist中存在空闲内存在low water mark之上的管理区时,我们优先就从它开始分配。
2.如果发现所有管理区的内存都已经低于low water mark了,那么进一步利用min water mark来进行循环检测,寻找空闲内存在min water mark之上的管理区。
3.当我们发现所有的管理区的内存都已经低于min water mark了,那么此时系统的空闲内存真的时已经很少了,此时如果申请内存的上下文是一个不允许中断或者延迟的场景,那么才会动用我们最后的那一部分,也就是上面利用lowmem_reserve所保留的部分。此时不在检测水位值而再次去申请内存,假如在lowmem_reserve保留的部分依然申请不到,就返回NULL。
4.如果我们的申请内存的上下文发现可以允许延迟或者睡眠,那么当前申请内存的进程将被阻塞,开始进行直接内存回收,这是内核回收机制的一种方式,调用函数为try_to_free_pages。
5.回收操作返回后,又会进一步判断水位来进行申请,至于后续的处理,要看申请时传入的标志,来决定是否再次进行回收等操作,或者直接返回NULL,申请失败。
6.当然随着我们不停的检测,中间在第1步循环检测时就会触发系统的页面回收机制了,触发机制就是唤醒kswapd内核线程来对页框进行回收。当回收的页面能满足我们需求时,在第2步就会返回我们的需求了,我们的函数就不会运行到第3步骤了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值