2.3. mlock 系统调用
内存锁定(mlock ())系统调用允许调用进程锁定或解锁指定的地址空间范围,并防止 Linux 分页锁定的内存以交换空间。将物理页面分配给页表条目后,对该页的引用相对快。内存锁定系统调用属于 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 () 系统调用来解锁。因此,务必要了解应用程序解锁的页面,以避免出现双锁或单解锁问题。
以下是缓解双锁或单解锁问题的最常见的临时解决方案:
- 跟踪已分配和锁定的内存区域,并创建打包程序功能,在解锁页面前验证页面分配数量。这是设备驱动程序中使用的资源计数原则。
- 根据页大小和校准进行内存分配,以避免在页面上出现双锁定。