1. 程式人生 > >第一章 作業系統概述(四)

第一章 作業系統概述(四)



1.2 作業系統的發展

作業系統作為一種特殊的軟體,伴隨著計算機的發展從無到有、從簡單到複雜,推動其發展的外部因素主要有兩方面:應用和硬體。計算機系統的早期應用需要涉及到從硬體設計、演算法設計、程式編寫的全部環節,每個應用都要把絕大部分開發力量放在繁瑣、重複的底層細節操作上,導致開發週期長、難以除錯、執行效率低;正是對於把這些公共的底層操作抽取出來成為一個單獨軟體集合的努力催生了作業系統,而讓應用開發更方便、執行更高效的不懈追求推動了作業系統的持續發展。硬體技術的不斷髮展既對作業系統的功能提出了新的挑戰,也為作業系統的設計和實現提供了新的可能。作業系統的發展又反過來促進了應用和硬體的發展,處理器保護模式的發展,主要動力就是作業系統核心對自身的保護需要;近年來CPU增加的虛擬化技術支援,也是在作業系統以軟體方式實現虛擬機器後的一種硬體改進。由於作業系統對硬體資源的有效管理和訪問介面簡化,才使得應用軟體脫離了底層細節的束縛,專注於業務邏輯開發和框架結構改進,從而得到快速的發展。

1.2.1 通用作業系統的發展軌跡

在計算機誕生之後的早期,軟硬體的研發是一體的,計算機為了特定的計算用途而設計,當需要改變其計算任務時,通過以修改控制板上開關或跳線的方式實現,不存在現代意義的程式,當然也就沒有作業系統的概念。當通用的可程式設計的計算機出現以後,程式設計才成為一個獨立的過程逐漸發展。最早的程式設計形式是把二進位制的機器指令序列和資料直接打到穿孔紙帶(或紙卡)上,然後計算機利用相應的輸入裝置從紙帶上讀入程式和資料。這時的計算機一次只能執行一個任務,使用者在一段時間內完全獨佔計算機資源,等到計算任務完成後,輪到下一個使用者人工操作使用。

1、作業系統的雛形——單道批處理系統

作為作業系統雛形出現的“駐留監控”程式(resident monitor)在20世紀50年代出現,隨著組合語言、高階語言等符號語言出現,程式設計不再是把全部演算法邏輯一次性編寫成機器語言的程式,而是以文字形式編寫源程式,通過彙編/編譯、連結等過程形成可以執行的機器語言的程式。一些公共的功能可以先期編寫完成,以函式庫形式儲存在系統中,使用者計算任務的執行模式變為:使用者提交源程式和資料,源程式經過彙編/編譯生成目標程式,經過連結生成可執行,裝入執行後讀取資料並進行處理,產生最後計算結果。完整的使用者計算任務被稱為“作業”(job),其中的每個步驟被稱為“作業步”,駐留監控程式的作用可以簡單描述為:讀入一個作業,按照要求順序執行各個作業步,作業成功完成或失敗終止後,讀入下一個作業繼續執行。這種無需人工干預而自動執行作業/作業步的處理方式被稱為“批處理”(batch processing),由於減少了作業之間銜接時的人工操作而提高了系統效率。

批處理系統的使用方式與現代計算機系統的使用方式有很大區別,因此需要對於作業提交方式再進行一些簡單說明。使用者提交作業時,除了源程式和資料,還要提交一個作業說明書,其中包括作業相關的各種資訊,例如完成作業所需的作業步,需要使用的系統資源,作業的型別、提交者、預期執行時間等;作業說明書的編寫獨立於源程式的編寫,需要使用特定的作業控制語言(JCL:Job Control Language)編寫,這是不同於普通程式語言的一種兼有描述和控制功能的語言,可以認為現代作業系統中的shell指令碼、bat批檔案與JCL有一定傳承關係,但是也有很大區別,JCL中用於描述作業特徵資訊的部分在非批處理系統中不再需要。批處理系統中的監控程式具有基本的資源管理和排程功能,當選中一個作業執行時,會按照作業說明書要求依次執行每個作業步,而每個作業步都涉及到分配資源、裝入相關程式並執行、回收資源的過程;排程功能則體現為當系統有空閒時,如果有多個待執行的作業,監控程式會根據一定的排程演算法選擇下一個作業進入執行狀態,排程依據的資訊一般來自作業說明書中包含的特徵資訊。

2、作業系統初具規模——多道批處理系統

早期的批處理系統中,作業之間也是順序執行的,任何時刻系統中只有一道作業處於執行狀態,其他已提交作業會處於等待狀態,這種系統也被稱為單道批處理系統。單道批處理雖然可以避免作業切換時人工操作帶來的延遲,但是在一個作業執行過程中(更嚴格說是一個作業步執行過程中),如果程式需要有輸入輸出,那麼在等待I/O裝置時,CPU就處於“無事可做”的狀態;考慮到計算機系統昂貴的價格,對計算資源的這種低效利用無疑是巨大的浪費。對此問題的解決方法就是多道批處理系統:在記憶體中同時載入多個作業相關的程式,CPU在執行其中一道程式時,其他程式處於等待狀態;如果當前執行的程式需要進行輸入輸出時,啟動相應I/O裝置後暫停該程式的執行,讓CPU轉而執行其他可以繼續執行的程式,這種微觀上程式交替執行、巨集觀上多道程式同時向前推進的模式被稱為併發。多道批處理系統引入併發機制的思想說起來簡單,在實現時會大大增加監控程式的編寫難度,而且需要至少兩方面的硬體支撐:一是CPU支援對記憶體訪問的保護,從而能避免裝入記憶體的多道程式之間相互干擾以及對監控程式本身的破壞;二是硬體中斷的機制,使得I/O裝置能夠獨立工作,並在I/O任務完成後中斷CPU當前執行的程式轉入預設的處理例程進行善後處理。

多道批處理系統已經具備了現代作業系統的主要特徵,前述的作業系統核心主要功能都已經有所體現:記憶體管理實現多道程式的裝入和保護,處理機管理實現作業之間、記憶體中程式之間的兩級排程,裝置管理和檔案管理功能無需贅述;加上記憶體保護模式引入,在核心態執行的核心已經基本成型。但是由於單純批處理系統的“離線”操作模式,還有一個現代作業系統的重要特徵沒有引入,就是後來出現的分時系統中的搶佔式排程。

3、現代作業系統成型——分時系統

分時系統的發展源於互動式“聯機”操作的需求,批處理系統的操作方式會帶來很多不便,例如一個使用者提交作業中如果有源程式錯誤,則會導致該次提交作業執行失敗,而使用者只有拿到執行結果後(典型時間是1個工作日,也可能更久)才能知道,需要修改錯誤後再次提交作業,如果還有其他錯誤還會多次迭代,導致操作週期很長而且不直觀。如果使用聯機方式,可以及時看到執行結果並進行相應修改工作,則可以大大提高開發效率;早期單道系統中不會採用聯機方式,因為這樣會導致CPU不僅要等待低速I/O裝置、還要等待更低速的“人”;當多道程式技術成熟後,這就不再成為問題了,因為某些記憶體中程式等待使用者聯機操作不會影響後臺其他計算任務的執行。分時系統主要面向多個使用者同時聯機操作,之所以要支援多個使用者同時操作是因為兩點:首先計算機很貴,其次計算機的能力相對於單個使用者太強了。分時系統的基本思想很簡單:每個聯機使用者的計算任務都會獲得一個比較短的“時間片”(一般在數十個毫秒的量級),在此時間內CPU執行該任務的程式,如果時間片用完了程式還沒有因為輸入輸出等原因主動放棄CPU,則作業系統會強制暫停該程式執行,轉而執行其他使用者的計算任務,從而保證在有多個聯機使用者同時操作情況下,每個使用者操作的延遲都是可以忽略的。這種排程方式被稱為搶佔式排程,區別於多道批處理系統中一般採用的非搶佔式排程——只有當前程式執行不下去了才會去執行下一個程式。

核心態執行、多道程式併發執行、搶佔式排程、能同時兼顧離線方式的計算任務和聯機方式的互動操作,這些特徵就已經構成了現代意義的作業系統。同時具備這些特徵的早期作業系統中最廣為人知的當屬Unix,其基本架構在1970年代就已定型。Unix影響了大部分當前主流作業系統,其後的作業系統發展在核心功能方面再無突破性的改變,核心功能最大的擴充套件應該是網路功能的加入,但在本書中只有很少章節會涉及網路方面的內容;圖形使用者介面的引入雖然從根本上改變了使用者使用計算機的方式,但是並不一定需要在核心中擴充套件功能。當然在之後的漫長髮展過程中,隨著硬體技術的進步和應用領域的擴充套件還有很多結構和演算法優化,但從核心的總體功能和結構看都是穩定的,這也是本書此類原理類教材可以存在的理由。

就通用作業系統核心的基本結構和功能而言,從沒有作業系統,到單道批處理系統、多道批處理系統、分時系統,再到集大成的Unix之類的作業系統,這已經可以當作一個比較完整的發展史了,但是對讀者而言可能還會有疑問:這之後的幾十年的重要發展在哪裡?我們日常使用的作業系統又在哪裡?下面我們就從典型的微機作業系統以及其他型別作業系統兩方面再來認識作業系統的發展。

【說明】對此部分內容的幾點說明,1、在發展過程描述中,有意不指明早期的系統的名字(即使有些系統相當有名並且影響深遠),因為離開當時的硬體裝置根本無法真正理解特定的系統是什麼樣子的,通過隱去具體早期系統名字,希望引導讀者更關注於作業系統的發展脈絡,現代作業系統是如何演變成今天的樣子的。可能會有人認為這是一部分常識性內容,我個人觀點是,記住幾個名字、幾個時間點,不知道相應系統的主要特徵,這種“常識”對於構建自己的知識體系毫無意義。2、很久以來我個人都認為批處理系統是一種過時系統,作業有關概念應該作為一種歷史上出現過的東西簡單介紹;雖然現代系統中仍然存在類似的非互動式計算需求,但在應用和核心層面的具體實現方法上都與早期作業有很大區別。所以在排程演算法等章節中應該把限於早期批處理系統的知識單列為“過時”內容加以介紹,避免干擾對現代作業系統的理解和認識。3、在本書中實際是把微機上的主流作業系統作為現代作業系統的範例,很可能會有人認為失於片面且不夠先進。我個人有一個樸素的評判標準:作為一個人工產品,其技術含量的高低當然看其開發者團隊的整體技術實力,有哪一種“高大上”的作業系統,其開發者從團隊規模、平均技術能力、管理水平等方面與Windows、Linux、OS X等系統相比,能夠達到哪怕是數量級上的接近?認為大型機上的作業系統比起我們日常使用的系統更為先進的觀點,我認為僅僅是出於對於自己不能瞭解系統的神祕感。當然我不否認由於硬體發展的超前和應用需求的苛刻,這種系統會有一些特定的特性領先於微機作業系統,但這很難說是技術水平的領先,而且對於本書目標而言根本無關緊要。