linux内存页回收

本文详细介绍了Linux内核中的页回收机制,包括页回收的概述、策略、原则和方法。讨论了匿名页和有存储设备支持的文件页的回收,以及LRU链表在页活动程度判断中的作用。同时,阐述了页交换的过程,如何使用磁盘或文件作为交换分区。此外,还涵盖了异步和直接回收两种方式。
摘要由CSDN通过智能技术生成

目录

一、页回收概述

二、物理页根据是否有存储设备支持分为两类

2.1 回收策略

2.2 回收原则

2.3 回收的方法

2.4 页的活动程度判断

2.5 反向映射

三、发起回收

3.1 异步回收

3.2 直接回收

四、页交换

1)磁盘作为交换分区

2)文件作为交换分区


一、页回收概述

        申请分配页的时候,页分配器首先尝试使用低水位线分配页。如果分配失败,说明内存轻微不足,页分配器将会唤醒内存节点的页回收内核线程异步回收页,然后尝试使用最低水线分配页。如果使用最低水线分配失败,说明内存严重不足,页分配器将会直接回收页

二、物理页根据是否有存储设备支持分为两类

1)交换支持的页(没有存储设备的支持)包括:1)匿名页;2)tmpfs文件系统的文件页;3)进程在修改私有的文件映射时复制生成的匿名页。

        交换支持的页回收策略:采用页交换的方法,先把页的数据写到交换区,然后释放物理页。

2)存储设备的支持的文件页:

2.1 回收策略

        1)如果是干净的页,即把文件从存储设备读到内存后没有修改,可以直接回收;

        2)如果是脏页:即把文件从存储设备读到内存后修改过,先回到存储设备,再释放物理页。

2.2 回收原则

        LRU(Least Recently Used,最近最少使用)选择最近最少使用的页。

2.3 回收的方法

        如果物理页被映射到虚拟地址空间(反向映射),需要从页表中删除虚拟页到物理页的映射。

        每个内存节点的pglist_data实例有一个成员lruvec,称为LRU向量,包含5条LRU链表。

不活动匿名页LRU,活动匿名页LRU,不活动文件页LRU,活动文件页LRU,不可回收LRU链表。

  • 每条LRU链表中的物理页按页访问时间从大到小排序;
  • 链表首部的物理页访问时间距离当前最近,尾部距离当前最长;
  • 物理页从LRU链表的首部加入,链表尾部回收;
  • 从活动LRU链表的尾部取物理页移动到不活动LRU链表中。

2.4 页的活动程度判断

  • 如果是页表映射的匿名页或文件页,根据页表项的访问标识,确定页的活动程度。
  • 如果没有页表映射的文件页,进程通过系统调用read或write访问文件。文件系统在文件的页缓存中查找文件页,为文件页的页描述符设置访问标识(PG_referenced)。

2.5 反向映射

        回收页表映射的匿名页或文件页时,需要从页表中删除映射,内核需要知道物理页被映射到那些进程的虚拟地址空间,需要实现物理页到虚拟页的反向映射。分为匿名页的反向映射和文件页的反向映射。

三、发起回收

3.1 异步回收

        每个内存节点有页回收线程,如果内存节点的所有内存区域的空闲页数小于高水位线,页回收线程就会反复尝试回收页,调用函数shrink_node以回收内存节点中的页。

3.2 直接回收

        针对备用区域列表中符合分配条件的每个内存区域,调用函数shrink_node来回收内存区域所属的内存节点中的页。回收页以内存节点为单位。

        1)计算需要扫描多少不活动匿名页,活动匿名页,不活动文件页和活动文件页;

        2)依次扫描四类LRU页

        3)如果是活动LRU链表,并且不活动的页比较少,那么调用shrink_active_list把一部分活动页加入到不活动页(收缩活动页列表)

        4)如果是不活动LRU链表,那么调用shrink_inactive_list回收不活动页。

四、页交换

        当内存不足的时候,把最近很少访问的没有存储设备支持的物理页的数据保存到交换区,释放内存空间,当交换区内存中存储的页访问的时候,再把数据从交换区读到内存中。

        交换分区可以是一个磁盘分区(机械硬盘、固态硬盘、NAND闪存),也可以是存储设备上的一个文件。

使用方法

1)磁盘作为交换分区

  • 使用fdisk命令创建磁盘分区 fdisk /dev/sda 
  • 使用命令mkswap格式化交换分区 mkswap /dev/sda1
  • 使用swapon启用交换分区 swapon /dev/sda1

2)文件作为交换分区

  • 使用dd创建文件 dd if=/dev/zero of=/root/swap bs=1M count=2048
  • 使用命令mkswap格式化交换分区 mkswap /dev/sda1
  • 使用swapon启用交换分区 swapon /dev/sda1

参考:
《深入理解linux内核》
《Linux内核深度解析》
《linux内核深度解析 (余华兵) 》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

为了维护世界和平_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值