什么是實時操作系統(RTOS)?


來源 |   汽車ECU開發
知圈 |  進“電子電氣群”請加微13636581676,備注架構

在維基百科上,實時操作系統(RTOS)的定義如下:

實時操作系統(Real-time operating system, RTOS),又稱即時操作系統,它會按照排序運行、管理系統資源,并為開發應用程序提供一致的基礎。
實時操作系統與一般的操作系統相比,最大的特色就是“實時性”,如果有一個任務需要執行,實時操作系統會馬上(在較短時間內)執行該任務,不會有較長的延時。這種特性保證了各個任務的及時執行。

經常跟實時操作系統一起講的,還有嵌入式操作系統這個概念,但實際上這是完全不同的兩種東西,雖然大多數實時操作系統都是嵌入式操作系統,但嵌入式操作系統并不全都是實時的。

對于實時操作系統有一些常見的誤區,比如:速度快,吞吐量大,代碼精簡,代碼規模小等等。其實這些都不算是實時操作系統的特性,別的操作系統也可以做到。
只有“實時性”才是RTOS的最大特征,其它的都不算是。

維基百科上關于實時性的定義:
實時運算(Real-time computing)是計算機科學中對受到“實時約束”的計算機硬件和計算機軟件系統的研究,實時約束像是從事件發生到系統回應之間的最長時間限制。實時程序必須保證在嚴格的時間限制內響應。

實時操作系統中都要包含一個實時任務調度器,這個任務調度器與其它操作系統的最大不同是強調:嚴格按照優先級來分配CPU時間,并且時間片輪轉不是實時調度器的一個必選項。

提出實時操作系統的概念,可以至少解決兩個問題:一個是早期的CPU任務切換的開銷太大,實時調度器可以避免任務頻繁切換導致CPU時間的浪費;另一個是在一些特殊的應用場景中,必須要保證重要的任務優先被執行。

在這樣的背景下,實時操作系統就被設計出來了,典型的實時操作系統有VxWorks,RT-Thread,uCOS,QNX,WinCE等。

實時任務調度器是實時操作系統的一個必選項,但不代表只要設計出來一個實時調度器就足夠了。事實上設計一個實時調度內核并不是一個多么復雜的任務,實時操作系統的特性是在整個操作系統的設計思路上都要時刻關注實時性。

這些設計思路包括:
1. 實時的消息、事件處理機制
常規的操作系統中,消息隊列都是按照FIFO(先進先出)的方式進行調度,如果有多個接受者,那么接受者也是按照FIFO的原則接受消息(數據),但實時操作系統會提供基于優先級的處理方式:兩個任務優先級是分別是10和20,同時等待一個信號量,如果按照優先級方式處理,則優先級為10的任務會優先收到信號量。

2. 提供內核級的優先級翻轉處理方式
實時操作系統調度器最經常遇到的問題就是優先級翻轉,因此對于類似信號量一類的API,都能提供抑止優先級翻轉的機制,防止操作系統死鎖。

3. 減少粗粒度的鎖和長期關中斷的使用
這里的鎖主要是指自旋鎖(spinlock)一類會影響中斷的鎖,也包括任何關中斷的操作。在Windows和Linux的驅動中,為了同步的需要,可能會長期關閉中斷,這里的長期可能是毫秒到百微秒級。但實時操作系統通常不允許長期關中斷。

對于非實時操作系統來說,如果收到一個外部中斷,那么操作系統在處理中斷的整個過程中可能會一直關中斷。但實時操作系統的通常做法是把中斷作為一個事件通告給另外一個任務,interrupt handler在處理完關鍵數據以后,立即打開中斷,驅動的中斷處理程序以一個高優先級任務的方式繼續執行。

4. 系統級的服務也要保證實時性
對于一些系統級的服務,比如文件系統操作,非實時系統會緩存用戶請求,并不直接把數據寫入設備,或者建立一系列的線程池,分發文件系統請求。但實時系統中允許高優先級的任務優先寫入數據,在文件系統提供服務的整個過程中,高優先級的請求被優先處理,這種高優先級策略直到操作完成。

這種設計實際上會犧牲性能,但實時系統強調的是整個系統層面的實時性,而不是某一個點(比如內核)的實時性,所以系統服務也要實時。

由于應用場景的差異,會出現有些用戶需要實時性的驅動,有些用戶需要高性能的驅動,因此實時操作系統實際上要提供多種形式的配置以滿足不同實時性需求的用戶。

5. 避免提供實時性不確定的API
多數實時操作系統都不支持虛擬內存(page file/swap area),主要原因是缺頁中斷(page fault)會導致任務調度的不確定性增加。實時操作系統很多都支持分頁,但很少會使用虛擬內存,因為一次缺頁中斷的開銷十分巨大(通常都是毫秒級),波及的代碼很多,導致用戶程序執行的不確定性增加。

實時操作系統的確定性是一個很重要的指標,在某些極端場景下,甚至會禁用動態內存分配(malloc/free),來保證系統不受到動態的任務變化的干擾。

6. 提供針對實時系統調度的專用API
比如ARINC 653標準中就針對任務調度等作出了一系列的規定,同時定義了特定的API接口和API行為,這些API不同于POSIX API,如果實時系統要在航空設備上使用,就可能需要滿足ARINC 653的規范。

7. 降低系統抖動
由于關中斷等原因,通常情況下,操作系統的調度器不會太精確的產生周期性的調度,比如x86早期的默認60的時鐘周期(clock rate),抖動范圍可能在15-17ms之間。但一個設計優秀的實時操作系統能把調度器的抖動降低到微秒甚至百納秒一級,在像x86這種天生抖動就很大的架構上,降低系統抖動尤其重要。

8. 針對實時性設計的SMP和虛擬化技術
SMP(多核)場景的實時調度是很困難的,這里還涉及到任務核間遷移的開銷。針對SMP場景,多數實時操作系統的設計都不算十分優秀,但比起普通操作系統來說,其實時性已經好很多了。

同時實時操作系統的虛擬化能從hypervisor層面上提供虛擬機級別的實時調度,虛擬機上可以是另外一個實時系統,也可以是一個非實時系統。

-------------------------------------------
從以上的特點上看,前面提到的常見的錯誤認識:速度快,吞吐量大,代碼精簡,代碼規模小,都不是實時操作系統的特征:
非實時操作系統也可以很快,實時操作系統也可能很慢;

通常來說實時操作系統的吞吐量會大一些,但非實時系統也可以做到吞吐量更大;
實時操作系統一般都比非實時操作系統要小,但規模大的實時操作系統也是存在的;
而且由于可能需要針對不同用戶提供不同等級的實時服務,實時操作系統可能并不是那么精簡的……

由于設備性能的發展,原來很多實時性要求高的場景,已經切換到普通的操作系統了。Linux在嵌入式設備上的推廣,使用實時操作系統的很多設備已經改用Linux了,因為硬件性能的提升會讓系統延遲降低到一個用戶可以接受的程度。

但在某些特定的場景下,比如工業自動化、機器人、航空航天、軍工領域等,仍然對實時操作系統有需求,并且應該會長期存在。

同時,由于實時操作系統的特性,它并不是一個應用場景廣泛的系統,一些人認為學嵌入式就是學實時操作系統,這種認識其實是不正確的,現在嵌入式開發,不一定需要在實時操作系統下完成。

閱讀原文,關注作者知乎
什么是實時操作系統(RTOS)?的圖1
登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP