C++ 如何避免将mmaped区域中的页面写回磁盘?

C++ 如何避免将mmaped区域中的页面写回磁盘?,c++,mmap,C++,Mmap,我对文件使用内存映射,然后将其内容更新为数组 我发现在更新过程中,脏页被写回磁盘,导致了巨大的磁盘I/O,这是我想要避免的 我尝试使用mlock将页面锁定在内存中。但它仍然会写回脏页 我怎样才能做到这一点?(我在C++ Linux中编程)/p>页面被写到磁盘的频率多久?这取决于系统的可用内存大小和内核配置。我只想确保没有一页被写回磁盘:如果系统内存有限,必须调出一些页面,并且如果选择要调出的页面是mmap中的一个页面,那么操作系统最好(也是正确的方式)将页面重写到读取页面的磁盘位置。听起来,分配

我对文件使用内存映射,然后将其内容更新为数组

我发现在更新过程中,脏页被写回磁盘,导致了巨大的磁盘I/O,这是我想要避免的

我尝试使用mlock将页面锁定在内存中。但它仍然会写回脏页


我怎样才能做到这一点?(我在C++ Linux中编程)/p>页面被写到磁盘的频率多久?这取决于系统的可用内存大小和内核配置。我只想确保没有一页被写回磁盘:如果系统内存有限,必须调出一些页面,并且如果选择要调出的页面是mmap中的一个页面,那么操作系统最好(也是正确的方式)将页面重写到读取页面的磁盘位置。听起来,分配一个足够大的缓冲区并将该文件读取到该缓冲区会更好。用这个。最后只需将内容写回文件。Linux脏页缓存会在超时后自动刷新,除非更改整个系统的超时时间,否则无法调整行为。超时由
sysctl
vm.dirty\u expire\u厘秒控制。这个答案适用于当前的内核v4.19。如果有人为
userfaultfd
实现
UFFDIO\u REGISTER\u MODE\u WP
,我认为您可以接近模拟您想要的。您始终可以自己对mlock()内存执行所有IO操作。
userfaultfd
功能只允许您检测未更改的页面并跳过它们,至少我希望如此。页面写入磁盘的频率是多少?这取决于系统的可用内存大小和内核配置。我只想确保没有一页被写回磁盘:如果系统内存有限,必须调出一些页面,并且如果选择要调出的页面是mmap中的一个页面,那么操作系统最好(也是正确的方式)将页面重写到读取页面的磁盘位置。听起来,分配一个足够大的缓冲区并将该文件读取到该缓冲区会更好。用这个。最后只需将内容写回文件。Linux脏页缓存会在超时后自动刷新,除非更改整个系统的超时时间,否则无法调整行为。超时由
sysctl
vm.dirty\u expire\u厘秒控制。这个答案适用于当前的内核v4.19。如果有人为
userfaultfd
实现
UFFDIO\u REGISTER\u MODE\u WP
,我认为您可以接近模拟您想要的。您始终可以自己对mlock()内存执行所有IO操作。
userfaultfd
功能只会让你检测到没有更改的页面并跳过它们,至少我希望如此。