我已經瞭解到,每個進程都有自己的內存區域/塊,由棧,堆,數據和文本(代碼)組成(見this)。進程堆棧和CPU堆棧有什麼區別?
現在我正在閱讀關於上下文切換的內容。我讀過在上下文切換過程中CPU寄存器被壓入堆棧,然後整個堆棧將被保存到過程控制塊中。這基本上是如何工作的?
爲什麼我需要保存堆棧如果每個進程都有自己的堆棧?
我已經瞭解到,每個進程都有自己的內存區域/塊,由棧,堆,數據和文本(代碼)組成(見this)。進程堆棧和CPU堆棧有什麼區別?
現在我正在閱讀關於上下文切換的內容。我讀過在上下文切換過程中CPU寄存器被壓入堆棧,然後整個堆棧將被保存到過程控制塊中。這基本上是如何工作的?
爲什麼我需要保存堆棧如果每個進程都有自己的堆棧?
完整的堆棧未保存在上下文切換中。進程上下文塊只包含我知道的每個系統上的寄存器值。
堆棧只是一塊內存。沒有什麼特別的。唯一使它成爲堆棧的是堆棧指針寄存器引用它。一個進程可以有多個堆棧。事實上他們通常會這樣做。對於每種處理器模式,進程通常都有一個堆棧。在多線程中,每個線程都有一個堆棧。
當發生上下文切換時,內核引入一個新進程並「彈出」舊進程。但是當一箇舊的進程輪到佔用CPU時,它的前一個狀態(當它被「踢出」時的狀態)必須恢復到從其停止點開始執行。
所有體系結構都有有限的寄存器數量。寄存器也包含在要被驅逐存儲的進程狀態中。將堆棧中的寄存器保存在堆棧中是爲了提高效率,因此您只需要將值彈回即可。
此外,每個進程都有其自己的進程控制塊(PCB),以便在上下文切換中存儲這些值,以便調度算法不受阻礙,並且可以處理一些簡單的進程ID。當進程獲取CPU時,附有該ID的PCB將被恢復。
編輯 據我所知,x86中沒有CPU堆棧。 CPU有堆棧指針指向堆棧的第一個元素。
添加體系結構。它是x86嗎? – Downvoter
每個CPL都有自己的堆棧。閱讀關於TSS(任務狀態段)的內容。 – Downvoter
是x86,單核。也許你可以解釋我的上下文切換。我清楚地看到的文件說:寄存器被壓入堆棧 - >堆棧被保存在PCB中。我錯過了什麼? – Richard