虚拟内存部分和内存映射区域

时间:2013-08-07 09:29:52

标签: linux

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

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

enter image description here

我有以下双打:

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

1 个答案:

答案 0 :(得分:1)

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