linux內核學習-進程調度一

進程調度:

    多任務系統可劃分爲非搶佔式多任務和搶佔式多任務

    調度策略,I/O消耗型和處理器消耗型進程,I/O消耗型指進程大部分時間用來提交I/O請求或等待I/O請求。處理器消耗型指進程把大多數時間花費在執行代碼上,沒有太多I/O請求,對於這類響應要求不高的進程,調度策略是儘量降低運行頻率,延長其運行時間,調度策略往往在進程響應速度和最大系統利用率之間尋求平衡。

   進程優先級,動態優先級的調度方法:如果一個進程在i/o等待上耗費的時間多餘其他的運行時間,明顯屬於I/O 消耗型進程,它的優先級被提高,如果一個進程的全部時間片一下被耗盡,該進程屬於處理器消耗型,他的優先級動態降到最低。(爲了響應迅速,動態提高I/O消耗型進程,降低處理器消耗型進程)

    linux內核提供兩組獨立的優先級範圍。第一種是nice值(-20~19)默認值是0.nice值越大,優先級越低。nice值決定分配給進程的時間片的長短。第二種是實時優先級,默認(0~99)任何實時進程優先級高於普通進程。

     時間片:時間片太長會導致系統對交互的響應表現欠佳,時間片太短會明顯增大進程切換帶來的處理器消耗。linux動態提高交互式程序優先級並可以根據優先級動態分配時間片,這種動態分配的機制非常穩定且強健。且進程的時間片不必一次全部耗盡,可以分幾次重複調度,當時間片耗盡時,認爲進程到期了,沒有時間片的進程不會再投入運行。

     可執行隊列:每個處理器對應一個可執行隊列,cpu_rq(processor)宏用於返回給定處理器可執行隊列的指針

     死鎖和自旋(在以後的章節詳細解釋)

     優先級數組:struct prio_array{

                            int   nr_active;(保存該優先級數組內可執行進程的數目)

                            unsigned long bitmap[BitmapSize];(優先級位圖)

                            struct list_head queue[Max_Prio];(優先級隊列)

                                                    }

      unsigned long長32位,140個優先級需要5個長整型數(因爲5*32=160)才能表示。一開始,所有的位都被置爲0,當某一個擁有一定優先級的進程開始準備執行時,位圖中相應的位就會被置爲1,查找圖中最高的優先級就是查找圖中被設置的第一個位。其中優先級隊列都是一個鏈表,每個鏈表與一個給定的優先級對應,對於給定的優先級,按輪轉方式調度任務。


      重新計算時間片:每個處理器維護兩個優先級數組,既有活動數組又有過期數組,活動數組內的可執行隊列上的進程都還有時間片剩餘,而過期數組內的可執行隊列上的進程都耗盡了時間片。當一個進程的時間片耗盡時,它會被移至國旗數組,但在移動前,它的時間片已經重新計算好了。(這裏不是很理解,交換數組就可以重新計算時間片了?


      schedule()選定下一個進程並切換到它去執行是通過schedule()函數實現的。該函數獨立於處理器運行,每一個cpu都要對下一次該運行的哪個進程作出自己的判斷。首先該函數找到第一個被設置的位,該位對應着優先級最高的可執行進程。然後調度程序選擇這個級別鏈表裏的頭一個進程,這也就是馬上要執行的進程


     


     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章