你可以让系统将特定的虚拟内存页与实际页帧相"关联",并保持这样的状态(称为锁定)。该部分内存不会被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)

参考文献

The GNU C Library Reference Manual 3.5

linux内存锁定什么意思,Linux内存子系统——Locking Pages(内存锁定)相关推荐

  1. Linux内核的各个组成部分,Linux 内核的组成部分

    linux内核主要由进程调度(SCHED).内存管理(MM).虚拟文件系统(VFS).网络接口(NET).和进程间通信(IPC)等5个子系统组成 他们的关系如下图 所示: 1.进程间调度: 精度调度控 ...

  2. Linux图形子系统之GEM内存管理

    Linux图形子系统之GEM内存管理 引言 1 创建与映射 1.1 创建GEM 1.2 映射对象到文件 1.3 映射对象到用户空间 1.4 对象同步 2 内存分配 2.1 数据结构 2.1.1 内存管 ...

  3. linux内存管理子系统采用基于内存区域,Linux 内存管理之highmem简介

    一.Linux内核地址空间 一般来说Linux 内核按照 3:1 的比率来划分虚拟内存(X86等):3 GB 的虚拟内存用于用户空间,1GB 的内存用于内核空间.当然有些体系结构如MIPS使用2:2 ...

  4. linux 优化内存分配,Linux性能优化 第三章 性能工具:系统内存

    3.1内存性能统计信息 3.1.1内存子系统和性能 和CPU相比,内存的读写速度都大大落后于CPU.为了弥补这个差距,通常CPU会采用高速缓存的机制(高cache). 3.1.2内存子系统(虚拟存储器 ...

  5. LINUX如何让内存FREE变大,Linux性能优化(内存:free + top +vmstat )

    转载:https://blog.51cto.com/superpcm/2068843 cat /proc/{pid}/status Valgrind工具检测内存泄漏 3.1内存性能统计信息 3.1.1 ...

  6. epub 深入linux内核架构_深入分析Linux内核源代码6-Linux 内存管理(2)

    每天十五分钟,熟读一个技术点,水滴石穿,一切只为渴望更优秀的你! ----零声学院 6.3 内存的分配和回收 在内存初始化完成以后,内存中就常驻有内核映像(内核代码和数据).以后,随着用 户程序的执行 ...

  7. linux磁盘io调优,Linux系统管理和调优(内存、CPU、磁盘IO、网络)

    系统管理 Author:Rich七哥 查看 CPU 负载相关工具,找出系统中使用 CPU 最多的进程 查看 Memory 运行状态相关工具,找出系统中使用内存最多的进程 查看 IO 运行状态相关工具, ...

  8. Linux从头开始学--学习笔记6--系统初始化,内存,swap,oom,网络和网络接口

    这是我从头开始学习Linux的学习笔记,后续还会更新. 记录自己的技术成长,也希望和大家分享交流,欢迎关注~ 本笔记为coursera网站课程<Linux for Developers>的 ...

  9. linux内存分配 连续 足够,linux内存池能分配连续物理内存吗

    中. size参数: 内核是基于页技术分配内存,以最佳的利用系统的RAM. linux处理内存分配的方法是:创建一系列的内存对象池,每个池的内存大小事固定的,处理分配请求时,就直接在包含足够大的内存块 ...

最新文章

  1. 1091 Acute Stroke 需再做
  2. IBM X3650 M2 BR10i卡的阵列配置方法
  3. Xamarin Essentials教程实现数据的传输功能实例
  4. CentOS 6.8 部署腾讯蓝鲸运维平台
  5. 【运维】linux硬盘空间不足,扩容硬盘,挂载目录,并永久挂载
  6. 推荐算法炼丹笔记:阿里序列化推荐算法ComiRec
  7. 学业水平考试网登录_江西2020年下半年普通高中学业水平考试成绩查询时间及入口...
  8. Coriant助力Aureon部署100Gbps光纤网络
  9. python 批量处理文件_python批量处理文件或文件夹
  10. MyBatis中or和and的使用问题
  11. ERROR: Unrecognized command line argument: #39;use#39;
  12. CSS基础——盒子模型【学习笔记】
  13. phonegap走起
  14. MVC3 EntityFramework 插入Mysql数据库 乱码问题
  15. 科学技术的不完备性及其实践意义
  16. 电子学会图形化三级编程题解析含答案:冬天下雪了
  17. Macromedia Studio 8 简体中文正式版激活码
  18. 3GPP TS 24.301 Release 8 中文版
  19. 【进销存管理系统——开题报告 分享(仅供参考呀)】
  20. 策略模式(用策略模式实现我们淘宝,京东,美团等等简易满减活动)

热门文章

  1. foreach和volist的区别
  2. c++ 1:非MFC工程使用MFC库时的问题及解决办法(如果要用CString或者提示windows头文件重复包含)...
  3. Django Web在Apache上的部署
  4. 函数定义的规范-电子书包
  5. 学习mfc的一些方法
  6. 老人言 摘自云风的blog
  7. 11.29 广州国际设计周
  8. java基础将一个int数组转换成一个字符串
  9. 分支限界法|Branch and Bound Method(0-1背包问题)
  10. BIO ,NIO,AIO的区别