物理内存上的堆和栈在哪里?
Where is Heap and Stack on Physical Memory?
我通过一些关于堆和堆栈的谷歌搜索阅读,但大多数答案只说它的概念描述,差异。
我对其他事情很好奇。
正如标题所说,物理内存上的堆和栈在哪里?
他们的尺寸如何?例如,我在台式机上使用 12 GB 内存,那么 Heap 是多少?堆栈大小是多少?
这两个不同类型的概念是谁提出来的?
我可以操纵堆和栈的分配吗?如果它们每个占用 50% 的内存,(如果堆占用 6 GB 内存,在我的情况下堆栈也占用 6 GB 内存),我可以调整它们的大小吗?
- 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 以来,堆和堆栈也一直在虚拟内存中。
- 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 默认设置的限制
- Who made these 2 different type concept?
我敢打赌这至少可以追溯到 1960 年代。 Wikipedia has a reference from 1960.
- 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,可以映射到 RAM
或 HDD
上的交换区域。抱歉,这里没有某些假设。
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点,你就会知道答案。
我通过一些关于堆和堆栈的谷歌搜索阅读,但大多数答案只说它的概念描述,差异。
我对其他事情很好奇。
正如标题所说,物理内存上的堆和栈在哪里?
他们的尺寸如何?例如,我在台式机上使用 12 GB 内存,那么 Heap 是多少?堆栈大小是多少?
这两个不同类型的概念是谁提出来的?
我可以操纵堆和栈的分配吗?如果它们每个占用 50% 的内存,(如果堆占用 6 GB 内存,在我的情况下堆栈也占用 6 GB 内存),我可以调整它们的大小吗?
- 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 以来,堆和堆栈也一直在虚拟内存中。
- 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
.
- Who made these 2 different type concept?
我敢打赌这至少可以追溯到 1960 年代。 Wikipedia has a reference from 1960.
- 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,可以映射到 RAM
或 HDD
上的交换区域。抱歉,这里没有某些假设。
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点,你就会知道答案。