多處理器下的硬實時操作系統研究
0、引言
Linux 是一個具有廣闊前景的操作系統,從桌面工作站到低端服務器,處處都可見它的身影。現如今,Linux 正全力進軍嵌入式系統和高端服務器系統領域,但它的技術缺陷卻限制了它的競爭力:雖然Linux繼承了傳統Unix的公平調度機制即分時調度策略,提供了一個穩定的操作系統的管理系統,但是它仍然不能解決實時系統要求的納秒級的中斷延遲、任務切換時間,即便是當前的2.6內核,也只是在linux內核中添加了一些可搶占點,對實時性的支持也還是不盡人意。
現如今提出了一種將實時任務與SMP體系結構相結合的方案,由于它將處理器以實時與非實時的方式進行了劃分,所以稱之為不對稱的多處理器原則。盡管這種方案是可行的,但是它仍存在一個很大的弊端:在非實時處理器負載過重的情況下,實時處理器可能會處在空閑的狀態,這樣就造成了極大的資源浪費。于是一種對這種方案進行拓展的實時系統――ARTiS系統便應運而生。
1、 ATRiS簡介
ATRiS是一個以多處理器(SMP)架構為基礎,對linux進行實時拓展的系統。它的核心思想是:“將多個處理器進行分類,即分為實時處理器(RT CPU)和非實時處理器(NRT CPU),在實際的運行當中,它將通過自身的遷移機制實現非實時任務在進入不可強占狀態前遷移到非實時處理器,以便實時處理器及時響應實時任務。并通過改進的負載平衡機制使ATRiS系統充分發揮SMP架構的優勢。
1.1 ATRiS任務與處理器的劃分
在ATRiS系統中不僅將處理器分為了實時處理器與非實時處理器,而且將任務也分成了三種類型,分別是RT0任務、RT1+任務以及Linux任務,分別對應于現實中的硬實時任務,軟實時任務和非實時任務。下面給出了處理器與任務之間的關系:
RT0任務:對應于要處理的硬實時任務,具有最高的優先級。并且每一個RT0任務都會與唯一的一個實時處理器綁定,于是RT0任務就只能運行在實時的處理器上。
RT1+任務:對應于要處理的軟實時任務,可以運行在實時處理器,也可以運行在非實時處理器上。但是當它要運行在實時處理器上時,必須是處于可搶占的狀態,否則就要遷移到非實時處理器上。
Linux任務:即非實時的linux任務,與RT1+任務一樣,它也可以運行在實時處理器上,并且當它執行到一段不可搶占的代碼時需要遷移至非實時的處理器。
1.2 遷移機制
ARTiS中遷移機制的目標是:在保證可以實時響應RT0任務的前提下,盡可能多的發揮多處理器的并行特性。為了滿足這一目標,它要求實時處理器上的非RT0任務在進入到不可搶占的代碼段時必須自動遷移到非實時處理器。為了使遷移不受阻礙的發生,ARTiS去掉了處理器之間的共享鎖,取而代之的是一個FIFO隊列,用它來實現非實時處理器與實時處理器之間的交互。也就是說,ARTiS中的處理器將通過這個FIFO隊列來存放或者取出需要遷移的非RT0任務。
1.3 負載平衡機制
通常的負載平衡機制是指:通過在多臺計算機之間合理地分配負載,使各臺計算機的負載基本均衡。但是在ARTiS系統中RT0任務是不可遷移的,而且 linux原有的負載平衡機制只是針對于處理對稱處理器(實時處理器與實時處理器,非實時處理器與非實時處理器)之間的負載平衡,并未設計不對稱處理器之間平衡負載的方法。所以相對的負載平衡機制也更加復雜。
2、ATRiS機制實現
ATRiS系統的實現機制是通過改變內核源碼實現的,由于它所要實現的只是在實時處理器空閑時將非實時任務遷移至實時處理器,而在非實時任務到達不可搶占代碼時遷移出實時處理器,所以它所要執行的主要功能就是:在實時處理器空閑的狀態下,通過自身的負載平衡機制將非實時處理器上的任務遷移至實時處理器。而當非實時任務執行到不可搶占的代碼時,利用自身的遷移機制將非實時任務遷移至非實時處理器。
盡管如此,ARTiS并不是完全另起爐灶,它只是在linux原有的任務遷移和負載平衡機制上添加一些自己的函數,由此來實現自身特有的任務遷移和負載平衡機制。
2.1 任務遷移機制
ATRiS系統的遷移機制的核心就是:當一個非RT0任務將要執行到不可搶占的代碼部分時,將會自動的從實時處理器遷移至非實時處理器。可以將該機制看作兩步:第一步是確定非RT0任務的不可搶占點,即確定遷移的時機;第二步則是要將任務從實時處理器遷移至非實時處理器,即實現遷移。
確定遷移的時機
在ARTiS系統中的任務是通過注冊而產生的(RT0任務就是通過int artis_enter_rt0(pid_t pid, int rt_cpu)函數注冊的,RT1+任務是通int artis_enter_rt1plus(pid_t pid, int policy, int priority)函數注冊),由于RT0任務是不存在被搶占的問題的,所以這里只考慮RT1+問題發生遷移的時機,ARTiS系統認為,如果一個任務執行了系統函數preempt_disable()或local_irp_disable()時,則表明他將要進入不可搶占狀態,即需要進行任務的遷移。 ARTiS系統在上述的兩個函數中添加了函數artis_try_to_migrate(),該函數首先會判斷是否滿足遷移其他條件(例如:判斷當前運行的處理器是否是實時處理器等),然后調用函數artis_request_for_migration()請求遷移。
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)
評論