当 mlock 时,来自单个内存页的段如何表现?
How do segments from a single memory page behave when mlock'd?
这些系统调用的手册页指出内存锁定和解锁是以整页为单位执行的。
假设我已调用 mlock(2)
来锁定单页内存中的多个地址范围。如果我在这些范围之一上调用 munlock(2)
,是否会释放整个页面的锁(即隐式解锁页面中的所有其他范围)?或者在所有地址范围都被释放之前,页面上的锁是否会一直保持?
编辑: 澄清一下,我的问题不是关于 mlock
的粒度(手册页在那部分非常清楚)。我的问题是关于在单个页面中锁定和解锁多个不同的范围。我的问题可以改写如下:
- 内核是否实现了一种机制,只要
mlocks
的次数超过解锁次数,页面就会保持锁定状态?或
- 当调用单个
munlock
时,内核是否会天真地解锁整个页面(无论之前调用了多少 mlocks
)?
如果它锁定或解锁,它会对整个页面执行此操作。 CPU 中没有更小的粒度(忽略 x86 分段,它已被有效禁用)。 OS 也不会检查每一个内存访问(就像使用 80 年代的计算机一样慢得令人望而却步)。
Does the kernel implement a mechanism where the page remains locked as long as the number of mlocks exceeds the number of unlocks?
No:
Memory locks do not stack, that is, pages which have been locked several times by calls to mlock() or mlockall() will be unlocked by a single call to munlock() for the corresponding range or by munlockall().
这些系统调用的手册页指出内存锁定和解锁是以整页为单位执行的。
假设我已调用 mlock(2)
来锁定单页内存中的多个地址范围。如果我在这些范围之一上调用 munlock(2)
,是否会释放整个页面的锁(即隐式解锁页面中的所有其他范围)?或者在所有地址范围都被释放之前,页面上的锁是否会一直保持?
编辑: 澄清一下,我的问题不是关于 mlock
的粒度(手册页在那部分非常清楚)。我的问题是关于在单个页面中锁定和解锁多个不同的范围。我的问题可以改写如下:
- 内核是否实现了一种机制,只要
mlocks
的次数超过解锁次数,页面就会保持锁定状态?或 - 当调用单个
munlock
时,内核是否会天真地解锁整个页面(无论之前调用了多少mlocks
)?
如果它锁定或解锁,它会对整个页面执行此操作。 CPU 中没有更小的粒度(忽略 x86 分段,它已被有效禁用)。 OS 也不会检查每一个内存访问(就像使用 80 年代的计算机一样慢得令人望而却步)。
Does the kernel implement a mechanism where the page remains locked as long as the number of mlocks exceeds the number of unlocks?
No:
Memory locks do not stack, that is, pages which have been locked several times by calls to mlock() or mlockall() will be unlocked by a single call to munlock() for the corresponding range or by munlockall().