轉自:http://www.ibm.com/developerworks/cn/linux/l-real-time-linux/
級別: 中級
M. Tim Jones ([email protected]), 顧問工程師, Emulex Corp.
2008 年 5 月 19 日
Linux® 的速度或效率都非常不錯,只是在一些情況下,這樣的速度還不能滿足需求。我們需要的是在特定的容差範圍內確定性地滿足調度期限的能力。本文將揭示各種實現實時 Linux 的可選方案以及它們如何實現實時性 — 從早期的模仿虛擬化解決方案的架構到如今標準 2.6 內核中可用的選項。
本文探索了一些支持實時特性的 Linux 架構,並探討了實時架構 的含意是什麼。有許多種解決方案賦予 Linux 實時能力,本文將對瘦內核(或微內核)方法、超微內核方法以及資源內核(resource-kernel)方法進行考查。最後,描述了標準 2.6 內核的實時功能,並向您示範如何啓用並使用這種功能。
下列實時 的定義爲探討實時 Linux 架構提供了基礎。定義由 Donal Gillies 在 Realtime Computing FAQ 中提出(參見 參考資料 的鏈接)。
實時系統指系統的計算正確性不僅取決於計算的邏輯正確性,還取決於產生結果的時間。如果未滿足系統的時間約束,則認爲系統失效。
|
換句話說,系統面對變化的負載(從最小到最壞的情況)時必須確定性地保證滿足時間要求。注意,上述定義並未提到性能,原因是實時性與速度關係不大:它與可預見性有關。例如,使用快速的現代處理器時,Linux 可以提供 20 μ 微秒的典型中斷響應,但有時候響應會變得很長。這是一個基本的問題:並不是 Linux 不夠快或效率不夠高,而是因爲它不能提供確定性。
一些例子將演示全部這些內容的含意。圖 1 顯示的是中斷延遲指標。當中斷到達時(event),CPU 發生中斷並轉入中斷處理。執行一些工作以確定發生了什麼事件,然後執行少量工作分配必需的任務以處理此事件(上下文切換)。中斷到達與分發必需任務之間的時間(假設分配的是優先級最高的任務)稱爲響應時間。對於實時性要求,響應時間應是確定的並應當在已知的最壞情況的時間內完成。
|
有關這個過程的一個例子就是目前汽車中使用的氣囊。當報告車輛碰撞的傳感器中斷 CPU 後,操作系統應快速地分配展開氣囊的任務,並且不允許其他非實時處理進行干擾。晚一秒鐘展開氣囊比沒有氣囊的情況更糟糕。
除爲中斷處理提供確定性外,實時處理也需要支持週期性間隔的任務調度。考慮圖 2。本圖演示了週期性任務調度。大量控制系統要求週期性採樣與處理。某個特定任務必須按照固定的週期(p)執行,從而確保系統的穩定性。考慮一下汽車的防抱死系統(ABS)。控制系統對車輛的每個車輪的轉速進行採樣(每秒最多 20 次)並控制每個制動器的壓力(防止它鎖死)。爲了保持控制系統的正常工作,傳感器的採樣與控制必須按照一定的週期間隔。這意味着必須搶佔其他處理,以便 ABS 任務能按照期望的週期執行。
能夠在指定的期限完成實時任務(即便在最壞的處理負載下也能如此)的操作系統稱爲硬實時 系統。但並不是任何情況下都需要硬實時支持。如果操作系統在平均情況下能支持任務的執行期限,則稱它爲軟實時 系統。硬實時系統指超過截止期限後將造成災難性後果(例如展開氣囊過晚或制動壓力產生的滑行距離過長)的系統。軟實時系統超過截止期限後並不會造成系統整體失敗(如丟失視頻中的一幀)。
現在您已經對實時性要求有了一些深入瞭解,讓我們查看一些實時 Linux 架構各支持哪個級別的實時性以及如何做到這一點。
|
瘦內核(或微內核)方法使用了第二個內核作爲硬件與 Linux 內核間的抽象接口(見圖 3)。非實時 Linux 內核在後臺運行,作爲瘦內核的一項低優先級任務託管全部非實時任務。實時任務直接在瘦內核上運行。
瘦內核主要用於(除了託管實時任務外)中斷管理。瘦內核截取中斷以確保非實時內核無法搶佔瘦內核的運行。這允許瘦內核提供硬實時支持。
雖然瘦內核方法有自己的優勢(硬實時支持與標準 Linux 內核共存),但這種方法也有缺點。實時任務和非實時任務是獨立的,這造成了調試困難。而且,非實時任務並未得到 Linux 平臺的完全支持(瘦內核執行稱爲瘦 的一個原因)。
使用這種方法的例子有 RTLinux (現在由 Wind River Systems 專有),實時應用程序接口(RTAI)和 Xenomai。
|
這裏瘦內核方法依賴於包含任務管理的最小內核,而超微內核法對內核進行更進一步的縮減。通過這種方式,它不像是一個內核而更像是一個硬件抽象層(HAL)。超微內核爲運行於更高級別的多個操作系統提供了硬件資源共享(見圖 4)。因爲超微內核對硬件進行了抽象,因此它可爲更高級別的操作系統提供優先權,從而支持實時性。
注意,這種方法和運行多個操作系統的虛擬化方法有一些相似之處。使用這種方法的情況下,超微內核在實時和非實時內核中對硬件進行抽象。這與 hypervisor 從客戶(guest)操作系統對裸機進行抽象的方式很相似。更多信息參見 參考資料 。
關於超微內核的示例是操作系統的 Adaptive Domain Environment for Operating Systems (ADEOS)。ADEOS 支持多個併發操作系統同步運行。當發生硬件事件後,ADEOS 對鏈中的每個操作系統進行查詢以確定使用哪一個系統處理事件。
|
另一個實時架構是資源內核法。這種方法爲內核增加一個模塊,爲各種資源提供預留(reservation)。這種機制保證了對時分複用(time-multiplexed)系統資源的訪問(CPU、網絡或磁盤帶寬)。這些資源擁有多個預留參數,如循環週期、需要的處理時間(也就是完成處理所需的時間),以及截止時間。
資源內核提供了一組應用程序編程接口(API),允許任務請求這些預留資源(見圖 5)。然後資源內核可以合併這些請求,使用任務定義的約束定義一個調度,從而提供確定的訪問(如果無法提供確定性則返回錯誤)。通過調度算法,如 Earliest-Deadline-First (EDF),內核可以處理動態的調度負載。
資源內核法實現的一個示例是 CMU 公司的 Linux/RK,它把可移植的資源內核集成到 Linux 中作爲一個可加載模塊。這種實現演化成商用的 TimeSys Linux/RT 產品。
|
目前探討的這些方法在架構上都很有趣,但是它們都在內核的外圍運行。然而,如果對標準 Linux 內核進行必要的修改使其支持實時性,結果會怎麼樣呢?
今天,在 2.6 內核中,通過對內核進行簡單配置使其完全可搶佔(見圖 6),您就可以得到軟實時功能。在標準 2.6 Linux 內核中,當用戶空間的進程執行內核調用時(通過系統調用),它便不能被搶佔。這意味着如果低優先級進程進行了系統調用後,高優先級進程必須等到調用結束後才能訪問 CPU。新的配置選項 CONFIG_PREEMPT
改變了這一內核行爲,在高優先級任務可用的情況下(即使此進程正在進行系統調用),它允許進程被搶佔。
但這種配置選項也是一種折衷。雖然此選項實現了軟實時性能並且即使在負載條件下也可使操作系統順利地運行,但這樣做也付出了代價。代價就是略微減低了吞吐量以及內核性能,原因是 CONFIG_PREEMPT
選項增加了開銷。這種選項對桌面和嵌入式系統而言是有用的,但並不是在任何場景下都有用(例如,服務器)。
|
在 2.6 內核中另一項有用的配置選項是高精度定時器。這個新選項允許定時器以 1μs 的精度運行(如果底層硬件支持的話),並通過紅黑樹實現對定時器的高效管理。通過紅黑樹,可以使用大量的定時器而不會對定時器子系統(O(log n))的性能造成影響。
只需要一點額外的工作,您就可以通過 PREEMPT_RT 補丁實現硬實時。PREEMPT_RT 補丁提供了多項修改,可實現硬實時支持。其中一些修改包括重新實現一些內核鎖定原語,從而實現完全可搶佔,實現內核互斥的優先級繼承,並把中斷處理程序轉換爲內核線程以實現線程可搶佔。
|
Linux 不僅是一個實驗和描述實時算法的理想平臺,目前在標準的 2.6 內核中也實現了實時功能。從標準內核中您可以實現軟實時功能,再執行一些額外的工作(內核補丁)您就可以構建硬實時應用程序。
本文簡要介紹了一些爲 Linux 內核提供實時計算的技術。很多早期的嘗試使用瘦內核方法把實時任務與標準內核分離。後來,出現了超微內核法,它與如今的虛擬化解決方案中使用的 hypervisor 非常相似。最後,Linux 內核提供了自己的實時方法,包括軟實時和硬實時。
雖然本文只是對 Linux 的實時方法進行了簡單介紹,但 參考資料 一節中提供了更多的信息,可以從中獲得額外的信息和其他有用的實時技術。
學習
- 您可以參閱本文在 developerWorks 全球站點上的 英文原文。
- 在 Tim 的文章 “虛擬 Linux”(developerWorks,2006 年 12 月)中,瞭解從虛擬化架構中借鑑而來的實現實時性的瘦內核和超微內核法是多麼流行。
- 在 Tim 的文章 “Linux 調度器內幕”(developerWorks,2006 年 6 月)中,瞭解 2.6 內核中 O(1) 調度程序的更多內容。
- 閱讀 developerWorks 上的 Tim 的全部 Anatomy of... 文章 。
- Realtime Computing FAQ 是一個很棒的學習實時計算的起點。它涵蓋了可移植操作系統接口(POSIX)、實時操作系統的基礎知識,以及一些實時分析技巧。
- “Real-time Control Systems”(PDF)是由 A. Gambier 撰寫的有趣教程,它介紹了實時控制系統的設計並探討了各種調度算法。
- 第六屆實時 Linux 研討會(2007 年 11 月舉辦)的會議記錄中包含的論文和參考資料可以幫助您瞭解實時 Linux 的最新發展。
- 早期的 RTLinux以及 Xenomai 都應用了瘦內核方法。雖然運用方式略有不同,但整體方法被證明是有價值的。
- ADEOS 是一個在 Linux 內核中提供實時功能的硬件抽象層(HAL)或超微內核。它也已應用到對稱多處理器(SMP)集羣和內核調試中。
- “Portable RK: A Portable Resource Kernel for Guaranteed and Enforced Timing Behavior” 描述了一個通過預留 API 提供對時分複用資源(如 CPU、網絡或磁盤)的可靠訪問的組件。
- 紅黑樹 是一個自平衡的二叉查找樹。雖然算法本身很複雜,但它在實踐應用中的效率很高,可以按照 O(log n) 的時間操作。
- PREEMPT_RT 補丁爲標準 2.6 Linux 內核提供了硬實時功能。這些頁面詳細地說明了 安裝與使用 RT_PREEMPT 配置的方法以及一些有用的 FAQ。
- 在這個 優先級反轉 場景中,低優先級的任務佔有着高優先級任務需要的資源(這個問題出現在 使用風河公司 VxWorks 系統的火星開拓者探測器上)。此問題的解決方法是 優先級繼承,這增加了低優先級任務的優先級,允許它運行從而釋放資源。
- Novell 公司最近公佈了它們的 SUSE Linux Enterprise Real-Time (SLERT) 1.0 版。這個發行版包含內核更新以及對實時應用程序的 POSIX 實時支持。兩項改進包括 CPU 屏蔽和 動態優先級分配 。
- Xenomai/SOLO 宣佈不使用內核共存法,而轉向使用與 Linux 內核層更加緊密集成的方法。這種方法支持傳統的 POSIX (用戶空間)編程。
- 在 developerWorks Linux 專區 找到更多面向 Linux 開發人員的資源,並請瀏覽 最受歡迎的文章和教程。
- 查看 developerWorks 上所有的 Linux 技巧和 Linux 教程。
- 隨時關注 developerWorks 技術活動和網絡廣播。
獲得產品和技術
- 定購 SEK for Linux,共含兩張 DVD,包含來自 DB2®、 Lotus®、 Rational®、 Tivoli® 和 WebSphere® 的面向 Linux 的最新 IBM 試用軟件。
- 使用 IBM 試用軟件 改進您的下一個 Linux 開發項目,可以從 developerWorks 直接下載獲得。
討論
- 通過 新 developerWorks 空間 上的博客、論壇、podcast 和社區主題加入 developerWorks 社區。
M. Tim Jones 是一名嵌入式軟件工程師,他是 GNU/Linux Application Programming、AI Application Programming 以及 BSD Sockets Programming from a Multilanguage Perspective 等書的作者。他的工程背景非常廣泛,從同步宇宙飛船的內核開發到嵌入式架構設計,再到網絡協議的開發。Tim 是位於科羅拉多州 Longmont 的 Emulex Corp. 的一名顧問工程師。 |