You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于进程共享内存挂载至地址空间及shmat的疑问

关于共享内存挂载与shmat()的核心问题解答

首先得明确一个基础概念:每个进程都有独立的虚拟地址空间。进程平时读写内存用的都是虚拟地址,CPU会通过页表把虚拟地址转换成物理地址,才能真正访问硬件内存。

为什么光知道共享内存的物理起始地址没用?

shmget()只是在系统层面申请了一块物理内存,返回的shmid是这块内存的系统级标识——但此时这块物理内存和任何进程的虚拟地址空间都没有关联。进程的CPU指令只能识别自己的虚拟地址,没有映射的话,直接用物理地址访问会触发地址错误(CPU根本不认识这个地址)。

“将共享内存挂载到进程地址空间”到底是什么意思?

就是通过shmat()函数,把这块共享的物理内存,映射到当前进程虚拟地址空间的某个空闲区域。完成映射后,进程就可以用这个虚拟地址来读写对应的物理内存,进而和其他挂载了同一块共享内存的进程交换数据。

挂载时实际发生了什么?

  • 操作系统会在当前进程的虚拟地址空间中,找到一块大小合适且未被使用的区域;
  • 修改该进程的页表(虚拟地址与物理地址的映射表),把刚才选定的虚拟地址范围,和共享内存对应的物理内存地址范围绑定;
  • 内核更新共享内存的引用计数,记录有多少进程挂载了它——只有当引用计数降到0时,这块共享内存才会被系统真正回收。

shmat()返回的是谁的地址?

返回的是调用该函数的进程自己的虚拟地址。不同进程挂载同一块共享内存时,得到的虚拟地址大概率不一样,但这些虚拟地址最终都会映射到同一块物理内存。比如进程P1挂载后得到0x12340000,进程P2挂载后得到0x56780000,但读写这两个地址,本质上都是操作同一块物理内存,所以P1写入的数据P2能直接读到。


内容的提问来源于stack exchange,提问作者It's probable

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:20:22