【问题标题】:How would shared memory IPC (and other IPC) work with multiple CPU?共享内存 IPC(和其他 IPC)如何与多个 CPU 一起工作?
【发布时间】:2012-10-04 18:37:59
【问题描述】:

我正在研究一种架构,其中 2 个 CPU 仅通过共享内存区域和一些 GPIO/IRQ 连接。它们是完全独立的,因此它们不共享任何缓存。然而,计划是让两者在共享内存中的同一个 Linux OS 映像中执行。我想知道共享内存、信号等 IPC 机制如何工作?由于两个 CPU 在同一个 RAM 中执行,只要这些机制保存在 RAM 中,那么我假设当一个 CPU 去检查共享内存区域的状态时,只要没有一致性问题,它就可以工作。在这种设置中信号(软件中断)如何工作?这一切都在RAM中处理吗?会有一致性问题吗?

【问题讨论】:

    标签: ipc shared-memory


    【解决方案1】:

    假设您谈论的是 SMP 配置,即具有多个 CPU 的大多数台式机/低端服务器机器,那么您应该永远不会看到任何一致性问题,尽管您可能会遇到大面积共享内存的性能问题。例如,如果每个处理器(集合 {0, 1})在其缓存中都有一些内存行,并且处理器 0 写入该行,它将更新它的缓存。如果内存位置设置为标记,它应该直写到该内存位置,并且另一个处理器的内存控制器将重新加载或使其对该行的缓存无效。

    这在当代 CPU 中有些复杂,因为每个 CPU 模块都有自己的内存控制器,因此也有自己的专用内存。因此,由芯片内部的内存控制器来协商共享哪些缓存线,如果它们被某些处理器内核修改,则使共享缓存线无效。如果您想知道默认值,您可以阅读MESIF protocol,英特尔至强 CPU 使用它来保持多个处理器模块系统中的缓存一致性。 但底线是,在 SMP 系统中,您永远不应该看到不连贯的共享内存状态 - 只有当多个内核敲击同一内存区域时,性能才会下降。

    【讨论】:

    • 在我的场景中,CPU 是完全独立的子系统,它们不共享 L1 或 L2 缓存。从物理上讲,它们位于通过中介层进行通信的单独骰子上。我不是缓存/架构专家,所以你所说的可能仍然适用,但我相信因此可能存在一致性问题。只读(即说明)应该没问题。
    • 我明白了。许多(大多数?)SMP 系统不共享缓存。例如,在 Nehalem 架构中,每个内核都有自己的 L1 和 L2 缓存,每个模块共享一个 L3 缓存。内存管理单元通过使共享行无效来确保不会发生一致性问题。你运行的是什么系统?是 SMP 吗?
    猜你喜欢
    • 2014-10-08
    • 2012-12-11
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    相关资源
    最近更新 更多