操作系統原理第二章:操作系統結構

1 計算機硬件

1.1 計算機體系結構

計算機的多種設備都是通過系統總線 (system bus) 連接在一起,這樣就構成了一個基本的計算機系統,如下圖,可以發現圖中有很多的控制器 (controller),事實上每個設備都對應着一個控制器 (controller)
在這裏插入圖片描述

在這樣的體系結構下,有如下特徵:

  • I/O 設備與 CPU 可並行運行;
  • 每一設備控制器負責一個設備類型;
  • 每一設備控制器有一局部緩存 (local buffer)
  • CPU 通過局部緩存與主存交換數據;
  • I/O 從設備到設備控制器有局部緩存;
  • 設備控制器通過引起中斷 (interrupt) 通知 CPU 操作已完成。

1.2 中斷機制

中斷指的是 CPU 在執行程序的時候出現了某些異常突發情況,需要緊急處理,CPU 必須暫停當前的任務去處理緊急突發事件,處理完之後又返回原程序被打斷的地方去繼續執行,中斷通常分爲以下兩種:

  • 硬件中斷 (hardware interrupt):設備控制器通知 CPU 它所做的操作已經完成,會觸發一箇中斷;
  • 軟件中斷 (software interrupt):一種是異常,指的是系統在執行過程中出現的錯誤,如除 00 操作或無效的內存訪問,另一種是系統調用 (system call)。

爲什麼需要中斷呢?爲什麼有了中斷後就能實現多道呢?如下圖,用戶程序一開始是在 CPU 上執行的,當執行到某個時間點的時候(圖中橫軸 transfer done)會觸發一箇中斷,CPU 在延遲一點時間後會收到這個中斷,收到中斷後會去處理這個中斷,也就是會從高電平的 user process executing 跳到低電平 I/O interrupt processing,中斷處理完成後又會回到原來的用戶程序繼續執行,有了這樣的中斷機制帶來的好處是在 CPU 執行的過程中,I/O 設備也在執行,能夠使系統更高效,響應性更好
在這裏插入圖片描述

爲什麼說有了通道技術和中斷機制後才真正地實現了多道?

  • 通道是一種控制外部設備的硬件結構,它獨立於 CPU 運行,因此 I/O 操作能和 CPU 並行運行,但以前CPU 依然要發送指令詢問通道是否完成工作,若未完成,CPU 則要一直詢問直到通道工作完成,雖然引入通道技術提高了效率,但是並未實現真正的多道並行;
  • 中斷和通道結合起來就實現了多道,CPU 啓動通道傳輸數據後便去執行其他程序的計算工作,而通道則進行輸入輸出操作;當通道工作結束時,通過中斷機構向 CPU 發出中斷請求,CPU 則暫停正在執行的操作,對出現的中斷進行處理,處理完後則繼續原來的工作,這樣,就真正做到了 CPU 與 I/O 設備並行工作。

現代操作系統是中斷驅動的,中斷將控制權轉移到中斷服務程序,所謂中斷服務程序就是中斷出現後要去執行處理的那一段程序代碼,實現控制權轉移的方法如下:

  • 在中斷服務程序中有單獨的一段代碼,來確定當前中斷屬於哪種類型的中斷;
  • 會有一個通用的歷程去檢查中斷信息,當中斷髮生時,就會調用中斷服務程序;
  • 當檢查到中斷時,要求能快速處理,這裏的實現方法是利用中斷向量 (interrupt vector),中斷向量就存儲了服務歷程的地址。

下面的表列出了常見的中斷向量,中斷號及其功能:

中斷向量 中斷號 中斷功能
00~03 0 除法溢出中斷
04~07 1 單步 (用於DEBUG)
08~0B 2 非屏蔽中斷 (NMI)
0C~0F 3 斷點中斷 (用於DEBUG)
10~13 4 溢出中斷
14~17 5 打印屏幕
18~1F 6,7 保留

1.3 I/O操作

使用 I/O 操作需要具備以下條件:

  • 設備與設備控制器相連;
  • 本地緩衝器,一組寄存器;
  • 設備驅動程序。

有兩種常見的 I/O 操作:

  • 同步 (Synchronous):當啓動 I/O 操作時,直到 I/O 操作結束後,控制權纔會返回到用戶程序,也就是說你運行了一個程序,但突然觸發了 I/O,那麼你的程序要等待這次 I/O 操作結束後,纔會運行;
  • 異步 (Asynchronous):當啓動 I/O 操作時,控制權會立馬轉到用戶程序,那麼此時 I/O 操作是否運行結束是通過中斷機制來實現的。

下圖是同步和異步的比較:
在這裏插入圖片描述

2 硬件保護

當計算機執行過程中,計算機硬件需要提供一些支持能夠保證計算機能夠正確的運行,在早期的操作系統中爲單用戶系統,程序員可完全控制系統,在後來的批處理操作系統中,通過讀取卡片來錄入程序和數據,此時有可能會把其他程序當作當前程序的數據輸入進去了,在這個時候就需要提供一些保護,而後的多道批處理系統就更爲複雜,它運行多個程序併發執行,多個程序競爭某些資源,當一個程序在執行過程中,它有可能會修改到其他程序的代碼或數據,甚至可能會修改操作系統,這時爲了能夠讓計算機正確執行,必須提供一些保護。

那麼解決的方法就是當程序在執行非法指令或訪問不屬於自己的地址空間內存時把控制權交給操作系統,甚至情況嚴重時可以直接終止程序。

2.1 實現保護兩狀態操作

共享系統資源要求操作系統確保當前程序不會引起其他程序的運行錯誤,我們的方法是兩狀態操作,即至少在兩個運行狀態之間提供硬件支持:

  • 用戶態 (User mode):代表用戶執行;
  • 管態,特權模式或系統模式 (Monitor mode):代表操作系統執行。

那麼計算機是如何區分這兩種狀態呢?在計算機中實現的方法很簡單,只需要一個位的 01 就可以區分,這個位叫做模式位 (mode bit) ,表示當前模式 monitor (0) or user (1),這個模式位可以放在 PSW 中(PSW 是 Program Status Word 的縮寫,即程序狀態字),當系統引導啓動時,硬件處於管態,在用戶模式下執行用戶進程,如下圖:
在這裏插入圖片描述
若在用戶程序中出現了問題,就會觸發中斷,出現中斷或陷阱,硬件切換到管態,一旦切換到管態,控制權就轉交給了操作系統,由操作系統來處理這些中斷錯誤信息,那麼操作系統如何知道用戶程序執行了非法操作呢?在操作系統中把只能由管態執行的指令稱爲特權指令 (Privileged instructions),若用戶程序執行到了特權指令,那麼就可判斷當前操作爲非法操作,可能會引發錯誤,但是有時候用戶程序要執行特權指令怎麼辦?操作系統中提供了系統調用 (system call) 方式,可以讓用戶程序合法的使用特權指令,系統調用實際上會觸發軟中斷,那麼就會從用戶態切換到了管態,控制權也轉交給了操作系統。在處於管態下,特權指令是可以直接執行的。

使用這種方法,也可以對所有的 I/O 操作進行保護,我們把所有的 I/O 操作定義爲特權指令,用戶不能直接用 I/O 指令,必須通過系統調用,確保用戶程序不能在管態下控制計算機,下圖是系統調用執行 I/O 操作的過程:
在這裏插入圖片描述
既然系統調用是通過軟中斷來實現的,那麼也要保護中斷機制不能被破壞,所以必須保護中斷向量和中斷服務程序,而程序都是在內存中,所以問題也轉換爲了對某些內存的保護,因此要劃分進程能夠運行的合法空間,劃分合法空間用到了兩個寄存器,通俗來講這兩個寄存器就是來劃分合法空間地址的起點和空間的大小,有了這兩個值,那麼就唯一確定了這一塊內存空間:

  • 基址寄存器 (base register):指出起始地址;
  • 界限寄存器 (limit register):指出空間大小。

如下圖的 job2 就被兩個寄存器唯一確定了:
在這裏插入圖片描述
在具體實現時,CPU每得到一個地址,都需要去檢測該地址的合法性,流程圖如下:
在這裏插入圖片描述

2.2 CPU保護

需防止用戶程序陷入死循環或者不調用系統服務且不將控制權返回到操作系統,解決的方法就是使用定時器 (timer),也就是說當從管態切換到用戶態時,設置了一個定時器,當定時器時間到的時候就會觸發一箇中斷,那麼控制權就會轉交給操作系統,操作系統又重新獲得了控制權。

3 操作系統服務

操作系統是覆蓋在計算機硬件系統上的第一層軟件,對於這個複雜的軟件系統,必須清楚其設計的目標是什麼,應該提供哪些服務,通常會考慮以下三個方面:

  • 提供的服務 (services it provides);
  • 爲用戶和程序提供的接口 (interface to users and programmers);
  • 各組成部分及其相互連接 (components and their interconnections)。

3.1 提供的服務

針對用戶要提供的服務:

  • 用戶接口 (User interface):通過這些接口,用戶能夠訪問到操作系統提供的功能,幾乎所有的操作系統都有用戶接口,常見的表現形式分爲命令行 Command-Line (CLI)圖形用戶界面 Graphics User Interface (GUI)
  • 執行程序 (Program execution):能夠把程序調入內存,並轉交給 CPU 處理的能力;
  • I/O操作 (I/O operations):由於用戶程序不能直接執行 I/O 操作,操作系統必須提供手段完成 I/O 操作;
  • 文件系統操作 (File-system manipulation):讀、寫、創建和刪除文件的能力;
  • 通信 (Communications):運行的進程在同一計算機或由網絡連接的不同系統中交換信息。通過共享存儲器或消息傳遞實現;
  • 錯誤檢測 (Error detection):探測在 CPU 與內存硬件中,在 I/O 設備中,或在用戶程序中的錯誤,確保正確運算。

針對提高系統效率要提供的服務:

  • 資源分配 (Resource allocation):把資源分配給多個用戶或多個同時運行的作業;
  • 帳務 (Accounting):跟蹤和記錄用戶對資源的使用,用於帳單和統計哪些資源已經分配出去了,哪些資源是可用的等等;
  • 保護 (Protection):確保對資源的所有訪問均在控制中。

下圖是整個操作系統提供的服務結構圖:
在這裏插入圖片描述

4 系統調用

根據上面的服務結構圖可以找到 system calls,他處在的位置是操作系統衆多服務之上,用戶接口之下,它的功能就是給用戶提供方法來使用系統服務,系統調用提供在運行程序和操作系統之間的接口,系統調用由於接近底層,不方便使用 ,並且不同的操作系統的系統調用使用都有差別,所以實際上大多數程序員在開發時都是直接使用 API ( level Application Program Interface),API 實際上就是系統調用的封裝,裏面可能封裝了一個或多個系統調用,常見的系統 API 有 Win32 API for Windows,Java API for the Java virtual machine (JVM) 等等。

4.1 系統調用的處理過程

系統調用的處理過程如下:

  1. 當用戶使用系統調用時,產生一條相應的指令;
  2. CPU 在執行到該指令時發生中斷,發出有關的信號給陷入處理機構;
  3. 處理機構在收到了 CPU 發來的信號後,啓動相關的處理程序去完成該系統調用所要求的功能;
  4. 在處理系統調用之前,陷入處理機構還需保存處理機現場(PSW、PC、系統調用號、用戶棧指針、通用寄存器、用戶定義的參數等)。

不同的系統調用對應着不同的子程序代碼段,我們通過入口地址表,使每個入口地址與相應的系統程序對應,陷入處理程序用系統調用功能號查找入口地址表,得到該系統程序的入口地址,並執行之,系統調用處理結束後,要恢復處理機現場,從而用戶程序可以繼續執行,過程如下圖所示:
在這裏插入圖片描述

4.2 系統調用傳遞參數的方式

在系統調用時,難免需要傳遞一些參數來實現特定的功能,有三種常用方式用於在運行程序和操作系統之間的參數傳遞:

  • 寄存器中的參數傳遞,寄存器容量較小,故只適用於少量且小的參數傳遞;
  • 參數存在內存的一張中,表地址作爲寄存器的參數傳遞,如下圖所示,若傳遞的參數比較大的時候,先把參數放到內存裏,這些參數在內存中的地址就放在寄存器 (register) 中,當使用系統調用時就會查找寄存器然後取出地址再轉到內存中去尋找參數:
    在這裏插入圖片描述
  • 程序把參數壓入,由操作系統彈出。

4.3 系統調用的分類

系統調用的分類如下:

  • 進程控制 (process control);
  • 文件管理 (file management);
  • 設備管理 (device management);
  • 信息維護 (information maintenance );
  • 通信 (communications)。

5 操作系統結構

這一節主要討論的問題是操作系統中各個組件之間的關係,操作系統的早期非常簡單,如 MS-DOS 以最小的空間提供最多的功能,它並不劃分模塊。

在 MS-DOS 中,應用程序可直接訪問 BIOS 例程,來直接操縱設備,當然這受限於當時的硬件,Intel8088 沒提供雙模式和硬件保護,這使得 DOS 別無選擇只能任由應用程序訪問 BIOS,如下圖所示:
在這裏插入圖片描述
而在 UNIX 中,受硬件功能限制,早期 UNIX 只是有限的結構化。UNIX包括2個分離的部分:

  • 系統程序 (Systems programs );
  • 內核 (The kernel):包括了在物理硬件之上,系統調用之下的一切。提供文件系統, CPU調度,存儲管理,和其他操作系統功能 ;每一層有大量的功能,如下圖所示:
    在這裏插入圖片描述

5.1 層次化系統結構

操作系統劃分爲若干層,在低層上構建高層。底層(00 層)爲硬件,最高層( NN 層)爲用戶層,在設計時考慮模塊化,層的選擇是每層只使用低層次的功能和服務,由此分層的基本原則是每一層都使用其底層所提供的功能和服務,以便於系統調試和驗證,如下圖所示:
在這裏插入圖片描述

最早使用層次化操作系統的是 THE 操作系統,它有如下六層:
在這裏插入圖片描述
分層有如下優點:

  • 低層和高層可分別實現(便於擴充);
  • 高層錯誤不會影響到低層,便於調試、利於功能的增刪改;
  • 調用關係清晰(高層對低層單向依賴),避免遞歸調用,有利於保證設計和實現的正確性。

分層有如下缺點:

  • 系統中所有進程的控制轉移、通訊等任務全部交給系統的核心去管理,要花費一定的代價。

5.2 微內核

微內核 (Microkernels) 對層次進行進一步的劃分,通過劃分系統程序和用戶程序,把所有不必要的部件移出內核,形成一個小內核,微內核提供最少量的進程管理、存儲管理,以及通信功能。

微內核操作系統由兩大部分組成:

  • 運行在覈心態的內核,即保留下來的核心功能;
  • 運行在用戶態並以 C/S 方式運行的進程層,即移出去的不必要功能。

移出去的功能通過一種 Server 運行,如下圖所示:
在這裏插入圖片描述

微內核與傳統操作系統相比,有如下特點:

  • 內核精巧:通常內核只由任務管理、虛存管理和進程間通信 33 個部分組成。傳統操作系統內核中的許多部分都被移出內核,採取服務器方式實現;
  • 面向多處理機和分佈式系統:基於微內核的操作系統,在內核中引入了多處理機調度和管理機制,並引入了細粒度併發機制,即線程,使得多個處理機可以在同一個任務中並行地執行;
  • 基於客戶/服務器體系結構:在微內核結構的操作系統中,任務間通信機制,消息機制是系統的基礎,操作系統的各種功能都以服務器方式實現,向用戶提供服務。用戶對服務器的請求是以消息傳遞的方式傳給服務器的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章