1. 程式人生 > >[王垠系列]一種新的作業系統設計

[王垠系列]一種新的作業系統設計

一種新的作業系統設計

我一直在試圖利用程式語言的設計原理,設計一種超越“Unix 哲學”的作業系統。這裡是我的設想:

  • 這種系統裡面的程式間通訊不使用無結構的字串,而是使用帶有型別和結構的資料。在這樣的系統裡面,Unix 和其它類似作業系統(比如 Windows)裡的所謂“應用程式”的概念基本上完全消失。系統由一個個很小的“函式”組成,每個函式都可以呼叫另外一個函式,通過引數傳遞資料。每個函式都可以手動或者自動併發執行。用現在的系統術語打個比方,這就像是所有程式碼都是“庫”程式碼,而不存在獨立的“可執行檔案”。

  • 由於引數是資料結構而不是字串,這避免了程式間通訊繁瑣的編碼和解碼過程。使得“程序間通訊”變得輕而易舉。任何函式都可以呼叫另一個函式來處理特定型別的資料,這使得像 “OLE 嵌入”這樣的機制變得極其簡單。

  • 所有函式由同一種先進的高階程式語言寫成,所以函式間的呼叫完全不需要“翻譯”。不存在 SQL injection 之類由於把程式當成字串而產生的錯誤。

  • 由於這種語言不允許應用程式使用“指標運算”,應用程式不可能產生 segfault 一類的錯誤。為了防止不良使用者手動在機器碼裡面加入指標運算,系統的執行的程式碼不是完全的機器程式碼,而必須通過進一步的驗證和轉換之後才會被硬體執行。這有點像 JVM,但它直接執行在硬體之上,所以必須有一些 JVM 沒有的功能,比如把記憶體裡的資料結構自動換出到硬碟上,需要的時候再換進記憶體。

  • 由於沒有指標運算,系統可以直接使用“實地址”模式進行記憶體管理,從而不再需要現代處理器提供的記憶體對映機制以及 TLB。記憶體的管理粒度是資料結構,而不是頁面。這使得記憶體訪問和管理效率大幅提高,而且簡化了處理器的設計。據 Kent Dybvig 的經驗,這樣的系統的記憶體使用效率要比 Unix 類的系統高一個數量級。

  • 系統使用與應用程式相同的高階語言寫成,至於“系統呼叫”,不過是呼叫另外一個函式。由於只有這些“系統驅動函式”才有對裝置的“引用”,又因為系統沒有指標運算,所以使用者函式不可能繞過系統函式而非法訪問硬體。

  • 系統沒有 Unix 式的“命令列”,它的“shell”其實就是這種高階語言的 REPL。使用者可以在終端用視覺化的結構編輯方式輸入各種函式呼叫,從而啟動程序的執行。所以你不需要像 Unix 一樣另外設計一種毛病語言來“粘接”應用程式。

  • 所有的資料都作為“結構”,儲存在一個分散式的資料共享空間。同樣的那個系統語言可以被輕鬆地傳送到遠端機器,呼叫遠端機器上的庫程式碼,執行任意複雜的查詢索引等動作,取回結果。這種方式可以高效的完成資料庫的功能,然而卻比資料庫簡單很多。所謂的“查詢語言”(比如 SQL,Datalog,Gremlin,Cypher)其實是多此一舉,它們遠遠不如普通的程式語言強大。說是可以讓使用者“不需要程式設計,只提出問題”,然而它們所謂的“優化”是非常侷限甚至不可能實現的,帶來的麻煩遠比直接程式設計還要多。邏輯式程式語言(比如 Prolog)其實跟 SQL 是一樣的問題,一旦遇到複雜點的查詢就效率低下。所以系統不使用關係式資料庫,不需要 SQL,不需要 NoSQL,不需要 Datalog。

  • 由於資料全都是結構化的,所以沒有普通作業系統的無結構“檔案系統”。資料結構可能通過路徑來訪問,然而路徑不是一個字串或者字串模式。系統不使用正則表示式,而是一種類似 NFA 的資料結構,對它們的拆分和組合操作不會出現像字串那樣的問題,比如把 /a/b/ 和 /c/d 串接在一起就變成錯誤的 /a/b//c/d。

  • 所有的資料在合適的時候被自動同步到磁碟,並且進行容錯處理,所以即使在機器掉電的情況,絕大部分的資料和程序能夠在電源恢復後繼續執行。

  • 程式設計師和使用者幾乎完全不需要知道“資料庫”或者“檔案系統”的存在。程式假設自己擁有無窮大的空間,可以任意的構造資料。根據硬體的能力,一些手動的存檔操作也可能是有必要的。

  • 為了減少資料的移動,系統或者使用者可以根據資料的位置,選擇: 1)遷移資料,或者 2)遷移處理資料的“程序”。程式設計師不需要使用 MapReduce,Hadoop 等就能進行大規模平行計算,然而表達能力卻比它們強大很多,因為它們全都使用同一種程式語言寫成。

我曾經以為我是第一個想到這個做法的人。可是調查之後發現,很多人早就已經做出了類似的系統。Lisp Machine 似乎是其中最接近的一個。Oberon 是另外一個。IBM System/38 是類似系統裡面最老的一個。最近一些年出現的還有微軟的Singularity,另外還有人試圖把 JVM 和 Erlang VM 直接放到硬體上執行。

所以這篇文章的標題其實是錯的,這不是一種“新的作業系統設計”。它看起來是新的,只不過因為我們現在用的作業系統忘記了它們本該是什麼樣子。我也不該說它“超越了 Unix 哲學”,而應該說,所謂的 Unix 哲學其實是歷史的倒退。