都江堰作業系統

都江堰作業系統

都江堰作業系統,簡稱djyos,得名於一個偉大的水利工程:都江堰。 與傳統作業系統不同,djyos不是以執行緒而是以事件為調度核心,這種調度算法使程式設計師擺脫模擬計算機執行過程編寫程式的思維方式,而是按人類認知世界的方式編寫應用程式,就如同在嵌入式編程中引入了VC似的。djyos的調度算法使程式設計師可以擺脫執行緒和進程的束縛,djyos沒有有關執行緒的api,一個完全不懂執行緒知識的程式設計師也可以順利地在djyos下編寫應用程式。

基本信息

產品特點

djyos是一個全新的作業系統,它與現有的任何作業系統都沒有親緣關係,在構成作業系統的幾個重要方面:調度器、中斷管理、設備管理、資源管理等方面,都又非常突出的創新,甚至是理論創新。通過這些創新,djyos能為應用程式設計者提供非常突出的特點:

(1)在調度器方面,可以說是徹底革新,它幾乎顛覆了傳統的軟體設計模式。對嵌入式編程來說,幾乎是革命性的進步,它以事件為核心的調度方式,改變了過去作業系統要求程式設計師模擬計算機的思維方式的編程模式,使之可以按人類的思維方式編寫應用程式;它使程式設計師可以擺脫執行緒和進程的束縛,djyos沒有跟執行緒相關的API。特別是在嵌入式領域的程式設計師,有許多是行業背景很深的專家,但往往缺乏計算機作業系統方面的知識,他們在djyos下編程,則可以無需學習晦澀難懂的執行緒知識。

(2)天然匹配多核和分散式計算,djyos的調度算法是以事件為核心的,應用程式只管為事件編制處理程式,而執行緒和CPU核則被當做處理事件必須的資源,由作業系統分配給事件,這種算法天生使多核編程更加簡單,多核利用率更高。眾多周知,目前CPU正往多核化發展,嵌入式CPU甚至DSP也是如此,比如ADI公司的blackfin561就是一顆只有幾十KB記憶體的雙核DSP,djyos有計畫移植到blackfin561上,有望成為第一個在只有幾十KB記憶體的CPU上實現對雙核的完美支持的RTOS。

(3)創新的載入方式和中斷管理模組,可以實現比所有作業系統都快的中斷回響速度,並且在CPU啟動後數十uS以內,應用程式的關鍵部分就可以實現對目標系統的控制,在作業系統載入過程中,就可以回響應用程式的中斷ISR。

(4)實時的記憶體管理,在作業系統組件中,通常認為malloc函式是非實時組件,因為即使有充足的記憶體,malloc函式的執行時間也不可預計,不符合實時系統要求執行時間和結果均可預計的原則。但是djyos的記憶體管理,只要在系統設計時配備充足的記憶體,malloc的執行時間是快速而且可以預計的,而在只運行一個應用程式的實時系統中,記憶體不枯竭是容易做到的。

(5)為項目經理和系統工程師量身定製的系統架構,為工程師量身定製的API設定,特別利於系統工程師劃分項目模組,利於項目經理組建和管理團隊,利於工程師編寫利於維護的代碼。

設計理念

1.九九加一原則與中斷控制器

讓軟體設計中的99%工作更加簡單易行,從而降低應用程式設計的綜合複雜性和難度,對僅有的1%的極端需求更多地考慮可實現性而不是便利性,使應用程式能夠實現這些極端功能,又不為了這極少數工作的方便性而使整個系統過於複雜,這個特點在djyos的中斷管理中體現得淋漓盡致。

普通的作業系統,只是提供了幾個函式,方便程式設計師編寫ISR函式以及開關中斷等。而djyos則不同,它把中斷看做是一種特殊的事件,把它納入事件管理的軌道。實際套用中,既有像鍵盤這樣對實時性沒有要求的中斷,也有對中斷回響延時時間非常苛刻的高速信號。

普通作業系統對這兩種中斷信號不加區分,把所有中斷都看做需要快速回響的信號。它為沒有實時要求的信號提供快速回響,而不能進一步改善高速信號的回響時間。而djyos卻區別對待,它把中斷分為實時中斷和異步信號,任意一個中斷源都可以設定自己屬於實時中斷還是異步信號。只要你把某中斷設為實時中斷,它將獲得比傳統作業系統快得多的回響延時,且在作業系統運行中,永遠不會關閉實時中斷使能,代價是,實時中斷的ISR不能使用所有的作業系統API。而異步信號則回響時間比普通作業系統慢一些,但幾乎所有事件服務可以使用的作業系統服務,它都可以使用,比如異步信號ISR允許使用malloc函式,編程上比普通作業系統ISR方便得多。異步信號的第二種回響方式則完全在事件上下文中,比異步信號ISR回響更加慢,但卻獲得了與主程式相同的作業系統服務。

所以說,在djyos下編程,對於絕大多數實時性要求不是那么高的中斷,提供比傳統作業系統方便得多的編程環境,而對極少數對回響時間非常苛刻的中斷,則提供了比傳統作業系統更高的實現的可能性。

2.事件調度,讓工程師解放思想硬體和作業系統是舞台,程式設計師是演員,而項目經理、系統工程師則是導演、編劇。舞台可能是木板、沙石、水泥建造的,而軟體開發平台則由硬體、作業系統管理下的執行緒等組成,就像演員不需要知道舞台是什麼材料製造的,只需要用心演繹劇本一樣,我們不應該要求程式設計師了解CPU內部運作過程以及執行緒和進程這些晦澀難懂的機制,只需要把軟體功能實現就可以了。

在傳統作業系統中,執行緒的創建、啟動、暫停、停止、刪除等無一不是由程式設計師自己控制的,在桌面系統(包括嵌入式的Windows CE)上,有Visual C++等工具替你包裝,簡化了多執行緒編程,在嵌入式環境中,程式設計師需要熟悉執行緒的一切。更重要的是,由多執行緒實現應用程式,是CPU執行過程決定的,要求程式設計師熟練操作執行緒,實際上就是要求程式設計師按照CPU執行過程思考問題。

djyos是按事件調度的,它使程式設計師可以按照人類認知事物的方式編寫程式,沒有任何跟執行緒相關的API函式,程式設計師只需要做以下兩件事

(1)登記事件類型把需要計算機做的事情告訴告訴作業系統。

(2)2、編寫事件處理函式。

我們知道,軟體是用於解決實際問題的,這些問題可能需要很深的行業背景,比如化工、生物科學等,程式設計師則很可能是這些行業的專家,這些專家對計算機有可能一知半解,在嵌入式領域尤甚。要他們理解並熟練套用執行緒知識,需要花費很大的代價,以及很多的培訓經費,而djyos下編程,他們就可以擺脫這些束縛,可以盡情地發揮自己的專業知識。

3.小goto與大GOTO寫過C代碼的都知道,goto是很受忌諱的語句,甚至有人根本不用。我們對函式內的goto耿耿於懷的同時,卻無視長期存在的、組件之間、執行緒之間的大GOTO,甚至有些作業系統還為提供了豐富的大GOTO為賣點,說什麼為應用程式提供豐富的服務。

什麼是大GOTO呢?我們看看喚醒休眠中的執行緒函式的執行結果,假設這個函式的函式名是task_resume,並且假設該該作業系統是按優先權調度的。執行緒A調用task_resume(taskB_id)後,如果執行緒B的優先權高於A,則立即切換到B的上下文繼續執行。所以,對執行緒A來說,相當於執行了一個跨組件的GOTO,對於執行緒B來說,它睡得好好的,卻被人無緣無故地叫醒。對項目經理來說,即團隊A與團隊B之間存在直接的交叉控制,或稱交叉跳轉。

djyos不提供任何類似的操作,所有事件都是自己控制自己的行為,沒有任何事件處理函式間交叉控制的可能,djyos認為,事件處理過程中,不會無緣無故地停止,也不會無緣無故地繼續,djyos提供各種服務,讓應用程式自己控制自己的行為。程式停下來,必定有其理由,要么是要等待一定的時間,djyos提供鬧鐘同步功能;要么是等待某個鎖可用,djyos提供鎖同步功能;要么是等待某事件結束,djyos提供事件同步功能……,總之,這些同步功能的支持下,應用程式每個事件都達到自己控制自己行為的目標,而徹底摒棄了應用程式模組之間的交叉控制。也就是說,djyos中不存在跨事件(對應其他作業系統的執行緒)的大GOTO。

4.友好組劃分,幫助項目經理組建和管理團隊一個大中型項目,需要劃分為多個團隊共同開發,項目經理夢寐以求的是,各個團隊之間減少扯皮;項目進入聯調階段後,項目經理夢寐以求的是,各組件獨立調通後就能協同運行,減少聯調扯皮時間。即使一個人的項目,也會劃分為多個組件,上述問題同樣存在,而且,項目完成後,進入維護期後,組件獨立性強的能大大降低維護工作量。

在由多個子團隊協同開發的項目中,項目經理以及系統工程師必須考慮的問題是,哪些模組放在一起編譯,哪些模組共享命名空間,如果在支持多進程的環境下開發,則還要考慮哪些模組在相同的地址空間運行。這些問題集中到一起,就是如何劃分“軟體友好組”的問題。在《都江堰作業系統與嵌入式系統設計》一書的第3章,用了相當長的篇幅用於講述友好組。

友好組的定義很簡單,就是可信賴的程式組成一個友好組,什麼是可信賴的程式?同一個團隊開發的程式是可信賴的。“友好”有兩層意思,一是這些代碼是為一個共同的目標,密切協作地完成任務;二是這些代碼不會主動地、惡意地互相干擾和破壞,也不會故意執行非法操作。有兩個特例是,如果同一個團隊開發的兩個模組將來可能會分成兩個團隊開發,應該將他們分成兩個友好組;第二個特例是,兩個模組的可靠性等級相差比較大,也應該分屬兩個友好組,這樣,兩個模組就可以使用不同強度的測試手段。

以設計軟體的人為核心,是都江堰作業系統的核心思想之一。現代軟體開發中,非常強調工程化開發的思想,在工程化開發中,任何軟體策略都不能不考慮人的因素。劃分友好程式和可疑程式是 djyos 作業系統設計中的一個根本性的策略,劃分的依據是開發團隊,而不是以技術特徵,是都江堰作業系統當然的選擇。把協同工作的團隊開發的所有代碼稱作友好程式,劃入一個友好組,而把所有不協同工作的團隊以及個人開發的程式當成可疑程式,主要考慮的是人的因素。根據這個原則,作業系統自身的所有代碼是由一個核心團隊開發的,當然地成為一個友好代碼組,作業系統開發團隊無需與開發應用程式的團隊和個人協作,它把所有應用程式都當作可疑程式;同樣,一個應用程式是由一個人或者一個密切協作的團隊開發的,該程式的所有代碼形成一個友好組,而把所有其他應用程式以及作業系統都視為可疑程式。這與傳統的觀念不同,傳統的觀念認為,作業系統是可信程式,而用戶程式是非可信程式。

djyos建立籬笆牆隔離友好組,使之不能互相影響和互相破壞,以及提供不同友好組之內完整的命名空間。根據硬體支持情況,友好組之間的保護分為兩個級別。

(1)如果硬體支持,不同友好組擁有獨立的定址空間,他們之間的代碼、數據在物理上互不可見,也就無法互相破壞。

(2)如果硬體不支持,在平板記憶體模式下實現邏輯隔離,在編寫軟體時,同一個友好組的代碼獨立編譯,擁有獨立的命名空間,友好組之間的函式、變數互不可見,使其不能顯式地互相破壞。

5.輕耦合,實現組建獨立開發和調試一個系統的各個模組,將不可避免地發生相互聯繫和相互影響,我們稱之為模組間耦合。耦合分為良性耦合和惡性耦合,比如模組間互相傳遞必要的數據就是良性耦合,而模組間互相使用對方的數據,或者要求對方必須如何如何做,從而使模組間互相依賴,這種耦合叫做惡性耦合,下文中說到的耦合如不說明均指惡性耦合。系統模組級設計的目的就是使各模組間儘可能地互相獨立,儘量減少彼此之間的耦合,即使不可避免耦合,也要仔細設計模組間的接口,使之成為良性耦合。這樣,各模組就能夠獨立開發、獨立維護、獨立生存,能夠通過動態裁剪來適應新的需求,使企業能夠制定靈活的產品戰略,當經營環境發生變化時,能夠降低轉型的成本。我們知道,耦合是造成團隊間不能獨立開發、項目開發中互相扯皮的罪魁禍首,且在聯調時,模組間耦合越緊密,聯調的工作量就越大。djyos致力於從技術的角度,幫助程式設計者降低甚至消除模組間的耦合,為此,djyos做了許多工作,這裡略舉一例。

我們知道,在作業系統支持下編程,執行緒執行過程中調用系統服務函式是最常見不過的動作了。這裡隱藏著一個問題,系統服務函式會使用當前執行緒的棧,如果你沒有為這些調用準備足夠的棧空間,就可能因此造成棧溢出,產生不可預知的故障,這就是作業系統團隊編寫的代碼與應用程式團隊編寫的執行緒代碼發生了惡性耦合。每個執行緒在創建時,都會給它指定一個合適大小的棧,在台式機中,一般會在M級以上,這種耦合一般不會出問題,而在嵌入式系統中,由於記憶體稀缺,棧可能只有幾十k。棧尺寸既要能滿足執行緒需求,又不能占用太多的記憶體,這就要求能夠準確估計執行緒所需的棧尺寸。然而,程式設計師只能準確估計自己寫的代碼所需要的棧尺寸,調用系統服務時,系統服務函式需要多少棧呢?應用程式的程式設計師是很難估算出來的。djyos對這種情況做了處理,他明確告訴程式設計師,你只需要估計自己寫的代碼需要的棧,並且詳細說明了如何估計棧需求,系統在創建執行緒時,會自動加上系統服務所需要的棧,這樣就避免了系統服務使用執行緒棧帶來的問題。

6.天生匹配多核系統傳統的作業系統,執行緒是調度的目標,而事件是作為被執行緒處理的數據(資源)而存在的,djyos以事件為調度目標,而把CPU以及執行緒當資源,這種倒過來的配置方法,天生就更加適合多核,我們有望在只有幾十K大小的作業系統上,實現對稱多核CPU的完美支持。以後的嵌入式晶片也會往多核方向發展,比如現在ADI公司的blackfin就有對稱雙核型號,而且blackfin是沒有mmu的、典型的嵌入式CPU,其直接競爭對手——Ti也有類似的雙核產品。

傳統的作業系統下,由應用程式建立執行緒或進程,並為執行緒和進程編寫代碼,執行緒一般被綁定在某一個核心上,綁定方法有兩種,一是由作業系統調配,另一種是由程式設計師指定,比如ADI的VDK作業系統,就是在編譯階段由程式設計師指定的。執行緒與CPU核的綁定,實際上就是應用程式代碼與CPU核綁定。一個執行緒處理相應的計算任務,在傳統模式下,即使某執行緒的計算任務頻繁發生,也只能由該執行緒所在的CPU核上一一處理,你可以做一個實驗,在雙核機上,用Word把一個大型檔案轉換成PDF,在轉換過程中,如果你沒有運行其他程式,CPU占有率會一直在51%左右,就是說,一個CPU核一直忙,另一個則一直閒著。

djyos的事件調度,應用程式只管為事件編制處理程式,而執行緒是由作業系統分配的,執行緒綁定在哪個CPU核上,也是由作業系統決定的,這樣就解除了應用程式代碼與CPU核的綁定。如果某一類事件頻繁發生,作業系統將會給它分配多個執行緒,這些執行緒將根據各CPU核的繁忙程度,分配到不同的CPU上。

7.拿來拿去主義計算機技術發展到現在,已經有很多技術積累,開發一個複雜的嵌入式產品,要懂得“拿來主義”,不要完全從0開發全部軟體和硬體。但是,怎樣拿來呢?開發高可靠的產品,對使用外來代碼會非常謹慎,甚至只使用有商業支持的外來代碼。任何外來代碼,都要經過通讀、仔細分析,完全測試過以後才允許使用,有商業支持的代碼,供應商會提供支持,這個過程進行得就快些;而沒有商業支持的所謂開原始碼,這些代碼甚至沒有完整的注釋,讀懂這樣的代碼,所花費的時間甚至不會比自己開發少多少。所以,高可靠產品的“拿來主義”,主要靠繼承企業自身積累的軟體模組,來降低開發工作量。要使新產品開發時有東西可以拿來用,企業產品開發過程只就要非常注重“可拿去性”,一句話,不拿去,何以拿來,而可拿去性,實質上就是可移植性!djyos系統支持下,在系統設計時強調“可拿來性”,即系統融合現成的軟體模組的能力;在模組設計方面,強調“可拿去性”,即模組應該能適應不同的運行環境。djyos系統融合現成模組的能力,除了與傳統作業系統一樣提供並發運行能力外,等多地考慮支持程式設計者組合現有模組成為一個新產品,以及設計可組合模組的能力。djyos有許多特性支持拿來拿去主義,泛設備管理器就是一個典型的、支持拿來主義的模組之一。

按djyos的視點,每一個應用程式模組面對的運行環境,不僅僅包括硬體和作業系統,還包括其他軟體模組。即使硬體和作業系統沒有任何變化,如果產品中其他模組發生了變化,也看做是運行環境發生了變化,djyos強調要軟體模組適應這種變化。一個企業,往往有幾十幾百種系列化的產品型號,這些型號可能建立在相同的硬體和作業系統平台上的,僅僅是應用程式模組的組合和配置不一樣。對這樣的企業來說,軟體模組的靈活組合能力非常重要。傳統作業系統的driver架構,是設計來讓應用程式以標準的方式訪問硬體,禁止硬體平台的差異性,driver的使用者和被驅動者有明顯的層次關係。而djyos把應用程式的其他模組也看做環境,driver是用於禁止整個環境差異的。djyos從軟硬體聯合設計的角度出發,軟體模組、硬體模組、軟硬體相結合的模組之間沒有層次關係,而統一稱之為系統功能模組。因此driver架構也不分層次,driver的使用者和被操作者是平等的關係,一個應用程式模組通過driver提供標準的與其他模組互相訪問的接口,只要企業內所有模組都遵循這個接口,那么這個企業內的所有軟體模組都可以靈活組合。

8.實時的malloc函式在RTOS中,通常認為malloc函式是非實時組件,因為即使有充足的記憶體,malloc函式的執行時間也不可預計,不符合實時系統要求執行時間和結果均可預計的原則。但是djyos的記憶體管理,在一定條件下是實時的,只要在系統設計時,配備充足的記憶體,malloc的執行時間是快速而且可以預計的,而在只運行一個應用程式的實時系統中,記憶體不枯竭是容易做到的。djyos的記憶體分配使用雙金字塔的檢索結構,以頁為單位,在4G定址空間,頁尺寸為1K,CPU字長是32的系統中,只需要經過5次搜尋(共5次比較、5次乘法和5次加法)就可以定位一個空閒頁,速度是相當快的。

除實時特性外,djyos的記憶體管理還能在一定程度上防止記憶體泄漏,而且malloc函式允許在中斷ISR中調用。

相關詞條

相關搜尋

熱門詞條

聯絡我們