一、操作系統概述
1. 計算機軟硬件系統
- 馮諾伊曼結構
- 以運算單元為核心,控制流由指令流產生
- 程序和數據存儲在主存中
- 主存是按地址訪問,線性編址
- 指令由操作碼和地址碼組成
- 數據以二進制編碼
- 其他:參考《重學計算機-計算機組成原理》
2. 計算機操作系統的發展
- 概述:任何一台機器都有其操作平台和操作系統
- 洗衣機:開關表示、按鈕控制、亮燈顯示
- 演進過程
- 手工操作:手動調動地址和數據按鈕錄入內存,然后點運行
- 引進裝入程序:用卡片和紙帶,通過ROM上的裝入程序載入內存
- 匯編語言:對指令提供了助記符號
- 高級語言:面向問題
- 簡單批處理系統:編寫作業控制程序,縮短手工操作的時間
- 多道批處理系統:排隊執行作業,不能同時,也不能和計算機交互
- 分時系統、實時系統:進程間切換,引入中斷機制
- 通用操作系統:同時具備以上功能
3. 不同視角下的操作系統
- 資源管理的角度:
- 資源:硬件資源(處理器、內存、外設),軟件資源(數據、程序)
- 例子:驅動程序
- 共享:資源獨占、並發共享
- 分配:靜態、動態、搶占
- 程序控制的角度:進程
- 操作方式的角度:脫機、聯機
- 人機交互的角度:行命令、全屏幕控制、窗口界面、虛擬現實
- 程序接口的角度:系統調用(陷入機制)
- 系統結構的角度:
- OS構件:內核、進程、線程、管程
- 設計概念:模塊化、層次化、虛擬化
二、處理器管理
1. 指令與處理器模式
- 指令執行周期:取指、譯碼、執行
- 指令分類(根據權限)
- 特權指令:只能被操作系統內核使用(啟動IO,置PC值)
- 非特權指令:所有程序都能使用
- 處理器模式:
- 共有四種:0內核模式,1系統調用,2共享庫程序,3用戶模式
- 一般來說:只有0內核模式(能執行全部指令)和3用戶模式(只能執行非特權指令)
- 模式切換:
- 用戶模式 --> 內核模式(系統調用、異常、響應中斷)
- 內核模式 --> 用戶模式(中斷返回指令)
2. 中斷
- 概念:
- 操作系統是中斷驅動的。即中斷是激活操作系統的唯一方式
- 廣義中斷:停止CPU正在執行的進程,轉而執行中斷處理程序,處理完后返回原進程或調度新進程
- 狹義中斷:源於處理器之外的中斷事件,IO中斷、時鍾中斷、外部信號中斷
- 中斷源:
- 處理器硬件故障中斷事件:內存故障
- 程序性中斷事件:除0異常、缺頁異常
- 自願性中斷事件:系統調用
- IO中斷事件:IO完成
- 外部中斷事件:鼠標點擊
- 中斷系統:
- 實現:硬件完成中斷響應,軟件完成中斷處理
- 中斷裝置:
- 處理器外中斷:由中斷控制器實現
- 處理器內中斷(陷阱):由指令控制邏輯實現
- 系統調用(系統陷阱):執行陷入指令時直接觸發,即系統陷阱
- 中斷處理流程
- 多中斷處理:中斷屏蔽、中斷優先級、中斷嵌套
3. 進程
- 進程:操作系統進行資源分配和調度的獨立單位
- 進程解剖:OS管理進程的數據結構P + 內存代碼 + 內存數據 + 通用寄存器R + PSW
- 進程狀態:
- 進程數據:
- 進程控制塊PCB:是OS用於記錄進程狀態和環境信息的數據結構
- 標識信息:進程標識(進程標識號、進程組標識號)
- 現場信息:用戶可見寄存器內容、控制/狀態寄存器內容、棧指針內容
- 控制信息:進程調度信息、進程組成信息、隊列指引元、通信相關、進程特權信息、處理器使用信息、資源清單信息
- 進程映像:某一時刻進程的內容及執行狀態集合
- 進程控制塊、進程程序塊、進程數據塊、核心棧
- 進程上下文:進程執行的環境支持(CPU現場、Cache中的執行信息)
- 用戶級、寄存器級、系統級
- 進程控制塊PCB:是OS用於記錄進程狀態和環境信息的數據結構
- 進程的管理
- 進程實現的隊列模型
- 進程控制流程
- 進程創建:進程表增加一項,申請PCB並初始化,生成標識,建立映像,分配資源,移入就緒隊列
- 進程撤銷:從隊列中移除,歸還響應資源。。。
- 進程阻塞:保存現場,修改PCB,移入等待隊列
- 進程喚醒:從等待隊列移出,修改PCB,進入就緒隊列
- 進程掛起:修改進程狀態並出入相關隊列,收回內存等資源送至對換區
- 進程激活:分配內存,修改狀態並出入相關隊列
- 原語
- 概念:由若干指令構成的完成某種特定功能,有原子性
- 應用:修改OS核心數據結構(進程表、PCB池)
- 進程切換與模式切換
- 流程: 倆進程上下文切換(保存被中斷的上下文、進程調度、恢復待運行的上下文)
- 模式切換:用戶態到內核態這種。進程切換必須在內核態完成,所以必須經理模式切換
4. 線程
- 多線程技術:一個進程內有多個線程
- 思路:將進程的兩個功能“獨立分配資源”和“調度執行”功能分開
- 分類:
- KLT:內核級多線程
- ULT:用戶級別多線程
- 多線程實現的混合策略
- 一個ULT綁定多個KLT
5. 處理器調度
- 處理器調度的層次:高級、中級、低級
- 處理器調度算法
- 原則:資源利用率、響應時間、周轉時間(進入系統到出系統時間)、吞吐量(單位時間處理進程數)、公平性
- 算法:優先數算法、時間片輪轉、分級調度算法、彩票算法
三、存儲管理
1. 存儲管理的基本概念
- 邏輯地址:用戶地址,從零開始編號
- 一維邏輯地址:(地址)
- 二維邏輯地址:(段號: 段內地址)
- 主存儲器的復用方式
- 按分區:主存划分為多個固定/可變分區,一個程序占一個分區
- 按頁架:主存划分為多個固定頁架,一個程序占多個頁架
- 存儲管理的模式
- 單連續:一維邏輯地址程序,占一個固定/可變分區
- 段 式:二維邏輯地址程序,占多個可變分區
- 頁 式:一維邏輯地址程序,占多個頁架
- 段頁式:二維邏輯地址程序,占多個頁架
- 地址轉換:邏輯地址 --> 物理地址
- 靜態重定位:程序裝入內存時轉換(早期OS)
- 動態重定位:CPU執行時轉換,效率考慮需要硬件幫助
- 虛擬存儲器
- 由於程序的局部性順序性等,可以考慮只將部分程序調入主存,其他的隨用隨調
- 達到了面對程序員主存擴容的目的
2. 單連續分區存儲管理
- 單用戶連續分區管理:主存區划分為系統區和用戶區,采用靜態重定位進行地址轉換,一般適用於單用戶單任務操作系統(DOS)
- 固定分區管理:一個程序占一個分區,有主存分配表,容易產生內零頭
- 可變分區管理:按進程內存需求動態分配內存空間,容易產生外零頭
3. 頁式存儲管理 **
- 概念:
- 主存分頁架,程序分頁。
- 不同程序頁可放在不同主存頁架中,不需要連續
- 頁和頁架關系由頁表維護
- 用位示圖表示主存分配與去配,用進程頁表維護進程邏輯完整性
- 地址:
- 邏輯地址:頁號 + 單元號
- 物理地址:頁架號 + 單元號
- 快表:
- 利用Cache存放部分頁表
- 同Cache緩存內存數據一樣,也是相聯存儲器技術,並且有淘汰策略,具體見《重學計算機 -- 計算機組成原理》
- 頁式虛擬存儲
- 頁表:標識位 + 主存塊號 + 輔存地址
- 實現:
- 查頁表,若頁在內存,則生成絕對地址
- 若不在內存,發起缺頁中斷
- OS響應缺頁中斷,若內存有空閑頁架,則從輔存中調入頁。更新頁表快表
- 若無空閑頁架,先淘汰頁,再調入
- 頁面調度算法:
- 同Cache和內存的調度策略,具體參考《重學計算機 -- 計算機組成原理》
4. 其他
- 段式存儲管理:基本不用,略
- 段頁式存儲管理:基本不用,略
- 內存管理單元MMU:
- 作用:管理虛擬存儲器的硬件控制線路,把虛擬地址映射為物理地址,並提供內存保護,必要時淘汰頁面
- 實現:用一種數據結構 反置頁表IPT
PS:許多年以前,當人們還在使用DOS或是更古老的操作系統的時候,計算機的內存還非常小,一般都是以K為單位進行計算,相應的,當時的程序規模也不大,所以內存容量雖然小,但還是可以容納當時的程序。但隨着圖形界面的興起還有用戶需求的不斷增大,應用程序的規模也隨之膨脹起來,終於一個難題在程序員的面前,那就是應用程序太大以至於內存容納不下該程序,通常解決的辦法是把程序分割成許多稱為覆蓋塊(overlay)的片段。覆蓋塊0首先運行,結束時他將調用另一個覆蓋塊。雖然覆蓋塊的交換是由OS完成的,但是必須先由程序員把程序先進行分割,這是一個費時費力的工作,而且相當枯燥。人們必須找到更好的辦法從根本上解決這個問題。不久人們找到了一個辦法,這就是虛擬存儲器(virtual memory).虛擬存儲器的基本思想是程序,數據,堆棧的總的大小可以超過物理存儲器的大小,操作系統把當前使用的部分保留在內存中,而把其他未被使用的部分保存在磁盤上。比如對一個16MB的程序和一個內存只有4MB的機器,操作系統通過選擇,可以決定各個時刻將哪4M的內容保留在內存中,並在需要時在內存和磁盤間交換程序片段,這樣就可以把這個16M的程序運行在一個只具有4M內存機器上了。而這個16M的程序在運行前不必由程序員進行分割。
四、設備管理
1. IO的控制方式
- 演進過程:輪詢 --> 中斷 --> DMA --> IO通道
- 經典布局:南北橋
- PS:詳見《計算機組成原理》
2. IO的實現
- 軟件實現層次:硬件 --> 中斷處理程序 --> 設備驅動程序 --> 獨立於設備的IO軟件 --> 用戶空間的IO軟件
- IO緩沖:
- 解決問題:
- 設備與CPU速度不匹配
- 邏輯記錄大小和物理記錄大小不一致
- 減少IO操作對CPU的中斷次數
- 實現:緩沖區
- 內存中開辟一個專門臨時存放IO數據的區域
- 分類:單緩沖、雙緩沖、多緩沖
- 解決問題:
3. 磁盤
- 調度策略
- 移臂調度:以雙向調度中的電梯調度算法為經典
- 旋轉調度:寫數據時采用交叉因子寫入方式,可以提高旋轉讀數據的命中率
五、文件系統
1. 文件系統
- 文件系統概述
- 文件的組織:
- 邏輯結構:流式、記錄式
- 物理結構:順序、連接、直接、索引
- 文件的存取:順序、直接、索引
- 文件的控制:邏輯控制、物理控制
- 文件的使用:打開、關閉、讀、寫、控制
- 文件的組織:
- 文件的存儲
- 塊:存儲介質上連續存儲的區域,是主存與輔存信息交換的單位
- 順序存取設備:光盤、磁帶
- 直接存取設備:磁盤
2. 文件
- 文件的邏輯結構
- 流式文件:只是由一段字節序列構成的
- 記錄式文件:有含義有結構的信息,比如員工工資記錄
- 文件的物理機構
- 順序文件:塊塊之間相連,批處理文件和系統文件一般都這么存。---> 數組
- 連接文件:有連接字指向下一個塊地址。---> 鏈表
- 直接文件:又叫散列文件。對內容進行散列存儲到相應物理位置。 ---> 散列表
- 索引文件:為文件建立一個索引表,可多級。 ---> 增加了散列表的鏈表
- 文件的目錄
- 概念:實現文件按名存取的關鍵數據結構
- 分類:一級目錄、二級目錄、樹型目錄
六、並發程序設計
1. 並發程序的基本概念
- 程序順序性
- 內部順序性:CPU嚴格按照順序執行指令
- 外部順序性:程序員設計程序時往往用順序設計的思想
- 順序程序特性
- 程序執行的順序性
- 計算環境的封閉性: 程序執行時猶如獨占資源
- 計算結果的確定性
- 計算過程的可再現性
- 並發進程
- 無關的並發進程:一組並發進程,在不同變量集上運行
- 交往的並發進程:一組並發進程,共享某些變量,相互影響
- 並發進程制約關系
- 進程互斥:爭奪某一個資源
- 進程同步:共同完成某一個任務,協調先后順序
- 發生問題:
- 與時間有關的錯誤:結果錯誤、永遠等待
- 臨界區:
- 臨界資源:一次只能被一個進程使用的資源(互斥共享變量)
- 臨界區:是個程序段,是並發進程中與互斥共享變量相關的程序段
- 相關的臨界區:兩個進程的臨界區有相同的臨界資源(必須互斥進入)
- 問題:
- 多個並發進程訪問臨界資源存在制約關系
- 如果兩個進程同時處在相關的臨界區,會發生與時間有關的錯誤
- 臨界區管理的要求:
- 一次至多允許一個進程停留在相關臨界區
- 一個進程不能無限制停留在臨界區內
- 一個進程不能無限制等待進入臨界區內
- 臨界區嵌套使用
2. 並發程序控制和問題
- 臨界區管理實現:
- 思路:判斷鎖和獲取鎖要作為原子操作,不然會死鎖或時間錯誤
- 實現:
- 原子指令:測試並建立鎖指令、對換指令(忙式等待,效率不高)
- 中斷控制:進出臨界區時開關中斷,這樣臨界區執行時就不會被中斷,自然實現了原子性
- 這個時操作系統的原語,是操作系統解決這個問題的辦法
- 不建議用戶程序使用,因為無法保證程序員設計出短小精悍的原語
- PV操作:用信號量,“申請-等待隊列-中斷恢復”
- 生產者消費者問題:
- 進程間通信
- 信號量:低級通信方式
- 信件:進程通信機制(直接通信、間接通信)
- 基於流:多個進程共同使用一個緩沖區
- RPC:遠程過程調用
- 死鎖