linux内存回收机制

无论计算机上有多少内存都是不够的,因而linux kernel需要回收一些很少使用的内存页面来保证系统持续有内存使用。页面回收的方式有页回写、页交换和页丢弃三种方式:如果一个很少使用的页的后备存储器是一个块设备(例如文件映射),则可以将内存直接同步到块设备,腾出的页面可以被重用;如果页面没有后备存储器,则可以交换到特定swap分区,再次被访问时再交换回内存;如果页面的后备存储器是一个文件,但文件内容在内存不能被修改(例如可执行文件),那么在当前不需要的情况下可直接丢弃。

 

1 回收的时机

2 哪些内存可以回收

2.1 页框的回收

LRU(Least Recently Used),近期最少使用链表,是按照近期的使用情况排列的,最少使用的存在链表末尾,通过以下宏定义即可看出:

#define lru_to_page(_head) (list_entry((_head)->prev, struct page, lru))

每个zone有5个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

};

其中INACTIVE_ANON、ACTIVE_ANON、INACTIVE_FILE、ACTIVE_FILE 4个链表中的页面是可以回收的。ANON代表匿名映射,没有后备存储器;FILE代表文件映射。

页面回收时,会优先回收INACTIVE的页面,只有当INACTIVE页面很少时,才会考虑回收ACTIVE页面。

为了评估页的活动程度,kernel引入了PG_referend和PG_active两个标志位。为什么需要两个位呢?假定只使用一个PG_active来标识页是否活动,在页被访问时,设置该位,但是何时清楚呢?为此需要维护大量的内核定时器,这种方法注定是要失败的。

使用两个标志,可以实现一种更精巧的方法,其核心思想是:一个表示当前活动程度,一个表示最近是否被引用过,下图说明了基本算法。

 

基本上有以下步骤:

(1)如果页是活动的,设置PG_active位,并保存在ACTIVE LRU链表;反之在INACTIVE;

(2)每次访问页时,设置PG_referenced位,负责该工作的是mark_page_accessed函数;

(3)PG_referenced以及由逆向映射提供的信息用来确定页面活动程度,每次清除该位时,都会检测页面活动程度,page_referenced函数实现了该行为;

(4)再次进入mark_page_accessed。如果发现PG_referenced已被置位,意味着page_referenced没有执行检查,因而对于mark_page_accessed的调用比page_referenced更频繁,这意味着页面经常被访问。如果该页位于INACTIVE链表,将其移动到ACTIVE,此外还会设置PG_active标志位,清除PG_referenced;

(5)反向的转移也是有可能的,在页面活动程度减少时,可能连续调用两次page_referenced而中间没有mark_page_accessed。

如果对内存页的访问是稳定的,那么对page_referenced和mark_page_accessed的调用在本质上是均衡的,因而页面保持在当前LRU链表。这种方案同时确保了内存页不会再ACTIVE与INACTIVE链表间快速跳跃。

2.2 slab缓存回收

slab缓存回收相对比较灵活,所有注册到shrinker_list中的方法都会被执行。

内核默认针对每个文件系统都注册了prune_super方法,这个函数用来回收文件系统中不再使用的dentry和inode缓存;

android的lowmemorykiller机制注册了选择性杀死进程的方法,回收进程使用的内存。

3怎样回收页框

其中shrink_page_list是真正回收页面的过程

 

4周期性回收的频率

4.1 kswapd

kswapd是内核为每个内存node创建的内存回收线程,为什么有了紧缺回收机制还需要周期性回收呢?因为有些内存分配是不允许阻塞等待回收的,比如中断和异常处理程序中的内存分配;还有些内存分配不允许激活I/O访问的。只有少数情况的内存紧缺可以完整执行回收过程,所以利用系统空闲时间回收内存非常必要。

该函数记录了上一次均衡操作时所用的分配order,如果kswapd_max_order大于上一次的值,或者classzone_idx小于上一次的值,则调用balance_pgdat再次均衡该内存域,否则可以进行短暂休眠,休眠的时间是HZ/10,对于arm(HZ=100)来说,休眠的时间就是1ms。

balance_pgdat均衡操作直到该内存域的zone_wartermark_ok为止。

4.2 cache_reap

cache_reap用来回收slab中的空闲对象,如果空闲对象可以还原成一个页面,则释放回buddy system。每次调用cache_reap会把所有的slab_caches遍历一遍,之后休眠2*HZ,对于arm(HZ=100)来说,周期就是20ms。

5 参考文献

(1)《understanding the linux kernel》

(2)《professional linux kernel architecture》

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编译源码 JAVA out of memory

转载于:https://www.cnblogs.com/dyufei/p/6612032.html

安卓 Input Events(输入事件)

在安卓中,有不止一种方法从你的应用截取用户交互事件。在你的用户界面中考虑事件,途径就是从用户界面中的一个指定的view对象中捕获事件。该view提供了这样做的方法。 在你用来组成你布局的不同的view类中,你或许注意到了一些公共的回调方法似…

【GlobalMapper精品教程】029:栅格重分类案例详解

重分类就是对原有栅格像元值重新分类从而得到一组新值并输出。重分类工具有多种方法将像元值重新分类或更改为替代值,Globalmapper提供了栅格重分类的功能。 文章目录 一、栅格重分类简介二、栅格重分类案例【参考阅读】:ArcGIS实验教程——实验四十三:ArcGIS栅格重分类(Re…

Mybatis 和 JPA 用哪个好? 优缺点 ?

本文不会下关于 Mybatis 和 JPA 两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于 Mybatis 和 JPA 孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜…

SkiaSharp 之 WPF 自绘 五环弹动球(案例版)

此案例基于拖曳和弹动球两个技术功能实现,如有不懂的可以参考之前的相关文章,属于递进式教程。五环弹动球好吧,名字是我起的,其实,你可以任意个球进行联动弹动,效果还是很不错的,有很多前端都是…

【GlobalMapper精品教程】032:浏览地理照片及航线信息(航测应用)

本文讲述globalmapper软件在无人机航测了内业处理中的应用之:浏览地理照片及航线信息、相机参数、元数据编辑器。 文章目录 1. 航线信息浏览2. 地理图像浏览2.1 数字化工具2.2 要素信息工具2.3 属性表3. 照片原数据编辑1. 航线信息浏览 打开globalmapper软件,加载无人机航测…

Spring Boot 2.7.0发布,2.5停止维护

这几天是Spring版本日,很多Spring工件都发布了新版本, Spring Framework 6.0.0 发布了第 4 个里程碑版本,此版本包含所有针对 5.3.20 的修复补丁,以及特定于 6.0 分支的 39 项修复和改进。而今天Spring Boot 2.7.0和Spring Securi…

【GlobalMapper精品教程】031:Globalmapper在航测内业数据处理中的应用举例

Globalmapper在航测内业数据处理中的应用举例索引。 文章目录 1. 图像及航线浏览2. 3D重建3. 点云分类4. 创建地形5. 地形分析1. 图像及航线浏览 扩展阅读:【GlobalMapper精品教程】032:浏览地理照片及航线信息(航测应用) 2. 3D重建 从Global Mapper的19版本开始,Pixels-…

移动工具V和选区工具M

移动工具快捷键:V 属性: 自动选择 在默认情况下,移动工具的“自动选择”一项是没有勾选的。表示只能选中图层窗口中选定的固定图层,不能随意的点击选择别的图层。在这里,我们也勾选“自动选择”,可任意选择…

SeleniumWebDriver扩展插件开发

Selenium WebDriver 是一组开源 API,用于自动测试 Web 应用程序,利用它可以通过代码来控制chrome edge等浏览器!有时候我们需要mock接口的返回,或者拦截和转发请求,今天就来实现这个功能本插件代码已开源:h…

ZooKeeper的工作原理

ZooKeeper是一个分布式的应用程序协调服务。 2 ZooKeeper的工作原理 Zookeeper 的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab(Zookeeper Atomic Broadcast)协议。Zab协议有两种模式,它们分别是恢复模式(…

memcache的学习路线图

memcache学习材料//memcache自带的github 上的 wiki//席剑飞 Memcache(MC)系列 1~8系列评注: memcache系统写的最深的一博客,建议一读。http://blog.csdn.net/xifeijian/article/details/21994941//mysql与memcache的使用https://…

[转]钱岭:别担心“35岁危机”,要成为“老专家”

从清华大学到贝尔实验室,再到中国移动,作为“IT老人”,钱岭的技术人生几乎覆盖了20世纪90年代至今的信息产业革命。2007年开始,钱岭在中国移动经历了基础科研到产品落地,再到团队孵化;也经历了云计算从无到…

【GIS前沿】周成虎院士:GIS的大数据时代展望(PPT分享)

本文源自微信公众号:宋关福GIS笔记。版权归原作者及刊载媒体所有,如有侵权请立即与我们联系,我们将及时处理。更多GIS前言技术,请关注《GIS前言》专栏。 GIS的大数据时代展望

DataV:可视化大屏展示神器实战分享

由于公司年即将发布新的产品,传统意义上的PPT显得不太生动化,所以想采用具体化,可视化的数据大屏进行业务数据的事实展示,第一时间想到了来自于阿里云旗下的DataV,废话不多说,老司机开始发牌照!…

数据库性能系列之索引(中)

GOOD NIGHT前言上一篇中,我们已经了解到了索引的基本概念和一些用法。那索引为什么会提升查询的速度,以及索引究竟是怎么工作的呢?也许大家心里还是有一些迷茫,这一切,还要从索引背后的算法说起。GOOD NIGHT概述大家知…

微服务架构的设计原则和核心话题

目录 一、前言 二、微服务架构的设计原则 1.拆分足够微 2.轻量级通信 3.单一职责原则 4.领域驱动原则 三、微服务架构的核心话题 1.服务拆分 2.服务注册与发现 3.负载均衡 4.API网关 5.服务部署与发布 四、总结 一、前言 毫无疑问,微服务架构的设计原…

4.3.2 基于集合的操作

在SQL Server处理select命令时,会在内存中建立一个结构,以返回结果集。这个结构实质上是一个有行和列的二维数组,称为“游标(cursor)”。“游标”这个词是“CURrent set of Records(当前记录集)”的缩写。它表示从表或…

Golang GOPATH 包

2019独角兽企业重金招聘Python工程师标准>>> Golang GOPATH & 包的定义 & 包的导入 GOPATH 设置 go 命令依赖一个重要的环境变量:$GOPATH 可以在 .zshrc 配置文件中加上一行这样的配置, export GOPATH/Users/flyme/mygo Go从1.1版本到…

PPK大疆无人机应用教程

文章目录 一、新建项目二、导入数据三、解算过程四、结果导出一、新建项目 新建工程,设置项目名称,保存位置,控制等级,坐标系统(坐标系统选择高斯克吕格,中央子午线根据实际数据所在位置进行选择) 二、导入数据 选择大疆数据,找到对应的文件夹 数据有:图片,EVENT.b…