1. 程式人生 > 實用技巧 >RT-Thread_執行緒的時間片輪詢排程

RT-Thread_執行緒的時間片輪詢排程

執行緒和優先順序

優先順序和時間片是執行緒的兩個重要引數,分別描述執行緒競爭處理器資源的能力和持有處理器時間長短的能力。

RT-Thread支援256個優先順序。數值越小,優先順序越高。0為最高優先順序,最低優先順序預留給空閒執行緒。使用者可以通過rt_config.h中的RT_THREAD_PRIORITY_MAX巨集來修改最大支援的優先順序。針對STM32預設設定最大支援32個優先順序。

具體應用中,執行緒總數不受限制,可以建立多個優先順序相同的執行緒。能建立的執行緒總數只和具體硬體平臺的記憶體有關。

執行緒時間片

時間片只在相同優先順序的就緒態執行緒中起作用,系統對相同優先順序的就緒態執行緒採用時間片輪轉的排程方式進行排程。時間片起到約束執行緒單次執行時長的作用,其單位是一個系統節拍(OS Tick)。

假設有2個相同優先順序的就緒態執行緒A和B,A執行緒的時間片設定為10,B執行緒的時間片設定為5,那麼,當系統中不存在高於A執行緒優先順序的就緒態執行緒時,系統會在A、B執行緒間來回切換執行,並且每次對A執行緒執行10個節拍的時長,對B執行5個節拍的時長。

執行緒排程規則

優先順序搶佔排程

作業系統總是讓具有最高優先順序的就緒任務有限執行:當有任務的優先順序高於當前任務的優先順序並且處於就緒態後,就一定會發生系統排程。

通過優先順序搶佔機制,最大限度地滿足了系統的實時性。

時間片輪詢排程

當作業系統中存在優先順序相同的執行緒時(優先順序相同就不會發生搶佔),作業系統會按照執行緒設定的時間片大小輪流排程執行緒,時間片起到約束執行緒單次執行時長的作用,其單位是1個系統節拍(OS Tick)。

時間片輪詢排程機制,保證優先順序相同的執行緒輪流佔用處理器。

時間片輪詢排程示例

timeslice_sample.c

 1 #include <rtthread.h>
 2 
 3 #define THREAD_STACK_SIZE    1024
 4 #define THREAD_PRIORITY        20
 5 #define THREAD_TIMESLICE    10
 6 
 7 /* 執行緒入口 */
 8 static void thread_entry(void* parameter)
 9 {
10     rt_uint32_t value;
11     rt_uint32_t count = 0
; 12 13 value = (rt_uint32_t)parameter; 14 while (1) 15 { 16 if(0 == (count % 5)) 17 { 18 rt_kprintf("thread %d is running ,thread %d count = %d\n", value , value , count); 19 20 if(count > 200) 21 return; 22 } 23 count++; 24 } 25 } 26 27 int timeslice_sample(void) 28 { 29 rt_thread_t tid; 30 /* 建立執行緒1 */ 31 tid = rt_thread_create("thread1", 32 thread_entry, (void*)1, 33 THREAD_STACK_SIZE, 34 THREAD_PRIORITY, THREAD_TIMESLICE); 35 if (tid != RT_NULL) 36 rt_thread_startup(tid); 37 38 39 /* 建立執行緒2 */ 40 tid = rt_thread_create("thread2", 41 thread_entry, (void*)2, 42 THREAD_STACK_SIZE, 43 THREAD_PRIORITY, THREAD_TIMESLICE-5); 44 if (tid != RT_NULL) 45 rt_thread_startup(tid); 46 return 0; 47 } 48 49 /* 匯出到 msh 命令列表中 */ 50 MSH_CMD_EXPORT(timeslice_sample, timeslice sample);
timeslice_sample.c

示例中建立了2個動態執行緒,線上程建立函式的後兩個引數分別是執行緒的優先順序和時間片。示例中兩個執行緒的優先順序引數是相同的,時間片引數是不同的。

兩個執行緒使用了同一個入口程式碼。

執行緒程式碼中,將執行緒傳入的引數儲存在變數中,並計數。然後列印執行緒引數和計數值。

程式碼是迴圈執行的形式,但是是順序執行的,因為迴圈內部有迴圈跳出。