2.3. mlock 系统调用
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