理解CPU上下文切換

liunx是多任務操做系統,但當任務數量大於CPU數量時,系統會在很短的時間內將CPU輪流分配給任務,並非全部的任務都在同時運行。多線程

每一個任務在運行前,系統都須要事先設置好CPU寄存器和程序計數器。
CPU寄存器是CPU內置的容量小速度極快的內存,程序計數器是用來存儲CPU正在執行的指令位置、或者即將執行的下一條指令位置。他們稱爲CPU的上下文性能

CPU上下文切換指的是CPU將當前任務的CPU寄存器和程序計數器保存起來,而後加載新任務CPU寄存器和程序計數器,再跳到新任務的程序計數器指的位置,運行新任務。操作系統

保存起來的CPU上下文會存儲在系統內核中,等待任務從新調度。線程

保存CPU上下文和恢復CPU上下文是須要系統內核在CPU上運行才能完成的。對象

CPU上下文切換大致能夠分爲三種,進程上下文切換、線程上下文切換、中斷上下文切換。進程

進程上下文切換事件

進程的上下文切換是指從一個進程切換到另外一個進程運行。內存

liunx將進程的運行空間分爲內核空間和用戶空間。
內核空間具備最高等級,能夠直接訪問全部系統資源。
用戶空間只能訪問有限資源,不能直接訪問內存等硬件設備,必須經過系統調用深刻內核才能訪問這些資源。資源

進程是由內核來管理和調度的,進程的切換隻能發生在內核態。進程的上下文不只包括了虛擬內存、棧、全局變量等用戶空間的資源,還包括了內核堆棧、寄存器等內核空間的狀態。多進程

進程能夠在這內核空間和用戶空間運行,分別稱爲進程的用戶態和進程的內核態。

從用戶態到內核態的轉變須要經過系統調用來完成,須要進行CPU上下文切換,保存用戶態的CPU上下文,加載內核態的CPU上下文,結束後相反,其中發生了兩次CPU上下文切換。這一切都在同一個進程中進行,會消耗系統資源,但並非進程的CPU上下文切換。

進程的上下文切換比系統調用多一步,在保存當前進程的內核狀態和CPU寄存器以前,須要先把該進程的虛擬內存和棧等保存下來,而加載了下一個進程的內核狀態和CPU寄存器以後,還須要刷新下一個進程的虛擬內存和棧等。

進程上下文切換次數較多,很容易致使CPU將大量時間耗費在寄存器、內核棧以及虛擬內存等資源的保存和恢復上,大大縮短了真正運行進程的時間。致使平均負載升高。

線程的上下文切換

線程和進程的區別,線程是調度的基本單位,進程時資源擁有的基本單位,怎麼理解呢?所謂內核中的任務調度,實際上調度的對象是線程,而進程時給線程提供虛擬內存、全局變量等資源的。
你也能夠這樣理解:
當進程只有一個線程時,能夠認爲進程就等於線程;
當進程擁有多個線程時,這些線程共享相同的虛擬內存和全局變量等資源,這些資源在上下文切換時並不須要修改。
當線程也有本身的私有數據時,好比本身的棧和寄存器,上下文切換時也須要保存。

根據上面描述的,線程的上下文切換就存在兩種狀況:

  1. 先後切換的兩個線程是屬於同一個進程,兩個線程的資源基本是共享的,切換上下文時共享的資源不須要動,只有當線程有私有數據時,切換這些不共享的數據便可;
  2. 先後切換的兩個進程不屬於同一個進程,跟切換進程的上下文時同樣的。

切換同一進程的線程比切換進程消耗更少的系統資源,這就是多線程對比多進程的優點。

中斷上下文切換

中斷處理擁有比進程更高的優先級
爲了快速響應硬件的事件,中斷處理會打斷進程的正常調度和執行,轉而執行中斷處理程序,響應設備事件。在打斷進程時,須要將當前進程的狀態保存下來,中斷結束後,再恢復到原有的狀態。

中斷上下文切換不涉及到進程的用戶態。因此即使中斷過程打斷的是一個正在處於用戶態的進程,也不須要保存和恢復這個進程的虛擬內存和全局變量等用戶態資源。中斷上下文只包括內核態中斷服務程序執行所必須的狀態,包括CPU寄存器、內存堆棧、硬件中斷參數等。

通常中斷程序都是短小的。力求儘快執行完成,但當發生過多的中斷次數時,也可能帶來嚴重的系統性能問題。

by kocor

相關文章
相關標籤/搜索