VirtualLock是否真如其文档所述?内存锁定技术相关疑问
嘿,我来帮你捋捋Linux和Windows上内存锁定的门道,刚好在这块踩过不少坑~
Linux平台:mlock系列是你的可靠选择
完全不用怀疑,mlock/mlockall就是你要找的工具,它能实打实把指定内存页钉在物理内存里,绝对不会被交换到磁盘上,完美契合安全需求:
- 锁定单个数据块:用
mlock()函数,传入目标内存的起始地址和要锁定的大小就行,精准控制哪块内存不被换出。 - 锁定整个进程内存:如果想一劳永逸,直接调用
mlockall(MCL_CURRENT | MCL_FUTURE)——MCL_CURRENT会锁进程当前已有的所有内存(堆、栈、共享库都算),MCL_FUTURE则会自动锁定后续新分配的内存。 - 注意权限:普通用户用这个需要提前授权,在
/etc/security/limits.conf里设置memlock参数(比如username hard memlock unlimited),或者以root身份运行进程,不然会返回权限错误。
Windows平台:VirtualLock的争议到底在哪?
官方文档说VirtualLock能把内存页驻留到物理内存直到解锁或进程终止,但实际用起来确实有不少坑,这就是争议的来源:
- 有严格的内存上限:32位进程最多只能锁定约30MB内存,64位进程的上限也和系统物理内存总量挂钩,不是无限锁的。
- 内核的"紧急豁免权":当系统内存极度紧张时,Windows内核有权强制把VirtualLock锁定的页交换出去——这点官方文档其实有隐晦说明,但很多人没留意到,导致实际效果不如预期。
- 只能锁已提交的内存:你得先用
VirtualAlloc分配内存时指定MEM_COMMIT属性,那些只预留(MEM_RESERVE)的内存是锁不了的。 - 要是你对内存锁定的可靠性要求极高,可以试试
CreateFileMapping搭配PAGE_NOCACHE属性,不过这个是针对文件映射内存的方案,需要结合你的具体场景调整。
内容的提问来源于stack exchange,提问作者Faulst
相关产品推荐
相关产品推荐

