上面的一篇部落格說到了優先順序排程,但是那個優先順序排程演算法比較極端。打個比方說,現在王先生有三個小孩,分別是老大、老
二、老三。假設現在到了飯點,王先生需要給三個小孩餵飯。此時如果是時間片輪轉的話,那麼就是絕對公平,王先生每人一口不停地進行餵飯。如果是優先順序排程,那麼王先生首先自己有乙個優先順序考量,比如說三個小孩按照年齡順序優先順序是逐漸提高的,畢竟小孩需要更多的照顧嘛。這個時候如果需要進行餵飯的話,那麼王先生需要首先伺候好最小的那個小孩老三,才會有時間照顧老二,至於老大什麼時候才能得到照顧那就看造化了。
現在,我們打算重新換一種方法。假設三個小孩的優先順序分別是1、2、3,其中年齡越小優先順序越高,3代表高優先順序。接著,我們按照優先順序給三個小孩安排時間片,分別是1、2、3。同時,這個時間片不光代表了當前可用的剩餘時間,還代表了小孩此時的臨時優先順序。
(1)首先王先生給老三餵飯,時間片降低1,即臨時優先順序為2;
(2)接著王先生判斷當前優先順序最高的仍為老三,畢竟老二的優先順序也沒有超過老三,所以老三的時間片降1,臨時優先順序為1;
(3)王先生獲知當前優先順序最高的為老二,老二獲得時間片;
(4)此時王先生發現三個孩子的臨時優先順序都一樣,那麼就會按照固定優先順序的大小依次對老
三、老二、老大進行餵飯。
我們發現,這中間受益最大的就是老二。當然,我們可以做進一步推論,如果老王的孩子越多,那麼優先順序處於中間的孩子在時間片的分配上將更加均勻,響應也會更加及時,互動性也會變得很好。
根據以上的想法,我們重新改寫了優先順序排程演算法,修改為改進型優先順序排程演算法,
int find_next_thread()
}if(0 == value)
choice = -1;
return choice;
}
當然,加上原來的時間片輪轉排程、通用優先順序排程方法,此時就存在三種排程方法了。我們可以自己設定巨集,通過巨集的設定靈活選用排程演算法,
#define time_round_schedule 0
#define hard_priority_schedule 0
#define soft_priority_schedule 1
這些**都是可以在系統中共存的。選用什麼演算法,取決於實際情況是什麼樣的情形。
#include #include #include #include #include #include #include #define uint32 unsigned int
#define stack_length 512
#define thread_max_number 10
#define time_round_schedule 0
#define hard_priority_schedule 0
#define soft_priority_schedule 1
typedef struct _task_info
task_info;
static struct itimerval oldtv;
uint32 old = 0;
uint32 count = 0;
uint32 task_stack[thread_max_number][stack_length] = ;
task_info galltask[thread_max_number] = ;
uint32 current_thread_id = 0;
void set_timer()
void swap(uint32* prev, uint32* next)
void hello()
}#if hard_priority_schedule
int find_next_thread()
return index;
}#endif
#if soft_priority_schedule
int find_next_thread()
}if(0 == value)
choice = -1;
return choice;
}#endif
void reset_time_slice ()
void task_init(int index)
#if time_round_schedule
void signal_handler(int m)
#else
void signal_handler(int m)
galltask[index].time_slice --;
current_thread_id = index;
swap(&old, &galltask[current_thread_id].context);
}#endif
void set_all_task()
}int main()
exit(0);
return 1;
}
嵌入式作業系統核心原理和開發(中斷)
在我個人看來,中斷是cpu最重要的特色。從某種意義上來說,沒有中斷就沒有嵌入式作業系統。一旦你明白了中斷的真正含義,你對作業系統的了解就算真正入門了。什麼是中斷呢?我們可以看看微控制器下面是怎麼做的。include sbit led p1 6 unsigned int led enable 0 vo...
嵌入式作業系統核心原理和開發(開篇)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!作業系統是很多人每天必須打交道的東西,因為在你開啟電腦的一剎那,隨著bios自檢結束,你的windows系統已經開始執行了。如果問大家作業系統是什麼?可能有的人會說作業系統就是windows,就是那些可以放大 縮小 移動的視窗。對曾經是計算機專業的...
linux 嵌入式作業系統核心原理和開發總結
01 嵌入式作業系統核心原理和開發 優先順序的修改 02 嵌入式作業系統核心原理和開發 改進的鍊錶記憶體分配演算法 03 嵌入式作業系統核心原理和開發 等值block記憶體池設計 04 嵌入式作業系統核心原理和開發 執行緒狀態 05 嵌入式作業系統核心原理和開發 實時系統中的定時器 06 嵌入式作業...