POSIX 共享内存和 msync

POSIX Shared Memory and msync

我想使用 POSIX 共享内存,我的问题是关于调用 mmap(MAP_SHARED).

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

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

POSIX

msync(2):

  • 实施可能决定更改在基础文件中的其他进程中不可见,直到使用[调用msync() =12=] 或 MS_SYNC.
  • 如果 msync()close()/munmap().
  • 之前未调用,则实施 可能 决定放弃更改

这允许旧实现为内存映射(a.k.a 页面缓存)和文件 I/O(a.k.a 缓冲区缓存)使用单独的缓存。

现代实现

现代实现(例如现代 Linux)通常实现 "unified virtual memory model",它使用相同的内存映射缓存和 I/O。 POSIX 或 SUSv3 不需要它。

在这样的实现中:

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

在Linux中,msync()只是fsync()的另一个接口而已。参见 msync(2) manual page and this thread

参考

参见 "The Linux Programming Interface",“49.4.4 内存保护和文件访问模式交互”部分。