当 mlock 时,来自单个内存页的段如何表现?

How do segments from a single memory page behave when mlock'd?

这些系统调用的手册页指出内存锁定和解锁是以整页为单位执行的。

假设我已调用 mlock(2) 来锁定单页内存中的多个地址范围。如果我在这些范围之一上调用 munlock(2),是否会释放整个页面的锁(即隐式解锁页面中的所有其他范围)?或者在所有地址范围都被释放之前,页面上的锁是否会一直保持?

编辑: 澄清一下,我的问题不是关于 mlock 的粒度(手册页在那部分非常清楚)。我的问题是关于在单个页面中锁定和解锁多个不同的范围。我的问题可以改写如下:

如果它锁定或解锁,它会对整个页面执行此操作。 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().