写入大于系统内存的内存映射区域?

时间:2014-06-05 20:42:16

标签: c++ windows memory memory-mapped-files

如果我完全将内存映射到大于系统内存的文件并以比磁盘IO更快的速度写入,那么会发生什么?

我是否会耗尽系统内存或写入内存映射内存IO块?

3 个答案:

答案 0 :(得分:4)

这取决于操作系统,但完全可以正常运行。当OS内存映射文件时,它不必急切地将内容加载到内存中,并且在该区域中发生读取或写入时可能会懒惰地获取页面。换句话说,只要您尝试从文件中访问字节,操作系统就可以在该区域中进行分页并分页文件的其他部分(或其他程序中的页面),使其看起来好像数据一直存在。这可能会导致某些程序因分页而减速,但它不必崩溃或锁定系统。

希望这有帮助!

答案 1 :(得分:1)

假设MapViewOfFile将允许您映射大于可用内存的文件的视图,我希望您的某些读取和写入将停止,直到可以解决页面错误。因此,您将受限于可用的I / O带宽。

答案 2 :(得分:1)

您错误地认为您可以比磁盘I / O更快地写入"。

由于您的映射超过了RAM,因此将有不在RAM中的页面。写入它们将导致非致命的错误。操作系统通过挂起您的线程来处理故障,通过写出另一个页面然后在文件的相关部分中进行分页来释放内存。只有在I / O完成后,您的线程才会恢复。

因此,您的线程无法超越磁盘I / O,因为它一直在等待磁盘I / O完成。

当然,如果内存可用,您将无需释放脏页面。但是你仍然会阻止阅读。毕竟,内存映射在页面基础上工作,并且CPU不能在一个指令中写入整个页面。因此,每次写入都必须是页面上的读取 - 修改 - 写入操作。