RTP之調度策略
- 2019 年 10 月 11 日
- 筆記
在《Task之調度策略》里介紹了VxWorks的主要調度策略,而有了RTP之後,系統又是如何調度的呢?其實非常非常簡單:RTP不參與調度,VxWorks還是使用之前的調度策略,即所有Task基於優先順序搶佔,以及默認關閉的時間片輪轉。這確保在任何給定的時刻,系統中準備運行的最高優先順序Task都將執行,而不管該Task是在內核中還是在任何進程中。相比之下,非實時系統主要使用分時調度策略,以及動態調整進程優先順序,以確保沒有進程會長期無法使用CPU,並且沒有進程獨佔CPU。VxWorks的時間片輪轉也是一種分時策略,但它不會干擾優先順序的搶佔,因此它具有確定性,保證了實時性。
如果你不打算使用pthread,現在就可以跳到文末點贊了
———-分割線———
不過,為了更好的支援POSIX標準,VxWorks在RTP里引入了POSIX的Thread調度策略。事實上,要想在RTP里使用POSIX的Thread,必須要包含這種調度策略:INCLUDE_POSIX_PTHREAD_SCHEDULER

從名字上就可以看出來,這種策略只對RTP里的Thread有效。而Kernel里的Task和Thread,以及RTP里的Task,用的都是VxWorks的傳統策略

POSIX定義的幾種調度策略在VxWorks的RTP中的實現方式:
- SCHED_FIFO – 類似於默認的優先順序搶佔
- SCHED_RR – 基於時間片輪轉策略封裝
- SCHED_OTHER – 直接使用當前調度策略
- SCHED_SPORADIC – 這個複雜些,沒有直接對應的策略。它適用於零星的非周期行為,可以讓該Thread在短期內以高優先順序執行,其它時間內以低優先順序執行
需要注意的地方:
- 不建議Thread函數與Task函數混用,即POSIX的Thread里就不要調用Task相關的函數了
- Task的優先順序越高,數字越小,例如0是最高優先順序;POSIX Thread相反,優先順序越高,數字越大。不過將全局變數posixPriorityNumbering的值由默認的TRUE改為FALSE後,POSIX的優先順序就與VxWorks的一致了

- Thread的調度策略不能動態切換到SCHED_SPORADIC,但是可以從SCHED_SPORADIC動態切換到其它策略
- 如果已經使能了時間片輪轉策略,再使用kernelTimeSlice()改變時間片大小的時候,不會影響到之前使用SCHED_RR策略創建的Thread的時間片。
- 使用pthread_setschedprio()降低Thread的優先順序後,該Thread會排到同優先順序隊列的頭部;而使用taskPrioritySet()降低Task的優先順序後,該Task會排到同優先順序隊列的尾部