一文揭開操作系統(tǒng)的神秘面紗
1 操作系統(tǒng)簡介
在如今的世界里,絕大多數(shù)人都會對Windows,Linux及MacOS等操作系統(tǒng)有一定的使用經(jīng)驗(yàn),但是很多時(shí)候?qū)Σ僮飨到y(tǒng)本身并沒有太多感知。畢竟與用戶直接打交道的大多數(shù)是各種炫酷的客戶端軟件,包含精美的字體、圖標(biāo)和圖片等。
圖1 Windows10
雖然一般來說這樣漂亮的用戶界面通常不屬于操作系統(tǒng),但可看作它是操作系統(tǒng)的一部分,通過操作系統(tǒng)來完成其底層復(fù)雜的與硬件層面的交互工作。
現(xiàn)今的計(jì)算機(jī)是一個(gè)極其復(fù)雜的系統(tǒng),一般由一個(gè)或多個(gè)處理器,以及一些主內(nèi)存、磁盤、網(wǎng)絡(luò)接口、各種外設(shè)以及各種其他輸入/輸出設(shè)備組成。如果每個(gè)程序員都必須詳細(xì)了解所有這些硬件層面的原理和機(jī)制,然后才能編寫相應(yīng)的代碼,那么可想而知這樣的效率會有多低。
圖2 操作系統(tǒng)所處層次結(jié)構(gòu)
此外,管理所有這些組件并優(yōu)化使用它們是一件非常困難的工作。因此,計(jì)算機(jī)配備了一層稱為操作系統(tǒng)的軟件,其作用是為用戶程序提供簡潔方便的計(jì)算機(jī)模型,并統(tǒng)一管理所需要的資源。
圖3 計(jì)算機(jī)基本硬件組成
在這里,我們看到計(jì)算機(jī)最底部是各種硬件,包括芯片,主板,磁盤,鍵盤,顯示器等。在硬件之上則是軟件。大多數(shù)計(jì)算機(jī)都有兩種操作模式:內(nèi)核模式和用戶模式。
內(nèi)核模式Kernel Mode:
在內(nèi)核模式下,程序具有硬件的所有控制權(quán)限,可以執(zhí)行所有CPU指令,可以訪問任意地址的內(nèi)存。在內(nèi)核模式下的任何異常都是災(zāi)難性的,將會導(dǎo)致整臺機(jī)器停機(jī)。
用戶模式User Mode:
在用戶模式下,程序沒有對硬件的直接控制權(quán)限,也不能直接訪問地址的內(nèi)存。程序是通過調(diào)用系統(tǒng)接口API來訪問硬件和內(nèi)存。在這種保護(hù)模式下,即使程序發(fā)送崩潰也是可以恢復(fù)的。
操作系統(tǒng)可以看作是最基本的軟件,它運(yùn)行在內(nèi)核模式(也稱為管理程序模式)下。在這種模式下,它可以完全訪問所有硬件,并且可以執(zhí)行機(jī)器可以執(zhí)行的任何指令。
而在用戶模式下運(yùn)行的一般都為直接面向用戶的應(yīng)用軟件,在該模式下只能使用一部分機(jī)器指令。特別是,那些影響機(jī)器控制或「I/O輸入輸出」的指令在用戶模式程序中是禁止的。
2 操作系統(tǒng)作用
看起來操作系統(tǒng)好像就是橫跨在用戶應(yīng)用軟件和底層硬件之間的橋梁,通過運(yùn)行在內(nèi)核模式進(jìn)行硬件的控制和調(diào)度。事實(shí)上,操作系統(tǒng)的作用可大致分為兩大方面。
作為計(jì)算機(jī)硬件的抽象層
大多數(shù)計(jì)算機(jī)在機(jī)器語言級別上的體系結(jié)構(gòu)是極其原始的,主要說的是指令集,內(nèi)存組織,I/O處理和總線結(jié)構(gòu)。在這樣的結(jié)構(gòu)下是沒辦法進(jìn)行自定義編程的,特別是對于I/O操作而言。因而,沒有理智的程序員愿意在硬件級別處理磁盤和內(nèi)存。
為了解決這樣尷尬的局面,從而產(chǎn)生了一個(gè)稱為磁盤驅(qū)動(dòng)程序的軟件。它用來處理硬件并提供一個(gè)接口來讀取和寫入磁盤塊,而使得我們無需關(guān)注其細(xì)節(jié)。這本身就是操作系統(tǒng)最初具有的功能之一,包含許多用于控制I/O設(shè)備的驅(qū)動(dòng)程序。
圖4 讓人頭疼的設(shè)備驅(qū)動(dòng)
但是對于大多數(shù)應(yīng)用程序來說,光有驅(qū)動(dòng)程序是不夠的。因此,所有操作系統(tǒng)都為使用磁盤提供了另一層抽象而又便于理解的概念:文件。程序可以創(chuàng)建,寫入和讀取文件,而不需要處理硬件層面中復(fù)雜的工作原理和實(shí)現(xiàn)細(xì)節(jié)。
這種所謂對硬件層面的抽象是管理所有這些復(fù)雜底層硬件的關(guān)鍵。一個(gè)好的抽象系統(tǒng)將幾乎不可能完成的任務(wù)變成可以進(jìn)行管理的任務(wù)。所以事實(shí)上操作系統(tǒng)所干的事,首先是定義和實(shí)現(xiàn)抽象。然而是使用這些抽象來解決上層用戶的問題。
圖5 「文件」是操作系統(tǒng)最重要的抽象概念
「文件」是幾乎每個(gè)計(jì)算機(jī)用戶都可以理解的一種抽象。一個(gè)文本,一個(gè)照片,一封保存的電子郵件,一首周杰倫的歌或一個(gè)網(wǎng)頁,這些都可看作是抽象出來的文件。正是通過操作系統(tǒng)的抽象作用,使得我們可以在處理文本、照片、郵件的時(shí)候只需要點(diǎn)擊幾下,而不需要去考慮在SATA磁盤中數(shù)據(jù)的存放格式發(fā)生了如何變化。
圖4 操作系統(tǒng)對硬件層的抽象
顯而易見的是,操作系統(tǒng)的主要任務(wù)之一是隱藏硬件,并以簡單且好看的抽象形式呈現(xiàn)程序,以方便用戶的使用。這也是Windows系統(tǒng)持續(xù)幾十年的市場占額的原因所在,相較于其它的系統(tǒng),Windows以更接近用戶體驗(yàn)的抽象方式從而贏得了市場。
作為計(jì)算機(jī)的資源管理器
上面的作用簡單來說就是操作系統(tǒng)為用戶層面的應(yīng)用程序提供了一種硬件的抽象,是自頂向下的作用。除此之外,操作系統(tǒng)還可以作為自底向上的中間人對應(yīng)用程序所需要的資源進(jìn)行管理和分發(fā)。在自下而上的流程中,操作系統(tǒng)的工作是在需要處理器、內(nèi)存和I/O設(shè)備的各種程序之間提供有序且受控的分配。
圖4 操作系統(tǒng)對底層資源的管理
打個(gè)比方,我們知道操作系統(tǒng)允許多個(gè)程序同時(shí)運(yùn)行并占用內(nèi)存。想象一下,如果在一臺計(jì)算機(jī)上運(yùn)行的三個(gè)程序都試圖在同一臺打印機(jī)上同時(shí)打印輸出,將會發(fā)生什么。三個(gè)程序調(diào)用打印機(jī)打印可看作是對資源對請求,如果沒有操作系統(tǒng)對資源請求的管理和分配,那么整個(gè)計(jì)算機(jī)的輸出結(jié)果將會是完全混亂的。
圖5 多個(gè)程序同時(shí)調(diào)用打印機(jī)的錯(cuò)誤輸出
打印機(jī)這個(gè)例子還只是最簡單直接的資源請求和分配問題,而其它比如網(wǎng)絡(luò)資源、內(nèi)存資源的請求沖突問題的影響就更大了。如果處理不好資源請求之間的問題,不同應(yīng)用程序之間則會發(fā)生嚴(yán)重的串?dāng)_,以致出現(xiàn)各種無法調(diào)試的錯(cuò)誤。
操作系統(tǒng)主要是以時(shí)間和空間這兩種方式進(jìn)行復(fù)用或共享資源。對資源進(jìn)行時(shí)分復(fù)用時(shí),不同的程序或用戶輪流使用它。他們中的第一個(gè)開始使用資源,然后再使用另一個(gè),依此類推。
圖6 操作系統(tǒng)在時(shí)間維度上分配資源
這實(shí)際上就是所謂時(shí)間片的概念,在時(shí)間的緯度上為每個(gè)程序分配一段資源占用的機(jī)會。還是共享打印機(jī)的例子,當(dāng)有多個(gè)程序都想用打印機(jī)的時(shí)候,就按照時(shí)間發(fā)送的順序在打印機(jī)上線性排序,一個(gè)一個(gè)來。
另一種是空間多路復(fù)用。最主要的區(qū)別在于不是每個(gè)程序輪流使用,而是每個(gè)程序都獲得了一部分資源。
圖7 操作系統(tǒng)在空間維度上分配資源
例如,通常將主存儲器劃分為幾個(gè)可同時(shí)使用的區(qū)域,每個(gè)程序可以同時(shí)占用。假設(shè)有足夠的內(nèi)存來容納多個(gè)程序,那么相較于所有內(nèi)存分配個(gè)一個(gè)程序而言,一次將多個(gè)子內(nèi)存分配給多個(gè)程序就更有效。
當(dāng)然,這會引起公平性以及安全性等問題,這也是操作系統(tǒng)需要解決的問題之一。進(jìn)行空間多路復(fù)用的另一個(gè)資源是磁盤。
在絕大數(shù)系統(tǒng)中,單個(gè)磁盤可以同時(shí)容納來自多個(gè)程序或用戶的文件。而操作系統(tǒng)在這其中的作用就是根據(jù)用戶或程序來確定其對應(yīng)的一塊磁盤區(qū)域,從而保證程序正常的運(yùn)行。
總結(jié)
操作系統(tǒng)復(fù)雜性絕不是幾篇文章可以介紹的完的,但是這些理論上的思想正是操作系統(tǒng)架構(gòu)形成的基礎(chǔ)。了解操作系統(tǒng)能夠讓我們真正走進(jìn)程序代碼執(zhí)行的內(nèi)部,從高級語言出發(fā)進(jìn)而理解硬件層面的執(zhí)行,從而能夠真正從平臺及系統(tǒng)層面優(yōu)化我們代碼的性能。
作者簡介:我是安醬,一個(gè)稀里糊涂地進(jìn)了大廠的業(yè)余碼農(nóng)。分享全棧技術(shù),目標(biāo)架構(gòu)師。關(guān)注我,一起向技術(shù)大牛進(jìn)階!
本文轉(zhuǎn)載自微信公眾號「 業(yè)余碼農(nóng)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系 業(yè)余碼農(nóng)公眾號。