共享内存仅在堆上吗?

cod*_*der 1 c++ operating-system

据我所知,堆栈内存只能由同一进程内的线程共享。

在进程间通信中,进程可以通过shmget()系统调用共享同一段内存。

这个共享内存段可以是什么?一堆还是其他什么?

更新:

在浏览有关堆栈内存和堆内存之间差异的问题后,我提出了这个问题。堆内存可以是通过的共享内存段吗shmget()?也就是说,堆内存可以在多个进程之间共享吗?

更新二:

父进程与其子进程共享同一个堆吗?我在网上找到了一些东西:“父级的堆、代码和库区域由子级共享。一个新的堆栈被分配给子级,并且父级的堆栈被复制到子级的堆栈中。”

这是否意味着不同进程之间共享相同的堆?

“还可能存在一个全局堆(例如,看看 Win32 GlobalAlloc() 系列函数),它在进程之间共享,在系统运行时持续存在,并且确实可用于进程间通信。” 参考:堆内存是每个进程的吗?(或)不同进程共享的公共内存位置?

std*_*bar 5

在 Unix 操作系统中,共享内存位于任何单独的进程空间之外。通过使用shmat,您基本上可以获得指向内核为您分配的某些空间的指针。这些空间可以在进程之间共享,并可以由任意数量的进程附加。就像文件一样,您可以设置权限,以便并非每个进程都可以查看和/或附加到内存。

在这种情况下,共享内存不是传统的堆栈或堆 - 它是内核允许您访问的一块内存(假设有正确的权限)。同样,当内核管理它时,它存在于任何一个进程空间之外。通常,即使没有进程附加到内存,内存仍然处于使用状态。在 Linux 中, anipcs -m显示这些段。