Linux学习-内存管理篇(六)-内存回收(lru链表)

2018-12-31  本文已影响50人  Stan_Z
一、页面回收触发方式

Linux中页面回收主要是通过两种方式触发的:

二、哪些页框可以回收

而lru链表的作用本质上就是能够让系统在那些可以回收的页框当中,选择到理想的回收页框进行回收。

三、回收页的操作与分类

Linux进程的页分为如下几种:

内核对进程使用的页进行回收操作主要分两种:

四、通过lru链表如何回收

lru链表组织的页包括:可以存放到swap分区中的匿名页,映射了文件的文件页,以及被锁在内存中禁止换出的进程页。所有属于这些情况的页都必须加入到lru链表中,无一例外,而剩下那些没有加入到lru链表中的页,基本也就剩内核使用的页框了。

zone与页框关系

lru链表并不是一个系统中只有一个,而是每个zone有一个,那么下面针对一个zone来分析lru链表:

一个lru链表描述符中总共有5个双向链表头,它们分别描述五中不同类型的链表:

简单说,就是针对匿名页和文件页都拆分成一个活跃,一个不活跃的链表。禁止换出页单独一链。

那么lru链表进行的操作主要有以下几种:

当然这些操作并不是一个个执行的,因为存在激烈的锁竞争,所以内核提供了一个lru缓存的机制,它将一些需要相同处理的页集合起来,一个lru缓存的大小为14,当达到这个数量时再对它们进行一批次的处理。

上面的lru链表操作,除了最后一项移除操作外,其他四样操作除非在特殊情况下, 否则都需要依赖于lru缓存。

系统通过若干标志位来标记页的迁移状态,其中,PG_active/PG_referenced用于标识页面活跃度,前者标识页面时活跃的;后者表示页面最近是否被访问过,每访问一次便会置位。

内存页的状态迁移图

大概逻辑是:
页面通过lru批处理,转来转去,从活动链表转到非活动链表,从非活动链表靠前转到链尾,在内存回收时,非活动链表链尾的页被回收掉。

具体清理:
不管是kswapd还是直接页面回收,最终都调用shrink_slab和shrink_zone;

Shrink_zone原理:

1 通过shrink_active_list()将页面从active移到inactive list;

2 调用shrink_inactive_list()将inactive list的页放入临时链表,最终调用shrink_page_list()回收

最后介绍一下Swappiness:

Linux的内存回收(memory reclaim),可以从文件页、匿名页两种页面里回收,swapiness决定了回收这二类页面的优先级

swappiness越大,越倾向于回收匿名页;(倾向于积极的使用swap分区,并把内存上的数据及时的搬运到swap空间里面.100告诉内核,只要有可能,尽量将内存中不常访问的数据移动到swap中)

swappiness越小,越倾向于回收file-backed的页面。(更倾向于使用物理内存.0告诉内核尽可能不要将内存移到swap中)

当然,它们的回收方法都是一样的LRU算法。Swappiness默认值为60

上一篇下一篇

猜你喜欢

热点阅读