0
由於每個線程都有自己的堆棧,在以下情況會發生什麼?上下文切換是否會導致堆棧溢出?
- 線程1進行非常深的遞歸調用
- 上下文切換到線程2,線程2生長在堆大量的存儲器
- 上下文切換回線程1
後第3步,堆棧和堆棧之間會發生衝突嗎?當堆上的新塊被分配時,它會檢查每個堆棧嗎?
由於每個線程都有自己的堆棧,在以下情況會發生什麼?上下文切換是否會導致堆棧溢出?
後第3步,堆棧和堆棧之間會發生衝突嗎?當堆上的新塊被分配時,它會檢查每個堆棧嗎?
假設沒有錯誤和邏輯存儲器翻譯與頁保護:
1)存儲器被分配用於堆和存儲器被分配用於堆。沒有可以堆疊或堆疊的內存。
2)線程1的堆棧不會與堆相沖突。
3)線程1可能需要擴展它的堆棧,並且由線程2引起的堆的增長會阻止這種情況發生。
經典模型「堆棧向堆中增長,遇到時溢出」對於多線程不起作用。原因很簡單,有多個堆棧。如果你有虛擬內存和分頁,通常的解決方案是分配一個「保護頁」,當在每個棧下訪問時會導致異常。 – EOF
上下文切換包括將上下文推送到某處 - 可能是堆棧,可能是一個線程描述符,因此問題的答案是特定於實現的。如果是堆棧,並且你接近尾聲,那麼是的。 – mah
我相當肯定「棧向堆增長」很長時間以來一直是錯誤的 - 因爲在MS-DOS和Windows 3.1中可能都是如此。 – immibis