你好,我是 Cone。
首先,我們思考一個問題。
為什么會有操作系統?
在我們教科書上會提到分時系統、批處理系統等等現代操作系統前的中間產物,也會講到管理硬件的功能,但似乎沒有講到為什么有操作系統這個東西,誕生操作系統是為了解決什么樣的問題?下面就來通俗易懂的聊聊為什么有這個東西。
假設在遠古時代的計算機需要由人工進行運行操作,但是運行期間又不需要更多的人為干預,這個時候人就空閑下來了,但是計算機被這個任務占據了,啥也干不了,白白的浪費時間(程序員的工資那么高,時間這么浪費了的話,損失慘重!),而且對于計算機的核心部件 CPU 來說,并不是一直有數據可以來運行,也有對于其他部件的操作等待,比如 IO 操作,在等待 IO 的時間里特別漫長,這就浪費了寶貴的 CPU 資源。所以這樣的計算機運行狀況是非常低效的,那么操作系統解決的一個問題就是提高效率,提高 CPU 的使用率,不讓 CPU 休息,瘋狂壓榨它!!!
同時,計算機操作人員直接操作計算機硬件的話,非常麻煩,還容易出錯,所以人們總是尋求一些辦法來解決現有問題,這種解決問題的方法論在哪個學科都成立,既然麻煩,那何不根據計算機領域哲學方法論:添加一個中間層來解決現有問題,那么操作系統就是相對于硬件的中間層。它的出現就屏蔽了底層硬件的細節,從而讓出錯的概率大大降低,以及讓計算機操作人員更加順風順水的操作,程序也開始可以被操作系統自動管理。
上面提到的兩個問題可以歸結于三個字:自動化。程序員總是趨向于追求自動化,比如自動化測試等等。自動化有什么好處呢?借用一句工業革命時期的話那就是:解放生產力。代替那些重復性工作。
所以操作系統的出現也可比喻成生產力的解放,使得程序運行更加高效。
既然我們知道了需要這么一個操作系統來進行自動化運行,那么什么是操作系統呢,為什么叫操作系統而不叫管理系統或者其他名字呢?
什么是操作系統?
操作系統的英文名為:Operating Systems. 翻譯為操作系統,操作二字有點流水線工人操作員的意味,是不是感覺有點土。這么理解的話,那就有些許偏差了,再來一個英語詞匯:Operating Surgeon. 這個詞匯的意思是主刀大夫. 主刀大夫是什么人物?在整個手術室里是權威呀,說上麻藥,麻醉師馬上就位,說要 xx 手術刀,助理大夫馬上送到,是主宰手術室一切的人物。所以操作系統就是主宰一切的系統,計算機體系世界里的一把手。
那么操作系統主宰的一切,這一切包含什么呢?
當然是計算機上里發生的一切事情。在最原始的計算機并沒有操作系統,而是直接由人來掌控事情,即所謂的單一控制終端、單一操作員模式。但是隨著計算機復雜性的增長,人已經不能勝任直接掌控計算機了。于是我們編寫出操作系統來掌控計算機,將人類從日益復雜的掌控任務中解脫出來。
所以明確的說操作系統就是 掌控計算機一切的舵主,權威至上。
我們知道操作系統管理計算機的一切,那操作系統具體管理哪些東西?
操作系統管理哪些東西?
還是來張圖已顯得更加清晰。如下圖。操作系統的 4 個核心管理,當然還有其他的一些安全性管理等等。
如圖,第一個是進程管理,管理要素包含三個:第一個是公平,即每個程序都有機會被 CPU 執行。第二個是非阻塞,任何一個程序不能無限制的阻塞 CPU 給其他程序執行。如果一個程序在運行過程中需要輸入輸出或者因別的什么事情而發生阻塞,這個阻塞不能妨礙其他進程繼續運行。第三個是優先級,CPU 也是分優先級的,也就說優先級高的進程會首先被 CPU 執行,都優先級其次。
內存管理主要是管理緩存、主存、磁盤、磁帶等存儲介質所形成的內存架構。為實現這一內存架構,設計了虛擬內存這一層結構,即將物理內存擴充到外部存儲介質上。這樣內存的空間就大大地增加了,能夠運行的程序的大小也大大地增加了。內存管理的另一個目的是讓很多程序 共享同一個物理內存。這就需要對物理內存進行分割和保護,不讓一個程序訪問另一個程序所占的內存空間。
外存管理通常也稱為存儲管理,它也就是文件系統管理了。文件系統的主要目的是將磁盤變成一個很容 易使用的存儲媒介以提供給用戶使用。這樣我們在訪問磁盤時無須了解磁盤的物理屬性或數據在磁盤上的精確位置,諸如磁道、磁柱、扇面等。當然,文件系統還可以建立在光盤和磁帶上。只是使用最為頻繁的文件 系統都以磁盤為介質。
I/O 管理也稱為設備管理,就是管理輸入輸出設備。I/O 管理的目的有兩個:一是屏蔽不同設備的差異性,即用戶用同樣的方式訪問不同的設備,從而降低編程的難度,你要知道目前存在有上萬種 IO 設備,每個 IO 設備的適配都是在這里進行的,這是抽象和封裝的魅力;二是提供并發訪問,即將那些看上去并不具備共享特性的設備(如打印機等)變得可以共享。
上面三個問題,我們走進了操作系統的世界,了解了操作系統為何而來,它又在干些什么,下面還是來進入主題,操作系統歷史,那么操作系統到底經歷了些什么呢?老規矩:一圖勝千言。
我們就從萌芽階段的狀態機系統來講起。
第一階段:狀態機系統
狀態機系統是計算機在萌芽階段出現的,也就是大概 1940 年以前。其實這種系統其實都不能算做操作系統,因為他就是一種簡單的狀態轉換程序,通過特定的輸入和特定的狀態進行轉換。能做的計算也非常簡單,也就僅限于加減法,也不支持命令交互等等功能。當然,它有一個非常大的好處,沒有安全風險,沒幾個人能接觸到它,自然就不存在安全問題了。
第二階段:單一控制系統
學過計算機導論的話,你應該了解計算機領域的的經典模型——馮若依曼體系結構原理,它是 1945 年左右提出的,屬于這個時期,那還記得我們全世界的第一臺電子計算機是什么時候出現的嗎?沒錯,也是這個時期出現的,時間是 1946 年 2 月,誕生在美國的賓夕法尼亞大學,名稱叫做 ENIAC。
這臺電子計算機其實沒有搭載所謂的操作系統,他只是提供了一些標準的命令給用戶使用,這些標準的命令集就構成了原始的操作系統 SOSC(System Operation Support Center)。這些 SOSC 滿足了系統運行的基本功能,提供人機交互功能,在這種情況下,任何時刻卻只能做一件事,不支持并發也不支持多道程序設計。在這種系統下的資源利用率很低很低,你輸入一個命令它就執行一次,類似于撥一下就動一下,但是動的拿一下又全部占用計算機。這種情況,我們可以理想成只有一個程序能運行。從機器的角度出發,時時刻刻都要等著人來操作,效率真的太低了,詳細情況看看下圖更清晰。
多個人需要使用這臺計算機,指令就會斷斷續續,就會影響效率,就算是一個人輸入多個命令,相比于計算機來講,人輸入的指令速度也會很慢。
那有沒有不等人的操作讓其自己執行呢?隨著計算機的發展那當然有了,接下來就打破這種過于笨拙的情況,來到自動化一點的時代。
第三階段:批處理系統
在仔細考察了 SOSC 后,人們發現,SOSC 效率之所以低下,是因為計算機總是在等待人的下一步動作,而人的動作總是很慢。因此,人們覺得,如果去掉等待人輸入命令的時間,即讓所有的人先想好自己要運行的命令構成一個程序,然后列成一個清單,打印在紙帶上,然后交給一個操作人員來一批一批地處理,效率不就提高了嗎?這樣就形成了批處理操作系統。這是又大大提高單一控制終端的操作系統 SOSC 的效率。
顯然,在這種工作模式下,系統的功能得到了提升,必然復雜性也隨之提升,在這種系統下,用戶只管把程序放在磁帶上,用戶自己可以不在場而去干別的,接下里就是由操作員操作批處理系統來處理一個個任務,處理完了就給出結果。最早的自動化處理雛形出現了。但是這個時候也只能一個個任務處理,一個任務讀取 IO 的時候 CPU 就等待下來了,還是在一定程度上會影響 CPU 運行的效率,有沒有辦法再提高一些呢。這個時候就抓住了 CPU 和 I/O 設備運行時串行的這點,做了文章。
第四階段:多道批處理系統
先來看看單道批處理下的 CPU 與 IO 運行關系,如圖。
當 IO 操作的時候,CPU 會等待 IO 操作的結果,結果返回后才會繼續執行程序,我們可以認為這個時候程序是串行的。由于 I/O 設備的運行速度相對于 CPU 來說實在太慢,這種讓高速設備等待低速設備的狀況無法接受。那能不能將 CPU 和 I/O 進行并發呢?即在一個程序輸入輸出時,讓另一個程序繼續執行。換句話說,能不能將 CPU 運行和 I/O 設備的運行重疊起來而改善整個系統的呢?答案是肯定的,我們可以設計將多個程序同時加載到計算機內存里,以前內存里只有一個程序,而現在有多個程序在運行,從而就出現了多道批處理操作系統。這是一個劃時代的操作系統,開始從原來串行執行任務,到并發執行任務,大大提高了 CPU 的使用率,具體如圖。
這樣 CPU 就開始被任一時刻都用起來了,不會讓它再次打盹了。這兩個階段都是可以為圍繞如何提高 CPU 運行效率來優化。可以發現,在程序 1 要讓出 CPU 的時候,那么到底是讓程序 2 執行呢,還是程序 n 執行呢,這就涉及到 CPU 運行時間如何分配問題,隨著發展,我們又有了分時運行的方案。
第五階段:分時系統
多道批處理操作系統的出現使計算機的效率(主要是吞吐率)大大提高。不過批處理系統這里有一個很大的問題,寫程序的人需要交給一個計算機操作人員來執行程序,對于結果等全部執行完了之后才知道,也不能知道執行步驟,這顯然也是低效且很難接受的。萬一這個計算機操作人員操作失誤或者忘記了呢,所以這個時候就得提出人人都可以擁有計算機的使用權,從而去考慮 CPU 資源怎么分配,這就是分時系統,給每個用戶分配的時間是均等份的。即分給每個人有限的時間,只要時間到了,就換一個進程。這種時分切換下的操作系統就是分時操作系統。在這種系統下,用戶就可以自己調試程序,這里就相當于有多個程序并發的在執行,只要我們將 CPU 切換的時間無限細分,那么每個用戶就會感覺獨自占有計算機資源一樣,這樣的運行模式下就是有多個程序一起執行,也就是我們現代操作系統里的進程并發概念。詳細情況如圖。
A,B,C,D 四個程序依次在 CPU 上執行,如果將每等分無限細分,就好像 A,B,C,D 四個程序自己一個人獨占 CPU 資源一樣,這也就出現了程序執行的并發現象,這是一個假象,只是執行速度太快,人類無法感知而已。
在分時系統下,操作系統的復雜性開始大大提高,還會涉及到資源互斥、進程通信死鎖、保護等問題,復雜性指數可以說是增長超快了。
那么在分時系統下,每個進程獲得 CPU 的執行時間是公平的,不存在偏差,這就會導致一個問題,比如我輸入單詞這么一個操作,不可能等 CPU 執行權限來到了才能執行吧,得及時響應,不然的話,用戶體驗極其差評!所以就出現了實時系統。
第六階段:實時系統
隨著計算機技術的進步,產生了一種需求:有一個程序需要在需要運行的時候馬上運行,而不能等到分時輪到這個進程執行,比如現在的鼠標、鍵盤等輸入性操作,在不破壞操作系統原有運行體系下,需要響應這些事件。也就是計算機對這些事件必須在規定的事件內做出響應,這就是實時系統,詳細情況如下圖。
這個時候響應事件的優先級最高,CPU 會優先處理這些高優的事件,也就是有了實時被處理的感覺。
第七階段:現代操作系統
1980 之后,就開始進入現代操作系統時代了,計算機工業開始迅速騰飛,出現了 DOS,Windows,MacOS 主流操作系統,總結了前面各個階段的優缺點,發展了現代操作系統,同期也出現了 PC 機,計算機算力開始大大提高,后來又出現網絡,分布式操作系統又得到了發展。
在操作系統的歷史演進過程中,我們可以發現基本上是圍繞如何提高 CPU 效率這個方向來進行,讓 CPU 不打盹是我們的目標,圍繞這個點來看計算機發展史,非常能理解當前時代出現了什么問題,如何去解決問題。
最后
我們生活在一個最好的時代,這個時代只要你動動手就能獲取你想要了解的信息。一起享受這個時代所帶來的的便捷吧!
原文鏈接:https://mp.weixin.qq.com/s/RCrrwT6i6Ft59MAIITSxhg