閱讀164 返回首頁    go 阿裏雲 go 技術社區[雲棲]


什麼是上下文切換

支持多任務處理是CPU設計史上最大的跨越之一。在計算機中,多任務處理是指同時運行兩個或多個程序。從使用者的角度來看,這看起來並不複雜或者難 以實現,但是它確實是計算機設計史上一次大的飛躍。在多任務處理係統中,CPU需要處理所有程序的操作,當用戶來回切換它們時,需要記錄這些程序執行到哪 裏。上下文切換就是這樣一個過程,他允許CPU記錄並恢複各種正在運行程序的狀態,使它能夠完成切換操作。

在上下文切換過程中,CPU會停止處理當前運行的程序,並保存當前程序運行的具體位置以便之後繼續運行。從這個角度來看,上下文切換有點像我們同時 閱讀幾本書,在來回切換書本的同時我們需要記住每本書當前讀到的頁碼。在程序中,上下文切換過程中的“頁碼”信息是保存在進程控製塊(PCB)中的。 PCB還經常被稱作“切換楨”(switchframe)。“頁碼”信息會一直保存到CPU的內存中,直到他們被再次使用。

在三種情況下可能會發生上下文切換:中斷處理,多任務處理,用戶態切換。在中斷處理中,其他程序”打斷”了當前正在運行的程序。當CPU接收到中斷 請求時,會在正在運行的程序和發起中斷請求的程序之間進行一次上下文切換。在多任務處理中,CPU會在不同程序之間來回切換,每個程序都有相應的處理時間 片,CPU在兩個時間片的間隔中進行上下文切換。對於一些操作係統,當進行用戶態切換時也會進行一次上下文切換,雖然這不是必須的。

操作係統或者計算機硬件都支持上下文切換。一些現代操作係統通過係統本身來控製上下文切換,整個切換過程中並不依賴於硬件的支持,這樣做可以讓操作係統保存更多的上下文切換信息(譯者注:軟件可以更有選擇性的保存需要保存的部分)


文章轉自 並發編程網-ifeve.com

最後更新:2017-05-23 10:02:22

  上一篇:go  Function接口 – Java8中java.util.function包下的函數式接口
  下一篇:go  Predicate和Consumer接口– Java 8中java.util.function包下的接口