共享内存属于哪里?这意味着它由堆栈和堆等每个单独的进程拥有。所以,其他程序不能 能够访问其他程序的堆栈。或者它是一个常见的内存段,可供任意数量的进程使用。该 下图以图解方式显示了我的问题。
图1:
----------------- ----------------- -----------------
| stack | | stack | | stack |
| | | | | |
| Shared m/y | --->| Shared m/y |<--- | Shared m/y |
| | | | | | | |
| heap | | | Heap | | | Heap |
| | | | | | | |
| Data segment | | | Data segment | | | Data segment |
| | | | | | | |
| text |___| | text | |___| text |
----------------- ----------------- -----------------
Process 1 Process 2 Process 3
(OR)
图2:
-----------------------------------------
| |
| |
| Shared Memory |<--
------->| | |
| | | |
| ----------------------------------------- |
| ^ |
| | |
----------------- ----------------- -----------------
| stack | | stack | | stack |
| | | | | |
| heap | | Heap | | Heap |
| | | | | |
| Data segment | | Data segment | | Data segment |
| | | | | |
| text | | text | | text |
----------------- ----------------- -----------------
Process 1 Process 2 Process 3
在图1中,每个进程在进程的地址空间中都有一段共享内存。在进程2的共享内存上由进程1和进程3访问。在图2中,共享内存 是一段内存,可供所有进程访问。因此,在上面两个场景中,进程用于共享内存 分割。
答案 0 :(得分:2)
正确的思考方式是这样的:
基本上,操作系统可以说:“将此物理内存块放入地址0x12345678的虚拟地址空间”。进程虚拟地址空间中的每个数据最终都位于物理内存中的某个位置。堆栈,堆,共享内存,......在这方面都是一样的。区分共享内存的唯一方法是多个进程将相同的物理内存映射到其地址空间。
眼睛糖果:
实际上,事情有点复杂,但这种描述给出了基本的想法。
答案 1 :(得分:2)
我怀疑你的部分困惑来自术语。在64位之前的英特尔中,数据以段组织。术语段也用于链接器,用于描述如何在程序中组装数据(在32位Intel中可以映射到硬件段)。但是,对于您的问题,您应该删除术语细分。
英特尔64位和大多数非英特尔系统的一般工作方式是将物理内存划分为某些固定大小的PAGE FRAMES(例如4K,1K)。 CPU的存储器管理单元在相同大小的PAGES上操作。操作系统为包含页面的每个进程设置线性逻辑地址空间。操作系统使用PAGE TABLE将逻辑进程地址空间的页面映射到物理页面帧。
当每个进程运行时,它会看到自己的逻辑地址空间,其地址范围为0到任意值。每个进程的地址空间中的页面都映射到物理页面帧,内存管理单元使用页面表自动使用页面框架从逻辑地址转换为物理内存地址。
该系统使每个过程都不会弄乱其他过程。通常,如果进程X访问逻辑地址Q并且进程Y访问逻辑地址Q,则它们将访问不同的物理内存位置,因为它们的页表将具有不同的映射。
我所知道的每个使用逻辑内存转换的系统都能够让多个进程将逻辑页面映射到相同的物理页面框架:共享内存。进程可以使用此机制快速交换数据(代价是管理与该数据的同步)。
在这种类型的共享中,物理页面框架不必映射到相同的逻辑地址(通常不是)。
进程X可以将页面框架P映射到页面A. 处理Y可以将页面帧P映射到页面B
另一种形式的共享内存通常以完全不同的方式实现。处理器或操作系统(在某些处理器上)为系统地址空间定义了一系列逻辑地址。所有进程的地址范围都相同,并且所有进程在此范围内具有相同的逻辑地址到物理页面帧的映射。
系统地址受到保护,因此只能在内核模式下访问,因此进程不能相互混淆。
在这里考虑页面而不是段。
答案 2 :(得分:0)
在共享内存模型中,建立了由协作进程共享的内存区域。然后,进程可以通过将数据读写到共享区域来交换信息。
共享内存区域位于创建共享内存段的进程的地址空间中。希望使用此共享内存段进行通信的其他进程必须将其附加到其地址空间。通常,操作系统会尝试阻止一个进程访问另一进程的内存(病毒试图破坏这一进程)。共享内存要求两个或更多进程同意删除此限制。然后,他们可以通过在共享区域中读写数据来交换信息。数据的形式和位置由这些过程决定,并且不受操作系统的控制。这些进程还负责确保它们不会同时写入同一位置。