如果我完全内存映射一个大于系统内存的文件,并且写入比磁盘IO更快,会发生什么情况?
我将耗尽系统内存还是将写入内存映射内存IO块?
这是依赖于操作系统的,但完全可以正确解决这个问题。 当操作系统内存映射文件时,不必急于将内容加载到内存中,并且可以在该区域中进行读取或写入时,懒惰地取出页面。 换句话说,无论何时您尝试访问文件中的字节,操作系统都可以在该区域中进行翻页,并将文件的其他部分(或来自其他程序的页面)分页,使其看起来好像数据一直存在。 这可能会导致一些程序由于分页速度放缓,但它不必崩溃或锁定系统。
希望这可以帮助!
假设MapViewOfFile会让你映射文件的视图大于可用内存,我认为你的一些读写操作将会停止,直到页面错误可以被解决。 因此,您将被限制在可用的I / O带宽。
你错误地认为你可以“写入比磁盘I / O更快”。
由于您的映射超出RAM,将有不在RAM中的页面。 给他们写信将导致一个非致命的错误。 操作系统通过暂停你的线程来处理这个错误,通过写出另外一个页面然后在文件的相关部分分页来释放内存。 只有当I / O完成时,你的线程才会恢复。
所以,你的线程不能超出磁盘I / O,因为它不断地等待磁盘I / O完成。
当然,如果内存可用的话,您不必释放脏页面。 但是你仍然阻止读取。 毕竟,内存映射工作在一个页面上,CPU不能在一个指令中写一个完整的页面。 因此,每一次写入都必然是一个页面上的读取 – 修改 – 写入操作。