Linux與VxWorks任務調度機制分析

論文出處:《工業控制計算機》2005年18卷第6期       原作者:高鵬飛、李新明、孫建

文字轉自:http://blog.csdn.net/chongzi865458/article/details/7701247

AbStract 
In this paper.diferences in task scheduling mechanism between the two multi-tasks operating systems Linux and VxWorks are analyzed.The two are compared with aspects of task control block,the standard of scheduling and the policy of 
scheduling.Further more.The implementations of task scheduling in POSIX 1003.1b specification are analyzed both in Linux 
and VxWorks. 
Keywords:Linux.VxWorks.task scheduling,scheduling policy,priority 
摘要 
分析了Linux和VxWorks兩種多任務操作系統任務調度機制的異同,從任務控制塊、調度的時機、調度的優先級和調度 
的策略方面進行了詳細的分析和對比。分析了VxWorks和Linux在POSIX1003.1b調度標準實現上的差異。 
關鍵詞:Linux.VxWorks,任務調度,調度策略,優先級 

通用的分時操作系統面向多用戶的不同任務,意在追求系統整體運行的效率和資源的均衡利用,軟件的執行在時間上要求並不嚴格。實時操作系統不同於分時操作系統,它主要是對任務進行實時的處理,要求任務的運行具有可確定性和可預測性,提供即時響應和高可靠性。由此導致通用分時系統和實時操作系統的內核在任務調度機制方面的不同。本文以Linux(2.4)版本內核)和VxWorks(5.4版本)爲代表,着重分析二者任務調度機制的異同。 

1 進程(任務)控制塊 
進程是一個具有獨立功能的程序對某個數據集在處理機上的執行過程和分配資源的基本單位。進程是一個動態概念,具有並行特徵,表現爲獨立性和異步性。在Linux中,進程和任務的概念是等價的。VxWorks中把每個相互獨立的程序稱爲任務,任務是VxWorks資源分配的單位,也是處理器調度的基本單位。 
每個任務擁有各自的上下文,即擁有各自的CPU環境和系統資源。上下文切換時,Linux進程上下文保存在進程控制塊中(PCB)中,VxWorks任務的上下文保存在任務控制塊(TCB)中,二者的上下文內容有很大的區別。 
作爲通用操作系統的Linux,其進程所使用(管理)的資源比嵌入式實時操作系統VxWorks要多的多,就任務控制塊來說,二者的差異還是比較大的,典型的區別分析如下: 
1)多用戶性。Linux是多用戶操作系統,它使用用戶和組標識符來控制進程對系統中文件和映像以及其他資源的訪問權限。task_struct中有四對進程和組標識符:進程uid和gid、有效uid和gid、文件系統uid和gid、保留的uid和gid。而VxWorks是單用戶的操作系統,任務控制塊結構windTcb中沒有與用戶相關聯的數據結構。 
2)文件打開表。Linux的每個進程都擁有一個文件打開表,以記錄該進程使用文件的情況, 對應於task_struct中file_ struct 類型的files成員。當進程退出時,內核會自動檢查並關閉進程已打開但未顯式調用close()關閉的文件。VxWorks的整個系統共用一個文件打開表,每個任務控制塊中沒有記錄該任務已打開的文件信息,因此當某個任務退出時,其已打開的文件自然不會被自動關閉。 
3)任務之間的親屬性。Linux的每個進程都不是孤立地存在於系統中,新的進程白創建起就置於一種表示“宗族”和“家譜”的樹型組織中,初始化進程init是所有進程的祖先進程。在task_ struct結構中有一組task_struct 類型的指針結構成員,其中P_opptr和P_pptr指向父進程,p_cptr指向最“年輕”的子進程,P_Ysptr和P_osptr則分別指向其“哥哥”和“弟弟”。而Vx-Works的任務間沒有類似的親屬關係,每一個任務都是平等而獨立的,即使一個任務創建並激活一個新的任務,兩者之間也不存在父子關係。 
另外,Linux的進程控制塊和VxWorks任務控制塊的差別還有許多,比如Linux的task_struct中保存的進程雜湊隊列的鏈人指針、線程信息、虛擬內存信息等。 

2.1 VxWorks的任務調度 

2.1.1 VxWorks任務調度時機 
VxWorks中任務調度的時機可分以下兩種情況: 
1)同步任務切換,引起的原因是當前運行的任務執行下列操作:①進行阻塞、延遲、掛起的調用;②使更高優先級任務就緒而發生優先級搶佔;③降低自身優先級或者退出。 
2)異步任務切換,通常由中斷服務使高優先級任務就緒引起。VxWorks的Wind微內核基於優先級搶佔調度。並採取單一實地址空間模式,上述引發任務調度的情況發生時,VxWorks內核立即進行任務的調度切換。 

2.1.2 VxWorks任務調度策略 
多任務運行時需要一個調度算法,將CPU分配給就緒的任務。Wind內核默認採用基於優先級的搶佔式調度(Priority-based preemptive scheduling)算法,同時也可以選用輪轉(Round-robin)調度算法。 
1)基於優先級搶佔的任務調度:指每個進程被賦予一個優先級,優先級最高的就緒進程率先執行 可搶佔調度(preemptive scheduling)是指允許將邏輯上可運行的進程暫時掛起的策略。VxWorks採用基於優先級搶佔的調度算法,系統中的每個任務都擁有一個優先級,內核將CPU分配給處於就緒狀態的優先級最高的任務。如果系統內核一旦發現有一個優先級比當前任務的優先級高的任務轉變到就緒狀態,內核立即保存當前任務的上下文,當前任務狀態切換到就緒狀態並按優先級插入到相應任務隊列的隊尾,然後內核切換到這個高優先級任務的上下文中執行。 
Wind內核有256個優先級,編號是0-255,0的優先級最高,255最低。任務的優先級可以在創建時設定,系統默認的任務優先級爲100。VxWorks允許任務動態改變自己的優先級,當任務執行時,它可以調用taskPrioritySet()改變自己的優先級。 
2)輪轉調度:VxWorks中,基於優先級搶佔的調度可以與輪轉調度相結合。輪轉調度算法試圖讓優先級相同的、處於就緒狀態的任務公平地分享使用CPU資源。如果不使用輪轉調度,當系統中存在多個相同優先級的任務時,第一個獲得CPU的任務將會獨佔CPU,如果沒有阻塞或其它情況出現,其它相同優先級的任務將得不到運行的機會。 
使用輪轉調度時,每個任務被分配一個時間段,稱作它的時間片(quantum),即該任務允許運行的時間。在VxWorks系統中,可以調用函數kernelTimeSlice0來選用輪轉調度策略,其參數是時間片的長度,該時間片是每一個任務在放棄CPU給另一個相同優先級任務之前,系統允許它運行的時間長度。如果任務在它的時間片中被高優先級的任務搶佔,調度器保存它的運行時間計數器,當它再一次符合執行條件的時候,調度器恢復運行時間計數器。 

2.1.3 搶佔上鎖與中斷上鎖 
由於所有VxWorks任務共存於單一的線性地址空間,當多個任務共享全局的數據結構時,需要提供對臨界區的互斥訪問機制。使用信號量對資源上鎖是一種比較通用的互斥手段,如POSIX有名信號燈或無名信號燈和System V的信號量集。VxWorks提供了三種類型的信號量:二進制信號量、互斥信號量和計數器信號量。此外,VxWorks在任務調度層次上提供了互斥訪問保護的機制:在I臨界區內禁止任務的搶佔調度,這在VxWorks中稱爲搶佔上鎖,具體互斥的實現是將臨界區代碼包括在兩個函數taskLock()和taskUnlock()之間。 
在VxWorks中,不僅任務與任務之間需要考慮互斥,同時任務與中斷之間也要考慮互斥。因爲中斷的優先級高於任何任務,所以搶佔上鎖雖然保證了任務與任務間的互斥,但並沒有保證任務與中斷服務程序對I臨界區的互斥訪問。VxWorks的中斷上鎖則提供了最強有力的互斥,將臨界區代碼保護在intLock()和intUnlock()兩個函數之間。中斷上鎖實現的是中斷級互斥,在互斥期間,即使外部事件產生而引發相應的中斷,系統也不會切換到相應的中斷服務程序(iSR)。 
因此,VxWorks的搶佔上鎖和中斷上鎖是通過禁止任務搶佔或禁止切換到中斷服務程序來保護臨界區的。同時,這種靈活的互斥手段在臨界區中也會影響VxWorks任務的原始調度原則,比如低優先級任務搶佔上鎖時,就緒任務隊列上具有較高優先級的任務卻不能即時佔有處理機。 

2.2 Linux的進程調度 

2.2.1 Linux進程調度的時機 
Linux進程的調度時機大致分爲兩種情況:一種是進程自願調度;另一種是發生強制性調度。首先,自願的調度隨時都可以進行。在內核空間中,進程可以通過schedule()啓動一次調度;在用戶空間中,可以通過系統調用pause()達到同樣的目的。如果要爲自願的暫停行爲加上時間限制,在內核中使用schedule_timeout(),而在用戶空間則使用nanosleep()系統調用。Linux中,強制性的調度發生在每次從系統調用返回的前夕,以及每次中斷或異常處理返回用戶空間的前夕。應注意的是,從內核態返回到用戶態是進程調度發生的必要條件,而不是充分條件,還要取決於當前進程task_struct結構中的need_resched是否爲1。單CPU條件下,有三種情況可以使當始終比所有的非實時進程都要大,這就保證了實時進程的優先運行。實時進程的counter與nice都與其優先級權值無關,這和普通進程是有區別的, 實時進程task_struct中的nice和counter只與SCHED—RR調度策略進程的時間片計數相關;而對於SCHED—FIFO調度策略的實時進程沒有調度的參考意義。 

3 POSlX調度接口 
POSIX1003.1b實時擴展標準定義了進程調度的標準函數接El形式,VxWorks的任務調度和Linux中實時進程的調度都支持POSIX1003.1b標準,但二者在該標準的實現上差異較大,列出如下。 
1)實時優先級數。VxWorks任務的優先級爲0-255,Wind內核默認爲數值越大,任務優先級越低。Unux實時進程優先級爲1~99,數值越大,進程優先級越高。 
2)調度策略的種類。Linux支持SCHED—RR、SCHED—FIFO和SCHED—OTHER的調度策略,而VxWorks只支持前兩種策略,不支持SCHED_OTHER策略。另外Linux實時進程和普通進程可以互相轉換, 通過SCHED_OTHER 參數調用sched_ setscheduler()函數,可以將Linux實時進程轉化爲普通進程。通過以SCHEDl-RR或SCHED FIFO 爲參數調用sched_ setscheduler()也可以將普通進程轉爲實時進程。 
3)調度策略所基於的對象。VxWorks的任務調度策略不是基於某個任務的,而是針對整個系統的所有任務。VxWorks下不能通過sched—setscheduler()來改變內核當前的任務調度策略,VxWorks下改變調度策略的唯一手段是通過kernelTimeSlice()函數設置輪轉調度的時間片長度來實現的,該時間片長度設爲0時。即取消了SCHED—RR策略。Linux中的調度策略是基於進程的,某個進程調度策略的設置不影響其他進程。 

4 結束語 
VxWorks作爲嵌入式實時操作系統,Linux作爲通用分時操作系統,二者在任務調度機制方面差異較大,包括任務上下文內容、任務的優先級、調度的時機、調度的策略等。二者在兼容POSI×10o3.1b進程調度標準的同時其具體實現又有差異。本文通過分析與比較Linux和VxWorks任務(進程)調度機制的異同,有助於理解實時內核和通用分時內核在任務調度機制實現層次上的差異,並基於它們更有針對性地開發相應的應用,同時對基於通用操作系統Linux的一些實時化改造工作也提供參 
考借鑑作用。 

參考文獻 
張堯學,史美林.計算機操作系統教程(第2版).清華大學出版社,2OO1 
李方敏.VxWorks高級程序設計.清華大學出版社,2004 
Andrew S.Tanenbaum.現代操作系統.機械工業出版社,2000 
代玲莉,歐陽勁.Linux內核分析與實例應用 國防工業出版社,20o2 
毛德操,胡希明.Linux內核源代碼情景分析.浙江大學出版社,2001

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