「锁定物理内存」mlock

相关函数

头文件:

#include 

家族成员:

int mlock(const void *addr, size_t len);
int munlock(const void *addr, size_t len);
int mlockall(int flags);
int munlockall(void);

系统调用 mlock 家族允许程序在物理内存上锁住它的部分或全部地址空间。这将阻止Linux 将这个内存页调度到交换空间(swap space),即使该程序已有一段时间没有访问这段空间。

功能:

一个严格时间相关的程序可能会希望锁住物理内存,因为内存页面调出调入的时间延迟可能太长或过于不可预知。
安全性要求较高的应用程序可能希望防止敏感数据被换出到交换文件中,因为这样在程序结束后,攻击者可能从交换文件中恢复出这些数据。

mlockall

函数原型: int mlockall(int flags);

mlockall函数将调用进程的全部虚拟地址空间加锁。防止出现内存交换,将该进程的地址空间交换到外存上。
mlockall将所有映射到进程地址空间的内存上锁。这些页包括: 代码段,数据段,栈段,共享库,共享内存,user space kernel data,memory-mapped file.当函数成功返回的时候,所有的被映射的页都在内存中。

flags:
MCL_CURRENT ——Lock all pages which are currently mapped into the address space of the process.
表示对所有已经映射到进程地址空间的页上锁。
MCL_FUTURE ——— Lock all pages which will become mapped into the address space of the process in the future. These could be for instance new pages required by a growing heap and stack as well as new memory mapped files or shared memory regions.
表示对所有将来映射到进程地空间的页都上锁。

返回值:
成功:返回0;
错误:返回-1,errno被设置。

函数有两个重要的应用:
real-time algorithms(实时算法) 和 high-security data processing(机密数据的处理)
real-time algorithms:对时间要非常高。
high-security data processing: 如果数据被交换到外存上,可能会泄密

  • 如果进程执行了一个execve类函数,所有的锁都会被删除。
  • 内存锁不会被子进程继承。
  • 内存锁不会叠加,即使多次调用mlockall函数,只调用一次munlock就会解锁

参考

mlock家族:锁定物理内存
mlockall函数

你可能感兴趣的:(C++,c++,linux)