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

版权声明:本文为博主原创文章,未经博主允许不得转载。 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步骤了。

猜你喜欢

转载自blog.csdn.net/rikeyone/article/details/85037297
今日推荐