操作系統知識點總結
操作系統的基本特征
- 並發:同一段時間內多個程序執行(註意區別並發和並行,前者是同一時刻的多個事件,後者是統一時間段內的多個事件)
- 共享:系統中的資源可以被內存中多個並發執行的進線程共同使用
- 虛擬:通過時分復用(如分時系統)以及空分復用(如虛擬內存)技術實現把一個物理實體虛擬為多個
- 異步:系統中的進程是以走走停停的方式執行的,且以一種不可預知的速度推進
操作系統的主要功能
- 處理機管理:處理機分配都是以進程為單位,所以處理機管理也被看做是進程管理。包括進程控制,進程同步,進程通信和進程調度
- 存儲器管理(或者內存管理):內存分配,內存保護,地址映射,內存擴充
- 設備管理:管理所有外圍設備,包括完成用戶的IO請求;為用戶進程分配IO設備;提高IO設備利用率;提高IO速度;方便IO的使用
- 文件管理:管理用戶文件和系統文件,方便使用同時保證安全性。包括:磁盤存儲空間管理,目錄管理,文件讀寫管理以及文件共享和保護
- 提供用戶接口:程序接口(如API)和用戶接口(如GUI)
進程和線程的區別
進程:進程是進程實體的運行過程,是系統進行資源分配和調度的一個獨立單位(具有動態、並發、獨立、異步的特性,以及就緒、執行、阻塞3種狀態;也有5狀態或者7狀態;資源擁有單位的屬性);引入進程是為了使多個程序可以並發的執行,以提高系統的資源利用率和吞吐量。
線程:是比進程更小的可獨立運行的基本單位,可以看做是輕量級的進程(具有輕型實體,獨立調度分派單位,可並發執行,共享進程資源等屬性);引入目的是為了減少程序在並發執行過程中的開銷,使OS的並發效率更高。
兩者的對比:
1. 調度方面:在引入線程的OS中,線程是獨立的調度和分派單位,而進程作為資源的擁有單位(相當於把未引入線程的傳統OS中的進程的兩個屬性分開了)。由於線程不擁有資源,因此可以顯著的提高並發度以及減少切換開銷。
2. 並發性:引入了線程的OS中,進程間可以並發,而且一個進程內部的多個線程之間也是可以並發的,這就使OS具有更好的並發性,有效的提高了系統資源利用率和吞吐量。
3. 擁有資源:無論OS是否支持線程,進程都是基本的資源擁有單位,線程只擁有很少的基本的資源,但是線程可以訪問所隸屬的進程的資源(進程的代碼段,數據段和所擁有的系統資源如fd)
4. 系統開銷:創建或者撤銷進程的時候,系統要為之創建或回收PCB,系統資源等,切換時也需要保存和恢復CPU環境。而線程的切換只需要保存和恢復少量的寄存器,不涉及存儲器管理方面的工作,所以開銷較小。此外,統一進程中的多個線程由於共享地址空間,所以通信同步等都比較方便。
進程的幾種狀態
主要是3中基本狀態,5狀態和7狀態可以直接看書
1. 就緒狀態:進程獲得了除了CPU之外的所有的必要資源,只要獲得CPU就可以立即執行,此時的進程處於就緒態
2. 執行狀態:進程已經獲得CPU,正在運行,在多處理其系統中,會有多個進程同時處於運行狀態
3. 阻塞狀態:處於執行狀態的進程由於發生某些事件而暫時無法繼續執行,放棄處理機而處於暫停狀態,此時進程就處於阻塞(執行受到阻塞)狀態
就緒->執行:調度進程為其分配了處理機
執行->就緒:時間片用完
執行->阻塞:申請臨界資源而未被滿足,如IO請求或者申請緩存
阻塞->就緒:請求得到滿足,如IO完成
進程同步
多進程雖然提高了系統資源利用率和吞吐量,但是由於進程的異步性可能造成系統的混亂。進程同步的任務就是對多個相關進程在執行順序上進行協調,使並發執行的多個進程之間可以有效的共享資源和相互合作,保證程序執行的可再現性
同步機制需要遵循的原則:
1. 空閑讓進:當沒有進程處於臨界區的時候,應該許可其他進程進入臨界區的申請
2. 忙則等待:當前如果有進程處於臨界區,如果有其他進程申請進入,則必須等待,保證對臨界區的互斥訪問
3. 有限等待:對要求訪問臨界資源的進程,需要在有限時間呃逆進入臨界區,防止出現死等
4. 讓權等待:當進程無法進入臨界區的時候,需要釋放處理機,邊陷入忙等
經典的進程同步問題:生產者-消費者問題;哲學家進餐問題;讀者-寫者問題
進程間通信
進程通信就是指進程間的信息交換,交換信息可以使一個狀態,也可以是很多的byte。進程間同步互斥也存在信息的交換,因此也屬於是一種IPC,屬於是低級通信。該低級通信存在的問題:1)通信的數據量太少;2)通信對用戶不透明(數據的傳遞或者同步互斥都需要程序員實現)
高級通信機制(高級通信的通信細節被OS隱藏,因此使用起來增加方便而且可以傳送大量的數據,尤其是管道通信):
1. 共享存儲器系統:相互通信的進程共享某些數據結構或者是存儲區,進程之間可以通過這些共享空間進行通信。分為:1)基於共享數據結構的通信,如生產者消費者系統中的有界緩沖區;2)基於共享存儲區的通信,可以傳輸大量數據,通信的進程之間可以像讀寫普通存儲器一樣讀寫共享存儲區
2. 消息傳遞系統:進程間通信采用的是格式化的消息,可以直接使用OS提供的消息發送或者接受原語進行通信。由於隱藏了通信細節,所以簡化了通信程序的復雜性
3. 管道通信:管道是連接兩個一個讀進程和一個寫進程之間用於實現數據交換的一個共享文件。為了協調管道通信雙方,需要管道機制實現如下功能:1)互斥:統一時刻只能有一個進程對管道進行讀寫;2)同步:當讀端發現管道為空的時候需要睡眠等待,直到有數據時候被喚醒,相應的寫端也是在管道已滿的時候等待直到被喚醒;3)確定對方的存在性:只有同時有讀端和寫端,管道才有存在意義
進程/任務調度算法
基本調度算法:
1. 先來先服務調度算法FCFS:既可以作為作業調度算法也可以作為進程調度算法;按作業或者進程到達的先後順序依次調度;因此對於長作業比較有利;
2. 短作業優先調度算法SJ(P)F:作業調度算法,算法從就緒隊列中選擇估計時間最短的作業進行處理,直到得出結果或者無法繼續執行;缺點:不利於長作業;未考慮作業的重要性;運行時間是預估的,並不靠譜
3. 高優先權優先調度算法HPF:既可以作為作業調度也可以作為進程調度算法;調度作業時,從就緒隊列中選擇優先級最高的作業進行處理;由於涉及到了優先級,因此可以分為搶占式和非搶占式;而且優先級的確定也可以分為靜態優先級(事先根據進程類型,進程對資源的需求,用戶要求等方面確定一個固定值);動態優先級(隨進程的推進或者等待時間而增加或者減少)
4. 高相應比算法HRN:響應比=(等待時間+要求服務時間)/要求服務時間;
5. 時間片輪轉調度RR:按到達的先後對進程放入隊列中,然後給隊首進程分配CPU時間片,時間片用完之後計時器發出中斷,暫停當前進程並將其放到隊列尾部,循環
6. 多級反饋隊列調度算法:目前公認較好的調度算法;設置多個就緒隊列並為每個隊列設置不同的優先級,第一個隊列優先級最高,其余依次遞減。優先級越高的隊列分配的時間片越短,進程到達之後按FCFS放入第一個隊列,如果調度執行後沒有完成,那麽放到第二個隊列尾部等待調度,如果第二次調度仍然沒有完成,放入第三隊列尾部…。只有當前一個隊列為空的時候才會去調度下一個隊列的進程。
實時調度算法:
1. 最早截止時間優先調度算法EDF:算法根據任務的開始截止時間確定優先級,截止時間越早,優先級越高。算法維護一個實時就緒隊列,最早截止時間的任務排在最前面;可以用於搶占式調度也可以用於非搶占式調度;
2. 最低松弛度優先調度算法LLF:松弛度=(必須完成時間-本身運行時間-當前時間);算法根據任務的松弛度確定任務的優先級,松弛度代表了任務的緊急程度,任務的緊急程度越高,被賦予的優先級越高
死鎖的必要條件以及處理方式
死鎖是指多個進程在運行過程中,因為爭奪資源而造成的一種僵局,如果沒有外力推進,處於僵局中的進程就無法繼續執行。
死鎖原因:
1. 競爭資源:請求同一有限資源的進程數多於可用資源數
2. 進程推進順序非法:進程執行中,請求和釋放資源順序不合理,如資源等待鏈
死鎖產生的必要條件:
1. 互斥條件:進程對所分配的資源進行排他性的使用
2. 請求和保持條件:進程被阻塞的時候並不釋放鎖申請到的資源
3. 不可剝奪條件:進程對於已經申請到的資源在使用完成之前不可以被剝奪
4. 環路等待條件:發生死鎖的時候存在的一個 進程-資源 環形等待鏈
死鎖處理:
1. 預防死鎖:破壞產生死鎖的4個必要條件中的一個或者多個;實現起來比較簡單,但是如果限制過於嚴格會降低系統資源利用率以及吞吐量
2. 避免死鎖:在資源的動態分配中,防止系統進入不安全狀態(可能產生死鎖的狀態)-如銀行家算法
3. 檢測死鎖:允許系統運行過程中產生死鎖,在死鎖發生之後,采用一定的算法進行檢測,並確定與死鎖相關的資源和進程,采取相關方法清除檢測到的死鎖。實現難度大
4. 解除死鎖:與死鎖檢測配合,將系統從死鎖中解脫出來(撤銷進程或者剝奪資源)。對檢測到的和死鎖相關的進程以及資源,通過撤銷或者掛起的方式,釋放一些資源並將其分配給處於阻塞狀態的進程,使其轉變為就緒態。實現難度大
死鎖定理:S為死鎖狀態的充分條件是,當且僅當S的資源分配圖是不能完全簡化的
內存管理方式-段式頁式和段頁式
由於連續內存分配方式(單一連續分配,固定分區分配,動態分區分配,動態重定位分區分配)導致的內存利用率偏低以及內存碎片的問題,進而引出離散的內存分配方式。離散內存分配可以從OS的內存管理角度引出頁式(離散分配的基本單位是頁)管理,也可以從程序編制角度引出段式(離散分配的基本單位是段)管理。
基本分頁存儲管理
基本分頁存儲管理中不具備頁面置換功能(即沒有實現虛擬內存的功能),因此需要整個程序的所有頁面都裝入內存之後才可以運行。因為程序數據存儲在不同的頁面中,而頁面又離散的分布在內存中,因此需要一個頁表來記錄邏輯地址和實際存儲地址之間的映射關系,以實現從頁號到物理塊號的映射。由於頁表也是存儲在內存中的,因此和不適用分頁管理的存儲方式相比,訪問分頁系統中內存數據需要兩次的內存訪問(一次是從內存中訪問頁表,從中找到指定的物理塊號,加上頁內偏移得到實際物理地址;第二次就是根據第一次得到的物理地址訪問內存取出數據)。
為了減少兩次訪問內存導致的效率影響,分頁管理中引入了快表(或者聯想寄存器)機制,包含快表機制的內存管理中,當要訪問內存數據的時候,首先將頁號在快表中查詢,如果查找到說明要訪問的頁表項在快表中,那麽直接從快表中讀取相應的物理塊號;如果沒有找到,那麽訪問內存中的頁表,從頁表中得到物理地址,同時將頁表中的該映射表項添加到快表中(可能存在快表換出算法)。
在某些計算機中如果內存的邏輯地址很大,將會導致程序的頁表項會很多,而頁表在內存中是連續存放的,所以相應的就需要較大的連續內存空間。為了解決這個問題,可以采用兩級頁表或者多級頁表的方法,其中外層頁表一次性調入內存且連續存放,內層頁表離散存放。相應的訪問內存頁表的時候需要一次地址變換,訪問邏輯地址對應的物理地址的時候也需要一次地址變換,而且一共需要訪問內存3次才可以讀取一次數據。
基本分段存儲管理方式
分頁是為了提高內存利用率,而分段是為了滿足程序員在編寫代碼的時候的一些邏輯需求(比如數據共享,數據保護,動態鏈接等)。
分段內存管理當中,地址是二維的,一維是段號,一維是段內地址;其中每個段的長度是不一樣的,而且每個段內部都是從0開始編址的。由於分段管理中,每個段內部是連續內存分配,但是段和段之間是離散分配的,因此也存在一個邏輯地址到物理地址的映射關系,相應的就是段表機制。段表中的每一個表項記錄了該段在內存中的起始地址和該段的長度。段表可以放在內存中也可以放在寄存器中。
訪問內存的時候根據段號和段表項的長度計算當前訪問段在段表中的位置,然後訪問段表,得到該段的物理地址,根據該物理地址以及段內偏移量就可以得到需要訪問的內存。由於也是兩次內存訪問,所以分段管理中同樣引入了聯想寄存器。
分段和分頁的對比:
1. 頁是信息的物理單位,是出於系統內存利用率的角度提出的離散分配機制;段是信息的邏輯單位,每個段含有一組意義完整的信息,是出於用戶角度提出的內存管理機制
2. 頁的大小是固定的,由系統決定;段的大小是不確定的,由用戶決定
3. 頁地址空間是一維的,段地址空間是二維的
段頁式存儲管理
先將用戶程序分為若幹個段,然後再把每個段分成若幹個頁,並且為每一個段賦予一個段名稱。這樣在段頁式管理中,一個內存地址就由段號,段內頁號以及頁內地址三個部分組成。
段頁式內存訪問:系統中設置了一個段表寄存器,存放段表的起始地址和段表的長度。地址變換時,根據給定的段號(還需要將段號和寄存器中的段表長度進行比較防止越界)以及寄存器中的段表起始地址,就可以得到該段對應的段表項,從段表項中得到該段對應的頁表的起始地址,然後利用邏輯地址中的段內頁號從頁表中找到頁表項,從該頁表項中的物理塊地址以及邏輯地址中的頁內地址拼接出物理地址,最後用這個物理地址訪問得到所需數據。由於訪問一個數據需要三次內存訪問,所以段頁式管理中也引入了高速緩沖寄存器。
虛擬內存及頁面置換算法
如果存在一個程序,所需內存空間超過了計算機可以提供的實際內存,那麽由於該程序無法裝入內存所以也就無法運行。單純的增加物理內存只能解決一部分問題,但是仍然會出現無法裝入單個或者無法同時裝入多個程序的問題。但是可以從邏輯的角度擴充內存容量,即可解決上述兩種問題。
虛擬存儲器就是具有請求調入功能和置換功能,可以從邏輯上對內存容量加以擴充的一種存儲器系統。虛擬存儲器都是建立在離散內存管理的基礎上
虛擬存儲器的特征:
1. 多次性:一個作業可以分多次被調入內存。多次性是虛擬存儲特有的屬性
2. 對換性:作業運行過程中存在換進換出的過程(換出暫時不用的數據換入需要的數據)
3. 虛擬性:虛擬性體現在其從邏輯上擴充了內存的容量(可以運行實際內存需求比物理內存大的應用程序)。虛擬性是虛擬存儲器的最重要特征也是其最終目標。虛擬性建立在多次性和對換性的基礎上行,多次性和對換性又建立在離散分配的基礎上
頁面置換算法
- 最佳置換算法:只具有理論意義的算法,用來評價其他頁面置換算法。置換策略是將當前頁面中在未來最長時間內不會被訪問的頁置換出去。
- 先進先出置換算法:簡單粗暴的一種置換算法,沒有考慮頁面訪問頻率信息。每次淘汰最早調入的頁面
- 最近最久未使用算法LRU:算法賦予每個頁面一個訪問字段,用來記錄上次頁面被訪問到現在所經歷的時間t,每次置換的時候把t值最大的頁面置換出去(實現方面可以采用寄存器或者棧的方式實現)
- 時鐘算法clock(也被稱為是最近未使用算法NRU):頁面設置一個訪問為,並將頁面鏈接為一個環形隊列,頁面被訪問的時候訪問位設置為1。頁面置換的時候,如果當前指針所指頁面訪問為為0,那麽置換,否則將其置為0,循環直到遇到一個訪問為位0的頁面
- 改進型Clock算法:在Clock算法的基礎上添加一個修改位,替換時根究訪問位和修改位綜合判斷。優先替換訪問為何修改位都是0的頁面,其次是訪問位為0修改位為1的頁面。
- 最少使用算法LFU:設置寄存器記錄頁面被訪問次數,每次置換的時候置換當前訪問次數最少的。存在問題是該訪問寄存器並不能真正反映當前頁面訪問次數,因為訪問速度比較快,所以在更新寄存器的時間間隔內訪問1次和訪問100次都是一樣的。另外,LFU和LRU是很類似的,支持硬件也是一樣的,但是區分兩者的關鍵在於一個以時間為標準,一個以次數為標準(例如對於寄存器 pa 001111 和pb 111000,兩個頁面,如果采用LRU,那麽被淘汰的是pa,如果采用LFU那麽被淘汰的是pb)。
- 頁面緩沖算法PBA:置換的時候,頁面無論是否被修改過,都不被置換到磁盤,而是先暫留在內存中的頁面鏈表(已修改頁面鏈表和未修改頁面鏈表,也可以不區分)裏面,當其再次被訪問的時候可以直接從這些鏈表中取出而不必進行磁盤IO,當鏈表中已修改也難數目達到一定數量之後,進行依次寫磁盤操作(相當於將多次IO合並為一次)
操作系統知識點總結