linux内存页回收
Posted 为了维护世界和平_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux内存页回收相关的知识,希望对你有一定的参考价值。
目录
一、页回收概述
申请分配页的时候,页分配器首先尝试使用低水位线分配页。如果分配失败,说明内存轻微不足,页分配器将会唤醒内存节点的页回收内核线程,异步回收页,然后尝试使用最低水线分配页。如果使用最低水线分配失败,说明内存严重不足,页分配器将会直接回收页。
二、物理页根据是否有存储设备支持分为两类
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 快速路径调用函数源码分析 | 检查内存区域水线 | 判定节点回收 | 判定回收距离 | 回收分配页 )