该部分内容可以参考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内存子系统——Locking Pages(内存锁定)的更多相关文章

  1. Linux内存子系统及常用调优参数

    1>内存子系统 1>组件: slab    allocator buddy    system kswapd pdflush 2>虚拟化环境: PA:进程地址: HA:虚拟机地址: ...

  2. Linux内核入门到放弃-内存管理-《深入Linux内核架构》笔记

    概述 内存管理的实现涵盖了许多领域: 内存中的物理内存页管理 分配大块内存的伙伴系统 分配较小内存块的slab.slub和slob分配器 分配非连续内存块的vmalloc机制 进程的地址空间 在IA- ...

  3. Linux IPC System V 共享内存

    模型 #include<sys/types.h> #include<sys/ipc.h> #include<sys/shm.h> ftok() //获取key值 s ...

  4. Linux内存点滴 用户进程内存空间

    Linux内存点滴 用户进程内存空间 经常使用top命令了解进程信息,其中包括内存方面的信息.命令top帮助文档是这么解释各个字段的. VIRT, Virtual Image (kb) RES, Re ...

  5. linux内存源码分析 - 内存压缩(实现流程)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 本文章最好结合linux内存管理源码分析 - 页框分配器与linux内存源码分析 -伙伴系统(初始化和申请 ...

  6. Linux mem 2.5 Buddy 内存回收机制

    文章目录 1. 简介 2. LRU 组织 2.1 LRU 链表 2.2 LRU Cache 2.3 LRU 移动操作 2.3.1 page 加入 LRU 2.3.2 其他 LRU 移动操作 3. LR ...

  7. Linux mem 2.4 Buddy 内存管理机制

    文章目录 1. Buddy 简介 2. Buddy 初始化 2.1 Struct Page 初始化 2.2 Buddy 初始化 3. 内存释放 4. 内存分配 4.1 gfp_mask 4.2 nod ...

  8. 如何在Linux上使用文件作为内存交换区(Swap Area)

    交换区域(Swap Area)有什么作用? 交换分区是操作系统在内存不足(或内存较低)时的一种补充.通俗的说,如果说内存是汽油,内存条就相当于油箱,交换区域则相当于备用油箱. Ubuntu Linux ...

  9. Linux资源控制-CPU和内存

    主要介绍Linux下, 如果对进程的CPU和内存资源的使用情况进行控制的方法. CPU资源控制 每个进程能够占用CPU多长时间, 什么时候能够占用CPU是和系统的调度密切相关的. Linux系统中有多 ...

随机推荐

  1. 使用 .NET Core 3.x 构建RESTful Api(第三部分)

    关于HTTP HEAD 和 HTTP GET: 从执行性能来说,这两种其实并没有什么区别.最大的不同就是对于HTTP HEAD 来说,Api消费者请求接口数据时,如果是通过HTTP HEAD的方式去请 ...

  2. 用WEB方式开发WPF桌面程序

    因为疫情影响,公司裁员,结束了一年多的web开发经历,重新开始做桌面,新公司用的是WPF(居然用的是winform style...),当然这跟本文没有关系...上篇博客写的用后台api和前台浏览器控 ...

  3. C++置换的玩笑

    小蒜头又调皮了.这一次,姐姐的实验报告惨遭毒手. 姐姐的实验报告上原本记录着从 1 到 n 的序列,任意两个数字间用空格间隔.但是“坑姐”的蒜头居然把数字间的空格都给删掉了,整个数字序列变成一个长度为 ...

  4. 二叉搜索树及java实现

    二叉搜索树(Binary Search Tree) 二叉搜索树是二叉树的一种,是应用非常广泛的一种二叉树,英文简称为 BST 又被称为:二叉查找树.二叉排序树 任意一个节点的值都大于其左子树所有节 ...

  5. keil5 使用JLink 向nrf52840DK 下载程序出现No Cortex-M SW Device Found

    今天打开52840 keil5 工程,下载程序无法下载成功,提示如下: 在Jlink 配置中(Option for target....-> Debug->Setting )SWDIO也无 ...

  6. 12c RAC 用Rman 恢复到异机单实例

    准备工作 原服务器软件部署:Redhat 6.6 + Oracle 12.2.0.1 rac Oracle12c单实例安装 1.创建恢复服务器,设置大于原库数据大小的磁盘容量.设置相同的服务器主机名参 ...

  7. Docker 安装及配置镜像加速

    Docker 版本 随着 Docker 的飞速发展,企业级功能的上线,更好的服务意味着需要支付一定的费用,目前 Docker 被分为两个版本: community-edition 社区版 enterp ...

  8. Java多线程_并发容器ConcurrentHashMap/CopyOnWriteArrayList/CopyOnWriteArraySet

    ConcurrentHashMap         HashMap是线程不安全的,可以使用Collections.synchronizedMap(map)把一个不安全的map变成安全的,但是这里可以直 ...

  9. Asp.net Core启动流程讲解(四)

    Asp.net Core内 DI(DependencyInjection)贯穿了项目的始终,要学习Asp.net Core就无法越过DI. 下面讲解一下DI在Asp.Net Core内的流程 asp. ...

  10. 调试 Ingress Nginx

    由于 Ingress Nginx 是最受欢迎的 Ingress 控制器,因此接下来我们将介绍一些有关调试 ingress-nginx 的技巧. 调试 Ingress Nginx Ingress-ngi ...