虚拟地址系统上的进程地址 space
Process address space on virtual address systems
在下面 link 中,Sdaz MacSkibbons 给出的答案简要概述了虚拟地址系统上的进程地址 space。
What happens when a computer program runs?
现在假设每个进程获得 4GB 虚拟地址space。现在这是否意味着这个虚拟地址 space 的顶部地址将获得堆栈部分(假设堆栈地址从 0 开始),底部地址 space 将分配给文本、数据、全局变量和堆。由于堆的大小发生变化,新的 malloc 分配会将虚拟地址 space 页面直接映射到实际内存,还是检查之前分配给堆的虚拟地址页面是否为 free/available。如果我们需要大量的堆内存,比如大于 4GB,那么进程如何支持呢?
提前致谢。
您 link 的回答只是展示了一种可以完成事情的方法。
假设您有一个 4GB 的逻辑地址 space,并非所有这些地址都是有效的,甚至可能不是有效的虚拟地址。
该逻辑地址的一部分 space 将专用于系统。系统不太可能使用或接近使用专用于它的整个逻辑地址范围。
逻辑地址 space 中的其他区域将没有有效的逻辑地址。
其次,将内存描述为堆和堆栈具有误导性。堆和栈只是read/write内存。它们没有什么特别之处,操作系统不关心内存的用途。
将程序部分视为:
- 可执行,只读
- 不执行,read/write
- 不执行,只读
你的第二个问题是关于malloc的。 Malloc 实现管理 read/write 内存池。 Malloc 尝试通过从池中返回内存来处理内存请求。如果没有足够的可用内存,malloc 将通过将更多虚拟内存映射到逻辑地址 space.
来增加池的大小
如果应用程序需要分配大量内存,通常不会使用malloc。他们代替操作系统服务。如果你有一个 4GB 地址 space,你不能分配大于 4GB 的块。
在下面 link 中,Sdaz MacSkibbons 给出的答案简要概述了虚拟地址系统上的进程地址 space。
What happens when a computer program runs?
现在假设每个进程获得 4GB 虚拟地址space。现在这是否意味着这个虚拟地址 space 的顶部地址将获得堆栈部分(假设堆栈地址从 0 开始),底部地址 space 将分配给文本、数据、全局变量和堆。由于堆的大小发生变化,新的 malloc 分配会将虚拟地址 space 页面直接映射到实际内存,还是检查之前分配给堆的虚拟地址页面是否为 free/available。如果我们需要大量的堆内存,比如大于 4GB,那么进程如何支持呢?
提前致谢。
您 link 的回答只是展示了一种可以完成事情的方法。
假设您有一个 4GB 的逻辑地址 space,并非所有这些地址都是有效的,甚至可能不是有效的虚拟地址。
该逻辑地址的一部分 space 将专用于系统。系统不太可能使用或接近使用专用于它的整个逻辑地址范围。
逻辑地址 space 中的其他区域将没有有效的逻辑地址。
其次,将内存描述为堆和堆栈具有误导性。堆和栈只是read/write内存。它们没有什么特别之处,操作系统不关心内存的用途。
将程序部分视为: - 可执行,只读 - 不执行,read/write - 不执行,只读
你的第二个问题是关于malloc的。 Malloc 实现管理 read/write 内存池。 Malloc 尝试通过从池中返回内存来处理内存请求。如果没有足够的可用内存,malloc 将通过将更多虚拟内存映射到逻辑地址 space.
来增加池的大小如果应用程序需要分配大量内存,通常不会使用malloc。他们代替操作系统服务。如果你有一个 4GB 地址 space,你不能分配大于 4GB 的块。