SylixOS 经得起检验的国产操作系统 (四)
內(nèi)核服務(wù)
?????? SylixOS內(nèi)核小巧,它提供的操作系統(tǒng)最基礎(chǔ)的服務(wù),這些服務(wù)包括:
?????? 1.????????線程管理
?????? 2.????????協(xié)程管理
?????? 3.????????事件標(biāo)志組管理
???????4.????????中斷管理
???????5.????????調(diào)度器
???????6.????????內(nèi)存管理
???????7.????????消息隊列
???????8.????????計數(shù)、互斥、二值信號量
???????9.????????定時器管理
???????10.????資源回收器
???????這些最基礎(chǔ)的功能構(gòu)成了SylixOS所有功能與服務(wù)的核心。SylixOS本身是一個實時操作系統(tǒng),所以內(nèi)核調(diào)度器(scheduler)使用基于優(yōu)先級的搶占式調(diào)度算法,調(diào)度器調(diào)度的基本單元為線程。SylixOS永遠運行優(yōu)先級最高的線程。
??????? SylixOS調(diào)度器支持緊耦合同構(gòu)多處理(SMP)并且調(diào)度器調(diào)度時間復(fù)雜度為O(1),換句話說,調(diào)度器每次調(diào)度消耗的時間與需要調(diào)度的線程總數(shù)量沒有關(guān)系,即調(diào)度時間確定,這種系統(tǒng)適合于對時間有嚴格要求的工業(yè)與軍事系統(tǒng)。此調(diào)度器同樣支持同優(yōu)先級線程,這些線程可按先進先出或者時間片輪轉(zhuǎn)調(diào)度算法。
??????? SylixOS線程(thread)有以下六種狀態(tài):
??????? 1.????????初始化
??????? 2.????????就緒
??????? 3.????????運行
??????? 4.????????阻塞
??????? 5.????????僵死
??????? 6.????????停止
?????? 線程各狀態(tài)遷移順序由下圖所示:
????? 【初始化】狀態(tài)表示一個線程剛剛創(chuàng)建,操作系統(tǒng)為它分配了運行所必須的資源但是沒有將它送入調(diào)度器。此時用戶可以獲取線程句柄,選擇合適的時間啟動線程。很多操作系統(tǒng)的線程沒有這種狀態(tài)。SylixOS加入這種狀態(tài)主要是為了適應(yīng)“靜態(tài)系統(tǒng)”的要求,所謂靜態(tài)系統(tǒng)就是運行線程確定,所需資源確定,行為確定的系統(tǒng),例如汽車電子控制單元(ECU)系統(tǒng)。這類系統(tǒng)對響應(yīng)和可靠性要求非常高,所以SylixOS可以提前分配好線程所有需要的資源,為它的運行做好一切準備,這樣就不會因為資源短缺造成嚴重后果。
????? 【就緒】狀態(tài)表示一個線程可以被執(zhí)行,即線程得到了除CPU以外運行所需要的所有資源,例如線程等待的信號量已經(jīng)有效,這時線程請求調(diào)度器調(diào)度,至于調(diào)度器合適將CPU資源提供個這個線程以使其運行,則依賴于上面所說的調(diào)度器算法。
????? 【運行】狀態(tài)表示一個線程正在執(zhí)行,即就緒后,系統(tǒng)調(diào)度器為這個線程分配了CPU資源使其得以運行。
????? 【阻塞】狀態(tài)表示線程現(xiàn)在不能繼續(xù)執(zhí)行,必須需要等待指定的事件發(fā)生,例如線程正在等待信號量有效,或者消息隊列中的信息,或者一個信號,一個同步I/O請求等等。這個狀態(tài)下線程得不到執(zhí)行,除非等待的事件到達或者設(shè)置的超時時間到達,如果這兩種情況發(fā)生,則線程進入就緒隊列。等待調(diào)度器再次執(zhí)行,同時將等待的結(jié)果告知用戶代碼。
????? 【僵死】線程結(jié)束時需要回收操作系統(tǒng)在創(chuàng)建它時分配的資源,有些資源是它自身運行時無法回收的,例如內(nèi)核對象,堆棧等,這時線程通知操作系統(tǒng)相關(guān)的回收器,并把自己設(shè)置為僵死狀態(tài)等待回收器徹底銷毀自己。
????? 【停止】狀態(tài)表示線程被其他線程或者系統(tǒng)強行暫停執(zhí)行,此狀態(tài)只有SMP系統(tǒng)會出現(xiàn),當(dāng)一個核正在運行的線程(或進程)向另一個核上的線程發(fā)送信號時,這時發(fā)送信號的目標(biāo)線程正在另一個核上運行,則內(nèi)核會自動將目標(biāo)設(shè)置為停止?fàn)顟B(tài),然后等信號發(fā)送完畢后再將這個任務(wù)恢復(fù)執(zhí)行。
?????? SylixOS系統(tǒng)上線程實體的狀態(tài)永遠是以上六種狀態(tài)之一。
?
??????協(xié)程(coroutine),又稱作協(xié)同程序是比線程還小的可執(zhí)行代碼序,在windows操作系統(tǒng)上稱為纖程。一個線程內(nèi)可以擁有多個協(xié)程,這些協(xié)程共享線程除了棧之外的所有資源,例如優(yōu)先級,內(nèi)核對象等等。由于線程內(nèi)的所有協(xié)程共享線程本身的內(nèi)核對象,所以調(diào)度器本身并不知道協(xié)程的存在,協(xié)程的運行是靠所屬線程被調(diào)度時被執(zhí)行的。一個線程內(nèi)的協(xié)程共享所屬線程的優(yōu)先級,一個線程內(nèi)部的協(xié)程不可被強占。只能輪轉(zhuǎn)運行。而且當(dāng)前正在運行協(xié)程必須主動放棄CPU另同線程內(nèi)的另一個協(xié)程才能得以運行,當(dāng)線程被刪除時,線程內(nèi)的所有協(xié)程也同時被全部刪除。
?????? SylixOS在內(nèi)核中引入?yún)f(xié)程概念,而不是使用庫模擬出的協(xié)程,這樣SylixOS內(nèi)部的協(xié)程管理更加便捷高效。
??????事件標(biāo)志組(eventset)是SylixOS提供的一個線程同步通信機制。每一個事件標(biāo)志組包含有32位事件標(biāo)志,在應(yīng)用中每一位可以代表一個事件,線程可以等待事件標(biāo)志組中的一個事件或者同時等待多個事件。線程等待多個事件時既可以等待多個事件同時發(fā)生,也可以等待多個事件中任何一個事件的發(fā)生。指定的事件發(fā)生后,等待相應(yīng)事件的線程將會從阻塞狀態(tài)被轉(zhuǎn)換成就緒狀態(tài)。這時只要調(diào)度器調(diào)度該線程,它就可以執(zhí)行。
??????
?????? SylixOS中斷系統(tǒng)結(jié)構(gòu)如下圖所示,它本身可以支持無限數(shù)量的中斷(interrupt)源,具體的中斷向量表(interrupt vector)大小由編譯時的配置決定。
?????? SylixOS和大多數(shù)操作系統(tǒng)一樣使用平板中斷向量表,如果系統(tǒng)硬件中存在有主從級聯(lián)中斷,則需要在板級支持包(BSP)中進行相關(guān)的抽象。當(dāng)系統(tǒng)發(fā)生中斷時,BSP代碼按操作系統(tǒng)要求處理好相關(guān)中斷上下文(context)后,調(diào)用操作系統(tǒng)統(tǒng)一的中斷入口API。操作系統(tǒng)根據(jù)中斷向量號來決定運行哪些之前已經(jīng)注冊的中斷服務(wù)。驅(qū)動程序不需要操作中斷的具體行為,只需要注冊相關(guān)的中斷向量即可。
?????? SylixOS同時支持單向量多中斷服務(wù)函數(shù)表,所以像PCI總線這樣的多級中斷系統(tǒng),使用此類中斷向量管理,用戶驅(qū)動程序?qū)⒆兊姆浅:唵巍?/span>
?
?????? SylixOS調(diào)度器只管理一種資源:CPU。調(diào)度器決定當(dāng)前時刻將CPU分配給哪個線程,即運行哪個線程。每一個CPU核心只能同時運行一個線程,如果沒有任何就緒的用戶線程,則調(diào)度器讓CPU運行永遠就緒的空閑(idle)線程。
??????如上所述,對于單核CPU系統(tǒng),一般的多任務(wù)操作系統(tǒng)在宏觀上是多任務(wù)并行處理,但在微觀上,同時只有一個線程運行。調(diào)度器根據(jù)調(diào)度算法和當(dāng)前就緒線程的相關(guān)參數(shù)來判斷誰將運行。對于緊耦合多CPU系統(tǒng)(SMP,例如酷睿,龍芯多核),他們可以同時運行與內(nèi)核數(shù)量相當(dāng)?shù)木€程,例如雙核處理器可以同時運行兩個線程,如果這兩個線程沒有資源沖突,則理論運行速度將達到單核兩倍(真正的并行處理系統(tǒng)),但是沒有資源沖突的線程是理想狀態(tài),所以真實運行的N核系統(tǒng)是不可能達到單核系統(tǒng)N倍的效率。對于多核系統(tǒng),SylixOS調(diào)度器將決定這些核同時運行哪些線程。對于硬實時的SylixOS來說,調(diào)度器將CPU分配給就緒線程中優(yōu)先級最高的幾個線程,這個調(diào)度算法時間復(fù)雜度也為O(1)。
??????? SylixOS提供三種形式的內(nèi)存管理:堆內(nèi)存管理(heap),定長分區(qū)內(nèi)存管理(pool),虛擬內(nèi)存管理(vmm)。這三種內(nèi)存管理有著不同的用途。
?????? 堆內(nèi)存管理類似于我們常用的malloc、free操作,操作系統(tǒng)有兩個非常關(guān)鍵的內(nèi)存堆:“內(nèi)核內(nèi)存堆”和“系統(tǒng)內(nèi)存堆”。內(nèi)核堆負責(zé)系統(tǒng)內(nèi)核對象的緩沖。系統(tǒng)堆負責(zé)內(nèi)核基礎(chǔ)緩沖區(qū),驅(qū)動程序緩沖區(qū)等。
?????? 虛擬內(nèi)存管理只用于有硬件內(nèi)存管理單元(MMU)的處理器。它管理了整個虛擬內(nèi)存空間和物理頁面的分配,回收,映射,權(quán)限。是操作系統(tǒng)內(nèi)存管理的核心。例如后面將要提到的進程,文件映射,缺頁中斷系統(tǒng)等等,都需要虛擬內(nèi)存管理的支持。同時它也接管了所有內(nèi)存的異常訪問處理(映射錯誤或者權(quán)限錯誤)。
??????? SylixOS物理內(nèi)存采用頁式內(nèi)存管理算法。物理頁面使用伙伴算法,虛擬空間采用哈希紅黑二叉樹保證分配與回收的速度。
?????? 消息隊列是SylixOS提供的多任務(wù)同步通信方式之一,它將一個消息從一個任務(wù)傳遞到另一個任務(wù),這樣一個線程可以將產(chǎn)生的數(shù)據(jù)或者事件發(fā)送出去,由指定的任務(wù)繼續(xù)處理。這也是操作系統(tǒng)多任務(wù)最常用的同步通信方式。
?????? 信號量也是SylixOS提供的多任務(wù)同步通信方式之一,SylixOS的信號量分為三種:計數(shù)信號量、二值信號量、互斥信號量。信號量既可以用作任務(wù)間的通信,也可以用于中斷與任務(wù)的通信。SylixOS有關(guān)信號量對線程狀態(tài)的影響如下圖所示。
?????? 計數(shù)信號量內(nèi)部是一個32/64位計數(shù)器,當(dāng)計數(shù)值為0時等待的線程將被阻塞,如果不為0則計數(shù)器減一線程繼續(xù)運行。發(fā)送信號量時,如果此時有線程阻塞在對應(yīng)的信號量上,則阻塞的任務(wù)將被激活,如果沒有則計數(shù)器加一。
?????? 二值信號量顧名思義,它只有兩種狀態(tài):有效和無效。線程等待此信號量時如果信號量有效,則信號量立即變?yōu)闊o效狀態(tài),同時當(dāng)前線程不阻塞并繼續(xù)執(zhí)行。如果信號量是無效狀態(tài),則線程被阻塞。發(fā)送信號量時,如果此時有線程阻塞在對應(yīng)的信號量上,則阻塞的線程將被激活,如果沒有等待此信號量的線程,則將信號量置為有效狀態(tài)。
???????互斥信號量(簡稱互斥量)是SylixOS為保護共享資源設(shè)計的一種鎖機制(大多數(shù)操作系統(tǒng)擁有此功能),互斥信號量的基本行為類似于二值信號量,但是功能更加強大。但它并不能取代二值信號量,因為釋放互斥信號量的線程必須是之前獲取該信號量的線程,所以互斥量不能被用作線程同步通信。SylixOS的互斥量提供兩種方法避免優(yōu)先級倒置(又名優(yōu)先級反轉(zhuǎn)),一種是優(yōu)先級繼承算法,一種是優(yōu)先級天花板算法,創(chuàng)建互斥量時通過選項來選擇需要使用的算法。同時互斥量支持資源死鎖檢測,死鎖可重入功能,同樣也是根據(jù)創(chuàng)建選項確定。
??????? SylixOS提供兩種類型的定時器:高速內(nèi)核定時器,任務(wù)級定時器。高速內(nèi)核定時器顧名思義,它的定時周期可以非常短,頻率可以高過操作系統(tǒng)的時鐘。但需要注意的是,高速定時器的用戶回調(diào)函數(shù)可能運行在中斷上下文中(由BSP代碼決定),所以只能進行簡單的操作,一般用于發(fā)送信號量激活等待線程,或者通知什么事情發(fā)生。
?????? 任務(wù)級定時器速度較慢,他提供普通精度的定時要求。定時器服務(wù)函數(shù)運行在操作系統(tǒng)t_timer內(nèi)核線程中。
?????? 需要注意的是:SylixOS內(nèi)核提供的定時器只用于內(nèi)核模塊或者內(nèi)核應(yīng)用,進程需要使用與信號系統(tǒng)相關(guān)的posix定時器。
????????SylixOS的回收器主要是記錄一個進程的資源使用情況,在進程退出時將釋放進程的所有資源,它們包括內(nèi)核對象,文件描述符,進程空間,依賴的動態(tài)鏈接庫等等。進程相關(guān)的內(nèi)容將在下面進程一節(jié)詳細講解。
?
(本篇結(jié)束)
總結(jié)
以上是生活随笔為你收集整理的SylixOS 经得起检验的国产操作系统 (四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【前端开发基础】CSS基础知识以及CSS
- 下一篇: 23种设计模式——JDK动态代理(AOP