在虚拟地址系统上处理地址空间

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

计算机程序运行时会发生什么?

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

提前致谢。


你链接的答案只是表明事情可以完成的方式。

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

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

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

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

将程序段看作是: - 可执行,只读 - 不执行,读/写 - 不执行,只读

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

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

链接地址: http://www.djcxy.com/p/80191.html

上一篇: Process address space on virtual address systems

下一篇: How to calculate memory usage as Task Manager does?