共享内存 vs 分布式内存——它比你想象的更重要

发布: (2026年5月4日 GMT+8 06:00)
5 分钟阅读
原文: Dev.to

Source: Dev.to

什么是共享内存?

在共享内存系统中,所有处理器访问同一块内存空间。
可以把它想象成多个人同时编辑同一个 Google 文档——每个人看到的数据都是一样的,修改会立即可见。

  • 一个全局内存空间
  • 线程之间通信快速
  • 通常更容易编程
  • 需要同步(锁、信号量)

典型使用场景

  • 多核 CPU
  • 基于 OpenMP 的应用
  • 单节点并行作业

局限性:随着核心数量的增加,竞争加剧,内存带宽成为瓶颈,性能可能下降。


什么是分布式内存?

在分布式内存系统中,每个处理器(或节点)拥有自己的私有内存。
想象每个人都有自己的文档,然后通过电子邮件互相发送更新——通信是显式的。

  • 每个节点拥有独立内存
  • 通过消息传递进行通信
  • 控制更细致,但复杂度更高
  • 在多机器之间的可扩展性更好

典型使用场景

  • HPC 集群
  • 基于 MPI 的应用
  • 多节点 Slurm 作业

注意:必须自行管理通信;不良的数据交换设计会严重影响性能。


共享 vs 分布式:真正的区别

内存访问

  • 共享内存:所有内容都位于同一个全局空间。任何线程都可以直接读取或修改数据。隐式通信——线程只需读写同一变量。由于不涉及网络,在小规模时极其快速。上手容易,循环并行化迅速。但当大量线程争夺同一内存时,竞争会成为问题。

  • 分布式内存:每个节点拥有自己的本地内存。要访问其他节点上的数据必须显式请求(例如使用 MPI)。通信是显式的,除非你主动共享,否则没有共享。随着节点数量增加可很好扩展,但要付出网络延迟和带宽的代价。需要从一开始就仔细规划数据分布、通信模式和同步。


为什么这真的很重要

1. 代码设计会改变

  • 共享内存:通常依赖带有并行指令的简单循环。
  • 分布式内存:迫使你思考数据划分、通信模式以及跨节点的同步。同一个问题需要完全不同的思维方式。

2. 扩展并非自动

  • 在 8 核上运行完美的程序,在 100 节点上可能会崩溃。
  • 共享内存受硬件限制;分布式内存则引入网络开销。理解模型有助于预测扩展行为,而不是盲目猜测。

3. 调试成为另一种游戏

  • 共享内存 bug → 竞争条件、死锁。
  • 分布式内存 bug → 卡死、发送/接收不匹配。两者都令人头疼,只是表现不同。

4. 混合模型才是现实

现代 HPC 系统常采用混合模型:

  • 节点之间使用 MPI(分布式)
  • 节点内部使用 OpenMP(共享)

这种组合兼具两者优势,但也让性能调优变得有趣且棘手。


一个简单的类比

  • 共享内存 = 一个厨房,多个厨师。
  • 分布式内存 = 多个厨房,协同配方。

前者更易管理;后者更易扩展。


最后思考

如果你从事 HPC、云扩展或大数据流水线工作,内存架构并非只是技术细节——它是根本的设计决策。忽视它会导致扩展性差、性能不可预测以及难以调试的系统。理解它就能掌握主动权,而在分布式系统中,掌控即是一切。

0 浏览
Back to Blog

相关文章

阅读更多 »

Hello World — 公开构建与学习

我从事后端系统的工作,主要在 .NET 生态圈中,致力于了解系统在规模、故障和现实世界约束下的行为。这个博客是……

让我损失3小时的 asyncio 错误

让我损失了3小时的错误 这件事发生在去年,我在为我们的 internal operations platform 添加 batch domain liveness check 功能时。该 require…