2012-11-13 52 views
5

我目前正在學習包括內存在內的低級別arduino內容。我的問題是堆棧和堆棧在內存的另一側增長,內存不足只會在中間出現某處時發生,或者當其中一個出現在中間時發生。內存不足概念

+7

這就是他們向不同方向發展的全部原因 - 在他們實際發生碰撞之前,你很好。 –

回答

3
  • 沒有的概念,「中間」
  • 取決於如何底層操作系統(如果有的話!)管理過程(如果在平臺上這樣的事情!),堆棧可能具有有限的大小,比「整個內存的其餘部分」要小得多
  • 取決於底層操作系統(如果有的話)管理虛擬內存空間的方式(如果存在這樣的事情該平臺!),堆可能有一個有限的尺寸,小得多的噸韓「整個內存的其餘部分」

如果這些限制中的任何一個到位,那麼這些區域相互會合的可能性非常小。實際上,他們很可能會更快地耗盡空間,而守護機制將會提高軟件例外的相關硬件。

這意味着'內存不足'事件不是一回事。堆棧中有OOM,堆中有OOM。在我的世界中,傳統上,與堆棧有關的部分稱爲StackOverflow :),與堆相關的部分是OutOf [堆]內存。值得注意的是,如果你的平臺有一個虛擬內存的概念,那麼堆棧很可能仍然是一個單獨的空間塊,但堆 - 可能是一個稀疏的構造,並且將包含多個分散的空間塊,而不是必然以某種上升或下降的方式進行物理排序。在這種情況下,任何遇到任何事情都很難說。 StackOverflow發生在堆棧達到大小限制時,並且OutOfMemory在內存管理器在內存空間中找不到合適的空洞時發生。

如果忽略虛擬內存,並且只談論「原始硬件」,那麼它依賴於......堆棧的真正位置。 IIRC(!),在一些(真正的老)平臺上,堆棧被預先分配在位於物理內存開始處的預定義空間中,比如說前十頁,並且「增長到最低點」。然後是幾頁硬件映射表和端口狀態映像,然後剩下的尾部就是堆。通過這樣的設置,當堆棧指針到達時,StackOverflow上升。這非常「聰明」,因爲處理器的狀態標誌檢測零很容易。另外,對於那些舊的處理器來說,到達更低的地址比更高的地址容易得多,所以將經常訪問的堆棧放置在較低的地址處是一個很大的優點。

IIRC(!),較新的平臺沒有這些問題(通常,我們忽略NUMA和類似的東西),以及當前傳統的「原始硬件」設置將特殊區域(表,端口映射等)放在空間的起始處,然後是堆,然後是「空閒區域「,則堆棧和堆棧溢出發生在空閒區域消失時,也就是當堆棧滿足堆中已有的任何塊時。請注意,StackOverflow仍然不意味着OutOfMemory:堆棧可能已經溢出,但堆可能有一些差距,並且仍然可能有很多可用空間!

請注意那些'IIRC'是重要的。我不是Arduino和當前處理器架構方面的專家,而且上面的「歷史」細節可能在更新/更老的方面是相當不錯的。我給它80%的概率爲真。

+0

那流下了一些真光。謝謝 –

1

堆棧具有一定的分配大小,如果超出這個大小,則會發生堆棧緩衝區溢出。

在軟件中,當在調用堆棧上使用太多內存時會發生堆棧溢出。調用堆棧包含有限的內存量,通常在程序開始時確定。

來源Wikipedia