0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

mlock如何锁住进程地址空间关联的物理内存

Linux阅码场 来源:Linux阅码场 作者:Linux阅码场 2022-03-14 09:36 次阅读

一般用户空间关联的物理页面是按需通过缺页异常的方式分配和调页,当系统物理内存不足时页面回收算法会回收一些最近很少使用的页面,但是有时候我们需要锁住一些物理页面防止其被回收(如时间有严格要求的应用),Linux中提供了mlock相关的系统调用供用户空间使用来锁住部分或全部的地址空间关联的物理页面。 本文的分析基于arm64处理器架构,内核版本为Linux-5.10.27,我们会结合重点内核源代码来解析mlock是如何做到锁住进程地址空间关联的物理内存的,又是如何防止相关的物理页面被交换出去的。

一、主动缺页

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

6808a960-9fc5-11ec-952b-dac502259ad0.png

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处理链路如下:

68239090-9fc5-11ec-952b-dac502259ad0.png

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

2.扫描不活跃的lru链表

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

6836084c-9fc5-11ec-952b-dac502259ad0.png

可以看到:调用链中也会调用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来解除页表映射。

3.反向映射处理

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

684fd8bc-9fc5-11ec-952b-dac502259ad0.png

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

6867d480-9fc5-11ec-952b-dac502259ad0.png

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

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

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

6887a3aa-9fc5-11ec-952b-dac502259ad0.png

三、munlock处理

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

68bf2c58-9fc5-11ec-952b-dac502259ad0.png

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

68d7e3e2-9fc5-11ec-952b-dac502259ad0.png

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

68f2923c-9fc5-11ec-952b-dac502259ad0.png

四、总结

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8651

    浏览量

    361783
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72765

原文标题:mlock锁原理剖析

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux内核内存管理之内核非连续物理内存分配

    的主要优点是避免了外部碎片,而缺点是需要修改内核页表。显然,非连续内存区域的大小必须是4096的倍数。Linux使用非连续物理内存区的场景有几种:(1)为swap区分配数据结构;(2)为模块分配
    的头像 发表于 02-23 09:44 379次阅读
    Linux内核<b class='flag-5'>内存</b>管理之内核非连续<b class='flag-5'>物理</b><b class='flag-5'>内存</b>分配

    Linux进程地址空间详解

    RAM 的某些部分永久地分配给内核, 并用来存放内核代码以及静态内核数据结构. RAM 的其余部分称为动态内存 (dynamic memory). 动态内存不仅是进程所需的宝贵资源, 也是内核本身
    的头像 发表于 12-18 09:45 337次阅读
    Linux<b class='flag-5'>进程</b><b class='flag-5'>地址</b><b class='flag-5'>空间</b>详解

    如何绑定ip地址与mac物理地址呢?

    如何绑定ip地址与mac物理地址呢? 绑定IP地址与MAC物理地址是一种网络管理和安全措施,可以帮助确保网络设备的身份验证和安全性。在这篇文章中,我们将详细介绍如何进行IP
    的头像 发表于 12-07 09:33 1283次阅读

    linux系统查看物理地址

    将从基础知识开始,逐步介绍高级技术。 什么是物理地址 物理地址是指访问计算机内存或其他硬件设备时使用的真实物理位置。在计算机系统中,每个设备都有一个唯一的
    的头像 发表于 11-16 16:47 1475次阅读

    glibc的内存分配回收策略

    Linux内存空间简介 32位Linux平台下进程虚拟地址空间分布如下图: 进程虚拟地址
    的头像 发表于 11-13 11:16 347次阅读
    glibc的<b class='flag-5'>内存</b>分配回收策略

    linux内存性能优化介绍

    也不同;图示为 32 位和 64 位系统的虚拟地址空间内存映射是将虚拟内存地址映射到物理内存地址
    的头像 发表于 11-10 15:23 304次阅读
    linux<b class='flag-5'>内存</b>性能优化介绍

    求助,内存地址空间是否一定大于所有物理存储器的容量?

    内存地址空间是否一定大于所有物理存储器的容量?
    发表于 10-17 07:14

    什么是内存 操作系统内存介绍

    啦。 简而言之,电脑上的程序(进程)运行是需要使用到对应大小的物理内存。 虚拟内存 实际上运行的进程并不是直接使用
    的头像 发表于 10-09 16:23 496次阅读
    什么是<b class='flag-5'>内存</b> 操作系统<b class='flag-5'>内存</b>介绍

    Linux虚拟地址物理地址转换过程

    虚拟地址物理地址转换过程 虚拟地址物理地址都被划分了两部分: 虚拟地址由虚拟页面号VPN和虚拟地址
    的头像 发表于 10-08 11:45 858次阅读
    Linux虚拟<b class='flag-5'>地址</b>到<b class='flag-5'>物理地址</b>转换过程

    Linux虚拟地址空间物理地址空间的关系

    过程,这其实也是MMU的工作原理。 我们知道,在Linux中,每个进程都有自己独立的地址空间,且互不干扰。每个进程地址
    的头像 发表于 10-08 11:40 505次阅读
    Linux虚拟<b class='flag-5'>地址</b><b class='flag-5'>空间</b>和<b class='flag-5'>物理地址</b><b class='flag-5'>空间</b>的关系

    PMP物理内存保护介绍

    访问,包括对页表的隐式引用。PMP 检查适用于所有这些访问。隐式页表访问的有效特权模式是管理员模式。 允许使用虚拟内存的实现以推测方式执行地址转换,并且比显式虚拟内存访问所需的时间更早。可以在
    的头像 发表于 10-07 17:49 589次阅读

    Linux系统为什么需要引入虚拟地址

    ,这 4GB 的内存空间按照 3:1 的比例进行分配,其中用户进程享有 3G 的空间,而内核独自享有剩下的1G 空间,如下所示: 虚拟地址
    的头像 发表于 10-07 17:28 542次阅读
    Linux系统为什么需要引入虚拟<b class='flag-5'>地址</b>

    Linux如何证明线程共享进程地址空间

    所有的书上都说,进程中的所有线程共享进程地址空间,如上图中的蓝框都在一个进程中。那么该如何证明这个结论呢?
    发表于 08-25 16:22 341次阅读
    Linux如何证明线程共享<b class='flag-5'>进程</b>的<b class='flag-5'>地址</b><b class='flag-5'>空间</b>

    虚拟地址翻译物理地址的流程有哪些呢?

    现代的操作系统将可执行文件加载后,创建了进程进程中每一条指令和数据都被分配了一个虚拟地址,CPU获取到这个虚拟地址后,需要翻译成内存
    的头像 发表于 08-14 10:30 565次阅读
    虚拟<b class='flag-5'>地址</b>翻译<b class='flag-5'>物理地址</b>的流程有哪些呢?

    内存是怎么映射到物理地址空间的?内存是连续分布的吗?

    如果我们将两个4G内存插入内存插槽,得到的内存地址空间是0到8G吗?是不是0到4G是第一根内存,4到8G是第二根
    的头像 发表于 06-30 15:59 2028次阅读
    <b class='flag-5'>内存</b>是怎么映射到<b class='flag-5'>物理地址</b><b class='flag-5'>空间</b>的?<b class='flag-5'>内存</b>是连续分布的吗?