linux排程主要是在乙個runqueue結構體上操作。runqueue結構體有乙個prio_array結構體陣列,該陣列中有個兩個prio_array結構體。prio_array結構體的定義如下:
struct prio_array
這兩個prio_array,乙個掛著expired task(時間片已經用完的task),另乙個掛著active task(時間片尚未用完的task)。當active task為空時,就交換這兩個prio_array的指標值就ok了。
接下來講解prio_array中的成員
nr_active:就不用多說了,就表示該prio_array結構體上掛著多少個任務。
struct list_head queue[max_prio]:這是乙個指標陣列,每個陣列標記乙個煉表頭,每個鍊錶頭上掛著一串相同優先順序的task。
unsigned long bitmap[bitmap_size]:這個成員的每乙個表示對應的優先順序的task鍊錶上是否為空。
有了上面的基礎,接下來就講解如何實現o(1)排程,當要排程程式時,
1)首先找到bitmap成員上第乙個為 1 的bit位置,比如說bitmap的第8位為1,則表示前面0~7高優先順序的task鍊錶上沒有task。
2)然後訪問struct list_head queue[max_prio]陣列的第八個成員,該成員是優先順序為8的task鍊錶的表頭,
3)最後通過表頭取下第乙個task,再將其排程上cpu,這樣就實現了o(1)排程。
Linux程序排程之 大O 1 排程演算法
而大o 1 排程演算法其實就是一種非常好的排程演算法,它能讓程序排程的更加合理,更加快速。我將該排程演算法總結為下面這張圖 對其中一些內容做出解釋 1.首先將相同優先順序的程序放在同一佇列裡,然後有多少個優先順序,就建立多少個優先順序佇列,這些佇列可以用佇列陣列來表示。2.如果某一優先順序佇列裡沒有...
實現push pop min皆為O(1)的棧
前些時間筆試,遇到這樣一道題,要求實現乙個push pop min操作皆為o 1 的棧。當時想到的是使用堆或者紅黑樹維護最小值,這顯然都是無法達到o 1 要求的。後來參考網上思路,實現邏輯也很簡潔,就是使用另乙個棧維護乙個最小元素集 include include include using nam...
linux 程序排程1
程序分為實時程序和普通程序,分別對應實時排程策略和普通排程策略 在 task struct 中,有乙個成員變數,我們叫排程策略 unsigned int policy 它有以下幾個定義 define sched normal 0 define sched fifo 1 define sched rr...