mlockall(MCL_CURRENT | MCL_FUTURE)能否阻止分页?何为其可锁定的已映射页面?
mlockall 功能边界与可锁定页面判定规则
一、mlockall(MCL_CURRENT | MCL_FUTURE) 的防分页效果
在调用权限满足、系统允许锁定的内存上限达标时,该调用可以彻底阻止被覆盖的内存页被换出到交换存储(即常规的分页行为)。需要注意的是,如果锁定的内存总量超过了系统允许的上限,调用会直接返回失败,此时不会对任何页面产生锁定效果,也就无法阻止分页。
对应的行为边界和官方手册描述一致:
mlockall() locks all pages mapped into the address space of the calling process. This includes the pages of the code, data, and stack segment, as well as shared libraries, user space kernel data, shared memory, and memory-mapped files. All mapped pages are guaranteed to be resident in RAM when the call returns successfully; the pages are guaranteed to stay in RAM until later unlocked.
两个组合标志位的实际分工:
MCL_CURRENT:锁定调用执行瞬间,当前进程地址空间内已经存在的所有已映射页面MCL_FUTURE:自动纳入调用执行完成后,进程后续新增的所有内存映射页面的锁定范围,无需单独对每块新内存调用mlock
二、可被mlockall锁定的“已映射页面”判定标准
满足以下全部条件的页面,会被纳入mlockall的锁定范围:
- 已经被内核登记进当前进程的虚拟内存区域(VMA)管理结构,即内核已经为对应虚拟地址范围完成了映射登记。这里不需要页面已经实际分配了物理内存帧——哪怕是预留的栈空间、尚未被访问的堆扩展区间,只要落在已登记的VMA边界内,就属于“已映射”范畴,会被锁定;后续访问触发物理内存分配时,内核会直接为该页分配不可换出的物理帧。
- 属于当前调用进程的用户态地址空间范围,不涉及其他进程的地址空间、或者内核空间的非用户态映射部分。
- 未触及系统层面的锁定限制:比如进程的可锁定内存RLIMIT上限、特权机制限制等无法满足锁定要求的场景。
内容的提问来源于stack exchange,提问作者peewee6765
相关产品推荐
相关产品推荐

