深度學習:實時作業系統概念梳理

一rtos一 發佈 2023-12-24T16:31:32.744123+00:00

什麼是RTOS?在深入了解實時作業系統中我們會發現,RTOS的基本原理是通過中斷處理和任務調度來實現實時性,線程與調度是RTOS中兩個最重要的概念。

  什麼是RTOS?在深入了解實時作業系統中我們會發現,RTOS的基本原理是通過中斷處理和任務調度來實現實時性,線程與調度是RTOS中兩個最重要的概念。

  此文首先闡述這兩個概念,然後給出RTOS的其他相關術語,簡單地分為內核類與線程類的相關術語,理解這些基本概念是學習RTOS的關鍵一環。這裡的內核是指RTOS的核心部分,是RTOS廠家提供的程序,而線程則是指應用程式設計者編制的程序,它在內核的調度下運行。

  線程與調度基本含義

  線程與調度是RTOS中兩個不可分割的重要的基本概念,透徹地理解它們,對RTOS的學習至關重要。

  1.線程的基本含義

  線程是RTOS中最重要的概念之一。在RTOS下,把一個複雜的嵌入式應用工程按一定規則分解成一個個功能清晰的小工程,然後設定各個小工程的運行規則,交給RTOS管理,這就是基於RTOS編程的基本思想。這一個個小工程被稱為線程(Thread),RTOS管理這些線程,被稱為調度(Scheduling)。

  要給RTOS中的線程下一個準確而完整的定義並不十分容易,可以從不同視角理解線程。從線程調度視角理解,可以認為,RTOS中的線程是一個功能清晰的小程序,是RTOS調度的基本單元;從RTOS的軟體設計視角來理解,就是在軟體設計時,需要根據具體應用,劃分出獨立的、相互作用的程序集合,這樣的程序集合就被稱為線程,每個線程都被賦予一定的優先級;從CPU視角理解,在單CPU下,某一時刻CPU只會處理(執行)一個線程,或者說只有一個線程占用CPU。RTOS內核的關鍵功能就是以合理的方式為系統中的每個線程分配時間(即調度),使之得以運行。

  實際上,根據特定的RTOS,線程可能被稱為任務(Task),也可能使用其他名詞,含義或許稍有差異,但本質不變,也不必花過多精力追究其精確語義,因為學習RTOS的關鍵在於掌握線程設計方法、理解調度過程、提高編程魯棒性、理解底層驅動原理、提高程序規範性、可移植性與可復用性、提高嵌入式系統的實際開發能力等。要真正理解與掌握利用線程進行基於RTOS的嵌入式軟體開發,需要從線程的狀態、結構、優先級、調度、同步等視角來認識,將在後續章節中詳細闡述。

  2.調度的基本含義

  多線程系統中,RTOS內核(Kernel)負責管理線程,或者說為每個線程分配CPU時間,並且負責線程間的通信。

  調度(Scheduling)就是決定該輪到哪個線程運行了,它是內核最重要的職責。每個線程根據其重要程度不同,被賦予一定的優先級。不同的調度算法對RTOS的性能有較大影響,基於優先級的調度算法是RTOS常用的調度算法,其核心思想是,總是讓處於就緒態的、優先級最高的線程先運行。然而何時高優先級線程掌握CPU的使用權,由使用的內核類型確定,基於優先級的內核有不可搶占型和可搶占型兩種類型。

  內核類其他基本概念

  在RTOS場景下編程,晶片啟動過程先運行一段被稱為RTOS內核的程序代碼,這段代碼的功能是:開闢好用戶線程的運行環境,準備好對線程進行調度。RTOS一般由內核與擴展部分組成,內核的最主要功能是線程調度,擴展部分的最主要功能是提供應用程式編程接口(API)。內核類其他基本概念主要有:時間嘀嗒、代碼臨界段、不可搶占型內核與可搶占型內核、實時性相關概念及RTOS實時性指標等。

  1.時間嘀嗒

  時鐘節拍(ClockTick),有時也直接譯為時鐘嘀嗒,它是特定的周期性中斷,通過定時器產生周期性的中斷,以便內核判斷是否有更高優先級的線程已進入就緒狀態。

  2.代碼臨界段

  代碼臨界段也稱為臨界區,是指處理時不可分割的代碼,一旦這部分代碼開始執行,則不允許任何中斷打擾。為確保臨界段代碼的執行,在進入臨界段之前要關中斷,且臨界段代碼執行完後應立即開中斷。

  3.不可搶占型內核與可搶占型內核

  不可搶占型內核(Non-PreemptiveKernel),要求每個線程主動放棄CPU的使用權,不可搶占型調度算法也稱為合作型多線程,各個線程彼此合作共享一個CPU。但異步事件還是由中斷服務來處理,中斷服務可使高優先級的線程由掛起態變為就緒態,但中斷服務以後,使用權還是回到原來被中斷了的那個線程,直到該線程主動放棄CPU的使用權,新的高優先級的線程才能獲得CPU的使用權。

  當系統響應時間很重要時,須使用可搶占型內核(PreemptiveKernel)。在可搶占型內核中,一個正在運行的線程可以被打斷,而讓另一個優先級更高且變為就緒態的線程運行。如果是中斷服務子程序使高優先級的線程進入就緒態,中斷完成時,被中斷的線程被掛起,優先級高的線程開始運行。

  4.實時性相關概念及RTOS實時性指標

  硬實時(HardReal-Time)要求在規定的時間內必須完成操作,是在設計作業系統時保證的,通常將具有優先級驅動的、時間確定性的、可搶占調度的RTOS系統稱為硬實時系統。軟實時(SoftReal-Time)則沒有那麼嚴格,只要按照線程的優先級,儘可能快地完成操作即可。

  RTOS追求的是調度的實時性、響應時間的可確定性、系統的高度可靠性,評價一個RTOS一般可以從線程調度、內存開銷、系統響應時間、中斷延遲等幾個方面來衡量。

  (1)線程調度的時間指標

  RTOS的實時性和多線程能力在很大程度上取決於它的線程調度機制。在大多數商用的實時系統中,為了讓作業系統能夠在有突發事件時迅速取得系統使用權,以便對事件做出反應,所以大都提供了「搶占式線程調度」功能,也就是作業系統有權主動終止應用程式(應用線程)的執行,並且將執行權交給擁有最高優先級的線程。

  調度延時(SchedulingLatency):指當一個更高優先級的線程就緒到這個線程開始運行之間的時間。簡而言之,就是一個線程被觸發後,由就緒到開始運行的時間。

  線程切換時間(Context-SwitchingTime):由於某種原因使一個線程退出運行時,RTOS保存它的運行現場信息,並插入相應列表,依據一定的調度算法重新選擇一個新線程使之投入運行,這一過程所需時間稱為線程切換時間。線程切換時間越短,RTOS的性能就越高。

  恢復時間(RecoveryTime):指從線程完成後,系統響應到恢復執行主程序所需要的時間。

  (2)最小內存開銷

  在RTOS的設計過程中,由於成本限制,嵌入式系統產品內存的配置一般都不大,而在有限的內存空間內不僅要裝載RTOS,還要裝載用戶程序。因此,最小內存開銷是一個重要的指標,這是RTOS設計與其他作業系統設計的明顯區別之一。

  (3)系統響應時間

  系統響應時間(Systemresponsetime):指系統發出處理要求到系統給出應答信號的時間,也就是從線程請求產生到線程完成之間的時間間隔,需要滿足一定的時間約束。控制要滿足一定的實時性要求,就是響應時間小於臨界時間。系統響應時間由反應時間和處理時間兩部分組成,反應時間指外部中斷提交到CPU開始處理的時間,處理時間指CPU完成處理的時間。提高系統的響應時間,可以從縮短反應時間和處理時間兩個方面入手。反應時間是電信號的傳導時間,對於不同速度的處理器,這個時間相差不大。

  (4)中斷延遲

  中斷是一種硬體機制,用於通知CPU發生了一個異步事件。CPU一旦識別出一個中斷,保存線程上下文後,跳至該中斷服務程序(ISR)執行,處理完這個中斷後,返回到就緒列表中具有最高優先級的線程執行。當RTOS運行在核心態或執行某些系統調用的時候,不會因為外部中斷的到來而立即執行中斷服務程序,只有當RTOS重新回到用戶態時才響應外部中斷請求,這一過程所需的最大時間就是中斷禁止時間。

  中斷延遲(Interruptlatency)時間:是指系統確認中斷開始直到執行中斷服務程序第一條指令為止,整個處理過程所需要的時間。中斷禁止時間越短,則中斷延遲時間越短,那麼系統的實時性也會越高。

  線程類其他基本概念

  這裡歸納線程類其他基本概念主要有:線程的上下文及線程切換、線程間通信、死鎖、線程優先級、優先級驅動、優先級反轉、優先級繼承、資源、共享資源與互斥等。

  1.線程的上下文及線程切換

  線程的上下文(Context),即CPU內寄存器。當多線程內核決定運行另外的線程時,它保存正在運行線程的當前上下文,這些內容保存在隨機存儲器(RandomAccessMemory,RAM)中的線程當前狀況保存區(Task’sContextStorageArea),也就是線程自己的堆棧之中。入棧工作完成以後,就把下一個將要運行線程的當前狀況從其線程堆棧中重新裝入CPU的寄存器,開始下一個線程的運行,這一過程叫作線程切換或上下文切換。

  2.線程間通信

  線程間通信是指線程間的信息交換,其作用是實現同步及數據傳輸。同步是指根據線程間的合作關係,協調不同線程間的執行順序。線程間通信的方式主要有事件、消息隊列、信號量、互斥量等。有關線程間通信及下述的優先級反轉、優先級繼承、資源、共享資源與互斥等概念將在後續章節中詳細闡述。

  3.死鎖

  死鎖指兩個或兩個以上的線程無限期地互相等待對方釋放其所占資源。死鎖產生的必要條件有4個,即資源的互斥訪問、資源的不可搶占、資源的請求保持以及線程的循環等待。解決死鎖問題的方法是破壞產生死鎖的任一必要條件,例如規定所有資源僅在線程運行時才分配,其他任意狀態都不可分配,破壞其資源請求保持特性。

  4.線程優先級、優先級驅動、優先級反轉、優先級繼承

  在一個多線程系統中,每個線程都有一個優先級(Priority)。

  優先級驅動(Priority-Driven):在一個多線程系統中,正在運行的線程總是優先級最高的線程。在任何給定的時間內,總是把CPU分配給優先級最高的線程。

  優先級反轉(Priority-Inversion):當一個線程等待比它優先級低的線程釋放資源而被阻塞時,這種現象被稱為優先級反轉,這是一個需要在編程時必須注意的問題。優先級繼承技術可以解決優先級反轉問題,目前市場上大多數商用作業系統都使用優先級繼承技術。

  優先級繼承(Priority-Inheritance):優先級繼承是用來解決優先級反轉問題的技術。當優先級反轉發生時,較低優先級線程的優先級暫時提高,以匹配較高優先級線程的優先級。這樣,就可以使較低優先級線程儘快地執行並且釋放較高優先級線程所需要的資源。

  5.資源、共享資源與互斥

  資源(Resources):任何為線程所占用的實體均可稱為資源。資源可以是輸入/輸出設備,例如印表機、鍵盤及顯示器,也可以是一個變量、結構或數組等。

  共享資源(SharedResources):可以被一個以上線程使用的資源叫作共享資源。為了防止數據被破壞,每個線程在與共享資源打交道時,必須獨占資源,即互斥。

  互斥(MutualExclusion):互斥是用於控制多線程對共享數據進行順序訪問的同步機制。在多線程應用中,當兩個或更多的線程同時訪問同一數據區時,就會造成訪問衝突,互斥能使它們依次訪問共享數據而不引起衝突。

關鍵字: