共享内存属于哪里?这意味着它由每个单独的进程拥有,如堆栈和堆。所以,其他程序不能
能够访问其他程序的堆栈。或者它是由任意数量的进程使用的公共内存段。这
下图以图解方式显示了我的问题。
图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 中,每个进程在进程的地址空间内都有一段共享内存。进程 1 和进程 3 访问进程 2 的共享内存。在图 2 中,共享内存
是所有进程都会访问的一段内存。因此,在上述两种情况下,进程使用共享内存
部分。
正确的思考方式是这样的:
- 系统有一定数量的物理内存可供操作系统使用(计算机中的物理 RAM 芯片)
- 每个进程都有一个虚拟地址空间,它不直接对应于物理内存。
- 操作系统可以将其可用的物理内存的任何部分映射到进程的虚拟地址空间中。
基本上,操作系统可以说:“将此物理内存块放入地址 0x12345678 的虚拟地址空间中”。进程虚拟地址空间中的每个数据最终都驻留在物理内存中的某个位置。堆栈、堆、共享内存……在这方面都是一样的。共享内存的唯一区别是多个进程将同一块物理内存映射到它们的地址空间。
秀色可餐:
事实上,事情有点复杂,但这个描述给出了基本的想法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)