3

由于进程具有在运行时复制到 RAM 中的虚拟内存。如上一篇文章所述。

mmap() 使用进程虚拟内存布局的哪一部分?

在此处输入图像描述

我有以下双打:

  1. 如果内存映射在未分配的内存中并且它在进程的虚拟内存中。由于虚拟内存有助于避免一个进程接触其他进程的虚拟内存。那么内存映射如何用于进程间通信(IPC)?
  2. 在像 Linux 这样的操作系统中,是否每个单独的进程都有单独的堆、堆栈和内存映射部分,或者所有进程都有一个共同的堆、堆栈和 MMAP 部分?
    示例:
    如果有 P1、P2 和 P3 进程正在 Linux 操作系统上运行。都将有图片中给出的公共表格,或者每个单独的任务对每个部分都有单独的表格。
  3. 在 32 位系统中,2^32=4 GB 的虚拟内存是可能的,其中 1 G 字节为内核保留,3 GB 为用户空间应用程序保留。每个单独的进程是否可以拥有最多 3 GB 的虚拟内存或所有用户空间应用程序大小的总和可以是 3 GB(即 (P1+P2+P3)<=3 GB 的虚拟内存大小)?

--
学习者

4

1 回答 1

2
  1. 使用 IPC 的内存映射通过将相同范围的物理内存映射到不同进程中的两个或多个虚拟地址范围来工作。这适用于通信,因为两个进程都使用完全相同的内存单元(尽管它们可能在不同的地址上以不同的方式“看到”它们)。您在一个映射中更改了一个值,它会立即在不同进程中的另一个映射中可见,因为它是相同的内存
  2. 每个进程都有自己独立的栈和堆。操作系统根本不关心这个,它只关心pages。堆和堆栈是由应用程序(通过运行时)实现的东西。当您调用类似的函数malloc时,运行时中的分配器要么返回它之前已经保留的块,要么返回它已经回收的块(您之前调用free过),或者它要求操作系统保留更多的内存(sbrkmmap)。当您第一次访问此内存时,操作系统会看到页面错误并验证您是否被允许访问此位置(因为您已保留它),然后提供有效页面​​。
  3. 每个进程都可以使用(如“保留”)整个可用地址空间(在您的示例中为 3GiB)。这不会干扰任何其他过程。请注意,由于碎片和对齐,并且由于您的可执行文件和堆栈占用了一点,您实际上将无法分配完整的 3 GiB,但您可以接近它。
    所有进程一起可以使用系统上可用的尽可能多的虚拟内存(物理 RAM 加上交换空间),但它们只能使用同时可用物理内存(减去一点点这个和那个,像不可分页的内核内存等)。
于 2013-08-07T11:42:11.630 回答