對Linux即時性的改進

來源:互聯網
上載者:User

即時作業系統是保證在一定時間限制內完成特定功能的作業系統。其特徵為

       1)高精度計時系統  計時精度是影響即時性的一個重要因素。在即時應用系統中,經常需要精確確定即時地操作某個裝置或執行某個任務,或精確的計算一個時間函數。這些不僅依賴於一些硬體提供的時鐘精度,也依賴於即時作業系統實現的高精度計時功能。

  2)多級中斷機制  一個即時應用系統通常需要處理多種外部資訊或事件,但處理的緊迫程度有輕重緩急之分。有的必須立即作出反應,有的則可以延後處理。因此,需要建立多級中斷嵌套處理機制,以確保對緊迫程度較高的即時事件進行及時響應和處理。

  3)即時調度機制  即時作業系統不僅要及時響應即時事件中斷,同時也要及時調度運行即時任務。但是,處理機調度並不能隨心所欲的進行,因為涉及到兩個進程之間的切換,只能在確保“安全切換”的時間點上進行,即時調度機制包括兩個方面,一是在調度策略和演算法上保證優先調度即時任務;二是建立更多“安全切換”時間點,保證及時調度即時任務

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    嵌入式系統是在有限的空間和有限的資源中運行,高效地實現某種特定功能或功能集合的裝置。它的開發通常受到很多客觀條件的限制,諸如較弱的CPU處理能力、較小的記憶體空間、較少的可供選擇的外設、有限的電源供應等。每個嵌入式系統的開發無不是精打細算,以求用有限的資源發揮最大的功效。在各種嵌入式系統上啟動並執行作業系統中,嵌入式Linux以其免費、高可靠性、廣泛的硬體支援以及開放源碼等眾多特性正在獲得越來越多的關注。其源碼開放特性使得開發人員可以針對特定的嵌入式系統對Linux核心進行修改,以滿足開發要求,達到系統最佳化的目的。嵌入式Linux應用中的一大問題是Linux的即時性問題。即時系統必須在限定時間內對外來事件作出正確響應,重點放在對滿足突發性、暫時性的處理需求上。而Linux作為傳統的分時作業系統,關注更多的是系統的整體資料輸送量。如何提高Linux的即時效能是擺在廣大嵌入式系統級開發人員面前的挑戰。

1 相關研究
    目前市面上有各種Linux發行版,但嚴格來說,Linux指的是Linus Torvalds維護的(及通過主要和鏡像網站發布的)核心。建立嵌入式系統不需要特別的核心,一個嵌入式Linux系統只是代表一個基於Linux核心的嵌入式系統,本文後面提及的Linux均指Linux核心。目前已有很多改善Linux即時效能的工作在進行中。最新的2.6版Linux已經實現了可搶佔式的核心任務調度,但是不確定的中斷延時問題沒有得到解決。即2.6版的Linux高優先順序核心空間進程雖然能像在使用者空間裡那樣搶佔低優先順序進程的系統資源,但是從中斷髮出開始到中斷服務程式的第1條指令開始執行的時間是不確定的。
    除了Linux開發人員的改進工作之外,還有一些組織、公司為提高Linux的即時性做了大量工作。其中有代表性的是Fsm Labs公司的RT-Linux、Monta Vista公司的MontaVista Linux、由Paolo Mantegazza等人維護的RTAI(Realtime Application Interface)項目。這些項目採用的方法可歸納為兩類:
(1)直接修改Linux核心。MontaVista Linux採用的就是這種方法。它將Linux修改成稱為Relatively Fully Preemptable Kernel的可搶佔式核心,並使現了即時調度機制和演算法,增加了一個細粒度定時器,這樣就將Linux修改成為一個軟即時核心。
(2)“雙核心”方式。RTAI項目和RT-Linux採用了這種方法。這種方法將傳統Linux“架空”,作為新增加的小型即時核心的一個優先順序最低的任務執行,而即時任務則作為優先順序最高的任務。即在即時任務存在的情況下運行實施任務,否則才運行Linux本身的任務。
    MontaVista和RT-Linux的局限性在於它是一個商用軟體,不遵循GNU 的原始碼開放原則。若要在系統中使用這種Linux,則需要支付一筆頗為可觀的授權費用,這就違背了使用Linux的初衷—— 開源、免費,能夠發展自己的智慧財產權。
    RTAI為了即時效能捨棄了Linux固有的很多優點:對大量硬體的廣泛支援,優秀的穩定性、可靠性。開發人員一方面要針對RTAI自訂的一個硬體抽象層RTHAL(Real Time Hardware Abstraction Layer)重新編寫驅動程式,而且龐大的Linux開發社區的成果也無法方便地應用到即時核心中。

2 影響Linux即時性的因素
2.1 任務切換及其延時
    任務切換延時是Linux從一個進程切換到另一個進程所需的時間,即高優先順序進程從發出CPU 資源申請到進程的第1條指令開始執行的間隔。在即時系統中,任務切換延時必須越短越好。如之前所提到的,Linux 2.6.X已經實現了可搶佔式核心,高優先順序核心空間進程可以像在使用者空間中那樣讓CPU在任何時候停止低優先順序進程轉而執行自己。但是有2種例外情況:
(1)進程在臨界區(Critical Section)中執行的時候不能被其他進程搶佔;
(2)中斷服務程式(Interrupt Service Routine)不能被其他進程搶佔。

2.2 基於優先順序的調度演算法
    在Linux 2.6中,採用了O(1)調度演算法。它是一個基於優先順序的搶先式調度器,為每一個進程分配一個唯一的優先順序,調度器保證在所有等待啟動並執行任務中,首先被執行的總是高優先順序的任務,為此高優先順序的任務能夠搶佔低優先順序的任務。
    這個調度器開銷恒定,與當前系統開銷無關,能夠改善系統即時效能。但是調度系統沒有提供除CPU以外的其他資源剝奪運行,即時效能沒有得到根本改觀。如果兩個任務需要使用同一個資源(如快取),高優先順序的任務已準備就緒,而此刻低優先順序的任務正在用這個資源,高優先順序的任務就必須等待,直到低優先順序任務結束釋放了該資源後才能被執行,這被稱為優先順序倒置。

2.3 中斷延時、中斷服務程式
    中斷延時指的是從外設發出中斷訊號開始到ISR的第1條指令開始執行的時間間隔。由外部中斷引起的即時任務需求是即時系統處理量的主要組成部分,足夠快地中斷響應和迅速地中斷服務程式處理是衡量即時系統的重要效能指標。不同的ISR執行時間是不一樣的,即使是相同的ISR也可能因為有多個出口而有不同的執行時間。而ISR執行時外部中斷是被禁用的,造成這樣一種情況,即使Linux的中斷延時非常小,如果在一個ISR執行時某個外設也產生了一個中斷訊號,因為正在執行的ISR已耗用時間的不確定性和不可搶佔性,也會產生Linux的中斷延時的不可預測性。

3 系統即時效能的提高
3.1 任務切換機倒的建立
    在2.1節中提到進程在臨界區中執行的時候不能被搶佔的問題,為了不影響系統穩定性、減少調試和測試的時間,我們不打算對此進行修改,而引入一個機制保證即時任務能夠得到優先執行。即在即時系統中,只有當進程的臨界區能在下一個即時任務開始之前結束才被允許進入。
    如何判斷下一個即時任務中斷訊號的產生時間,一般來說中斷訊號是為了那些開始時間不可預測的任務而設定的,它的產生是完全隨機的。為了使中斷訊號的時間能夠被預測,將中斷訊號的產生與時鐘中斷掛鈎:中斷訊號只能與時鐘中斷同時產生。時鐘中斷由系統計時硬體以周期性間隔產生。這個間隔由核心根據Hz值設定。Hz是一個與體繫結構有關的常數,在檔案<Linux/param-h>中定義。當前的Linux為大多數平台定義的Hz值是100,亦即時鐘中斷周期是10ms。顯然這是達不到即時系統定時精度要求的。提高Hz值能夠帶來系統效能提升,但卻是以增加系統開銷為代價。這就必須仔細權衡即時性要求和系統開銷的平衡。一種方法是通過大量的測試確定的即時任務插斷要求發生的時間間隔和進程在臨界區中的執行時間,取一個稍大於大多數即時任務中斷間隔和臨界區執行時間的數值。
    Linux提供了一些機制讓我們得以計算函數的執行時間,gettimefoday()函數是其中之一。函數的原型及需要使用的一個資料結構如下:
int gettimeofday(struct timeval *tv,struct timezone *tz);
strut timeval{
long tv_sec; //second
long tv_usec;//microsecond};
    其中,gettimeofday()將目前時間儲存在tv結構中,tz一般不需要用到,可用NULL代替。使用樣本如下:
main()
{ struct timeval start_time,end_time;
float time_uesd;
gettimeofday(&start_time,NULL);
function_in_critical_setion();
gettimeofday(&end_time,NULL);
time_used =1000000 (start_time.tv_sec-end_time.tv_sec)+(start_time.tv_usec-end_time.tv_usec);
time_used/=1000000;
exit(0);}
    如此即可得出進程在臨界區function_in_critical_section()所耗費的時間,以供參考。將Hz值設定在2000,此時系統時鐘中斷周期為0.5ms,精度提高了20倍。
    1、圖2所示,當進程進入臨界區之前,它比較自身的平均執行時間T(NP)和T(REMAIN)的值,當T(NP)≤T(REMAIN)的時候,進程才被允許進入臨界區,否則進程進入工作隊列等待下一次判斷。
 
    本文嘗試用數學方法來分析採用這種機制對即時效能的提高。首先給出一個定義:當預定在時刻t時執行的即時任務延遲到時刻t'時才執行,則t'-t稱作系統延遲,用Lat(OS)表示。在普通Linux中,Lat(OS)如下:
Lat(OS)=T(NP)+ T(SHED)
    設任意時刻 ,T(NP)≤T(REMAIN)的機率為ρ,則普通Linux中的平均Lat(OS)為
AvLat(OS)=ρ[T(NP)+ T(SHED)] +(1-ρ)[T(NP)+ 2T(SHED)]
    引入前述機制後,由於總是優先保證即時任務的執行,Lat(RT-OS)固定式為:
Lat(RT-OS)=T(SHED)
    採用該機制前後系統廷遲的變化為
δ=AvLat(NOR-OS)-Lat(RT-OS)=T(NP)+(2-ρ)T(SHED)
    在一個特定系統裡,ρ是固定的,而在Linux 2.6中,採用O(1)演算法後T(SHED)也是固定的,由前式可得出結論:在臨界區的進程執行時間長的系統中,引入該機制前後平均系統廷遲下降的越大,系統即時效能的改善越明顯。

3.2 優先順序量頂
    試描述一個如下情境:低優先順序的任務L和高優先順序H任務需要佔用同一共用資源,低優先順序任務開始後不久,高優先順序任務也準備就緒,發現所需共用資源被佔用後,任務H被掛起,等待任務L結束釋放該資源。此時一個不需要該資源的中優先順序任務M 出現,調度器依據優先原則轉而執行任務M。這就進一步廷長了任務H的等待時間,3所示。更加惡劣的情況是,如果出現了更多的類似任務M0,M1,M2,...,將有可能使任務H錯過臨界期限(Critical Deadline),而導致系統崩潰。
    在一個不太複雜的即時系統中,可採用優先順序置頂的方法解決這一問題。該方案對每一個可能被共用的資源分派一個優先順序,該優先順序為有可能使用這個資源的最高優先順序的進程的優先順序(如下虛擬碼中的RESOURCE_X_PRIO)。由調度器將優先順序傳給使用該資源的進程,進程結束後其自身的優先順序(如下虛擬碼中的TASK_A_PRIO)才恢複正常。這樣就避免了上面情境中任務L被任務M搶佔,而導致任務H始終處於掛起狀態。優先順序置頂的範例程式碼如下:
void task_a(void)
{……
set_task_priority(RESOURCE_X_PRIO);
…… //Accessing shared resource x
set_task_priority(TASK_A_PRIO);……}
3.3 核心線程
    中斷服務程式(ISR)是不能被搶佔的。一旦CPU 開始執行ISR,除非程式結束,否則不可能轉而執行其他的任務。Linux用自旋鎖(Spinlock)來實現ISR對CPU的獨佔。採用了自旋鎖的ISR是不能進入休眠的,而且此時系統的中斷也被完全禁止。核心線程是由核心建立和撤銷的,用來執行一個指定的函數。核心線程具有自己的核心堆棧,能夠被單獨調用。我們用核心線程代替ISR,並且用互斥量(Mutex)替換自旋鎖。核心線程能夠進入休眠,而且執行時是不禁用外部中斷的。系統接到中斷訊號後,喚醒相應的核心線程,核心線程代替原來的ISR執行完任務後繼續進入休眠狀態。這樣中斷廷時就是可預測的,並且佔用時間也很少。
    根據LynuxWorks公司的測試資料,在Pentium III 1GHz的PC上,Linux 2.4核心的平均任務回應時間為1133us,平均中斷回應時間為252us;而Linux 2.6核心的平均回應時間為132us,平均中斷回應時間僅為14us,比Linux 2.4核心提高了一個數量級。在此基礎上,採用這種方法能夠針對具體的系統進一步加快特定中斷的回應時間,提高應用系統的即時效能。

4 總結與展望
    本文以Linux 2.6為基礎探討了提高Linux即時性的方法。引入了在即時系統中,只有當進入臨界區的進程能在下一個即時任務開始之前結束時才被允許執行的機制,保證即時任務總是優先得到執行;採用了優先順序置頂的方法避免了出現優先順序倒置的情況;用核心線程代替中斷服務程式,改變了了一般中斷服務程式執行中不能進入休眠狀態的情況,並且執行時不禁用外部中斷,使系統的中斷廷時變得短小和可預測。本文所述方法的缺點在於,提高系統時鐘中斷頻率帶會增大系統開銷問題。為了在即時效能提升和系統開銷增大之間找到一個平衡點,開發人員不得不對具體系統做大量測試,具體問題具體分析,使得該方法在適用性上打了折扣。Linux因其免費、效能強大、工具眾多的特點,必將在嵌入式系統領域得到大量的應用。我們應該及時跟蹤國內外Linux發展動態,同時積累在此領域的開發經驗,走出自己的路來。

轉自 http://www.dz3w.com/mcu/linux/0070702.html

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

另外,影響Linux即時性的是沒有高精度的時鐘計時,這個應該也可以通過修改核心來改進

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.