在服务器架构中,“共享内存”通常指进程间通信(IPC)的一种机制,允许多个进程直接访问同一块物理内存区域,从而实现高效的数据交换。它并不是服务器硬件的某种“类型”,而是操作系统提供的一种软件抽象。不过,根据实现方式、应用场景和底层技术,共享内存可以分为以下几种主要类型或模式:
1. POSIX 共享内存(shm_open + mmap)
- 标准:遵循 POSIX.1b(实时扩展),跨 Unix/Linux 系统兼容性好。
- 特点:
- 通过
/dev/shm目录下的命名文件对象创建; - 可持久化(即使无进程连接,内容仍保留直到显式删除);
- 支持权限控制(类似普通文件)。
- 通过
- 典型用途:数据库缓冲池(如 PostgreSQL)、消息队列中间件。
2. System V 共享内存(shmget, shmat, shmdt, shmctl)
- 标准:较老的 UNIX System V IPC 机制,Linux/Unix 仍广泛支持。
- 特点:
- 使用键值(key)标识共享段;
- 需手动管理生命周期(防止泄漏);
- 性能略低于 POSIX,但某些旧系统更稳定。
- 典型用途:遗留企业应用、Oracle RAC 部分组件。
3. 匿名共享内存(Anonymous Shared Memory)
- 创建方式:仅用于父子进程或已 fork 的子进程之间(如 Linux 下
mmap(..., MAP_ANONYMOUS))。 - 特点:
- 不关联文件系统路径;
- 进程终止后自动释放;
- 无法被无关进程访问。
- 典型用途:多线程程序中的数据缓存、容器内进程间通信。
4. 内核级共享内存(Kernel Shared Memory)
- 场景:内核模块与用户空间进程共享内存(如
futex、io_uring的 ring buffer)。 - 特点:
- 由内核分配和管理;
- 高性能、低延迟;
- 常用于网络栈、存储驱动、虚拟化 hypervisor。
- 示例:Linux 的
vmsplice()、DPDK 的 mempool。
5. NUMA 感知共享内存(NUMA-aware Shared Memory)
- 背景:在多路服务器(多 CPU 插槽)中,不同 NUMA 节点内存访问延迟差异大。
- 优化:
- 使用
numactl绑定进程到特定 NUMA 节点; - 动态迁移页(如 Transparent Huge Pages + KSM);
- 避免跨节点访问导致的性能下降。
- 使用
- 典型用途:高频交易、大型内存数据库(如 Redis Cluster、SAP HANA)。
⚠️ 注意事项
- 安全性:共享内存本身不提供加密或访问控制(依赖 OS 权限),敏感数据需额外处理。
- 同步问题:必须配合互斥锁(mutex)、信号量(semaphore)或原子操作,否则易出现竞态条件。
- 替代方案:在现代微服务架构中,gRPC、HTTP/2、Redis/Memcached 等远程调用常替代共享内存以解耦服务。
如果您关注的是云原生环境中的共享内存实践(如 Kubernetes Pod 内共享卷 vs. 内存共享),或特定场景(如 AI 训练中的 GPU-CPU 共享内存),我可以进一步展开说明。
云小栈