要想使用好RTOS,做出更加穩定可靠的產品,必須非常清楚底層的調度原理。由于RTOS的實時性與可控性,所以只有了解了其核心部分的設計思想,才能用起來得心應手,游刃有余。本文從RT-Thread的調度器設計的運行方式上解釋一下調度器的行為,從而更加深刻的理解RT-Thread操作系統的調度時機。
1.調度是什么?
調度一般就是合理的安排、協調資源,統一指揮去完成一件事,而在操作系統中,線程調度就是有多個就緒優先級的任務,找到最高優先級任務,交給CPU去運行。
RT-Thread調度器就是起到判決線程當前的優先級,然后選擇當前系統中最高優先級的就緒態的線程交給CPU去管理。
調度又可以細分為兩種。可打斷調度:關鍵防止優先級倒置;不可打斷調度:先來先服務,不可中斷。RT-Thread 屬于實時操作系統,所以其調度器實現的是可打斷的調度,當有更高優先級的線程或者更重要的任務就行,則可以打斷當前任務的執行狀態,去執行優先級更高的任務。那么此時,調度的時機就非常的關鍵了。
2.調度怎么實現?
RT-Thread在創建任務的時候,會指定任務的優先級,一般來說,每個任務都有自己特定的唯一的優先級。所以內核線程對象中有不同的優先級的任務列表。
如果最大指定為32個優先級,那么可以用32位數據類型表示,每一個bit表示一個優先級就緒的狀態。使用位圖的優點就是速度快,而且內存占用小。
一般來說,調度去找到最高優先級的任務時,就需要去做判斷。如何去找到最高優先級的任務。一般來說,有兩種辦法:
軟件計算
硬件計算
這兩種的差別僅僅在于計算效率的問題,本質目的并無差別。
而用軟件計算方法尋找最高優先級有兩種實現的策略:
1.遍歷就緒的隊列,找到最小的優先級就緒的隊列,尋找的時間不確定,時間復雜度O(n)。
2.采用空間換時間的辦法,事先做好一個bitmap
例如系統中最大有8個優先級,那么bitmap如下:
1constrt_uint8_t__lowest_bit_bitmap[]= 2{ 3/*00*/0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 4/*10*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 5/*20*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 6/*30*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 7/*40*/6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 8/*50*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 9/*60*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 10/*70*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 11/*80*/7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 12/*90*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 13/*A0*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 14/*B0*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 15/*C0*/6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 16/*D0*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 17/*E0*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 18/*F0*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 19};一般每一位代表一個就緒的狀態,所以__rt_ffs程序的設計如下
1int__rt_ffs(intvalue) 2{ 3if(value==0)return0; 4 5if(value&0xff) 6return__lowest_bit_bitmap[value&0xff]+1; 7 8if(value&0xff00) 9return__lowest_bit_bitmap[(value&0xff00)>>8]+9; 10 11if(value&0xff0000) 12return__lowest_bit_bitmap[(value&0xff0000)>>16]+17; 13 14return__lowest_bit_bitmap[(value&0xff000000)>>24]+25; 15}
如果當前系統的線程狀態為0b0110 0000,那么轉換成十六進制就是0x60,根據表中的狀態此時的最高優先級是5+1=6。所以可以得出系統的優先級,此時計算的復雜度為O(1)。
雖然RT-Thread 是支持同等優先級的,但是在具體的業務邏輯的設計中,在使用RTOS常用的設計方法中,一般都是要求程序的運行邏輯是可預測的,就是在程序執行的過程中,可以預測到程序下一步的動作。所以rtos中同等優先級,按照時間片輪訓的這種方式設計業務邏輯的情況并不多。使用相同優先級會增加系統的業務邏輯的復雜性。
3.什么時候系統做調度?
RT-Thread 是搶占式的系統調用,所以系統什么時候去做的調度非常的關鍵。系統調度行為具體又分為主動調度和被動調度兩種。
3.1 任務主動block
當A線程在正常運行時,主動放棄CPU的使用權,比如去執行rt_thread_delay或者等待一個IPC消息時,當前線程會主動放棄CPU資源,此時去系統中尋找已經就緒的最高優先級的線程進行調度。
這種方式應用的場景比較豐富,比如當前線程沒有獲取到資源時,需讓出CPU的使用權,或者事情做完了,主動讓出CPU的使用權,這就是系統做調度的時機。
A線程的優先級要高于B線程的優先級,所以在A放棄CPU使用權后,已經就緒的最高優先級線程B就開始執行了。
3.2 被更高優先級的任務喚醒
這種方式就是當比當前運行線程的優先級高的線程處于就緒態時,高優先級的就緒態線程會被喚醒,低優先級線程將暫停運行,此時會調度到比當前線程更高的優先級線程中去。
按照理解A線程是正在運行的線程,此時更高任務優先級的線程C就緒處于就緒狀態了。比如創建了一個比A優先級更高的C進程,并startup C線程,此時會執行rt_schedule()將線程切換到優先級更高的C線程。此時A線程運行狀態以及處理器寄存器狀態壓棧,更高優先級的C線程的狀態以及處理器寄存器狀態出棧,并且開始運行C線程。
3.3 yield放棄cpu使用
首先理解一下什么是yield,解釋成讓出,放棄比較合理。該出讓只針對于同等優先級的線程。
這種情況只適用于A線程的優先級等于B線程的優先級的情況。因為RTT支持同等優先級的方式創建線程,相同的優先級的切換是靠時間片輪詢來進行的。所以,當A線程正常運行的時候,如果執行了yield函數,那么只相當于將A線程的時間片消耗完,此時同等優先級的D線程開始運行。 由于在RTOS中,需要的是完成任務的確定性與可靠性,同等優先級的情況比較有限,所以這一塊應用的不多。
3.4 中斷中執行調度
以上的三種屬于主動進行調度的過程,其系統的執行流程都是可以預測的,但是中斷去執行調度卻是比較特殊。是被動調度。
這種方式是在中斷中執行調度的,當A線程正常運行時,此時來了一個中斷,由于中斷的優先級是高于線程的。所以,中斷處理事情,如果在中斷中執行了調度函數,那么在中斷退出后,將直接切換到當前系統中更高優先級的線程去運行。如果如果當前系統的最高優先級還是A,那么中斷退出后,執行的最高優先級線程依然是A。若存在線程E線程優先級高于A并且處于就緒狀態,此時,中斷退出后,切換到E線程去執行。
4.調度做了哪些事情?
系統進行調度的時候做了哪些事情?
第一步:查找當前系統中當前以及就緒的最高優先級的線程,若有高于當前運行系統運行的線程棧則執行線程切換
第二步:關閉中斷,將系統當前運行狀態以及處理器的寄存器壓入棧空間
第三步:找到需要運行的線程的PC指針,并找到棧起始處彈出棧空間中的寄存器狀態
第四部:打開中斷,執行異常ret,讓系統恢復執行
此時,就切換到已經就緒的更高優先級的線程去運行了。
5.總結
RT-Thread 線程的調度器是整個系統的靈魂,整個操作系統在運行過程中何時切換線程、什么情況下去處理任務,以及做更高效的業務邏輯的應用都離不開系統調度。掌握了調度器運行的規律,并且合理的使用線程調度時機,可以設計出更加穩定可靠的產品。通過閱讀代碼,就能預測程序下一步的執行動作。真正的做到手中有糧,心中不慌。
-
cpu
+關注
關注
68文章
10911瀏覽量
213150 -
操作系統
+關注
關注
37文章
6900瀏覽量
123812 -
實時操作系統
+關注
關注
1文章
199瀏覽量
30841 -
RT-Thread
+關注
關注
31文章
1306瀏覽量
40434 -
調度器
+關注
關注
0文章
98瀏覽量
5299
原文標題:?RT-Thread的線程調度與管理分析
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
RT-Thread操作系統應用開發寒假師資培訓
![<b class='flag-5'>RT-Thread</b><b class='flag-5'>操作系統</b>應用開發寒假師資培訓](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
RT-Thread聯合河北大學發起嵌入式操作系統專業班-保定站
![<b class='flag-5'>RT-Thread</b>聯合河北大學發起嵌入式<b class='flag-5'>操作系統</b>專業班-保定站](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
【本周六-深圳】RT-Thread嵌入式操作系統專業培訓班正式開班
![【本周六-深圳】<b class='flag-5'>RT-Thread</b>嵌入式<b class='flag-5'>操作系統</b>專業培訓班正式開班](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
喜報|睿賽德科技RT-Thread操作系統成功入選上海市重點推薦目錄
![喜報|睿賽德科技<b class='flag-5'>RT-Thread</b><b class='flag-5'>操作系統</b>成功入選上海市重點推薦目錄](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
新書發布——《RT-Thread嵌入式實時操作系統內核、驅動和應用開發技術》
![新書發布——《<b class='flag-5'>RT-Thread</b>嵌入式實時<b class='flag-5'>操作系統</b>內核、驅動和應用開發技術》](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
【好書推薦】RT-Thread設備驅動開發指南
![【好書推薦】<b class='flag-5'>RT-Thread</b>設備驅動開發指南](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
RT-Thread內部機制大揭秘,帶你深入操作系統內核
![<b class='flag-5'>RT-Thread</b>內部機制大揭秘,帶你深入<b class='flag-5'>操作系統</b>內核](https://file.elecfans.com/web2/M00/20/B3/pYYBAGGfNNmAK-PZAAJsGM5Cgk0227.jpg)
睿賽德科技CEO熊譜翔 ——基于RT-Thread操作系統的安全車控系統實踐
![睿賽德科技CEO熊譜翔 ——基于<b class='flag-5'>RT-Thread</b><b class='flag-5'>操作系統</b>的安全車控<b class='flag-5'>系統</b>實踐](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
RT-Thread 新里程碑達成——GitHub Star 破萬!
![<b class='flag-5'>RT-Thread</b> 新里程碑達成——GitHub Star 破萬!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
基于 RT-Thread專業版的EtherCAT主站方案
![基于 <b class='flag-5'>RT-Thread</b>專業版的EtherCAT主站方案](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
開發者分享 | 基于先楫RT-Thread BSP,使用CLion開發應用
![開發者分享 | 基于先楫<b class='flag-5'>RT-Thread</b> BSP,使用CLion開發應用](https://file.elecfans.com/web2/M00/37/D7/pYYBAGI9l9uAOwALAAAmFmqVYdg094.png)
實時操作系統之RT-Thread及FreeRTOS
![實時<b class='flag-5'>操作系統</b>之<b class='flag-5'>RT-Thread</b>及FreeRTOS](https://file.elecfans.com/web2/M00/20/B3/pYYBAGGfNNmAK-PZAAJsGM5Cgk0227.jpg)
新書發布——《實時操作系統應用技術:RT-Thread與ARM編程實踐》
![新書發布——《實時<b class='flag-5'>操作系統</b>應用技術:<b class='flag-5'>RT-Thread</b>與ARM編程實踐》](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
RT-Thread榮獲“最具影響力IoT操作系統獎”
![<b class='flag-5'>RT-Thread</b>榮獲“最具影響力IoT<b class='flag-5'>操作系統</b>獎”](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
評論