作業系統精髓與設計原理-作業系統概述
本文若未註明均摘抄自《作業系統精髓與設計原理》:William Stallings著,陳向群、陳渝譯,機械工業出版社出版第六版
2 作業系統概述
關鍵詞 | |||
---|---|---|---|
批處理 | 管程 | 實體地址 | 序列處理 |
批處理系統 | 單體核心 | 特權指令 | 對稱多處理 |
執行上下文 | 多道批處理系統 | 程序 | 任務 |
中斷 | 多道程式設計 | 程序狀態 | 執行緒 |
作業 | 多工 | 實地址 | 分時 |
作業控制語言 | 多執行緒 | 常駐監控程式 | 分時系統 |
核心 | 時間片輪轉 | 但到程式設計 | 記憶體管理 |
作業系統 | 排程 | 虛地址 | 微核心 |
2.1 作業系統的目標和功能
作業系統是應用程式和計算機之間的介面,它的目標是方便、有效、可擴充套件。
2.1.1 作為使用者/計算機介面的作業系統
應用程式的使用者,即終端使用者,通常不需要關心計算機的硬體細節。
如果完全用控制計算機硬體的機器指令開發應用程式,將是非常複雜的任務。為了簡化這個任務,作業系統提供了以下幾個方面的服務:
- 程式開發:作業系統提供了各種各樣的工具和服務,如編輯器和偵錯程式,用於幫助程式設計師開發程式。不屬於作業系統核心的一部分
- 程式執行:作業系統為使用者處理排程問題,如執行一個程式前的載入記憶體,初始化等工作
- I/O裝置訪問
- 檔案訪問控制
- 系統訪問
- 錯誤檢測和響應:計算機執行時發生的內部外部硬體錯誤,作業系統應當有所響應以清除錯誤條件,使其對正在執行的程式影響最小
- 監控和記錄
2.1.2 作為資源管理器的作業系統
一臺計算機就是一組資源,這些資源用於對資料的移動、儲存和處理, 以及對這些功能的控制。作業系統負責管理這些資源。
作業系統也是一種軟體,與普通計算機軟體原理相同,因此也經常會釋放控制,而且必須依賴處理器才能恢復控制。
2.2 作業系統的發展
2.2.1 序列處理
原始的序列系統存在兩個影響效能的問題:
- 排程:大多數裝置使用一個硬拷貝的登記表預定機器時間,預定1小時但45分鐘執行完,就只能閒置15分鐘。預定45分鐘但執行1小時,解決問題的過程就會被終止。
- 準備時間:一個程式稱作“作業”,作業的每一步可能都需要安裝或解除安裝磁帶,準備卡片組,準備程式執行需要大量的時間
2.2.2 簡單批處理系統
為了克服序列處理的弊端,人們開始開發批處理作業系統,簡單批處理方案的中心思想是使用一個稱作監控程式的軟體。計算機操作人員直接將一批作業放在輸入裝置上,這個監控程式將自動順序載入這些作業。
簡單的說,這個監控程式對於處理器來說就是一個不斷呼叫其他子程式的常駐程式,稱為常駐監控程式(resident monitor),每個使用者作業被當作子程式呼叫,結束後就又返回到常駐監控程式中。
簡單批處理系統相對於序列處理而言最大的進步之處在於使用了一下概念
- 記憶體保護:使用者不能改變監控程式內的記憶體區域,否則硬體將報錯。
- 定時器:定時器用於防止一個作業獨佔系統
- 特權指令:一些機器指令被設計成特權指令,只能由監控程式執行。
- 中斷:早期計算機模型並沒有中斷能力。這個特徵使得作業系統能讓使用者放棄控制權或從使用者程式獲得控制權時具有更大靈活性。
2.2.3 多道程式設計批處理系統
簡單批處理系統相當於一種自動作業序列,在這種系統中,處理器在某些情況下依然會長時間空閒,問題在於I/O裝置相對於處理器太慢。
圖2.5a顯示了這種只有一個單獨程式的情況,稱作單道程式設計(uniprogramming)。這種低效可以在多道程式設計批處理系統中得到改善。這種系統可以儲存三個、四個甚至更多的程式,並在他們之間切換(見圖2.5c),這種處理稱作多道程式設計(multiprogramming)或多工處理(multitasking),他是現代作業系統多工方案的最初形態。
對多道程式設計有用的最顯著的輔助功能是支援I/O終端和直接儲存器訪問操作(DMA)的硬體。多道程式作業系統相比單個程式或單道程式系統,由於需要在同一時段內執行多個作業,這些作業必須同時存在於記憶體中,這就需要記憶體管理(memory management)。此外還需要決定哪個作業先執行的排程演算法。
多道程式設計批處理系統示例:
類別 | JOB1 | JOB2 | JOB3 |
---|---|---|---|
作業型別 | 大量計算 | 大量I/O | 大量I/O |
持續時間 | 5分鐘 | 15分鐘 | 10分鐘 |
需要的記憶體 | 50M | 100M | 75M |
是否需要磁碟 | 否 | 否 | 是 |
是否需要終端 | 否 | 是 | 否 |
是否需要印表機 | 否 | 否 | 是 |
類別 | 單道程式設計 | 多道程式設計 |
---|---|---|
處理器使用 | 20% | 40% |
儲存器使用 | 33% | 67% |
磁碟使用 | 33% | 67% |
印表機使用 | 33% | 67% |
總執行時間 | 30分鐘 | 15分鐘 |
吞吐量 | 6個作業/小時 | 12個作業/小時 |
平均響應時間 | 18分鐘 | 10分鐘 |
2.2.4 分時系統
分時系統與前述的多道程式設計批處理系統在基本理念上相似,但側重不同,後者的目的在於充分使用CPU的運算資源,而前者的設計目的在於能夠同時響應多個使用者的請求。
在這種系統中,系統時鐘會以固定頻率產生中斷,在每個中斷處,系統得到控制權並將處理器分配給另一位使用者。這項技術被稱為時間片(Time slicing)技術。在每個新使用者程式得到CPU控制權之前老的使用者程式和資料被寫出到磁碟。當獲得下一次機會時,老的使用者程式程式碼和資料才被恢復到記憶體中。
新來的的程式只會佔用記憶體中恰好足夠他使用的空間,這樣可以節省磁碟讀取開銷(如圖2.7)
分時和多道程式設計引發了作業系統中許多的新問題,如記憶體中有多個作業時必須保護它們互不干擾,有多個使用者時,必須對檔案系統進行保護,還必須處理資源競爭問題。針對這些問題在現代作業系統中已經有了一些較為成熟的解決方案。
2.3 現代作業系統主要成就
現代作業系統已經採用了一些行之有效的辦法,來使得多工處理變得可靠健壯。[DENN80a]提出在作業系統開發中的五個重要理論進展:程序、記憶體管理、資訊保護和安全、排程和資源管理、系統結構。接下來將對這五個領域進行簡單的回顧。
2.3.1 程序
程序的定義:
- 一個正在執行的程式
- 計算機中正在執行的程式的一個例項
- 可以分配給處理器並由處理器執行的一個實體
- 由單一的順序的執行執行緒、一個當前狀態和一組相關的系統資源所描述的活動單元
計算機系統的發展有三條主線:多程式批處理操作、分時和實時事務系統,在這些型別的系統中,總是要面對將有不同活動需要同時被處理。這樣的處理很容易出現一些錯誤,而這些錯誤的產生又主要有4種原因:
- 不正確的同步
- 失敗的互斥
- 不確定的程式操作::例如兩個程式共享一段記憶體並在同一段時間內被由處理器控制交錯修改一這段記憶體,就會發生不可預期的操作。
- 死鎖:例如,兩個程式請求兩個相同的裝置的控制權,一個程式獲得了一個裝置的控制權,另一個獲得了另一個裝置的控制權,兩者都等待對方先釋放,就造成了死鎖。
解決這些問題的一種概念就是——程序,程序可以看作由三部分組成:
- 一段可以執行的程式
- 程式所需要的相關資料(變數、工作空間、緩衝區等)
- 程式的執行上下文
其中執行上下文(execution context)是程序的根本,又被稱作程序狀態(process state),是作業系統用來管理和控制程序所需的內部資料。這種內部資訊和程序是分開的,因為作業系統不允許被程序直接訪問。
以圖2.8為例,程序表的每條表項對應一個程序,表項內容包括指向包含程序的儲存塊地址的指標,還包括該程序的部分或全部執行上下文。程序索引暫存器(process index register)負責記錄當前處理器正在處理的程序。當需要由A切換到B時,先將當前上下文存入到A的表項,再將B的表項中的上下文載入到各暫存器。
根據博主理解,其過程其實和呼叫函式時將CPU狀態壓入堆疊原理相似。其實就相當於執行棧中各層CPU狀態是以“棧”的資料結構組織的,後儲存的先被還原;而在程序表中,CPU狀態是以“佇列”形式組織的,你存我載入,輪流得到時間片。
2.3.2 記憶體管理
作業系統擔負著五個基本的儲存器管理責任:
- 程序隔離:防止各個程序的儲存空間相互干涉
- 自動分配和管理:程式分配到一塊實體記憶體的過程對程式設計師來說是透明的,由作業系統負責分配。
- 支援模組化程式設計:具有統一有效的二進位制結構,使得程式設計師能夠定義程式模組(如動態連結庫、COM元件)並動態地建立、銷燬或修改模組。
- 保護和訪問控制:作業系統必須允許一部分記憶體可以由各種使用者以各種方式進行訪問,因此不同的記憶體應由不同的訪問許可權保護
- 長期儲存:許多應用程式需要在
典型情況下,作業系統使用虛擬儲存器和檔案系統機制來滿足這些要求。虛擬儲存機機制允許程式從邏輯的角度訪問儲存器,而不考慮實體記憶體上可用的空間數量。
當處理器在切換程序時,由於一些程序體積偏大,很難被緊密的壓入記憶體中,因此引進了分頁系統。在分頁系統中程序被分割為固定大小的塊,被稱作頁。程式通過虛地址(virtual address)訪問字,虛擬地址又頁號和頁中的偏移量組成。
程序被分為多個頁之後,就可以以頁為單位零散的分配在記憶體中。分頁系統提供了程式中使用的虛擬地址和記憶體中的實地址(real address)或稱實體地址之間的動態對映。
2.3.3 資訊保護和安全
大多數與作業系統相關的安全保護問題可分為四類
- 可用性:保護系統不被打斷
- 保密性:保證使用者不能讀到未授權訪問的資料
- 資料完整性:保護資料不被未授權修改
- 認證:涉及使用者身份的正確認證和訊息或資料的合法性
2.3.4 排程和資源管理
作業系統的一個關鍵任務是管理各種可用資源(記憶體空間、I/O裝置、處理器),並排程各種活動程序使用這些資源。分配和排程策略必須考慮3個要素:公平性、有差別的響應性、有效性。
圖2.11給出了多道程式設計環境中涉及程序排程和資源分配的作業系統主要元件。作業系統中維護者多個佇列,每個佇列代表著等待某些資源的程序的簡單列表。
短期佇列中包含了等待處理器並且隨時可以準備執行的程序。而具體哪個程序會下一個使用處理器取決於短期排程器,或稱為分派器(dispatcher)。一個常用的策略是依次給佇列中的每一個程序一定的時間(時間片技術 round-robin)。另一種策略是帶優先順序佇列。
長期佇列是等待使用處理器的新作業列表。作為短期佇列的補充。
I/O佇列用於排列多個請求使用同一個I/O的程序
2.3.5 系統結構
一個功能完善的作業系統導致了4個讓人遺憾但又普遍存在的問題
- 作業系統在交付使用時就習慣性地表現出落後,這就要求有新的作業系統或升級老的作業系統。
- 隨著時間的推移會暴露很多潛在缺陷,這些缺陷必須被及時修復。
- 總是難以達到預期的效能
- 理論表明,無法設計出即複雜又安全的作業系統
對於大型作業系統,軟體的體系結構和資訊抽象的概念得到越來越廣泛的使用,通常情況下被設計成一系列的層
層 | 名稱 | 物件 | 示例操作 |
---|---|---|---|
13 | shell | 使用者程式設計環境 | shell語言中的語句 |
12 | 使用者程序 | 使用者程序 | 退出、終止、掛起和恢復 |
11 | 目錄 | 目錄 | 建立、銷燬、連線、分離、查詢和列表 |
10 | s裝置 | 外部裝置,如印表機、顯示器和鍵盤 | 開啟、關閉、讀寫 |
9 | 檔案系統 | 檔案 | 建立、銷燬、開啟、關閉、讀寫 |
8 | 通訊 | 管道 | 建立、銷燬、開啟、關閉、讀寫 |
↓ | 開發者透明 | ||
7 | 虛擬儲存器 | 段、頁 | 讀寫和取 |
6 | 本地輔助儲存器 | 資料塊、裝置通道 | 讀寫、分配和空閒 |
5 | 原始程序 | 原始程序、訊號量、準備就緒列表 | 掛起、恢復、等待和發訊號 |
↓ | HAL | ||
4 | 中斷 | 中斷處理程式 | 呼叫、遮蔽、去遮蔽和重試 |
3 | 過程 | 過程、呼叫棧、顯示 | 標記棧、呼叫、返回 |
2 | 指令集合 | 計算棧、微程式直譯器、標量和陣列資料 | 載入、儲存、加操作、減操作、轉移 |
1 | 電路 | 暫存器、門、匯流排 | 清空、傳送、啟用、求反 |
2.4 現代作業系統的特徵
至今大多數作業系統都有一個單體核心(monolithic kernel),微核心體系結構只給核心分配一些最基本的功能,包括地址空間、程序間通訊(InterProcess Communication, IPC)和基本排程。
執行緒和程序有以下區別:
- 執行緒:可分派的工作單元。它包括處理器上下文環境(包含程式計數器和棧指標)和棧中自己的資料區域(為允許子程式分支)。執行緒順序執行,並且是可中斷的,這樣處理器可以轉到另一個執行緒。
- 程序:一個或多個執行緒和相關係統資源(入包含資料和程式碼的儲存空間、開啟的檔案和裝置)的集合。這緊密對應於一個正在執行的程式的概念。通過把一個應用程式分成多個執行緒,程式設計師可以在很大程度上控制應用程式的模組性和應用程式相關事件間的安排。
在擁有多個微處理器的計算機上,為了實現更高的有效性和可靠性,可使用對稱多執行緒(Symmetric MultiProcessing, SMP)技術。對稱多處理計算機可以定義為具有以下特徵的一個獨立的計算機系統:
- 有多個處理器
- 這些處理器共享同一個記憶體和I/O裝置,他們之間通過通訊匯流排或別的內部連結方案相連線。
- 所有處理器都可以執行相同的命令(因此稱為對稱)
近年來單晶片上的多處理器系統(也稱為單片多處理器系統)已經開始廣泛應用。
2.5 微軟的windows概述
沒細看,只放張圖
2.6 傳統的UNIX系統
沒細看,只放張圖
2.7 現代UNIX系統
沒細看,只放張圖
2.8 Linux系統
2.8.1 模組結構
Linux的結構是一個模組的結合,這些模組可以根據需要自動地載入或解除安裝,這些相對獨立的塊叫做可載入模組(loadable module)。因此雖然Linux被認為是單體核心,但他的模組結構克服了在開發和發展核心過程中所遇到的困難。
Linux可載入模組有兩個重要特徵:
- 動態連結:當核心已經在記憶體中並正在執行時,核心模組可以被載入和連結到核心。模組也可以在任何時刻被斷開連結,從記憶體中移出。
- 可堆疊模組:模組按層次排列,當被高層的客戶模組訪問時,他們作為庫;當被低層模組訪問時,它們作為客戶。
圖2.17舉例說明了Linux的管理模組的結構,該圖顯示了當只有兩個模組FAT和VFAT被載入後核心模組的列表。每個模組有兩個表定義,即符號表和模組表。模組表包含以下元素:
- *next:指向後面的模組
- *name:指向模組名的指標
- size:模組的大小,以記憶體頁計
- usecount:模組的引用計數
- flags:模組標誌
- nsyms:輸出的符號數
- ndeps:引出的模組數
- *syms:指向這個模組符號表的指標
- *deps:指向被這個模組引用的模組列表的指標
- *refs:指向使用這個模組的模組列表的指標
圖2.17顯示了VFAT模組在FAT模組後被載入,並且它依賴於FAT模組
2.8.2 核心元件
圖2.18顯示了基於IA-64體系結構(例如Intel Itanium)的Linux核心的主要元件。
主要核心元件簡介如下:
- 訊號: 核心通過訊號通知程序,比如除零錯誤等,表2.6給出了一些訊號的例子
- 系統呼叫:程序是通過系統呼叫來請求系統服務的
- 程序和排程器:建立、管理和排程程序
- 虛擬記憶體:違禁成分陪和管理虛擬記憶體
- 檔案系統:為檔案、目錄和其他檔案相關的物件提供一個全域性的、分層次的名稱空間,還提供檔案系統函式
- 網路協議:為使用者的TCP/IP協議提供套接字介面
- 字元裝置驅動:管理想核心一次性發送或接收一個位元組資料的裝置
- 塊裝置驅動:管理以快為單位想核心傳送和接收資料的裝置
- 網路裝置啟動:對網路介面和通訊埠提供管理
- 陷阱和錯誤:處理CPU產生的陷阱和錯誤
- 實體記憶體:管理實際記憶體中的記憶體頁池和為虛擬記憶體分配記憶體頁
- 中斷:處理來自外設的中斷