版权所有 © 2014 tutorialspoint
#include <sys/mman.h> int mlock(const void *addr, size_t len); int munlock(const void *addr, size_t len); int mlockall(int flags); int munlockall(void);
int mlock(const void *addr, size_t len);
int munlock(const void *addr, size_t len);
int mlockall(int flags);
int munlockall(void);
munlock() 解锁从addr开始,持续len字节的地址范围内的页面。在此调用之后,所有包含指定内存范围一部分的页面都可以由内核再次移动到外部交换空间。
flags 参数是以下一个或多个常量的按位或结果
munlockall() 解锁映射到调用进程地址空间的所有页面。
正在使用mlockall() 来防止页面错误延迟的实时进程应该在进入时间关键部分之前预留足够锁定的堆栈页面,以便函数调用不会导致任何页面错误。这可以通过调用分配足够大的自动变量(数组)并写入该数组占用的内存来实现,以便访问这些堆栈页面。这样,将为堆栈映射足够的页面,并可以将其锁定到 RAM 中。虚拟写入确保在关键部分不会发生复制时写入页面错误。
内存锁不会被通过fork(2)创建的子进程继承,并且会在execve(2)期间或进程终止时自动删除(解锁)。
如果通过munmap(2)取消映射地址范围,则该地址范围上的内存锁会自动删除。
内存锁不会堆叠,即,已通过调用mlock() 或mlockall() 多次锁定的页面将通过对相应范围调用munlock() 或通过munlockall() 解锁。映射到多个位置或由多个进程映射的页面只要至少在一个位置或至少一个进程中被锁定,就会保持锁定在 RAM 中。
从 Linux 2.6.9 开始,对特权进程可以锁定的内存量没有限制,并且RLIMIT_MEMLOCK软资源限制改为定义非特权进程可以锁定的内存量限制。
从内核 2.6.9 开始,如果特权进程调用mlockall(MCL_FUTURE) 并在以后放弃特权(例如,通过将其有效 UID 设置为非零值来丢失CAP_IPC_LOCK功能),则如果遇到RLIMIT_MEMLOCK资源限制,后续的内存分配(例如,mmap(2)、brk(2))将失败。
在提供mlockall() 和munlockall() 的 POSIX 系统上,_POSIX_MEMLOCK 在<unistd.h>中定义为大于 0 的值。(另请参阅sysconf(3)。)
mmap (2)
shmctl (2)
setrlimit (2)
广告