1. 程式人生 > >【作業系統】重點知識點總結

【作業系統】重點知識點總結

作業系統的基本特徵

  1. 併發:同一段時間內多個程式執行(注意區別併發和並行,前者是同一時刻的多個事件,後者是統一時間段內的多個事件)
  2. 共享:系統中的資源可以被記憶體中多個併發執行的進執行緒共同使用
  3. 虛擬:通過時分複用(如分時系統)以及空分複用(如虛擬記憶體)技術實現把一個物理實體虛擬為多個
  4. 非同步:系統中的程序是以走走停停的方式執行的,且以一種不可預知的速度推進

作業系統的主要功能

  1. 處理機管理:處理機分配都是以程序為單位,所以處理機管理也被看做是程序管理。包括程序控制,程序同步,程序通訊和程序排程
  2. 儲存器管理(或者記憶體管理):記憶體分配,記憶體保護,地址對映,記憶體擴充
  3. 裝置管理:管理所有外圍裝置,包括完成使用者的IO請求;為使用者程序分配IO裝置;提高IO裝置利用率;提高IO速度;方便IO的使用
  4. 檔案管理:管理使用者檔案和系統檔案,方便使用同時保證安全性。包括:磁碟儲存空間管理,目錄管理,檔案讀寫管理以及檔案共享和保護
  5. 提供使用者介面:程式介面(如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. 虛擬性:虛擬性體現在其從邏輯上擴充了記憶體的容量(可以執行實際記憶體需求比實體記憶體大的應用程式)。虛擬性是虛擬儲存器的最重要特徵也是其最終目標。虛擬性建立在多次性和對換性的基礎上行,多次性和對換性又建立在離散分配的基礎上

頁面置換演算法

  1. 最佳置換演算法:只具有理論意義的演算法,用來評價其他頁面置換演算法。置換策略是將當前頁面中在未來最長時間內不會被訪問的頁置換出去。
  2. 先進先出置換演算法:簡單粗暴的一種置換演算法,沒有考慮頁面訪問頻率資訊。每次淘汰最早調入的頁面
  3. 最近最久未使用演算法LRU:演算法賦予每個頁面一個訪問欄位,用來記錄上次頁面被訪問到現在所經歷的時間t,每次置換的時候把t值最大的頁面置換出去(實現方面可以採用暫存器或者棧的方式實現)
  4. 時鐘演算法clock(也被稱為是最近未使用演算法NRU):頁面設定一個訪問為,並將頁面連結為一個環形佇列,頁面被訪問的時候訪問位設定為1。頁面置換的時候,如果當前指標所指頁面訪問為為0,那麼置換,否則將其置為0,迴圈直到遇到一個訪問為位0的頁面
  5. 改進型Clock演算法:在Clock演算法的基礎上新增一個修改位,替換時根究訪問位和修改位綜合判斷。優先替換訪問為何修改位都是0的頁面,其次是訪問位為0修改位為1的頁面。
  6. 最少使用演算法LFU:設定暫存器記錄頁面被訪問次數,每次置換的時候置換當前訪問次數最少的。存在問題是該訪問暫存器並不能真正反映當前頁面訪問次數,因為訪問速度比較快,所以在更新暫存器的時間間隔內訪問1次和訪問100次都是一樣的。另外,LFU和LRU是很類似的,支援硬體也是一樣的,但是區分兩者的關鍵在於一個以時間為標準,一個以次數為標準(例如對於暫存器 pa 001111 和pb 111000,兩個頁面,如果採用LRU,那麼被淘汰的是pa,如果採用LFU那麼被淘汰的是pb)。
  7. 頁面緩衝演算法PBA:置換的時候,頁面無論是否被修改過,都不被置換到磁碟,而是先暫留在記憶體中的頁面連結串列(已修改頁面連結串列和未修改頁面連結串列,也可以不區分)裡面,當其再次被訪問的時候可以直接從這些連結串列中取出而不必進行磁碟IO,當連結串列中已修改也難數目達到一定數量之後,進行依次寫磁碟操作(相當於將多次IO合併為一次)