計算之神的幾次飛躍:關於操作系統開發的那段歷史

計算之神的幾次飛躍:關於操作系統開發的那段歷史

早期操作系統:只是一些庫

一開始,操作系統並沒有做太多事情。基本上,它只是一組常用函數庫。例如,不是讓系統中的每個程序員都編寫低級I/O處理代碼,而是讓“OS”提供這樣的API,這樣開發人員的工作更加輕鬆。

通常,在這些老的大型機系統上,一次運行一個程序,由操作員來控制。這個操作員完成了你認為現代操作系統會做的許多事情(例如,決定運行作業的順序)。如果你是一個聰明的開發人員,就會對這個操作員很好,這樣他們可以將你的工作移動到隊列的前端。

這種計算模式被稱為批(batch)處理,先把一些工作準備好,然後由操作員以“分批”的方式運行。此時,計算機並沒有以交互的方式使用,因為這樣做成本太高:讓用戶坐在計算機前使用它,大部分時間它都會閒置,所以會導致設施每小時浪費數千美元[BH00]。

超越庫:保護

在超越常用服務的簡單庫的發展過程中,操作系統在管理機器方面扮演著更為重要的角色。其中一個重要方面是意識到代表操作系統運行的代碼是特殊的。它控制了設備,因此對待它的方式應該與對待正常應用程序代碼的方式不同。為什麼這樣?好吧,想象一下,假設允許任何應用程序從磁盤上的任何地方讀取。因為任何程序都可以讀取任何文件,所以隱私的概念消失了。因此,將一個文件系統(file system)(管理你的文件)實現為一個庫是沒有意義的。實際上,還需要別的東西。

因此,系統調用(system call)的概念誕生了,它是Atlas計算系統[K+61,L78]率先採用的。不是將操作系統例程作為一個庫來提供(你只需創建一個過程調用(procedure call)來訪問它們),這裡的想法是添加一些特殊的硬件指令和硬件狀態,讓向操作系統過渡變為更正式的、受控的過程。

系統調用和過程調用之間的關鍵區別在於,系統調用將控制轉移(跳轉)到OS中,同時提高硬件特權級別(hardware privilege level)。用戶應用程序以所謂的用戶模式(user mode)運行,這意味著硬件限制了應用程序的功能。例如,以用戶模式運行的應用程序通常不能發起對磁盤的I/O請求,不能訪問任何物理內存頁或在網絡上發送數據包。在發起系統調用時 [通常通過一個稱為陷阱(trap)的特殊硬件指令],硬件將控制轉移到預先指定的陷阱處理程序(trap handler)(即預先設置的操作系統),並同時將特權級別提升到內核模式(kernel mode)。在內核模式下,操作系統可以完全訪問系統的硬件,因此可以執行諸如發起I/O請求或為程序提供更多內存等功能。當操作系統完成請求的服務時,它通過特殊的陷阱返回(return-from-trap)指令將控制權交還給用戶,該指令返回到用戶模式,同時將控制權交還給應用程序,回到應用離開的地方。

多道程序時代

操作系統的真正興起在大主機計算時代之後,即小型機(minicomputer)時代。像數字設備公司(DEC)的PDP系列這樣的經典機器,讓計算機變得更加實惠。因此,不再是每個大型組織擁有一臺主機,而是組織內的一小群人可能擁有自己的計算機。毫不奇怪,這種成本下降的主要影響之一是開發者活動的增加。更聰明的人接觸到計算機,從而讓計算機系統做出更有趣和漂亮的事情。

特別是,由於希望更好地利用機器資源,多道程序(multiprogramming)變得很普遍。操作系統不是一次只運行一項作業,而是將大量作業加載到內存中並在它們之間快速切換,從而提高CPU利用率。這種切換非常重要,因為I/O設備很慢。在處理I/O時讓程序佔著CPU,浪費了CPU時間。那麼,為什麼不切換到另一份工作並運行一段時間?

在I/O進行和任務中斷時,要支持多道程序和重疊運行。這一願望迫使操作系統創新,沿著多個方向進行概念發展。內存保護(memory protection)等問題變得重要。我們不希望一個程序能夠訪問另一個程序的內存。瞭解如何處理多道程序引入的併發(concurrency)問題也很關鍵。在中斷存在的情況下,確保操作系統正常運行是一個很大的挑戰。我們將在本書後面研究這些問題和相關主題。

當時主要的實際進展之一是引入了UNIX操作系統,主要歸功於貝爾實驗室(電話公司)的Ken Thompson和Dennis Ritchie。UNIX從不同的操作系統獲得了許多好的想法(特別是來自Multics [O72],還有一些來自TENEX [B+72]和Berkeley分時系統[S+68]等系統),但讓它們更簡單易用。很快,這個團隊就向世界各地的人們發送含有UNIX源代碼的磁帶,其中許多人隨後參與並添加到系統中。

摩登時代

除了小型計算機之外,還有一種新型機器,便宜,速度更快,而且適用於大眾:今天我們稱之為個人計算機(Personal Computer,PC)。在蘋果公司早期的機器(如Apple II)和IBM PC的引領下,這種新機器很快就成為計算的主導力量,因為它們的低成本讓每個桌子上都有一臺機器,而不是每個工作小組共享一臺小型機。

遺憾的是,對於操作系統來說,個人計算機起初代表了一次巨大的倒退,因為早期的系統忘記了(或從未知道)小型機時代的經驗教訓。例如,早期的操作系統,如DOS(來自微軟的磁盤操作系統),並不認為內存保護很重要。因此,惡意程序(或者只是一個編程不好的應用程序)可能會在整個內存中亂寫亂七八糟的東西。第一代macOS(V9及更早版本)採取合作的方式進行作業調度。因此,意外陷入無限循環的線程可能會佔用整個系統,從而導致重新啟動。這一代系統中遺漏的操作系統功能造成的痛苦列表很長,太長了,因此無法在此進行全面的討論。

幸運的是,經過一段時間的苦難後,小型計算機操作系統的老功能開始進入臺式機。例如,macOS X的核心是 UNIX,包括人們期望從這樣一個成熟系統中獲得的所有功能。Windows在計算歷史中同樣採用了許多偉大的思想,特別是從Windows NT開始,這是微軟操作系統技術的一次巨大飛躍。即使在今天的手機上運行的操作系統(如Linux),也更像小型機在20世紀70年代運行的,而不像20世紀80年代PC運行的那種操作系統。很高興看到在操作系統開發鼎盛時期出現的好想法已經進入現代世界。更好的是,這些想法不斷髮展,為用戶和應用程序提供更多功能,讓現代系統更加完善。

UNIX的重要性

在操作系統的歷史中,UNIX的重要性舉足輕重。受早期系統(特別是MIT著名的Multics系統)的影響,UNIX彙集了許多了不起的思想,創造了既簡單又強大的系統。

最初的“貝爾實驗室”UNIX的基礎是統一的原則,即構建小而強大的程序,這些程序可以連接在一起形成更大的工作流。在你輸入命令的地方,shell提供了諸如管道(pipe)之類的原語,來支持這樣的元(meta-level)編程,因此很容易將程序串起來完成更大的任務。例如,要查找文本文件中包含單詞“foo” 的行,然後要計算存在多少行,請鍵入:grep foo file.txt | wc -l,從而使用grep和wc (單詞計數)程序來實現你的任務。

UNIX環境對於程序員和開發人員都很友好,併為新的C編程語言提供了編譯器。程序員很容易編寫自己的程序並分享它們,這使得UNIX非常受歡迎。作為開放源碼軟件(open-source software)的早期形式,作者向所有請求的人免費提供副本,這可能幫助很大。

代碼的可得性和可讀性也非常重要。用C語言編寫的美麗的小內核吸引其他人擺弄內核,添加新的、很酷的功能。例如,由Bill Joy領導的伯克利創業團隊發佈了一個非常棒的發行版(Berkeley Systems Distribution,BSD),該發行版擁有先進的虛擬內存、文件系統和網絡子系統。Joy後來與朋友共同創立了Sun Microsystems。

遺憾的是,隨著公司試圖維護其所有權和利潤,UNIX的傳播速度有所放慢,這是律師參與其中的不幸(但常見的)結果。許多公司都有自己的變種:Sun Microsystems的SunOS、IBM的AIX、HP的HPUX(又名H-Pucks)以及SGI的IRIX。AT&T/貝爾實驗室和這些其他廠商之間的法律糾紛給UNIX帶來了陰影,許多人想知道它是否能夠存活下來,尤其是Windows推出後並佔領了大部分PC市場……

然後出現了Linux

幸運的是,對於UNIX來說,一位名叫Linus Torvalds的年輕芬蘭黑客決定編寫他自己的UNIX版本,該版本嚴重依賴最初系統背後的原則和思想,但沒有借用原來的代碼集,從而避免了合法性問題。他徵集了世界各地許多其他人的幫助,不久,Linux就誕生了(同時也開啟了現代開源軟件運動)。

隨著互聯網時代的到來,大多數公司(如谷歌、亞馬遜、Facebook和其他公司)選擇運行Linux,因為它是免費的,可以隨時修改以適應他們的需求。事實上,如果不存在這樣一個系統,很難想象這些新公司的成功。隨著智能手機成為占主導地位的面向用戶的平臺,出於許多相同的原因,Linux也在那裡找到了用武之地(通過Android)。史蒂夫·喬布斯將他的基於UNIX的NeXTStep操作環境帶到了蘋果公司,從而使得UNIX在臺式機上非常流行(儘管很多蘋果技術用戶可能都不知道這一事實)。因此,UNIX今天比以往任何時候都更加重要。如果你相信有計算之神,那麼應該感謝這個美妙的結果。

本文摘自《操作系統導論》,被認為是最適合入門學習操作系統的經典教材。

計算之神的幾次飛躍:關於操作系統開發的那段歷史

作者: [美] 雷姆茲·H.阿帕希杜塞爾、[美]安德莉亞·C.阿帕希杜塞爾 譯者:王海鵬

這是一本關於現代操作系統的書。全書圍繞虛擬化併發持久性這3個主要概念展開,介紹了所有現代系統的主要組件(包括調度、虛擬內存管理、磁盤和I/O子系統、文件系統 )。全書共50章,分為3個部分,分別講述虛擬化、併發和持久性的相關內容。本書大部分章節均先提出特定的問題,然後通過書中介紹的技術、算法和思想來解決這些問題。筆者以對話形式引入所介紹的主題概念,行文詼諧幽默卻又鞭辟入裡,力求幫助讀者理解操作系統中虛擬化、併發和持久性的原理。

《操作系統導論》具有以下特色:

主題突出,緊緊圍繞操作系統的三大主題元素——虛擬化、併發和持久性。

以對話的方式引入背景,提出問題,進而闡釋原理,啟發動手實踐。

包含眾多“補充”和“提示”,拓展讀者知識面,增加趣味性。

使用真實代碼而不是偽代碼,讓讀者更加深入透徹地瞭解操作系統。


分享到:


相關文章: