第 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()
调用时,请确保保留了足够的堆栈页面。