进程A使用shmget创建了一个共享内存'1234'。在此之后,进程A使用shmat将内存附加到自身。
进程B还使用shmat将对应于'1234'的共享内存附加到自身。
现在“附加”是什么意思?是否存在两个相同内存的副本?如果没有,那么这个记忆究竟存在于哪里?
答案 0 :(得分:2)
每个进程都有自己的虚拟内存空间。为了简化一点,你可以想象一个进程有自己可用的所有可能的内存地址0x00000000..0xffffffff。这样做的一个结果是进程不能使用分配给任何其他进程的内存 - 这对于稳定性和安全性都是绝对必要的。
在幕后,内核管理所有进程的分配并将它们映射到物理内存,确保它们不重叠。当然,并非所有地址实际上都是映射的,只有那些正在使用的地址。这是通过页面和CPU硬件中的内存映射单元完成的。
创建共享内存(shmget
)会分配一块不属于任何特定进程的内存块。它只是坐在那里。从内核的角度来看,使用它并不重要。因此,流程必须请求访问它 - 这是shmat
的角色。通过这样做,内核将共享内存映射到进程的虚拟内存空间。这样,进程就可以读写它。因为它是相同的内存,所以“附加”它的所有进程都看到相同的内容。进程所做的任何更改对其他进程也是可见的。