因为进程有虚拟内存,它在运行时被复制到 RAM 中。如前一篇文章所述。
Which part of process virtual memory layout does mmap() uses?
我有以下 double :
- 如果内存映射在未分配的内存中并且在进程的虚拟内存中。由于虚拟内存有助于避免一个进程接触其他进程的虚拟内存。那么内存映射如何用于进程间通信(IPC)呢?
- 在像 Linux 这样的操作系统中,是否每个单独的进程都有单独的堆、堆栈和内存映射部分,或者所有进程都有一个共同的堆、堆栈和 MMAP 部分?
示例:
如果有 P1、P2 和 P3 进程正在 linux 操作系统上运行。都会有如图所示的公用表,或者每个单独的任务每个部分都有单独的表。 - 在 32 位系统中,2^32=4 GB 的虚拟内存是可能的,1G 字节保留给内核,3 GB 保留给用户空间应用程序。每个单独的进程是否可以拥有最多 3 GB 的虚拟内存,或者所有用户空间应用程序大小的总和可以是 3 GB(即虚拟内存大小为 (P1+P2+P3)<=3 GB)?
--
学习者
最佳答案
- 将内存映射用于 IPC 的工作原理是将相同范围的物理 内存映射到不同进程中的两个或多个虚拟 地址范围。这适用于通信,因为两个进程都使用完全相同的内存单元(尽管它们可能在不同的地址以不同的方式“看到”它们)。您在一个映射中更改一个值,它在不同进程的另一个映射中立即可见,因为它是完全相同的内存。
- 每个进程都有自己独立的栈和堆。操作系统根本不关心这个,它只关心页面。堆和栈是由应用程序(通过运行时)实现的东西。当你调用像
malloc
这样的函数时,运行时的分配器要么返回一个它之前已经保留的 block ,要么返回一个它已经回收的 block (你之前调用了free
),或者它要求操作系统保留更多内存(sbrk
或mmap
)。当您第一次访问此内存时,操作系统会发现一个页面错误并验证您是否被允许访问此位置(因为您已保留它),然后提供一个有效页面。 - 每个进程都可以使用(如在“保留”中)整个可用地址空间(在您的示例中为 3GiB)。这不会干扰任何其他进程。请注意,由于碎片和对齐,并且由于您的可执行文件和堆栈占用了一点点,您实际上无法分配完整的 3 GiB,但您可以接近它。
所有进程一起可以使用系统上可用的虚拟内存(物理 RAM 加上交换空间),但它们只能同时使用可用的物理内存(减去一点点这个那个,比如不可分页的内核内存等等)。
关于linux - 虚拟内存段和内存映射区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18099712/