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

Var*_*gar 5 shared-memory

进程 A 使用 shmget 创建了共享内存“1234”。此后,进程 A 使用 shmat 将内存附加到自身。

进程 B 还使用 shmat 将与“1234”对应的共享内存附加到自身。

现在“附加”到底是什么意思?是否存在同一内存的两个副本?如果不是,那么这段记忆到底存在于哪里?

jur*_*rez 9

每个进程都有自己的虚拟内存空间。为了稍微简化一下,您可以想象一个进程拥有所有可用的内存地址 0x00000000..0xffffffff。这样做的后果之一是进程不能使用分配给任何其他进程的内存——这对于稳定性和安全性来说绝对重要。

在幕后,内核管理所有进程的分配并将它们映射到物理内存,确保它们不重叠。当然,实际上并不是所有地址都被映射,只有那些正在使用的地址才被映射。这是通过页面并借助 CPU 硬件中的内存映射单元来完成的。

创建共享内存 ( shmget) 会分配一块不属于任何特定进程的内存。它就坐在那里。从内核的角度来看,谁使用它并不重要。因此,一个进程必须请求访问它——这就是 的角色shmat。通过这样做,内核会将共享内存映射到进程的虚拟内存空间。这样,进程就可以读写它了。因为它是相同的内存,所以“附加”到它的所有进程都会看到相同的内容。一个进程所做的任何更改对于其他进程也是可见的。