Linux 中共享内存在幕后是如何工作的?
How does shared memory work behind the scene in Linux?
进程 A 使用 shmget 创建了共享内存“1234”。在此之后,进程 A 使用 shmat.
将内存附加到自身
进程 B 还使用 shmat 将对应于“1234”的共享内存附加到自身。
现在 "attach" 到底是什么意思?是否存在相同内存的两个副本?如果不是,那么这段内存到底存在于何处?
每个进程都有自己的虚拟内存space。为了稍微简化一下,您可以想象一个进程拥有所有可能的内存地址 0x00000000..0xffffffff 供自己使用。这样做的一个结果是一个进程不能使用分配给任何其他进程的内存——这对于稳定性和安全性都是绝对必要的。
在后台,内核管理所有进程的分配并将它们映射到物理内存,确保它们不重叠。当然,实际上并不是所有地址都被映射,只有那些正在使用的地址才被映射。这是通过页面完成的,并借助 CPU 硬件中的内存映射单元。
创建共享内存 (shmget
) 会分配一块不属于任何特定进程的内存。它只是坐在那里。从内核的角度来看,谁使用它并不重要。所以进程必须请求访问它——这就是 shmat
的作用。通过这样做,内核会将共享内存映射到进程的虚拟内存 space。这样,进程就可以读写它了。因为它是相同的内存,所以拥有 "attached" 的所有进程都会看到相同的内容。一个进程所做的任何更改对其他进程也是可见的。
进程 A 使用 shmget 创建了共享内存“1234”。在此之后,进程 A 使用 shmat.
将内存附加到自身进程 B 还使用 shmat 将对应于“1234”的共享内存附加到自身。
现在 "attach" 到底是什么意思?是否存在相同内存的两个副本?如果不是,那么这段内存到底存在于何处?
每个进程都有自己的虚拟内存space。为了稍微简化一下,您可以想象一个进程拥有所有可能的内存地址 0x00000000..0xffffffff 供自己使用。这样做的一个结果是一个进程不能使用分配给任何其他进程的内存——这对于稳定性和安全性都是绝对必要的。
在后台,内核管理所有进程的分配并将它们映射到物理内存,确保它们不重叠。当然,实际上并不是所有地址都被映射,只有那些正在使用的地址才被映射。这是通过页面完成的,并借助 CPU 硬件中的内存映射单元。
创建共享内存 (shmget
) 会分配一块不属于任何特定进程的内存。它只是坐在那里。从内核的角度来看,谁使用它并不重要。所以进程必须请求访问它——这就是 shmat
的作用。通过这样做,内核会将共享内存映射到进程的虚拟内存 space。这样,进程就可以读写它了。因为它是相同的内存,所以拥有 "attached" 的所有进程都会看到相同的内容。一个进程所做的任何更改对其他进程也是可见的。