上下文切換(進程切換/Task切換)是指CPU從一個進程或線程切換到另外一個。
進程(Task)是一個正在運行着的程序。在Linux中,線程是能夠並行運行並與主進程共享內存空間和其餘資源的輕量級進程。
上下文(context)是指在任意時刻CPU寄存器和程序計數器的內容。寄存器是CPU內部的速度很是快的內存單元,它經過提供對計算過程當中的經常使用值的極速訪問來提升計算速度。程序計數器是一個指向CPU指令位置的特殊寄存器,這個位置要麼是指向須要執行的指令地址要麼指向下一條須要執行指令的地址,取決於系統。
上下文切換能夠被描述爲:系統內核在CPU上執行關於進程/線程的如下操做:(1)中止當前進程,並把它的相關狀態信息存到內存的某個地方。(2)從內存裏拿出下一個進程的狀態信息並放入寄存器裏。(3)從程序計數器裏取出這個進程須要運行的指令,開始繼續執行這個進程。
Context Switches and Mode Switches
進程切換隻會發生在內核模式下。內核模式是CPU的特權模式,在這個模式下只有內核能夠運行而且能夠訪問全部內存位置和其餘系統資源。其餘的程序只能運行在用戶模式下,可是他們能夠經過系統調用(system call)來運行內核模式中的一部分功能。系統調用是類Unix系統中正在運行進程對內核提供的服務的一個請求,好比IO或建立新進程。IO能夠被認爲是(CPU與主內存結合體)的任意數據轉移,包括移入和移出。也就是說這個結合體與用戶(如鍵盤輸入),存儲(磁盤),或其餘電腦的數據轉移。
類Unix系統裏的這兩種模式意味着當系統調用致使CPU須要變爲內核態時一個相似又簡單的操做(切換)是必須的。這是模式切換而不是上下文切換,由於它沒有去運行其餘進程。
上下文切換是多任務操做系統的必備屬性。多任務操做系統是指多個進程執行在單個CPU上看起來像是同時運行而且不互相妨礙。這種假象是經過快速的上下文切換來完成的(每秒上千次)。
硬件中斷也會引起上下文切換,硬件中斷是指硬件設備產生髮出一個信號給內核,告訴內核發生了一個事件(好比鍵盤輸入,鼠標點擊,網絡數據到達,系統時鐘)。
Intel80386和更高級的CPU提供了對上下文切換的硬件支持。然而大多數現代的操做系統更趨向於使用軟件上下文切換,它能夠在任何CPU上使用,而不使用硬件上下文切換,用於提升性能。軟件上下文切換最早是在Linux2.4版本內核中實現的,用於適配Intel-compatible系列CPU。
軟件上下文切換的一個主要好處是,硬件設備保存了幾乎全部的CPU狀態信息,而軟件能夠更有選擇性,只保存真正須要保存和從新加載的部分。然而問題是這種作法對提高上下文切換效率到底有多重要?它的倡議者還聲稱軟件上下文切換提供了改進切換代碼可能,從而提升效率,它能夠對已經加載的數據進行更好的控制。
The Cost of Context Switching
上下文切換一般是增強計算的。就是說,它須要考慮處理器的時間,對每秒上千次的切換這個時間須要精確到納秒。所以上下文切換會對系統CPU時間產生大量開銷,而且可能成爲系統裏最大的開銷。
因此操做系統在設計時一個主要的點是怎麼避免不須要的上下文切換。然而這是實踐中是很難實現的。實際上,儘管上下文切換對CPU時間的開銷已經降低了,單它主要經過提升CPU時鐘速度而不是提升上下文切換自己。
相比其餘操做系統包括類Unix系統,Linux上下文切換和內核模式切換代價很是小。
網絡