日志

Linux内存子系统——Locking Pages(内存锁定)

 来源    2020-09-16    1  

该部分内容可以参考libc man page 3.5 LockingPages

概述

你可以让系统将特定的虚拟内存页与实际页帧相"关联",并保持这样的状态(称为锁定)。该部分内存不会被swap机制交换出来,也不会产生pagefault(因为已经分配了实际的物理内存)。

为什么需要锁定内存

一个背景知识pagefault

用户在分配出一部分虚拟内存时,其背后可能并没有真正的物理内存与之对应,只有在用户真正需要访问内存时,系统才会为这段虚拟内存分配实际的物理内存,这个过程叫做pagefault(缺页异常)。这个过程对用户来说时不感知的,所以用户可以总是假定他要使用的虚拟内存背后有实际的物理内存

1. 速度

当用户只是执行简单的内存访问时,pagefault流程对用户来说虽然是不感知的,耗时可以忽略不记,但是对于一些时间敏感型进程,尤其是实时进程,可能无法容忍执行速度的下降。

这种情况下,程序员可以先把所需要使用到的内存全部锁定,为它们提前分配好实际的物理内存,这样在访问时,就可以省去pagefault流程,提升程序执行速度。

2. 安全

如果你把一些秘密存放在虚拟内存中(比如用户输入的密码),当虚拟内存被swap到磁盘后,就可能导致泄露。且可能在虚拟内存和物理内存被清除后很长一段时间依然存在。

副作用

当你每多lock一个页帧,那么可供其他虚拟内存使用的页帧就少了一个,意味者系统里可能发生更多的缺页异常,更多的swap,而导致系统执行速度变慢。

一个极端的情况是,当你锁定了所有的内存,系统将因为没有实际可用的内存而无法运行

一些细节

1. 堆叠

内存锁不会堆叠,你即使锁定一段内存两次,也只需要解锁一次

2. 生命周期

内存锁定会一直持续到拥有内存的进程显示的解锁它。但是进程终止和exec会导致虚拟内存不再存在,这可能意味着它不再被锁定

3. 继承

内存所不会被子进程继承,(但请注意,在现代Unix系统中,在fork之后,父级和子级的虚拟地址空间由相同的实页帧支持,因此子级享有父级的锁)

4. 权限

由于它能够影响其他进程,因此只有超级用户可以锁定,但所有进程都可以解锁自己的内存

5. 写入时复制的行为

这里有一个非常有趣的行为,但我还没有研究透,允许我先挖个坑

libc接口

mlock

将从addr开始长度len的内存锁定

int mlock (const void *addr, size t len)

munlock

将从addr开始长度len的内存解锁

int munlock (const void *addr, size t len)

mlockall

全部锁定

int mlockall (int flags)

标志位说明:

MCL_CURRENT代表只锁定当前已经分配的内存

MCL_FUTURE将来分配的内存也会被立刻锁定,注意单独设置这个标志位不会锁定当前已经被分配的内存

注意 MCL_FUTURE不会影响未来的进程地址空间,例如exec后,该标志位将被擦除

munlockall

没啥好说的了,一次解锁所有内存(自己进程的)

int munlockall (void)
相关文章
linux – mmap():将旧内存重置为零非驻留状态
问答我正在写一个内存分配例程,它目前正在顺利运行.我用4096字节页面中的mmap()从操作系统中获取内存.当我启动内存分配器时,我使用mmap()分配1gig的虚拟地址空间,然后在分配时根据我的分配算法 ...
1
无法通过Linux内核模块(Ubuntu)在内核内存中写入
问答我试图通过内核模块在虚拟机(使用VirtualBox)中覆盖内核内存(Linux 2.6.31,Ubuntu 9.10)中的某些部分. 每当我这样做时,我都会收到此错误 [27154.303726] ...
1
linux – PERF STAT不计算内存负载,但计算内存存储
问答Linux内核:4.10.0-20-generic(也在4.11.3上试过) Ubuntu:17.04 我一直在尝试使用perf stat收集内存访问的统计信息.我能够收集内存存储的统计信息,但内存加 ...
1
Linux中每个用户的内存使用情况?
问答假设我有20个用户登录我的linux盒子.我怎么知道他们每个人使用了多少内存?::您可以尝试使用smem(有关详细信息,请参阅ELC2009: Visualizing memory usage wit ...
Linux内核中的slab内存管理缓存着色
问答我最近读到了关于slab系统的缓存着色并且不明白. 为什么缓存着色会在不同的平板中为对象添加各种偏移量可以提高性能? 我最初的猜测是: 具有缓存偏移的slab分配器,尝试将slabs的第一个对象放在不 ...
1
linux – 如何强制kerberos在内存凭证缓存中使用?
问答MIT Kerberos支持multiple types个凭证缓存来存储票证 . 例如,如果我想在内核内存中使用每个用户的持久密钥环,我可以将以下内容添加到krb5.conf中. [libdefaul ...
1
如何在linux中监视php的内存使用情况?
问答我使用valgrinds massif工具来监控过去的内存使用情况. 有没有人知道如何捕获linux lighttpd服务器上产生的php进程的内存使用? 我发现Valgrind不能附加到prerun ...
1
linux – 当占用太多内存时自动暂停/休眠进程
问答我在具有16GB RAM的8核PC上运行一个小型Debian计算集群.我正在运行大约1k个批次的任务(每个批次的预计总时间为一个月).单个任务是单线程的(因此我可以在每台PC上并行运行多个),不会消耗 ...
3
Linux在x86_64上共享内存分配
问答我有64位REHL linux,Linux ipms-sol1 2.6.32-71.el6.x86_64#1 SMP x86_64 x86_64 x86_64 GNU / Linux RAM大小= ~ ...
1
将模块移植到较新的Linux内核:无法分配内存
问答我有一个非常大的驱动程序模块,我正在尝试编译最近的Linux内核(3.4.4).我可以使用2.6.27.25内核成功编译和insmod相同的模块. GCC版本也不同,4.7.0对4.3.0.请注意,此 ...
1
linux – 使用模块读取内核内存
问答作为我项目的一部分,我需要读取内核以获取系统调用表和系统调用地址的内存地址.或者实际上我需要提取系统调用表的内容和所有系统调用. 直到现在我才将GDB用于此目的.有没有办法让我可以使用内核模块.我是新 ...
1
linux – 如何通过mmap映射内存指针立即刷新?
问答在双ARM处理器系统上使用/ dev / mem与mmap(确切地说是Xilinx Zynq)时,我遇到了一个似乎是缓存问题的问题.我的配置是asymmettric,一个处理器运行Linux,另一个处 ...
1
linux – 共享内存:shmget()/共享内存如何工作?
问答通过浏览shmget()的手册页,我知道shmget()调用会在内存中分配页面,这些页面可以跨进程共享. 是否要创建内核内存页面,该页面映射到进程的本地地址空间? 或者它是为该段保留的相同进程内存页面 ...
1
linux – 编写跟踪进程的内存.
问答我正在玩linux中的ptrace.我试图使用/ proc / pid / mem接口编写跟踪进程的内存. 我用来完成这个任务的功能是: void write_proc(pid_t child, un ...
1
具体来说,fork()如何处理Linux中malloc()的动态分配内存?
问答我有一个程序与一个父进程和一个子进程.在fork()之前,父进程称为malloc(),并用一些数据填充数组.在fork()之后,孩子需要该数据.我知道我可以使用一个管道,但以下代码似乎工作: #inc ...
1
linux – 由kmalloc()分配的内存是否自动释放?
问答我正在编写一个设备驱动程序,除其他外,用kmalloc分配一块内存.用户程序关闭文件时释放此内存.在我的一个实验中,用户程序在没有关闭文件的情况下崩溃. 有什么东西可以释放这段记忆吗? 在另一个实验中 ...
1
linux – TLB中的内核内存(虚拟地址条目)?
问答Linux是操作系统,ARM是在此上下文中引用的处理器. TLB是否包含内核和用户空间虚拟地址? 内核内存从0xc000_0000开始,然后转到0xFFFF_FFFF 前3 GB属于用户空间的位置.在 ...
1
linux中共享库的内存映射
问答当我使用时查看进程的内存映射 cat / proc / pid / maps 有这样的条目: 40321000-40336000 r-xp 00000000 b3:15 875 /system/lib ...
1
c – 访问共享内存以进行读取时锁定
问答如果我访问共享内存只读,要检查if()块的条件,我还应该锁定互斥锁吗?例如. mutex_lock(); if (var /* shared memory */) { } mutex_unlock() ...
1
如何在大型c Linux应用程序中检查内存泄漏?
问答我目前正在开发一个大规模的应用程序项目(用c语言编写),它从前面开始从头开始,我们已经到了强制要求对内存泄漏进行检查的时候了. 该应用程序在Ubuntu Linux上运行,它具有大量的多媒体内容,并使 ...
1