物理内存堆和堆栈在哪里?
我通过一些关于堆和堆栈的搜索阅读,但大多数答案只是说明了它的概念描述和差异。
我很好奇其他的事情。
正如标题所说,堆和物理内存堆栈在哪里?
它们的大小如何? 例如,我在台式电脑上使用12千兆字节的内存,那么堆是多少? 以及堆栈大小是多少?
谁制造了这两种不同类型的概念?
我可以操纵堆和堆栈的分配吗? 如果它们每个都占用50%的内存(如果Heap占用6千兆字节内存,Stack在我的情况下占用6千兆字节),我可以调整它们的大小吗?
自从CPU有MMU在虚拟内存和物理内存之间添加一个间接层之后,堆和堆栈就一直存在于物理内存中。 自从现代操作系统实施ASLR以来,堆栈和堆栈也一直存在于虚拟内存中。
两者都从小规模开始并按需求增长。 在Unix上,最大堆栈大小由ulimit -s
设置,堆大小由ulimit -d
限制。 你可以看到你的Unix操作系统默认在ulimit -a
上设置了什么限制。
我敢打赌至少可以追溯到20世纪60年代。 维基百科有一个从1960年的参考。
正如已经说过的那样,他们调整自己的尺寸,或者更准确地说,它们是根据需求增长的,并且在操作系统和用户设定的限度内。 如果您使用的是Unix和bash,请参阅ulimit
帮助。
1.它可以是无处不在。 即使在物理记忆之外,因为在应用方面没有这样的事情。 用户所有内容都使用虚拟内存,可以将其映射到HDD
上的RAM
或交换区域。 这里没有特定的假设,对不起。
2.它们都是动态增长的,区别在于速度和大小限制:
堆通常被认为是较慢的。 它根据应用要求进行分配。 它和RAM
的数量甚至更大(分页)一样巨大。
堆栈速度更快,因为它通过简单移动堆栈指针“分配” 。 它通常有大小限制。 例如,在C ++中,此限制设置为编译阶段(GCC上的ulimit -s
, /STACK:reserve
, /STACK:reserve,commit
MSVC上的/STACK:reserve,commit
)。
堆栈通常要小得多,并且可以很容易溢出(这就是我们所说的堆栈溢出 )。 例如,在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点,你就会知道答案。
链接地址: http://www.djcxy.com/p/2341.html