2017-10-20 143 views
1

进程A使用shmget创建共享内存'1234'。之后,进程A使用shmat将内存附加到自身。共享内存在Linux环境下如何工作?

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

现在“附加”是什么意思?有两个相同内存的副本存在吗?如果不是,那么这个内存究竟在哪里存在?

回答

0

每个进程都有自己的虚拟内存空间。为了简化一些事情,你可以想象一个进程拥有所有可能的内存地址0x00000000..0xffffffff。这样做的一个后果就是一个进程不能使用分配给任何其他进程的内存 - 这对于稳定性和安全性都是绝对必要的。

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

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