强制加载mmap的页面

时间:2012-05-03 15:45:44

标签: c linux mmap

我已使用mmap将文件映射到内存中。现在我想确保访问此内存时不会出现页面错误,即我想强制系统实际读取硬盘中的数据并将其存储在RAM中。我相信 一旦数据存在,我就可以阻止使用mlockall进行交换。但是正确的方法是什么让系统加载数据?

我显然可以对所有页面进行虚拟读取,但这看起来像是一个丑陋的黑客。另外,我不想担心编译器过于聪明并且优化了虚拟读取。

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

为什么您认为mlock()mlockall()不起作用?保证受影响的页面在RAM中正是其目的所在。引用联机帮助页:

  

当呼叫成功返回时,所有包含指定地址范围一部分的页面都保证驻留在RAM中;保证页面保留在RAM中,直到稍后解锁。

你可以使用其他方法,例如madvise()询问,以便将页面加载到RAM中,但不能保证内核会遵守这些,并且不保证它们会保留在RAM即使内核确实带入了它。我相信mmap(MAP_POPULATE)也不能保证页面会保留在RAM中。

答案 1 :(得分:4)

您正在寻找MAP_POPULATE