即時作業系統
即時作業系統(Real-time operating system, RTOS),又稱實時作業系統,它會按照排序執行、管理系統資源,並為開發應用程式提供一致的基礎。
即時作業系統與一般的作業系統相比,最大的特色就是「即時性」[1],如果有一個任務需要執行,即時作業系統會馬上(在較短時間內)執行該任務,不會有較長的延時。這種特性保證了各個任務的及時執行。
設計即時作業系統的首要目標不是高的吞吐量,而是保證任務在特定時間內完成,因此衡量一個即時作業系統堅固性的重要指標,是系統從接收一個任務,到完成該任務所需的時間,其時間的變化稱為抖動。可以依抖動將即時作業系統分為兩種:硬即時作業系統及軟即時作業系統,硬即時作業系統比軟即時作業系統有更少的抖動:
- 硬即時作業系統必須使任務在確定的時間內完成。
- 軟即時作業系統能讓絕大多數任務在確定時間內完成。[2]
即時作業系統與一般的作業系統有着不同的排程演算法。普通的作業系統的排程器對於線程優先級等方面的處理更加靈活;而即時作業系統追求最小的中斷延時和線程切換延時。[3]
設計理念
編輯通常,即時作業系統分為兩大類:
時間觸發型設計往往比較嚴格地排程任務,具有更好的多工處理能力。多個任務被不停地輪流排程,在宏觀上,就相當於一個CPU同時執行多個任務。
在過去,CPU在切換任務時往往需要多個機器周期,在這段時間內,CPU不能處理其他任何任務。例如,一個20 MHz的摩托羅拉68000處理器(1980年代後期),在切換任務時需要花費20微秒。(相比之下,一個100 MHz的ARM架構的處理器(2008年之後的)只需要3微秒。)[4][5]因此,早期的即時作業系統通過減少工作切換次數來避免消耗過多CPU時間。
任務排程
編輯在典型的設計中[來源請求],一個任務有以下三種狀態:
- 正在執行(Running,正在CPU中執行)
- 待命(Ready,等待執行)
- 阻塞(Blocked,任務暫停,等待一個事件的發生,例如接收一組數據)
由於CPU在某個時間只能執行一個任務,大部分任務,在大部分時間,處於阻塞或待命狀態。可能會有大量專案在待命清單里等待執行,這取決於系統所需的任務數量以及排程器的類型。
通常情況下,對於簡單的時間觸發式排程器來說,待命任務清單的數據結構的設計要儘可能縮短最壞情況下,程式在排程器關鍵部分的執行時間,以防止其他任務一直在待命清單中,無法及時執行。因此,在這種排程器中,應儘可能避免搶佔式任務,甚至應該關閉排程器之外的所有中斷。當然,待命任務清單的數據結構也應根據這個系統需要的最大任務數量做進一步的最佳化。
如果待命任務清單中的任務較多,雙向鏈結串列是一個比較好的選擇。如果待命任務清單通常包含少量任務,但偶爾會出現較多工,任務應該根據優先級排序。這樣一來,要尋找最高優先級的任務,就不必要在整個清單中一個一個地尋找。而插入任務需要從清單中的第一個任務開始,向後尋找,直到找到比要插入的任務優先級低的任務,然後插入到該任務之前;如果沒有找到優先級更低的任務,就插入到任務清單末尾。
在尋找任務清單,準備插入任務的過程中,應該注意避免搶佔。長的關鍵部分應分為多個小的部分分別執行。如果在尋找任務清單,要插入低優先級任務的時候,一個中斷發生使高優先級任務進入待命狀態,高優先級任務應該在低優先級任務被插入之前立刻被插入清單和執行。
在更先進的系統中,即時任務和許多非即時任務共用運算資源,這時候待命任務清單會變得很長。在這種系統中,待命任務清單可能不適合用鏈結串列的結構。
排程演算法
編輯一些即時作業系統中常用的演算法:
- 合作式排程
- 搶佔式排程
- Rate-monotonic scheduling
- Round-robin scheduling
- Fixed priority pre-emptive scheduling, an implementation of preemptive time slicing
- Fixed-Priority Scheduling with Deferred Preemption
- Fixed-Priority Non-preemptive Scheduling
- Critical section preemptive scheduling
- Static time scheduling
- Earliest Deadline First approach
- Stochastic digraphs with multi-threaded graph traversal
RTOS舉例
編輯WinCE、VxWorks、μC/OS-Ⅱ等運用較廣。Linux是作為通用作業系統開發的,其內核在即時處理能力上先天不足,部分網絡開發社區將其經過改造能在一定程度上成為即時作業系統。[6]
開放原始碼&免費
編輯開放原始碼
編輯- SylixOS [3](頁面存檔備份,存於互聯網檔案館)
- RT-Thread [4](頁面存檔備份,存於互聯網檔案館)
- eCos
- Fiasco.OC [5](頁面存檔備份,存於互聯網檔案館)
- FreeRTOS [6](頁面存檔備份,存於互聯網檔案館)
- Phoenix-RTOS
- Nut/OS [7](頁面存檔備份,存於互聯網檔案館)
- Prex
- RTAI
- RTEMS
- RTLinux
- SHaRK [8](頁面存檔備份,存於互聯網檔案館)
- TRON Project
- Xenomai [9]
- CoOS [10]
- One OS [11](頁面存檔備份,存於互聯網檔案館)
- ChibiOS
非開放原始碼
編輯- Ardence RTX
- BeOS
- ChorusOS
- DNIX
- DMERT
- e-Tkernel
- HOPEN OS
- embOS (Segger)
- INTEGRITY
- ITRON
- LynxOS
- MERT
- MicroC/OS-II
- MQX RTOS [12](頁面存檔備份,存於互聯網檔案館)
- Nucleus
- OS-9
- OSE
- OSEK/VDX
- OSEKtime
- PDOS
- Phar Lap ETS
- PikeOS
- Portos
- pSOS
- QNX
- RMX
- RSX-11
- RT-11
- RTOS-UH
- RTXC
- Salvo RTOS [13](頁面存檔備份,存於互聯網檔案館)
- SINTRAN III
- Symbian OS
- ThreadX
- VRTX
- VxWorks
- Windows CE
- µnOS
- UNIX-RTR
- REX
- HP-1000/RTE [14]
參考文獻
編輯- ^ Response Time and Jitter. [2013-08-16]. (原始內容存檔於2014-04-14).
- ^ Tanenbaum, Andrew. Modern Operating Systems. Upper Saddle River, NJ: Pearson/Prentice Hall. 2008: 160. ISBN 978-0-13-600663-3.
- ^ RTOS Concepts. [2013-08-16]. (原始內容存檔於2013-04-06).
- ^ Context switching time. Segger Microcontroller Systems. [2009-12-20]. (原始內容存檔於2011-07-16).
- ^ RTOS performance comparison on emb4fun.de. [2013-08-16]. (原始內容存檔於2013-01-11).
- ^ Karim Yaghmour; Jon Masters, Gilad Ben-Yossef & Philippe Gerum. Building Embedded Linux Systems. O』Reilly Media, Inc. 2008: 354. ISBN 978-0-596-52968-0.