Linux內核2.6的進程調度系統介紹
Linux是多任務搶占操作系統,多任務就是指多個進程間通過分時切換來并發執行。非搶占的系統是對每個進程而言,除非時間片用完或主動放棄否則不會被剝奪CPU,主動放棄包括調用一些調度的系統調用(比如sched_yield)或者調用IO等阻塞操作。搶占式系統表示即使當前進程沒有用完時間片,也沒有主動放棄CPU,如果調度系統發現有更高動態優先級的進程,則強制剝奪當前進程的CPU,選擇更高動態優先級的進程執行。
調度系統什么時候查看是否有更高優先級的進程呢?有這些情況:①時鐘中斷處理程序(Linux2.6的系統時鐘頻率默認是1000HZ,即每1ms調用一次時鐘中斷處理程序,具體系統配置的時鐘頻率可以通過cat/boot/config-*|grep"^CONFIG_HZ="來獲取)。如果是多核處理器,則每個CPU都會執行時鐘中斷處理程序(其他中斷處理程序只會映射到某個CPU上執行);②其他一些中斷處理程序,會讓某個CPU執行調度程序;③當前進程阻塞、睡眠等主動放棄處理器;④當前進程用完時間片;⑤創建了新進程;⑥執行一些調度相關的系統調用,比如改變進程的靜態優先級等。
內核2.6的進程調度策略一共有三種:SCHED_NORMAL,SCHED_FIFO和SCHED_RR.其中SCHED_NORMAL用于普通進程的調度,后兩種用于實時進程的調度。
Linux的進程有的屬于IO消耗型進程,有的屬于處理器消耗型進程。IO消耗型進程希望獲得更多的處理器響應機會,每次響應不需要很長時間;處理器消耗型進程則相反。調度程序通常在系統響應速度和***系統吞吐量之間尋求平衡。
Linux進程的靜態優先級。靜態優先級分為兩個范圍:0~99是實時進程的靜態優先級(值越大優先級越高),100~139是普通進程的靜態優先級(通過nice值表示,-20~19,值越大優先級越低)。
首先介紹普通進程的調度策略。Linux采用稱為完全公平調度算法的調度策略(CFS),每個CPU都有個可運行隊列,多個處理器的可運行隊列會在調度時進行隊列的平衡處理。對某個處理器而言,應該選取哪個進程投入執行是調度的核心問題,CFS根據當前可運行隊列中普通進程的靜態優先級給每個進程分配處理器使用比,確定周期時間T(T的選取和可運行進程個數相關,默認是20ms,這個時間T是用來控制進程切換頻率的,如果太小會導致進程很快完成當前分配的處理比,而重新分配處理比,重新調度)。調度時計算虛擬運行時間,這個時間很關鍵,因為調度系統就是選擇最小虛擬運行時間的進程投入執行。
虛擬運行時間是指每個進程的實際運行時間標準化后的時間,這個時間是相對的,可以理解為實際時間處理處理器使用比。調度思想是這樣的,每個進程已經分配好處理器使用比了,調度系統希望各個進程差不多同時用完這個使用比,而不是有的進程很早完成,有的進程很晚完成。那么各個進程的完成的程度就是調度的依據,總是選擇完成比最小的進程投入運行。
如果一個進程阻塞了,其他進程運行了一段時間,顯然這個阻塞進程的完成比最小,那么當它醒過來的時候,會導致很長一段時間都只運行這個進程,所以在喚醒時會將完成比調整為當前可運行隊列中完成比的最小值。新建的進程會根據優先級計算一個完成比,而不是簡單的完成比賦為0.
再介紹實時進程的調度。SCHED_FIFO策略很簡單,就是選取***靜態優先級的實時進程投入運行,并且直到進程運行完成或被更高優先級的實時進程搶占。SCHED_RR是帶時間片的SCHED_FIFO.內核不為實時進程計算動態優先級。




















