物理内存上的堆和栈在哪里?

Where is Heap and Stack on Physical Memory?

我通过一些关于堆和堆栈的谷歌搜索阅读,但大多数答案只说它的概念描述,差异。

我对其他事情很好奇。

  1. 正如标题所说,物理内存上的堆和栈在哪里?

  2. 他们的尺寸如何?例如,我在台式机上使用 12 GB 内存,那么 Heap 是多少?堆栈大小是多少?

  3. 这两个不同类型的概念是谁提出来的?

  4. 我可以操纵堆和栈的分配吗?如果它们每个占用 50% 的内存,(如果堆占用 6 GB 内存,在我的情况下堆栈也占用 6 GB 内存),我可以调整它们的大小吗?

  1. as title says, Where is Heap and Stack on Physical Memory?

自从 CPU MMUs to add a layer of indirection between virtual memory and physical memory, heap and stack have been anywhere in physical memory. Ever since modern Operating Systems have implemented ASLR 以来,堆和堆栈也一直在虚拟内存中。

  1. How is their size? For example, I use 12 giga byte memory at my desktop PC, then how much is Heap? and how much is Stack size?

两者都是从小处着手,然后按需发展。在 Unix 上,最大堆栈大小由 ulimit -s 设置,堆大小由 ulimit -d 限制。您可以使用 ulimit -a.

查看您的 Unix OS 默认设置的限制
  1. Who made these 2 different type concept?

我敢打赌这至少可以追溯到 1960 年代。 Wikipedia has a reference from 1960.

  1. Can I manipulate Heap & Stack's allocation? if they take 50% of memory each, (if Heap take 6 giga byte memory, Stack take 6 giga byte too in my case), can I resize them?

如前所述,它们会自行调整大小,或者更准确地说,它们会在 OS 和用户设定的限制范围内按需增长。如果您使用的是 Unix 和 bash.

,请参阅 ulimit 的帮助

1.它可以无处不在。即使在物理内存之外,因为在应用方面没有这样的东西。用户空间中的所有内容都使用 virtual memory,可以映射到 RAMHDD 上的交换区域。抱歉,这里没有某些假设。

2. 它们都是动态增长的,区别在于速度和大小限制:

  • Heap 通常被认为较慢。它是根据应用程序要求分配的。它与RAM甚至更大(paging)的数量一样巨大。

  • Stack 要快得多,因为它 "allocated" 通过堆栈指针的简单移动。它通常有大小限制。例如,在 C++ 中,此限制是在编译阶段设置的(ulimit -s 在 GCC 上,/STACK:reserve/STACK:reserve,commit 在 MSVC 上)。

堆栈通常要小得多,很容易溢出(这就是我们所说的堆栈溢出)。例如,在 C++ 中,您很可能无法执行此操作:

int main()
{
    int large_array[1000000];
    return 0;
}

因为:

虽然这很好:

int main()
{
    int* large_array = new int[1000000]; //allocated from heap
    return 0;
}

3.一些非常聪明的人。

4.仔细阅读第1-3点,你就会知道答案。