1. 程式人生 > >操作系統面試相關總結

操作系統面試相關總結

限時 制作 能力 相關 rom aid title ear 地址映射


title: 操作系統面試相關總結
toc: true
date: 2018-09-28 17:08:01
categories:

  • Web

tags:

  • 操作系統

參考課程:操作系統

參考資料:計算機操作系統教程


操作系統的四個特性

  • 並發:同一時間段內多個程序執行
    • 需要區別並行和並發
    • 並行為同一時刻多個程序執行
  • 共享:系統中的資源可以被內存中的多個並發執行的進線程共同使用
  • 虛擬:通過時分復用和空分復用技術實現把一個物理實體虛擬為多個
    • 時分復用:如分時系統,就是將提供給整個信道傳輸信息的事件劃分成若幹時間片(簡稱時隙),並將這些時隙分配給每一個信號源使用
    • 空分復用:如虛擬內存,指讓同一個頻段在不同的空間內得到重復利用
  • 異步:操作系統允許多個程序並發執行,但由於資源有限,進程的執行不是一步到底的,而是走走停停,以不可知的速度向前推進
    • 這導致當操作系統運行在一種隨機的環境下時,可能導致進程產生與時間有關的錯誤
    • 但只要運行環境相同,操作系統必須保證多次運行進程都獲得相同的結果

操作系統的主要功能

  • 進程管理:包括進程控制、進程同步、進程通信和進程調度
  • 內存管理:包括內存分配、內存保護、地址映射和內存擴充
  • 設備管理:負責管理各類外圍設備(簡稱:外設),包括分配、啟動和故障處理等
    • 完成用戶的IO請求
    • 為用戶進程分配IO設備
    • 提高IO設備利用率
    • 提高IO速度
    • 方便IO的使用
  • 文件管理:管理系統文件和用戶文件,方便使用同時保證安全性
    • 磁盤存儲空間管理
    • 目錄管理
    • 文件讀寫管理
    • 文件共享和保護
  • 作業管理:每個用戶請求計算機系統完成的一個獨立的操作稱為作業。作業管理包括作業的輸入和輸出,作業的調度與控制(根據用戶的需要控制作業運行的步驟)

進程的狀態與轉換

技術分享圖片

  • 新建: 對應於進程剛剛被創建時沒有被提交的狀態,並等待系統完成創建進程的所有必要信息
  • 運行:當一個進程在處理機上運行時,則稱該進程處於運行狀態
    • 處於此狀態的進程的數目小於等於處理器的數目
    • 對於單處理機系統,處於運行狀態的進程只有一個
    • 在沒有其他進程可以執行時(如所有進程都在阻塞狀態),通常會自動執行系統的空閑進程。
  • 就緒:當一個進程獲得了除處理機以外的一切所需資源,一旦得到處理機即可運行,則稱此進程處於就緒狀態。就緒進程可以按多個優先級
    來劃分隊列:
    • 當一個進程由於時間片用完而進入就緒狀態時,排入低優先級隊列
    • 當進程由I/O操作完成而進入就緒狀態時,排入高優先級隊列。
  • 阻塞:也稱為等待或睡眠狀態,一個進程正在等待某一事件發生(例如請求I/O而等待I/O完成等)而暫時停止運行,這時即使把處理機分配給進程也無法運行,故稱該進程處於阻塞狀態

  • 終止:進程已結束運行,回收除進程控制塊之外的其他資源,並讓其他進程從進程控制塊中收集有關信息(如記帳和將退出代碼傳遞給父進程)

進程與線程

方面 進程 線程
根本區別 操作系統資源分配的基本單位 任務調度和執行的基本單位
開銷方面 每個進程都有獨立的代碼和數據空間(程序上下文),程序之間的切換會有較大的開銷 線程可以看做是輕量級的進程。同一類線程共享代碼和數據空間,每個線程都有自己獨立的運行棧和程序計數器,線程之間切換的開銷很小
所處環境 操作系統中多個進程可以並發運行 同一個進程中可以有多個線程同時執行(通過CPU調度,在每個時間片中只有一個線程執行)
內存分配 系統在運行時會為每個進程分配不同的內存空間 除了CPU外,系統不會為線程分配內存(線程使用的資源來自其所屬進程的資源),線程組之間只能共享資源
包含關系 進程可以包含多個線程,且這些線程可以並發運行 線程是進程的一部分,所以線程也被稱為輕權進程或者輕量級進程

進程通信

進程之間的信息交換。

  • 共享內存
  • 信息傳遞
  • 管道通信
    • 管道,是指用於連接一個讀進程和一個寫進程以實現它們之間通信的一個共享文件,又名pipe文件
    • 向管道(共享文件)提供輸入的發送進程(即寫進程),以字符流形式將大量的數據送入(寫)管道
    • 而接收管道輸出的接收進程(即讀進程),則從管道中接收(讀)數據
    • 為了協調雙方的通信,管道機制必須提供以下三方面的協調能力:互斥、同步和確定對方的存在

進程同步

多進程雖然提高了系統資源利用率和吞吐量,但是由於進程的異步性可能造成系統的混亂。

進程同步的任務就是對多個相關進程在執行順序上進行協調,使並發執行的多個進程之間可以有效的共享資源和相互合作,保證程序執行的可再現性。

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

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

經典的進程同步問題:

  • 生產者-消費者問題
  • 哲學家進餐問題
  • 讀者-寫者問題

同步的解決方案:

  • 管程
  • 信號量

用戶態和內核態

技術分享圖片

運行在用戶態下的程序不能直接訪問操作系統內核數據結構和程序。

用戶態切換到內核態的3種方式

  1. 系統調用:用戶態進程主動要求切換到內核態的一種方式,用戶態進程通過系統調用申請使用操作系統提供的服務程序完成工作。
  2. 異常:當CPU在執行運行在用戶態下的程序時,發生了某些事先不可知的異常,這時會觸發由當前運行進程切換到處理此異常的內核相關程序中,也就轉到了內核態,比如缺頁異常。
  3. 外圍設備的中斷:當外圍設備完成用戶請求的操作後,會向CPU發出相應的中斷信號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷信號對應的處理程序,如果先前執行的指令是用戶態下的程序,那麽這個轉換的過程自然也就發生了由用戶態到內核態的切換。比如硬盤讀寫操作完成,系統會切換到硬盤讀寫的中斷處理程序中執行後續操作等。

死鎖

多個進程在運行過程中,因為爭奪資源而造成的一種僵局。

死鎖原因

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

死鎖的四個必要條件

  1. 互斥:在一個時間只能有一個進程使用資源
  2. 持有並等待:進程持有至少一個資源時,等待獲取其他進程持有的額外資源
  3. 無搶占:進程對於已經申請到的資源在使用完成之前不可以被剝奪
  4. 循環等待:存在進程集合{P0,P1,...,PN},P0正在等待P1占用的資源,P1正在等待P2占用的資源,……,PN-1正在等待PN占用的資源,PN正在等待P0占用的資源

死鎖處理

  • 確保系統永遠不會進入死鎖狀態
  • 系統可能進入死鎖狀態,若進入死鎖狀態則進行恢復
  • 忽略這個問題,假裝系統中從來沒有發生死鎖;用於大多數操作系統,包括UNIX。
  1. 死鎖預防:破壞產生死鎖的4個必要條件中的一個或者多個
    1. 互斥:不互斥可能帶來不確定性問題
    2. 持有並等待:讓一個資源在請求資源時,不持有任何其他資源。為請求資源的進程分配所有資源;僅當進程不占有資源時才可以請求資源。但是這會導致資源利用率低,還可能發生饑餓
    3. 無搶占:搶占資源只能kill掉正在占有資源的進程,不合理
    4. 循環等待:對所有資源類型進行排序,並要求每個進程按照資源的順序進行申請。在嵌入式系統中經常這種方法,因為嵌入式系統資源比較有限
  2. 死鎖避免:額外的先行驗證
    1. 最簡單最有效的模式是要求每個進程聲明它可能需要的每個類型資源的最大數目
    2. 限定提供與分配的資源數量和進程的最大需求
    3. 在進程申請資源時檢查資源分配狀態來進行資源分配,以確保永遠不會有一個環形等待狀態
    4. 銀行家算法:死鎖避免的著名算法。以銀行借貸系統的分配策略為基礎,判斷並保證系統的安全運行
  3. 死鎖檢測:允許系統運行過程中產生死鎖,在死鎖發生之後,采用一定的算法進行檢測,並確定與死鎖相關的資源和進程,采取相關方法清除檢測到的死鎖。實現難度大
  4. 死鎖恢復:與死鎖檢測配合,將系統從死鎖中解脫出來(撤銷進程或者剝奪資源)。對檢測到的和死鎖相關的進程以及資源,通過撤銷或者掛起的方式,釋放一些資源並將其分配給處於阻塞狀態的進程,使其轉變為就緒態。實現難度大。

進程調度算法

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

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

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

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

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

內存連續分配

動態分區分配時所采用的幾種算法。

動態分區分配又稱為可變分區分配,是一種動態劃分內存的分區方法。

這種分區方法不預先將內存劃分,而是在進程裝入內存時,根據進程的大小動態地建立分區,並使分區的大小正好適合進程的需要。

因此系統中分區的大小和數目是可變的。

  • 首次適應(First Fit)算法:空閑分區以地址遞增的次序鏈接。分配內存時順序查找,找到大小能滿足要求的第一個空閑分區。

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

  • 最壞適應(Worst Fit)算法:又稱最大適應(Largest Fit)算法,空閑分區以容量遞減的次序鏈接。找到第一個能滿足要求的空閑分區,也就是挑選出最大的分區。

基本分頁儲存管理方式

把主存空間劃分為大小相等且固定的塊,塊相對較小,作為主存的基本單位。

每個進程也以塊為單位進行劃分,進程在執行時,以塊為單位逐個申請主存中的塊空間。

因為程序數據存儲在不同的頁面中,而頁面又離散的分布在內存中,因此需要一個頁表來記錄邏輯地址和實際存儲地址之間的映射關系,以實現從頁號到物理塊號的映射。

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

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

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

基本分段儲存管理方式

分頁是為了提高內存利用率,而分段是為了滿足程序員在編寫代碼的時候的一些邏輯需求(比如數據共享,數據保護,動態鏈接等)。

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

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

分段分頁方式的比較

頁是信息的物理單位,是出於系統內存利用率的角度提出的離散分配機制;

段是信息的邏輯單位,每個段含有一組意義完整的信息,是出於用戶角度提出的內存管理機制。

頁的大小是固定的,由系統決定;

段的大小是不確定的,由用戶決定。

段頁式存儲

基本思想

分頁系統能有效地提高內存的利用率,而分段系統能反映程序的邏輯結構,便於段的共享與保護,將分頁與分段兩種存儲方式結合起來,就形成了段頁式存儲管理方式。

在段頁式存儲管理系統中,作業的地址空間首先被分成若幹個邏輯分段,每段都有自己的段號,然後再將每段分成若幹個大小相等的頁。對於主存空間也分成大小相等的頁,主存的分配以頁為單位。

段頁式系統中,作業的地址結構包含三部分的內容:段號,頁號,頁內位移量

程序員按照分段系統的地址結構將地址分為段號與段內位移量,地址變換機構將段內位移量分解為頁號和頁內位移量。

為實現段頁式存儲管理,系統應為每個進程設置一個段表,包括每段的段號,該段的頁表始址和頁表長度。每個段有自己的頁表,記錄段中的每一頁的頁號和存放在主存中的物理塊號。

地址變換的過程

  1. 程序執行時,從PCB(進程控制塊)中取出段表始址和段表長度,裝入段表寄存器。
  2. 由地址變換機構將邏輯地址自動分成段號、頁號和頁內地址。
  3. 將段號與段表長度進行比較,若段號大於或等於段表長度,則表示本次訪問的地址已超越進程的地址空間,產生越界中斷。
  4. 將段表始址與段號和段表項長度的乘積相加,便得到該段表項在段表中的位置。
  5. 取出段描述子得到該段的頁表始址和頁表長度。
  6. 將頁號與頁表長度進行比較,若頁號大於或等於頁表長度,則表示本次訪問的地址已超越進程的地址空間,產生越界中斷。
  7. 將頁表始址與頁號和頁表項長度的乘積相加,便得到該頁表項在頁表中的位置。
  8. 取出頁描述子得到該頁的物理塊號。
  9. 對該頁的存取控制進行檢查。
  10. 將物理塊號送入物理地址寄存器中,再將有效地址寄存器中的頁內地址直接送入物理地址寄存器的塊內地址字段中,拼接得到實際的物理地址。

虛擬內存

如果存在一個程序,所需內存空間超過了計算機可以提供的實際內存,那麽由於該程序無法裝入內存所以也就無法運行。

單純的增加物理內存只能解決一部分問題,但是仍然會出現無法裝入單個或者無法同時裝入多個程序的問題。

因此可以從邏輯的角度擴充內存容量,即可解決上述兩種問題。

基於局部性原理,在程序裝入時,可以將程序的一部分裝入內存,而將其余部分留在外存,就可以啟動程序執行。

在程序執行過程中,當所訪問的信息不在內存時,由操作系統將所需要的部分調入內存,然後繼續執行程序

另一方面,操作系統將內存中暫時不使用的內容換出到外存上,從而騰出空間存放將要調入內存的信息

這樣,系統好像為用戶提供了一個比實際內存大得多的存儲器,稱為虛擬存儲器

虛擬存儲器的特征:

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

頁面置換算法

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

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

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

  • 時鐘算法clock(也被稱為是最近未使用算法NRU):頁面設置一個訪問位,並將頁面鏈接為一個環形隊列,頁面被訪問的時候訪問位設置為1。頁面置換的時候,如果當前指針所指頁面訪問為為0,那麽置換,否則將其置為0,循環直到遇到一個訪問為位0的頁面。

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

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

操作系統面試相關總結