第 12 章 在 RHEL for Real Time 上使用 mlock ()系统调用
用于 Real-Time 内存锁定(mlock())函数的 RHEL 支持实时调用进程锁定或解锁指定的地址空间。这个范围可防止 Linux 在交换内存空间时分页锁定的内存。将物理页面分配给页表条目后,对该页面的引用会变得快速。mlock() 系统调用包括两个功能: mlock() 和 mlockall()。同样,munlock() 系统调用包含 munlock() 和 munlockall() 函数。
12.1. mlock ()和 munlock ()系统调用 复制链接链接已复制到粘贴板!
mlock () 和 mlockall () 实时系统调用锁定指定的端口范围,不允许该内存被分页。有两个 mlock () 系统调用组:
-
mlock ()调用:锁定指定的地址范围。 -
munlock ()调用:解锁指定的地址范围。
mlock () 系统调用在地址范围中调用锁定页面,从 addr 开始并继续获取 len 字节。当调用成功时,包含指定地址范围一部分的所有页面都会保留在内存中,直到稍后解锁。
使用 mlockall(),您可以将所有映射的页面锁定到指定的地址范围中。这些都是代码的页、共享内存、内存映射文件等。内存锁定不堆栈。这意味着,被多个调用锁定的任何页面将解锁指定的地址范围或具有单个 munlock() 调用的整个区域。通过 munlockall() 调用,您可以解锁整个程序空间。
特定范围中包含的页面的状态取决于 标志参数中的值。标志 参数可以是 0 或 MLOCK_ONFAULT。
内存锁定不会被通过 fork 继承,并在进程终止时自动删除。
请谨慎使用 mlock()。过度使用可能会导致内存不足(OOM)错误。当某个应用程序较大,或者它有大的数据域时,当系统无法为其他任务分配内存时,mlock() 调用可能会导致大量内存。
当对实时进程使用 mlockall() 调用时,请确保保留了足够的堆栈页面。