概述
在多任務(wù)操作系統(tǒng)中,進(jìn)程優(yōu)先級是一個非常重要的概念,決定了進(jìn)程獲取CPU時間的能力。合理的優(yōu)先級管理,不僅可以提升系統(tǒng)的整體性能,還能確保關(guān)鍵任務(wù)得到及時的處理。
進(jìn)程優(yōu)先級是一個數(shù)值指標(biāo),主要用于衡量操作系統(tǒng)調(diào)度CPU時間給進(jìn)程時的優(yōu)先程度。在Linux中,進(jìn)程優(yōu)先級分為兩種:靜態(tài)優(yōu)先級和動態(tài)優(yōu)先級。
靜態(tài)優(yōu)先級:由用戶或系統(tǒng)管理員設(shè)定的優(yōu)先級,通常通過nice值來表示。靜態(tài)優(yōu)先級的范圍從-20(最高優(yōu)先級)到19(最低優(yōu)先級),默認(rèn)值為0。靜態(tài)優(yōu)先級主要用于區(qū)分不同類型的用戶進(jìn)程,以便于系統(tǒng)在資源緊張時,可以做出合理的調(diào)度決策。
動態(tài)優(yōu)先級:由調(diào)度器根據(jù)進(jìn)程的行為,自動調(diào)整的優(yōu)先級。動態(tài)優(yōu)先級的變化取決于進(jìn)程的CPU使用情況、I/O活動等因素。在Linux的完全公平調(diào)度器(即CFS)中,動態(tài)優(yōu)先級通過虛擬運(yùn)行時間來計(jì)算,以確保長時間未獲得CPU時間的進(jìn)程能夠盡快得到執(zhí)行機(jī)會。
靜態(tài)優(yōu)先級和動態(tài)優(yōu)先級是相互關(guān)聯(lián)的。靜態(tài)優(yōu)先級作為基本優(yōu)先級,在進(jìn)程創(chuàng)建時確定,并作為動態(tài)優(yōu)先級計(jì)算的基礎(chǔ)。動態(tài)優(yōu)先級則根據(jù)進(jìn)程的運(yùn)行情況和行為進(jìn)行調(diào)整,以反映進(jìn)程在運(yùn)行時的實(shí)際優(yōu)先級。
優(yōu)先級類型
在Linux系統(tǒng)中,進(jìn)程的優(yōu)先級類型主要包括:普通進(jìn)程優(yōu)先級、實(shí)時進(jìn)程優(yōu)先級、批處理進(jìn)程優(yōu)先級,以滿足不同應(yīng)用場景的需求。
1、普通進(jìn)程優(yōu)先級:是指非實(shí)時、非批處理的進(jìn)程所具有的優(yōu)先級。這類進(jìn)程在系統(tǒng)中最為常見,包括用戶運(yùn)行的圖形界面程序、后臺服務(wù)等。普通進(jìn)程優(yōu)先級適用于大多數(shù)用戶進(jìn)程,默認(rèn)使用CFS調(diào)度器。普通進(jìn)程優(yōu)先級通常通過一個稱為“Nice值”的數(shù)值來表示。Nice值的范圍是-20到19,其中-20表示最高優(yōu)先級,19表示最低優(yōu)先級。較低的Nice值表示較高的優(yōu)先級,而較高的Nice值則表示較低的優(yōu)先級。
我們可以使用nice命令來啟動一個新進(jìn)程,并設(shè)置其Nice值。比如:nice -n 10 ./hope_wisdom,會以Nice值為10來啟動hope_wisdom程序。當(dāng)然,也可以使用renice命令調(diào)整已經(jīng)運(yùn)行的進(jìn)程的Nice值。
注意:普通用戶通常只能提高自己的Nice值(即降低優(yōu)先級),而不能降低其他用戶的Nice值(即提高優(yōu)先級),這需要使用超級用戶權(quán)限。
2、實(shí)時進(jìn)程優(yōu)先級:適用于對響應(yīng)時間有嚴(yán)格要求的實(shí)時進(jìn)程,比如實(shí)時音頻處理、控制系統(tǒng)等。實(shí)時進(jìn)程使用專門的調(diào)度策略,比如:SCHED_FIFO(先入先出)和SCHED_RR(時間片輪轉(zhuǎn))。實(shí)時進(jìn)程的優(yōu)先級范圍從0到99,其中0是最高的優(yōu)先級。
實(shí)時進(jìn)程的優(yōu)先級非常高,能夠確保在指定的時間內(nèi)得到響應(yīng)和執(zhí)行。這對于需要嚴(yán)格時間控制的多媒體應(yīng)用和實(shí)時控制系統(tǒng)來說,至關(guān)重要。然而,如果系統(tǒng)中存在過多的實(shí)時進(jìn)程,可能會導(dǎo)致CPU資源被過度占用,從而影響其他進(jìn)程的執(zhí)行。
我們可以使用chrt命令設(shè)置實(shí)時進(jìn)程的調(diào)度策略和優(yōu)先級。比如:chrt -f 66 ./hope_wisdom,會以實(shí)時FIFO策略啟動hope_wisdom程序,并設(shè)置其優(yōu)先級為66。
3、批處理進(jìn)程優(yōu)先級:是指那些不需要立即執(zhí)行,可以在系統(tǒng)負(fù)載較低時運(yùn)行的進(jìn)程。這類進(jìn)程通常用于執(zhí)行批處理作業(yè),比如:數(shù)據(jù)備份、數(shù)據(jù)分析、打印隊(duì)列管理、文件索引構(gòu)建等。批處理進(jìn)程通常具有較低的優(yōu)先級,以避免干擾前臺用戶的交互體驗(yàn)。
設(shè)置優(yōu)先級
在Linux中,設(shè)置進(jìn)程的優(yōu)先級主要有兩個函數(shù),分別為:setpriority、sched_setscheduler。
1、setpriority函數(shù):用于設(shè)置進(jìn)程或進(jìn)程組的靜態(tài)優(yōu)先級,從而影響進(jìn)程在系統(tǒng)中的調(diào)度順序。其函數(shù)原型如下:
int setpriority(int which, id_t who, int prio);
which:指定要設(shè)置優(yōu)先級的對象類型,取值如下。
(1)PRIO_PROCESS:設(shè)置單個進(jìn)程的優(yōu)先級。
(2)PRIO_PGRP:設(shè)置進(jìn)程組的優(yōu)先級。
(3)PRIO_USER:設(shè)置用戶的所有進(jìn)程的優(yōu)先級。
who:指定對象的標(biāo)識符,根據(jù)which參數(shù)的不同,who的含義也不同。
(1)如果which是PRIO_PROCESS,who是進(jìn)程ID。
(2)如果which是PRIO_PGRP,who是進(jìn)程組ID。
(3)如果which是PRIO_USER,who是用戶ID。如果who是0,則表示當(dāng)前用戶。
prio:要設(shè)置的優(yōu)先級。靜態(tài)優(yōu)先級的范圍是從-20(最高優(yōu)先級)到19(最低優(yōu)先級),默認(rèn)值為0。
返回值:成功時,返回0。失敗時,返回-1,并設(shè)置errno為適當(dāng)?shù)腻e誤碼。常見的錯誤碼有:EINVAL(無效的參數(shù)或策略)、EPERM(權(quán)限不足,嘗試設(shè)置高于當(dāng)前進(jìn)程最大允許優(yōu)先級的優(yōu)先級)、ESRCH(指定的進(jìn)程不存在)。
2、sched_setscheduler函數(shù):用于設(shè)置進(jìn)程的調(diào)度策略和優(yōu)先級。這對于實(shí)時應(yīng)用尤其重要,因?yàn)樗试S開發(fā)者精確控制進(jìn)程的執(zhí)行順序和優(yōu)先級,確保關(guān)鍵任務(wù)能夠及時得到處理。其函數(shù)原型如下:
struct sched_param
{
int sched_priority; // 進(jìn)程的優(yōu)先級
};
int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param);
pid:進(jìn)程ID。如果設(shè)置為0,則表示當(dāng)前進(jìn)程。
policy:調(diào)度策略,取值如下。
(1)SCHED_FIFO:先入先出調(diào)度策略,適用于實(shí)時任務(wù)。
(2)SCHED_RR:輪轉(zhuǎn)法調(diào)度策略,適用于實(shí)時任務(wù),每個進(jìn)程有一個固定的時間片。
(3)SCHED_OTHER:默認(rèn)的調(diào)度策略,適用于普通用戶進(jìn)程,使用完全公平調(diào)度器(即CFS)。
(4)SCHED_BATCH:批處理調(diào)度策略,適用于長時間運(yùn)行的計(jì)算密集型任務(wù)。
(5)SCHED_IDLE:低優(yōu)先級調(diào)度策略,適用于極低優(yōu)先級的后臺任務(wù)。
param:指向sched_param結(jié)構(gòu)體的指針,該結(jié)構(gòu)體包含進(jìn)程的優(yōu)先級信息。
返回值:成功時,返回0。失敗時,返回-1,并設(shè)置errno為適當(dāng)?shù)腻e誤碼。常見的錯誤碼有:EINVAL(無效的參數(shù)或策略)、EPERM(權(quán)限不足,嘗試設(shè)置高于當(dāng)前進(jìn)程最大允許優(yōu)先級的優(yōu)先級)、ESRCH(指定的進(jìn)程不存在)。