操作系統(tǒng)核心原理-2.一些基本概念
一、計(jì)算機(jī)硬件基礎(chǔ)
1.1 總線結(jié)構(gòu)
從概念上講,計(jì)算機(jī)的結(jié)構(gòu)是總線型的:布置一根總線將各種硬件設(shè)備掛在總線(Bus)上。
?。?)所有的設(shè)備都有一個(gè)控制設(shè)備,外部設(shè)備通過(guò)控制器與CPU進(jìn)行通信。
?。?)所有的設(shè)備之間的通信也需要通過(guò)總線。

1.2 流水線結(jié)構(gòu)
為了提高計(jì)算機(jī)的效率,人們又設(shè)計(jì)出了流水線結(jié)構(gòu):仿照工業(yè)流水裝配線,將計(jì)算機(jī)的功能部件分為多個(gè)梯級(jí),并將計(jì)算機(jī)的每條指令拆分為同樣多個(gè)步驟,使每條指令在流水線上流動(dòng),到流水線最后一個(gè)梯級(jí)時(shí)指令執(zhí)行完畢。
下圖展示了5個(gè)梯級(jí)的流水線結(jié)構(gòu),流水線上的每個(gè)梯級(jí)都可以容納一條指令并同時(shí)執(zhí)行。
![]()
在流水線的基礎(chǔ)之上,為了進(jìn)一步提高效率,人們又發(fā)明了多流水線、超標(biāo)量計(jì)算和超長(zhǎng)指令字等多指令發(fā)射機(jī)制。
1.3 存儲(chǔ)結(jié)構(gòu)
除了指令執(zhí)行單元外,計(jì)算機(jī)中的另一個(gè)重要部件是指令的存放單元,被稱為存儲(chǔ)架構(gòu)。存儲(chǔ)架構(gòu)包括了緩存、主存、磁盤(pán)、磁帶等。下圖展示了一個(gè)包括寄存器在內(nèi)的5級(jí)存儲(chǔ)介質(zhì)構(gòu)成的存儲(chǔ)架構(gòu)。

從寄存器到磁帶,每一級(jí)存儲(chǔ)媒介的訪問(wèn)延遲和容量均依次增大,而價(jià)格卻依次降低。從圖中可以看出,寄存器的訪問(wèn)速度最快,容量最小,但成本卻最高;磁帶的訪問(wèn)速度最慢,容量最大,但是成本卻最低。通過(guò)合理搭配,可以形成一個(gè)性價(jià)比頗高的存儲(chǔ)架構(gòu)。
1.4 中斷機(jī)制
中斷是計(jì)算機(jī)里面的一個(gè)最為重要的機(jī)制,它也是操作系統(tǒng)獲得計(jì)算機(jī)控制權(quán)的根本保證。其基本原理是:設(shè)備在完成自己的任務(wù)后向CPU發(fā)出終端,CPU判斷優(yōu)先級(jí),然后確定是否響應(yīng)。如果響應(yīng),則執(zhí)行中斷服務(wù)程序,并在中斷服務(wù)程序執(zhí)行完后繼續(xù)執(zhí)行原來(lái)的程序。下圖簡(jiǎn)單地描述了中斷機(jī)制:

二、抽象
所謂抽象,就是在根本上存在但現(xiàn)實(shí)中不存在的東西。抽象來(lái)源于具體,但又超越具體。
操作系統(tǒng)提供的抽象來(lái)源于顯示,就是具體的計(jì)算機(jī)硬件,如CPU、內(nèi)存、I/O設(shè)備等等。但又超出這些現(xiàn)實(shí),給人提供了強(qiáng)于現(xiàn)實(shí)的東西,使人和應(yīng)用軟件感覺(jué)到更多、更好的硬件存在。
抽象不只是操作系統(tǒng)提供給用戶的一個(gè)存在,它也存在于操作系統(tǒng)內(nèi)部。操作系統(tǒng)內(nèi)部分為不同的功能模塊,而不同功能塊之間互相提供的也是抽象。想想在我們得實(shí)際開(kāi)發(fā)中,是不是也遵循著這樣類(lèi)似的原則?針對(duì)抽象編程?面向接口編程?依賴于抽象而不依賴于具體?

三、內(nèi)核態(tài)與用戶態(tài)
殘酷的現(xiàn)實(shí):世界上的人并非都是平等的,有些人生來(lái)占有的資源就多,而有的人占有的資源就很少。當(dāng)有些人來(lái)了,其他人就得讓出資源。程序亦是如此。
操作系統(tǒng)作為計(jì)算機(jī)的管理者,享有著更多的方便或權(quán)限。為了區(qū)分不同的程序的不同權(quán)限,人們發(fā)明了內(nèi)核態(tài)和用戶態(tài)的概念。
3.1 兩種狀態(tài)的概念
內(nèi)核態(tài)就是擁有資源多的狀態(tài)(或訪問(wèn)資源多的狀態(tài)),也稱為特權(quán)態(tài)。而用戶態(tài)則是非特權(quán)態(tài),在用戶態(tài)下訪問(wèn)的資源會(huì)受到限制。例如,要訪問(wèn)OS的內(nèi)核數(shù)據(jù)結(jié)構(gòu),如進(jìn)程表等,則需要在特權(quán)態(tài)下才能做到。如果只需要訪問(wèn)用戶程序里的數(shù)據(jù),則在用戶態(tài)下就可以了。
3.2 兩種狀態(tài)的優(yōu)勢(shì)
內(nèi)核態(tài):訪問(wèn)資源多,但可靠性、安全性要求高,維護(hù)管理都比較復(fù)雜;
用戶態(tài):訪問(wèn)資源有限,但可靠性、安全性要求低,維護(hù)起來(lái)比較簡(jiǎn)單;
那么,一個(gè)程序到底應(yīng)該運(yùn)行在內(nèi)核態(tài)還是用戶態(tài)呢?這取決于其對(duì)資源和效率的需求;下圖展示了Windows操作系統(tǒng)的內(nèi)核態(tài)與用戶態(tài)的界限,我們可以看到哪些需要在內(nèi)核態(tài)下運(yùn)行,哪些只在用戶態(tài)下運(yùn)行。

3.3 兩種狀態(tài)的本質(zhì)
計(jì)算機(jī)對(duì)于內(nèi)核態(tài)和用戶態(tài)的識(shí)別是通過(guò)CPU的一個(gè)狀態(tài)位來(lái)實(shí)現(xiàn)的,這個(gè)狀態(tài)位是CPU狀態(tài)字里面的一個(gè)字位。所謂的用戶態(tài)、內(nèi)核態(tài)實(shí)際是CPU的一種狀態(tài),而不是程序的狀態(tài)。通過(guò)設(shè)置該狀態(tài)字,可以使CPU處于內(nèi)核態(tài)、用戶態(tài)或者其他的子態(tài)(有的CPU有更多種子態(tài))。
換句話說(shuō):一個(gè)程序運(yùn)行時(shí),CPU是什么態(tài),這個(gè)程序就運(yùn)行在什么態(tài)。
那么,知道了是怎么實(shí)現(xiàn)的,那又是如何對(duì)用戶態(tài)的訪問(wèn)進(jìn)行限制的呢?在對(duì)用戶態(tài)下程序執(zhí)行的每一條指令進(jìn)行檢查,這種檢查又被稱為地址翻譯,即對(duì)程序發(fā)出的每一條指令都要經(jīng)過(guò)這個(gè)地址翻譯過(guò)程(你可以將其理解為我們?cè)趯?shí)際開(kāi)發(fā)中所作的權(quán)限管理,對(duì)用戶發(fā)出的每個(gè)操作請(qǐng)求首先都經(jīng)過(guò)一個(gè)Filter進(jìn)行過(guò)濾),通過(guò)對(duì)翻譯的控制,就可以限制程序?qū)Y源的訪問(wèn)。
四、操作系統(tǒng)結(jié)構(gòu)
4.1 單一體結(jié)構(gòu)
單一體結(jié)構(gòu)是最早期的結(jié)構(gòu),這時(shí)整個(gè)OS是一個(gè)巨大的單一體,運(yùn)行在內(nèi)核態(tài)下,為用戶提供服務(wù),如下圖所示。

但單一體結(jié)構(gòu)各功能塊之間關(guān)系復(fù)雜,修改困難,牽一發(fā)而動(dòng)全身,且容易形成循環(huán)調(diào)用造成死鎖,于是有了下面的層次關(guān)系。
4.2 層次化結(jié)構(gòu)
將操作系統(tǒng)的功能分成不同的層次,低層次的功能為緊鄰其上一個(gè)層次的功能提供服務(wù),而高層次的功能又為更高一個(gè)層次的功能提供服務(wù),如下圖所示。

4.3 微內(nèi)核結(jié)構(gòu)
從單一體和層次化結(jié)構(gòu)的圖中可以看出,操作系統(tǒng)的所有功能都在內(nèi)核態(tài)下運(yùn)行。但是,從用戶態(tài)轉(zhuǎn)為內(nèi)核態(tài)是有時(shí)間成本的,這樣就會(huì)造成OS的效率低下。于是,人們將操作系統(tǒng)的核心中的核心才放在內(nèi)核態(tài)運(yùn)行,其他功能都遷移到用戶態(tài)運(yùn)行,于是就有了下面的微內(nèi)核結(jié)構(gòu)。
五、進(jìn)程、內(nèi)存和文件
5.1 進(jìn)程

進(jìn)程是OS中的核心概念,它指的是一個(gè)運(yùn)動(dòng)中的程序。一個(gè)程序一旦在計(jì)算機(jī)里運(yùn)行起來(lái),它就稱為一個(gè)進(jìn)程。進(jìn)程與進(jìn)程之間可以進(jìn)行通信、同步、競(jìng)爭(zhēng),并在一定情況下可能形成死鎖。
5.2 內(nèi)存

內(nèi)存是另一個(gè)核心概念,它是進(jìn)程的存放場(chǎng)所。OS要做的就是對(duì)內(nèi)存進(jìn)行管理,使得數(shù)據(jù)讀寫(xiě)高效、安全、簡(jiǎn)單。
5.3 文件

文件是操作系統(tǒng)提供的外部存儲(chǔ)設(shè)備的抽象,它是程序和數(shù)據(jù)的最終存放地點(diǎn)。OS要做的就是讓用戶的數(shù)據(jù)存放變得容易、方便和可靠。
六、系統(tǒng)調(diào)用
操作系統(tǒng)是一個(gè)系統(tǒng)程序,即為別的程序提供服務(wù)的程序。那么,操作系統(tǒng)的服務(wù)是通過(guò)什么方式提供的呢?答案就是:系統(tǒng)調(diào)用(System Call)。
所謂系統(tǒng)調(diào)用就是:操作系統(tǒng)提供的API,用戶通過(guò)調(diào)用這些API即可獲得操作系統(tǒng)的服務(wù)。(想想是不是跟我們現(xiàn)在所作的什么Web Service、WCF、WebAPI、開(kāi)放API之類(lèi)的一致?)例如,如果用戶程序需要進(jìn)行讀磁盤(pán)的操作,在C程序代碼中可以使用如下語(yǔ)句來(lái)操作:
result = read(fd, buffer, nbytes);
這個(gè)read函數(shù)是C語(yǔ)言提供的庫(kù)函數(shù),而這個(gè)庫(kù)函數(shù)本身則是調(diào)用的操作系統(tǒng)的read系統(tǒng)調(diào)用。具體的系統(tǒng)調(diào)用過(guò)程不是我們討論的重點(diǎn),但我們還是可以通過(guò)下圖來(lái)看看這個(gè)read系統(tǒng)調(diào)用的過(guò)程。

參考資料

鄒恒明,《操作系統(tǒng)之哲學(xué)原理》,機(jī)械工業(yè)出版社
作者:周旭龍
出處:http://edisonchou.cnblogs.com
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文鏈接。

上一篇中我們了解了操作系統(tǒng)在計(jì)算機(jī)系統(tǒng)中扮演著魔術(shù)師和管理者的角色,它是一種軟件,運(yùn)行在硬件智商,又為更高層的應(yīng)用軟件提供服務(wù)。因此,對(duì)底層硬件的了解將幫助我們更好地掌握操作系統(tǒng)。那么,就跟隨本篇一起了解下計(jì)算機(jī)硬件基本知識(shí)、內(nèi)核態(tài)與用戶態(tài)、操作系統(tǒng)結(jié)構(gòu)、系統(tǒng)調(diào)用等基本概念吧,有了這些基礎(chǔ),我們?cè)偃W(xué)習(xí)進(jìn)程管理會(huì)有更好的基礎(chǔ)。

浙公網(wǎng)安備 33010602011771號(hào)