1. 程式人生 > >作業系統面試重難點總結

作業系統面試重難點總結

一、作業系統知識點圖譜

二、面試問題總結

參考:面試複習重點——基礎篇:作業系統、計算機網路、設計模式

  1. 作業系統的四個特性。
  2. 作業系統的主要功能。
  3. 程序的有哪幾種狀態,狀態轉換圖,及導致轉換的事件。
    4.程序與執行緒的區別。
    5.程序通訊的幾種方式。
    6.程序同步的幾種方式
    7.使用者態和核心態的區別。
    8.死鎖的概念,導致死鎖的原因.
    9.導致死鎖的四個必要條件。
    10.處理死鎖的四個方式。
    11.預防死鎖的方法、避免死鎖的方法。
    12.程序排程演算法。
    13.記憶體連續分配方式採用的幾種演算法及各自優劣。
    14.基本分頁儲存管理方式。
    15.基本分段儲存管理方式。
    16.分段分頁方式的比較各自優缺點。
    17.幾種頁面置換演算法,會算所需換頁數
    18.虛擬記憶體的定義及實現方式。

三、重難點總結

1. 作業系統的四個特性

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

2.作業系統的主要功能

處理機管理:處理機分配都是以程序為單位,所以處理機管理也被看做是程序管理。包括程序控制,程序同步,程序通訊和程序排程
儲存器管理(或者記憶體管理):記憶體分配,記憶體保護,地址對映,記憶體擴充
裝置管理:管理所有外圍裝置,包括完成使用者的IO請求;為使用者程序分配IO裝置;提高IO裝置利用率;提高IO速度;方便IO的使用
檔案管理:管理使用者檔案和系統檔案,方便使用同時保證安全性。包括:磁碟儲存空間管理,目錄管理,檔案讀寫管理以及檔案共享和保護
提供使用者介面:程式介面(如API)和使用者介面(如GUI)

3.程序的狀態與轉換

 

執行狀態:程序正在處理機上執行。在單處理機環境下,每一時刻最多隻有一個程序處於執行狀態。

就緒狀態:程序已處於準備執行的狀態,即程序獲得了除處理機之外的一切所需資源,一旦得到處理機即可執行。

阻塞狀態,又稱等待狀態:程序正在等待某一事件而暫停執行,如等待某資源為可用(不包括處理機)或等待輸入/輸出完成。即使處理機空閒,該程序也不能執行。

注意區別就緒狀態和等待狀態:就緒狀態是指程序僅缺少處理機,只要獲得處理機資源就立即執行;而等待狀態是指程序需要其他資源(除了處理機)或等待某一事件。

就緒狀態 -> 執行狀態:處於就緒狀態的程序被排程後,獲得處理機資源(分派處理機時間片),於是程序由就緒狀態轉換為執行狀態。

執行狀態 -> 就緒狀態:處於執行狀態的程序在時間片用完後,不得不讓出處理機,從而程序由執行狀態轉換為就緒狀態。此外,在可剝奪的作業系統中,當有更高優先順序的程序就 、 緒時,排程程度將正執行的程序轉換為就緒狀態,讓更高優先順序的程序執行。

執行狀態 -> 阻塞狀態:當程序請求某一資源(如外設)的使用和分配或等待某一事件的發生(如I/O操作的完成)時,它就從執行狀態轉換為阻塞狀態。程序以系統呼叫的形式請求作業系統提供服務,這是一種特殊的、由執行使用者態程式呼叫作業系統核心過程的形式。

阻塞狀態 -> 就緒狀態:當程序等待的事件到來時,如I/O操作結束或中斷結束時,中斷處理程式必須把相應程序的狀態由阻塞狀態轉換為就緒狀態。

4.程序與執行緒的區別

程序:程序是程序實體的執行過程,是系統進行資源分配和排程的一個獨立單位(具有動態、併發、獨立、非同步的特性,以及就緒、執行、阻塞3種狀態);引入程序是為了使多個程式可以併發的執行,以提高系統的資源利用率和吞吐量。

執行緒:是比程序更小的可獨立執行的基本單位,可以看做是輕量級的程序(具有輕型實體,獨立排程分派單位,可併發執行,共享程序資源等屬性);引入目的是為了減少程式在併發執行過程中的開銷,使OS的併發效率更高。

兩者的對比:

  1. 排程方面:在引入執行緒的OS中,執行緒是獨立的排程和分派單位,而程序作為資源的擁有單位(相當於把未引入執行緒的傳統OS中的程序的兩個屬性分開了)。由於執行緒不擁有資源,因此可以顯著的提高併發度以及減少切換開銷。

  2. 併發性:引入了執行緒的OS中,程序間可以併發,而且一個程序內部的多個執行緒之間也是可以併發的,這就使OS具有更好的併發性,有效的提高了系統資源利用率和吞吐量。

  3. 擁有資源:無論OS是否支援執行緒,程序都是基本的資源擁有單位,執行緒只擁有很少的基本的資源,但是執行緒可以訪問所隸屬的程序的資源(程序的程式碼段,資料段和所擁有的系統資源如fd)

  4. 系統開銷:建立或者撤銷程序的時候,系統要為之建立或回收PCB,系統資源等,切換時也需要儲存和恢復CPU環境。而執行緒的切換隻需要儲存和恢復少量的暫存器,不涉及儲存器管理方面的工作,所以開銷較小。此外,統一程序中的多個執行緒由於共享地址空間,所以通訊同步等都比較方便。

5.程序通訊

程序通訊是指程序之間的資訊交換。PV操作是低階通訊方式,髙級通訊方式是指以較高的效率傳輸大量資料的通訊方式。高階通訊方法主要有以下三個類。

共享儲存

在通訊的程序之間存在一塊可直接訪問的共享空間,通過對這片共享空間進行寫/讀操作實現程序之間的資訊交換。在對共享空間進行寫/讀操作時,需要使用同步互斥工具(如 P操作、V操作),對共享空間的寫/讀進行控制。共享儲存又分為兩種:低階方式的共享是基於資料結構的共享;高階方式則是基於儲存區的共享。作業系統只負責為通訊程序提供可共享使用的儲存空間和同步互斥工具,而資料交換則由使用者自己安排讀/寫指令完成。

需要注意的是,使用者程序空間一般都是獨立的,要想讓兩個使用者程序共享空間必須通過特殊的系統呼叫實現,而程序內的執行緒是自然共享程序空間的。

訊息傳遞

在訊息傳遞系統中,程序間的資料交換是以格式化的訊息(Message)為單位的。若通訊的程序之間不存在可直接訪問的共享空間,則必須利用作業系統提供的訊息傳遞方法實現程序通訊。程序通過系統提供的傳送訊息和接收訊息兩個原語進行資料交換。

  1. 直接通訊方式:傳送程序直接把訊息傳送給接收程序,並將它掛在接收程序的訊息緩衝佇列上,接收程序從訊息緩衝佇列中取得訊息。

  2. 間接通訊方式:傳送程序把訊息傳送到某個中間實體中,接收程序從中間實體中取得訊息。這種中間實體一般稱為信箱,這種通訊方式又稱為信箱通訊方式。該通訊方式廣泛應用於計算機網路中,相應的通訊系統稱為電子郵件系統。

管道通訊

管道通訊是訊息傳遞的一種特殊方式。所謂“管道”,是指用於連線一個讀程序和一個寫程序以實現它們之間通訊的一個共享檔案,又名pipe檔案。向管道(共享檔案)提供輸入的傳送程序(即寫程序),以字元流形式將大量的資料送入(寫)管道;而接收管道輸出的接收程序(即讀程序),則從管道中接收(讀)資料。為了協調雙方的通訊,管道機制必須提供以下三方面的協調能力:互斥、同步和確定對方的存在。

6.程序同步

多程序雖然提高了系統資源利用率和吞吐量,但是由於程序的非同步性可能造成系統的混亂。程序同步的任務就是對多個相關程序在執行順序上進行協調,使併發執行的多個程序之間可以有效的共享資源和相互合作,保證程式執行的可再現性

同步機制需要遵循的原則:

  1. 空閒讓進:當沒有程序處於臨界區的時候,應該許可其他程序進入臨界區的申請
  2. 忙則等待:當前如果有程序處於臨界區,如果有其他程序申請進入,則必須等待,保證對臨界區的互斥訪問
  3. 有限等待:對要求訪問臨界資源的程序,需要在有限時間內進入臨界區,防止出現死等
  4. 讓權等待:當程序無法進入臨界區的時候,需要釋放處理機,邊陷入忙等

經典的程序同步問題:生產者-消費者問題;哲學家進餐問題;讀者-寫者問題

同步的解決方案:管程,訊號量。

7.使用者態和核心態

 


當程式執行在3級特權級上時,就可以稱之為執行在使用者態,因為這是最低特權級,是普通的使用者程序執行的特權級,大部分使用者直接面對的程式都是執行在使用者態;

 

反之,當程式執行在級特權級上時,就可以稱之為執行在核心態。

雖然使用者態下和核心態下工作的程式有很多差別,但最重要的差別就在於特權級的不同,即權力的不同。執行在使用者態下的程式不能直接訪問作業系統核心資料結構和程式。

當我們在系統中執行一個程式時,大部分時間是執行在使用者態下的,在其需要作業系統幫助完成某些它沒有權力和能力完成的工作時就會切換到核心態。

使用者態切換到核心態的3種方式

  1. 系統呼叫:這是使用者態程序主動要求切換到核心態的一種方式,使用者態程序通過系統呼叫申請使用作業系統提供的服務程式完成工作。而系統呼叫的機制其核心還是使用了作業系統為使用者特別開放的一箇中斷來實現,例如Linux的int 80h中斷。

  2. 異常:當CPU在執行執行在使用者態下的程式時,發生了某些事先不可知的異常,這時會觸發由當前執行程序切換到處理此異常的核心相關程式中,也就轉到了核心態,比如缺頁異常。
    
  3. 外圍裝置的中斷:當外圍裝置完成使用者請求的操作後,會向CPU發出相應的中斷訊號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷訊號對應的處理程式,如果先前執行的指令是使用者態下的程式,那麼這個轉換的過程自然也就發生了由使用者態到核心態的切換。比如硬碟讀寫操作完成,系統會切換到硬碟讀寫的中斷處理程式中執行後續操作等。
    

8.死鎖

死鎖是指多個程序在執行過程中,因為爭奪資源而造成的一種僵局,如果沒有外力推進,處於僵局中的程序就無法繼續執行。

死鎖原因:

  1. 競爭資源:請求同一有限資源的程序數多於可用資源數
  2. 程序推進順序非法:程序執行中,請求和釋放資源順序不合理,如資源等待鏈

** 死鎖產生的必要條件:**

  1. 互斥條件:程序對所分配的資源進行排他性的使用
  2. 請求和保持條件:程序被阻塞的時候並不釋放鎖申請到的資源
  3. 不可剝奪條件:程序對於已經申請到的資源在使用完成之前不可以被剝奪
  4. 環路等待條件:發生死鎖的時候存在的一個 程序-資源 環形等待鏈

** 死鎖處理: **

  1. 預防死鎖:破壞產生死鎖的4個必要條件中的一個或者多個;實現起來比較簡單,但是如果限制過於嚴格會降低系統資源利用率以及吞吐量

  2. 避免死鎖:在資源的動態分配中,防止系統進入不安全狀態(可能產生死鎖的狀態)-如銀行家演算法

  3. 檢測死鎖:允許系統執行過程中產生死鎖,在死鎖發生之後,採用一定的演算法進行檢測,並確定與死鎖相關的資源和程序,採取相關方法清除檢測到的死鎖。實現難度大

  4. 解除死鎖:與死鎖檢測配合,將系統從死鎖中解脫出來(撤銷程序或者剝奪資源)。對檢測到的和死鎖相關的程序以及資源,通過撤銷或者掛起的方式,釋放一些資源並將其分配給處於阻塞狀態的程序,使其轉變為就緒態。實現難度大

9.程序排程演算法

先來先服務排程演算法FCFS:既可以作為作業排程演算法也可以作為程序排程演算法;按作業或者程序到達的先後順序依次排程;因此對於長作業比較有利;

短作業優先排程演算法SJF:作業排程演算法,演算法從就緒佇列中選擇估計時間最短的作業進行處理,直到得出結果或者無法繼續執行;缺點:不利於長作業;未考慮作業的重要性;執行時間是預估的,並不靠譜 ;

高相應比演算法HRN:響應比=(等待時間+要求服務時間)/要求服務時間;

時間片輪轉排程RR:按到達的先後對程序放入佇列中,然後給隊首程序分配CPU時間片,時間片用完之後計時器發出中斷,暫停當前程序並將其放到佇列尾部,迴圈 ;

多級反饋佇列排程演算法:目前公認較好的排程演算法;設定多個就緒佇列併為每個佇列設定不同的優先順序,第一個佇列優先順序最高,其餘依次遞減。優先順序越高的佇列分配的時間片越短,程序到達之後按FCFS放入第一個佇列,如果排程執行後沒有完成,那麼放到第二個佇列尾部等待排程,如果第二次排程仍然沒有完成,放入第三佇列尾部…。只有當前一個佇列為空的時候才會去排程下一個佇列的程序。

10.記憶體連續分配

主要是指動態分割槽分配時所採用的幾種演算法。
動態分割槽分配又稱為可變分割槽分配,是一種動態劃分記憶體的分割槽方法。這種分割槽方法不預先將記憶體劃分,而是在程序裝入記憶體時,根據程序的大小動態地建立分割槽,並使分割槽的大小正好適合程序的需要。因此係統中分割槽的大小和數目是可變的。

 

首次適應(First Fit)演算法:空閒分割槽以地址遞增的次序連結。分配記憶體時順序查詢,找到大小能滿足要求的第一個空閒分割槽。

最佳適應(Best Fit)演算法:空閒分割槽按容量遞增形成分割槽鏈,找到第一個能滿足要求的空閒分割槽。

最壞適應(Worst Fit)演算法:又稱最大適應(Largest Fit)演算法,空閒分割槽以容量遞減的次序連結。找到第一個能滿足要求的空閒分割槽,也就是挑選出最大的分割槽。

11.基本分頁儲存管理方式

把主存空間劃分為大小相等且固定的塊,塊相對較小,作為主存的基本單位。每個程序也以塊為單位進行劃分,程序在執行時,以塊為單位逐個申請主存中的塊空間。

因為程式資料儲存在不同的頁面中,而頁面又離散的分佈在記憶體中,因此需要一個頁表來記錄邏輯地址和實際儲存地址之間的對映關係,以實現從頁號到物理塊號的對映。

由於頁表也是儲存在記憶體中的,因此和不適用分頁管理的儲存方式相比,訪問分頁系統中記憶體資料需要兩次的記憶體訪問(一次是從記憶體中訪問頁表,從中找到指定的物理塊號,加上頁內偏移得到實際實體地址;第二次就是根據第一次得到的實體地址訪問記憶體取出資料)。


為了減少兩次訪問記憶體導致的效率影響,分頁管理中引入了快表機制,包含快表機制的記憶體管理中,當要訪問記憶體資料的時候,首先將頁號在快表中查詢,如果查詢到說明要訪問的頁表項在快表中,那麼直接從快表中讀取相應的物理塊號;如果沒有找到,那麼訪問記憶體中的頁表,從頁表中得到實體地址,同時將頁表中的該對映表項新增到快表中(可能存在快表換出演算法)。

 

在某些計算機中如果記憶體的邏輯地址很大,將會導致程式的頁表項會很多,而頁表在記憶體中是連續存放的,所以相應的就需要較大的連續記憶體空間。為了解決這個問題,可以採用兩級頁表或者多級頁表的方法,其中外層頁表一次性調入記憶體且連續存放,內層頁表離散存放。相應的訪問記憶體頁表的時候需要一次地址變換,訪問邏輯地址對應的實體地址的時候也需要一次地址變換,而且一共需要訪問記憶體3次才可以讀取一次資料。

12.基本分段儲存管理方式

分頁是為了提高記憶體利用率,而分段是為了滿足程式設計師在編寫程式碼的時候的一些邏輯需求(比如資料共享,資料保護,動態連結等)。

分段記憶體管理當中,地址是二維的,一維是段號,一維是段內地址;其中每個段的長度是不一樣的,而且每個段內部都是從0開始編址的。由於分段管理中,每個段內部是連續記憶體分配,但是段和段之間是離散分配的,因此也存在一個邏輯地址到實體地址的對映關係,相應的就是段表機制。段表中的每一個表項記錄了該段在記憶體中的起始地址和該段的長度。段表可以放在記憶體中也可以放在暫存器中。


訪問記憶體的時候根據段號和段表項的長度計算當前訪問段在段表中的位置,然後訪問段表,得到該段的實體地址,根據該實體地址以及段內偏移量就可以得到需要訪問的記憶體。由於也是兩次記憶體訪問,所以分段管理中同樣引入了聯想暫存器。

 

分段分頁方式的比較

頁是資訊的物理單位,是出於系統記憶體利用率的角度提出的離散分配機制;段是資訊的邏輯單位,每個段含有一組意義完整的資訊,是出於使用者角度提出的記憶體管理機制

頁的大小是固定的,由系統決定;段的大小是不確定的,由使用者決定

13.虛擬記憶體

如果存在一個程式,所需記憶體空間超過了計算機可以提供的實際記憶體,那麼由於該程式無法裝入記憶體所以也就無法執行。單純的增加實體記憶體只能解決一部分問題,但是仍然會出現無法裝入單個或者無法同時裝入多個程式的問題。但是可以從邏輯的角度擴充記憶體容量,即可解決上述兩種問題。

基於區域性性原理,在程式裝入時,可以將程式的一部分裝入記憶體,而將其餘部分留在外存,就可以啟動程式執行。在程式執行過程中,當所訪問的資訊不在記憶體時,由作業系統將所需要的部分調入記憶體,然後繼續執行程式。另一方面,作業系統將記憶體中暫時不使用的內容換出到外存上,從而騰出空間存放將要調入記憶體的資訊。這樣,系統好像為使用者提供了一個比實際記憶體大得多的儲存器,稱為虛擬儲存器。

虛擬儲存器的特徵:

  1. 多次性:一個作業可以分多次被調入記憶體。多次性是虛擬儲存特有的屬性
  2. 對換性:作業執行過程中存在換進換出的過程(換出暫時不用的資料換入需要的資料)
  3. 虛擬性:虛擬性體現在其從邏輯上擴充了記憶體的容量(可以執行實際記憶體需求比實體記憶體大的應用程式)。虛擬性是虛擬儲存器的最重要特徵也是其最終目標。虛擬性建立在多次性和對換性的基礎上行,多次性和對換性又建立在離散分配的基礎上

14.頁面置換演算法

最佳置換演算法:只具有理論意義的演算法,用來評價其他頁面置換演算法。置換策略是將當前頁面中在未來最長時間內不會被訪問的頁置換出去。

先進先出置換演算法:簡單粗暴的一種置換演算法,沒有考慮頁面訪問頻率資訊。每次淘汰最早調入的頁面。

最近最久未使用演算法LRU:演算法賦予每個頁面一個訪問欄位,用來記錄上次頁面被訪問到現在所經歷的時間t,每次置換的時候把t值最大的頁面置換出去(實現方面可以採用暫存器或者棧的方式實現)。

時鐘演算法clock(也被稱為是最近未使用演算法NRU):頁面設定一個訪問位,並將頁面連結為一個環形佇列,頁面被訪問的時候訪問位設定為1。頁面置換的時候,如果當前指標所指頁面訪問為為0,那麼置換,否則將其置為0,迴圈直到遇到一個訪問為位0的頁面。

改進型Clock演算法:在Clock演算法的基礎上新增一個修改位,替換時根究訪問位和修改位綜合判斷。優先替換訪問位和修改位都是0的頁面,其次是訪問位為0修改位為1的頁面。

最少使用演算法LFU:設定暫存器記錄頁面被訪問次數,每次置換的時候置換當前訪問次數最少的。

四、總結

以上只是針對作業系統重點知識點的總結,如果沒有相應的作業系統基礎的話,可能不太好理解,下面推薦自己學習作業系統過程中參考的一些資料。


轉載地址:https://www.jianshu.com/p/d254b138de03