1. 平均負載
平均負載是指單位時間內(nèi),系統(tǒng)處于可運行狀態(tài)和不可中斷狀態(tài)的平均進程數(shù),也就是平均活躍進程數(shù),它和CPU使用率并沒有直接關(guān)系。
可運行狀態(tài)的進程是指正在使用CPU或者等待CPU資源的進程。當(dāng)我們使用類似于"ps"命令時,這些進程通常以"R"狀態(tài)(Running或Runnable)顯示。
不可中斷狀態(tài)的進程是指處于內(nèi)核態(tài)關(guān)鍵流程中的進程,這些流程無法被中斷。例如,最常見的情況是等待硬件設(shè)備的I/O響應(yīng)。這類進程在"ps"命令中以"D"狀態(tài)(Uninterruptible Sleep,也稱為Disk Sleep)顯示。
舉個例子,當(dāng)一個進程正在進行磁盤讀寫操作時,為了保證數(shù)據(jù)的一致性,在收到磁盤響應(yīng)之前,該進程不能被其他進程或中斷打斷。此時,該進程處于不可中斷狀態(tài)。如果該進程被打斷,可能會導(dǎo)致磁盤數(shù)據(jù)與進程數(shù)據(jù)不一致的問題。
因此,不可中斷狀態(tài)實際上是系統(tǒng)對進程和硬件設(shè)備的一種保護機制。
從理想角度來看,每個CPU都剛好運行一個進程將充分利用每個CPU的資源。例如,當(dāng)平均負載為3時,對于只有3個CPU的系統(tǒng)而言,表示所有CPU都被完全占用。對于4個CPU的系統(tǒng)而言,意味著CPU有50%的空閑時間。而對于只有1個CPU的系統(tǒng)而言,意味著有一半的進程無法競爭到CPU資源。
所以可總結(jié)如下:
-
平均負載高于CPU核心數(shù)時,通常意味著系統(tǒng)負載較重。這可能是因為有更多的進程在競爭CPU資源,導(dǎo)致CPU使用率較高。如果平均負載遠高于CPU核心數(shù),可能會導(dǎo)致進程排隊等待CPU,造成性能下降。
-
平均負載低于或接近CPU核心數(shù)時,通常表示系統(tǒng)負載較輕。這意味著CPU使用率相對較低,系統(tǒng)有足夠的處理能力來處理當(dāng)前的工作負載。
2. 平均負載與CPU使用率之間關(guān)系
先說一個小栗子,假設(shè)一個系統(tǒng)有4個CPU核心,如果平均負載是2,表示平均活躍進程數(shù)為2。這并不直接告訴我們每個CPU核心的使用率是多少??赡苡袃蓚€CPU核心各自運行一個進程,而其他兩個CPU核心處于空閑狀態(tài);也可能有一個CPU核心運行兩個進程,而其他三個CPU核心處于空閑狀態(tài)。因此,平均負載為2時,并不能確定具體的CPU使用率。
總結(jié)起來:
-
CPU密集型進程:當(dāng)系統(tǒng)中有大量的CPU密集型進程正在執(zhí)行,它們會消耗大量的CPU資源,導(dǎo)致CPU使用率升高。同時,這些進程也會占用系統(tǒng)的可運行狀態(tài),使得平均負載也升高。在這種情況下,CPU使用率和平均負載是一致的,都反映了系統(tǒng)的高負載狀態(tài)。
-
I/O密集型進程:如果系統(tǒng)中有大量的I/O密集型進程,它們可能會頻繁地進行I/O操作并等待I/O響應(yīng)。在等待I/O的過程中,進程不會占用CPU資源,因此CPU使用率可能相對較低。然而,這些等待I/O的進程會進入不可中斷狀態(tài),導(dǎo)致平均負載升高。因此,在這種情況下,平均負載可能比CPU使用率更高。
-
大量等待CPU的進程調(diào)度:當(dāng)系統(tǒng)中存在大量的進程在等待CPU調(diào)度時,它們可能會競爭有限的CPU資源。這會導(dǎo)致CPU使用率的升高,因為CPU正在不斷地被分配給各個進程。同時,這些等待CPU調(diào)度的進程會占用系統(tǒng)的可運行狀態(tài),使得平均負載升高。因此,在這種情況下,CPU使用率和平均負載可能都比較高。
3. CPU上下文切換
CPU上下文切換是指操作系統(tǒng)在多任務(wù)環(huán)境下,將當(dāng)前正在運行的進程或線程的上下文信息保存起來,并加載下一個即將運行的進程或線程的上下文信息的過程。
上下文是指進程或線程在執(zhí)行過程中的狀態(tài)信息,包括程序計數(shù)器(記錄下一條要執(zhí)行的指令地址)、寄存器的值、堆棧指針、打開的文件、內(nèi)存映射等。上下文切換的目的是在多個進程或線程之間共享CPU時間,使得每個進程或線程都能得到適當(dāng)?shù)膱?zhí)行時間。
當(dāng)一個進程或線程的時間片(時間片是操作系統(tǒng)分配給每個進程或線程的執(zhí)行時間段)用完或發(fā)生某種事件(如I/O操作完成)時,操作系統(tǒng)會進行上下文切換,具體過程如下:
-
保存當(dāng)前進程或線程的上下文信息:操作系統(tǒng)會將當(dāng)前進程或線程的上下文信息保存到內(nèi)存中,包括寄存器的值、程序計數(shù)器等。
-
加載下一個進程或線程的上下文信息:操作系統(tǒng)從就緒隊列中選擇下一個即將執(zhí)行的進程或線程,并將其上下文信息從內(nèi)存中加載到寄存器和其他相關(guān)硬件中。
-
切換到下一個進程或線程的執(zhí)行:操作系統(tǒng)將控制權(quán)轉(zhuǎn)移到下一個進程或線程,使其開始執(zhí)行。這個過程可能包括更新頁表、設(shè)置內(nèi)存映射、打開文件等操作。
上下文切換是一個開銷較大的操作,因為它涉及到大量的數(shù)據(jù)保存和加載操作。因此,減少上下文切換的次數(shù)對系統(tǒng)性能至關(guān)重要。一些常見的導(dǎo)致上下文切換的情況包括搶占式調(diào)度、I/O操作、中斷處理和多核處理器上的并發(fā)執(zhí)行等。
3-1 進程上下文切換
進程上下文切換是操作系統(tǒng)在多任務(wù)環(huán)境下,從一個進程切換到另一個進程時所進行的上下文切換過程。它涉及保存和加載進程的上下文信息,以便在重新調(diào)度時能夠繼續(xù)執(zhí)行進程。
進程上下文切換的過程如下:
-
保存當(dāng)前進程的上下文:當(dāng)操作系統(tǒng)需要切換到另一個進程時,它會先保存當(dāng)前正在運行進程的上下文信息。這包括保存進程的程序計數(shù)器、寄存器的值、堆棧指針、打開的文件、內(nèi)存映射等。這些信息通常保存在進程的控制塊(Process Control Block,PCB)中,PCB是操作系統(tǒng)用來管理進程的數(shù)據(jù)結(jié)構(gòu)。
-
加載下一個進程的上下文:操作系統(tǒng)從就緒隊列中選擇下一個即將執(zhí)行的進程,并加載該進程之前保存的上下文信息。這包括將進程的程序計數(shù)器、寄存器的值、堆棧指針等從其PCB中加載到相應(yīng)的寄存器和硬件中。
-
切換到下一個進程的執(zhí)行:一旦新進程的上下文信息加載完畢,操作系統(tǒng)會將控制權(quán)轉(zhuǎn)移到該進程,使其開始執(zhí)行。這可能涉及更新頁表、設(shè)置內(nèi)存映射、打開文件等操作,以確保新進程能夠正確地運行。
進程上下文切換是一個開銷較大的操作,因為它涉及大量的數(shù)據(jù)保存和加載。上下文切換的頻繁發(fā)生會導(dǎo)致系統(tǒng)性能下降。因此,優(yōu)化上下文切換的效率對于提高系統(tǒng)的多任務(wù)處理能力至關(guān)重要。
進程上下文切換通常發(fā)生在以下情況下:
-
搶占式調(diào)度:當(dāng)操作系統(tǒng)采用搶占式調(diào)度策略時,一個優(yōu)先級更高的進程可能會搶占正在執(zhí)行的進程的CPU時間,從而導(dǎo)致上下文切換。
-
I/O操作:當(dāng)進程需要進行I/O操作時,例如等待磁盤讀寫完成,操作系統(tǒng)會將該進程切換出去,讓其他進程繼續(xù)執(zhí)行。一旦I/O操作完成,操作系統(tǒng)會將該進程的上下文切換回來,使其繼續(xù)執(zhí)行。
-
時間片用完:操作系統(tǒng)為每個進程分配一定的時間片,當(dāng)一個進程的時間片用完時,操作系統(tǒng)會將其上下文保存并切換到下一個進程,以保證公平分配CPU時間。
-
進程間通信:在進程間通信的過程中,操作系統(tǒng)可能需要進行上下文切換,以便讓不同的進程能夠相互交互和共享數(shù)據(jù)。
- 進程在系統(tǒng)資源不足(比如內(nèi)存不足)時,要等到資源滿足后才可以運行,這個時候進程也會被掛起,并由系統(tǒng)調(diào)度其他進程運行。
- 當(dāng)進程通過睡眠函數(shù) sleep 這樣的方法將自己主動掛起時,自然也會重新調(diào)度。
3-2 線程上下文切換
線程和進程最大的區(qū)別在于,線程是調(diào)度的基本單位,而進程是資源擁有的基本單位。在內(nèi)核中的任務(wù)調(diào)度過程中,調(diào)度對象實際上是線程,而進程只是為線程提供了虛擬內(nèi)存、全局變量等資源。因此,可以將線程視為進程的子任務(wù)。
當(dāng)進程包含多個線程時,這些線程共享相同的虛擬內(nèi)存和全局變量等資源。在上下文切換時,這些資源是不需要被修改的。
然而,線程也有自己的私有數(shù)據(jù),例如棧和寄存器等。在上下文切換時,需要保存和加載線程的私有數(shù)據(jù)。
因此,線程的上下文切換可以分為兩種情況:
-
前后兩個線程屬于不同的進程:在這種情況下,由于資源不共享,線程的上下文切換過程與進程的上下文切換相似。
-
前后兩個線程屬于同一個進程:在這種情況下,由于虛擬內(nèi)存是共享的,上下文切換時虛擬內(nèi)存等資源保持不變,只需要切換線程的私有數(shù)據(jù)和寄存器等非共享數(shù)據(jù)。
可以看出,同一個進程內(nèi)的線程切換相比多進程間的切換消耗更少的資源。這也是使用多線程代替多進程的一個優(yōu)勢。
3-3 中斷上下文切換
中斷上下文切換是指當(dāng)計算機系統(tǒng)發(fā)生硬件中斷或異常時,操作系統(tǒng)需要從當(dāng)前正在執(zhí)行的上下文中切換到中斷處理程序的上下文,并在中斷處理程序執(zhí)行完畢后再切換回原來的上下文。中斷上下文切換是操作系統(tǒng)為了響應(yīng)中斷事件而進行的一種上下文切換過程。
下面是中斷上下文切換的詳細過程:
-
中斷觸發(fā):計算機系統(tǒng)中的硬件設(shè)備(如時鐘、鍵盤、磁盤等)或異常條件(如除零錯誤、頁錯誤等)觸發(fā)了中斷信號,通知操作系統(tǒng)需要進行相應(yīng)的處理。這會導(dǎo)致當(dāng)前正在執(zhí)行的指令被暫停。
-
保存當(dāng)前上下文:在響應(yīng)中斷前,操作系統(tǒng)會保存當(dāng)前正在執(zhí)行的任務(wù)的上下文信息。這包括保存程序計數(shù)器、寄存器的值、堆棧指針等。這些信息通常保存在被中斷任務(wù)的內(nèi)核棧或?qū)S玫闹袛鄺V小?/p>
-
切換到中斷處理程序:一旦當(dāng)前上下文保存完畢,操作系統(tǒng)會切換到中斷處理程序的上下文。中斷處理程序是預(yù)先定義好的用于處理特定中斷的代碼段。操作系統(tǒng)會根據(jù)中斷類型和優(yōu)先級選擇相應(yīng)的中斷處理程序。
-
中斷處理程序執(zhí)行:操作系統(tǒng)開始執(zhí)行中斷處理程序,處理中斷事件。中斷處理程序根據(jù)中斷類型進行相應(yīng)的處理,可能包括讀取輸入設(shè)備的數(shù)據(jù)、處理異常錯誤、更新系統(tǒng)狀態(tài)等。
-
恢復(fù)原上下文:一旦中斷處理程序執(zhí)行完畢,操作系統(tǒng)會從中斷處理程序的上下文中恢復(fù)原來被中斷任務(wù)的上下文。它會將之前保存的程序計數(shù)器、寄存器的值、堆棧指針等信息恢復(fù)到相應(yīng)的寄存器和硬件中。
-
繼續(xù)執(zhí)行被中斷任務(wù):一旦原上下文恢復(fù)完畢,操作系統(tǒng)會繼續(xù)執(zhí)行被中斷的任務(wù)。它會從中斷發(fā)生時的位置繼續(xù)執(zhí)行指令,使任務(wù)在中斷處理后繼續(xù)正常運行。
-
?
與進程上下文切換不同,中斷上下文切換并不牽涉到進程的用戶態(tài)(User Mode)。當(dāng)發(fā)生中斷時,即使當(dāng)前正在執(zhí)行的進程處于用戶態(tài),操作系統(tǒng)也不需要保存和恢復(fù)該進程的虛擬內(nèi)存、全局變量等用戶態(tài)資源。
中斷上下文只包括內(nèi)核態(tài)(Kernel Mode)中斷服務(wù)程序執(zhí)行所必需的狀態(tài)。這些狀態(tài)包括CPU寄存器的值、內(nèi)核堆棧的指針、硬件中斷參數(shù)等。這些信息足夠操作系統(tǒng)在中斷處理程序中進行必要的操作,而不需要涉及進程的用戶態(tài)資源。
換句話說,中斷上下文切換僅涉及到內(nèi)核態(tài)的數(shù)據(jù)和狀態(tài),因為中斷處理程序運行在內(nèi)核態(tài)中。它是為了響應(yīng)硬件中斷而發(fā)生的,目的是盡快處理中斷事件并返回到被中斷的任務(wù)。
這種區(qū)分是為了提高中斷響應(yīng)的效率。通過僅保存和恢復(fù)與中斷處理相關(guān)的內(nèi)核態(tài)數(shù)據(jù),可以減少上下文切換的開銷,從而更快地響應(yīng)中斷并恢復(fù)正常的執(zhí)行。
中斷上下文切換的過程需要保存和恢復(fù)大量的上下文信息,因此會引入一定的開銷。優(yōu)化中斷上下文切換的方式是減少保存和恢復(fù)的上下文信息量,以提高系統(tǒng)的響應(yīng)速度。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-747319.html文章來源:http://www.zghlxwxcb.cn/news/detail-747319.html
?
到了這里,關(guān)于性能測試必備基礎(chǔ)知識(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!