共享内存在 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 中是如何在幕后工作的?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置linux的共享内存

共享内存锁定和进程崩溃

如何在unix环境下实现共享内存

如何设置LINUX的共享内存

Windows 进程和 WSL Linux 进程之间的共享内存

如何在工作在同一共享内存区域的两个进程之间共享锁?