c - msync() 是否只写入更改的页面或完全缓存的缓冲区?

标签 c linux posix mmap memory-mapped-files

我在 Linux 中使用 POSIX 函数 mmap()。但是,当我执行 msync() 时,它是否将缓存的缓冲区完全写入文件,或者以某种方式在某处注明哪些页面已更改,哪些页面未更改,并且写入文件仅发生更改 -即 msync() 是否仅写入更改的页面或整个缓存缓冲区?

假设如果我们使用 mmap() 处理 1 GB 的文件,则读取全部文件,即通过整个文件的内存中引发的大量页面错误。然后我们只更改一个字节,并调用msync(),然后它将开始将整个1GB记录到文件中或以某种方式确定您想要更改的页面并仅保留它,并且它是如何定义的 - 它是如何做到这一点的?

最佳答案

msync 执行您想要的操作:它只会写入实际已修改的页面。实际上,msync 在 Linux 或任何具有适当虚拟内存和页面缓存系统的系统上很大程度上是无操作的;即使没有 msync,read 也会立即看到写入 mmapped 页面的任何内容。它很大程度上类似于 fsync,但使用内存地址范围而不是文件描述符作为其参数。另一种可观察到的影响是它会导致文件修改时间更新。

关于c - msync() 是否只写入更改的页面或完全缓存的缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20133103/

相关文章:

我可以使用一个进程中的 PTE 来指示物理内存片段以在其他进程中创建适当的 PTE 吗?

c++ - 在静态初始化程序中使用 getenv() 是否安全,即在 main() 之前?

c - 如何使用 fgets 获取第二个整数?

c - 可执行文件之间有什么区别?

linux - 制作 : -c: Command not found

linux - 这里如何应用sed呢?

regex - 是否有支持 PCRE 的 subRegex 版本?

c++ - 列计数和列 decltypes 在 SQLite 预准备语句执行期间是否不变?

objective-c - 模数运算符目标不起作用?

linux - 如何在 Linux 中的另一个进程终止时得到通知