该部分内容可以参考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)

随机推荐

  1. OS的沙盒机制 --基础知识

    /* iOS的沙盒机制,应用只能访问自己应用目录下的文件. iOS不像android,没有SD卡概念,不能直接访问图像.视频等内容. iOS应用产生的内容,如图像.文件.缓存内容等都必须存储在自己的沙 ...

  2. 1336 - Sigma Function---LightOj1336

    http://lightoj.com/volume_showproblem.php?problem=1336 题目大意:求1到n之间的数因子和是偶数有几个对于任意一个x, 都有x = p1^a1*p2 ...

  3. 最近买了个kindle,为了方便阅读,写了个程序抓取网页内容发送到Kindle

    主要觉得往kindle里加书籍太麻烦了,要下载下来,还要通过邮件发送,特别一些网页文字版的书籍没办法放到kindle里,所以想着还不如自己动手丰衣足食,写一个程序直接抓取网页内容,制作成书籍,然后自动 ...

  4. laravel框架总结(二) -- blade模板引擎

    ## 1.基本用法 ##情形1 $name = laravel5 <div class="title"> {{$name}} {{$name}}</div> ...

  5. .NET的语法优化

    1.多参数 判断 条件 //判断 var fileKey = new { DateStart = search.DateStart.IsNull(), //关开始时间 DateEnd = search ...

  6. spring--事务原理

    Spring支持以下7种事务传播行为. 传播行为 XML文件 propagation值 含义 PROPAGATION_REQUIRED REQUIRED 表示当前方法必须在一个具有事务的上下文中运行. ...

  7. JavaScript--函数-按值传递

    按值传递(byValue): 两个变量间赋值或将变量作为参数传入函数时,其实都是将原变量中的值,赋值一份给对方(新变量) 对原始类型的值: 修改新变量,不会影响原变量 对引用类型的对象: 通过新变量修 ...

  8. poj 3959 Alignment of Code &lt;vector&gt;“字符串”

    Description You are working in a team that writes Incredibly Customizable Programming Codewriter (IC ...

  9. C#应用Newtonsoft.Json.dll,控制json的时间格式

    原文:C#应用Newtonsoft.Json.dll,控制json的时间格式 var aIsoDateTimeConverter = new IsoDateTimeConverter();aIsoDa ...

  10. 4.29 初始mysql