Chapter 1 導論
操作系統的作用
1.資源管理:
(1)跟蹤記錄資源的使用狀況
(2)確定資源分配策略——算法:靜態分配策略、動態分配策略(大多數OS使用,效率高)
(3)實施資源的分配和回收
(4)提供資源的利用率,保護資源的使用
(5)協調多進程請求資源的衝突
五大基本功能:
進程/線程管理(CPU管理)、存儲管理、文件管理、設備管理、用戶接口
2.向用戶提供服務
3.對硬件的拓展
操作系統的特徵:
1.併發:同時處理多個活動
2.共享:OS與多個用戶程序共同使用系統資源(互斥共享/同時共享)
3.虛擬:一個物理實體映射爲多個對應的邏輯實體(分時或分空間),以提高資源利用率
4.隨機:對以不可預測的次序發生的時間進行響應並處理
OS分類
1.批處理操作系統(單道、多道),技術:SPOOLING
2.分時操作系統,技術:時間片
通用操作系統:分時系統與批處理系統的結合
原則:分時優先,批處理在後
3.實時操作系統
4.個人計算機操作系統:在某一時間只爲單用戶服務
5.網絡操作系統
6.分佈式操作系統
7.嵌入式操作系統
etc.
Chapter 2 操作系統結構
控制和狀態寄存器:PC(程序計數器),IR(指令寄存器),PSW(程序狀態字寄存器)
操作系統需要兩種CPU狀態:
Kernel Mode, User Mode
CPU狀態之間的轉換:
1.用戶態 -> 內核態:唯一途徑:中斷/異常/陷入機制
2.內核態 -> 用戶態:設置程序狀態字
中斷/異常機制
操作系統由“中斷驅動”或者“事件驅動”
中斷/異常的概念
CPU對系統發生的某個事件作出的一種反應
(事件的發生改變了處理器的控制流)
特點:隨機發生,自動處理,可恢復
中斷的引入:爲了支持CPU和設備之間的並行操作
異常的引入:表示CPU執行指令時本身出現的問題(算術溢出、除零、地址越界、“陷入”指令,etc.)
中斷和異常,統稱事件
中斷:外部事件,正在運行的程序所不期望的
Interrupt:來自I/O或其他硬件,異步,處理完返回到下一條指令
異常:由正在執行的指令引發
Trap陷入:有意識安排的,同步,處理完返回到下一條指令
Fault故障:可恢復的錯誤,同步,返回到當前指令
Abort終止:不可恢復的錯誤,同步,不返回
中斷/異常機制的工作原理
硬件:中斷/異常響應(發現中斷,接受中斷)
軟件:中斷/異常處理
開始->取下一條指令->執行指令->(允許中斷)->檢查指令處理中斷
在每條指令執行週期的最後時刻掃描中斷寄存器,查看是否有中斷信號
若有中斷,PSW寫入中斷碼,通過查 中斷向量表 引出中斷處理程序
若無中斷,繼續執行下一條指令
中斷向量表
中斷向量:一個內存單元,存放 中斷處理程序入口地址 和程序運行時所需的 處理機狀態字
中斷響應:
1.設備發出中斷信號
2.硬件保存現場
3.根據中斷碼查表
4.把中斷處理程序入口地址等推送到相應的寄存器
5.執行中斷處理程序
系統調用機制的設計
- 中斷/異常機制:支持系統調用服務的實現
- 陷入指令(亦稱訪管指令):引發異常,完成用戶態到內核態的切換
- 系統調用號和參數:每個系統調用都事先給定一個編號(功能號)
- 系統調用表:存放系統調用服務程序的入口地址
參數傳遞的3中實現方法: - 由陷入指令自帶參數 - 通過通用寄存器傳遞參數(常用) - 在內存中開闢專用棧區來傳遞參數
系統條用的執行過程 當CPU執行到陷入指令時:
- 中斷/異常機制:硬件保護現場;通過查中斷向量表把控制權轉給 系統調用總入口程序
- 系統調用總入口程序:保存現場;將參數保存在內存棧區;通過查系統調用表把控制權轉給相應的系統調用處理例程或內核函數
- 執行系統調用例程
- 恢復現場,返回用戶程序
Chapter 3 進程 & Chapter 4 線程
併發環境:在一段時間間隔內,單處理器上又兩個或兩個以上的程序 同時 處於 開始運行但尚未結束的狀態 並且 次序不是事先確定的
進程(Process,對CPU的抽象):具有獨立功能的程序關於 某個數據集合上 的 一次運行活動,是系統進行 資源分配和調度 的獨立單位,又稱任務(Task)
- 程序的一次執行過程
- 是正在運行程序的抽象
- 將一個CPU變成多個虛擬的CPU
- 系統資源以進程爲單位分配,如內存、文件、……
- 每個進程具有獨立的地址空間
- 操作系統將CPU調度給需要的進程
進程控制塊(PCB)
Process Control Block
- 又稱 進程描述符、進程屬性
- 操作系統用於管理控制進程的一個專門的數據結構
- 記錄進程的各種屬性,描述進程的動態變化過程
PCB是系統感知進程存在的唯一標誌,進程與PCB一一對應
進程表:所有進程的PCB集合
PCB包括:
- 進程描述信息
- 進程控制信息
- 所擁有的資源和使用情況
- CPU現場信息
進程的三種基本狀態:
- 運行態:佔有CPU,並在CPU上運行
- 就緒態:已經具備運行條件,但由於沒有空閒CPU,而暫時不能運行
- 等待態(阻塞態、封鎖態、睡眠態):因等待某一事件而暫時不能運行,如:等待讀盤結果
狀態轉換:
- 就緒->運行:調度程序選擇一個新的進程運行
- 運行->就緒:運行進程用完了時間片;或一個高優先級進程進入就緒狀態,搶佔正在運行的進程
- 運行->等待:當一個進程等待某個事件發生時 e.g.請求OS服務、等待I/O結果……
- 等待->就緒:所等待的事件發生了
進程的其他狀態:
創建態、終止態、掛起態
進程隊列
- OS爲每一類進程建立一個或多個隊列
- 隊列元素爲PCB
- 伴隨進程狀態的改變,PCB會進入其他隊列
進程控制
進程控制操作完成進程各狀態之間的轉換,由具有特定功能的原語完成
原語 primitive:
完成某種特定功能的一段程序,具有不可分割性或不可中斷性
即原語的執行必須是連續的,在執行過程中不允許被中斷(原子操作)
1.進程的創建
- 給新進程分配一個唯一 標識 以及 進程控制塊
- 爲進程分配地址空間
- 初始化進程控制塊
- 設置相應的隊列指針
2.進程的撤銷
即結束進程
- 收回進程所佔有的資源
- 撤銷該進程的PCB
3.進程阻塞
當被等待的事件未發生時,由 進程自己執行阻塞原語,是自己由運行態變爲阻塞態
上下文(Context)切換
- 將CPU硬件狀態從一個進程切換到另一個進程的過程
- 進程運行時,其硬件狀態保存在CPU上的寄存器中
- 進程不運行時,這些寄存器的值保存在PCB中;當OS要運行一個新的進程時,將PCB中的相關值送到對應的寄存器中
進程的兩個基本屬性:資源的擁有者,CPU調度單位
線程繼承“CPU調度單位”
進程依然是“資源的擁有者”
線程:進程中的一個運行實體,是CPU的調度單位,有時將線程稱爲 輕量級進程
線程的屬性
- 標識符ID
- 狀態及狀態轉換
- 上下文環境
- 有自己的棧和棧指針
- 共享所在進程的地址空間和其他資源
- 可以創建、撤銷另一個線程(程序開始是以一個單線程進程方式運行的)
線程的實現
1.用戶級線程
- 在用戶空間建立線程庫
- 由運行時系統完成管理
- 內核管理的還是進程,不知道線程的存在
- 線程切換不需要內核態特權
e.g.UNIX
2.核心級線程
- 內核管理所有的線程
- 內核維護進程和線程的上下文
- 線程的切換需要內核支持
- 以線程爲基礎進行調度
e.g.Windows
3.混合模型
- 線程創建在用戶空間完成
- 線程調度等在覈心態完成
e.g.Solaris
Chapter 5 CPU調度
CPU調度——控制、協調進程對CPU的競爭
- 按一定的調度算法從就緒隊列中選擇一個進程,把CPU的使用權交給被選中的進程
- 如果沒有就緒進程,系統會安排一個系統空閒進程或idle進程
CPU調度要解決三個問題:
- 調度算法
- 調度時機
- 調度過程(進程的上下文切換)
CPU調度的時機:就緒隊列改變,引發重新調度
- 進程正常終止 或 由於某種錯誤而終止
- 新進程創建 或 一個等待進程變成就緒
- 當一個進程從運行態進入阻塞態
- 當一個進程從運行態變爲就緒態
進程調度程序從就緒隊列選擇了要運行的進程——發生進程切換
進程切換:一個進程讓出處理器,由另一個進程佔用處理區的過程
- 切換全局頁目錄以加載一個新的地址空間
- 切換內核棧和硬件上下文(硬件上下文包括了內核執行新進程需要的全部信息)
切換過程包括了對原來運行進程各種狀態的保存和對新進程各種狀態的恢復
上下文切換開銷
直接開銷:內核完成切換所用的CPU時間
- 保存和恢復寄存器
- 切換地址空間
間接開銷
- 高速緩存(Cache)、緩衝區緩存(Buffer Cache)和TLB(Translation Lookup Buffer)失效
CPU調度算法衡量指標
- 吞吐量(Throughput):每單位時間完成的進程數目
- 週轉時TT(Turnaround Time):每個進程從提出請求到運行完成的時間
- 響應時間RT(Response Time):從提出請求到第一次迴應的時間
- CPU利用率(Cpu Utilization):CPU做有效工作的時間比例
- 等待時間(Waiting Time):每個進程在就緒隊列(ready queue)中等待的時間
CPU調度算法要考慮的幾個問題
1.進程優先級(數)
- 靜態優先級:進程創建時指定,運行過程中不再改變
- 動態優先級:進程創建時指定了一個優先級,運行過程中可以動態變化
2.進程就緒隊列組織:按優先級排隊
3.佔用CPU的方式:
- 可搶佔式Preemptive(可剝奪式):當有比正在運行的進程優先級更高的進程就緒時,系統可強行剝奪正在運行進程的CPU,提供給具有更高優先級的進程使用
- 不可搶佔式Non-preemptive(不可剝奪式):某一進程被調度運行後,除非由於它自身的原因不能運行,否則一直運行下去
4.按進程執行過程中的行爲劃分:
- I/O密集型或I/O型(I/O-bound):頻繁的進行I/O,通常會花費很多時間等待I/O操作的完成
- CPU密集型或CPU型或計算密集型(CPU-bound):需要大量的CPU時間進行計算
5.時間片(Time slice 或 quantum):一個時間段,分配給調度CPU的進程,確定了允許該進程運行的時間長度
批處理系統中採用的調度算法:
1.先來先服務(FCFS, First Come First Serve)
- 先進先出(FIFO)
- 按照進程就緒的先後順序使用CPU
- 非搶佔
- 優缺點:公平,實現簡單;長進程後面的短進程等待時間比較長
2.最短作業優先(SJF, Shortest Job First)
- 具有最短完成時間的進程優先執行
- 非搶佔式
- 優缺點:最短的平均週轉時間(所以進程同時可運行時);不公平,產生”飢餓"(starvation)現象
3.最短剩餘時間優先(SRTN, Shortest Remaining Time Next)
- SJF搶佔式版本
- 當一個新就緒的進程比當前運行進程具有更短的完成時間時,系統搶佔當前進程,選擇新就緒的進程執行
- 同SJF
4.最高響應比優先(HRRN, Highest Response Ratio Next)
- 是一個綜合算法:前面算法的折衷權衡(tradeoff)
- 非搶佔
- 調度時,首先計算每個進程的響應比R; 之後,總是選擇R最高的進程執行
- 響應比R = 週轉時間 / 處理時間 = (處理時間 + 等待時間) / 處理時間 = 1 + (等待時間 / 處理時間)
交互式系統中採用的調度算法
1.輪轉調度(RR, Round Robin)
- 改善平均響應時間
- 週期性切換
- 每個進程分配一個時間片
- 時鐘中斷——輪換
- 在時間片到達時可以搶佔
- 優缺點:公平,響應時間快;進程切換開銷
2.最高優先級調度(HPF, Highest Priority First)
- 選擇優先級最高的進程投入運行
- 通常:系統進程>用戶進程,前臺進程>後臺進程,操作系統偏好I/O型進程
- 優先級可以是靜態不變的,也可以動態調整
- 就緒隊列可以按照優先級組織
- 優缺點:實現簡單;不太公平(飢餓)
3.多級反饋隊列(Multiple feedback queue)
- 是一個綜合調度算法
- 設置多個就緒隊列,第一級隊列優先級最高
- 給不同就緒隊列中的進程分配長度不同的時間片:第一級隊列時間片最小;隨着隊列優先級降低,時間片增大
- 當第一級隊列爲空是,在第二級隊列調度,以此類推
- 各級隊列按照時間片輪轉方式進行調度
- 當一個新創建進程就緒後,進入第一級隊列
- 進程用完時間片而放棄CPU,進入下一級就緒隊列
- 由於阻塞而放棄CPU的進程進入相應的等待隊列,一旦等待的事件發生,該進程回到原來一級就緒隊列
- 在時間片到達時可以搶佔
4.最短進程優先(Shortest Process Next)
Chapter 6 進程同步
競爭條件(Race Condition):兩個或多個進程讀寫某些共享數據,而最後的結果取決於進程運行的精確時序
進程互斥(Mutual Exclusive):由於各進程要求使用共享資源(變量、文件等),而這些資源需要排他性使用。各進程之間競爭使用這些資源。
臨界資源(critical resource):系統中某些資源一次只允許一個進程使用,稱這樣的資源爲 臨界資源 或 互斥資源 或 共享變量
臨界區(互斥區, critical section/region):各個進程中對某個臨界資源(共享變量)實施操作的程序片段
臨界區(互斥區)的使用原則
- 沒有進程在臨界區時,想進入臨界區的進程可進入
- 不允許兩個進程同時處於其臨界區中
- 臨界區外運行的進程不得阻塞其他進程進入臨界區
- 不得使進程無限期等待進入臨界區
實現進程互斥的解決方案
- 軟件方案:Dekker解法、Peterson解法
- 硬件方案:屏蔽中斷、TSL(XCHG)指令
進程同步(synchronization)
系統中多個進程中發生的事件存在某種時序關係,需要相互合作,共同完成一項任務。
一個進程運行到某一點時,要求另一協作進程爲它提供消息,在未獲得消息之前,該進程進入阻塞態,獲得消息後被喚醒進入就緒態。
生產者/消費者問題,又稱有界緩衝區問題
問題描述:
- 一個或多個生產者,生產某種類型的數據,放置在緩衝區中
- 有消費者從緩衝區中取數據,每次取一項
- 只能有一個 生產者或消費者 對緩衝區進行操作
要解決的問題:
- 當緩衝區已滿時,生產者不會繼續向其中添加數據
- 當緩衝區爲空時,消費者不會從中移走數據
- 生產者和消費者不能同時對緩衝區進行操作
避免忙等待:
睡眠 與 喚醒 操作(原語)
信號量
- 一個特殊的變量
- 用於進程間傳遞信息的一個整數值
- 對信號量可以實施的操作:初始化、 P、V
- P、V操作爲原語操作,(P:+1; V:-1)
用PV操作解決進程間互斥問題
- 分析併發進程的關鍵活動,劃定臨界區
- 設置信號量mutex,初值爲1
- 在臨界區前實施P(mutex)
- 在臨界區之後實施V(mutex)
管程
- 是一種特殊的模塊
- 每一個管程有一個名字
- 由關於共享資源的數據結構 及在其上操作的一組過程組成
進程與管程
進程只能通過調用管程中的結構來間接地訪問管程中的數據結構
管程需要解決兩個問題
- 互斥:管程是互斥進入的。管程的互斥性是由編譯器負責保證的
- 同步:管程中設置條件變量及等待/喚醒操作以解決同步問題
進程間通信
- 消息傳遞
- 共享內存
- 管道
- 套接字
- 遠程過程調用
Chapter 7 死鎖
死鎖:一組進程中,每個進程都無限等待被該組中另一進程所佔有的資源,因而永遠無法得到的資源
產生死鎖的必要條件
- 互斥使用(資源獨佔):一個資源每次只能給一個進程使用
- 佔有且等待(請求和保持,部分分配):進程在申請新的資源的同時,保持對原有資源的佔有
- 不可搶佔(不可剝奪):資源申請者不能強行的從資源佔有者手中奪取資源,資源只能由佔有者自願釋放
- 循環等待:存在一個進程等待隊列,形成一個進程等待環路
資源分配圖:用有效圖描述系統資源和進程的狀態
死鎖定理
- 如果資源分配圖中沒有環路,則系統中沒有死鎖;如果圖中存在環路,則系統中可能存在死鎖
- 如果每個資源類中只包含一個資源實例,則環路是死鎖存在的充分必要條件
解決死鎖
- 鴕鳥算法:不考慮此問題
- 死鎖預防:靜態策略:設計合適的資源分配算法,不讓死鎖發生
- 死鎖避免:動態策略:以不讓死鎖發生爲目標,跟蹤並評估資源分配過程,根據評估結果決策是否分配
- 死鎖檢測與解除:讓死鎖發生
死鎖預防(Deadlock Prevention)
- 在設計系統時,通過確定資源分配算法,排除發生死鎖的可能性
- 防止產生死鎖的四個必要條件中任何一個發生
- 破壞“資源獨佔”
- 資源轉換技術:把獨佔資源變爲共享資源
- SPOOLing技術的引入
- 破壞“佔有且等待”
- 方案1:每個進程在運行前必須一次性申請要求的所有資源(問題:資源利用率低;飢餓現象)
- 方案2:進程等待時,必須釋放已佔有的全部資源,若需要在重新申請
- 破壞“不可搶佔”
- 用過操作系統搶佔該資源(兩個進程優先級不同)
- 破壞“循環等待”
- 定義資源類型的線性順序實現:資源有序分配法
- 破壞“資源獨佔”
死鎖避免:在系統運行過程中,對進程發出的每一個系統能夠滿足的資源申請進行動態檢查,並根據檢查的結果決定是否分配資源
安全狀態:系統中存在一個由所有進程構成的安全序列
安全狀態一定沒有死鎖發生;不安全狀態一定導致死鎖(但目前還沒有)
銀行家算法
- 死鎖避免算法
- 應用條件:
- 在固定數量的進程中共享數量固定的資源
- 每個進程預先指定完成工作所需的最大資源數量
- 進程不能申請比系統中可用資源總數還多的資源
- 進程等待資源的時間是有限的
- 如果系統滿足了進程對資源的最大需求,那麼,進程應該在有限的時間內使用資源,然後歸還給系統
死鎖的檢測與解除
- 允許死鎖發生,但是操作系統會不斷監視系統進展情況,半段死鎖是否真的發生
- 一旦死鎖發生則採取專門的措施,解除死鎖並以最小的代價恢復操作系統運行
Chapter 8 內存管理
-
邏輯地址(相對地址,虛擬地址)
- 用戶程序經過編譯、彙編後形成目標代碼,目標代碼通常採用相對地址的形式,其首地址爲0,其餘地址都相對於首地址而編址
- 不能用邏輯地址在內存中讀取信息
-
物理地址(絕對地址,實地址)
- 內存中存儲單元的地址
- 可直接尋址
-
地址重定位:
- 爲了保證CPU執行指令時可正確訪問內存單元,需要將用戶程序中的邏輯地址轉換爲運行時可由及其直接尋址的物理地址
-
靜態重定位:
- 當用戶程序加載到內存時,一次性實現邏輯地址到物理地址的轉換
- 一般可以由軟件完成
-
動態重定位(常用):
- 在進程執行過程中進行地址變換,即逐條指令執行時完成地址轉換
- 需要硬件部件支持
內存管理單元(Memory Management Unit, MMU)
重定位寄存器,將邏輯地址變爲物理地址
空閒內存管理
- 等長劃分:位圖
- 不等長劃分:空閒區表、已分配區表,空閒塊鏈表
內存分配算法:
- 首次適配(first fit):在空閒區表中找到第一個滿足進程要求的空閒區
- 下次適配(next fit):從上次找到的空閒區處接着查找
- 最佳適配(best fit):查找整個空閒區表,找到能夠滿足進程要求的最小空閒區
- 最差適配(worst fit):總是分配滿足進程要求的最大空閒區
夥伴系統
- 一種經典的內存分配算法
- Linux底層內存管理採用
- 一種特殊的“分離適配算法”
- 主要思想:將內存按2的冪進行劃分,組成若干空閒塊鏈表;查找該鏈表找到能滿足進程需求的最佳匹配塊
基本內存管理方案
- 單一連續區
- 固定分區
- 可變分區
- 頁式
- 段式
- 段頁式
單一連續區
- 特點:一段時間內只有一個進程在內存
- 簡單,內存利用率低
固定分區
- 把內存空間分割成若干區域,稱爲分區
- 每個分區的大小可以相同也可以不同
- 分區大小固定不變
- 每個分區裝一個且只能裝一個進程
可變分區
- 根據進程的需要,把內存空閒空間分配給該進程
- 剩餘部分成爲新的空閒區
- 產生外碎片,導致內存利用率下降
- 碎片問題:
- 碎片:很小的、不易利用的空閒區->導致內存利用率下降
- 解決方案:緊縮技術(memory compaction, 又稱壓縮技術、緊緻技術、搬家技術):在內存移動程序,將所有小的空閒區合併爲較大的空閒區
頁式
- 用戶進程地址空間被劃分爲大小相等的部分,稱爲頁(page)或頁面,從0開始編號
- 內存空間按同樣大小劃分爲大小相等的區域,稱爲頁框(page frame,物理頁面/頁幀/內存塊),從0開始編號
- 內存分配:以頁爲單位進行,並按照進程需要的頁數來分配;邏輯上相鄰的頁,物理上不一定相鄰
- 典型頁面尺寸:4K 或 4M
- 邏輯地址:頁號(高20位)+頁內地址(偏移, 低12位);劃分是由系統自動完成的,對用戶是透明的
- 頁表:
- 頁表項:記錄了邏輯頁號與頁框號的對應關係
- 每一個進程一個頁表,存放在內存
- 頁表起始地址保存在頁表基址寄存器(page table base register),簡稱PTBR
- 地址轉換(硬件支持):CPU取到邏輯地址(頁號+頁內偏移),自動劃分爲頁號和頁內偏移;用頁號查頁表,取得頁框號,再與頁內偏移拼接成爲物理地址
- 空閒內存管理:內碎片
段式
- 用戶進程地址空間:按程序自身的邏輯關係劃分爲若干個程序段,每個程序段都有一個段名
- 內存空間被動態劃分爲若干長度不相同的區域,稱爲物理段,每個物理段由起始地址和長度確定
- 內存分配:以段爲單位進行分配,每段在內存中佔據連續空間,但各段之間可以不相鄰
- 邏輯地址:段號+段內地址;不是自動劃分,必須顯示給出
- 段表:
- 每項記錄了段號、段首地址和段長度之間的關係
- 每一個進程一個段表,存放在內存
- 段表起始地址保存在段表基址寄存器
- 地址轉換(硬件支持):CPU取到邏輯地址(段號+段內地址),用段號查段,得到該段在內存的起始地址,與段內偏移地址計算出物理地址
段頁式
- 用戶進程劃分:先按段劃分,每一段再按頁面劃分
- 邏輯地址:段號+段內地址,段內地址=頁號+頁內地址
- 內存劃分:等長劃分(同頁式存儲管理方案)
- 內存分配:以頁爲單位進行分配(同頁式存儲管理方案)
- 段表:記錄了每一段的頁表起始地址和頁表長度
- 頁表:記錄了邏輯頁號與頁框號的對應關係
- 每一段有一張頁表,一個進程有多個頁表
- 空閒區管理:同頁式存儲管理方案
交換技術
內存“擴充”技術:在較小的內存空間運行較大的進程
- 內存緊縮技術(例如:可變分區)
- 覆蓋技術 overlaying
- 交換技術 swapping
- 虛擬存儲技術 virtual memory
覆蓋技術 overlaying
- 解決的問題:程序大小超過物理內存總和
- 程序執行過程中,程序的不同部分在內存中相互替代:按照其自身的邏輯結構,將那些不會同時執行的程序共享同一塊內存區域;要求程序各模塊之間有明確的調用結構
- 程序員聲明覆蓋結構,操作系統完成自動覆蓋(主要用於早期的操作系統)
交換技術 swapping
- 內存空間緊張時,系統將內存中某些進程暫時移到外存,把外存中某些進程換進內存,佔據前者所佔用的區域(進程在內存與磁盤之間的動態調度)
- 交換的內容:運行時創建或修改的內容——棧和堆
- 交換區:一般系統會指定一塊特殊的磁盤區域作爲交換空間(swap space),包含連續的磁道,操作系統可以使用底層的磁盤讀寫操作對其高效的訪問
- 交換髮生的時機:只要不用就換出(很少再用);內存空間不夠或有不夠的危險時換出。與調度器結合使用
- 考慮進程的各種屬性:不應換出處於等待I/O狀態的進程
Chapter 9 虛擬內存
- 虛擬內存:當進程運行時,先將其一部分裝入內存,另一部分暫留在磁盤,當要執行的指令或訪問的數據不在內存時,由操作系統自動完成將它們從磁盤調入內存的工作
- 虛擬地址空間:分配給進程的虛擬內存
- 虛擬地址:在虛擬內存中指令或數據的位置,該位置可以被訪問,彷彿它是內存的一部分
虛擬頁式存儲管理:虛擬存儲技術+頁式存儲管理方案
- 請求調頁(demand paging)
- 預先調頁(pre-paging)
頁表項設計:
- 頁框號(內存塊號、物理頁面號、頁幀號):對應具體頁面
- 有效位(駐留位、中斷位):表示該頁是在內存還是在磁盤
- 訪問號(引用位):該頁是否被訪問過
- 修改位:此頁在內存中是否被修改過(被修改後,需寫回到磁盤)
- 保護位:只讀/可讀寫
通常,頁表項是硬件設計的
內存管理單元(MMU):通過虛擬地址,計算出物理地址
爲了加快地址映射速度,引入塊表(TLB):程序訪問的局部性原理
快表
- TLB (Translation Look-aside Buffers):一直隨機存取型存儲器
- 相聯存儲器(associative memory):特點:按內容並行查找
- 保存正在運行進程的頁表的子集(部分頁表項)
頁錯誤(PAGE FAULT)
- 又稱 頁面錯誤、頁故障、頁面失效
- 地址轉換過程中硬件產生的異常
- 原因:
- 所訪問的虛擬頁面沒有調入物理內存——缺頁異常
- 頁面訪問違反權限(讀/寫、用戶/內核)
- 錯誤的訪問地址
缺頁異常處理
- 在地址映射過程中,硬件檢查頁表時發現所要訪問的頁面不在內存,則產生該異常
- 操作系統執行缺頁異常處理程序:獲得磁盤地址,啓動磁盤,將該頁調入內存
- 如果內存中有空閒頁框,則分配一個頁框,將新調入頁裝入,並修改頁表中相應頁表項的有效位及相應的頁框號
- 若內存中沒有空閒頁框,則要置換內存中某一頁框;若該頁框內容被修改過,則要將其寫回磁盤
駐留集:給每個進程分配多少頁框
- 固定分配策略
- 進程創建時確定
- 可以根據進程類型(交互、批處理、應用類)或者基於程序員或系統管理員的需要來確定
- 可變分配策略
- 根據缺頁率評估進程局部性表現
- 缺頁率高->增加頁框數
- 缺頁率低->減少頁框數
- 會帶來新的系統開銷
- 根據缺頁率評估進程局部性表現
置換範圍
- 局部置換策略:僅在產生本次缺頁的進程的駐留集中選擇
- 全局置換策略:將內存中所有未鎖定的頁框都作爲置換的候選
置換策略:決定置換當前內存中的哪一個頁框
- 目標:置換最近最不可能訪問的頁
- 根據局部性原理,最近的訪問歷史和最近將要訪問的模式間存在相關性。因此,大多數策略都是基於過去的行爲預測將來的行爲
- 約束:不能置換被鎖定的頁框
頁面鎖定:
- 採用虛擬內存後,新的開銷使進程運行時間變得不確定
- 給每一頁框增加一個鎖定位,通過設置相應的鎖定位,不讓操作系統將進程使用的頁面換出內存,避免產生由交換帶來的不確定的延遲
- 例如:操作系統核心代碼、關鍵數據結構、I/O緩衝區
清除策略
- 清除:從進程的駐留集中收回頁框
- 虛擬頁式系統工作的最佳狀態:發生缺頁異常時,系統中有大量的空閒頁框
- 結論:在系統中保存一定數目的空閒頁框供給 比使用所有內存並在需要時搜索一個頁框有更好的性能
- 設計一個分頁守護進程:
- 多數時間處於睡眠,可定期喚醒以檢查內存的狀態
- 如果空閒頁框過少,分頁守護進程通過預定的頁面置換算法選擇頁面換出內存
- 如果頁面裝入內存後被修改過,則將它們寫回磁盤分頁守護進程可保證所有的空閒頁框是“乾淨”的
- 頁緩衝技術:
- 不丟棄置換出的頁,將它們放入兩個表之一:如果未被修改,則放到空閒頁鏈表中,如果修改了,則放到修改頁鏈表中
- 被修改的頁定期寫回磁盤
- 被置換的頁仍然保留在內存中,一旦進程又要訪問該頁,可以迅速將它加入該進程的駐留集合
頁面置換算法
最佳頁面置換算法(OPT)
- 設計思想:置換以後不再需要的或最遠的將來纔會用到的頁面
- 作爲一種標準來衡量其他算法的性能
先進先出算法(FIFO)
- 選擇在內存中駐留時間最長的頁並置換它
- 實現:頁面鏈表法
第二次機會算法(SCR, Second Chance)
- 按照先進先出算法選擇某一頁面,檢查其訪問位R:如果爲0,則置換該頁;如果爲1,則給第二次機會,並將訪問位置0
- 摘鏈掛鏈帶來新的開銷
- 改進算法:時鐘算法(CLOCK)
最近未使用算法(NRU, Not Recently Used)
- 選擇在最近一段時間內未使用的一頁並置換
- 實現:設置頁表表項的兩位:訪問位(R),修改位(M)
- 啓動一個進程時,R、M位置0;R位被定期清零
- 算法思想:隨機從編號最小的非空類中選擇一頁置換:
- 無訪問,無修改
- 無訪問,有修改
- 有訪問,無修改
- 有訪問,有修改
最近最少使用算法(LRU, Least Recently Used)
- 選擇最後一次訪問時間距離當前時間最長的一頁並置換,即置換未使用時間最長的一頁
- 性能接近OPT
- 實現:時間戳 或 維護一個訪問頁的棧,但開銷大
最不經常使用算法(NFU, Not Frequently Used)
- 選擇訪問次數最少的頁面置換
- LRU的一種軟件解決方案
- 實現:
- 軟件計數器,一頁一個,初值爲0
- 每次時鐘中斷時,計數器加R
- 發生缺頁中斷時,選擇計數器值最小的一頁置換
- 改進算法:老化算法
老化算法(AGING)
改進(模擬LRU):計數器在加R前先右移一位,R加到計數器的最左端
BELAGY現象
FIFO頁面置換算法會產生異常現象(Belady現象):當分配給進程的物理頁面數增加時,缺頁次數反而增加
顛簸(Thrashing, 抖動)
虛擬內存中,頁面在內存與磁盤之間頻繁調度,使得調度頁面所需的時間比進程實際運行的時間還多,這樣導致系統效率急劇下降
工作集模型
- 一般情況下,進程在一段時間內總是集中訪問一些頁面,這些頁面稱爲 活躍頁面
- 如果分配給一個進程的物理頁面數太少,使該進程所需的活躍頁面不能全部裝入內存。則進程在運行過程中將頻繁發生中斷
- 如果能爲進程提供與活躍頁面數相等的物理頁面數,則可減少缺頁中斷次數
工作集:一個進程當前正在使用的頁框集合
工作集算法
- 找出一個不在工作集的頁面並置換它
- 每個頁表項中有一個字段:記錄該頁面最後一次被訪問的時間
- 設置一個時間值T
- 判斷:根據一個頁面的訪問時間是否落在“當前時間 - T”之前還是之中,決定其在工作集之外還是之內
內存映射文件:進程通過一個系統調用(mmap)將一個文件(或部分)映射到其虛擬地址空間的一部分
Chapter 10 文件系統
文件
- 是對磁盤的抽象
- 一組帶標識(即文件名)的、在邏輯上有完整意義的信息項的序列
- 信息項:構成文件內容的基本單位,各信息項之間有順序關係
文件系統
- 統一管理磁盤空間,實施磁盤空間的分配與回收
- 實現文件的按名存取:名字空間→磁盤空間
- 實現文件信息的共享,並提供文件的保護、保密手段
- 向用戶提供接口
- 提高性能
- 提供與I/O系統的統一接口
文件控制塊(File Control Block):爲管理文件而設置的數據結構,保存管理文件所需的所有有關信息(文件屬性或元數據)
文件目錄
- 統一管理每個文件的元數據,以支持文件名到文件物理地址的轉換
- 將所有文件的管理信息組織在一起,即構成文件目錄
目錄文件
- 將文件目錄以文件的形式存放在磁盤上
目錄項
- 構成文件目錄的基本單元
- 目錄項可以是FCB,目錄是文件控制塊的有序集合
文件的物理結構
- 連續(順序)結構:文件的信息存放在若干連續的物理塊中
- 鏈接結構:一個文件的信息存放在若干不連續的物理塊中,各塊之間通過指針連接
- 索引結構:
- 一個文件的信息存放在若干不連續的物理塊中
- 系統爲每一個文件建立一個專用數據結構——索引表,並將這些物理塊的塊號存放在該索引表中
- 索引表就是磁盤塊地址數組,其中第i個條目指向文件的第i塊
磁盤分區(partition):把一個物理磁盤的存儲空間劃分爲幾個相互獨立的部分,稱爲分區
文件卷(volume):磁盤上的邏輯分區,由一個或多個物理塊組成
格式化:在一個文件捲上建立文件系統,即建立並初始化用於文件分配和磁盤空閒空間管理的管理數據
寫於2014年