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