2015-07-21 158 views
3

我想使用POSIX共享内存,我的问题是关于调用mmap(MAP_SHARED)msync()munmap()的用法。POSIX共享内存和msync

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

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

回答

2

POSIX

msync(2)

  • 实现可以决定改变也不会在其他进程在底层的文件,直到msync()可见被称为与MS_ASYNCMS_SYNC
  • 执行可能决定如果在close()/munmap()之前没有调用msync(),则更改将被丢弃。

这允许旧的实现针对存储器映射(又名页面缓存)和文件I/O(又名缓冲区缓存)使用单独的缓存。

现代实现

现代的实现(例如现代的Linux)通常实现“统一虚拟存储器模型”,它采用用于存储器映射和I/O相同的高速缓存。这不是POSIX或SUSv3所要求的。

在这样的实现:

  • 的变化是立即其它过程和底层文件可见。
  • 如果在close()/munmap()之前没有调用msync(),则更改不会丢失。
  • MS_ASYNC是无操作的。
  • MS_SYNC就像fsync()

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

参考

看到 “Linux的编程接口”,部分“49.4。4 Memory Protection and File Access Mode Interactions“。