摘要:從三方面提出改善Linux實時性能的措施:為提高嵌入式應用響應時間精度,提出兩種細化Linux時鐘粒度方法:為增強系統內核對實時任務的響應能力,增強Linux內核的可搶占性,提出插入搶占方法:為擴展系統適用范圍,提出可支持多實時調度策略的調度方案。
關鍵詞:Linux 嵌入式系統 實時性 調度策略 搶占
中圖分類號:TP311.1 文獻標識碼:A
文章編號:1002-2422(2010)02-0090-02
1 Linux在實時應用中存在的技術障礙
1,1 Linux的實時性分析
Linux作為一個通用操作系統,主要考察的是調度的公平性和吞吐量等指標,然而并不能很好地滿足實時系統方面的需要。為了同時支持實時和非實時兩種進程,POSIX實時擴展部分逐漸被添加進來,如POSIX,1003.1b,引入了實時進程的概念,允許將一個進程的屬性確定為實時進程。Linux對實時進程和普通進程,采用不同的調度策略。
(1)實時進程。Linux提供兩種簡單的調度策略,即時間片輪轉調度和先來先服務調度。在SCHED_RR調度中,一旦時間片用完任務就被移動到優先級隊列的隊尾,并允許同一優先級的其它任務運行。如果同一優先級沒有其它任務,該任務將繼續運行下一個時間片。SCHED_FIFO是運行直至阻塞的策略。SCHED_FIFO任務按優先級調度,一旦開始就一直運行到結束或者阻塞在某種資源上。不像SCHED_RR任務那樣共享處理器。
(2)普通進程。Linttx采用類Unix的動態優先級調度。傳統的Unix操作系統屬分時系統,以高的吞吐量和公平性為追求目標,基本沒有考慮實時應用所應滿足的時間約束。
1,2 Linux在實時應用中的技術障礙
(1)缺少細粒度和多模式的定時器,Linux的系統時鐘精度太過粗糙,周期模式定時器頻率僅為100Hz,使得其時間粒度過大,加大了任務響應延遲。
(2)Linux下分用戶態和核心態兩種模式,當進程運行在用戶態時,可被優先級更高的進程搶占。但當進入核心態時,則其它用戶態進程優先級再高也不能搶占它。根本原因是Linux內核本身是不可搶占的。并且優先級反轉的現象使高優先級的實時進程可被低優先級的阻塞。
(3)Linux采用對臨界區操作時屏蔽中斷的方式,在中斷處理中不允許進行任務調度,從而抑制了系統及時響應外部操作的能力。
(4)缺乏有效的實時任務調度機制和調度算法。
2 改善嵌入式Linux實時性能方法
2,1細化時鐘粒度
時鐘粒度是制約內核實時性方面的主要因素之一,精確的計時是實時調度器正確操作所必須的,調度器通常要求在一個特定的時刻進行任務切換,計時的錯誤將導致背離計劃的調度,引起任務釋放抖動。標準Linux系統時鐘精度太過粗糙,時鐘中斷周期為10ms,不能滿足特定嵌入式應用領域中對于響應時間精度的要求。因此,在實時Linux應用中,需要細化其時鐘粒度,具體有兩種方式可以解決時鐘粒度問題:一是通過直接修改內核定時參數Hz的初值來細化時鐘粒度,如將標準Linux中內核定時參數HZ改為10000,則時鐘粒度可以達到100us,這種方式雖然會增加一些系統開銷,但在強周期性環境下,對定時器的設置只需初始化一次,在一定程度下保證了處理效率;二是通過對可編程中斷定時器進行編程或改換先進的可編程中斷控制器進行編程來改進Linux時鐘機制,以提高其時鐘的分辨率,使毫秒級的粗粒度定時器變成微秒級的細粒度定時器。
2,2增強Linux內核的搶占行
這里采用在內核中增加搶占點的方法。插入搶占點思想實質上是分析影響Linux實時性能的關鍵因素,找出影響實時性能的瓶頸位置,在其關鍵的代碼中插入調度語句,如:if(realtime_job_waiting)schedule():
這樣實時進程不必長時間等待低優先級進程的系統調用,當一個高優先級的實時進程競爭CPU時,核心只需要執行一小段代碼就可以被實時進程剝奪,當沒有實時進程等待CPU時,系統額外的工作只是執行的一個檢查標志。
插入檢查點方法簡單,修改內核的地方比較少,然而要在Linux內核適當的地方插入搶占點是一件不容易的事,In—go's Patch插入的搶占點多達46處,分布在各個模塊。
2,3改善Linux內核實時調度器的調度策略
目前,共享驅動的調度正越來越受到關注。在這種調度策略中,每個任務被分配了一定的共享資源,參與調度的系統中所有的實時任務按照一定比例共享計算機資源。將資源的共享作為調度策略考慮的一個因素,這在嵌入式系統中具有更重要的意義,因為嵌入式系統的CPU、帶寬、內存、磁盤等系統資源一般都是很有限的。
因此,提出要實現一種調度方案,使其同時支持以上所述的三類調度策略。其中,關于優先級驅動,提供優先級調度器負責在每個調度時機按優先級最高的原則從就緒隊列中提取任務:關于時間驅動的調度是在操作系統底層提供時間表支持,此時間表包括了每個任務的起止時間:關于共享驅動的調度是在操作系統底層提供任務的權值分配機制,該權值是針對CPU、帶寬、內存、磁盤等系統資源進行計算的。
總結以上實時調度策略所需的參數,為每個實時任務定義了三個調度屬性,分別是優先級屬性、時間表屬性、資源權值屬性。對于任務集則是優先級表、時間表和資源權值數組表,這樣,不同屬性的數據結構對應不同的調度策略,便于應用開發人員根據具體的情況靈活選擇。
這里建立一種調度器,用二階調度法來支持多調度鐿略。先在第一階段構造一個屬性的選擇模塊,完成屬性判斷,篩選出當前任務的調度屬性;然后是一個調度器選擇模塊,完成響應于當前的調度屬性的調度器的選擇。如圖1所示。
3 結束語
嵌入式技術具有廣泛的前景,把Linux自身固有的優越性融入嵌入式技術,是嵌入式技術發展的一個重要方向。