gpt4 book ai didi

POSIX 共享内存和 msync

转载 作者:行者123 更新时间:2023-12-02 01:35:20 25 4
gpt4 key购买 nike

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

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

我的印象是 msync() 仅对将更改应用于基础文件而非共享内存有用。

最佳答案

POSIX

参见 msync(2) :

  • 实现可能决定在使用MS_ASYNC 调用msync() 之前,更改在基础文件中的其他进程 中不可见MS_SYNC
  • 如果 close()/munmap()< 之前未调用 msync(),实现可能决定放弃更改

这允许旧实现为内存映射(也称为页面缓存)和文件 I/O(也称为缓冲区缓存)使用单独的缓存。

现代实现

现代实现(例如现代 Linux)通常实现“统一虚拟内存模型”,它使用相同的缓存进行内存映射和 I/O。 POSIX 或 SUSv3 不需要它。

在这样的实现中:

  • 更改会立即在其他进程和基础文件中可见。
  • 如果在 close()/munmap() 之前未调用 msync(),则不会删除更改。
  • MS_ASYNC 是空操作。
  • MS_SYNC 就像 fsync()

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

引用

请参阅“Linux 编程接口(interface)”,“49.4.4 内存保护和文件访问模式交互”部分。

关于POSIX 共享内存和 msync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31539208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com