歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux調度器之主調度器框架

Linux調度器之主調度器框架

日期:2017/2/28 16:20:38   编辑:Linux教程

進程是操作系統提供的最古老,最重要的抽象之一,它對開發人員和操作人員隱藏了兩個基本的硬件資源:處理器和存儲器。進程的重要性在於它營造出個數不受物理處理器限制的虛擬處理器並為每個虛擬處理器配備了獨立的,容量不受物理內存大小限制的內存空間。這些虛擬處理器為應用程序模擬出一個和物理處理器幾乎相同的環境:每個虛擬處理器都擁有獨立的,與物理處理器一樣的寄存器集合;每個虛擬處理器可以使用同樣的地址訪問到的卻是各自的存儲單元;更重要的是,這麼多虛擬處理器可以同時並發運行各自的程序,哪怕實際上只存在一個物理處理器。這就是本章討論的重點:進程調度。

1.1 進程狀態

雖然在很多操作系統裡進程的狀態多達五六,甚至八九種,但是從調度器的角度,進程的狀態只有三種:阻塞態,就緒態和運行態。

處於阻塞態的進程不參與進程調度,事實上調度器在分配處理器時間時根本不知道阻塞態進程的存在。阻塞態進程要想參與調度,必須有一個‘第三方’將其提交給調度器,不然這個進程就是一個雖然存在但再也無法運行的‘植物人’。比如一個進程調用sleep()函數休眠一段時間,該進程就從當前運行進入阻塞態,從此不再受調度器的調遣,不再有機會占據處理器。等到指定的休眠時間到達,操作系統的定時器模塊作為‘第三方’,將該進程提交給調度器,使其再度參與調度,又有機會成為當前運行進程。

與阻塞態不受調度器控制不同,就緒態和運行態進程都處於調度器的管轄之下。處於就緒態的進程本該運行於處理器上,可是調度器為了平衡眾多進程對處理器時間的需求,讓該進程暫時停下來聽候調遣而安排其它進程在處理器上運行。就緒進程和阻塞進程共同點是都沒有占用處理器,區別是阻塞態進程即使在處理器空閒時也不能運行,而就緒進程處於‘預備役’狀態,只要處理器空閒或‘時機成熟’馬上能運行於處理器上。就緒進程在調度器的隊列裡排隊等候調遣,不同調度算法有各自的排隊方式,如linux的完全公平(CFS)算法使用基於虛擬運行時間的紅黑樹,實時(RT)算法為每個調度優先級設置一條先入先出的隊列。

運行態進程又叫當前進程,就是當前正在處理器上運行的進程。由於它占用了寶貴的處理器時間,在很多調度算法裡當前進程都是重點監控對象,它的運行時間受到嚴密監視。一旦發現運行時間超標就會將其從‘現役’轉為‘預備役’,進入就緒態,把處理器讓給其它就緒進程(當然必須有其它就緒進程存在)。linux對當前進程運行時間的監控是在操作系統的tick中斷裡完成的,間隔從10毫秒到1毫秒不等。即使是這樣的周期CFS算法的設計者還覺得不夠精確,又設置了精度為納秒級的高精度定時器(hrtimer)來監控當前進程,保證其占用的處理器時間嚴格符合預先給予的配額。

進程的三種基本狀態在linux裡並不直觀。阻塞態有很多表達方式用以表示更精細的狀態,比如常用的TASK_INTERRUPTIBLE或TASK_UNINTERRUPTIBLE。當前進程的狀態表示為TASK_RUNNING,可是就緒進程的狀態也是用TASK_RUNNING表示。這不會造成混淆,因為當前運行進程是有專門變量記錄的,而就緒進程則統一排列在運行隊列中。在linux裡TASK_RUNNING的值是0,其它狀態值都非0。為運行態和就緒態設置相同值的一個好處是調度器可以很簡單地判斷一個進程是否能還能繼續參與調度:只要狀態非0的進程就是應該進入阻塞態的進程,調度器發現這樣的進程就將其從調度器脫離開,不再競爭處理器。

1.2 Linux調度器相關文件

調度器是Linux內核中變化較多的模塊,功能和性能隨著應用的拓展不斷增強,代碼結構也隨著需求的變化持續重構和優化。下表列出了本章將要涉及的,與調度器相關的源代碼所在的文件。由於變化較大,可能隨著內核版本的持續升級很快表中內容就與最新版本不符合了。

文件名

作用

linux_2.6.34-rc6/kernel/sched.c

該文件是調度器主體,包含調度器初始化,主調度器框架,調度器相關的API,各個具體調度算法也就是調度類的公共函數,用以支持分組調度的處理器子系統。

linux_2.6.34-rc6/kernel/sched_fair.c

該文件實現完全公平調度(CFS)算法和多處理器的負載平衡,與CFS調度類對應

linux_2.6.34-rc6/kernel/sched_rt.c

該文件實現實時調度(RT)算法,與RT調度類對應

linux_2.6.34-rc6/kernel/sched_idletask.c

該文件實現空閒(idle)任務調度,與idle調度類對應

linux_2.6.34-rc6/kernel/sched_cpupri.c

該文件跟蹤系統中所有處理器上當前運行進程的優先級,用於實時調度算法的處理器選擇

linux_2.6.34-rc6/kernel/sched.h

該文件是調度器最主要的頭文件,比較重要的數據結構包括進程控制塊(PCB)task_struct,調度項sched_entity的定義

linux_2.6.34-rc6/kernel/sched_feature.h

該文件包含存放調度器性能的參數和默認值

Copyright © Linux教程網 All Rights Reserved