PS:操作系統原理是大學計算機專業最為重要的一門專業基礎課程之一,對於操作系統核心原理的理解對於一個合格的程序員來說十分重要,於是我繼續我的“三大原理,兩個協議,一種結構”復習,三大原理中操作系統原理首當其沖,這里主要依靠閱讀《操作系統之哲學原理》來進行復習,將其中重要的部分記錄下來,與各位分享。當然,更推薦大家去讀讀這本書,相信都會有一定收獲。
一、程序是如何運行的?
1.1 程序運行的四大要素
(1)程序設計語言
首先,我們得使用一門程序設計語言進行編程,一般我們使用的都是高級程序設計語言(如C、C++、Java、C#等)。
(2)編譯系統
我們寫好了代碼,但是由於計算機不認識高級語言編寫的程序,需要編譯成計算機能夠識別的機器語言,這就需要編譯器和匯編器的幫助。
(3)操作系統
機器語言程序需要加載到內存,才能形成一個運動中的程序(即進程),這就需要操作系統的幫助。
About:進程需要在計算機芯片即CPU上執行才算是真正在執行,而將進程調度到CPU上運行也是由操作系統完成的,這里也就不難理解為什么進程管理會在我們的教科書中排在最重要的位置了。
(4)指令集結構(計算機硬件系統)
在CPU上執行的機器語言指令需要變成能夠在一個個時鍾脈沖里執行的基本操作,這就需要指令集結構和計算機硬件的支持。
1.2 程序運行的基本流程
基於上面提到的四大要素,我們可以得出下面一幅圖,該圖從一個線性角度展示了程序的演變過程,能夠幫助我們理解整個程序是如何在計算機上執行的。
事實上,程序可以執行在機器語言或匯編語言上編寫,用這種被稱為“低級”(我更願意稱其為底層)的語言編寫出來的機器語言程序無需經過編譯器的翻譯就可以在計算機指令集上執行。如果是在匯編語言上編寫的匯編程序,則只需要經過匯編器的翻譯即可加載執行。
二、操作系統是什么?
2.1 兩個問題
(1)操作系統到底是什么鬼?
操作系統是介於計算機和應用軟件之間的一個軟件系統,操作系統的上層和下層都有其他的對象存在:
從上圖可以看出,OS上邊是應用軟件,下邊是硬件平台。
(2)操作系統到底操控什么事?
最原始的計算機並沒有OS,直接由人來掌管事情。隨着計算機復雜性的增長,人已經不能勝任直接掌控計算機了。於是,OS這個軟件被編寫出來幫我們掌控計算機,使人類從日益復雜的掌控任務中解脫出來。既然OS是專門掌控計算機的,那么計算機上發生的所有事情都需要OS的知曉和認可,未經OS同意的任何事情均被視為非法的(想想病毒和入侵攻擊者試圖做的事情)。
2.2 兩種角色
(1)魔術家
魔術家的目標是把差的東西變好,把少的東西變多,把復雜變簡單。同樣,OS將計算機以一個更加容易、更加方便、更加強大的方式呈現給用戶。
Example:OS通過進程抽象讓每一個用戶感覺有一台自己獨享的CPU,通過虛擬內存抽象,讓用戶感覺物理內存空間具有無限擴張性,這就是把少變多的一個實例。
(2)管理者
操作系統管理計算機上的軟硬件資源,如CPU、內存、磁盤等,使得不同用戶之間或者同一用戶的不同程序之間可以安全有序地共享這些硬件資源。
那么,問題來了,如何讓用戶很好地利用這些硬件資源呢?這就是分塊(Parcel Out),把硬件分塊給應用程序使用。這就涉及到有效和公平的原則,這也是一個管理者的必備素質,更是設計操作系統時的不懈追求!
操作系統的兩個角色之間既有區別又有聯系,為了完成不同的任務,OS有時需要扮演魔術師,有時有需要扮演管理者,還有時需要同時扮演兩個角色。
三、操作系統的范疇
3.1 CPU管理
即如何分配CPU給不同應用和用戶,對於進程管理堅持三個目標:一是公平(每個程序都有機會使用CPU),二是非阻塞(任何程序不能無休止地阻撓其他程序的正常推進),三是優先級(優先級高的程序開始運行則優先級低的就需要讓出資源—>讓一部分人先富起來)。
3.2 內存管理
即如何分配內存給不同應用和用戶,主要管理緩存、主存、磁盤、磁帶等存儲介質所形成的內存架構。其目的主要有二:一是將少變多(比如虛擬內存的使用能夠使得運行程序的大小大大地增加),二是讓多個程序共享同一個物理內存(這就需要對物理內存進行分割和保護,不讓一個程序訪問另一個程序所占的內存空間,專業術語稱為運行時不能越界訪問)。
3.3 外存管理
即如何分配外存(磁盤)給不同應用和用戶,外存管理也稱存儲管理,也就是我們所說的文件系統,其目的是將磁盤變為一個很容易使用的存儲介質以提供給用戶使用。
3.4 I/O管理
即如何分配輸入輸出設備給應用和用戶,也稱為設備管理,也就是管理輸入輸出設備。其目的主要有兩個:一是屏蔽不同設備的差異性(用戶用同樣的方式訪問不同的設備,從而減低編程的難度),二是提供並發訪問(即將那些看上去並不具備共享特征的設備如打印機變得可以共享)。
操作系統的四個核心功能如下圖所示:
四、小結
操作系統的技巧也應用於很多領域,如抽象、緩存、並發等。操作系統簡單說來就是實現抽象:進程抽象、文件抽象、虛擬存儲抽象等。而很多領域都會使用抽象,例如數據結構和程序設計(抽象數據類型?抽象類?);很多地方也會用到緩存,例如開發Web應用程序時使用緩存降低數據庫訪問壓力,加快頁面響應速度等等。更為重要的是,對於一個程序員來說,要想知道計算機在軟件層面是怎么運轉的,就得學習操作系統。
參考資料
鄒恆明,《操作系統之哲學原理》,機械工業出版社