2

共享内存属于哪里?这意味着它由每个单独的进程拥有,如栈和堆。所以,其他程序不能 能够访问一些其他程序的堆栈。或者它是任何数量的进程都使用的常见内存段。下图 以图解方式显示了我的问题。操作系统中的共享内存段

图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中,共享内存 是被所有进程访问的一段内存。所以,在以上两种情况下,共享内存使用的是 段。

回答

2

考虑这个正确的方法是,像这样:

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

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

秀色可餐:

system memory to virtual address space mapping

在现实中,事情有点复杂,但这种描述给出了基本思路。

2

我怀疑你的一部分混乱是来自术​​语。在64位英特尔之前,数据组织在。术语也用于链接器来描述数据在程序中的组装方式(在32位英特尔中可能会映射到硬件段)。但是,对于您的问题,您应该删除术语

在英特尔64位和大多数非英特尔系统中工作的一般方式是将物理内存分成一些固定大小(例如4K,1K)的页面框架。 CPU的内存管理单元对相同大小的PAGES进行操作。操作系统为包含页面的每个进程设置线性逻辑地址空间。操作系统使用PAGE TABLE将逻辑进程地址空间的页面映射到物理页面框架。

当每个进程运行时,它会看到自己的逻辑地址空间,地址范围为0到任意值。每个进程的地址空间内的页面都映射到物理页面帧,内存管理单元使用页面自动使用页面将逻辑地址转换为使用页面帧的物理内存地址。

该系统保持每个进程免受其他进程的干扰。通常,如果进程X访问逻辑地址Q并且进程Y访问逻辑地址Q,则它们将访问不同的物理内存位置,因为它们的页表将具有不同的映射。

我知道使用逻辑内存转换的每个系统都有能力让多个进程将逻辑页面映射到相同的物理页面:共享内存。进程可以使用这种机制来快速交换数据(以管理与数据同步为代价)。

在这种类型的共享中,物理页面帧不必映射到相同的逻辑地址(通常不是)。

过程X可以映射页面帧P到页A,而 方法Y可以页面帧P映射到网页B

有通常被实现完全不同的共享存储器的另一种形式。处理器或操作系统(在某些处理器上)为系统地址空间定义了一系列逻辑地址。所有进程的地址范围都是相同的,并且所有进程都具有相同的逻辑地址映射到此范围内的物理页面帧。

系统地址受到保护,因此只能在内核模式下访问,因此进程不能彼此混淆。

从网页的角度而不是细分来看。