我目前正在學習包括內存在內的低級別arduino內容。我的問題是堆棧和堆棧在內存的另一側增長,內存不足只會在中間出現某處時發生,或者當其中一個出現在中間時發生。內存不足概念
內存不足概念
回答
- 沒有的概念,「中間」
- 取決於如何底層操作系統(如果有的話!)管理過程(如果在平臺上這樣的事情!),堆棧可能具有有限的大小,比「整個內存的其餘部分」要小得多
- 取決於底層操作系統(如果有的話)管理虛擬內存空間的方式(如果存在這樣的事情該平臺!),堆可能有一個有限的尺寸,小得多的噸韓「整個內存的其餘部分」
如果這些限制中的任何一個到位,那麼這些區域相互會合的可能性非常小。實際上,他們很可能會更快地耗盡空間,而守護機制將會提高軟件例外的相關硬件。
這意味着'內存不足'事件不是一回事。堆棧中有OOM,堆中有OOM。在我的世界中,傳統上,與堆棧有關的部分稱爲StackOverflow :),與堆相關的部分是OutOf [堆]內存。值得注意的是,如果你的平臺有一個虛擬內存的概念,那麼堆棧很可能仍然是一個單獨的空間塊,但堆 - 可能是一個稀疏的構造,並且將包含多個分散的空間塊,而不是必然以某種上升或下降的方式進行物理排序。在這種情況下,任何遇到任何事情都很難說。 StackOverflow發生在堆棧達到大小限制時,並且OutOfMemory在內存管理器在內存空間中找不到合適的空洞時發生。
如果忽略虛擬內存,並且只談論「原始硬件」,那麼它依賴於......堆棧的真正位置。 IIRC(!),在一些(真正的老)平臺上,堆棧被預先分配在位於物理內存開始處的預定義空間中,比如說前十頁,並且「增長到最低點」。然後是幾頁硬件映射表和端口狀態映像,然後剩下的尾部就是堆。通過這樣的設置,當堆棧指針到達零時,StackOverflow上升。這非常「聰明」,因爲處理器的狀態標誌檢測零很容易。另外,對於那些舊的處理器來說,到達更低的地址比更高的地址容易得多,所以將經常訪問的堆棧放置在較低的地址處是一個很大的優點。
IIRC(!),較新的平臺沒有這些問題(通常,我們忽略NUMA和類似的東西),以及當前傳統的「原始硬件」設置將特殊區域(表,端口映射等)放在空間的起始處,然後是堆,然後是「空閒區域「,則堆棧和堆棧溢出發生在空閒區域消失時,也就是當堆棧滿足堆中已有的任何塊時。請注意,StackOverflow仍然不意味着OutOfMemory:堆棧可能已經溢出,但堆可能有一些差距,並且仍然可能有很多可用空間!
請注意那些'IIRC'是重要的。我不是Arduino和當前處理器架構方面的專家,而且上面的「歷史」細節可能在更新/更老的方面是相當不錯的。我給它80%的概率爲真。
那流下了一些真光。謝謝 –
- 1. iPhone內存管理概念
- 2. GWT緩存概念
- 3. 內存映射的IO概念細節
- 4. 內容滑塊概念
- 5. 存儲概念iOS - Swift
- 6. CS介紹 - 存儲程序概念 - 無法理解概念
- 7. 概念
- 8. 概念
- 9. 概念
- 10. MVC實現概念(概念(ABAP SAP)
- 11. sqlite概念到coredata的概念?
- 12. 我不明白高內存的概念,我想
- 13. 內存不足
- 14. 內存不足
- 15. 使用面向概念的內存緩存設計
- 16. 虛擬內存是否存在沒有Paging概念?
- 17. 不使用OOPS概念
- 18. 不理解pushViewController的概念
- 19. 多層概念
- 20. Laravel MVC概念
- 21. Xamarin MasterPage概念
- 22. Java ArrayList概念
- 23. Android:ViewHolder概念
- 24. Nodejs Promise概念
- 25. 多態概念
- 26. 界面概念
- 27. C++概念:CRTP
- 28. OAuth2.0的概念
- 29. UML:Multiplicity概念
- 30. 概念:在Python
這就是他們向不同方向發展的全部原因 - 在他們實際發生碰撞之前,你很好。 –