页回收机制

申请分配物理页的时候,页分配器首先尝试使用低水线分配页;如果使用低水线分配失败,说明内存轻微不足,页分配器将会唤醒内存节点的页回收内核线程,异步回收页,然后尝试使用最低水线分配页;如果使用最低水线分配失败,说明内存严重不足,页分配器将会直接回收页
针对不同的物理页,采用不同的回收策略;物理页根据是否有存储设备支持分为两类:
1)可以被交换的页:没有存储设备支持的物理页,包括匿名页,以及tmpfs文件系统(内存中的文件系统)的文件页和进程在修改私有的文件映射时复制生成的匿名页;
2)存储设备支持的文件页;

针对不同的物理页,采用不同的回收策略;
1)可以被交换的页:采用页交换的方法,先把页的数据写到交换区,然后释放物理页;
2)存储设备支持的文件页;

针对不同得物理页,采用不同得回收策略:
1)可以被交换的页:采用页交换的方法,先把页的数据写到交换区,然后释放物理页;
2)存储设备支持的文件页:如果是干净的页,即把文件从存储设备读到内存以后没有修改过,可以直接释放页;如果是脏页,即把文件从存储设备读到后修改过,那么先写回到存储设备,然后释放物理页;
页回收算法还会回收slab缓存;使用专用slab缓存的内核模块可以使用函数register_shrinker注册收缩器,页回收算法调用所有收缩器的函数以释放对象;

**根据什么原则选择待回收的物理页?**内核使用LRU(Least Recently Used,最近最少使用)算法选择最近最少使用的物理页,来进行回收;
回收物理页的时候,如果物理页被映射到进程的虚拟地址空间,那么需要从页表中删除虚拟页到物理页的映射;怎么知道物理页被映射到哪些虚拟页?需要通过反向映射的数据结构,虚拟页映射到物理页是正向映射,物理页映射到虚拟页是反向映射;

数据结构

LRU链表

页回收算法使用LRU算法选择待回收的物理页;如下图所示,每个内存节点的pglist_data实例有一个成员lruvec,成为LRU向量;


enum lru_list {
	LRU_INACTIVE_ANON = LRU_BASE,
	LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE,
	LRU_INACTIVE_FILE = LRU_BASE + LRU_FILE,
	LRU_ACTIVE_FILE = LRU_BASE + LRU_FILE + LRU_ACTIVE,
	LRU_UNEVICTABLE,
	NR_LRU_LISTS
};

struct lruvec {
	struct list_head		lists[NR_LRU_LISTS];
	struct zone_reclaim_stat	reclaim_stat;
	/* Evictions & activations on the inactive file list */
	atomic_long_t			inactive_age;
	/* Refaults at the time of last reclaim cycle */
	unsigned long			refaults;
#ifdef CONFIG_MEMCG
	struct pglist_data *pgdat;
#endif
};

typedef struct pglist_data {
	struct zone node_zones[MAX_NR_ZONES];
	struct zonelist node_zonelists[MAX_ZONELISTS];
	int nr_zones;
#ifdef CONFIG_FLAT_NODE_MEM_MAP	/* means !SPARSEMEM */
	struct page *node_mem_map;
    ......
    /* Fields commonly accessed by the page reclaim scanner */
	struct lruvec		lruvec;
    ......
}

LRU向量包含5条LRU链表;

  • 不活动匿名页LRU链表,用来链接不活动的匿名页,即最近访问频率低的匿名页;
  • 活动匿名页LRU链表,用来链接活动的匿名页,即最近访问频率高的匿名页;
  • 不活动文件页LRU链表,用来链接不活动的文件页,即最近访问频率低的文件页;
  • 活动文件页LRU链表,用来链接活动的文件页,即最近访问频率高的文件页;
  • 不可回收LRU链表,用来链接使用mlock锁定在内存中、不允许回收的物理页;

在LRU链表中,物理页的页描述符(struct page)的flags成员会被设置如下:

  • flags被设置PG_lru标志位,表示物理页在LRU链表中;
  • 页描述符通过lru成员加入到LRU链表;
  • 如果是可以被交换的物理页,flags会被设置PG_swapbacked标志位;
  • 如果是活动的物理页,flags会被设置PG_active标志位;
  • 如果是不可回收的物理页,flags会被设置PG_unevictable标志位;

每条LRU链表中的物理页按访问时间从小到大排序,链表头节点的物理页的访问时间离当前最近,物理页从LRU链表的头部插入;页回收算法从不活动LRU链表的尾部取物理页进行回收,从活动LRU链表的尾部取物理页并移动到不活动LRU链表中;
image.png

如何确定页的活动程度?

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

反向映射

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

页描述符中和反向映射相关的成员如下:

struct page {
    ...
	union {
		struct address_space *mapping;	/* If low bit clear, points to
						 * inode address_space, or NULL.
						 * If page mapped as anonymous
						 * memory, low bit is set, and
						 * it points to anon_vma object:
						 * see PAGE_MAPPING_ANON below.
						 */
        ...
	};
	/* Second double word */
	union {
		pgoff_t index;		/* Our offset within mapping. */
        ...
	};
	union {
        ...
		struct {

			union {
				/*
				 * Count of ptes mapped in mms, to show when
				 * page is mapped & limit reverse map searches.
				 *
				 * Extra information about page type may be
				 * stored here for pages that are never mapped,
				 * in which case the value MUST BE <= -2.
				 * See page-flags.h for more details.
				 */
				atomic_t _mapcount;

                ...
			};
            ...
		};
	};
    ...
};

mapping,最低两位用来作用页映射标志,PAGE_MAPPING_ANON表示匿名页;
index,是在映射里面的偏移,单位是页;如果是匿名映射,那么index是物理页对应的虚拟页在虚拟内存中的页偏移;如果是文件映射,那么index是物理页存储的数据在文件页中的页偏移;
mapcount,映射计数,反映物理页物理页被映射到多少个虚拟内存区域;初始值是-1,加上1以后才是真实的映射计数;
本文中只介绍匿名页的反向映射;文件页的反向映射请查阅相关书籍;

匿名页的反向映射

匿名页的反向映射的数据结构如下图:
image.png
1)struct page的成员mapping指向一个anon_vma实例,并设置了PAGE_MAPPING_ANON标志位;
2)struct anon_vma用来组织匿名页被映射到的所有虚拟内存区域;
3)anon_vma_chain用来关联anon_vma实例和vm_area_struct实例;
4)一个匿名页可能被映射到多个虚拟内存区域,比如fork子进程;anon_vma实例通过中介anon_vma_chain把所有vm_area_struct实例和anon_vma实例加入到链表中,关联起来;

页回收过程

如下图所示,申请分配页的时候,页分配器首先尝试使用低水线分配页;如果使用低水线分配失败,说明内存轻微不足,页分配器将会唤醒所有符合分配条件的内存节点的页回收线程,异步回收页,然后尝试使用最低水线分配页;如果分配失败,说明内存严重不足,页分配器将会直接回收页;如果直接回收页失败,那么判断是否应该重新尝试页回收;
image.png
异步回收页和直接回收页,最后都是调用函数shrink_node来回收内存节点的页;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/537651.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字图像处理系列 | 像素处理 (1)

文章目录 1. 图片的公式定义2. 像素处理图片示例变暗变亮颜色反转低对比度高对比度三通道的彩色图变灰色 1. 图片的公式定义 下面的图片是一个灰度图&#xff0c;这张图片只有一个通道&#xff0c;每一点&#xff0c;都是这个地方的亮度 f(x,y) 就是 (x,y) 这点的亮度值 如果…

【进阶篇】二、实现Java Agent的静态加载和动态加载

文章目录 1、Java Agent2、两种加载模式静态加载模式动态加载模式 3、静态加载模式实现4、动态加载的实现 1、Java Agent 通过Java Agent&#xff0c;生成一种特殊的jar包&#xff08;一种工具&#xff09;&#xff0c;业务程序可以主动去调用jar包里的方法。比如下面这个有打…

C++设计模式|创建型 1.单例模式

1.什么是单例模式&#xff1f; 单例模式的的核⼼思想在创建类对象的时候保证⼀个类只有⼀个实例&#xff0c;并提供⼀个全局访问点来访问这个实例。 只有⼀个实例的意思是&#xff0c;在整个应⽤程序中&#xff0c;只存在该类的⼀个实例对象&#xff0c;⽽不是创建多个相同类…

WPS二次开发系列:Gradle版本、AGP插件与Java版本的对应关系

背景 最近有体验SDK的同学反馈接入SDK出现报错&#xff0c;最终定位到原因为接入的宿主app项目的gradle版本过低导致&#xff0c;SDK兼容支持了android11的特性&#xff0c;需要对应的gradle插件为支持android11的版本。 现象 解决方案 将gradle版本升级至支持android11的插件版…

openGauss_5.0.1 企业版安装及问题记录(CentOS系统):主备模式服务器安装

目录 &#x1f4da;第一章 官方地址&#x1f4d7;安装包下载地址&#x1f4d7;文档指南 &#x1f4da;第二章 安装&#x1f4d7;准备工作&#x1f4d7;开始安装&#x1f4d5;创建XML配置文件&#x1f4d5;初始化安装环境&#x1f4d5;执行安装&#x1f4d5;验证 &#x1f4da;第…

volta(轻松切换管理Node.js版本)

Node.js版本管理 Volta提供了一个简单直观的命令行界面&#xff0c;可以轻松地安装、卸载、更新和切换Node.js版本。 Volta 既可以全局使用&#xff0c;也可以在项目级别使用&#xff0c;可以为每个项目单独设置node版本&#xff0c;nvm不行。 下载安装Volta 参考&#xff1a; …

vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅲ)列表项及分页器配置及props配置

vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅰ&#xff09;配置项文档 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅱ&#xff09;搜索及数据获取配…

基于SpringBoot的冬奥会科普平台

基于SpringBoot的冬奥会科普平台系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发…

pip install opencv-python出现ModuleNotFoundError: No module named ‘skbuild‘错误解决方案

问题描述 File “”, line 1, in File “/tmp/pip-build-o148qsmj/opencv-python/setup.py”, line 10, in from skbuild import cmaker, setup ModuleNotFoundError: No module named ‘skbuild’ Command “python setup.py egg_info” failed with error code 1 in /tmp…

Java入门-数组

数组 什么是数组 数组( array )是一种最简单的复合数据类型&#xff0c;它是有序数据的集合&#xff0c;数组中的每个元素具有相同的数据类型&#xff0c;可以用一个统一的数组名和不同的下标来确定数组中唯一的元素。 数组的内存结构是分配一系列内存大小相等的连续空间。 …

Vue 引入config.js后别的js访问不到window对象下的属性

Vue项目里,我们项目配置的请求服务器地址都是在public里config.js里,如下例: 然后在index.html里引入config.js,如下图: 这里要注意的是,script的src要写上<%= BASE_URL %>,代码如下: <!DOCTYPE html> <html><head><meta charset="…

SNRO 编号范围对象管控,唯一ID

事务代码:SNRO 代码引用: DATA: MAXTID TYPE I,NEWNO TYPE CHAR8. CALL FUNCTION NUMBER_RANGE_ENQUEUE EXPORTING OBJECT ZQC57 EXCEPTIONS FOREIGN_LOCK 1 OBJECT_NOT_FOUND 2 SYSTEM_FAILURE 3 OTHERS …

Python3.7编程之病毒

基础篇 什么是病毒 病毒&#xff0c;指的是一些通过非法手段获取系统的一些权限&#xff0c;然后进行破坏或者盗取。 病毒分为两类&#xff1a; 1、破坏型 这类病毒往往会将系统弄的乱七八糟&#xff0c;比如把你的U盘删光&#xff0c;把你的系统背景调成黑客图片&#xff0c…

NoETL 公开课预告|下周二,第三代指标平台即将展露真容

100% 统一指标口径、100% 自动化指标开发、100% 灵活指标分析、强大的指标定义能力和查询加速性能、“管、研、用”一体、做“轻”数仓…… 很多小伙伴都非常好奇 buff 叠满的第三代指标平台 Aloudata CAN 到底长什么样。接下来我们安排了 7 期开箱直播&#xff0c;结合企业业…

Flutter学习13 - Widget

1、Flutter中常用 Widget 2、StatelessWidget 和 StateFulWidget Flutter 中的 widget 有很多&#xff0c;但主要分两种&#xff1a; StatelessWidget无状态的 widget如果一个 widget 是最终的或不可变的&#xff0c;那么它就是无状态的StatefulWidget有状态的 widget如果一个…

腾讯云向量数据库-RAG介绍

1.说明 RAG结合LLM(通用大预言模型)构件基于私有文档、专业领域知识、实时信息的charbot。 2.RAG的主要步骤 知识切片成chunk向量化chunk入库query检索知识chunk构件prompts调用llm生成回答 3.优势 快速构件demo快速理解rag社区支持 4.痛点 投入大效果差调优难 5.RAG应…

MURF1640CT-ASEMI快恢复二极管MURF1640CT

编辑&#xff1a;ll MURF1640CT-ASEMI快恢复二极管MURF1640CT 型号&#xff1a;MURF1640CT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;16A 最大循环峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;4…

【Java】JDK1.8 HashMap源码,put源码详细讲解

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 在Java中&#xff0c;HashMap结构是被经常使用的&#xff0c;在面试当中也是经常会被问到的。这篇文章我给大家分享一下我对于HashMap结构源码的理解。 HashMap的存储与一般的数组不同&#xff0c;HashMap的每一个元素存…

SQLite从出生到现在(发布历史记录)(二十二)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;从 SQLite 3.5.9 迁移到 3.6.0&#xff08;二十一&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 引言&#xff1a; SQLite拥有别人无法比拟的装机量&#xff0c;究竟什么成就了SQLite呢&#xff0c;本…

WPS制作表格热图

最近看到一篇文献使用了表格热图&#xff0c;于是想着用wps制作一个类似的。表格热图可以使表格中的数字大小变得更加直观。 参考文献原文&#xff1a;Miller, O.L., Helman, D., Tal Svoray, Morin, E., Bonfil, D.J., 2019. Explicit wheat production model adjusted for s…