如果栈和堆位于一个非常大的虚拟空间中,为什么它们会发生碰撞?

问题描述 投票:0回答:1

如果每个进程都有自己的地址空间,并且它比计算机的物理内存大得多,为什么我们不能将堆栈放在这个地址空间末端,将堆放在一开始,保持彼此的成长方向?在这种情况下,我们不会出现堆栈与堆冲突的情况,因为它们在虚拟地址空间中相距很远。我们可以简单地限制它们的大小,以便它们不能请求超过允许的内存。这样就不会出现栈和堆碰撞的问题了。我一直在寻找有关该主题的信息... 虚拟内存中的进程

例如,ChatGPT建议如下: “操作系统必须将堆和栈之间的地址范围存储在页表中,即使不使用虚拟地址,仍然需要将它们记录在表中,并根据需要分配物理地址。如果我们将堆栈和堆相距很远,这会导致内存分配效率低下,因为整个虚拟地址范围都需要在页表中保留”

我不明白为什么?如果ChatGPT的解释有道理,为什么我们需要在页表中记录没有对应物理内存的地址呢?

我想了解栈和堆在内存中是如何排列的以及为什么要这样做。

memory-management heap-memory virtual-memory stack-memory
1个回答
0
投票

我不明白为什么?如果 ChatGPT 的解释有道理,为什么 我们需要在页表中记录没有的地址 对应的物理内存?

拥有虚拟内存的首要目的是能够为进程分配比当前可用的更多的主内存。如果操作系统只记录已经映射到物理内存的虚拟内存,那么就不需要虚拟内存了。

我想了解栈和堆在内存中是如何排列的 为什么要这样做。

堆栈和堆与其他内存区域一样都是普通内存区域。它们在内存架构级别上没有以任何方式排列。进程(包括操作系统的内存管理器)只是有不同的规则。例如,一个进程被分配了一个固定的内存段用于其堆栈,并且该内存段受到保护,不会被堆段增长——这都是在操作系统级别强制执行的。当然,有些旧操作系统没有这样的护栏,进程的堆栈和堆可能会相互冲突。

© www.soinside.com 2019 - 2024. All rights reserved.