1

我已经使用mmap. 现在我想确保在访问该内存时不会出现页面错误,即我想强制系统实际从硬盘读取数据并将其存储在 RAM 中。我相信一旦数据在那里,我可以防止与mlockall. 但是让系统加载数据的正确方法是什么?

我显然可以对所有页面进行虚拟读取,但这似乎是一个丑陋的 hack。另外,我不想担心编译器太聪明并优化了虚拟读取。

有什么建议么?

4

2 回答 2

5

为什么你认为mlock()mlockall()不会工作?保证受影响的页面在 RAM 中正是它的目的。从手册页引用:

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

您可以使用其他方法,例如要求madvise()将页面加载到 RAM 中,但不能保证内核会遵守这一点,并且即使内核确实将它们引入,也不能保证它们会留在 RAM 中。我相信也不会t 保证页面将保留在 RAM 中。mmap(MAP_POPULATE)

于 2012-05-03T15:56:01.050 回答
4

你正在寻找MAP_POPULATE.

于 2012-05-03T15:52:40.127 回答