2011-07-11 148 views
5

可能重复:
What and where are the stack and heap为什么堆栈大小有限制?

我的Ubuntu安装有8 MB的缺省堆栈大小限制。但我很好奇为什么我们需要限制用户程序的堆栈大小。同一个程序可以通过malloc/mmap等使用其全部4 GB(对于32位程序)可寻址空间。为什么我们需要堆栈大小限制?为什么堆栈不能增长直到它几乎满足堆?

+1

我读了该主题中的前4个答案。它提供了很多有用的信息。但重点在于区分堆栈和堆栈。多次提到堆栈通常在线程开始时确定一个限制。我的问题是为什么这样?堆可以在运行时增长。堆栈和堆都是进程的RAM和虚拟内存的一部分。那么为什么堆栈大小有限? – aufather

回答

3

实际上堆栈确实增长得越来越多。因为在一般情况下它不需要很大,所以它不需要很大。在浪费内存的情况下将其视为非常大的结果。

我不是100%确定如何在Linux上实现堆栈,但在Windows上,堆栈的大量空间是保留。这个数量可以在编译器选项中设置(你可能需要一个更大的堆栈用于深度递归程序)。在运行时,可以通过防护页系统动态扩展堆栈。在堆栈的末尾有一个警卫页面,当它被击中时,它将通过一个额外的页面扩展堆栈并向前推一个警卫页面。

堆栈探测是另一个有趣和相关的概念。所以你的问题是'为什么不能堆栈直到它几乎满足堆?堆栈的确增长了,但是由于大多数时间有一个巨大的堆栈可能是一个不受欢迎的bug的副作用,保留的大小不会很大(尽管这是可设置的)。

This article是非常有趣,并与您的问题相关。