這樣的例子在歷史中屢見不鮮。Jobs 和 Apple 分手后開創(chuàng)的 NeXT 公司的操作系統(tǒng)和硬件設(shè)備,創(chuàng)新點(diǎn)很多,市場反響卻不大。而 NeXT 系統(tǒng)在軟件和硬件設(shè)計上的創(chuàng)新,以及工業(yè)設(shè)計的思想,最終成為了現(xiàn)在 iOS 系統(tǒng)、Mac 系統(tǒng)軟硬件設(shè)計的基石。同樣是 Apple, 當(dāng)年出品的 Hypercard 軟件,首創(chuàng)了超文本格式和交互式頁面。雖然 HyperCard 的這些創(chuàng)新在當(dāng)時并不顯得太出眾,最終被蘋果終止開發(fā)。但到了 Internet 出現(xiàn)之后,Tim Berners-Lee 受到這種“超文本 (hypertext)”格式的啟發(fā),將這些思想平移到聯(lián)網(wǎng)的計算機(jī)上,由此出現(xiàn)了萬維網(wǎng)。Ward Cunningham 更是受這一張一張的“數(shù)字卡片”受到,發(fā)展出了世界上第一個 wiki 系統(tǒng) WikiWikiWeb。所有的這些例子,都說明了一項(xiàng)當(dāng)時未必得到大多數(shù)人認(rèn)可的創(chuàng)新可能會在意想不到的地方鳳凰重生。 本節(jié)我們介紹的 Plan 9 操作系統(tǒng),也是這樣的一個例子。
大部分讀者應(yīng)該都用過 FTP 在兩臺機(jī)器之間傳送文件。FTP 是一種簡單成熟的傳輸協(xié)議。試想現(xiàn)在我們需要修改一個 FTP 服務(wù)器上的文件,我們無法直接用本機(jī)上的編輯器打開這個遠(yuǎn)程的文件編輯,而需要先下載這個文件,修改后再上傳。這種編輯遠(yuǎn)程文件的方法顯然比編輯本機(jī)的文件麻煩多了。 我們退后一步仔細(xì)想一下這個不方便,會發(fā)現(xiàn),文件是同樣的一個文件,只是因?yàn)槲募辉诒镜兀覀冃枰柚?FTP 協(xié)議訪問,所以我們就不能直接編輯它了(事實(shí)上有些功能強(qiáng)大的編輯器如 VIM 仍然可以編輯,但普通的編輯器則不能)。在一切都是文件的假設(shè)下,我們可以不加區(qū)別的訪問軟盤,硬盤和閃存盤上的文件,但這里,因?yàn)橹虚g多了一個網(wǎng)絡(luò)協(xié)議,這種“一切都是文件”的方便特性就消失了。 因?yàn)檫@個需求很常見,很多 FTP 客戶端,如 Windows 下的 LeapFTP, Mac 下的 Cyberduck,都做了一個貼心的功能,在你想要編輯遠(yuǎn)程文件的時候,自動將其下載成一個臨時文件,等你修改結(jié)束后又自動上傳。但是這依賴于 FTP 客戶端,并不是每個客戶端都提供了這類支持。
FTPFS 就是針對上面提出的這種不方便而出現(xiàn)的一種技術(shù)。通過利用一個叫做 FUSE (Filesystem in Userspace) 的技術(shù),F(xiàn)TPFS 允許用戶將遠(yuǎn)程的 FTP 文件系統(tǒng)掛載到本地的文件系統(tǒng)上,使得用戶可以像操作本地文件一樣操作遠(yuǎn)程文件1,包括查看,編輯,刪除和重命名等等。而實(shí)際網(wǎng)絡(luò)傳輸協(xié)議的細(xì)節(jié),則對用戶隱藏了。實(shí)際上,F(xiàn)USE 技術(shù)可以用來實(shí)現(xiàn)很多“虛擬”的文件系統(tǒng),而不僅限于將 FTP 文件系統(tǒng)掛載到本地文件系統(tǒng)上這一種。比如,使用 HTTP 協(xié)議的文件系統(tǒng),SSH 服務(wù)器上的文件,F(xiàn)licker 上的圖片,維基百科上的文章,都可以通過 FUSE,抽象成一種虛擬的掛載在本地文件系統(tǒng)上的文件系統(tǒng)。這些虛擬的文件系統(tǒng),隱藏了協(xié)議的細(xì)節(jié),將各種不同類型的協(xié)議支持下的資源抽象成一個文件系統(tǒng),也可以掛載到本地的文件系統(tǒng)上。
虛擬文件系統(tǒng)能把資源無差別的抽象成文件系統(tǒng)。這種做法消除了網(wǎng)絡(luò)協(xié)議的不同造成的訪問障礙,方便了用戶對各種不同資源的訪問。這種 “消除協(xié)議差異,一切資源都是文件”的思想,實(shí)際上來源于 Plan 9。毫不令人驚訝的是,在 Plan 9 中,干脆就沒有 FTP 這個命令,所有對 FTP 的操作都是采用掛載 ftpfs 掛載文件系統(tǒng)的方式實(shí)現(xiàn)的。
一切都是文件(這次是真的)
上面我們提到了虛擬文件系統(tǒng)可以把資源無差別地抽象成一個文件系統(tǒng),而這個思想是來源于 Plan 9 操作系統(tǒng)的。且慢,早在 UNIX Programming Environment 中, Brian W. Kernighan 就提出了 “UNIX 中,一切都是文件” 的設(shè)計哲學(xué)。事實(shí)上,UNIX 中的確很多對象是文件:進(jìn)程是文件,設(shè)備是文件,命名管道也是文件。但是,也有很多不是文件,尤其是由其他非 Bell 實(shí)驗(yàn)室加入 UNIX 的組件。舉例來說,計算機(jī)網(wǎng)絡(luò)設(shè)備和服務(wù)不是文件(UNIX 的網(wǎng)絡(luò)支持部分最先由 UC Berkerly 開發(fā)),圖形界面中的對象也不是文件(UNIX 的圖形界面支持最初由 MIT 的 X 工作組開發(fā))。“一切都是文件” 這個口號因?yàn)?UNIX 的發(fā)展和新模塊的加入而不再貼切。
UNIX 出現(xiàn)的時候,支持的設(shè)備都很簡單,都可以抽象成文件交由內(nèi)核統(tǒng)一管理,由內(nèi)核提供 read/write 等系統(tǒng)調(diào)用訪問設(shè)備。隨著硬件的發(fā)展,一些新的硬件需要有超越系統(tǒng)調(diào)用范圍的控制方式(例如我們可以控制光盤驅(qū)動器彈出托盤,而這個操作在傳統(tǒng)磁盤驅(qū)動器上是不存在,也不能簡單的抽象為 read/write 甚至 unmount 操作),或者為效率著想,需要用戶空間程序直接和設(shè)備通信(如網(wǎng)卡,高速硬盤)。因?yàn)檫@些需求,和為未來擴(kuò)展性考慮,Bell 實(shí)驗(yàn)室在 UNIX 第七版中,也不得不引入 ioctl 等具有無窮擴(kuò)展性的系統(tǒng)調(diào)用機(jī)制,配合設(shè)備驅(qū)動程序,支持對設(shè)備的控制。這些做法,繞開了原先統(tǒng)一的 read/write 設(shè)備訪問方式。也就是說,設(shè)備再也不能簡單地抽象為文件了。
隨著 UNIX 發(fā)展而失卻的“一切都是文件”的純粹哲學(xué),正是 Plan 9 想要恢復(fù)的。在 Plan 9 中,通過實(shí)現(xiàn)一個叫做 9P 的文件協(xié)議,用戶可以自由的把任何資源或服務(wù)抽象成本地的一個“虛擬的”文件或者目錄,而對這些文件的操作,會通過 9P 協(xié)議,自動映射到對原來資源或者服務(wù)的操作。 這樣,訪問資源的各種細(xì)節(jié)就被隱藏了。在對付那些需要 ioctl 或者其他控制機(jī)制的設(shè)備或者應(yīng)用程序時,Plan 9 提倡將程序的控制部分抽象成一個支持 read/write 的 ctl 文件,而非使用專門的 ioctl 系統(tǒng)調(diào)用。這樣,其他程序就可以通過讀寫 ctl 文件與被控制的程序通信。從對資源和對控制的抽象不難看出來,Plan 9 把 UNIX 中“一切都是文件”的思想做了進(jìn)一步的升華。在 Plan 9 里面,真的是一切都是文件了──設(shè)備是文件,窗口管理器是文件,Email 程序是文件(實(shí)際上所有程序都是文件),網(wǎng)絡(luò)是文件(實(shí)際上所有服務(wù)包括 DNS 都是文件),等等。
要說 Plan 9 的特性,就不能不先介紹一下它的幾個創(chuàng)造者。和 UNIX 一樣, Plan 9也是從 Bell 實(shí)驗(yàn)室計算機(jī)科學(xué)研究中心開發(fā)的。其項(xiàng)目主要負(fù)責(zé)人是 Rob Pike (現(xiàn)在在 Google 工作,負(fù)責(zé) Go 編程語言),當(dāng)時在 Bell 實(shí)驗(yàn)室的很多人,包括 UNIX 的兩位創(chuàng)始人,Ken Thompson 和 Dennis Ritchie ,以及 Brain Kernighan、Doug Mcllroy (UNIX 管道的提出者)都參與了這個項(xiàng)目的開發(fā)。從某種意義上來說,Plan 9 有點(diǎn)充當(dāng) UNIX 繼承人的味道。事實(shí)上 Rob Pike 最初,也的確是想構(gòu)建一個更加“現(xiàn)代的 UNIX”。除了堅持 UNIX 中已經(jīng)成功了的“一切都是文件”,“KISS”等原則外,Plan 9 在原有 UNIX 的設(shè)計理念上做了新突破,其中最值得一提的,就是“分布式操作系統(tǒng)” 的理念。
Plan 9 這個分布式操作系統(tǒng)的出現(xiàn)和當(dāng)時計算機(jī)發(fā)展的趨勢是密不可分的。我們都知道, UNIX 是一種分時操作系統(tǒng),用戶分享機(jī)器資源。UNIX 操作系統(tǒng)則負(fù)責(zé)在各任務(wù)(或者說進(jìn)程)之間調(diào)度。因此,UNIX 是一個中心化的操作系統(tǒng)。CPU、內(nèi)存、IO 以及所有的任務(wù)的調(diào)度都是集中被 UNIX 管理的。上世紀(jì) 80 年代中期,更加便宜的微型計算機(jī)開始普及。這些微型計算機(jī)各自有著磁盤、CPU、內(nèi)存和 IO 設(shè)備。Plan 9 的指導(dǎo)思想,就是把微機(jī)組織起來,方便的實(shí)現(xiàn)資源共享。
Plan 9 里,能共享的資源包括文件系統(tǒng)、圖形界面、IO 設(shè)備、以及 CPU 和內(nèi)存等計算資源。這些資源之間千差萬別,我們固然可以針對每種資源設(shè)計一個協(xié)議,如文件分享用 NFS,圖形界面用 X 協(xié)議,打印機(jī)用 CUPS 協(xié)議等等,不過這種做法在 Plan 9 的設(shè)計者看來是不夠優(yōu)雅的。他們采用的,是在上文我們已經(jīng)提到過的“一切都是文件”的方法[cite:Plan 9, a distributed system]。我們可以用兩個很有啟發(fā)性的例子來說明。
例一、替換 CPU
假想一下我們有一臺日常使用但性能不佳的筆記本,和一臺不在本地但性能強(qiáng)勁的服務(wù)器。 我們當(dāng)然能夠使用遠(yuǎn)程計算機(jī)的強(qiáng)勁的 CPU 運(yùn)行一些計算量特大的程序。這不是什么難事,因?yàn)閹缀跛胁僮飨到y(tǒng)都支持登陸到遠(yuǎn)程的機(jī)器。然而,麻煩的是,如果在遠(yuǎn)程運(yùn)行程序需要讀寫本地的文件,或者訪問掛載在本地筆記本上的打印機(jī),揚(yáng)聲器麥克風(fēng)之類設(shè)備,我們除了在本地和遠(yuǎn)程之間把文件傳來傳去之外,并沒有什么好方法。特別的,如果我們想借用另一臺計算機(jī)上強(qiáng)勁的 CPU 做音頻和視頻解碼,來播放一個放在本機(jī)光盤驅(qū)動器里的電影文件的話,我們是不可能指望遠(yuǎn)程計算機(jī)既能讀本地的光驅(qū),又能把音頻投遞到本機(jī)的揚(yáng)聲器上的。
Plan 9 中,有一個簡單的 cpu 命令,能夠讓用戶自然地使用一個其他機(jī)器上的 CPU 運(yùn)行程序,且仍然能夠訪問本地的所有文件和設(shè)備。也就是說,我們可以用遠(yuǎn)程計算機(jī)上強(qiáng)勁的 CPU 做圖像處理,媒體解碼等任務(wù),并且可以直接把聲音播放到本地的揚(yáng)聲器。cpu 命令給人的感覺,是除了給機(jī)器換個了 cpu 外,其他一切都和原來一樣。這個看似 “神奇” 的功能,其實(shí)在 Plan 9 里實(shí)現(xiàn)起來一點(diǎn)都不復(fù)雜: cpu 指令首先連接服務(wù)器上,然后將本地的所有資源和文件系統(tǒng),包括窗口管理器,光盤驅(qū)動器,揚(yáng)聲器等設(shè)備(別忘了他們都是文件),一股腦兒掛載到服務(wù)器上,成為服務(wù)器上的資源。這樣,在服務(wù)器上運(yùn)行的程序,就可以“自然地”使用本地的鍵盤鼠標(biāo)和顯示器完成交互,還可以訪問你本地的顯示器揚(yáng)聲器等設(shè)備。
cpu 命令真的就是名副其實(shí)的換掉了本地計算機(jī)的 cpu (其實(shí)還有內(nèi)存)而保留其他一切設(shè)備。Plan 9 的這個 cpu 命令,帶有強(qiáng)烈的分布式操作系統(tǒng)的特征,而我們平時接觸的操作系統(tǒng)都不是分布式操作系統(tǒng),因此 cpu 這個命令至今在現(xiàn)代主流操作系統(tǒng)上沒有完全等價物。
例二、進(jìn)程間控制和通信
進(jìn)程間通信可以提高使用計算機(jī)的效率(詳細(xì)請參見 Page XX:開發(fā)人員為何應(yīng)該使用 Mac OS X)。UNIX 下的管道就是一個經(jīng)典的進(jìn)程間通信的例子。在圖形界面程序和集成化的程序出現(xiàn)后, 應(yīng)用程序不斷的把多種功能集成到一起,進(jìn)程間通信反而變得相對困難了。比如說,即使有個給漢字加拼音的程序,除了來回復(fù)制粘貼,我們還是不能方便地從文字編輯程序中選取一段自動加上拼音。而 UNIX 下的編輯器可以借助管道很簡單完成這樣的操作。這個問題的本質(zhì)困難,用操作系統(tǒng)的眼光來看,在于進(jìn)程這個對象,沒有在運(yùn)行時暴露出應(yīng)有的通信和控制接口。
Plan 9 的一切都是文件的思想從一個新的角度,解決了程序間的數(shù)據(jù)共享問題。Plan 9 倡導(dǎo)應(yīng)用程序在運(yùn)行時都把自己的內(nèi)部狀態(tài)抽象成一個文件系統(tǒng)。舉例來說,一個郵件客戶端程序不光支持圖形界面下查看郵件,用戶還能夠直接通過
cat /mail/fs/inbox/1/subject
cat /mail/fs/inbox/1/body
來查看收件箱(inbox)中第一封郵件的主題和內(nèi)容。這種設(shè)計,使得應(yīng)用程序不再成為進(jìn)程間通信的障礙,從而拷貝粘貼也變得沒有必要。比如說,我們可以直接把草稿箱里郵件的內(nèi)容通過管道送給其他拼寫檢查器。郵件客戶端提供的拼寫檢查器再差也沒關(guān)系了。這種把應(yīng)用程序中的對象暴露出來的想法,和 Mac OS X 中的應(yīng)用程序暴露一個Applescript 字典的設(shè)計思想異曲同工。
同樣的道理,Plan 9 也從一切都是文件的思想出發(fā),解決了了程序控制問題。 Plan 9 鼓勵每個應(yīng)用程序和設(shè)備在抽象成文件的時候,都暴露出一個抽象的 ctl 文件。這樣,其他應(yīng)用程序可以通過向 ctl 文件寫命令的方式,運(yùn)行時控制應(yīng)用程序。舉例來說,Plan 9 的窗口管理器 Rio,提供了 ctl 文件,我們可以通過讀取和寫入 ctl 文件,實(shí)現(xiàn)一些 Rio 本身不支持的如平鋪所有窗口的操作。同樣,通過對郵件程序的 ctl 操作,我們可以實(shí)現(xiàn)郵件的發(fā)送和接受的控制等等。Mac OS X 下的 Applescript 也可以完成類似的功能。遺憾的是,除了 Plan 9 和 Mac OS X,其他操作系統(tǒng)對這類進(jìn)程間控制和通信的支持都不夠完整。
對 Plan 9 感興趣,想要更多了解 Plan 9 的讀者,可以到 http://plan9.bell-labs.com/plan9/ 下載 Live CD, 并在多臺聯(lián)網(wǎng)的機(jī)器或虛擬機(jī)中安裝該系統(tǒng)。喜歡 Plan 9 里的一些命令,而不想折騰系統(tǒng)的讀者,可以到 http://swtch.com/plan9port/ 下載可以在 Linux,Mac OS X 等主流操作系統(tǒng)上運(yùn)行的 Plan 9 的移植程序。Rob Pike 的網(wǎng)站 cat-v.org 有最完整的 Plan 9 的資料,以及對 UNIX 設(shè)計哲學(xué)的反思。
聯(lián)系客服