POSIX 共享内存和 msync

Kou*_*ros 4 posix shared-memory

我想使用 POSIX 共享内存,我的问题是关于调用msync()munmap()之后的使用情况mmap(MAP_SHARED)

  1. 在不使用 的情况下,对一个进程的共享内存段所做的更改是否对另一进程的共享内存段可见msync()
  2. 对共享内存段所做的更改仅在之后的文件中可见吗msync()
  3. 当共享内存段在未事先使用的情况下取消映射时,是否会保存更改msync()

我的印象msync()是仅适用于将更改应用于底层文件而不是共享内存。

gav*_*avv 5

POSIX

msync(2)

  • 实现可能会决定更改在其他进程底层文件中不可见,直到msync()使用MS_ASYNC或调用MS_SYNC
  • 如果在/之前未调用,则实现可能会决定放弃更改。msync()close()munmap()

这允许旧的实现使用单独的缓存来进行内存映射(也称为页面缓存)和文件 I/O(又称为缓冲区缓存)。

现代实施

现代实现(例如现代Linux)通常实现“统一虚拟内存模型”,它使用相同的缓存来进行内存映射和I/O。POSIX 或 SUSv3 不需要它。

在这样的实现中:

  • 更改在其他进程和底层文件中立即可见。
  • 如果在/msync()之前未调用,则不会删除更改。close()munmap()
  • MS_ASYNC是一个空操作。
  • MS_SYNC就像fsync()

在 Linux 中,msync()它只是另一个接口,fsync()仅此而已。请参阅msync(2)手册页和此线程

参考

请参阅“Linux 编程接口”的“49.4.4 内存保护和文件访问模式交互”部分。