linux - 虚拟内存段和内存映射区

标签 linux

因为进程有虚拟内存,它在运行时被复制到 RAM 中。如前一篇文章所述。

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

enter image description here

我有以下 double :

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

--
学习者

最佳答案

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

关于linux - 虚拟内存段和内存映射区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18099712/

相关文章:

linux - 用于在特定文件夹中查找文件并基于文件的 "age"的 Shell 脚本

c++ - 编写信号处理程序时出现编译器错误(从 ‘void (*)()’ 到‘__sighandler_t {aka void (*) 的无效转换)

linux - $ 导出 CXX g++ 错误 :bash: export: `g++' : not a valid identifier

linux - 无法在linux脚本中获得正确的输出

linux - Linux CSV数据比较

linux - 如何通过两个 ssh 跃点将远程目录挂载到本地计算机

Java 使用 Java 进程构建器执行 bash 脚本

linux - Bluez,从源代码制作之前卸载?

PHP exec() 函数和 .history 文件

python - 使用Python统计所有文件夹/子文件夹中的所有文件