当前位置: 首页 > 知识库问答 >
问题:

在Linux中,共享内存是如何在幕后工作的?

郭乐湛
2023-03-14

进程A使用shmget创建了一个共享内存“1234”。在此之后,进程A使用SHMAT将内存附加到自身。

“附加”到底是什么意思?是否存在同一内存的两个副本?如果没有,那么这个内存到底存在于哪里?

共有1个答案

芮瑾瑜
2023-03-14

每个进程都有自己的虚拟内存空间。为了稍微简化一下,您可以想象一个进程有所有可能的内存地址0x00000000.0xFFFFFFFF。这样做的一个结果是,进程不能使用分配给任何其他进程的内存--这对于稳定性和安全性都是绝对必要的。

在后台,内核管理所有进程的分配,并将它们映射到物理内存,确保它们不会重叠。当然,实际上并不是所有的地址都被映射,只有那些正在使用的地址才被映射。这是通过页的方式,并在CPU硬件中的内存映射单元的帮助下完成的。

创建共享内存(shmget)会分配不属于任何特定进程的内存块。它就坐在那里。从内核的角度来看,谁使用它并不重要。因此,进程必须请求访问它--这就是shmat的作用。这样,内核将把共享内存映射到进程的虚拟内存空间中。这样,进程就可以读写它。因为它是相同的内存,所有“附加”到它的进程都看到相同的内容。流程所做的任何更改对其他流程也是可见的。

 类似资料:
  • 通过查看shmget()的手动页面,我了解到shmget()调用在内存中分配了#个页面,这些页面可以在进程之间共享。 它是否要创建内核内存页,并将其映射到进程的本地地址空间?还是为该段保留了相同的进程内存页,并将为其他附加进程共享相同的内存页? 调用shmget()时,内核将保留一定数量的段/页。 调用shmat()时,保留的段映射到进程的地址空间/页。 当一个新进程附加到同一段时,前面创建的内核

  • 我在研究Linux内核对共享内存的限制 指定可分配的最大页数。把这个数字看作x,把页面大小看作P。我假设“x*p”字节是系统范围共享内存的限制。 现在,我编写了一个小程序来创建一个共享内存段,并在该共享内存段上附加了两次,如下所示

  • 问题内容: 我的一个项目有一个问题。 我一直在尝试找到一个记录良好的使用共享内存的示例,但没有成功。 基本上情况是,当用户启动程序时,我需要在共享内存中存储两个值: current_path( 它是一个 char )_ 和 file_name( 它也是 _char ) 。 根据命令参数,将启动一个新进程,该进程需要读取和修改存储在共享内存中的 current_path 变量,而 file_name

  • 这篇文章指的是Google ReCaptcha v2(不是最新版本) 最近,谷歌推出了一个简化的“验证码”验证系统(视频),用户只需点击验证码就可以通过验证码。 但是它怎么能仅仅通过点击来区分机器人和人呢?

  • 问题内容: 如何确定将什么进程附加到共享内存段? 即我如何确定shmid 98306附加了哪些两个进程? 问题答案: 我认为您无法使用标准工具来做到这一点。您可以使用获取要附加/分离的 最后一个 进程的进程ID,但是我不知道如何使用来获取 所有 附加的进程。 对于两个进程相连的段,假设它们都 保持 相连,则可以从创建者PID 和最后一个相连的PID中找出这两个进程,但是它们不能扩展到两个以上进程,

  • 问题内容: 该功能在内部如何工作?考虑到内核确实具有访问用户内存空间的特权,它是否使用任何缓冲区还是完成了任何内存映射? 问题答案: 的实现高度依赖于体系结构。 在x86和x86-64上,它只是直接从用户空间地址进行读取并写入内核空间地址,同时如果已配置,则暂时禁用SMAP(超级用户模式访问阻止)。它的棘手部分是将代码放置在特殊区域中,以便页面错误处理程序可以识别其中何时发生错误。发生的内存保护错