【问题标题】:Virtual memory sections and memory mapping area虚拟内存段和内存映射区
【发布时间】:2013-08-07 09:29:51
【问题描述】:

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

Which part of process virtual memory layout does mmap() uses?

我有以下双打:

  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)

--
学习者

【问题讨论】:

    标签: linux


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 2011-05-23
      • 2015-01-26
      • 2016-03-24
      • 1970-01-01
      相关资源
      最近更新 更多