POSIX共享内存和msync

4

我想使用POSIX共享内存,我的问题是在调用mmap(MAP_SHARED)之后如何使用msync()munmap()

  1. 如果没有使用msync(),一个进程对共享内存段所做的更改是否对另一个进程的共享内存段可见?
  2. 只有在调用msync()之后,共享内存段中所做的更改才会在文件中可见吗?
  3. 在未使用msync()的情况下取消映射共享内存段时,更改是否得到保存?

我认为msync()只有在应用更改到底层文件而不是共享内存时才有用。

1个回答

5

POSIX

请查看msync(2)

  • 实现可以决定更改在其他进程中 底层文件中不可见,直到使用MS_ASYNCMS_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"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接