2015-07-21 195 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「。