我已使用mmap
将文件映射到内存中。现在我想确保访问此内存时不会出现页面错误,即我想强制系统实际读取硬盘中的数据并将其存储在RAM中。我相信
一旦数据存在,我就可以阻止使用mlockall
进行交换。但是正确的方法是什么让系统加载数据?
我显然可以对所有页面进行虚拟读取,但这看起来像是一个丑陋的黑客。另外,我不想担心编译器过于聪明并且优化了虚拟读取。
有什么建议吗?
答案 0 :(得分:5)
为什么您认为mlock()
或mlockall()
不起作用?保证受影响的页面在RAM中正是其目的所在。引用联机帮助页:
当呼叫成功返回时,所有包含指定地址范围一部分的页面都保证驻留在RAM中;保证页面保留在RAM中,直到稍后解锁。
你可以使用其他方法,例如madvise()
来询问,以便将页面加载到RAM中,但不能保证内核会遵守这些,并且不保证它们会保留在RAM即使内核确实带入了它。我相信mmap(MAP_POPULATE)
也不能保证页面会保留在RAM中。
答案 1 :(得分:4)
您正在寻找MAP_POPULATE
。