虚拟内存段和内存映射区域

3

进程具有虚拟内存,在运行时将其复制到RAM中。如前一篇文章所述。

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

enter image description here

我有以下双倍:

  1. 如果内存映射位于未分配的内存中,并且它在进程的虚拟内存中。由于虚拟内存有助于避免一个进程触及其他进程的虚拟内存,那么内存映射如何用于进程间通信(IPC)?
  2. 在像Linux这样的操作系统中,每个单独的进程是否有独立的堆栈和内存映射区域,还是所有进程都有一个公共的堆栈和MMAP区域?例如:如果在Linux OS上运行P1、P2和P3进程,则所有进程是否都有如图所示的公共表格,或者每个单独的任务都有各自的表格来处理每个区域?
  3. 在32位系统中,2^32=4GB的虚拟内存是可能的,其中1GB保留给内核,3GB保留给用户空间应用程序。每个单独的进程是否可以拥有高达3GB的虚拟内存,或者所有用户空间应用程序大小之和可能为3GB(即(P1+P2+P3)的虚拟内存大小<=3GB)?

--
学习者

1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接