作業系統基礎
基礎篇
注:本文內容總結自《計算機作業系統》第四版(湯小丹等人編著)。本文由博主同步釋出於:https://blog.csdn.net/donotgogentle/article/details/106930437
第一章 引論
1.1 什麼是作業系統?
作業系統是配置在計算機硬體上的第一層軟體。其作用是:
- 管理好硬體裝置,提高它們的利用率和吞吐量
- 為使用者和應用程式提供一個簡單介面,便於使用者使用
具體為:
- 處理機管理
- 儲存器管理
- 裝置管理
- 檔案管理
1.2 作業系統的基本特性
- 並行與併發:並行指兩個及以上時間在同一時間發生,併發指指兩個及以上事件在同一時間間隔發生
- 共享(Sharing):指資源共享,或者資源複用,是指系統中的資源可供記憶體中多個併發執行的程序共同使用。分為:互斥共享,同時訪問
- 虛擬:通過某種技術將一個物理實體變為若干個邏輯上的對應物
- 非同步:程序以人們不可預知的速度向前推進,但能保證多次執行也能得到相同的結果。
第二章 程序
2.1 程序的定義
程序是指在系統中能獨立執行並作為資源分配的基本單位,它是由程式段、相關的資料段、程序控制塊(Process Control Block,PCB)組成的。
2.2 程序的特徵
- 動態性:程序實體由一定的生命週期,由建立而產生,由排程而執行,由撤銷而消亡
- 併發性:併發執行
- 獨立性:程序是能獨立執行、獨立獲得資源、獨立接受排程的基本單位
- 非同步性:程序按照非同步方式執行
2.3 程序的狀態及轉換
2.3.1 程序的三種狀態
- 就緒(Ready):已得到資源,只要獲得CPU即可執行
- 執行(Running)
- 阻塞(Block):正在執行的程序由於突發事件而暫時無法繼續執行。此時引起程序排程,OS將處理機分配給另一個就緒程序
2.3.2 狀態轉換
活動阻塞通過掛起進入靜止阻塞狀態,活動就緒通過掛起進入靜止就緒狀態,而掛起這一操作是由OS將暫時不能執行的程序調入外存。也就是說這兩個狀態下,程序並沒有在記憶體中,而是在外存中。
一項作業被排程時,是OS將該作業調入記憶體,併為之建立程序,分配資源,進入就緒佇列。
2.4 程序控制塊
作業系統為每個程序定義了一個程序控制塊。程序控制塊作為程序實體的一部分,記錄了作業系統所需要的,用於描述程序當前情況以及管理程序執行的全部資訊。
2.5 作業系統核心
通常,將一些與硬體緊密相關的模組、各種裝置的驅動程式以及執行頻率較高的模組,安排在緊靠硬體的軟體層次中,將它們常駐記憶體,即,OS核心。
2.5.1 核心態和使用者態
為防止OS本身及關鍵資料遭到應用程式的破壞,通常將處理機的執行狀態分為兩種:
- 系統態(又叫管態,又叫核心態):具有較高的許可權,能執行一切指令,訪問所有暫存器和儲存區
- 使用者態(又稱目態):具有較低的許可權,僅能執行規定的指令,訪問指定的暫存器和儲存區。一般情況下,應用程式只能在使用者態執行,以防止破壞。
2.6 臨界資源和臨界區
- 臨界資源:印表機等獨佔裝置,程序間採用互斥方式,實現對該資源的共享
- 臨界區:程序中訪問臨界資源的程式碼段
2.7 訊號量
semaphore mutex = 1; P1 () { while (1) { wait (mutex); 臨界區; signal (mutex); 剩餘區; } } P2 () { while (1) { wait (mutex); 臨界區; signal (mutex); 剩餘區; } }
mutex為互斥訊號量,初值為1,範圍(-1,0,1)。
- mutex=1:兩個程序未進入臨界區
- mutex=0:有一個程序進入臨界區執行,另一個必須等待,掛入阻塞佇列
- mutex=-1:有一個程序進入臨界區,另一個程序阻塞,需要被當前已經在臨界區執行的程序退出時喚醒
2.8 管程
一個管程定義了一個數據結構,和能為併發程序所執行(在該資料結構上)的一組操作,這組操作能同步程序和改變管程中的資料。
管程被請求和釋放資源的程序所呼叫。
2.9 程序通訊型別
asfdasdfas
- 共享儲存器系統:共享某些資料結構或者共享儲存區
- 管道通訊系統:用於連線一個讀程序和一個寫程序以及實現它們之間通訊的一個共享檔案,又名pipe檔案
- 訊息傳遞系統:傳送原語(Primitive,由若干條指令組成,它們是原子操作,要麼全做,要麼全不做,原語在系統態下執行,常駐記憶體)
- 客戶機-伺服器系統:套接字、遠端呼叫
2.10 執行緒
執行緒又程輕型程序。
- 排程的基本單位:是能獨立執行的基本單位,切換代價小於程序。在同一程序中,執行緒切換不會引起程序切換。
- 併發性:一個程序中的所有執行緒可以併發執行
- 擁有資源:執行緒本身並不擁有系統資源。同屬於一個程序的所有執行緒有相同的地址空間,這意味著執行緒可以訪問該地址空間中的每個虛地址,還可以訪問程序所擁有的資源,如:I/O,開啟的檔案等。
- 獨立性:執行緒間的獨立性弱於程序間獨立性,因為執行緒共享程序地址空間中的所有地址
- 系統開銷:建立、撤銷和切換執行緒的消耗,遠小於建立、撤銷和切換程序的消耗。
- 支援多處理機系統:程序只能執行在一個處理機上,而一個程序中的多個執行緒分配到多個處理機上
2.10.1 執行緒實現
(1)核心支援執行緒(Kernel Supported Threads)
核心支援執行緒的建立、撤銷、切換、阻塞都是在核心空間進行,由核心對每個執行緒設定的執行緒控制塊對其進行控制。
優點:
- 在多處理器系統中,核心能同時排程同一程序中的多個執行緒並行執行
- 如果程序中的一個執行緒被阻塞,核心還能排程該程序中其他執行緒佔有處理機
- 核心支援執行緒具有很小的資料結構和堆疊,切換速度快,開銷小
缺點:
- 對於使用者的執行緒切換而言,開銷大,在同一程序中,執行緒切換會導致使用者態轉到核心態進行,這是因為使用者程序的執行緒在使用者態執行,而執行緒排程和管理是在核心上實現的。
(2)使用者級執行緒(User Level Threads)
在使用者空間實現,對執行緒的控制無需核心幫助,核心甚至不知道它的存在。
優點:
- 執行緒切換不需要轉到核心空間
- 排程演算法可以是程序根據自身需要而選擇不同的排程演算法,與OS的低階排程演算法無關
- 實現與OS平臺無關,因為執行緒管理程式碼屬於使用者程式的一部分
缺點:
- 大多數系統呼叫將使程序阻塞,進而使程序中的執行緒阻塞,核心則不然
- 在多處理機系統中,核心每次只分配給使用者級程序一個CPU,因此程序中的執行緒只能併發而不是並行執行,核心則不然
(3)組合方式
核心支援多個核心支援執行緒的建立、排程和管理等,同時允許應用程式建立、排程、管理使用者級執行緒。一些核心執行緒對應多個使用者級執行緒,即,使用者級執行緒對部分或者全部核心支援執行緒進行時分多路複用。
分為多對一、一對一、多對多(使用者級執行緒數 >= 核心支援執行緒)。
優點(多對多):
- 在多處理機系統中,同一程序中多個執行緒可以在多個處理機中並行執行
- 減少了執行緒管理的開銷,提高了效率
第三章 處理機排程與死鎖
3.1 處理機排程的層次
- 高階排程
又稱作業(長程)排程,排程物件是作業。根絕演算法,決定將外存上處於後備佇列的哪些作業調入記憶體,為其建立程序、分配資源,放入就緒佇列。
- 低階排程
又稱程序(短程)排程,排程的物件是程序或核心支援執行緒。根據排程演算法,決定哪個程序獲得處理機。
- 中級排程
又稱記憶體排程。把暫時不能執行的程序調入外存,即改為掛起狀態,當這些程序具備執行條件時,再把他們重新調入記憶體,即改為就緒狀態。
3.1.1 作業排程
作業的三種狀態:
- 後備狀態(將使用者提交的作業輸入硬碟,為其建立JCB,放入作業後備佇列)
- 執行狀態(執行)
- 完成狀態(回收資源)。
排程演算法:
(1)先來先服務(FCFS)排程演算法
first-come first-served,優先順序 == 作業等待時間
(2)短作業優先演算法
優先順序 == 作業需要時間短的優先順序高
需要預知作業工作時間,對長作業不利,沒考慮到緊迫性作業
(3)高響應比優先順序排程演算法
優先順序 == (等待時間+要求服務時間)/要求服務時間
3.1.2 程序排程基本概念
程序排程的任務:
- 儲存處理機現場資訊
- 按某種排程演算法選取程序
- 把處理機分配給程序
程序排程方式:
- 非搶佔方式
將處理機分配給某程序後,就讓其執行到結束。
- 搶佔方式
基於優先原則,去暫停某個正在執行的程序,將其分配給另一個優先順序更高的程序。
3.1.3 程序排程演算法
(1)輪轉排程法:
在輪轉法(roundrobin,RB)中,系統根據FCFS策略,將所有的就緒程序排成一個就緒佇列,並設定每隔一定時間間隔即產生一次中斷,啟用系統中的程序排程程式,完成一次排程,將CPU分配給隊首程序(或新的緊急程序),令其執行,當該程序的時間片耗盡或者執行完畢後,系統將再次將CPU分配給新的首程序。
時間片的大小對系統性能有很大影響。時間上一般取略大於一次典型的互動所需要的時間,使大多數互動式程序能在一個時間片內完成。
(2)優先順序排程演算法:
- 靜態優先順序:建立程序時就確定,在整個執行期間保持不變
- 動態優先順序:優先順序隨程序推進或等待時間而改變
3.2 死鎖
3.2.1 死鎖定義
如果一組程序中的每一個程序都在等待,該組程序中的其他程序釋放所佔有的資源後,才能執行,那麼該組程序是死鎖的。
3.2.2 產生死鎖的必要條件
- 互斥條件:程序對所分配到的資源進行排他性使用
- 請求和保持:請求和保持條件:程序已經獲得了一個資源,但還需要其他資源才能進入就緒狀態,而該資源被其他程序佔有,此時該程序被阻塞,但不釋放自己獲得的資源
- 不可搶佔:程序獲得的資源在未使用完成之前不能被搶佔
- 迴圈等待:發生死鎖時存在一個程序-資源迴圈鏈,該鏈上的程序迴圈等待該鏈上的其他程序釋放資源
3.2.3 處理死鎖的方法
避免死鎖-銀行家演算法:
用到的資料結構:
- 可利用資源向量 Available
- 最大需求矩陣Max
- 分配矩陣Allocated
- 需求矩陣Need
銀行家演算法首先執行安全性檢測,若能確定分配資源後系統處於安全狀態,則分配,否則讓程序等待。
安全性檢測:當檢測到程序 P 對資源的請求,演算法嘗試將資源分配(不是真的分配,僅用於計算安全性)給 P,若 Available能滿足 P 的需求(P 的需求必須小於 Need,否則認為出錯),直接分配,並回收 Max
資源 程序 |
Max |
Allocation |
Need |
Available |
AB C |
AB C |
AB C |
A B C | |
P0 |
75 3 |
01 0 |
74 3 |
3 3 2 |
P1 |
32 2 |
20 0 |
12 2 |
|
P2 |
90 2 |
30 2 |
60 0 |
|
P3 |
22 2 |
21 1 |
01 1 |
|
P4 |
43 3 |
00 2 |
43 1 |
檢測此時刻安全性(可能的序列):
(1)Available(3,3,2)分配給P3(0,1, 1),P3完成,歸還資源,Available(5,4,3)
(2)此時P1,P4均可完成,設分給P1,故分配+歸還,Available(7,4,3)
(3)此時剩餘程序均可完成,繼續按照上述步驟,得到存在的可能的安全序列:{P3, P1, P4, P2, P0}
(4)判定分配資源後系統安全,可以分配資源
第四章 儲存器
4.1 儲存器的多層結構
- 暫存器(CPU暫存器)
- 快取記憶體(主存)
主要用於備份主存中常用的資料,以減少處理機對主存的訪問次數,從而提高程式執行速度。基於程式執行的區域性性原理:一段較短時間內,程式執行侷限於某部分。
- 主儲存器(主存)
簡稱記憶體或主存,用於儲存程序執行時的程式和資料。為緩和 CPU 指令執行速度與主儲存器訪問速度的矛盾,引入了快取記憶體和暫存器。
- 硬碟快取(主存)
磁碟 I/O 速遞遠低於主存訪問速度,為緩和這個矛盾,設定磁碟快取。它是利用主存中的儲存空間暫時存放從磁碟中讀取的資訊。
- 固定磁碟(輔存)
- 可移動儲存介質(輔存)
4.2 儲存管理方式
- 分割槽:
該分配方式為使用者程式分配一個連續的記憶體空間,即,程式中程式碼或者資料的邏輯地址相鄰,體現在記憶體空間分配時實體地址的相鄰。連續分配方式分為四類:
(1)單一連續分配 :記憶體分為系統區和使用者區,使用者去記憶體中僅裝有一道使用者程式。
(2)固定分割槽分配 :將使用者空間劃分為若干個固定大小的區域,每個分割槽中之裝入一道作業。分割槽大小的劃分有大小相等和大小不等兩種方法,後者把分割槽分為小分割槽、中分割槽、大分割槽等,相比於方式一能夠減少碎片。
(3)動態分割槽分配 :根據程序的需要動態分配記憶體空間。基於該分配方法,有:
首次適應(first fit,FF)演算法:從空閒分割槽鏈頭部順序找起,找到第一個能滿足程序要求的分割槽大小,在該分割槽中動態為其分配一塊記憶體空間,剩餘部分仍然留在空閒分割槽鏈。
迴圈首次適應(next fit,NF)演算法:從上次找到的地方開始找起。若找到連結串列尾部還沒找到,則返回連結串列頭部,從頭找起。
最佳適應(best fit,BF)演算法:能滿足要求,大小是最小的分割槽被優先分配。
最壞適應(worst fit,WF)演算法:能滿足要求,且大小是最大的分割槽被優先分配。
- 分頁:
使用者程式要想在系統中執行,必須將其裝入記憶體,併為它分配記憶體空間。連續分配儲存往往導致碎片,浪費儲存。
分頁方式將使用者程式的地址空間分為若干個大小固定的區域,稱為“頁”,典型大小為1KB。相應的也將記憶體空間分為若干物理塊,塊大小與頁大小相等。系統為每個程序建立一張頁表,記錄了相應頁在記憶體中對應的物理塊號。
快表:
頁表存放在記憶體中,這使得CPU每次存取一個數據都要訪問兩次記憶體,第一次根據頁號在頁表中查詢得到物理塊號,將該塊號與頁內偏移地址拼接才能形成實體地址,第二次才從實體地址讀寫資料。為提高地址變換速度,出現了快表。在CPU給出有效地址後,由地址變換機構將頁號送入快取記憶體,將此頁號與其中的所有頁號進行比較,若匹配,直接在該快表上得到頁號對應的物理塊地址,並將該地址與業內地址進行拼接得到實體地址,送入實體地址暫存器,從而在相應實體地址上讀寫。若未命中,才訪問記憶體中的頁表。
- 分段:
作業的地址空間被劃分為若干個段,每個段定義了一組邏輯資訊。
分段和分頁的區別:
頁是資訊的物理單位,分頁是系統的行為,使用者不可見。分段中的段是邏輯單位。
頁大小固定,由系統決定。段的長度不固定,由使用者編寫的程式決定。
- 段頁式:
先將程式分段,再將每個段分成若干個頁。由段號和段表起始地址指出對應的頁表起始地址,由段內頁號和對應的頁表定位塊號,由塊號和頁內地址構成實體地址。
第五章 虛擬儲存器
5.1 虛擬儲存基本原理
有的作業很大,所要求的記憶體空間超過了記憶體總容量,虛擬儲存器便是為此而生。虛擬儲存器是基於程式執行的區域性性原理,應用程式在執行前並不需要全部裝入記憶體,僅僅將當前需要執行的少數頁面或者段裝入記憶體便可執行。程式執行時,如果它所需要的段(頁)已經在記憶體,便能繼續執行,否則,發出缺頁(段)中斷請求,此時OS利用請求調頁(段)功能將這些頁(段)調入記憶體,以使程序繼續執行下去。如果此時記憶體已滿,OS再利用頁(段)的置換功能,將記憶體中暫時不用的頁(段)調至盤上,騰出記憶體空間後,再將要訪問的頁(段)調入記憶體。
5.2 頁面排程策略
5.2.1 最佳置換演算法
選擇的淘汰頁是以後永久不使用或者最長時間內不再被訪問的頁面。
5.2.2 先進先出(FIFO)頁面置換演算法
總是淘汰最先進入的頁。
5.2.3 LRU(Least Recently Used)置換演算法
淘汰最近最久未使用的頁。該演算法賦予每個頁面一個訪問欄位,用來記錄一個頁面自上次被訪問以來經歷的時間t,淘汰時選擇t最大的頁淘汰。
5.2.4 最少使用(Least Frequently Used,LFU)置換演算法
記錄每個頁面被訪問的頻率,選擇在最近時期使用最少的頁淘汰。
5.3 抖動
5.3.1 什麼是抖動?
同時執行在系統中的程序太多,造成分配給每個程序的物理塊太少,不能滿足程式正常執行的需求,致使每個程序頻繁地出現缺頁,從而每個程序大部分時間都用於頁面的換進/換出,幾乎不能做有效的工作,從而導致處理機的利用率急劇下降並趨近於0。
5.3.2 什麼是工作集
工作集是某段時間間隔內,程序實際要訪問頁面的集合。在不同時間,工作集所含頁面數不同。
5.3.3 預防抖動的方法
L=S準則:
L為缺頁之間的平均時間,S為平均缺頁服務時間,如果L>S,說明很少缺頁,但處理機利用率低,如果L<S,說明頻繁缺頁。只有當L=S時,磁碟和處理機能達到它們最大的利用率。