1. 平均負載 平均負載是指單位時間內,系統處於可運行狀態和不可中斷狀態的平均進程數,也就是平均活躍進程數,它和CPU使用率並沒有直接關係。 可運行狀態的進程是指正在使用CPU或者等待CPU資源的進程。當我們使用類似於"ps"命令時,這些進程通常以"R"狀態(Running或Runnable)顯示。 ...
1. 平均負載
平均負載是指單位時間內,系統處於可運行狀態和不可中斷狀態的平均進程數,也就是平均活躍進程數,它和CPU使用率並沒有直接關係。
可運行狀態的進程是指正在使用CPU或者等待CPU資源的進程。當我們使用類似於"ps"命令時,這些進程通常以"R"狀態(Running或Runnable)顯示。
不可中斷狀態的進程是指處於內核態關鍵流程中的進程,這些流程無法被中斷。例如,最常見的情況是等待硬體設備的I/O響應。這類進程在"ps"命令中以"D"狀態(Uninterruptible Sleep,也稱為Disk Sleep)顯示。
舉個例子,當一個進程正在進行磁碟讀寫操作時,為了保證數據的一致性,在收到磁碟響應之前,該進程不能被其他進程或中斷打斷。此時,該進程處於不可中斷狀態。如果該進程被打斷,可能會導致磁碟數據與進程數據不一致的問題。
因此,不可中斷狀態實際上是系統對進程和硬體設備的一種保護機制。
從理想角度來看,每個CPU都剛好運行一個進程將充分利用每個CPU的資源。例如,當平均負載為3時,對於只有3個CPU的系統而言,表示所有CPU都被完全占用。對於4個CPU的系統而言,意味著CPU有50%的空閑時間。而對於只有1個CPU的系統而言,意味著有一半的進程無法競爭到CPU資源。
所以可總結如下:
-
平均負載高於CPU核心數時,通常意味著系統負載較重。這可能是因為有更多的進程在競爭CPU資源,導致CPU使用率較高。如果平均負載遠高於CPU核心數,可能會導致進程排隊等待CPU,造成性能下降。
-
平均負載低於或接近CPU核心數時,通常表示系統負載較輕。這意味著CPU使用率相對較低,系統有足夠的處理能力來處理當前的工作負載。
2. 平均負載與CPU使用率之間關係
先說一個小慄子,假設一個系統有4個CPU核心,如果平均負載是2,表示平均活躍進程數為2。這並不直接告訴我們每個CPU核心的使用率是多少。可能有兩個CPU核心各自運行一個進程,而其他兩個CPU核心處於空閑狀態;也可能有一個CPU核心運行兩個進程,而其他三個CPU核心處於空閑狀態。因此,平均負載為2時,並不能確定具體的CPU使用率。
總結起來:
-
CPU密集型進程:當系統中有大量的CPU密集型進程正在執行,它們會消耗大量的CPU資源,導致CPU使用率升高。同時,這些進程也會占用系統的可運行狀態,使得平均負載也升高。在這種情況下,CPU使用率和平均負載是一致的,都反映了系統的高負載狀態。
-
I/O密集型進程:如果系統中有大量的I/O密集型進程,它們可能會頻繁地進行I/O操作並等待I/O響應。在等待I/O的過程中,進程不會占用CPU資源,因此CPU使用率可能相對較低。然而,這些等待I/O的進程會進入不可中斷狀態,導致平均負載升高。因此,在這種情況下,平均負載可能比CPU使用率更高。
-
大量等待CPU的進程調度:當系統中存在大量的進程在等待CPU調度時,它們可能會競爭有限的CPU資源。這會導致CPU使用率的升高,因為CPU正在不斷地被分配給各個進程。同時,這些等待CPU調度的進程會占用系統的可運行狀態,使得平均負載升高。因此,在這種情況下,CPU使用率和平均負載可能都比較高。
3. CPU上下文切換
CPU上下文切換是指操作系統在多任務環境下,將當前正在運行的進程或線程的上下文信息保存起來,並載入下一個即將運行的進程或線程的上下文信息的過程。
上下文是指進程或線程在執行過程中的狀態信息,包括程式計數器(記錄下一條要執行的指令地址)、寄存器的值、堆棧指針、打開的文件、記憶體映射等。上下文切換的目的是在多個進程或線程之間共用CPU時間,使得每個進程或線程都能得到適當的執行時間。
當一個進程或線程的時間片(時間片是操作系統分配給每個進程或線程的執行時間段)用完或發生某種事件(如I/O操作完成)時,操作系統會進行上下文切換,具體過程如下:
-
保存當前進程或線程的上下文信息:操作系統會將當前進程或線程的上下文信息保存到記憶體中,包括寄存器的值、程式計數器等。
-
載入下一個進程或線程的上下文信息:操作系統從就緒隊列中選擇下一個即將執行的進程或線程,並將其上下文信息從記憶體中載入到寄存器和其他相關硬體中。
-
切換到下一個進程或線程的執行:操作系統將控制權轉移到下一個進程或線程,使其開始執行。這個過程可能包括更新頁表、設置記憶體映射、打開文件等操作。
上下文切換是一個開銷較大的操作,因為它涉及到大量的數據保存和載入操作。因此,減少上下文切換的次數對系統性能至關重要。一些常見的導致上下文切換的情況包括搶占式調度、I/O操作、中斷處理和多核處理器上的併發執行等。
3-1 進程上下文切換
進程上下文切換是操作系統在多任務環境下,從一個進程切換到另一個進程時所進行的上下文切換過程。它涉及保存和載入進程的上下文信息,以便在重新調度時能夠繼續執行進程。
進程上下文切換的過程如下:
-
保存當前進程的上下文:當操作系統需要切換到另一個進程時,它會先保存當前正在運行進程的上下文信息。這包括保存進程的程式計數器、寄存器的值、堆棧指針、打開的文件、記憶體映射等。這些信息通常保存在進程的控制塊(Process Control Block,PCB)中,PCB是操作系統用來管理進程的數據結構。
-
載入下一個進程的上下文:操作系統從就緒隊列中選擇下一個即將執行的進程,並載入該進程之前保存的上下文信息。這包括將進程的程式計數器、寄存器的值、堆棧指針等從其PCB中載入到相應的寄存器和硬體中。
-
切換到下一個進程的執行:一旦新進程的上下文信息載入完畢,操作系統會將控制權轉移到該進程,使其開始執行。這可能涉及更新頁表、設置記憶體映射、打開文件等操作,以確保新進程能夠正確地運行。
進程上下文切換是一個開銷較大的操作,因為它涉及大量的數據保存和載入。上下文切換的頻繁發生會導致系統性能下降。因此,優化上下文切換的效率對於提高系統的多任務處理能力至關重要。
進程上下文切換通常發生在以下情況下:
-
搶占式調度:當操作系統採用搶占式調度策略時,一個優先順序更高的進程可能會搶占正在執行的進程的CPU時間,從而導致上下文切換。
-
I/O操作:當進程需要進行I/O操作時,例如等待磁碟讀寫完成,操作系統會將該進程切換出去,讓其他進程繼續執行。一旦I/O操作完成,操作系統會將該進程的上下文切換回來,使其繼續執行。
-
時間片用完:操作系統為每個進程分配一定的時間片,當一個進程的時間片用完時,操作系統會將其上下文保存並切換到下一個進程,以保證公平分配CPU時間。
-
進程間通信:在進程間通信的過程中,操作系統可能需要進行上下文切換,以便讓不同的進程能夠相互交互和共用數據。
- 進程在系統資源不足(比如記憶體不足)時,要等到資源滿足後才可以運行,這個時候進程也會被掛起,並由系統調度其他進程運行。
- 當進程通過睡眠函數 sleep 這樣的方法將自己主動掛起時,自然也會重新調度。
3-2 線程上下文切換
線程和進程最大的區別在於,線程是調度的基本單位,而進程是資源擁有的基本單位。在內核中的任務調度過程中,調度對象實際上是線程,而進程只是為線程提供了虛擬記憶體、全局變數等資源。因此,可以將線程視為進程的子任務。
當進程包含多個線程時,這些線程共用相同的虛擬記憶體和全局變數等資源。在上下文切換時,這些資源是不需要被修改的。
然而,線程也有自己的私有數據,例如棧和寄存器等。在上下文切換時,需要保存和載入線程的私有數據。
因此,線程的上下文切換可以分為兩種情況:
-
前後兩個線程屬於不同的進程:在這種情況下,由於資源不共用,線程的上下文切換過程與進程的上下文切換相似。
-
前後兩個線程屬於同一個進程:在這種情況下,由於虛擬記憶體是共用的,上下文切換時虛擬記憶體等資源保持不變,只需要切換線程的私有數據和寄存器等非共用數據。
可以看出,同一個進程內的線程切換相比多進程間的切換消耗更少的資源。這也是使用多線程代替多進程的一個優勢。
3-3 中斷上下文切換
中斷上下文切換是指當電腦系統發生硬體中斷或異常時,操作系統需要從當前正在執行的上下文中切換到中斷處理程式的上下文,併在中斷處理程式執行完畢後再切換回原來的上下文。中斷上下文切換是操作系統為了響應中斷事件而進行的一種上下文切換過程。
下麵是中斷上下文切換的詳細過程:
-
中斷觸發:電腦系統中的硬體設備(如時鐘、鍵盤、磁碟等)或異常條件(如除零錯誤、頁錯誤等)觸發了中斷信號,通知操作系統需要進行相應的處理。這會導致當前正在執行的指令被暫停。
-
保存當前上下文:在響應中斷前,操作系統會保存當前正在執行的任務的上下文信息。這包括保存程式計數器、寄存器的值、堆棧指針等。這些信息通常保存在被中斷任務的內核棧或專用的中斷棧中。
-
切換到中斷處理程式:一旦當前上下文保存完畢,操作系統會切換到中斷處理程式的上下文。中斷處理程式是預先定義好的用於處理特定中斷的代碼段。操作系統會根據中斷類型和優先順序選擇相應的中斷處理程式。
-
中斷處理程式執行:操作系統開始執行中斷處理程式,處理中斷事件。中斷處理程式根據中斷類型進行相應的處理,可能包括讀取輸入設備的數據、處理異常錯誤、更新系統狀態等。
-
恢複原上下文:一旦中斷處理程式執行完畢,操作系統會從中斷處理程式的上下文中恢複原來被中斷任務的上下文。它會將之前保存的程式計數器、寄存器的值、堆棧指針等信息恢復到相應的寄存器和硬體中。
-
繼續執行被中斷任務:一旦原上下文恢復完畢,操作系統會繼續執行被中斷的任務。它會從中斷發生時的位置繼續執行指令,使任務在中斷處理後繼續正常運行。
與進程上下文切換不同,中斷上下文切換並不牽涉到進程的用戶態(User Mode)。當發生中斷時,即使當前正在執行的進程處於用戶態,操作系統也不需要保存和恢復該進程的虛擬記憶體、全局變數等用戶態資源。
中斷上下文只包括內核態(Kernel Mode)中斷服務程式執行所必需的狀態。這些狀態包括CPU寄存器的值、內核堆棧的指針、硬體中斷參數等。這些信息足夠操作系統在中斷處理程式中進行必要的操作,而不需要涉及進程的用戶態資源。
換句話說,中斷上下文切換僅涉及到內核態的數據和狀態,因為中斷處理程式運行在內核態中。它是為了響應硬體中斷而發生的,目的是儘快處理中斷事件並返回到被中斷的任務。
這種區分是為了提高中斷響應的效率。通過僅保存和恢復與中斷處理相關的內核態數據,可以減少上下文切換的開銷,從而更快地響應中斷並恢復正常的執行。
中斷上下文切換的過程需要保存和恢復大量的上下文信息,因此會引入一定的開銷。優化中斷上下文切換的方式是減少保存和恢復的上下文信息量,以提高系統的響應速度。