操作系统原理第二章:操作系统结构
目錄
- 1 計(jì)算機(jī)硬件
- 1.1 計(jì)算機(jī)體系結(jié)構(gòu)
- 1.2 中斷機(jī)制
- 1.3 I/O操作
- 2 硬件保護(hù)
- 2.1 實(shí)現(xiàn)保護(hù)兩狀態(tài)操作
- 2.2 CPU保護(hù)
- 3 操作系統(tǒng)服務(wù)
- 3.1 提供的服務(wù)
- 4 系統(tǒng)調(diào)用
- 4.1 系統(tǒng)調(diào)用的處理過程
- 4.2 系統(tǒng)調(diào)用傳遞參數(shù)的方式
- 4.3 系統(tǒng)調(diào)用的分類
- 5 操作系統(tǒng)結(jié)構(gòu)
- 5.1 層次化系統(tǒng)結(jié)構(gòu)
- 5.2 微內(nèi)核
1 計(jì)算機(jī)硬件
1.1 計(jì)算機(jī)體系結(jié)構(gòu)
計(jì)算機(jī)的多種設(shè)備都是通過系統(tǒng)總線 (system bus) 連接在一起,這樣就構(gòu)成了一個(gè)基本的計(jì)算機(jī)系統(tǒng),如下圖,可以發(fā)現(xiàn)圖中有很多的控制器 (controller),事實(shí)上每個(gè)設(shè)備都對應(yīng)著一個(gè)控制器 (controller)。
在這樣的體系結(jié)構(gòu)下,有如下特征:
- I/O 設(shè)備與 CPU 可并行運(yùn)行;
- 每一設(shè)備控制器負(fù)責(zé)一個(gè)設(shè)備類型;
- 每一設(shè)備控制器有一局部緩存 (local buffer);
- CPU 通過局部緩存與主存交換數(shù)據(jù);
- I/O 從設(shè)備到設(shè)備控制器有局部緩存;
- 設(shè)備控制器通過引起中斷 (interrupt) 通知 CPU 操作已完成。
1.2 中斷機(jī)制
中斷指的是 CPU 在執(zhí)行程序的時(shí)候出現(xiàn)了某些異常突發(fā)情況,需要緊急處理,CPU 必須暫停當(dāng)前的任務(wù)去處理緊急突發(fā)事件,處理完之后又返回原程序被打斷的地方去繼續(xù)執(zhí)行,中斷通常分為以下兩種:
- 硬件中斷 (hardware interrupt):設(shè)備控制器通知 CPU 它所做的操作已經(jīng)完成,會(huì)觸發(fā)一個(gè)中斷;
- 軟件中斷 (software interrupt):一種是異常,指的是系統(tǒng)在執(zhí)行過程中出現(xiàn)的錯(cuò)誤,如除 000 操作或無效的內(nèi)存訪問,另一種是系統(tǒng)調(diào)用 (system call)。
為什么需要中斷呢?為什么有了中斷后就能實(shí)現(xiàn)多道呢?如下圖,用戶程序一開始是在 CPU 上執(zhí)行的,當(dāng)執(zhí)行到某個(gè)時(shí)間點(diǎn)的時(shí)候(圖中橫軸 transfer done)會(huì)觸發(fā)一個(gè)中斷,CPU 在延遲一點(diǎn)時(shí)間后會(huì)收到這個(gè)中斷,收到中斷后會(huì)去處理這個(gè)中斷,也就是會(huì)從高電平的 user process executing 跳到低電平 I/O interrupt processing,中斷處理完成后又會(huì)回到原來的用戶程序繼續(xù)執(zhí)行,有了這樣的中斷機(jī)制帶來的好處是在 CPU 執(zhí)行的過程中,I/O 設(shè)備也在執(zhí)行,能夠使系統(tǒng)更高效,響應(yīng)性更好
為什么說有了通道技術(shù)和中斷機(jī)制后才真正地實(shí)現(xiàn)了多道?
- 通道是一種控制外部設(shè)備的硬件結(jié)構(gòu),它獨(dú)立于 CPU 運(yùn)行,因此 I/O 操作能和 CPU 并行運(yùn)行,但以前CPU 依然要發(fā)送指令詢問通道是否完成工作,若未完成,CPU 則要一直詢問直到通道工作完成,雖然引入通道技術(shù)提高了效率,但是并未實(shí)現(xiàn)真正的多道并行;
- 中斷和通道結(jié)合起來就實(shí)現(xiàn)了多道,CPU 啟動(dòng)通道傳輸數(shù)據(jù)后便去執(zhí)行其他程序的計(jì)算工作,而通道則進(jìn)行輸入輸出操作;當(dāng)通道工作結(jié)束時(shí),通過中斷機(jī)構(gòu)向 CPU 發(fā)出中斷請求,CPU 則暫停正在執(zhí)行的操作,對出現(xiàn)的中斷進(jìn)行處理,處理完后則繼續(xù)原來的工作,這樣,就真正做到了 CPU 與 I/O 設(shè)備并行工作。
現(xiàn)代操作系統(tǒng)是中斷驅(qū)動(dòng)的,中斷將控制權(quán)轉(zhuǎn)移到中斷服務(wù)程序,所謂中斷服務(wù)程序就是中斷出現(xiàn)后要去執(zhí)行處理的那一段程序代碼,實(shí)現(xiàn)控制權(quán)轉(zhuǎn)移的方法如下:
- 在中斷服務(wù)程序中有單獨(dú)的一段代碼,來確定當(dāng)前中斷屬于哪種類型的中斷;
- 會(huì)有一個(gè)通用的歷程去檢查中斷信息,當(dāng)中斷發(fā)生時(shí),就會(huì)調(diào)用中斷服務(wù)程序;
- 當(dāng)檢查到中斷時(shí),要求能快速處理,這里的實(shí)現(xiàn)方法是利用中斷向量 (interrupt vector),中斷向量就存儲了服務(wù)歷程的地址。
下面的表列出了常見的中斷向量,中斷號及其功能:
| 00~03 | 0 | 除法溢出中斷 |
| 04~07 | 1 | 單步 (用于DEBUG) |
| 08~0B | 2 | 非屏蔽中斷 (NMI) |
| 0C~0F | 3 | 斷點(diǎn)中斷 (用于DEBUG) |
| 10~13 | 4 | 溢出中斷 |
| 14~17 | 5 | 打印屏幕 |
| 18~1F | 6,7 | 保留 |
1.3 I/O操作
使用 I/O 操作需要具備以下條件:
- 設(shè)備與設(shè)備控制器相連;
- 本地緩沖器,一組寄存器;
- 設(shè)備驅(qū)動(dòng)程序。
有兩種常見的 I/O 操作:
- 同步 (Synchronous):當(dāng)啟動(dòng) I/O 操作時(shí),直到 I/O 操作結(jié)束后,控制權(quán)才會(huì)返回到用戶程序,也就是說你運(yùn)行了一個(gè)程序,但突然觸發(fā)了 I/O,那么你的程序要等待這次 I/O 操作結(jié)束后,才會(huì)運(yùn)行;
- 異步 (Asynchronous):當(dāng)啟動(dòng) I/O 操作時(shí),控制權(quán)會(huì)立馬轉(zhuǎn)到用戶程序,那么此時(shí) I/O 操作是否運(yùn)行結(jié)束是通過中斷機(jī)制來實(shí)現(xiàn)的。
下圖是同步和異步的比較:
2 硬件保護(hù)
當(dāng)計(jì)算機(jī)執(zhí)行過程中,計(jì)算機(jī)硬件需要提供一些支持能夠保證計(jì)算機(jī)能夠正確的運(yùn)行,在早期的操作系統(tǒng)中為單用戶系統(tǒng),程序員可完全控制系統(tǒng),在后來的批處理操作系統(tǒng)中,通過讀取卡片來錄入程序和數(shù)據(jù),此時(shí)有可能會(huì)把其他程序當(dāng)作當(dāng)前程序的數(shù)據(jù)輸入進(jìn)去了,在這個(gè)時(shí)候就需要提供一些保護(hù),而后的多道批處理系統(tǒng)就更為復(fù)雜,它運(yùn)行多個(gè)程序并發(fā)執(zhí)行,多個(gè)程序競爭某些資源,當(dāng)一個(gè)程序在執(zhí)行過程中,它有可能會(huì)修改到其他程序的代碼或數(shù)據(jù),甚至可能會(huì)修改操作系統(tǒng),這時(shí)為了能夠讓計(jì)算機(jī)正確執(zhí)行,必須提供一些保護(hù)。
那么解決的方法就是當(dāng)程序在執(zhí)行非法指令或訪問不屬于自己的地址空間內(nèi)存時(shí)把控制權(quán)交給操作系統(tǒng),甚至情況嚴(yán)重時(shí)可以直接終止程序。
2.1 實(shí)現(xiàn)保護(hù)兩狀態(tài)操作
共享系統(tǒng)資源要求操作系統(tǒng)確保當(dāng)前程序不會(huì)引起其他程序的運(yùn)行錯(cuò)誤,我們的方法是兩狀態(tài)操作,即至少在兩個(gè)運(yùn)行狀態(tài)之間提供硬件支持:
- 用戶態(tài) (User mode):代表用戶執(zhí)行;
- 管態(tài),特權(quán)模式或系統(tǒng)模式 (Monitor mode):代表操作系統(tǒng)執(zhí)行。
那么計(jì)算機(jī)是如何區(qū)分這兩種狀態(tài)呢?在計(jì)算機(jī)中實(shí)現(xiàn)的方法很簡單,只需要一個(gè)位的 0 和 1 就可以區(qū)分,這個(gè)位叫做模式位 (mode bit) ,表示當(dāng)前模式 monitor (0) or user (1),這個(gè)模式位可以放在 PSW 中(PSW 是 Program Status Word 的縮寫,即程序狀態(tài)字),當(dāng)系統(tǒng)引導(dǎo)啟動(dòng)時(shí),硬件處于管態(tài),在用戶模式下執(zhí)行用戶進(jìn)程,如下圖:
若在用戶程序中出現(xiàn)了問題,就會(huì)觸發(fā)中斷,出現(xiàn)中斷或陷阱,硬件切換到管態(tài),一旦切換到管態(tài),控制權(quán)就轉(zhuǎn)交給了操作系統(tǒng),由操作系統(tǒng)來處理這些中斷錯(cuò)誤信息,那么操作系統(tǒng)如何知道用戶程序執(zhí)行了非法操作呢?在操作系統(tǒng)中把只能由管態(tài)執(zhí)行的指令稱為特權(quán)指令 (Privileged instructions),若用戶程序執(zhí)行到了特權(quán)指令,那么就可判斷當(dāng)前操作為非法操作,可能會(huì)引發(fā)錯(cuò)誤,但是有時(shí)候用戶程序要執(zhí)行特權(quán)指令怎么辦?操作系統(tǒng)中提供了系統(tǒng)調(diào)用 (system call) 方式,可以讓用戶程序合法的使用特權(quán)指令,系統(tǒng)調(diào)用實(shí)際上會(huì)觸發(fā)軟中斷,那么就會(huì)從用戶態(tài)切換到了管態(tài),控制權(quán)也轉(zhuǎn)交給了操作系統(tǒng)。在處于管態(tài)下,特權(quán)指令是可以直接執(zhí)行的。
使用這種方法,也可以對所有的 I/O 操作進(jìn)行保護(hù),我們把所有的 I/O 操作定義為特權(quán)指令,用戶不能直接用 I/O 指令,必須通過系統(tǒng)調(diào)用,確保用戶程序不能在管態(tài)下控制計(jì)算機(jī),下圖是系統(tǒng)調(diào)用執(zhí)行 I/O 操作的過程:
既然系統(tǒng)調(diào)用是通過軟中斷來實(shí)現(xiàn)的,那么也要保護(hù)中斷機(jī)制不能被破壞,所以必須保護(hù)中斷向量和中斷服務(wù)程序,而程序都是在內(nèi)存中,所以問題也轉(zhuǎn)換為了對某些內(nèi)存的保護(hù),因此要?jiǎng)澐诌M(jìn)程能夠運(yùn)行的合法空間,劃分合法空間用到了兩個(gè)寄存器,通俗來講這兩個(gè)寄存器就是來劃分合法空間地址的起點(diǎn)和空間的大小,有了這兩個(gè)值,那么就唯一確定了這一塊內(nèi)存空間:
- 基址寄存器 (base register):指出起始地址;
- 界限寄存器 (limit register):指出空間大小。
如下圖的 job2 就被兩個(gè)寄存器唯一確定了:
在具體實(shí)現(xiàn)時(shí),CPU每得到一個(gè)地址,都需要去檢測該地址的合法性,流程圖如下:
2.2 CPU保護(hù)
需防止用戶程序陷入死循環(huán)或者不調(diào)用系統(tǒng)服務(wù)且不將控制權(quán)返回到操作系統(tǒng),解決的方法就是使用定時(shí)器 (timer),也就是說當(dāng)從管態(tài)切換到用戶態(tài)時(shí),設(shè)置了一個(gè)定時(shí)器,當(dāng)定時(shí)器時(shí)間到的時(shí)候就會(huì)觸發(fā)一個(gè)中斷,那么控制權(quán)就會(huì)轉(zhuǎn)交給操作系統(tǒng),操作系統(tǒng)又重新獲得了控制權(quán)。
3 操作系統(tǒng)服務(wù)
操作系統(tǒng)是覆蓋在計(jì)算機(jī)硬件系統(tǒng)上的第一層軟件,對于這個(gè)復(fù)雜的軟件系統(tǒng),必須清楚其設(shè)計(jì)的目標(biāo)是什么,應(yīng)該提供哪些服務(wù),通常會(huì)考慮以下三個(gè)方面:
- 提供的服務(wù) (services it provides);
- 為用戶和程序提供的接口 (interface to users and programmers);
- 各組成部分及其相互連接 (components and their interconnections)。
3.1 提供的服務(wù)
針對用戶要提供的服務(wù):
- 用戶接口 (User interface):通過這些接口,用戶能夠訪問到操作系統(tǒng)提供的功能,幾乎所有的操作系統(tǒng)都有用戶接口,常見的表現(xiàn)形式分為命令行 Command-Line (CLI) 和 圖形用戶界面 Graphics User Interface (GUI);
- 執(zhí)行程序 (Program execution):能夠把程序調(diào)入內(nèi)存,并轉(zhuǎn)交給 CPU 處理的能力;
- I/O操作 (I/O operations):由于用戶程序不能直接執(zhí)行 I/O 操作,操作系統(tǒng)必須提供手段完成 I/O 操作;
- 文件系統(tǒng)操作 (File-system manipulation):讀、寫、創(chuàng)建和刪除文件的能力;
- 通信 (Communications):運(yùn)行的進(jìn)程在同一計(jì)算機(jī)或由網(wǎng)絡(luò)連接的不同系統(tǒng)中交換信息。通過共享存儲器或消息傳遞實(shí)現(xiàn);
- 錯(cuò)誤檢測 (Error detection):探測在 CPU 與內(nèi)存硬件中,在 I/O 設(shè)備中,或在用戶程序中的錯(cuò)誤,確保正確運(yùn)算。
針對提高系統(tǒng)效率要提供的服務(wù):
- 資源分配 (Resource allocation):把資源分配給多個(gè)用戶或多個(gè)同時(shí)運(yùn)行的作業(yè);
- 帳務(wù) (Accounting):跟蹤和記錄用戶對資源的使用,用于帳單和統(tǒng)計(jì)哪些資源已經(jīng)分配出去了,哪些資源是可用的等等;
- 保護(hù) (Protection):確保對資源的所有訪問均在控制中。
下圖是整個(gè)操作系統(tǒng)提供的服務(wù)結(jié)構(gòu)圖:
4 系統(tǒng)調(diào)用
根據(jù)上面的服務(wù)結(jié)構(gòu)圖可以找到 system calls,他處在的位置是操作系統(tǒng)眾多服務(wù)之上,用戶接口之下,它的功能就是給用戶提供方法來使用系統(tǒng)服務(wù),系統(tǒng)調(diào)用提供在運(yùn)行程序和操作系統(tǒng)之間的接口,系統(tǒng)調(diào)用由于接近底層,不方便使用 ,并且不同的操作系統(tǒng)的系統(tǒng)調(diào)用使用都有差別,所以實(shí)際上大多數(shù)程序員在開發(fā)時(shí)都是直接使用 API ( level Application Program Interface),API 實(shí)際上就是系統(tǒng)調(diào)用的封裝,里面可能封裝了一個(gè)或多個(gè)系統(tǒng)調(diào)用,常見的系統(tǒng) API 有 Win32 API for Windows,Java API for the Java virtual machine (JVM) 等等。
4.1 系統(tǒng)調(diào)用的處理過程
系統(tǒng)調(diào)用的處理過程如下:
不同的系統(tǒng)調(diào)用對應(yīng)著不同的子程序代碼段,我們通過入口地址表,使每個(gè)入口地址與相應(yīng)的系統(tǒng)程序?qū)?yīng),陷入處理程序用系統(tǒng)調(diào)用功能號查找入口地址表,得到該系統(tǒng)程序的入口地址,并執(zhí)行之,系統(tǒng)調(diào)用處理結(jié)束后,要恢復(fù)處理機(jī)現(xiàn)場,從而用戶程序可以繼續(xù)執(zhí)行,過程如下圖所示:
4.2 系統(tǒng)調(diào)用傳遞參數(shù)的方式
在系統(tǒng)調(diào)用時(shí),難免需要傳遞一些參數(shù)來實(shí)現(xiàn)特定的功能,有三種常用方式用于在運(yùn)行程序和操作系統(tǒng)之間的參數(shù)傳遞:
- 寄存器中的參數(shù)傳遞,寄存器容量較小,故只適用于少量且小的參數(shù)傳遞;
- 參數(shù)存在內(nèi)存的一張表中,表地址作為寄存器的參數(shù)傳遞,如下圖所示,若傳遞的參數(shù)比較大的時(shí)候,先把參數(shù)放到內(nèi)存里,這些參數(shù)在內(nèi)存中的地址就放在寄存器 (register) 中,當(dāng)使用系統(tǒng)調(diào)用時(shí)就會(huì)查找寄存器然后取出地址再轉(zhuǎn)到內(nèi)存中去尋找參數(shù):
- 程序把參數(shù)壓入棧,由操作系統(tǒng)彈出。
4.3 系統(tǒng)調(diào)用的分類
系統(tǒng)調(diào)用的分類如下:
- 進(jìn)程控制 (process control);
- 文件管理 (file management);
- 設(shè)備管理 (device management);
- 信息維護(hù) (information maintenance );
- 通信 (communications)。
5 操作系統(tǒng)結(jié)構(gòu)
這一節(jié)主要討論的問題是操作系統(tǒng)中各個(gè)組件之間的關(guān)系,操作系統(tǒng)的早期非常簡單,如 MS-DOS 以最小的空間提供最多的功能,它并不劃分模塊。
在 MS-DOS 中,應(yīng)用程序可直接訪問 BIOS 例程,來直接操縱設(shè)備,當(dāng)然這受限于當(dāng)時(shí)的硬件,Intel8088 沒提供雙模式和硬件保護(hù),這使得 DOS 別無選擇只能任由應(yīng)用程序訪問 BIOS,如下圖所示:
而在 UNIX 中,受硬件功能限制,早期 UNIX 只是有限的結(jié)構(gòu)化。UNIX包括2個(gè)分離的部分:
- 系統(tǒng)程序 (Systems programs );
- 內(nèi)核 (The kernel):包括了在物理硬件之上,系統(tǒng)調(diào)用之下的一切。提供文件系統(tǒng), CPU調(diào)度,存儲管理,和其他操作系統(tǒng)功能 ;每一層有大量的功能,如下圖所示:
5.1 層次化系統(tǒng)結(jié)構(gòu)
操作系統(tǒng)劃分為若干層,在低層上構(gòu)建高層。底層(000 層)為硬件,最高層( NNN 層)為用戶層,在設(shè)計(jì)時(shí)考慮模塊化,層的選擇是每層只使用低層次的功能和服務(wù),由此分層的基本原則是每一層都使用其底層所提供的功能和服務(wù),以便于系統(tǒng)調(diào)試和驗(yàn)證,如下圖所示:
最早使用層次化操作系統(tǒng)的是 THE 操作系統(tǒng),它有如下六層:
分層有如下優(yōu)點(diǎn):
- 低層和高層可分別實(shí)現(xiàn)(便于擴(kuò)充);
- 高層錯(cuò)誤不會(huì)影響到低層,便于調(diào)試、利于功能的增刪改;
- 調(diào)用關(guān)系清晰(高層對低層單向依賴),避免遞歸調(diào)用,有利于保證設(shè)計(jì)和實(shí)現(xiàn)的正確性。
分層有如下缺點(diǎn):
- 系統(tǒng)中所有進(jìn)程的控制轉(zhuǎn)移、通訊等任務(wù)全部交給系統(tǒng)的核心去管理,要花費(fèi)一定的代價(jià)。
5.2 微內(nèi)核
微內(nèi)核 (Microkernels) 對層次進(jìn)行進(jìn)一步的劃分,通過劃分系統(tǒng)程序和用戶程序,把所有不必要的部件移出內(nèi)核,形成一個(gè)小內(nèi)核,微內(nèi)核提供最少量的進(jìn)程管理、存儲管理,以及通信功能。
微內(nèi)核操作系統(tǒng)由兩大部分組成:
- 運(yùn)行在核心態(tài)的內(nèi)核,即保留下來的核心功能;
- 運(yùn)行在用戶態(tài)并以 C/S 方式運(yùn)行的進(jìn)程層,即移出去的不必要功能。
移出去的功能通過一種 Server 運(yùn)行,如下圖所示:
微內(nèi)核與傳統(tǒng)操作系統(tǒng)相比,有如下特點(diǎn):
- 內(nèi)核精巧:通常內(nèi)核只由任務(wù)管理、虛存管理和進(jìn)程間通信 333 個(gè)部分組成。傳統(tǒng)操作系統(tǒng)內(nèi)核中的許多部分都被移出內(nèi)核,采取服務(wù)器方式實(shí)現(xiàn);
- 面向多處理機(jī)和分布式系統(tǒng):基于微內(nèi)核的操作系統(tǒng),在內(nèi)核中引入了多處理機(jī)調(diào)度和管理機(jī)制,并引入了細(xì)粒度并發(fā)機(jī)制,即線程,使得多個(gè)處理機(jī)可以在同一個(gè)任務(wù)中并行地執(zhí)行;
- 基于客戶/服務(wù)器體系結(jié)構(gòu):在微內(nèi)核結(jié)構(gòu)的操作系統(tǒng)中,任務(wù)間通信機(jī)制,消息機(jī)制是系統(tǒng)的基礎(chǔ),操作系統(tǒng)的各種功能都以服務(wù)器方式實(shí)現(xiàn),向用戶提供服務(wù)。用戶對服務(wù)器的請求是以消息傳遞的方式傳給服務(wù)器的。
總結(jié)
以上是生活随笔為你收集整理的操作系统原理第二章:操作系统结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统原理第一章:操作系统概述
- 下一篇: 操作系统原理第三章:进程