我在 Linux 中使用 POSIX 函数 mmap()
。但是,当我执行 msync() 时,它是否将缓存的缓冲区完全写入文件,或者以某种方式在某处注明哪些页面已更改,哪些页面未更改,并且写入文件仅发生更改 -即 msync()
是否仅写入更改的页面或整个缓存缓冲区?
假设如果我们使用 mmap()
处理 1 GB 的文件,则读取全部文件,即通过整个文件的内存中引发的大量页面错误。然后我们只更改一个字节,并调用msync()
,然后它将开始将整个1GB记录到文件中或以某种方式确定您想要更改的页面并仅保留它,并且它是如何定义的 - 它是如何做到这一点的??
最佳答案
msync
执行您想要的操作:它只会写入实际已修改的页面。实际上,msync 在 Linux 或任何具有适当虚拟内存和页面缓存系统的系统上很大程度上是无操作的;即使没有 msync,read
也会立即看到写入 mmap
ped 页面的任何内容。它很大程度上类似于 fsync,但使用内存地址范围而不是文件描述符作为其参数。另一种可观察到的影响是它会导致文件修改时间更新。
关于c - msync() 是否只写入更改的页面或完全缓存的缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20133103/