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