根据我对共享内存的理解,它是一个在两个或多个进程之间共享的内存段。共享内存可以使用shmget()实现。但是,由于任何进程都无法访问未包含在其地址空间中的内存段,因此我们需要将此共享内存附加到进程的入口空间。根据我对附加一词的理解,附加意味着我们将这个创建的内存段包含在两个进程的地址空间中,但是,当我打印这个共享内存的起始地址(即函数shmat()的返回值)时,我发现每个进程的地址是不同的。这让我感到困惑,如果共享内存是两个进程之间共享的内存中的单个“容器”,那么它有两个不同的起始地址?这是否意味着第一个进程中共享内存的内容被复制到另一个进程中的一个新内存段中?
发布于 2022-03-10 05:29:39
从shmat()获得的地址是一个虚拟地址,任何可以直接用作指针的地址都是虚拟地址。虚拟地址是间接的:它们有效地指向地址转换表(页表),它告诉CPU对应的内存是否被映射,以及在物理内存中找到它的位置。在大多数Unix风格的多任务处理系统中,进程之间相互保护,每个进程都有自己的虚拟地址空间。
共享内存是一组物理页面,映射到多个进程的虚拟地址空间。由于每个进程都可能以不同的方式使用其虚拟地址空间,因此相同的共享内存可能会在每个进程内共享它的不同虚拟地址中结束。否则,一个已经在所需地址分配的进程将无法访问给定的共享内存。
(在某些系统中,虚拟地址空间跨进程是相同的;有关详细信息,请参阅单地址空间操作系统。)
https://unix.stackexchange.com/questions/693804
复制相似问题