2013-01-07 97 views
2

我想了解Linux內核的調度器是如何工作的理解優先級陣列

由於此鏈接

http://books.google.co.in/books?id=NXVkcCjPblcC&lpg=PP1&pg=PA47#v=onepage&q&f=false 和下面的鏈接 http://www.informit.com/articles/article.aspx?p=101760&seqNum=2

結構runque給出的基本數據結構調度程序在其上運行

它是

0123上述

有兩個成員

struct prio_array *active;  /* pointer to the active priority 
            array */ 
struct prio_array *expired;  /* pointer to the expired priority array */ 

和作爲

struct prio_array { 
    int  nr_active;  /* number of tasks */ 
    unsigned long bitmap[BITMAP_SIZE]; /* priority bitmap */ 
    struct list_head queue[MAX_PRIO]; /* priority queues */ 
}; 

我不與下面的句子明確結構prio_array定義

問題1)
Each priority array contains one queue of runnable processors per priority level.

struct prio_array上述定義中哪裏是可運行的處理器

的闕然後它說

The priority arrays also contain a priority bitmap used to 

高效地發現在系統中的最高優先級的可運行的任務。

然後它說 「有140個優先級和32位字,這是五個。」

它是如何得出結論,這是五什麼是它背後的數學計算?

以上是本書第4章節摘錄的內容,第2章出版的內容都包含相同的文字。爲便於理解,此處僅作參考。

* UPDATE1 * 根據意見,我只是想澄清什麼,我問 作者說

BITMAP_SIZE是無符號long類型 的數組變量將必須提供大小每個有效優先級爲 一級。有140個優先級和32位字,這是五個。

問題2)
什麼我不清楚是每個位對應一個優先級,並給出140優先級有那麼如何數組的大小未來5我沒有得到BITMAP_SIZE計算邏輯不32分之140= 5

它有一些事情與以下的鏈接段落

When a task of a given priority becomes runnable (that is, 
its state becomes TASK_RUNNING), the corresponding bit in the 
bitmap is set to one. For example, if a task with priority seven is 
runnable, then bit seven is set 

其是其中陣列

unsigned long bitmap[BITMAP_SIZE]; /* priority bitmap */ 

被設置爲基本上我不清楚的是這個數組是如何設置的,並且如果我能夠正確解釋,請參閱問題1。

Update 2和下面

答案的解釋有了答案下面我只是增加一個小的解釋,可能幫助一些一個在未來 如果他們來到這裏基本上

調度保持runque和運行進程的每個運行進程是隻有一個運行隊列列表中,文章以它的鏈接我給曾考慮多處理器系統中有許多運行疑問句,回到我們的情況有一個處理器和不同優先級

與處理的runque

有140的優先級的每個優先級具有TASK_RUNNING狀態不同的過程說,例如可以有優先權8的許多工藝等(我把8只是爲例) 結構runque指向優先陣列,它告訴

btimap[BITMAP] /* this is the priority level 
struct list_head /* points to the start of list of processes of that run level 

因此,runque指向優先級數組,從優先級數組中,您可以輕鬆獲得需要在O(1)時間內執行的進程 。

+1

,你需要5個字來容納140位? –

+0

看到2的五次方是32那麼它怎麼樣140 –

+2

我寧願看到它是140/32略多於4個字,所以就這樣做吧5. –

回答

3

你問如何找到數組中的權位?

事情是這樣的:

int bitmap_idx = priority/BITS_PER_WORD; 
int bitmap_bit = priority%BITS_PER_WORD; 

isSet = (bitmap[bitmap_idx]&(1<<bitmap_bit)); //test 
bitmap[bitmap_idx] |= 1<<bitmap_bit;    //set 
+0

是你讓我右與邏輯我做的計算,如果優先級= 7然後通過您的邏輯'位圖[0] | = 1 << 7'這意味着位圖[0] = 128指正如果我錯了 –

+0

非常感謝你的回答清除了我的兩個問題 –