共享内存在 Linux 中是如何在幕后工作的?
Posted
技术标签:
【中文标题】共享内存在 Linux 中是如何在幕后工作的?【英文标题】:How does shared memory work behind the scene in Linux? 【发布时间】:2017-10-20 09:08:05 【问题描述】:进程 A 使用 shmget 创建了共享内存“1234”。在此之后,进程 A 使用 shmat 将内存附加到自身。
进程 B 还使用 shmat 将对应于 '1234' 的共享内存附加到自身。
现在“附加”到底是什么意思?是否存在相同内存的两个副本?如果不是,那么这段记忆究竟存在于哪里?
【问题讨论】:
【参考方案1】:每个进程都有自己的虚拟内存空间。为了简化一点,你可以想象一个进程有所有可能的内存地址 0x00000000..0xffffffff 可供自己使用。这样做的一个后果是一个进程不能使用分配给任何其他进程的内存——这对于稳定性和安全性都是绝对必要的。
在幕后,内核管理所有进程的分配并将它们映射到物理内存,确保它们不会重叠。当然,实际上并非所有地址都被映射,只有那些正在使用的地址。这是通过页的方式完成的,并借助 CPU 硬件中的内存映射单元。
创建共享内存 (shmget
) 会分配一块不属于任何特定进程的内存。它只是坐在那里。从内核的角度来看,谁使用它并不重要。所以进程必须请求访问它——这就是shmat
的作用。通过这样做,内核会将共享内存映射到进程的虚拟内存空间。这样,进程就可以读取和写入它。因为它是同一个内存,所有“附加”到它的进程看到的内容都是一样的。一个进程所做的任何更改对其他进程也是可见的。
【讨论】:
以上是关于共享内存在 Linux 中是如何在幕后工作的?的主要内容,如果未能解决你的问题,请参考以下文章