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