什么是共享存储系统
✅ 一、“共享存储系统”这个术语的本质含义
当我们说一个系统是“共享存储系统”,实际上是在传达这样的含义:
- 所有执行流可以访问统一的地址空间(Shared Address Space);
- 不同执行流对同一地址的访问是有语义意义的,即存在一致性保证;
- 并行程序中,多个执行流通过读写共享变量通信与协作;
这不仅是物理上的共享(即某个地址从所有执行流都可访问),还要是语义上的共享(不同执行流看到的值具有一致性逻辑)。
✅ 二、使用“共享存储系统”这个术语的隐含条件
你说得没错,要称之为共享存储系统,至少应该满足以下几类要求:
1. 必须提供缓存一致性协议(Cache Coherence Protocol)
- 否则,不同核对同一地址的值可能永远不同步;
- 程序中共享变量的含义就失效了;
- 通常用 MESI/MOESI 等协议实现。
✅ 必须满足:Write Serialization(对同一地址)
2. 必须定义并实现内存一致性模型(Memory Consistency Model)
- 决定多核系统中,所有地址的读写操作对于各个处理器之间是如何排序和可见的;
- 最弱的模型如 Relaxed Consistency 允许乱序读写;
- 最强如 SC(Sequential Consistency)要求按程序顺序+全局顺序。
✅ 必须满足:读写顺序的语义规范
3. (通常)需要硬件同步机制支持(例如 LL/SC 或 AMO)
- 原子操作(atomic operations)是并行通信和同步的基础;
- 缓存一致性 + 同步原语 才能实现“正确的锁、互斥、信号量”等机制;
- 硬件需保证这些操作的原子性和可见性。
✅ 应提供:至少一些基本同步原语,如 AMO
, LL/SC
, CAS
等。
4. 地址空间必须是统一的,且可见的
- 所有核看到的是同一个地址空间;
- 而不是像分布式系统那样,每个处理器有自己的本地内存,访问他人内存需要显式通信(这就不是共享存储系统了,而是消息传递系统)。
✅ 必须满足:共享地址空间 + 统一可见性
❌ 三、不能轻易将“多核系统”视为“共享存储系统”
因为有很多系统虽然是多核的,但由于没有满足上述条件(特别是缺乏 coherence 或 consistency),就不能称为“共享存储系统”。
比如:
- 某些嵌入式多核芯片,核之间的通信只能靠 mailbox 或 message FIFO,不共享缓存;
- 分布式多处理器系统(如早期 NUMA),虽然地址空间可以映射统一,但内存行为不一致;
- 缺乏 coherence 的系统中,读写顺序完全不保证,不能满足 shared memory 语义。
单CPU下的共享存储系统
单CPU核心数 | 硬件通信模型 | 软件通信模型 | 是否合理/常见? | 说明 |
---|---|---|---|---|
1核 | 共享存储 | 共享存储 | ✅ 非常常见 | 单线程程序,所有变量自然共享,默认编程范式。 |
1核 | 共享存储 | 消息通信 | ✅ 常见 | 用环形缓冲区/队列等方式模拟消息(如 queue 、管道),多线程协作。 |
1核 | 消息通信 | 共享存储 | ❌ 几乎无实际意义 | 模拟共享内存极度复杂,在单核上完全没有需要。 |
1核 | 消息通信 | 消息通信 | TODO | |
多核 | 共享存储 | 共享存储 | ✅ SMP 标准配置 | 多核处理器默认支持共享存储+缓存一致性协议(如 MESI),软件编程可直接共享变量。 |
多核 | 共享存储 | 消息通信 | ✅ 常见 | 应对同步复杂性,多线程程序(OpenMP、pthread)采用基于共享内存实现的消息通信(如队列)。 |
多核 | 消息通信 | 共享存储 | TODO | |
多核 | 消息通信 | 消息通信 | ✅ 常见 | 异构多核,RTOS 使用消息队列/mailbox(如 FreeRTOS)进行任务间通信。 |
- 基于 单核CPU 的共享存储系统 是被谁 共享?
“共享存储系统”的本质不是是否有多个处理器核心,而是是否有多个执行流(threads/processes)**通过**共享地址空间协作。
“A shared memory system refers to a computational model where multiple threads or processes can access a common address space, regardless of whether the system is single-core or multi-core. Hence, even a single-processor system can be a shared memory system, as long as it supports multiple concurrent threads with shared memory access.”
共享存储系统 可以带来什么好处
- 基于共享存储的并行程序 和 针对单处理器系统编写的多线程程序 将可以直接在 共享存储多处理器系统 上运行.
共享存储系统下,系统规模增大而导致的问题
🔍 前言
- 1型: 小规模系统如多核系统(芯片内 SMP)或者通过总线互联的少量多核芯片(主板内 SMP),硬件的复杂度相对较低.
- 提供共享存储的代价随着处理器数量的增加而超线性地增加
- 2型: 为了实现大规模系统,一组共享存储的节点可以互连在一起,将共享存储的抽象实现在节点内而不是节点之间.
🔍 分类说明
- 1型:小规模、物理共享内存系统
- 共享内存由硬件提供,强一致性、低复杂度。
- 芯片或芯片间通过总线或高速互连访问同一物理内存,常用于 SMP 服务器或嵌入式 SoC。
- 内存共享在整个系统内,无节点概念。
- 2型:大规模、逻辑共享内存系统
- 内存共享仅限节点内,节点间共享靠 NUMA 硬件协议或 DSM 软件协议实现。
- 系统规模大(>4芯片或多台主机),为了扩展性牺牲了一致性或延迟。
按照系统规模进行的分类
✅ 各类多处理系统架构分类表(含1型/2型)
分类 | 系统类型 | 架构解释 | 节点 | 节点所在位置 | 互连方式 | 是否真实共享内存 |
---|---|---|---|---|---|---|
1型 | 芯片内 SMP | 多个核心共享统一内存控制器与RAM | 无此概念 | 芯片内 | NoC(Network-on-Chip) | ✅ 全共享,低延迟 |
1型 | 主板内 SMP | 多个芯片共享同一物理 RAM | 无此概念 | 主板内 | QPI / UPI / HyperTransport | ✅ 全共享,稍高延迟 |
2型 | NUMA | 一个芯片+本地RAM组成一个节点,远程访问其他内存存在延迟 | 一个芯片+本地RAM | 主板内 | NUMA互连(如 Infinity Fabric) | ✅ 共享,但非均匀延迟 |
2型 | DSM | 一个主板+RAM+OS组成一个节点,通过网络通信模拟共享 | 一个主板+RAM+OS | 主板外 | 网络互连 + 软件一致性协议 | ❌ 软件模拟共享 |
图解
- NUMA