5
我的Ubuntu安装有8 MB的缺省堆栈大小限制。但我很好奇为什么我们需要限制用户程序的堆栈大小。同一个程序可以通过malloc/mmap等使用其全部4 GB(对于32位程序)可寻址空间。为什么我们需要堆栈大小限制?为什么堆栈不能增长直到它几乎满足堆?
我的Ubuntu安装有8 MB的缺省堆栈大小限制。但我很好奇为什么我们需要限制用户程序的堆栈大小。同一个程序可以通过malloc/mmap等使用其全部4 GB(对于32位程序)可寻址空间。为什么我们需要堆栈大小限制?为什么堆栈不能增长直到它几乎满足堆?
实际上堆栈确实增长得越来越多。因为在一般情况下它不需要很大,所以它不需要很大。在浪费内存的情况下将其视为非常大的结果。
我不是100%确定如何在Linux上实现堆栈,但在Windows上,堆栈的大量空间是保留。这个数量可以在编译器选项中设置(你可能需要一个更大的堆栈用于深度递归程序)。在运行时,可以通过防护页系统动态扩展堆栈。在堆栈的末尾有一个警卫页面,当它被击中时,它将通过一个额外的页面扩展堆栈并向前推一个警卫页面。
堆栈探测是另一个有趣和相关的概念。所以你的问题是'为什么不能堆栈直到它几乎满足堆?堆栈的确增长了,但是由于大多数时间有一个巨大的堆栈可能是一个不受欢迎的bug的副作用,保留的大小不会很大(尽管这是可设置的)。
This article是非常有趣,并与您的问题相关。
我读了该主题中的前4个答案。它提供了很多有用的信息。但重点在于区分堆栈和堆栈。多次提到堆栈通常在线程开始时确定一个限制。我的问题是为什么这样?堆可以在运行时增长。堆栈和堆都是进程的RAM和虚拟内存的一部分。那么为什么堆栈大小有限? – aufather