我已经使用mmap
. 现在我想确保在访问该内存时不会出现页面错误,即我想强制系统实际从硬盘读取数据并将其存储在 RAM 中。我相信一旦数据在那里,我可以防止与mlockall
. 但是让系统加载数据的正确方法是什么?
我显然可以对所有页面进行虚拟读取,但这似乎是一个丑陋的 hack。另外,我不想担心编译器太聪明并优化了虚拟读取。
有什么建议么?
为什么你认为mlock()
或mlockall()
不会工作?保证受影响的页面在 RAM 中正是它的目的。从手册页引用:
调用成功返回时,保证所有包含指定地址范围的一部分的页面都驻留在 RAM 中;这些页面保证保留在 RAM 中,直到以后解锁。
您可以使用其他方法,例如要求madvise()
将页面加载到 RAM 中,但不能保证内核会遵守这一点,并且即使内核确实将它们引入,也不能保证它们会留在 RAM 中。我相信也不会t 保证页面将保留在 RAM 中。mmap(MAP_POPULATE)
你正在寻找MAP_POPULATE
.