使用shmget()
,我们可以分配一定大小(以字节为单位)的共享内存块,并使用shmat()
,我们将此共享内存块附加到调用进程的地址空间。
我需要检查我的理解:
我们有一个进程使用和创建并连接一个共享内存shmget()
,shmat()
另一个进程使用将该共享内存附加到其地址空间shmat()
。
现在这个共享内存的返回地址(使用shmat()
)在两个进程中是不同的,因为这是一个虚拟地址。
然而,共享内存块本身具有单个基本物理地址,该地址映射到共享该内存的进程的不同虚拟地址。它是否正确?
答案1
对,那是正确的。这是一个想法共享内存不同的进程可以映射相同的实际内存;由于虚拟寻址,这些地址不必相同。
您甚至可以将相同的共享内存页面两次映射到同一进程的不同地址 - 例如,GNU Radio(经典)就是这样的双映射缓冲区以模拟环形缓冲区,其中在末尾写入意味着在开头写入。