mlock'd时,单个内存页中的段的行为如何?

时间:2019-03-23 04:20:38

标签: linux system-calls memory-locking

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

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

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

  • 内核是否实现一种机制,只要mlocks的数量超过解锁的数量,页面就保持锁定状态?或
  • 调用单个munlock时(无论之前调用过多少mlocks),内核是否天真地将整个页面解锁?

1 个答案:

答案 0 :(得分:1)

如果它锁定或解锁,则会对整个页面进行锁定。 CPU中没有更小的粒度(不考虑有效地禁用的x86分段)。操作系统也不会检查每一个内存访问(这会像进入80年代的计算机一样缓慢)。

  

内核是否实现一种机制,只要mlock的数量超过解锁的数量,页面就保持锁定状态?

No

  

内存锁不会堆叠,也就是说,通过调用mlock()或mlockall()多次锁定的页面将通过对相应范围的munlock()或munlockall()的一次调用来解锁。