![使用 shmget() 共享内存](https://linux22.com/image/203370/%E4%BD%BF%E7%94%A8%20shmget()%20%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98.png)
根据我对共享内存的理解是,它是在两个或多个进程之间共享的内存段。共享内存可以使用 来实现shmget()
。然而,由于任何进程都无法访问不包含在其地址空间中的内存段,因此我们需要将此共享内存附加到进程的地址空间中。根据我对attach这个词的理解,attach意味着我们将这个创建的内存段包含在两个进程的地址空间中,但是,当我打印这个共享内存的起始地址(这是函数shmat()
)我看到每个进程的地址都不同。这让我很困惑,如果共享内存是两个进程之间共享的内存中的单个“容器”,然后它有两个不同的起始地址,该怎么办?这是否意味着第一个进程中的共享内存的内容被复制到另一个进程中的新内存段中?
答案1
您从中返回的地址shmat()
是虚拟地址,任何可以直接用作指针的地址也是如此。虚拟地址是间接的:它们有效地指向地址转换表(页表)它告诉CPU相应的内存是否实际被映射,以及在物理内存中的哪里找到它。在大多数进程相互保护的 Unix 风格多任务系统上,每个进程都有自己的虚拟地址空间。
共享内存是映射到多个进程的虚拟地址空间的一组物理页。由于每个进程可能会以不同的方式使用其虚拟地址空间,因此相同的共享内存很可能会出现在共享它的每个进程内的不同虚拟地址处。否则,已经在所需地址分配了某些内容的进程将无法访问给定的共享内存。
(有些系统的虚拟地址空间在进程之间是相同的;请参阅单地址空间操作系统了解详情。)