作業系統核心之辯

pythontab發表於2013-05-23

1 說明

Tanenbaum-Torvalds Debate這個是N年前就已經聞名於世了,這個Part2貌似是Andrew S. Tanenbaum時隔多年又來一發的結果,當然,肯定不是他想來一發的。 原文地址:http://www.cs.vu.nl/~ast/reliable-os/ 以下就是正文了。

2 前言

貌似這次又要來一發微核心之爭 了。不過在上技術流前,我還是有幾句話要說的。好多人都說或者是暗示我和Linus是仇人見面分外眼紅。其實沒這回事。我之間見過他一次。他還是一個很不錯的人,而且非常聰明。雖說我們在一些技術問題上有點小分歧吧,但是也不至於變成仇人。所以麼,觀點上的不同不代表我們個人關係不和。所以我沒什麼針對Linus個人的,也很尊重他所取得的成就。

為防萬一有誰不知道這件事情,我先說一下,幾年前,微軟僱了個叫Ken Brown槍手,寫書說Linus的Linux是從我的MINIX 1系統上剽竊的。我可是跳出來說了 ,這純屬汙衊,要為Linus正名。雖說我不怎麼感冒Linux的設計理念吧,不過Linux確實是他寫的,和我沒關係。至於我聽到Brown瞎扯說Linus從我這裡剽竊東西,我瞬間就怒了。

開始前,容我再再說一句:從本質上來講我興趣不在微不微核心上。我其實是想弄個很穩定可靠又安全的作業系統,然後呢,微核心正好躺槍,我覺得實現這個目標得靠它才可以。下面再細說。

3 嘴仗

聽說在Colorado的Air Force Academy有這麼個標語:

腦袋清楚的時候再說話。1

不知道是不是真有這句話,不過我還是很同意這個觀點的。

這麼多年了,各種論壇(比如Slashdot)都一直有帖子沒完沒了的吐槽微核心有多慢,微核心有多難寫程式,微核心都沒什麼商用的,當然還有其他戰鬥力為渣的廢話。其實吧,這些帖子都是那些不知微核心為何物或者是不知微核心為何的人發的。我覺得吧,發這些帖子的人起碼也應該先試試看微核心作業系統後,然後再發個帖子,開頭帶上這句,“我已經試過微核心作業系統了,然後我自己發現了X,Y,Z現象”。這樣的吐槽才有戰鬥力麼。

要想體驗,最簡單的當然是去下載安裝MINIX 3啦。免費又開源(而且是BSD的授權協議哦),下了映象後就可以刻在CD上,然後啟動,然後登陸。不過你要是想幹點實在的,還是需要給磁碟分個區的(1G就夠),然後把系統裝上。請千萬記得先把安裝手冊 列印出來讀一讀。安裝差不多要十分鐘的樣子。然後就按照手冊上說的把CD上的軟體包都裝上。等你安完了進入X系統就能實實在在體驗下了。你也可以試著照手冊上的方法重新構建整個系統。核心加上使用者態的驅動還有所有的使用者態的服務(總共125個)需要5-10秒。

請千萬記得,如今的MINIX 3可不再是你爺爺當年用的MINIX了。MINIX 1不過是教學用途,到現在還在很多大學裡用著。Al Woodhull和我還專門為它寫了本書 。MINIX 3可不止於此,目標就是為了建一個超可靠的、能夠自愈、而且不會越來越來臃腫 的作業系統,而且可能在100刀筆記本專案 上能用上,造福第三世界的孩子們,還有嵌入式系統。MINIX 1和MINIX 3的關係就像Windows 3.1和Windows XP的關係:同名不同姓的熊孩子。所以,你要是大學時用過MINIX 1,試試3吧,包你滿意。它完全是小而精的UNIX系統,包括了X、bash、pdksh、zsh、cc、gcc、perl、python、awk、emacs、vi、pine、ssh、ftp、GNU工具鏈還有其他400多別的程式。全靠那個小小的微核心,現在馬上立刻你就可以擁有!

所以,親們,請不要再一遍遍的這樣吐槽了:“如果Tanenbaum認為微核心NB,幹嘛不自己動手寫一個?” 爺爺我真的已經寫了。做人要低調,其實是我和我的學生、程式設計師一起寫的。雖說它還沒有Linux或者BSD這麼完整和成熟吧,不過,這就是明證啊,誰說的不能在一個小而易懂的微核心上實現一個在使用者態中執行的可靠的、自愈、多服務的UNIX克隆?當然,別把我說的不成熟(我們就3個人,花了一年多一點的時間)和那些與微核心相關的問題混淆了。我們會增加更多的功能,移植更多的軟體(我們也歡迎你的加入)。從05年十月起到現在MINI3的網站已經有40多萬 訪問量了。誰用誰知道。

4 論文

不久前,我帶的PhD Jorrit Herder,我同事Herbert Bos,還有我寫了篇叫做《我們能否構建可靠而安全的作業系統?》 的文章,然後投了IEEE的《Computer Magazine》,這個可是IEEE計算機學會的旗艦刊物哦。已經透過了,發表在2006五月刊上。這篇文章裡面我們說明了,其實對大部分計算機使用者來說,可靠性要比效能更重要,而且討論了4個目前正在進行中的研究專案,都是致力於改善作業系統的可靠性。其中3個用的都是微核心。IEEE把這篇文章放在他們的網站上,然後就有人把連結 給發上Slashdot了,重燃微核心與單核心這一古老紛爭的戰火。雖說我是這篇文章的共同作者吧,不過我發誓我絕對不是想要重啟“Linux已經過時了”這種爭論。

Linus回應 了,所以可能又要來一個小小的爭論了。沒問題,不過各位親,請千萬記得多關注下技術話題。

5 Linus的論點

Linus的基本觀點是微核心需要分散式演算法,但是目前分散式演算法都很屎。儘管我和Maarten van Steen一起寫了一本書 專門解決分散式演算法慘不忍睹的問題,我還是得承認分散式演算法確實是個大坑。過去十年我也設計、編寫和公佈了兩個分散式系統,Amoeba (LAN環境)和Globe (WAN環境)。分散式演算法的主要問題是由於可能會中途丟失訊息還有其他一些不確定的事情,比如遠端程式死掉了或者僅僅是執行緩慢,造成缺少一個共同的時間基準。但是呢,這些問題對於一個單機上執行的微核心系統環境都不存在。所以,我同意Linus說的分散式演算法難度比較大,但是這個和我們討論的問題沒什麼關係。

另外,大部分使用者空間的組成都是驅動,他們和服務的互動都是很簡單直接的。所有的字元裝置都遵循一樣的協議(讀寫位元組流),所有的塊裝置也一樣(讀寫塊)。使用者空間的服務元件都不大:檔案服務、程式服務、網路服務、輪迴服務,還有資料儲存和其他不多的服務。每個的任務都很明確,和系統其他部分的互動也都很明確。比如說資料儲存,提供了一個釋出/訂閱的服務,保證了其他組建之間的松耦合,這可是很有用的。服務元件的數量未來也不會有大量的增加。所以複雜性也是在可控範圍內的。我說的這些都不是推測,畢竟我們都已經實現了這樣的系統。不信你就自己裝MINX 3看程式碼去。

Linus也說共享資料結構是個好主意,這個我不敢苟同。如果你上過作業系統的課程就肯定記得課程上大把大把的時間還有課本上大把大把的空間都是拿來討論協作程式間同步和互斥的。只要兩個以上的程式可以訪問相同的資料結構,你就要非常非常小心否則就等著不得好死吧。哪怕帶上訊號量、管程、互斥鎖還有其他的好方法,想要把問題弄對也難如登天。

我的觀點就是你應該拼著命的避免共享資料。系統就應該由多個對外完全隱藏了自己內部資料的小模組組成。這些模組允許外部呼叫的藉口都應該是良好定義的可以滿足工作需求的“瘦”介面。這其實也是物件導向程式設計在乾的事情,隱藏資訊而不是共享。我認為隱藏資訊(如Dave Parnas所言)是個好注意。這樣你就可以隨意改變資料結構、演算法、模組設計,只要你保證藉口不變就不會影響系統的正確性。軟體工程課上都會教授這點。而Linus說過去20年的物件導向程式設計都是誤導,這點我可不同意。

一旦你想保護一個模組的純潔資料不被別的模組的髒手玷汙,那麼第一步很顯然就是把模組們放在不同的地址空間,然後透過MMU的硬體來保證。應用在在作業系統上,就是微核心加上一堆透過訊息和良好定義的介面和協議通訊的使用者態的程式。這種設計就更加乾淨易維護。Linus由於自己大量的單核心的經驗而沒怎麼接觸過微核心和分散式系統,所以得出了他的結論。我的經驗則來自於自己設計、實現和釋出過這樣作業系統。由於經歷不同,所以我們對於什麼簡單和什麼容易有不同的觀點。

對於可靠作業系統的的論述也可以參看Jonathon Shapiro的短文《揭露Linus最近的言論》。

6 微核心實際應用了麼?

簡單回答下:當然。週一(五月八日),Slashdot上又是一票類似的無休止的評論:“要是微核心真那麼NB,怎麼我從沒見過?”其實吧,呵呵,有的。除了MINIX 3,還有:

QNX

Integrity

PikeOS

Symbian

L4Linux

Singularity

K42

Mac OS X

HURD

Coyotos

QNX在商業系統中廣泛應用。比如,思科最NB的路由器 就是用的他們,另外我打包票,思科是很很關心效能問題的。

在軍事和航空領域的佼佼者就是Green Hills的Integrity,這兩個領域可靠性要求都是很高的。

PikeOS 也是另外的一個微核心的實時作業系統,廣泛應用於國防、航空還有工業的應用。

Symbian也是另外一個流行的微核心系統,主要應用在手機上。不過不是純的微核心,算是混合核心吧,因為驅動都是在核心裡,不過檔案系統、網路還有電話服務都是在使用者空間。

我可以三天三夜講不停,不過很顯然在對可靠性和安全性要求較高的應用上,設計者基本都是選擇微核心的作業系統。Linus個人可能不太關注嵌入式實時系統領域(這一領域十分看重效能、可靠性和安全性),這些領域的市場都是很大的,很多相關的公司都認為微核心是實現這些目標的途徑。

回到下PC領域吧,還有個L4Linux,由Technical University of Dresden(TUD)的Hermann Härtig的團隊開發。可以將整個Linux執行在L4微核心上的使用者空間裡,而效能只低了幾個百分比。使用微核心可以允許TUD的師生們在L4基礎上構建新的系統,比如:DROPS (重實時性)和NIZZA (重安全性),這些系統都可以完全訪問Linux而不用修改程式碼來增加新特性。這樣,他們可以實現在新的裝置上執行舊程式。也有其他團隊使用L4來進行作業系統研究的,比如Wombat ,半虛擬化的Linux用於支援在嵌入式系統執行遺留的舊程式。還有TUD-OS 以及更多更多。

微軟也對微核心感興趣。它可是比任何人都明白維護一個單核心都多讓人想死。Windows NT 3.1就是個三心二意的微核心嘗試,不過搞砸了,效能在90年代初期的硬體上不足,所以就放棄這一嘗試了,當然,暫時的。目前,它正在目前的硬體上再次嘗試,結果就是Singularity。我知道很多人都說要是微軟真要這麼幹下去,那就蠢死了。不過推動這個專案的人,Galen Hunt和Jim Larus都不笨,人家知道Windows一團糟,要找個新路線。哪怕是負責Vista的都知道有問題,把驅動往使用者空間裡移,這可是我一直提倡的。

大約十年前,IBM開始從頭開發一個新的高效能的作業系統用來服務它的超級大客戶。一個明確的目標就是把系統功能從核心內轉換成服務元件和應用程式的組合,這很類似微核心。這個系統,K42,已經部署在能源部和其他地方了。

Mac OS X也是類似微核心的。在內部,就是由Mach的微核心和之上的Berkeley UNIX組成的。因為所有東西都執行在核心態(就為了那麼點可憐的效能),所以不是一個真正的微核心,不過Carnegie Mellon University很多年前就已經把 Berkeley UNIX的放Mach的使用者空間裡執行了。所以再來一次又不是不可能,也就想L4Linux一樣損失一點效能。把蘋果的BSD的程式碼(Darwin)往L4上移植變成真的微核心系統也已經有人正在做 了。

雖說一直都是展望的巨人,行動的矮子,GNU HURD也是微核心的。兩個都是,前一個版本基於Mach,後一個L4。第三個版本或許基於另一個微核心,Coyotos。HURD是Richard Stallman的設計作品,他也是emacs、gcc,還有其他廣泛使用的軟體,以及GPL的作者以及著名的麥克阿瑟天才獎 得主。

另一個開發中的微核心系統是Coyotos,EROS的後繼。相對可靠性更加集中於安全性,不過麼,放不斷膨脹的核心裡面,這兩個相關的問題都會越來越明顯。

我就不說虛擬化的東西了,比如Xen 和Trango ,和微核心有不少區別,但是也都秉承核心態程式碼越少越好的特點。這一特點一直是我強調的構建可靠和安全系統的關鍵。

看看 MINIX 3, QNX, Integrity, PikeOS, Symbian, L4Linux, Singularity, K42, HURD, Coyotos還有那一坨坨其他的一個理念的系統,顯然不止我一個覺得微核心有特點。你要是好奇怎麼微核心不流行,我只能說,很多系統都是有慣性的。為什麼Linux和Mac OS X不能取代Windows?一樣的,一堆慣性放那的。巴西的汽車都可以用家裡種的乙醇,所以巴西相對就比較少依賴汽油 。怎麼美國就不這麼做這樣就可以不用依賴朝三暮四的中東?嗯,慣性。讓人們改變,即使讓他們換成更優秀的方式也都難如登天。

7 我正在說明什麼?

其實麼,MINIX 3 還有我的研究不是有關微核心的,是有關構建高可靠、可自愈的作業系統。我希望等我的工作完成了,電腦就用不上重啟鍵了。電視機沒有重啟鍵,音響也是,汽車也是。他們也都由軟體實現功能,但是卻用不上重啟鍵。計算機之所以需要就是因為計算機軟體老愛崩潰。我知道計算機軟體和汽車軟體有區別,不過使用者就希望他們都能工作,不希望被人告知為什麼汽車就可以正常工作而計算機就不可考。我就是想構建一個平均當機一次的時間比一般計算機的壽命還要長的作業系統。這樣一般使用者就不會有機器當機的體驗了。MINIX 3有很多特別的可靠性的特性 。雖說我們還沒有完全完成吧(比如,虛擬記憶體計劃在今年晚期完成),我想提高可靠性是目前作業系統設計者所面臨的最大挑戰。一般使用者是不會關心什麼新特性的或者是榨取硬體最後一絲的效能的,但是卻會關心計算機可以100%的完美工作從不當機。不信就問你奶奶去。

那麼微核心和這個理想有個什麼關係呢?只不過微核心可以實現自愈的系統。這就是我所關心的和我的研究的內容。把作業系統中的一大部分改造成為使用者程式,每個驅動一個程式外加各種服務元件,這種凡是其實並不能減少程式碼中的bug數量,但是卻可以顯著的減少每個bug可能帶來的嚴重破壞的能力,同時也減少了可信計算基的大小。在我們的設計中,如果大部分驅動失效了,再生服務都可以重新開始一個新的複製,然後儲存下已死的驅動的記憶體映象方便除錯,並且記錄下時間,傳送郵件給管理員或者開發者等等額外的工作。系統則可以繼續執行,最不濟也可以優雅的關閉系統而不損失任何工作結果和資料。其他的一些部分,比如重生服務本身、檔案服務還有程式服務是很重要的,因為一旦他們不能正常工作就會導致系統崩潰,但是顯然是不可能允許出錯的影片驅動、印表機或者掃描器驅動來損壞系統的。這些程式應該都可以重新啟動然後繼續正常工作。我們的目標就是系統可以檢測和修復自己本身的錯誤。這在微核心的系統上很容易實現。而在單核心上就相對有難度,不過華盛頓大學的研究人員已經利用Nooks 做了很多工作,Karlsruhe大學的團隊也利用虛擬機器技術 完成了很多有意思的工作。

8 Linus論Linux

最近更新,Linus似乎也明白了Linux正在越來越膨脹。


相關文章