第 12 章 在 RHEL for Real Time 中使用 mlock ()系统调用
RHEL for Real-Time 内存锁定(mlock())函数可让实时调用进程锁定或解锁指定的地址空间范围。这个范围可防止 Linux 在交换内存空间时分页锁定的内存。将物理页面分配给页表条目后,对该页面的引用就会变得快速。mlock () 系统调用包含两个函数: mlock () 和 mlockall ()。同样,munlock () 系统调用包含 munlock () 和 munlockall () 函数。
12.1. 使用 mlock ()系统调用锁定页面 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
实时 mlock () 系统调用使用 addr 参数指定地址范围的开头,len 则以字节为单位定义地址空间长度。alloc_workbuf () 函数动态分配内存缓冲区并锁定它。内存分配由 posix_memalig () 函数完成,以将内存区域与页面保持一致。函数 free_workbuf () 解锁内存区域。
先决条件
-
您有 root 特权或
CAP_IPC_LOCK功能在大型缓冲区上使用mlockall ()或mlock ()
流程
以下代码使用
mlock ()系统调用锁定页面:#include <stdlib.h> #include <unistd.h> #include <sys/mman.h> void *alloc_workbuf(size_t size) { void *ptr; int retval; // alloc memory aligned to a page, to prevent two mlock() in the same page. retval = posix_memalign(&ptr, (size_t) sysconf(_SC_PAGESIZE), size); // return NULL on failure if (retval) return NULL; // lock this buffer into RAM if (mlock(ptr, size)) { free(ptr); return NULL; } return ptr; } void free_workbuf(void *ptr, size_t size) { // unlock the address range munlock(ptr, size); // free the memory free(ptr); }
验证
成功时,实时 mlock () 和 munlock () 调用返回 0。如果出现错误,则返回 -1 并设置 errno 来指示错误。