虚拟地址系统上的进程地址空间

时间:2016-08-03 17:12:56

标签: c memory-management operating-system virtual

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

What happens when a computer program runs?

现在假设每个进程获得4GB的虚拟地址空间。现在这意味着这个虚拟地址空间的顶部地址将获得堆栈部分(假设堆栈地址从0开始),底部的地址空间将分配给text,data,globals和heap。由于堆的大小发生变化,新的malloc分配是否会将虚拟地址空间页直接映射到实际内存,还是检查以前分配给堆的虚拟地址页是否空闲/可用。如果我们需要大量的堆内存(例如大于4GB),那么如何处理支持呢?

提前致谢。

1 个答案:

答案 0 :(得分:1)

您链接的答案只是表明可以采取的方式。

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

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

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

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

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

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

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