• 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


  • 相关阅读:
    Xiaojie雷达之路---拉伸信号处理
    bash简化if-else
    apk组成和Android的打包流程
    天猫店铺介绍,影响天猫店铺转让价格的六个因素
    练习题57:接口的语法特征
    c++编程实例
    CSDN每日一题学习训练——Java版(对给定的两个日期之间的日期进行遍历、子集 II、填充每个节点的下一个右侧节点指针)
    GP09|公司赚的多,股票涨的好?
    基于车联网的网络切片GBR动态专载触发方案
    智慧公厕管理系统:让公共厕所管理变得更高效。
  • 原文地址:https://blog.csdn.net/WANGYONGZIXUE/article/details/126082036