CPU上下文切換詳解

CPU上下文切換詳解

原文地址,譯文地址,譯者: 董明鑫,校對:鄭旭東

上下文切換(有時也稱做進程切換或任務切換)是指 CPU 從一個進程或線程切換到另一個進程或線程。
進程(有時候也稱做任務)是指一個程序運行的實例。在 Linux 系統中,線程就是能並行運行並且與他們的父進程(創建他們的進程)共享同一地址空間(一段內存區域)和其他資源的輕量級的進程。
上下文是指某一時間點 CPU 寄存器和程序計數器的內容。寄存器是 CPU 內部的數量較少但是速度很快的內存(與之對應的是 CPU 外部相對較慢的 RAM 主內存)。寄存器通過對常用值(通常是運算的中間值)的快速訪問來提高計算機程序運行的速度。程序計數器是一個專用的寄存器,用於表明指令序列中 CPU 正在執行的位置,存的值爲正在執行的指令的位置或者下一個將要被執行的指令的位置,具體依賴於特定的系統。
稍微詳細描述一下,上下文切換可以認爲是內核(操作系統的核心)在 CPU 上對於進程(包括線程)進行以下的活動:(1)掛起一個進程,將這個進程在 CPU 中的狀態(上下文)存儲於內存中的某處,(2)在內存中檢索下一個進程的上下文並將其在 CPU 的寄存器中恢復,(3)跳轉到程序計數器所指向的位置(即跳轉到進程被中斷時的代碼行),以恢復該進程。
上下文切換有時被描述爲內核掛起 CPU 當前執行的進程,然後繼續執行之前掛起的衆多進程中的某一個。儘管這麼說對於澄清概念有所幫助,但是這句話本身可能有一點令人困惑。因爲通過定義可以知道,進程是指一個程序運行的實例。所以說成掛起一個進程的運行可能更適合一些


上下文切換與模式切換

上下文切換隻能發生在內核態中。內核態是 CPU 的一種有特權的模式,在這種模式下只有內核運行並且可以訪問所有內存和其他系統資源。其他的程序,如應用程序,在最開始都是運行在用戶態,但是他們能通過系統調用來運行部分內核的代碼。系統調用在類 Unix 系統中是指活躍的進程(正在運行在 CPU 上的進程)對於內核所提供的服務的請求,例如輸入/輸出(I/O)和進程創建(創建一個新的進程)。I/O 可以被定義爲任何信息流入或流出 CPU 與主內存(RAM)。也就是說,一臺電腦的 CPU和內存與該電腦的用戶(通過鍵盤或鼠標)、存儲設備(硬盤或磁盤驅動)還有其他電腦的任何交流都是 I/O。
這兩種模式(用戶態和內核態)在類 Unix 系統中共存意味着當系統調用發生時 CPU 切換到內核態是必要的。這應該叫做模式切換而不是上下文切換,因爲沒有改變當前的進程。
上下文切換在多任務操作系統中是一個必須的特性。多任務操作系統是指多個進程運行在一個 CPU 中互不打擾,看起來像同時運行一樣。這個並行的錯覺是由於上下文在高速的切換(每秒幾十上百次)。當某一進程自願放棄它的 CPU 時間或者系統分配的時間片用完時,就會發生上下文切換。
上下文切換有時也因硬件中斷而觸發。硬件中斷是指硬件設備(如鍵盤、鼠標、調試解調器、系統時鐘)給內核發送的一個信號,該信號表示一個事件(如按鍵、鼠標移動、從網絡連接接收到數據)發生了。
英特爾的 80386 和更高級的 CPU 都支持硬件上下文切換。然而,大多數現代的操作系統通過軟件實現上下文切換,而非使用硬件上下文切換,這樣能夠運行在任何 CPU 上。同時,使用軟件上下文切換可以嘗試獲得更好的性能。軟件的上下文切換最先在 Linux 2.4 中實現。
軟件上下文切換號稱的一個主要優點是,硬件的機制保存了幾乎所有 CPU 的狀態,軟件能夠有選擇性的保存需要被保存的部分並重新加載。然而這個行爲對於提升上下文切換的性能到底有多重要,還有一點疑問。其擁護者還宣稱,軟件上下文切換有提高切換代碼的可能性,它有助於提高正在加載的數據的有效性,從而進一步提高性能。


上下文切換的消耗

上下文切換通常是計算密集型的。也就是說,它需要相當可觀的處理器時間,在每秒幾十上百次的切換中,每次切換都需要納秒量級的時間。所以,上下文切換對系統來說意味着消耗大量的 CPU 時間,事實上,可能是操作系統中時間消耗最大的操作。
Linux相比與其他操作系統(包括其他類 Unix 系統)有很多的優點,其中有一項就是,其上下文切換和模式切換的時間消耗非常少。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章