两个不相关的进程如何知道相同的密钥来分配相同的共享内存

Posted

技术标签:

【中文标题】两个不相关的进程如何知道相同的密钥来分配相同的共享内存【英文标题】:How two non related process know the same key to allocate same shared memory 【发布时间】:2014-10-26 11:36:46 【问题描述】:

我正在学习共享内存 IPC。我有点怀疑。

第一季度。共享内存用于相关和不相关的进程。并且一个进程使用shemget 函数分配一个共享内存。这个函数的第一个参数是key。。

第二季度。当我们使用shmget and shmat 函数时,新的或现有的(在使用 IPC_CREAT | IPC_EXCL 中)内存被创建并映射到进程内存空间。映射了哪些进程内存(如堆,bss)共享内存。在 shmat 函数中,如果我们传递已经在使用的 shmaddr,那么系统将如何运行。

第三季度。在shmat.中给固定内存addredd的用例是什么

【问题讨论】:

【参考方案1】:

参考1:

两个不相关的进程如何知道相同的密钥来分配相同的共享内存。

他们要么被第三方告知,要么彼此交流。


参考2b:

如果我们在 shmat 函数中传递已经在使用的 shmaddr,那么系统将如何运行。

shmat() 将失败并返回 (void*) -1

【讨论】:

就像将 semid 保存到文件中一样。并且两个进程都可以读取该 ID。 是的,但是有很多可能性可以实现其中一种方法。 @Abhiteshkhatri【参考方案2】:

Re.2a。内存中没有节。节在目标文件中。

更详细地说,典型的类 Unix 系统中进程地址空间的组织不一定与可执行文件/目标文件的组织相对应。如果您在 Linux 系统上查看cat /proc/self/maps 的输出,您将看到一个内存区域列表,其中一些在最后一列中标有文件名,一些未标记,还有一些标有类似[stack] 的字符串, [heap][vdso]。标有可执行文件/DSO 文件名称的区域对应于这些文件中的区域,这些区域可能是也可能不是实际的 textbss 部分(无论如何,在进程内存空间中没有任何部分名称的痕迹)。括号中的特殊区域名称不对应任何文件,它们只是为加载程序已知的某些特定目的而创建的区域。未命名区域通常由mmap 创建,但不附加到任何文件。由shm 函数之一创建的共享内存区域可能会被标记为/dev/zeroSYSVnn,其中nn 是传递给shmget() 的键。

回复。 3. 想到的一种情况是包含内部指针的共享数据结构。

【讨论】:

关于节在目标文件中而不是在内存中的说法既不准确也不澄清。指出进程地址空间中通常还有很多其他空间,并且内核可以以不一定对应于内存组织的编译器/链接器/库概念的方式将页面映射到其中,这将是有帮助的.

以上是关于两个不相关的进程如何知道相同的密钥来分配相同的共享内存的主要内容,如果未能解决你的问题,请参考以下文章

同时打开共享相同指令的2个下拉列表

两个进程可以共享相同的 GPU 内存吗? (CUDA)

子进程怎么操作父进程中的变量

在 Rails 上的模块之间共享类

如何在本机反应中为数组的每个元素分配相同的值。如何在本机反应中制作密钥对数组

如何在多个进程之间共享缓存?