在 Linux 中,共享内存是进程间通信(IPC)效率最高的机制之一,其本质是多个进程将同一段物理内存映射到各自的用户空间,从而避免数据复制。Linux 提供两套主要的共享内存实现:基于 System V IPC 的 shmget/shmat 接口,以及基于 POSIX 的 shm_open/mmap 接口,现代应用更推荐使用 POSIX 方案,因其语义清晰且与文件系统集成良好。

使用 System V 共享内存 时,主要流程包括创建或获取共享内存标识符、附加内存段、使用完毕后分离并在适当时机删除。典型函数包括 shmget 用于分配或定位共享内存,shmat 用于将段附加到进程地址空间,shmdt 用于分离,shmctl 用于控制与删除。此类共享内存以 key_t 作为全局命名依据,可通过 ftok 或直接指定键值进行标识,权限模型与 IPC 整体一致。
POSIX 风格的 共享内存 更贴近文件操作模型,核心步骤包括调用 shm_open 创建或打开一个名称以 /dev/shm 为根的逻辑对象,使用 ftruncate 设置对象大小,再通过 mmap 将其映射到进程地址空间。解除映射使用 munmap,关闭描述符使用 close,删除对象使用 shm_unlink。该方式支持常规文件权限,且生命周期由内核管理,重启后通常不保留。
在 Linux 系统中,/dev/shm 默认挂载为 tmpfs 文件系统,用于承载 POSIX 共享内存对象与部分匿名映射,其大小受内核参数 SHMMAX、SHMALL 以及挂载容量限制。System V 共享内存的默认上限可通过 /proc/sys/kernel/shmmax、/proc/sys/kernel/shmall 和 /proc/sys/kernel/shmmni 查看或调整,调整后无需重启即可生效,但需注意合理规划以避免资源耗尽。
实际部署中,为确保 共享内存 的正确性与安全性,应显式设置权限与归属,避免使用过于开放的权限如 0666;对多进程并发访问,应引入 信号量 或 互斥机制 以保证一致性;进程退出前务必执行 分离 操作以避免地址空间泄漏;长期运行的服务应妥善管理生命周期,及时删除不再使用的段,防止内核资源泄漏。
调试与观测方面,可通过 ipcs -m 查看当前 System V 共享内存段信息,使用 ipcrm -m 手动删除残留段;POSIX 共享内存对象可直接在 /dev/shm 中列出并检查大小;更底层的状态可通过 /proc/sysvipc/shm 与 /proc/meminfo 中的 Shmem 字段了解系统级使用情况,为容量规划与问题排查提供依据。

查看详情

查看详情