目錄
1.什么是進(jìn)程優(yōu)先級(jí)?
2.進(jìn)程優(yōu)先級(jí)原理
3.查看進(jìn)程優(yōu)先級(jí)
4.修改進(jìn)程優(yōu)先級(jí)
4.1 setpriority函數(shù)原型
4.2 getpriority函數(shù)原型
4.3 sched_setscheduler函數(shù)原型
4.4 sched_getscheduler函數(shù)原型
4.5 sched_setparam函數(shù)原型
4.6 sched_getparam函數(shù)原型
1.什么是進(jìn)程優(yōu)先級(jí)?
Linux進(jìn)程的優(yōu)先級(jí)是用來(lái)確定在多個(gè)進(jìn)程同時(shí)運(yùn)行時(shí),哪個(gè)進(jìn)程會(huì)獲得更多的CPU時(shí)間片。
Linux進(jìn)程的優(yōu)先級(jí)分為實(shí)時(shí)優(yōu)先級(jí)和普通優(yōu)先級(jí)。
實(shí)時(shí)優(yōu)先級(jí)用于實(shí)時(shí)應(yīng)用程序,如硬實(shí)時(shí)任務(wù)和實(shí)時(shí)控制系統(tǒng),而普通優(yōu)先級(jí)用于非實(shí)時(shí)應(yīng)用程序。
2.進(jìn)程優(yōu)先級(jí)原理
-
實(shí)時(shí)進(jìn)程:動(dòng)態(tài)優(yōu)先級(jí)為0-99的進(jìn)程,采用實(shí)時(shí)調(diào)度算法調(diào)度。
-
普通進(jìn)程:動(dòng)態(tài)優(yōu)先級(jí)為100-139的進(jìn)程,采用完全公平調(diào)度算法調(diào)度。
-
nice值:是用于調(diào)整普通進(jìn)程優(yōu)先級(jí)的參數(shù)。范圍:-20-19。
2.1 task_struct優(yōu)先級(jí)
task_struct {
......
int? ? ? ? ? ? ?prio;?
int? ? ? ? ? ? ?static_prio;
int? ? ? ? ? ? ?normal_prio;
unsigned int? ? ? ? ? ? rt_priority;?
};
-
prio(動(dòng)態(tài)優(yōu)先級(jí))
動(dòng)態(tài)優(yōu)先級(jí),有效優(yōu)先級(jí),調(diào)度器最終使用的優(yōu)先級(jí)數(shù)值,范圍0-139,值越小,優(yōu)先級(jí)越高。
-
static_prio(靜態(tài)優(yōu)先級(jí))
靜態(tài)優(yōu)先級(jí),采用SCHED_NORMAL和SCHED_BATCH調(diào)度策略的進(jìn)程(即普通進(jìn)程)用于計(jì)算動(dòng)態(tài)優(yōu)先級(jí)的,范圍100-139。
prio = static_prio = nice + DEFAULT_PRIO = nice + 120。
-
normal_prio(歸一化優(yōu)先級(jí))
用于計(jì)算prio的中間變量,不需要太關(guān)心。
-
rt_priority(實(shí)時(shí)優(yōu)先級(jí))
實(shí)時(shí)優(yōu)先級(jí),采用SCHED_FIFO和SCHED_RR調(diào)度策略進(jìn)程(即實(shí)時(shí)進(jìn)程)用于計(jì)算動(dòng)態(tài)優(yōu)先級(jí),范圍0-99。
prio = MAX_RT_PRIO - 1 - rt_prio = 100 - 1 - rt_priority;
實(shí)時(shí)優(yōu)先級(jí)數(shù)值越大,得到的動(dòng)態(tài)優(yōu)先級(jí)數(shù)值越小,優(yōu)先級(jí)越高。
3.查看進(jìn)程優(yōu)先級(jí)
3.1 執(zhí)行ps -elf 命令查看進(jìn)程優(yōu)先級(jí)
PRI:進(jìn)程優(yōu)先級(jí),數(shù)值越小,優(yōu)先級(jí)越高。(并非動(dòng)態(tài)優(yōu)先級(jí))
NI:nice值。
3.2cat /proc/PID/sched查看進(jìn)程調(diào)度信息
policy:調(diào)度策略
prio:動(dòng)態(tài)優(yōu)先級(jí)
4.修改進(jìn)程優(yōu)先級(jí)
4.1 setpriority函數(shù)原型
int setpriority(int which, id_t who, int prio);
功能:setpriority函數(shù)用于設(shè)置進(jìn)程nice值。
參數(shù):
which:指定要修改nice值的對(duì)象,可以是以下值之一:
-
PRIO_PROCESS:用于修改指定進(jìn)程的優(yōu)先級(jí)。
-
PRIO_PGRP:用于修改指定進(jìn)程組的優(yōu)先級(jí)。
-
PRIO_USER:用于修改指定用戶的所有進(jìn)程的優(yōu)先級(jí)。
who:指定被修改優(yōu)先級(jí)的對(duì)象的標(biāo)識(shí)符。
-
如果which為PRIO_PROCESS,則who為目標(biāo)進(jìn)程的進(jìn)程ID(PID)。
-
如果which為PRIO_PGRP,則who為目標(biāo)進(jìn)程組的進(jìn)程組ID(PGID)。
-
如果which為PRIO_USER,則who為目標(biāo)用戶的用戶ID(UID)。
prio:新的nice值,范圍通常為-20到19之間。
返回值:
成功:返回0。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-743908.html
失?。悍祷?1,并設(shè)置errno。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-743908.html
4.2 getpriority函數(shù)原型
int getpriority(int which, id_t who);
功能:getpriority函數(shù)用于獲取進(jìn)程nice值。
參數(shù):
which:指定要獲取nice值的對(duì)象,可以是以下值之一:
-
PRIO_PROCESS:用于修改指定進(jìn)程的優(yōu)先級(jí)。
-
PRIO_PGRP:用于修改指定進(jìn)程組的優(yōu)先級(jí)。
-
PRIO_USER:用于修改指定用戶的所有進(jìn)程的優(yōu)先級(jí)。
who:指定獲取nice值的對(duì)象的標(biāo)識(shí)符。
-
如果which為PRIO_PROCESS,則who為目標(biāo)進(jìn)程的進(jìn)程ID(PID)。
-
如果which為PRIO_PGRP,則who為目標(biāo)進(jìn)程組的進(jìn)程組ID(PGID)。
-
如果which為PRIO_USER,則who為目標(biāo)用戶的用戶ID(UID)。
返回值:
成功:返回nice值。
失?。悍祷?1,并設(shè)置errno。
4.3 sched_setscheduler函數(shù)原型
int sched_setscheduler(pid_t pid, int policy,?const struct sched_param *param);
功能:sched_setscheduler函數(shù)是Linux系統(tǒng)中用于設(shè)置進(jìn)程調(diào)度策略和優(yōu)先級(jí)的系統(tǒng)調(diào)用。
參數(shù):
pid:進(jìn)程ID,0表示當(dāng)前進(jìn)程。
policy:表示要設(shè)置的調(diào)度策略,常用的調(diào)度策略有以下幾種選項(xiàng):
-
SCHED_OTHER:普通進(jìn)程調(diào)度策略。
-
SCHED_FIFO:先進(jìn)先出調(diào)度策略。
-
SCHED_RR:輪轉(zhuǎn)調(diào)度策略。
param:是一個(gè)指向sched_param結(jié)構(gòu)的指針,用于指定優(yōu)先級(jí)參數(shù)。
struct sched_param {
? ? ? ? ? ? ? ?...
? ? ? ? ? ? ? ?int sched_priority;?
? ? ? ? ? ? ? ?...
?};
返回值:
成功:返回0。
失敗:返回-1,并設(shè)置errno。
sched_setscheduler使用注意事項(xiàng):
調(diào)度策略在內(nèi)核中的定義:
4.4 sched_getscheduler函數(shù)原型
int sched_getscheduler(pid_t pid);
功能:sched_getscheduler函數(shù)是Linux系統(tǒng)中的一個(gè)于獲取指定進(jìn)程的調(diào)度策略。
參數(shù):
pid:進(jìn)程id,0表示當(dāng)前進(jìn)程。
返回值:
成功:返回調(diào)度策略:
-
SCHED_OTHER
-
SCHED_FIFO
-
SCHED_RR
-
SCHED_BATCH
-
SCHED_IDLE
失敗:返回-1,并設(shè)置errno。
4.5 sched_setparam函數(shù)原型
int sched_setparam(pid_t pid, const struct sched_param *param);
功能:sched_setparam用于設(shè)置進(jìn)程實(shí)時(shí)優(yōu)先級(jí),該函數(shù)不能設(shè)置調(diào)度策略。
參數(shù):
pid:進(jìn)程id,0表示當(dāng)前進(jìn)程。
param:參數(shù)sched_setscheduler函數(shù)。
返回值:
成功:返回0。
失?。悍祷?1,并設(shè)置errno。
4.6 sched_getparam函數(shù)原型
int sched_getparam(pid_t pid, struct sched_param *param);
功能:sched_getparam用于獲取指定進(jìn)程的實(shí)時(shí)優(yōu)先級(jí)。
參數(shù):
pid:進(jìn)程id,0表示當(dāng)前進(jìn)程。
param:參數(shù)sched_setscheduler函數(shù)。
返回值:
成功:返回0。
失敗:返回-1,并設(shè)置errno。
到了這里,關(guān)于圖解Linux進(jìn)程優(yōu)先級(jí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!