unix - 操作系统中的共享内存段

标签 unix memory memory-management operating-system shared-memory

共享内存属于哪里?这意味着它由每个单独的进程(如堆栈和堆)拥有。所以,其他程序不能 能够访问其他程序的堆栈。或者它是由任意数量的进程使用的公共(public)内存段。这 下图以图表方式显示了我的问题。

图一:

    -----------------       -----------------       -----------------    
    |    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

(或)

图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 中,共享内存 是所有进程都访问的内存段。因此,在上述两种情况下,进程将其用于共享内存 部分。

最佳答案

正确的思考方式是这样的:

  • 系统具有一定数量的物理内存,可供操作系统使用(计算机中的物理 RAM 芯片)
  • 每个进程都有一个虚拟地址空间,不直接对应物理内存。
  • 操作系统可以将其可用的物理内存的任何部分映射到进程的虚拟地址空间中。

基本上,操作系统可以说:“将此物理内存块放入地址 0x12345678 的虚拟地址空间”。进程虚拟地址空间中的每个数据最终都驻留在物理内存中的某个位置。堆栈、堆、共享内存……在这方面都是一样的。唯一区别共享内存的是,多个进程将同一 block 物理内存映射到它们的地址空间。

眼睛糖果:

system memory to virtual address space mapping

实际上,事情要复杂一些,但这个描述给出了基本的想法。

关于unix - 操作系统中的共享内存段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34545631/

相关文章:

objective-c - iOS SDK : first advice for beginners

python - 在 Pandas 中连接两个大型数据集的最佳方法

C++串口问题

UNIX 进程 : fork() and wait()

java - 从 Java 保存到 subversion 存储库

c - 简单的 memcpy 似乎不起作用

c# - 为什么客户端在不同的服务器上使用更多的内存?

读取大型矩阵数据文件的特定行

c - 在Windows和除Linux之外的其他Unice中实现mmap的 `MAP_POPULATE`标志,以及在Windows中实现MADV_WILLNEED

c++ - 是否可以在堆中分配 vector 但通过引用访问?