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