彭民德:《電子計算60年》(15) 作業系統造就計算機活的靈魂

彭民德發表於2016-07-29

最有代表性、最重要的軟體—作業系統究竟是什麼?上個世紀80年代初,IBM 360/370作業系統資料被引進到中國。最早引進的是美國馬德尼克和多諾萬70年代初寫的《作業系統》(石伍鎖譯,科學出版社,1980),它以IBM OS /370為背景,詳細介紹了系統最新的硬體環境,介紹了作業系統的功能、結構和實現技術。這於我國業者實在是一本很及時的好書,對我國計算機界影響很深。在它的基礎上,還有中科院計算所張尤臘等人的著作《計算機作業系統》(科學出版社,1979)。計算機配備了作業系統,就使得計算機有了大腦,有了靈魂。電子計算技術便上了一個新臺階。

enter image description here

可以從多個角度認識作業系統。一個觀察作業系統的角度是它為我們提供了使用計算機的平臺與環境。顧名思義,平臺是起支撐作用的,就像演戲要有舞臺一樣。人們操作計算機,在計算機上執行程式和開發程式,也要有平臺支撐。

沒有作業系統的計算機是僅有硬體的裸機,而裸機是很難操作的。我們在第一、二代計算機上直接操作裸機,吃盡了苦頭。沒有作業系統,整個計算機硬體只有潛在的能力,難以起到它應有的作用。而一旦作業系統得以正常運轉起來,操作人員就可以輸入命令,或者啟動使用者自己編寫的程式,讓計算機做事。印表機等外設都可以工作起來,整個計算機就能正常運轉,計算機便有了活的靈魂,時刻準備著為你服務。作業系統之所以被叫做作業系統,按我的理解,最基本的含義就是它使得計算機硬體成了可以操作的,並且由它提供了一組最基本的操作命令,方便操作的緣故。在硬體(裸機)上配置了作業系統後,計算機便成了一臺包含了基本軟硬體的系統,成了一個功能更強大的平臺。人們再也不用直接與望而生畏的裸機打交道,而是跟比較親切的作業系統打交道了。舉例說吧,我現在正在敲擊鍵盤輸入文字,所敲擊的鍵盤並非單獨的鍵盤,而是經由作業系統管理和控制的鍵盤。比較一下,在引導作業系統正常運轉之前,鍵盤還是不能用的,敲擊鍵盤不能得到回應。藉助於作業系統的支援,敲鍵盤就很容易跟正在編輯的文件聯絡起來。否則的話,如果沒有作業系統支援,就無法把文字輸入到文件中去,鍵盤也無法得到利用。

又一個觀察角度是,可以把作業系統看作計算機的資源管理者。計算機系統中有大量的硬體和軟體資源: 快速的CPU、大容量而快速的記憶體、超大容量的外存、各種各樣的輸入輸出裝置、成百上千個檔案資訊。當時的計算機價格昂貴,這麼多資源誰來協助投資人具體管理呢?如果投資人是董事長的話,還得聘請一位總經理、廠長、校長或者樂隊指揮的管理角色。作業系統正是一位非常稱職的管理者,承擔起資源管理的任務。它儘可能讓所有資源都充分利用起來,它會進行適當排程,儘量讓所有程式都有資源可用。當執行程式在使用資源而發生衝突時,比如你要列印我也要列印,它還會協調衝突,按照某種次序悄悄而公平地排隊,使所有的計算有條不紊地使用資源。管理出效益,依靠作業系統的管理,才能充分發揮計算機運算快、儲存容量大的能力,使資源發揮應有的作用。

計算機系統中除了作業系統,還有其它一些軟體,比如文件編輯程式、編譯程式、除錯程式、資料庫管理程式、工具軟體等。有些軟體有分層依賴關係,比如源程式依賴於編譯程式,編譯程式依賴於作業系統,三者構成了層次關係。從軟體層次角度看,作業系統是所有各種軟體中最靠近硬體、處於最底層,支撐所有其它軟體得以在計算機硬體上執行的底層軟體。

作業系統與其它程式雖然都由演算法與資料結構組成,但因其功能和地位不同,使得它與其它程式有幾個重要區別。作業系統程式是系統中最不可缺少的程式,其它程式都是可選的。一旦缺少作業系統,或者作業系統壞了,系統就癱瘓了。作業系統是計算機系統中與硬體一道最不可缺少的部分。從系統開機到關機,作業系統都在執行,其它程式也許只在某個時間段執行。在其它程式執行時,作業系統也在執行,為其它程式執行提供支援和服務。原則上說,其它程式是受作業系統控制和排程的。作業系統在記憶體的駐留位置與應用程式也是隔離的,它的核心部分駐留在記憶體的核心空間,其它程式處在使用者空間。作業系統在CPU核心態(管理態)執行,可以執行特權指令,具有其它程式所不具備的特權。比如,改變CPU的執行狀態,讀寫記憶體的任何區域,啟停I/O。而其它程式沒有這種權利。其它程式只能訪問自己那一片區域,一片由作業系統分配給它的區域。程式中的I/O操作是間接地由作業系統協助完成的。還有,作業系統的許多重要功能,可以由硬體協同實現。比如,在硬碟上開闢專門區域實現虛擬儲存,另開闢專門區域實現程式對換,或者也開闢專門區域實現虛擬列印。作業系統中頻繁使用的中斷處理程式,甚至由ROM硬體固化儲存,這些特點也是其它程式不可能有的。

有了作業系統,幾個使用者可以同時使用一臺計算機,這個人在算題,那個人在列印,還有人在下棋,各得其所。有了作業系統,你想把資料儲存在磁碟上很容易,起個檔名,隨後做一個簡單操作,比如現在只要按一個儲存按鈕就行了。無須關心磁碟結構,什麼磁軌啦,扇區啦,再不用像一、二代機器那樣,樣樣事必躬親了。計算機變得聰明和高效起來,變得容易使用和對使用者友好。

作業系統這樣的功能和地位,決定了它與硬體都是計算機中最不可缺少的部分。常說軟體是靈魂,那麼作業系統就是計算機系統的靈魂。作業系統的出現,是計算機發展史上一次飛躍,有標誌性意義。

由此可見,無論考察計算機的歷史,還是討論當今的計算機,作業系統都是一個不可迴避的話題。不瞭解作業系統就不可能瞭解計算機是怎麼工作的。無論你在某一方面用得多麼熟練,比如很會做文件編輯,或者是圖片處理高手,也只是把計算機當一個黑盒子看待,對其內部還是不甚了了。只有瞭解作業系統才能知道計算機內部的工作。

一接觸作業系統,就讓人對它產生了好奇和興趣。它畢竟也是資料結構加演算法的一組程式呀,到底怎麼工作,怎麼去管理計算機的呢?能夠探討它的內部和微觀結構嗎?說到底,作業系統的基本奧妙在於採用了多道程式設計技術,造就併發活動,在快速的主機與慢速外設和人機互動之間,找到了減少主機等待而得以充分利用的技術。

常常講某個人真笨,像算盤珠子似的,只會推一下動一下,他每次只能根據別人的安排做一件事,做完後只會等待別人再吩咐。在再次吩咐前,他都處在等待狀態,一天做不了幾件事。聰明人怎樣工作呢?比如一個校長或者一個經理,或者一個祕書,他會巨集觀規劃每一天做哪幾件事,包括處理一些臨時發生的緊急事情。有的事受客觀條件限制不可能一氣呵成,得分輕重緩急,瞻前顧後,關注一件事馬上又顧及下一件事,推動各個職能部門同時去做,很少閒下來等待。雖然每次也只能做一件事,或做規劃,或簽署檔案,或做調研,但一天總起來就做了許多事。其實每個人都有這種經歷,一個學生,這兩個課時只上一門課,可是按照課表,每週要上比如6門課。這些課巨集觀上一起在上,都已經在上,又都還沒有結束。雖然每門課每週只上2節4節,但是到期末剛好上完。我們的第一、二代計算機就像前面那位笨人,而作業系統就學後面這種聰明人。作業系統的多道程式設計就採用這種併發技術,製造出微觀上的併發世界,它負責管理排程,讓許多計算都巨集觀上同時活躍起來,讓各臺外設都忙起來,主機很少等待,提高了計算機的資源利用率。

依照系統資源的特點,作業系統的資源管理職能通常被劃分為4類: CPU管理、儲存器管理、裝置管理、檔案管理。

它的CPU管理將把一臺物理的CPU變成每個執行程式一臺的多個虛擬的CPU。

計算機CPU除了快速執行記憶體裡面某個程式的一條指令,什麼也不會。而就單個程式來說,無非是按照程式給定的次序進行輸入、計算處理、輸出結果等。因為輸入輸出需要裝置的機械動作,比CPU做計算處理要慢得多。有人統計過,平均地說,那時候單個程式有70%的時間在輸入(比如用鍵盤)輸出(比如顯示),只有30%以下的時間在CPU上計算。也就是說,如果繼續讓計算機序列工作,大約有七成時間CPU是空閒的,加上人工操作轉接時間,CPU的更多時間被閒置浪費了。

作業系統也學聰明人,在“減少CPU等待時間”上做文章。在只有一個CPU的情況下,只要記憶體中同時存放兩道以上可執行程式,雖然瞬時只能執行其中的一道,因為只有一個CPU,每次只能執行一條指令。但當執行的程式需要輸入輸出時,立即排程另一個程式執行,把這個技術叫做“多道程式設計”。這是作業系統中一項最基本的技術,是它能夠提高效率的關鍵所在,也是作業系統一切複雜性的來源。

實行多道程式設計的機器,一臺主機可以同時連線多個終端。每個使用者獨佔一個終端,通過終端輸入程式和資料,啟動自己的程式執行,也可以干預自己程式的執行。每個人好像自己獨佔了整個機器。IBM 370 可以連線112臺終端。可以同時安排幾個班學生上機。

實現多道程式設計還有一項基本技術叫“分時”。系統設定一個時間期限,限定每個程式每次佔用CPU的最長時間,這個時限就叫時間片。DEC公司的VAX/VMS就是一個典型的分時作業系統,它把時間等分給它連線的各個終端,因為CPU速度很快,在一個時間片內,足以執行使用者很長一段程式了。他的程式可以在不用CPU的那段時間裡,利用外設可以跟CPU同時工作的特性,做它的輸入/輸出工作。於是巨集觀上所有程式都陸陸續續執行了。

一個CPU巨集觀上同時執行多個程式,而微觀上只能有一個在執行,許多計算已經開始但尚未結束,這叫做“併發”。每個併發活動在CPU上一般是走走停停的。

既然是多使用者同時使用一臺計算機,那麼一個班的30位同學可能同時用Fortran 編譯,那麼編譯程式在記憶體只可能儲存一份副本,這就意味著一個編譯程式可以同時對應於多個計算實體,即使只有一個CPU也是這樣。每一時刻只有其中一個計算實體佔用CPU在“走”,另外的計算實體在做各自的I/O,或者被剝奪了CPU的使用權,處於就緒等待狀態。為此第三代計算機為每個計算實體引入了“程式”概念。每個程式執行一次就是一個程式。系統為每個程式建立一個程式實體,程式實體包括對應的程式和資料,還包括一個存放動態管理資訊的程式控制塊PCB。每個程式的PCB中有可以比擬為公民身份證一樣的管理資訊。更有盛者,其中的資訊還在快速地更新著。有支援程式暫停執行而後適時恢復執行的現場保留區。作業系統經由PCB實現對所有程式管理。支援和排程每個程式在CPU上執行,或者時間片到期了繼續就緒,準備下一次被排程的機會。當程式要I/O了,立馬讓它處於阻塞狀態,排程另一個程式執行。程式狀態的每次轉換,系統都會給它保留執行現場,以便下一次能夠基於此刻的映像繼續執行。每一臺多使用者共享主機的計算機系統,都是一個多程式併發的系統。

併發執行的程式共處於系統中,它們的生命期都已經開始,又都還沒有完成。併發執行期間,這個要儲存,那個要列印,他們要共享系統有限的資源。作業系統要管理和排程這種併發性,滿足併發活動對資源的需求,計算機系統內部的微觀世界將呈現十分複雜的局面。作業系統將以適當的同步機制與排程策略,比如先來後到,紅燈停綠燈行等策略,管理萬馬奔騰的眾多程式,實現對CPU有序且有效的排程。將併發程式的執行和對資源的佔用順序化。有了作業系統,計算機系統便成了生動的、有靈魂的系統了。

記憶體將會是個什麼狀況呢?首先,作業系統作為系統的管理者,它的一些很主要的部分必須占上一片地方,長久地駐留在那裡,並且隨時可以投入執行,起到管理和服務的作用。還要劃分好不同的區域,以便分別接納各個使用者這樣那樣的程式,這是多道程式設計本來之意。

在程式與程式之間不但要劃分界限,還得保證每個程式的儲存安全。使用者程式執行時不允許相互訪問,不得越界儲存。更不允許使用者程式訪問作業系統的區域。這又引出記憶體分配和記憶體保護的課題。儲存器管理實際上把一個記憶體變成每個執行程式一個的虛擬記憶體,更有甚者,還能支援比實際記憶體尺寸更大的程式執行。

還有裝置管理。從使用者方面說,希望不要再像一二代計算機年代,做那些直接操縱裝置的麻煩事;從系統角度說,既然現在是多使用者多道程式共存於系統中,使用者操縱裝置有危險性,應該把裝置跟使用者隔離開來。裝置只能由作業系統管,使用者使用裝置時,按照一定介面格式向系統提出申請,比如使用裝置檔案,作業系統接受並具體完成使用者需要的操作。那麼,裝置管理當然是作業系統的重要工作了。裝置管理也採用虛擬裝置技術,把一個硬碟或者一臺印表機,變成每個需要這些裝置的程式各自一個或各自一臺的虛擬裝置。

管理磁碟上的資訊,幫助使用者按照檔名存取自己的檔案,而無須關心磁碟上的磁軌扇區結構,並讓多個使用者多個程式同時對自己的檔案進行讀寫,也是作業系統份內之事。

計算機有了作業系統後,內部工作就複雜起來了。有大量動態的併發活動,一大批程式,後來還把程式劃分為更細的執行緒,形成一個多工多程式,更是一個多執行緒的系統。眾多執行實體有的在CPU使用者態執行,有的在系統管理狀態下執行,它們形成萬馬奔騰的局面。作業系統要有序地排程和管理它們,在注意公平的同時還要保證排程的效率。要滿足各個活動實體對資源的需求。程式在執行中提出資源要求的時間又是隨機的,系統中還有大量的“事件”也是隨機出現的。比如,使用者什麼時候按了什麼鍵,那不能預先肯定,印表機缺紙、卡紙了,時間都是隨機的。對於所有隨機事件,作業系統都要及時做出處理。配了作業系統並運轉起來的計算機不再是裸機,已經是一臺有活力、高效且對人友好的計算機。

可以比喻作業系統把計算機的活動變成了一個小社會,並把社會管理的一些經驗用到計算機內部管理上來。它的資源管理可比作要讓這個社會高效地運轉,資源都能最大限度地得到利用;它的排程讓每個程式有機會執行可比作要讓社會公平地運轉,不要發生交通死鎖,減少失業,不要餓死人;它的程式通訊可比作社會人之間的通訊,通訊用的“訊號燈”和“P、V操作”,類似於交通路口的紅綠燈以及紅燈停(排隊等候)綠燈(依序)行規則;它利用中斷機制和對事件的及時處理,可比作政府對突發事件的處理能力;等等。支援許多人同時用機,並高效管理計算機這個小社會;有併發性、共享性、隨機性特徵,可以比作企業高管的聰明人。這些就是作業系統的內部輪廓。作業系統通過自己的複雜性,換來了系統多工併發的及時性和有序性,換來系統資源利用的高效性和用機的方便性。怎麼稱道作業系統在計算機技術發展歷史上的積極意義都不為過。

OS/360的問題是,由於要照顧吸納其它各種同期作業系統的功能,支援各種程式執行,滿足所有人的需要,因此尺寸龐大,開發它用了5000人年。太龐大了可靠性就很低,有很多軟體故障,每出新版本均要改正上千個錯誤。1968年北大西洋公約集團軟體會議上提出“軟體危機”概念,並把OS/360當作軟體危機的典型案例之一。OS/360的研發原計劃在1965年完成,但由於IBM內部的部門變動和缺乏大型軟體系統開發管理經驗,直到1967年才完成。主要設計者之一的布魯克斯(Fred Brooks)1975年寫的一本描述他們開發OS/360經驗的書,用一群史前動物陷入泥潭而不能自拔的慘象,來表達開發中遇到的困難(圖)。他有一個著名的關於軟體工程的論斷:“往一個已經延誤的軟體專案加入更多的人力將使得專案更加延誤”。布魯克斯從此熱心於軟體工程研究,並在該領域做出了重大貢獻。布魯克斯因開發作業系統IBM OS/360和軟體工程方面的成就而獲得1999年的圖靈獎,這是沒有設諾貝爾獎的計算機界的最高獎。

enter image description here

緊隨IBM公司之後,在電腦業當時排名第二的DEC公司,有自己的PDP-11系列機,和後來的,配置了自己的作業系統VMS/VAX,採用虛擬分頁的儲存管理策略,也很成功。VAX機也曾經被引進到中國來,受到業內歡迎。這些作業系統都追求功能完善,比較龐大。繼IBM的作業系統之後,麻省理工學院聯合包括貝爾實驗室在內的幾家公司還搞了更為龐大的作業系統MULTICS。不過,當時的程式設計技術只在模組化階段,對龐大的程式還不能像今天這樣比較好地分層,因而難以駕馭,程式可靠性問題比較突出。

繼IBM OS/360之後,典型的、成功的作業系統是UNIX,現在還廣為流行,併成為長時間的主打作業系統。因為UNIX的成功,其開發者後來居上,先於布魯克斯獲得圖靈獎。

比爾•蓋茨1975年放棄知名學府哈佛大學的學業,情願自己創辦微軟公司。該公司因主打作業系統軟體,而造就了這位世界首富。

(與本文相關的更多內容,可參看 彭民德《電子計算60年》第4章 三代計算併發共享 電子工業出版社)

相關文章