POSIX 共享内存模型
POSIX shared memory model
是否有 POSIX 共享内存(跨进程)的内存模型规范?
我希望有一些东西可以与 C++ 内存模型相媲美,以便回答如下问题:
- 是否有数据竞争的定义?
- 数据竞争是否是未定义的行为(如在 C++ 中)?
- 有什么东西可以限制进程间的内存可见性顺序吗?我知道 pthread_mutex 可以放在共享内存中并被多个进程使用,但这会导致关系发生之前发生吗?
- 记忆障碍起作用了吗?
根据POSIX规范,一个shared memory object定义为
An object that represents memory that can be mapped concurrently into the address space of more than one process.
在Linux平台上,映射时的内存对象等同于匿名映射:这是物理RAM(或交换内存)到虚拟地址space的映射过程。这通常是任何线程或进程的内存。
在 Linux 这样的平台上,您可以预期 atomic 提供的低内存级同步原语将提供进程间同步。根据您的搜索 pthread_mutex 将起作用(可能是因为它们仅在比较和交换循环以及 futex 系统调用方面实现)。但是std::mutex
也可能坏掉
尽管如此,我在 POSIX 规范中没有看到任何禁止文件系统支持共享内存的内容。在这样的平台上,内存同步将被破坏。但是我想应该没有这样的平台吧。
是否有 POSIX 共享内存(跨进程)的内存模型规范?
我希望有一些东西可以与 C++ 内存模型相媲美,以便回答如下问题:
- 是否有数据竞争的定义?
- 数据竞争是否是未定义的行为(如在 C++ 中)?
- 有什么东西可以限制进程间的内存可见性顺序吗?我知道 pthread_mutex 可以放在共享内存中并被多个进程使用,但这会导致关系发生之前发生吗?
- 记忆障碍起作用了吗?
根据POSIX规范,一个shared memory object定义为
An object that represents memory that can be mapped concurrently into the address space of more than one process.
在Linux平台上,映射时的内存对象等同于匿名映射:这是物理RAM(或交换内存)到虚拟地址space的映射过程。这通常是任何线程或进程的内存。
在 Linux 这样的平台上,您可以预期 atomic 提供的低内存级同步原语将提供进程间同步。根据您的搜索 pthread_mutex 将起作用(可能是因为它们仅在比较和交换循环以及 futex 系统调用方面实现)。但是std::mutex
也可能坏掉
尽管如此,我在 POSIX 规范中没有看到任何禁止文件系统支持共享内存的内容。在这样的平台上,内存同步将被破坏。但是我想应该没有这样的平台吧。