linux内存页回收

Posted 为了维护世界和平_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux内存页回收相关的知识,希望对你有一定的参考价值。

目录

一、页回收概述

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

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

参考链接

https://course.0voice.com/v1/course/intro?courseId=2&agentId=0


以上是关于linux内存页回收的主要内容,如果未能解决你的问题,请参考以下文章

Linux 内核 内存管理物理分配页 ⑥ ( get_page_from_freelist 快速路径调用函数源码分析 | 检查内存区域水线 | 判定节点回收 | 判定回收距离 | 回收分配页 )

linux内存页回收

(转)linux内存源码分析 - 内存回收(整体流程)

linux内存回收 内核参数

linux内存回收 内核参数

linux kernel内存回收机制