Linux中共享内存是如何工作的?

4

进程A使用shmget创建了一个名为“1234”的共享内存。之后,进程A使用shmat将内存附加到自身。

进程B也使用shmat将对应于“1234”的共享内存附加到自己上。

那么,“附加”到底是什么意思?是否存在两份相同的内存副本?如果不是,那么这段内存具体存在于哪里呢?

1个回答

7
每个进程都有自己的虚拟内存空间。简单来说,您可以想象一个进程拥有所有可能的内存地址0x00000000..0xffffffff可供使用。这意味着进程不能使用分配给其他进程的内存 - 这对于稳定性和安全性都是绝对必要的。
在幕后,内核管理所有进程的分配并将它们映射到物理内存,确保它们不重叠。当然,并非所有地址实际上都被映射,只有正在使用的地址才会被映射。这是通过页面完成的,并借助CPU硬件中的内存映射单元。
创建共享内存(shmget)会分配一块不属于任何特定进程的内存块。它只是存在那里。从内核的角度来看,使用它的人并不重要。因此,进程必须请求访问它 - 这就是shmat的作用。通过这样做,内核将共享内存映射到进程的虚拟内存空间中。这样,进程就可以读取和写入它。因为它是相同的内存,所有“连接”到它的进程都看到相同的内容。任何进程所做的更改也会对其他进程可见。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接