RHEL for Real Time memory lock (mlock ())系统调用可启用调用进程锁定或解锁指定的地址空间。这可防止 Linux 分页锁定的内存以 swap 空间。将物理页面分配给页表条目后,对该页面的引用相对较快。mlock() 系统调用有两个组: mlock() 和 munlock() 调用。
mlock() 和 munlock() 系统调用锁定并解锁特定进程地址页面。成功时,指定范围内的页面会保持在内存中常驻,直到 munlock() 解锁页面。
mlock () 和 munlock () 调用以下参数:
addr: 指定地址范围的开头。
len :指定地址空间长度(以字节为单位)。
成功时,mlock() 和 munlock() 返回 0。如果出现错误,则返回 -1 并设置 errno 来指示错误。
mlockall() 和 munlockall() 调用锁定或解锁整个程序空间。
注意
使用 mlock() 不保证程序不会遇到页面 I/O。它确保数据保留在内存中,但无法确保它在同一页面中。虽然使用 mlock(),但其他功能(如 move_pages 和 memory compactors)可以移动数据。
内存锁定页面会基于页进行,而不是堆栈。这意味着,如果两个动态分配的内存片段共享相同的页被调用 mlock() 或 mlockall() 锁定两次,则由一个调用将其解锁为 munlock() 或 munlockall()。因此,务必要了解应用程序解锁的页面,以防止双锁定或单一锁定问题。
减少双锁定或单一锁定问题的两个最常用的方案是:
跟踪已分配和锁定的内存区域,创建打包程序功能(在解锁页面之前),验证页面拥有的分配数量。这是设备驱动程序中使用的资源数原则。
执行分配考虑页面大小和协调,以防止在同一页面中出现双锁定。
其他资源
capabilities(7) man page
mlock(2) man page
mlock(3) man page
mlockall(2) man page
mmap(2) man page
move_pages(2) man page
posix_memalign(3) man page
posix_memalign(3p) man page