【问题标题】:Process address space on virtual address systems虚拟地址系统上的进程地址空间
【发布时间】:2016-08-03 17:12:55
【问题描述】:

在下面的链接中,Sdaz MacSkibbons 给出的答案简要概述了虚拟地址系统上的进程地址空间。

What happens when a computer program runs?

现在假设每个进程都有 4GB 的虚拟地址空间。现在这是否意味着这个虚拟地址空间的顶部地址将获得堆栈部分(假设堆栈地址从 0 开始),底部的地址空间将分配给文本、数据、全局和堆。由于堆的大小发生变化,新的 malloc 分配是否会将虚拟地址空间页面直接映射到实际内存,或者他们是否检查先前分配给堆的虚拟地址页面是否空闲/可用。如果我们需要大量的堆内存,比如大于 4GB,那么进程如何支持呢?

提前致谢。

【问题讨论】:

  • 取决于操作系统。使用带有 %p 的 printf 创建一个 C 程序,以打印出局部变量 (stacK) 的地址、分配的 (malloc()) 变量、静态变量的地址(程序数据)和函数的地址(函数指针), ... .部分虚拟地址空间用于操作系统。还有一些与每个正在运行的线程相关的数据(如 rand() 的种子值)(FS 或 GS​​ 段寄存器可用于访问它,或者它可以映射到虚拟地址空间)。

标签: c memory-management operating-system virtual


【解决方案1】:

您链接到的答案只是显示了一种可以完成的方式。

假设您有一个 4GB 的逻辑地址空间,并非所有这些都是有效的,甚至可能是有效的虚拟地址。

该逻辑地址空间的一部分将专用于系统。系统不太可能使用或接近使用专用于它的整个逻辑地址范围。

逻辑地址空间中会有其他区域没有有效的逻辑地址。

接下来,将内存描述为堆和堆栈是一种误导。堆和堆栈只是读/写内存。它们没有什么特别之处,操作系统也不关心内存的用途。

将程序部分视为: - 可执行,只读 - 不执行,读/写 - 不执行,只读

您的第二个问题是关于 malloc。 Malloc 实现管理读/写内存池。 Malloc 尝试通过从池中返回内存来处理内存请求。如果没有足够的可用内存,malloc 将通过将更多的虚拟内存映射到逻辑地址空间来增加池的大小。

如果应用程序需要分配大量内存,它们通常不使用 malloc。他们改为操作系统服务。如果您有 4GB 的地址空间,则不能分配大于 4GB 的块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2011-12-27
    • 1970-01-01
    • 2015-07-27
    • 2012-03-06
    • 2012-11-14
    相关资源
    最近更新 更多