Shared Memory

来自osdev
Zhang3讨论 | 贡献2022年2月6日 (日) 10:24的版本 (创建页面,内容为“共享内存允许其他程序通过共享一块内存来相互影响 == 概念 == 内存保护的概念已成为操作系统设计中公认的概念。 一个特殊的CPU组件,即 MMU (内存管理单元),为每个用户空间应用程序提供 “虚拟” 地址空间。 每个应用程序 “认为” 它都有自己的整个地址空间。 实际上,MMU将每个 “虚拟” 地址映射到 “物理” 地址,通常以 “页面” 为单…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

共享内存允许其他程序通过共享一块内存来相互影响

概念

内存保护的概念已成为操作系统设计中公认的概念。 一个特殊的CPU组件,即 MMU (内存管理单元),为每个用户空间应用程序提供 “虚拟” 地址空间。 每个应用程序 “认为” 它都有自己的整个地址空间。

实际上,MMU将每个 “虚拟” 地址映射到 “物理” 地址,通常以 “页面” 为单位 (IA32体系结构上是4k或2或4MB)。 例如同时一个应用程序的第0页映射到物理地址0x0007 0000,而另一个应用程序的第0页映射到物理地址0x0008 0000。你明白了吧。

这意味着应用程序无法直接相互通信 (传递数据),因为它们在其地址空间中 “几乎是单独的”: 他们必须要求操作系统 kernel 传递消息 (数据)。 (只有内核地址空间中的内核和服务才能看到真实的地址空间)

优势

现在,就时钟周期而言,消息传递 可能是昂贵的。 如果两个 进程 打算密切合作,来回传递消息的惩罚可能会变得很大。 所以另一种选择是共享内存。

为此,要求内核将进程A的某个地址范围映射到与进程B类似大小且地址范围相同的物理地址。 因此,该地址范围在进程A和进程B之间共享。

注意事项

这里有很多事情要考虑: 例如身份验证。 或者,如果共享物理内存未映射到进程A和进程B中的相同虚拟地址范围,则共享内存结构中的任何指针必须是偏移量而不是绝对指针,否则它们将不再指向其他进程的地址空间中的同一事物。 同样,在多处理器系统上,检查另一个进程是否在同时访问内存也很重要。