SylixOS 經得起檢驗的國產作業系統 (四)
核心服務
SylixOS核心小巧,它提供的作業系統最基礎的服務,這些服務包括:
1. 執行緒管理
2. 協程管理
3. 事件標誌組管理
4. 中斷管理
5. 排程器
6. 記憶體管理
7. 訊息佇列
8. 計數、互斥、二值訊號量
9. 定時器管理
10. 資源回收器
這些最基礎的功能構成了SylixOS
SylixOS排程器支援緊耦合同構多處理(SMP)並且排程器排程時間複雜度為O(1),換句話說,排程器每次排程消耗的時間與需要排程的執行緒總數量沒有關係,即排程時間確定,這種系統適合於對時間有嚴格要求的工業與軍事系統。此排程器同樣支援同優先順序執行緒,這些執行緒可按先進先出或者時間片輪轉排程演算法。
SylixOS執行緒(thread)有以下六種狀態:
1.
2. 就緒
3. 執行
4. 阻塞
5. 僵死
6. 停止
執行緒各狀態遷移順序由下圖所示:
【初始化】狀態表示一個執行緒剛剛建立,作業系統為它分配了執行所必須的資源但是沒有將它送入排程器。此時使用者可以獲取執行緒控制代碼,選擇合適的時間啟動執行緒。很多作業系統的執行緒沒有這種狀態。SylixOS加入這種狀態主要是為了適應“靜態系統”的要求,所謂靜態系統就是執行執行緒確定,所需資源確定,行為確定的系統,例如汽車電子控制單元(
【就緒】狀態表示一個執行緒可以被執行,即執行緒得到了除CPU以外執行所需要的所有資源,例如執行緒等待的訊號量已經有效,這時執行緒請求排程器排程,至於排程器合適將CPU資源提供個這個執行緒以使其執行,則依賴於上面所說的排程器演算法。
【執行】狀態表示一個執行緒正在執行,即就緒後,系統排程器為這個執行緒分配了CPU資源使其得以執行。
【阻塞】狀態表示執行緒現在不能繼續執行,必須需要等待指定的事件發生,例如執行緒正在等待訊號量有效,或者訊息佇列中的資訊,或者一個訊號,一個同步I/O請求等等。這個狀態下執行緒得不到執行,除非等待的事件到達或者設定的超時時間到達,如果這兩種情況發生,則執行緒進入就緒佇列。等待排程器再次執行,同時將等待的結果告知使用者程式碼。
【僵死】執行緒結束時需要回收作業系統在建立它時分配的資源,有些資源是它自身執行時無法回收的,例如核心物件,堆疊等,這時執行緒通知作業系統相關的回收器,並把自己設定為僵死狀態等待回收器徹底銷燬自己。
【停止】狀態表示執行緒被其他執行緒或者系統強行暫停執行,此狀態只有SMP系統會出現,當一個核正在執行的執行緒(或程序)向另一個核上的執行緒傳送訊號時,這時傳送訊號的目標執行緒正在另一個核上執行,則核心會自動將目標設定為停止狀態,然後等訊號傳送完畢後再將這個任務恢復執行。
SylixOS系統上執行緒實體的狀態永遠是以上六種狀態之一。
協程(coroutine),又稱作協同程式是比執行緒還小的可執行程式碼序,在windows作業系統上稱為纖程。一個執行緒內可以擁有多個協程,這些協程共享執行緒除了棧之外的所有資源,例如優先順序,核心物件等等。由於執行緒內的所有協程共享執行緒本身的核心物件,所以排程器本身並不知道協程的存在,協程的執行是靠所屬執行緒被排程時被執行的。一個執行緒內的協程共享所屬執行緒的優先順序,一個執行緒內部的協程不可被強佔。只能輪轉執行。而且當前正在執行協程必須主動放棄CPU另同線程內的另一個協程才能得以執行,當執行緒被刪除時,執行緒內的所有協程也同時被全部刪除。
SylixOS在核心中引入協程概念,而不是使用庫模擬出的協程,這樣SylixOS內部的協程管理更加便捷高效。
事件標誌組(eventset)是SylixOS提供的一個執行緒同步通訊機制。每一個事件標誌組包含有32位事件標誌,在應用中每一位可以代表一個事件,執行緒可以等待事件標誌組中的一個事件或者同時等待多個事件。執行緒等待多個事件時既可以等待多個事件同時發生,也可以等待多個事件中任何一個事件的發生。指定的事件發生後,等待相應事件的執行緒將會從阻塞狀態被轉換成就緒狀態。這時只要排程器排程該執行緒,它就可以執行。
SylixOS中斷系統結構如下圖所示,它本身可以支援無限數量的中斷(interrupt)源,具體的中斷向量表(interrupt vector)大小由編譯時的配置決定。
SylixOS和大多數作業系統一樣使用平板中斷向量表,如果系統硬體中存在有主從級聯中斷,則需要在板級支援包(BSP)中進行相關的抽象。當系統發生中斷時,BSP程式碼按作業系統要求處理好相關中斷上下文(context)後,呼叫作業系統統一的中斷入口API。作業系統根據中斷向量號來決定執行哪些之前已經註冊的中斷服務。驅動程式不需要操作中斷的具體行為,只需要註冊相關的中斷向量即可。
SylixOS同時支援單向量多中斷服務函式表,所以像PCI匯流排這樣的多級中斷系統,使用此類中斷向量管理,使用者驅動程式將變的非常簡單。
SylixOS排程器只管理一種資源:CPU。排程器決定當前時刻將CPU分配給哪個執行緒,即執行哪個執行緒。每一個CPU核心只能同時執行一個執行緒,如果沒有任何就緒的使用者執行緒,則排程器讓CPU執行永遠就緒的空閒(idle)執行緒。
如上所述,對於單核CPU系統,一般的多工作業系統在巨集觀上是多工並行處理,但在微觀上,同時只有一個執行緒執行。排程器根據排程演算法和當前就緒執行緒的相關引數來判斷誰將執行。對於緊耦合多CPU系統(SMP,例如酷睿,龍芯多核),他們可以同時執行與核心數量相當的執行緒,例如雙核處理器可以同時執行兩個執行緒,如果這兩個執行緒沒有資源衝突,則理論執行速度將達到單核兩倍(真正的並行處理系統),但是沒有資源衝突的執行緒是理想狀態,所以真實執行的N核系統是不可能達到單核系統N倍的效率。對於多核系統,SylixOS排程器將決定這些核同時執行哪些執行緒。對於硬實時的SylixOS來說,排程器將CPU分配給就緒執行緒中優先順序最高的幾個執行緒,這個排程演算法時間複雜度也為O(1)。
SylixOS提供三種形式的記憶體管理:堆記憶體管理(heap),定長分割槽記憶體管理(pool),虛擬記憶體管理(vmm)。這三種記憶體管理有著不同的用途。
堆記憶體管理類似於我們常用的malloc、free操作,作業系統有兩個非常關鍵的記憶體堆:“核心記憶體堆”和“系統記憶體堆”。核心堆負責系統核心物件的緩衝。系統堆負責核心基礎緩衝區,驅動程式緩衝區等。
虛擬記憶體管理只用於有硬體記憶體管理單元(MMU)的處理器。它管理了整個虛擬記憶體空間和物理頁面的分配,回收,對映,許可權。是作業系統記憶體管理的核心。例如後面將要提到的程序,檔案對映,缺頁中斷系統等等,都需要虛擬記憶體管理的支援。同時它也接管了所有記憶體的異常訪問處理(對映錯誤或者許可權錯誤)。
SylixOS實體記憶體採用頁式記憶體管理演算法。物理頁面使用夥伴演算法,虛擬空間採用雜湊紅黑二叉樹保證分配與回收的速度。
訊息佇列是SylixOS提供的多工同步通訊方式之一,它將一個訊息從一個任務傳遞到另一個任務,這樣一個執行緒可以將產生的資料或者事件傳送出去,由指定的任務繼續處理。這也是作業系統多工最常用的同步通訊方式。
訊號量也是SylixOS提供的多工同步通訊方式之一,SylixOS的訊號量分為三種:計數訊號量、二值訊號量、互斥訊號量。訊號量既可以用作任務間的通訊,也可以用於中斷與任務的通訊。SylixOS有關訊號量對執行緒狀態的影響如下圖所示。
計數訊號量內部是一個32/64位計數器,當計數值為0時等待的執行緒將被阻塞,如果不為0則計數器減一執行緒繼續執行。傳送訊號量時,如果此時有執行緒阻塞在對應的訊號量上,則阻塞的任務將被啟用,如果沒有則計數器加一。
二值訊號量顧名思義,它只有兩種狀態:有效和無效。執行緒等待此訊號量時如果訊號量有效,則訊號量立即變為無效狀態,同時當前執行緒不阻塞並繼續執行。如果訊號量是無效狀態,則執行緒被阻塞。傳送訊號量時,如果此時有執行緒阻塞在對應的訊號量上,則阻塞的執行緒將被啟用,如果沒有等待此訊號量的執行緒,則將訊號量置為有效狀態。
互斥訊號量(簡稱互斥量)是SylixOS為保護共享資源設計的一種鎖機制(大多數作業系統擁有此功能),互斥訊號量的基本行為類似於二值訊號量,但是功能更加強大。但它並不能取代二值訊號量,因為釋放互斥訊號量的執行緒必須是之前獲取該訊號量的執行緒,所以互斥量不能被用作執行緒同步通訊。SylixOS的互斥量提供兩種方法避免優先順序倒置(又名優先順序反轉),一種是優先順序繼承演算法,一種是優先順序天花板演算法,建立互斥量時通過選項來選擇需要使用的演算法。同時互斥量支援資源死鎖檢測,死鎖可重入功能,同樣也是根據建立選項確定。
SylixOS提供兩種型別的定時器:高速核心定時器,任務級定時器。高速核心定時器顧名思義,它的定時週期可以非常短,頻率可以高過作業系統的時鐘。但需要注意的是,高速定時器的使用者回撥函式可能執行在中斷上下文中(由BSP程式碼決定),所以只能進行簡單的操作,一般用於傳送訊號量啟用等待執行緒,或者通知什麼事情發生。
任務級定時器速度較慢,他提供普通精度的定時要求。定時器服務函式執行在作業系統t_timer核心執行緒中。
需要注意的是:SylixOS核心提供的定時器只用於核心模組或者核心應用,程序需要使用與訊號系統相關的posix定時器。
SylixOS的回收器主要是記錄一個程序的資源使用情況,在程序退出時將釋放程序的所有資源,它們包括核心物件,檔案描述符,程序空間,依賴的動態連結庫等等。程序相關的內容將在下面程序一節詳細講解。
(本篇結束)