Linux進程調度與進程結構



Linux進程調度  

一、調度策略類型

Linux內核的進程是通過雙鏈表的方式將進程的struct task_struct結構連接在一起, task_struct結構裏面包含了與一個進程相關的全部信息(比如進程的狀態、優先級、進程的地址空間等);每個進程都有一個唯一的進程描述符,linux就是通過進程描述符來感知一個進程的存在或者消亡,進程的結構定義在內核的<linux/sched.h>中。

下面是linux內核進程調度策略的定義

Linux進程調度

1SCHED_NORMAL(SCHED_OTHER):普通的分時進程,這是普通的用戶進程,進程的缺省類型,採用動態優先調度策略,選擇進程的依據主要是根據進程goodness值的大小。這種進程在運行時,可以被高goodness值的進程搶先。

2SCHED_FIFO:先入先出的實時進程旦佔用cpu則一直運行。一直運行直到有更高優先級任務到達或自己放棄。

3SCHED_RR:時間片輪轉的實時進程,每次調度,把CPU分配隊首進程,並令其執行一個時間片。當執行的時間片用完時,由一個記時器發出一個時鐘中斷請求,該進程被停止,並被送往就緒隊列末尾;依次循環。

4SCHED_BATCH:批處理進程

5SCHED_EDLE:只有系統空閒事才能夠被調度執行的進程

二、調度分類

      1CFSCompletely Fair SchedulerCFS調度類:SCHED_NORMALSCHED_BATHSCHED_IDLE

      2、實時調度類:SCHED_RRSCHED_FIFO

三、調度時機

1、主動式:在內核中直接調用schedule()。當進程需要等待資源等而暫時停止運動時,會把狀態置於掛起(睡眠),並主動請求調度,讓出CPU

2、被動式(搶佔)

     用戶搶佔:Linux2.4Linux2.6

     內核搶佔:Linux2.6

   1)用戶搶佔

           用戶搶佔發生在:從系統調用返回用戶空間、從中斷處理程序返回到用戶空間。

     2)內核搶佔:

             在不支持內核搶佔的系統中,進程/線程一旦運行於內核空間,就一直執行,知道它主動放棄或時間片耗盡爲止。這樣一些非常緊急的進程或線程將長時間得不到運行。

             在支持內核搶佔的系統中,更高優先級的進程/線程可以搶佔正在內核空間運行的低優先級進程/線程。

             在支持內核搶佔的系統中,默寫特例下不允許內核搶佔:

             a)內核正進行中斷處理。進程調度函數schedule()會對此作出判斷,如果是在中斷中調用,會打印錯誤信息。

             b)內核正在進行中斷上下文的Bottom Half(中斷的底半部)處理。硬件中斷返回前會和執行軟中斷,此時仍然處於中斷上下文中。

              c)進程掙持有spinlock自旋鎖、writelock/readlock讀寫鎖等,當持有這些鎖時,不應該被搶佔,否則由於搶佔將導致其他CPU長期不能獲得鎖而死等。

             d)內核正在執行調度程序Scheduler。搶佔的原因就是爲了新的調度,沒有理由將調度程序搶佔掉再運行調度程序。

       爲了保證LInux內核在以上情況下不會被搶佔,搶佔式內核使用了一個變量preempt_count,稱爲內核搶佔計數。這一變量被設置在進程的thread_info結構中。每當內核要進入以上幾種狀態時,變量preempt_count就加1,指示內核不允許搶佔。每當內核從以上幾種狀態退出時,變量preempt_count就減1,同時進行可搶佔的判斷與調度。

內核搶佔可能發生在:

               中斷處理程序完成,返回內核空間之前。

                當內核代碼再一次具有可搶佔性的時候,如解鎖及使能軟中斷等。

四、Schedule函數工作流程

1)清理當前運行的進程

2)選擇下一個要運行的進程(pick_next_task

3)設置新進場的工作環境。

4)進程上下文切換。 

 

進程描述符的分配:

Linux通過一slab分配器來創建task_struct進程結構,各個task_struct放在內核棧的尾端,只要通過一個棧指針就可以找到task_struct的位置,由於進程結構通過slab分配器動態地創建,所以在棧尾創建了一個新的結構struct thread_infothread_info結構根據所選用的處理器架構不同會有小的差別,thread_info被定義在arch\xxx\Include\asm(xxx表示所選用的處理器架構),如MIPS架構的thread_info定義如下:

進程中的內核堆棧與進程描述符的關係如下圖:

 

 

發佈了23 篇原創文章 · 獲贊 6 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章