個(gè)人理解,內(nèi)核級線程和進(jìn)程是一樣的,前者與POSIX線程(pthread)有很大的區(qū)別。因此,內(nèi)核的進(jìn)程調(diào)度策略和系統(tǒng)調(diào)用也適用于內(nèi)核級線程。
調(diào)度策略有三種:
1.SCHED_NORMAL 非實(shí)時(shí)調(diào)度策略,默認(rèn)情況下是100~139,由nice值決定;
2.SCHED_FIFO實(shí)時(shí)調(diào)度策略,先到先服務(wù)。一旦占用cpu則一直運(yùn)行。一直運(yùn)行直到有更高優(yōu)先級任務(wù)到達(dá)或自己放棄
3.SCHED_RR實(shí)時(shí)調(diào)度策略,時(shí)間片輪轉(zhuǎn)。當(dāng)進(jìn)程的時(shí)間片用完,系統(tǒng)將重新分配時(shí)間片,并置于就緒隊(duì)列尾。同樣可以被高優(yōu)先級搶占。
兩種實(shí)時(shí)優(yōu)先級范圍在0至MAX_RT_PRIO-1之間,默認(rèn)為0到99。
相關(guān)的系統(tǒng)調(diào)用(來自于LKD,不同內(nèi)核可能有所不同):
| nice() | 設(shè)置進(jìn)程的nice值 |
| sched_setscheduler() | 設(shè)置進(jìn)程的調(diào)度策略 |
| sched_getscheduler() | 獲取進(jìn)程的調(diào)度策略 |
| sched_setparam() | 設(shè)置進(jìn)程的實(shí)時(shí)優(yōu)先級 |
| sched_getparam() | 獲取進(jìn)程的實(shí)時(shí)優(yōu)先級 |
| sched_get_priority_max() | 獲取實(shí)時(shí)優(yōu)先級的最大值 |
| sched_get_priority_min() | 獲取實(shí)時(shí)優(yōu)先級的最小值 |
| sched_rr_get_interval() | 獲取進(jìn)程的時(shí)間片值 |
| sched_setaffinity() | 設(shè)置進(jìn)程的處理器的親和力 |
| sched_getaffinity() | 獲取進(jìn)程的處理器的親和力 |
| sched_yield() | 暫時(shí)讓出處理器 |
設(shè)置時(shí)需要用到struct sched_param這個(gè)結(jié)構(gòu)。
以下為我寫的內(nèi)核線程中的部分代碼:
struct sched_param param;
param.sched_priority = 99;
sched_setscheduler(current, SCHED_FIFO, ¶m)//出錯(cuò)時(shí)返回-1
新聞熱點(diǎn)
疑難解答
圖片精選