POSIX 共享内存和 msync
POSIX Shared Memory and msync
我想使用 POSIX 共享内存,我的问题是关于调用 mmap(MAP_SHARED)
.
后 msync()
和 munmap()
的用法
- 是否对一个进程的共享内存段所做的更改在不使用
msync()
的情况下对另一个进程的共享内存段可见?
- 是否对共享内存段所做的更改仅在
msync()
之后的文件中可见?
- 在没有事先使用
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 内存保护和文件访问模式交互”部分。
我想使用 POSIX 共享内存,我的问题是关于调用 mmap(MAP_SHARED)
.
msync()
和 munmap()
的用法
- 是否对一个进程的共享内存段所做的更改在不使用
msync()
的情况下对另一个进程的共享内存段可见? - 是否对共享内存段所做的更改仅在
msync()
之后的文件中可见? - 在没有事先使用
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 内存保护和文件访问模式交互”部分。