这些系统调用的手册页指出,以整个页面为单位执行内存锁定和解锁。
假设我已经调用mlock(2)
来锁定单个内存页面中的多个地址范围。如果我在这些范围之一上调用munlock(2)
,该锁是否会在整个页面上释放(即隐式解锁页面中的所有其他范围)?还是直到所有地址范围都释放后页面上的锁才会保留?
编辑:为了澄清,我的问题不是关于mlock
的粒度(该手册页在这一部分上非常清楚)。我的问题是关于锁定和解锁单个页面中的多个不同范围。我的问题可以改写如下:
mlocks
的数量超过解锁的数量,页面就保持锁定状态?或munlock
时(无论之前调用过多少mlocks
),内核是否天真地将整个页面解锁? 答案 0 :(得分:1)
如果它锁定或解锁,则会对整个页面进行锁定。 CPU中没有更小的粒度(不考虑有效地禁用的x86分段)。操作系统也不会检查每一个内存访问(这会像进入80年代的计算机一样缓慢)。
内核是否实现一种机制,只要mlock的数量超过解锁的数量,页面就保持锁定状态?
No:
内存锁不会堆叠,也就是说,通过调用mlock()或mlockall()多次锁定的页面将通过对相应范围的munlock()或munlockall()的一次调用来解锁。