­

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會排到同優先順序隊列的