本篇開始题山,將介紹操作系統(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)也沒什么問題,程序員應(yīng)該有能力獨(dú)立完成上述步驟各拷,順利調(diào)用CPU進(jìn)行計(jì)算刁绒。但有一個(gè)問題要先引起重視,那就是總線的使用時(shí)機(jī)烤黍。
1.1 總線使用
圖中可以看出知市,總線分為地址總線、數(shù)據(jù)總線速蕊、控制總線三種嫂丙,這里不去討論分類的細(xì)節(jié),畢竟從名稱上所能觀察到的含義足夠使用互例。思考的問題是奢入,為什么總線要分類?
總線之所以要分類媳叨,首先是因?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)于總線使用的問題邑闲,主要是引出一個(gè)概念:硬件資源獨(dú)占時(shí)算行,可以隨意使用,但帶來(lái)問題是使用率低苫耸,不經(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è)問題忙厌,每個(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)均可以直接訪問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è)備訪問
同樣的仆救,操作系統(tǒng)中可能會(huì)同時(shí)運(yùn)行多個(gè)程序,程序之間對(duì)I/O設(shè)備的訪問需要管理以便順利協(xié)作矫渔。操作系統(tǒng)封裝I/O設(shè)備的硬件細(xì)節(jié)彤蔽,為程序提供統(tǒng)一接口,同時(shí)也管理庙洼、維護(hù)I/O設(shè)備使用情況以便調(diào)度顿痪。文件訪問控制
文件從操作系統(tǒng)的角度來(lái)看镊辕,是I/O設(shè)備磁盤上的一種對(duì)象。通過(guò)對(duì)象的抽象蚁袭,將一組二進(jìn)制值約束為文件內(nèi)容征懈,同時(shí)通過(guò)額外的二進(jìn)制值來(lái)代表各種訪問屬性。所以文件實(shí)際上可以成為磁盤類I/O設(shè)備的訪問單元揩悄,因此卖哎,對(duì)于I/O設(shè)備本身的管理自然包括了內(nèi)部所有文件情況的維護(hù)。系統(tǒng)訪問
操作系統(tǒng)管理資源删性,也維護(hù)這大量有關(guān)資源的信息亏娜。這些信息的訪問必須有所保護(hù),否則一旦被惡意修改镇匀,輕則系統(tǒng)信息錯(cuò)誤照藻,重則直接崩潰袜啃。同時(shí)汗侵,對(duì)于同一資源的訪問,系統(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)帖蔓。