Linux内存回收:LRU算法

        linux操作系统再内存不足时会使用Swap机制,将一些不经常使用的匿名内存页放到磁盘当中,等下次需要时再读取到内存当中,而这个LRU算法就是用来选择把哪些不常使用的匿名内存页放到磁盘当中的。

LRU(Least Recently Used) :最近最少使用。其原理就是:当内存不足时,淘汰系统中最少使用的内存,这样对系统性能的损耗是最小的。

为了实现LRU算法,内核维护了两个双向链表:active_list  inactive_list。下面介绍下这两个链表的作用:

  • active_list活跃内存页链表。也就是说进程会经常访问这个链表中的内存页,所以进行内存淘汰时,不应该淘汰这个链表中的内存页。
  • inactive_list不活跃内存页链表。也就是说进程很少会访问这个链表中的内存页,所以进行内存淘汰时,淘汰这个链表中的内存页。

这链表中每个节点还有一个数值“PG_referenced”,这个数值再第二次机会法中使用,给这个内存页第二次机会。

被访问时各个情况分析:

1、当某个进程申请一个匿名内存页时:

        内核会将这个内存页添加到active_list链表中,并将PG_referenced标志设置为0。

2、当某个再active_list链表的内存页被访问时:

        会将此内存页的PG_referenced值变为1.

3、当某个再inactive_list链表且PG_referenced为0内存页被访问时:

        会将此内存页的PG_referenced值变为1.

4、当某个处于inactive_list链表中,且PG_referenced为1的内存页被访问时:

        会将此链表移动到活跃链表,并且将PG_referenced置为0.

内存淘汰时,只能从inactive_list中进行淘汰,淘汰过程如下:

  • 从inactive_list 的尾部开始进行内存淘汰,如果内存页的 PG_referenced 标志位为 1 时,将跳过此内存页,并且将此内存页的 PG_referenced 标志位设置为 0。
  • 如果内存页的PG_referenced标志位为 0 时,那么将此内存页写入到磁盘当中,并且将所有与此内存页的映射解除绑定,然后释放此内存页。
  • 再淘汰的过程中active_list链表中的内存页也要进行衰退,扫描active_list链表,当其PG_referenced值为1时将其置为0,当值为0时,要将其从active_list链表移到inactive_list链表中。

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日上三杆快起床

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值