【问题标题】:POSIX shared memory modelPOSIX 共享内存模型
【发布时间】:2020-10-18 03:59:24
【问题描述】:

是否有针对 POSIX 共享内存(跨进程)的内存模型规范?

我希望有一些可以与 C++ 内存模型相媲美的东西,以便回答如下问题:

  1. 是否有数据竞争的定义?
  2. 数据竞争是否有未定义的行为(如在 C++ 中)?
  3. 有什么东西可以限制跨进程的内存可见性顺序吗?我知道 pthread_mutex 可以放在共享内存中并由多个进程使用,但这会导致发生在关系之前吗?
  4. 内存屏障会起作用吗?

【问题讨论】:

  • 所以,因为 POSIX 标准是免费在线提供的,所以您确实做了自己的研究。那么你发现了什么?
  • 我不明白最后两点。 Is there something to constrain memory visibility order across processes? 有没有什么东西可以让你从其他进程中读取内存?我不明白 - 你对“约束”这个词到底有什么想法? but does that induce a happens before relation? 你还怎么使用那个互斥锁? Do memory barriers play a roll? 究竟是什么?内存屏障是特定的 cpu 指令,我不希望 POSIX 了解任何硬件特定的细节。
  • 在 Linux 上,POSIX posix 共享内存只是同一物理内存的映射,与两个线程的整个地址空间的情况完全相同,因此将应用相同的内存语义。
  • @KamilCuk 回复:“我不明白——你对“约束”这个词到底有什么想法?” C++ 内存模型 (en.cppreference.com/w/cpp/atomic/memory_order) 声明“在多核系统上没有任何约束,当多个线程同时读取和写入多个变量时,一个线程可以观察到值的变化顺序与另一个线程写入它们的顺序不同。”然后它描述了可以添加到程序中的约束,以确保线程以特定顺序看到内存更改。进程之间是否有类似的内存共享机制?

标签: c++ linux posix shared-memory


【解决方案1】:

根据 POSIX 规范,shared memory object 定义为

表示内存的对象,可以同时映射到多个进程的地址空间中。

在 Linux 等平台上,映射时的内存对象等效于匿名映射:这是物理 RAM(或交换内存)到进程的虚拟地址空间的映射。这通常是任何线程或进程的内存。

在 Linux 等平台上,您可以期望 atomic 提供的低内存级别同步原语将提供进程间同步。根据您的搜索 pthread_mutex 将起作用(可能是因为它们仅在比较和交换循环和 futex 系统调用方面实现)。但是std::mutex也有可能坏了。

尽管如此,我在 POSIX 规范中没有看到任何禁止共享内存由文件系统支持的内容。在这样的平台上,内存同步会被破坏。但我想不存在这样的平台。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 2011-04-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多