本篇開始,將介紹操作系統(tǒng)相關(guān)知識(shí),這一部分的知識(shí)涵蓋操作系統(tǒng)通識(shí)到具體的平臺(tái)。和本系列前面所有文章一樣,力求精簡(jiǎn)但有所突破。
1. 硬件使用回顧
如果已經(jīng)閱讀過(guò)前面的文章,那么應(yīng)該對(duì)計(jì)算機(jī)硬件執(zhí)行計(jì)算的概念有所了解,這里做一下簡(jiǎn)單回顧,也是作為操作系統(tǒng)必要性的基礎(chǔ)。
計(jì)算機(jī)硬件主要可以分為如下四大部分:
- CPU,包括控制單元CU和執(zhí)行單元EU,執(zhí)行單元其實(shí)還是通過(guò)算術(shù)邏輯單元ALU來(lái)實(shí)現(xiàn)功能
- 存儲(chǔ)器,包括內(nèi)存、Cache,以及最貼近CPU的寄存器等
- 輸入輸出設(shè)備,包括鍵盤、鼠標(biāo)、顯示器、磁盤等等
- 總線,連接上述三種元器件的電氣線纜,起到連通的作用
那么典型的計(jì)算過(guò)程是:
- 基于CPU支持的指令集ISA編寫任務(wù)描述
- 通過(guò)輸入設(shè)備輸入到存儲(chǔ)器中,注意這期間使用到了總線
- CPU執(zhí)行計(jì)算任務(wù),期間同樣使用到了總線
- 通過(guò)輸出設(shè)備輸出結(jié)果,期間使用到了總線
看起來(lái)也沒(méi)什么問(wèn)題,程序員應(yīng)該有能力獨(dú)立完成上述步驟,順利調(diào)用CPU進(jìn)行計(jì)算。但有一個(gè)問(wèn)題要先引起重視,那就是總線的使用時(shí)機(jī)。
1.1 總線使用
圖中可以看出,總線分為地址總線、數(shù)據(jù)總線、控制總線三種,這里不去討論分類的細(xì)節(jié),畢竟從名稱上所能觀察到的含義足夠使用。思考的問(wèn)題是,為什么總線要分類?
總線之所以要分類,首先是因?yàn)榭偩€總數(shù)有限,就是說(shuō)從硬件層面,不能將每?jī)蓚€(gè)可能發(fā)生通信的組件之間全部用總線相連。既然不能形成點(diǎn)對(duì)點(diǎn)專線,而組件之間又確實(shí)有通信的需求,那就只能采取一個(gè)辦法,共用總線。
共用總線是好事,畢竟遠(yuǎn)離CPU的線纜大部分時(shí)候都是處于空閑狀態(tài)的,假如能夠共享硬件總線,無(wú)論是從經(jīng)濟(jì)還是電路設(shè)計(jì)的角度來(lái)講,都是一件節(jié)約成本的事。簡(jiǎn)單的共用無(wú)非就是大家約定俗成,分時(shí)段使用,不過(guò)這樣一點(diǎn)也不高效,畢竟使不使用總線要看任務(wù)描述中的指令順序,要看指令的操作對(duì)象是數(shù)據(jù)、地址還是需要控制。為了更加高效地利用線纜,那么一定需要一個(gè)類似總線控制的單元。該單元管理并維護(hù)著所有總線的使用,擁有調(diào)度的能力,這樣才能夠及時(shí)填補(bǔ)空檔,并有效響應(yīng)其他組件使用總線的需求。
到了這里,就自然明白總線為什么要分類了。分類是為了更好地管理總線,不僅要分,最好是能進(jìn)一步細(xì)分,分類越細(xì),越能在調(diào)度時(shí)提供更多信息支持,越能物盡其用。
說(shuō)了這么些關(guān)于總線使用的問(wèn)題,主要是引出一個(gè)概念:硬件資源獨(dú)占時(shí),可以隨意使用,但帶來(lái)問(wèn)題是使用率低,不經(jīng)濟(jì)。如果要共享,就必須有所謂的控制單元,建立規(guī)則,進(jìn)行管理。否則各個(gè)用戶不僅無(wú)法正常完成自己的計(jì)算任務(wù),而且還很有可能干擾其他人的計(jì)算需求。
1.2 資源管理
如上所述,當(dāng)需要共享某一硬件資源來(lái)達(dá)到提高利用率并同時(shí)保持良好響應(yīng)的目標(biāo)時(shí),就需要有控制單元進(jìn)行管理。對(duì)于計(jì)算機(jī)硬件整體而言,如獨(dú)占使用,每次只運(yùn)行一個(gè)計(jì)算任務(wù),那么只要在總線這一層實(shí)現(xiàn)控制即可。然而如果要運(yùn)行多個(gè)計(jì)算任務(wù),或是多個(gè)用戶共享使用,那就需要一個(gè)控制單元來(lái)完成管理、調(diào)度的功能。而在計(jì)算機(jī)系統(tǒng)中,這個(gè)單元就叫做操作系統(tǒng)。
2. 操作系統(tǒng)
那么不言而喻,操作系統(tǒng)最根本的工作是進(jìn)行資源管理,確保計(jì)算任務(wù)可以正確執(zhí)行。當(dāng)然任何管理總是有管理理念的差異存在,對(duì)應(yīng)的也就是操作系統(tǒng)調(diào)度算法各有側(cè)重。對(duì)比操作系統(tǒng)發(fā)展史,主要有如下兩個(gè)方向:
- 追求高CPU利用率,即盡可能填滿CPU指令周期。典型的有批處理操作系統(tǒng)、多道操作系統(tǒng)
- 追求低響應(yīng)時(shí)長(zhǎng),即有更好的交互體驗(yàn)。典型的有分時(shí)操作系統(tǒng)
這兩個(gè)方向有各自相違背的點(diǎn),因?yàn)樗^的低響應(yīng)時(shí)長(zhǎng),就代表著必須能夠中斷執(zhí)行中的任務(wù),而每次中斷,實(shí)質(zhì)上,對(duì)于單個(gè)任務(wù)來(lái)講,都是延長(zhǎng)了總執(zhí)行時(shí)長(zhǎng)的因素。不過(guò)如果能因此服務(wù)于更多用戶、更多計(jì)算任務(wù),甚至更好地將使用到不同組件的任務(wù)同時(shí)執(zhí)行,一點(diǎn)點(diǎn)中斷開銷還是值得的。
2.1 操作系統(tǒng)的定義
道理講到這里,也不能免俗,需要為操作系統(tǒng)下一個(gè)定義。操作系統(tǒng)是一種系統(tǒng)軟件,它管理計(jì)算機(jī)硬件和軟件資源,并向計(jì)算機(jī)應(yīng)用程序提供通用服務(wù)。
換成圖示的話,它在整個(gè)計(jì)算任務(wù)中的位置如下所示:
貌似前文中我們只講到操作系統(tǒng)是管理計(jì)算機(jī)硬件的,但這里的定義中還出現(xiàn)了軟件資源,那么這些軟件資源指的又是什么?
我們知道,所謂軟件、應(yīng)用程序這些名詞代表的無(wú)非是計(jì)算任務(wù)描述,它從根本上是由CPU ISA中指令加上操作對(duì)象有序組合而成。既然核心元素是CPU ISA,而各廠家CPU又有所不同,那么編寫程序時(shí),一定需要根據(jù)具體ISA去編寫。這就帶來(lái)一個(gè)問(wèn)題,每個(gè)軟件想要運(yùn)行在某一CPU上,先要找到手冊(cè),逐字逐句進(jìn)行翻譯(指令映射),才能運(yùn)行。但這些工作其實(shí)都是機(jī)械重復(fù)且低效的,也就意味著要重復(fù)地投入大量人力物力來(lái)完成這個(gè)步驟,然而有一個(gè)設(shè)備很擅長(zhǎng)干這種臟活累活,那就是計(jì)算機(jī)。如果我們可以將指令映射的步驟自動(dòng)化,讀取CPU ISA手冊(cè),自動(dòng)映射,就無(wú)需再手動(dòng)處理。而這個(gè)過(guò)程,就是編譯器的雛形。
所以軟件資源指的是一些基礎(chǔ)功能資源,提供一些基礎(chǔ)功能,以供編寫計(jì)算任務(wù)描述時(shí)使用,簡(jiǎn)化任務(wù)描述的編寫時(shí)間。而也是因?yàn)檫@些基礎(chǔ)軟件資源,對(duì)底層硬件(如CPU)進(jìn)行了封裝(wrap),才使得操作系統(tǒng)可以提供通用服務(wù)。
2.2 操作系統(tǒng)提供了哪些服務(wù)
由于個(gè)人無(wú)法給出準(zhǔn)確定義,而又不能誤人誤己,只能選擇翻譯大牛書籍,書籍名稱為《Operating Systems Internals and Design Principles》 2.1.1小節(jié)內(nèi)容。
通常,一個(gè)完整的操作系統(tǒng)需要提供以下幾個(gè)方面的服務(wù):
-
程序開發(fā)
操作系統(tǒng)提供各式各樣的工具和服務(wù),如編輯器、調(diào)試器,用于幫助程序員開發(fā)程序。這些工具按照封裝程度可以進(jìn)一步劃分為以下兩種:Instruction Set Architecture
指令系統(tǒng)體系結(jié)構(gòu)ISA,定義了操作系統(tǒng)使用的機(jī)器語(yǔ)言指令系統(tǒng)。事實(shí)上,應(yīng)用程序和操作系統(tǒng)均可以直接訪問(wèn)ISA。Applicaiton Binary Interface
應(yīng)用程序二進(jìn)制接口ABI,定義了操作系統(tǒng)的系統(tǒng)調(diào)用接口,以及在系統(tǒng)中通過(guò)ISA能夠使用的硬件資源和服務(wù)。每個(gè)操作系統(tǒng)或平臺(tái)會(huì)選擇使用一種二進(jìn)制格式作為可執(zhí)行格式,同一程序如需在不同操作系統(tǒng)上實(shí)現(xiàn)可移植,就必須在ABI層進(jìn)行適配。Application Programming Interface
應(yīng)用程序編程接口API,API封裝了操作系統(tǒng)所提供的硬件資源和服務(wù),使用API可以降低應(yīng)用程序復(fù)雜度,移植時(shí),也可以直接在API層進(jìn)行映射。
程序運(yùn)行
程序運(yùn)行需要很多步驟,包括加載指令和數(shù)據(jù)、初始化I/O設(shè)備和文件,以及其他相關(guān)資源。有了操作系統(tǒng),程序員只要在編寫程序是遵循所提供接口即可,而無(wú)需關(guān)心執(zhí)行所需的具體細(xì)節(jié)。I/O設(shè)備訪問(wèn)
同樣的,操作系統(tǒng)中可能會(huì)同時(shí)運(yùn)行多個(gè)程序,程序之間對(duì)I/O設(shè)備的訪問(wèn)需要管理以便順利協(xié)作。操作系統(tǒng)封裝I/O設(shè)備的硬件細(xì)節(jié),為程序提供統(tǒng)一接口,同時(shí)也管理、維護(hù)I/O設(shè)備使用情況以便調(diào)度。文件訪問(wèn)控制
文件從操作系統(tǒng)的角度來(lái)看,是I/O設(shè)備磁盤上的一種對(duì)象。通過(guò)對(duì)象的抽象,將一組二進(jìn)制值約束為文件內(nèi)容,同時(shí)通過(guò)額外的二進(jìn)制值來(lái)代表各種訪問(wèn)屬性。所以文件實(shí)際上可以成為磁盤類I/O設(shè)備的訪問(wèn)單元,因此,對(duì)于I/O設(shè)備本身的管理自然包括了內(nèi)部所有文件情況的維護(hù)。系統(tǒng)訪問(wèn)
操作系統(tǒng)管理資源,也維護(hù)這大量有關(guān)資源的信息。這些信息的訪問(wèn)必須有所保護(hù),否則一旦被惡意修改,輕則系統(tǒng)信息錯(cuò)誤,重則直接崩潰。同時(shí),對(duì)于同一資源的訪問(wèn),系統(tǒng)層也應(yīng)當(dāng)進(jìn)行調(diào)度,以保證相互間互不沖突。錯(cuò)誤檢測(cè)和響應(yīng)
計(jì)算機(jī)硬件終歸是電氣電路組成的,電氣電路在使用環(huán)境、壽命等因素的影響下,會(huì)出現(xiàn)潛在錯(cuò)誤。同時(shí),軟件編寫中也可能引入錯(cuò)誤,如除零。操作系統(tǒng)會(huì)對(duì)這些潛在錯(cuò)誤進(jìn)行檢測(cè),并嘗試修復(fù)。如無(wú)法修復(fù),則提示用戶或最終關(guān)機(jī)。統(tǒng)計(jì)信息
對(duì)于所有資源的管理調(diào)度,需要基于對(duì)應(yīng)的維護(hù)信息,只有在各相關(guān)組件間共享這些內(nèi)容,才能更加精確地達(dá)成提高CPU利用率或更低響應(yīng)時(shí)長(zhǎng)的目標(biāo)。
3. 操作系統(tǒng)組織架構(gòu)
上一節(jié)中給出了操作系統(tǒng)的定義,列出了需要提供的服務(wù),這一節(jié)就從操作系統(tǒng)本身內(nèi)部如何實(shí)現(xiàn)的角度,來(lái)談?wù)劜僮飨到y(tǒng)組織架構(gòu)。所謂組織架構(gòu),實(shí)際上就是操作系統(tǒng)中是如何提供各服務(wù)的,是每個(gè)服務(wù)作為一個(gè)程序,聚集而形成操作系統(tǒng),還是走大而全的策略一個(gè)程序包含所有操作系統(tǒng)內(nèi)容。這兩種方式,分別對(duì)應(yīng)單內(nèi)核和微內(nèi)核兩種架構(gòu)。
3.1 單內(nèi)核
單內(nèi)核中所有服務(wù)如文件系統(tǒng)、存儲(chǔ)管理等都由多個(gè)運(yùn)行在內(nèi)核態(tài)(Kernel Mode)的模塊來(lái)完成。雖然每個(gè)模塊單獨(dú)服務(wù),但由于高度集成,一旦某一模塊產(chǎn)生bug,則會(huì)使整個(gè)內(nèi)核崩潰。不過(guò)同樣因?yàn)榧啥雀撸胁僮魑挥谕坏刂房臻g內(nèi),控制代碼的運(yùn)行效率會(huì)更高。
傳統(tǒng)UNIX、DOS以及早期的Mac OS系統(tǒng)均采用單內(nèi)核形式。
3.2 微內(nèi)核

微內(nèi)核的原則是將服務(wù)的實(shí)現(xiàn)和基礎(chǔ)操作分離,如某些功能可以通過(guò)運(yùn)行在微內(nèi)核之外的服務(wù)組件來(lái)提供。對(duì)比單內(nèi)核,一個(gè)模塊的錯(cuò)誤并不會(huì)引起整個(gè)內(nèi)核的崩潰,而且服務(wù)的擴(kuò)展也更加便捷。當(dāng)然微內(nèi)核在效率上就略有劣勢(shì)。
3.3 混合內(nèi)核
既然單內(nèi)核和微內(nèi)核均有各自優(yōu)缺點(diǎn),那么自然而然就能想象得到會(huì)有人將兩者混合使用。通過(guò)讓一些微內(nèi)核結(jié)構(gòu)代碼運(yùn)行在內(nèi)核空間上,提高內(nèi)核整體運(yùn)行效率。典型混合內(nèi)核例子有Windows NT及之后系列、Mac OS X等。
下圖是Windows和Linux操作系統(tǒng)結(jié)構(gòu)圖,感興趣的話可以先有個(gè)概念,具體討論將放在后續(xù)文章中。
4. 總結(jié)
本篇定位于介紹操作系統(tǒng)的由來(lái)、必要性、所提供的服務(wù),以及服務(wù)組織形式。掌握了這些概念,就應(yīng)該要朝著提高CPU使用率、降低響應(yīng)時(shí)長(zhǎng)的目標(biāo)去,進(jìn)一步了解內(nèi)部具體實(shí)現(xiàn)原理,而這些,均會(huì)在接下來(lái)幾篇中慢慢道來(lái)。