我想使用POSIX共享内存,我的问题是在调用mmap(MAP_SHARED)
之后如何使用msync()
和munmap()
。
- 如果没有使用
msync()
,一个进程对共享内存段所做的更改是否对另一个进程的共享内存段可见? - 只有在调用
msync()
之后,共享内存段中所做的更改才会在文件中可见吗? - 在未使用
msync()
的情况下取消映射共享内存段时,更改是否得到保存?
我认为msync()
只有在应用更改到底层文件而不是共享内存时才有用。
我想使用POSIX共享内存,我的问题是在调用mmap(MAP_SHARED)
之后如何使用msync()
和munmap()
。
msync()
,一个进程对共享内存段所做的更改是否对另一个进程的共享内存段可见?msync()
之后,共享内存段中所做的更改才会在文件中可见吗?msync()
的情况下取消映射共享内存段时,更改是否得到保存?我认为msync()
只有在应用更改到底层文件而不是共享内存时才有用。
POSIX
请查看msync(2)
:
MS_ASYNC
或MS_SYNC
调用msync()
。close()
/munmap()
之前未调用msync()
,则所做的更改可能会被删除。这允许旧的实现为内存映射(也称页面缓存)和文件 I/O(也称缓冲区缓存)使用单独的缓存。
现代实现
现代实现(例如现代 Linux)通常实现“统一虚拟内存模型”,该模型使用相同的缓存进行内存映射和 I/O。 POSIX 或 SUSv3 不要求这样做。
在这样的实现中:
close()
/munmap()
之前未调用msync()
,则所做的更改不会被删除。MS_ASYNC
是一个无操作。MS_SYNC
就像 fsync()
。在 Linux 中,msync()
只是另一个接口,用于调用fsync()
而已。请查看msync(2)
手册页和此线程。
参考
请查看《Linux 编程接口》第49.4.4节 "Memory Protection and File Access Mode Interactions"。