一文剖析mlock锁原理

news2024/11/26 4:43:43

一般用户空间关联的物理页面是按需通过缺页异常的方式分配和调页,当系统物理内存不足时页面回收算法会回收一些最近很少使用的页面,但是有时候我们需要锁住一些物理页面防止其被回收(如时间有严格要求的应用),Linux中提供了mlock相关的系统调用供用户空间使用来锁住部分或全部的地址空间关联的物理页面。

本文的分析基于arm64处理器架构,内核版本为Linux-5.10.27,我们会结合重点内核源代码来解析mlock是如何做到锁住进程地址空间关联的物理内存的,又是如何防止相关的物理页面被交换出去的。

一、主动缺页

mlock的主要代码处理流程如下,这里我们主要关注主动缺页部分:

mlock处理路径中,会将VM_LOCKED标志加入到vma->vm_flags中(由于设置的地址区域有可能跨越多个vma,所以代码中会涉及到分裂和合并的操作,实质上都会设置相关的vma->vm_flags的VM_LOCKED标志),然后会调用__mm_populate来填充虚拟页对应的物理页,最终在faultin_page函数中试图查找vma中的每个虚拟页对应的物理页面(对应于follow_page_mask函数),如果没有找到会调用handle_mm_fault主动触发缺页处理。handle_mm_fault函数是内核通用的缺页异常处理例程,如vma是匿名映射的则分配物理页面然后建立页表映射关系,vma是文件映射则会从磁盘读取对应的文件页(如果page cache没有对应页面时)到内存的page cache,然后建立虚拟页面建立页表映射关系。

二、内存回收处理

1. 扫描活跃的lru链表

内存回收扫描活跃的lru链表时,对于设定了VM_LOCKED的vma处理链路如下:

可以看到:当扫描活跃的lru链表的时候,会通过反向映射机制查找到映射这个物理页面的每个vma, 对于设置了vma->vm_flags 的VM_LOCKED标志的vma来说直接退出反向映射处理即可,不需要进行访问计数的统计工作,本身这样的物理页面就需要常驻内存不要进行回收。

2. 扫描不活跃的lru链表

内存回收扫描不活跃的lru链表时,对于设定了VM_LOCKED的vma处理链路如下:

可以看到:调用链中也会调用page_referenced 函数通过反向映射机制查找到映射这个物理页面的每个vma, 对于设置了vma->vm_flags 的VM_LOCKED标志的vma来说直接退出反向映射处理即可,返回到page_check_references函数时,判断如果有vma设置了VM_LOCKED标志就会返回PAGEREF_RECLAIM到shrink_page_list函数接着处理。shrink_page_list函数在处理完page_check_references之后,就进行回收处理,对于页表映射页会调用try_to_unmap来解除页表映射。

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

3. 反向映射处理

shrink_page_list在回收物理页面之前会调用try_to_unmap来解除映射到这个页面所有页表项,相关处理如下:

对于映射到这个物理页的每个vma来说,如果vma->vm_flags设置了VM_LOCKED标志,则会调用mlock_vma_page来做mlock处理,然后返回false,结束反向映射处理。下面我们来看mlock_vma_page做了什么事情:

可以看到:mlock_vma_page首先设置页描述符的PG_mlocked标志,然后会zone的NR_MLOCK页面记账,然后会将页面从原来的lru链表中隔离出来,最后会将页面加入不可回收的lru中(这个代码大家自行阅读,实际上是判断页描述符的PG_mlocked标志)。

mlock_vma_page处理的重点就是将页面加入到不可回收的lru链表,这样内存回收的时候就不会在扫描到这样的页面了。

mlock的整个过程如下图所示:

三、munlock处理

munlock会解除原来锁住的页面,处理路径如下:

当然代码中也会有对应的vma的分裂处理,主要处理为:清除vma的VM_LOCKED标志,清除页描述符的PG_mlocked标志,最后就会将原来在不可回收的lru中的页面重新加入对应的lru链表中。这里还有一个细节,那就是有可能这个页面对多个vma共享,所以会通过try_to_munlock来处理,处理路径如下:

会通过反向映射机制,遍历这样页对应的所有vma,如果传递的ttu_flags为TTU_MUNLOCK且vma->vm_flags没有设置VM_LOCKED标志,则直接返回,检查下一个vma;如果有一个vma设置了VM_LOCKED标志,说明这个页面还不能被回收,就会通过mlock_vma_page函数重新将页面加入到不可回收的lru链表。munlock的整个处理过程如下图:

四、总结

对于一些对时间有严格要求的应用场景,访问时按需分配和调页机制的时延可能是未知的,内核中提供了mlock相关的系统调用,用于将虚拟内存区域对应的物理页面“锁在”内存中。内核对应mlock锁住的页面实际上它主要做了两步比较重要的操作:1,调用mlock的时候就将所需要的物理页面准备好;2,内存回收时当扫描到相关的物理页面时,将其放入不可回收的lru链表。第一步保证访问的虚拟地址对应的物理页面在内存中,第二步保证了锁住的页面不会被回收。

 

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

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

相关文章

市面上的智能电表都有多少安的?适用于那些场景?

随着智能化技术的快速发展,智能电表已经成为了家庭和公寓物业配电系统的必备设备之一。智能电表的功率等级通常为10A或15A,具体取决于电表型号和用途。那么,这些功率等级的智能电表适用于哪些场景呢? 首先,10A功率等级…

【实验练习】基于自注意力机制Vision Transformer模型实现人脸朝向识别 (Python实现) 内容原创

题目 人脸识别是一个复杂的模式识别问题,人脸识别是人脸应用研究中非常重要的一步。由于人脸形状不规则、光线和背景条件多样,导致人脸检测精度受限。实际应用中,大量图像和视频源中人脸的位置、朝向、朝向角度都不是固定的,极大…

内网渗透—隧道技术

内网渗透—隧道技术 1. 隧道技术介绍1.1. 内网—隧道技术1.2. 常见的隧道协议1.3. 前置条件1.4. 判断内网的连通性 2. 网络层隧道技术2.1. ICMP隧道技术2.1.1. 常见工具2.1.2. Pingtunnel基础演示2.1.2.1. 下载服务端2.1.2.2. 下载客户端2.1.2.3. 设置CS连接2.1.2.4. 连接测试 …

功能上新|对比分析、Batches数量、函数释义Tips

本篇是继功能上新|内存篇、GPU篇之后,为大家展示更多关于提升浏览UWA GOT Online Overview报告体验的优化项,包括Overview报告的对比分析、Batches数量、函数释义Tips等。这些功能可以让你更快上手对报告的理解,亦或者更好地融入在…

.Net Core 6 WebApi 项目搭建(一、简单搭建)

前言 对于后端开发者最耻辱的是什么,是只会增删改查,只会CV,只会业务代码。没错,我就是被钉在耻辱柱上的一员,3年开发经验,不会搭建框架,只会写业务代码,丢人丢人啊,所以…

【XR】One More Thing:Vision Pro ,7年磨一剑,2023WWDC苹果发布Vision MR

One More Thing:Vision Pro ,7年磨一剑,2023WWDC苹果发布Vision MR 1. 苹果MR Vision Pro:1. 专利布局:苹果表示在开发过程中申请了5000多项专利。2. 专属感知计算芯片3. 显示屏系统方面4. 续航方面5. Vision MR 的新框…

MATLAB安装配置MinGW-w64 C++编译器

文章目录 前言一、Mingw安装1、安装教程2、验证 二、MATLAB安装配置MinGW总结 #pic_center 前言 只是为方便学习,不做其他用途 一、Mingw安装 在网上找到的安装一直报错:The file has been downloaded incorrectly 1、安装教程 建议参考博客Mingw快捷安…

C++内存序、屏障和原子操作

文章目录 一、原子类型二、原子操作函数三、内存序1&#xff09;happens-before和synchronizes-with语义2&#xff09;内存序模式 四、标准库函数五、栅栏&#xff08;Barrier&#xff09; 一、原子类型 标准原子类型的备选名和与其相关的 std::atomic<> 特化类&#xf…

探索低代码的新形态(D2C、ChatGPT)

前言 低代码平台的出现&#xff0c;是互联网快速发展的背景下&#xff0c;满足产品快速迭代的实际需求。现在国内外都已经拥有非常多优秀的开源项目&#xff08;如&#xff1a;lowcode-engine&#xff09;和成熟的商业产品&#xff08;如&#xff1a;Mendix 、PowerPlatform&a…

Orillusion次时代 WebGPU 引擎

Orillusion 次时代 WebGPU 引擎 官网: https://www.orillusion.com/ 教程: https://www.orillusion.com/guide/ Orillusion 引擎是一款完全支持 WebGPU 标准的轻量级渲染引擎。基于最新的 Web 图形API标准&#xff0c;我们做了大量的探索和尝试&#xff0c;实现了很多曾经在 We…

python接口自动化(三)--如何设计接口测试用例(详解)

在开始接口测试之前&#xff0c;我们来想一下&#xff0c;如何进行接口测试的准备工作。或者说&#xff0c;接口测试的流程是什么&#xff1f;有些人就很好奇&#xff0c;接口测试要流程干嘛&#xff1f;不就是拿着接口文档直接利用接口 测试工具测试嘛。其实&#xff0c;如果…

【正点原子STM32连载】 第二十八章 低功耗实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十…

计算机中数据的表示:定点数、浮点数

文章目录 1 概述2 定点数2.1 表示方法2.2 取值范围2.3 运算方法 3 浮点数3.1 表示方法3.2 运算方法 4 扩展4.1 等比数列前 n 项和公式 1 概述 #mermaid-svg-EXDrkn8G91FsDdps {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#merm…

给 a 标签设置 display:inline-block 之后 a 整体下沉

今天给一个a设置宽高&#xff0c;前提是添加了display:inline-block&#xff1b;然后发下a没有与父元素div顶部对齐&#xff0c;反而下沉了。试了好多办法都没成功&#xff0c;然后在网上找的教程。 原因 1、问题就是出在了display:inline-block;语句上&#xff0c;行内块元…

使用Python进行接口性能测试:从入门到高级

前言&#xff1a; 在今天的网络世界中&#xff0c;接口性能测试越来越重要。良好的接口性能可以确保我们的应用程序可以在各种网络条件下&#xff0c;保持流畅、稳定和高效。Python&#xff0c;作为一种广泛使用的编程语言&#xff0c;为进行接口性能测试提供了强大而灵活的工…

Redis:数据类型

一、Redis字符串(String) 1、String类型 String字符串&#xff1a;string类型是redis最基本、最简单的数据类型&#xff0c;一个key对应一个value。 String类型的二进制是安全的&#xff0c;可以包含任何数据&#xff0c;但是每一个value最大时512M 2、String命令 设置和获…

《人月神话》译文修订明细(6)-读者可以对照修改

《人月神话》译文修订明细&#xff08;1&#xff09;-读者可以对照修改 《人月神话》译文修订明细&#xff08;2&#xff09;-读者可以对照修改 《人月神话》译文修订明细&#xff08;3&#xff09;-读者可以对照修改 《人月神话》译文修订明细&#xff08;4&#xff09;-读…

前端面试题整理14

目录 1.什么是同步&#xff1f;什么是异步&#xff1f; 2.localStorage、sessionStorage和cookie的区别&#xff1f; 3.Vue中key的作用是什么&#xff1f; 4.支付流程是什么&#xff1f; 5.Vuex的模块化是如何做的&#xff1f; 6.Vite和webpack的不同&#xff1f;Vite的优…

BS LIS系统仪器数据采集方法

BS LIS系统仪器数据采集方法 BS LIS系统对检验仪器的数据采集主要通过串行口通讯、USB端口通讯、TCP/IP通讯、定时监控数据库和手工录入等几种方法。串行口通讯最为普遍&#xff0c;采用RS-232C标准&#xff0c;一般的仪器都支持此标准。定时监控数据库对仪器管理机上已有的检…

【Vue】Element Plus和Element UI中插槽使用

文章目录 前言一、两者的区别二、组件库三、具体讲解总结 前言 今天和大家讲一下Element Plus和Element UI这两个组件库中表格的插槽使用方法&#xff0c;一般情况下vue2使用Element UI这个组件库&#xff0c;表格组件的插槽的话一般都是使用v-slot&#xff0c;而vue3使用Elem…