背景Linux會(huì)把進(jìn)程分為普通進(jìn)程和實(shí)時(shí)進(jìn)程,普通進(jìn)程采用CFS之類(lèi)調(diào)度算法,而實(shí)時(shí)進(jìn)程則是采用SCHED_FIFO或SCHED_RR。無(wú)論優(yōu)先級(jí)高低,實(shí)時(shí)進(jìn)程都會(huì)優(yōu)先于SCHED_NORMAL中的所有進(jìn)程先執(zhí)行,因?yàn)楹笳呃锩娑际瞧胀ǖ姆菍?shí)時(shí)進(jìn)程。
具體可以參看Linux閱碼場(chǎng)早期文章: 宋寶華:關(guān)于Linux進(jìn)程優(yōu)先級(jí)數(shù)字混亂的徹底澄清
內(nèi)核線程的優(yōu)先級(jí)Linux內(nèi)核會(huì)將大量(并且在不斷增加中)工作放置在內(nèi)核線程中,這些線程是在內(nèi)核地址空間中運(yùn)行的特殊進(jìn)程。大多數(shù)內(nèi)核線程運(yùn)行在SCHED_NORMAL類(lèi)中,必須與普通用戶空間進(jìn)程爭(zhēng)奪CPU時(shí)間。但是有一些內(nèi)核線程它的開(kāi)發(fā)者們認(rèn)為它們非常特殊,應(yīng)該比用戶空間進(jìn)程要有更高優(yōu)先級(jí)。因此也會(huì)把這些內(nèi)核線程放到SCHED_FIFO中去。
那么問(wèn)題來(lái)了,某個(gè)內(nèi)核線程的實(shí)時(shí)優(yōu)先級(jí)到底該設(shè)為多少呢?
要回答這個(gè)問(wèn)題,不僅需要判斷這個(gè)線程相對(duì)于所有其他實(shí)時(shí)線程是否更加重要,還要跟用戶態(tài)的實(shí)時(shí)進(jìn)程比較誰(shuí)更重要。這是一個(gè)很難回答的問(wèn)題,更何況在不同的系統(tǒng)和工作模式下這個(gè)答案很有可能還會(huì)各不相同。所以一般來(lái)說(shuō),內(nèi)核開(kāi)發(fā)人員也就是看心情直接隨便選一個(gè)實(shí)時(shí)優(yōu)先級(jí)。
現(xiàn)在的一些內(nèi)核實(shí)時(shí)線程如下:
最近大神Peter Zijlstra又看到有內(nèi)核開(kāi)發(fā)者隨便給內(nèi)核線程設(shè)置優(yōu)先級(jí),終于看不下去了, 指責(zé)這種把內(nèi)核線程放入SCHED_FIFO的做法毫無(wú)意義:
“the kernel has no clue what actual priority it should use for various things, so it is useless (or worse, counter productive) to even try”
所以他發(fā)了一個(gè)系列[PATCH 00/23] sched: Remove FIFO priorities from modules 把設(shè)置內(nèi)核線程優(yōu)先級(jí)的接口干脆都給刪了,省得再有人瞎搞。
這個(gè)系列Patch(點(diǎn)擊閱讀原文可直達(dá))主要做了下面幾件事情:
刪除了原有的sched_setschedule() / sched_setattr() 接口
增加了
sched_set_fifo(p)
sched_set_fifo_low(p)
sched_set_normal(p, nice)
其中調(diào)用sched_set_fifo()會(huì)將指定進(jìn)程放到SCHED_FIFO類(lèi)中,其優(yōu)先級(jí)為50——這只是min和max之間的一半位置。
對(duì)于需求不那么迫切的線程,sched_set_fifo_low()將優(yōu)先級(jí)設(shè)置為最低值(1)。
而調(diào)用sched_set_normal()會(huì)將線程返回給定好的值SCHED_NORMAL類(lèi)。
通過(guò)只留下這三個(gè)接口可以避免開(kāi)發(fā)者們?cè)俨煌5厝ルS機(jī)選取內(nèi)核線程優(yōu)先級(jí),因?yàn)檫@樣本來(lái)毫無(wú)意義,當(dāng)然如果需要的話系統(tǒng)管理員還是可以按需調(diào)整不同進(jìn)/線程的優(yōu)先級(jí)。
到目前為止,這個(gè)系列Patch已經(jīng)有不少得到Reviewed-by,相信如果合入后,內(nèi)核線程混亂的優(yōu)先級(jí)狀況會(huì)得到持續(xù)改善。
責(zé)任編輯:pj
-
內(nèi)核
+關(guān)注
關(guān)注
4文章
1468瀏覽量
42874 -
Linux
+關(guān)注
關(guān)注
88文章
11760瀏覽量
219019
發(fā)布評(píng)論請(qǐng)先 登錄
內(nèi)核配置項(xiàng)引發(fā)網(wǎng)絡(luò)性能下降的深度剖析
【瑞薩FPB-RA6E2試用】【瑞薩FPB-RA6E2】RTOS(Real-Time Operating System,實(shí)時(shí)操作系統(tǒng))《線程》個(gè)人理解及項(xiàng)目實(shí)現(xiàn)
DR1M90 開(kāi)源 IgH EtherCAT 主站案例:伺服電機(jī)正反轉(zhuǎn)實(shí)時(shí)控制方案
三防漆哪種好?別再問(wèn)了!記住這個(gè)選型邏輯,比品牌更重要
UPS電源價(jià)格/報(bào)價(jià)全解析:告別迷茫,一文讀懂預(yù)算該怎么花
Linux-RT特點(diǎn)及簡(jiǎn)單應(yīng)用
【飛凌OK153-S開(kāi)發(fā)板評(píng)測(cè)】系統(tǒng)實(shí)時(shí)性及codesys測(cè)試
【飛凌OK-T153 開(kāi)發(fā)板試用】實(shí)時(shí)性測(cè)試
創(chuàng)龍 瑞芯微 RK3588 國(guó)產(chǎn)2.4GHz八核 工業(yè)開(kāi)發(fā)板—IgH?EtherCAT主站開(kāi)發(fā)案例(下)
創(chuàng)龍 瑞芯微 RK3588 國(guó)產(chǎn)2.4GHz八核 工業(yè)開(kāi)發(fā)板—IgH?EtherCAT主站開(kāi)發(fā)案例(上)
線程超時(shí)函數(shù)中 assert 失敗是什么原因?qū)е碌?
分辨率 vs 噪聲 —— ADC的挑戰(zhàn)
大牛多年研發(fā)電源問(wèn)題匯總(受益匪淺)
求助,關(guān)于CAN接收問(wèn)題求解
AXI接口FIFO簡(jiǎn)介
為什么說(shuō)內(nèi)核線程放入SCHED_FIFO的做法毫無(wú)意義?
評(píng)論