我的Ubuntu安装的默认堆栈大小限制为8 MB。但我很好奇为什么我们需要限制用户程序的堆栈大小。同一个程序可以通过malloc / mmap等使用它的所有4 GB(32位程序)可寻址空间。那么为什么我们需要一个堆栈大小限制呢?为什么堆栈不会增长直到它几乎遇到堆?
答案 0 :(得分:3)
实际上,堆栈 越来越多。它不需要开始很大,因为在一般情况下,它不需要非常大。拥有它非常大会导致浪费的内存占用。
我不是100%确定如何在Linux上实现堆栈,但在Windows上,堆栈的大量空间保留。可以在编译器选项中设置此数量(对于深度递归程序,您可能需要更大的堆栈)。在运行时,可以通过保护页面系统动态扩展堆栈。在堆栈的末尾有一个保护页面,当被击中时,将通过额外页面扩展堆栈并将保护页面向前推一个。
堆栈探测是另一个有趣且相关的概念。所以你的问题是“为什么堆栈不能长大,直到几乎满足堆积?”堆栈确实增长但是由于大多数时候堆叠很大可能是一个不希望的错误副作用,保留的大小不会很大(尽管这是可设置的)。
This article非常有趣且与您的问题相关。