mlockall函数,头文件sys/mman.h
1. 原型: int mlockall(int flags);
2. mlockall函数将调用进程的全部虚拟地址空间加锁。防止出现内存交换,将该进程的地址空间交换到外存上。
3. mlockall将所有映射到进程地址空间的内存上锁。这些页包括: 代码段,数据段,栈段,共享库,共享内存,user space kernel data,memory-mapped file.当函数成功返回的时候,所有的被映射的页都在内存中。
4. flags可取两个值:MCL_CURRENT,MCL_FUTURE
MCL_CURRENT: 表示对所有已经映射到进程地址空间的页上锁
MCL_FUTURE: 表示对所有将来映射到进程地空间的页都上锁。
5. 返回: 成功返回0,出错返回-1
6. 此函数有两个重要的应用: real-time algorithms(实时算法) 和 high-security data processing(机密数据的处理)
real-time algorithms:对时间要非常高。
high-security data processing: 如果数据被交换到外存上,可能会泄密
7. 如果进程执行了一个execve类函数,所有的锁都会被删除。
8. 内存锁不会被子进程继承。
9. 内存锁不会叠加,即使多次调用mlockall函数,只调用一次munlock就会解锁
Linux 实现了请求页面调度,页面调度是说页面从硬盘按需交换进来,当不再需要的时候交换出去。这样做允许系统中每个进程的虚拟地址空间和实际物理内存的总量再没有直接的联系,因为在硬盘上的交换空间能给进程一个物理内存几乎无限大的错觉。
交换对进程来说是透明的,应用程序一般都不需要关心(甚至不需要知道)内核页面调度的行为。然而,在下面两种情况下,应用程序可能像影响系统的页面调度:
确定性(Determinism)
时间约束严格的应用程序需要确定的行为。如果一些内存操作引起了页错误,导致昂贵的磁盘操作,应用程序的速度便不能达到要求,不能按时做计划中的操作。如果能确保需要的页面总在内存中且从不被交换进磁盘,应用程序就能保证内存操作不会导致页错误,提供一致的,可确定的程序行为,从而提供了效能。
安全性(Security)
如果内存中含有私人秘密,这秘密可能最终被页面调度以不加密的方式储存到硬盘上。例如,如果一个用户的私人密钥正常情况下是以加密的方式保存在磁盘上的,一个在内存中为加密的密钥备份最后保存在了交换文件中。在一个高度注重安全的环境中,这样做可能是不能被接受的。这样的应用程序可以请求将密钥一直保留在物理内存上。当然,改变内核的行为会导致系统整体性能的负面影响。当页面被锁定在内存中,一个应用程序的安全性可能提高了,但这能使得另外一个应用程序的页面被交换出去。如果内核的设计是值得信任的,它总是最优地将页面交换出去(看上去将来最不会被使用的页面)。
如果不希望某进程使用交换空间,可以对该进程进行内存锁定。相关函数如下:
#include <sys/mman.h>
int mlock(const void *addr,size_t length)
int munlock(void *addr,size_t length)
int mlockall(int flag)
int munlockall(void)