1. 程式人生 > >看完這篇作業系統,和麵試官扯皮就沒問題了

看完這篇作業系統,和麵試官扯皮就沒問題了

## 解釋一下什麼是作業系統 作業系統是執行在計算機上最重要的一種`軟體`,它管理計算機的資源和程序以及所有的硬體和軟體。它為計算機硬體和軟體提供了一種中間層 ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515071659861-410484655.png) 通常情況下,計算機上會執行著許多應用程式,它們都需要對記憶體和 CPU 進行互動,作業系統的目的就是為了保證這些訪問和互動能夠準確無誤的進行。 ## 解釋一下作業系統的主要目的是什麼 作業系統是一種軟體,它的主要目的有三種 * 管理計算機資源,這些資源包括 CPU、記憶體、磁碟驅動器、印表機等。 * 提供一種圖形介面,就像我們前面描述的那樣,它提供了使用者和計算機之間的橋樑。 * 為其他軟體提供服務,作業系統與軟體進行互動,以便為其分配執行所需的任何必要資源。 ## 作業系統的種類有哪些 作業系統通常預裝在你購買計算機之前。大部分使用者都會使用預設的作業系統,但是你也可以升級甚至更改作業系統。但是一般常見的作業系統只有三種:**Windows、macOS 和 Linux**。 ## 作業系統結構 ### 單體系統 在大多數系統中,整個系統在核心態以單一程式的方式執行。整個作業系統是以程式集合來編寫的,連結在一塊形成一個大的二進位制可執行程式,這種系統稱為單體系統。 在單體系統中構造實際目標程式時,會首先編譯所有單個過程(或包含這些過程的檔案),然後使用系統連結器將它們全部繫結到一個可執行檔案中 在單體系統中,對於每個系統呼叫都會有一個服務程式來保障和執行。需要一組實用程式來彌補服務程式需要的功能,例如從使用者程式中獲取資料。可將各種過程劃分為一個三層模型 ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515071711050-395565283.png) 除了在計算機初啟動時所裝載的核心作業系統外,許多作業系統還支援額外的擴充套件。比如 I/O 裝置驅動和檔案系統。這些部件可以按需裝載。在 UNIX 中把它們叫做 `共享庫(shared library)`,在 Windows 中則被稱為 `動態連結庫(Dynamic Link Library,DLL)`。他們的副檔名為 `.dll`,在 `C:\Windows\system32` 目錄下存在 1000 多個 DLL 檔案,所以不要輕易刪除 C 盤檔案,否則可能就炸了哦。 ### 分層系統 分層系統使用層來分隔不同的功能單元。每一層只與該層的上層和下層通訊。每一層都使用下面的層來執行其功能。層之間的通訊通過預定義的固定介面通訊。 ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515071718973-1742617191.png) ### 微核心 為了實現高可靠性,將作業系統劃分成小的、層級之間能夠更好定義的模組是很有必要的,只有一個模組 --- 微核心 --- 執行在核心態,其餘模組可以作為普通使用者程序執行。由於把每個裝置驅動和檔案系統分別作為普通使用者程序,這些模組中的錯誤雖然會使這些模組崩潰,但是不會使整個系統宕機。 `MINIX 3` 是微核心的代表作,它的具體結構如下 ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515071734770-959987217.png) 在核心的外部,系統的構造有三層,它們都在使用者態下執行,最底層是裝置驅動器。由於它們都在使用者態下執行,所以不能物理的訪問 I/O 埠空間,也不能直接發出 I/O 命令。相反,為了能夠對 I/O 裝置程式設計,驅動器構建一個結構,指明哪個引數值寫到哪個 I/O 埠,並聲稱一個核心呼叫,這樣就完成了一次呼叫過程。 ### 客戶-伺服器模式 微核心思想的策略是把程序劃分為兩類:`伺服器`,每個伺服器用來提供服務;`客戶端`,使用這些服務。這個模式就是所謂的 `客戶-伺服器`模式。 客戶-伺服器模式會有兩種載體,一種情況是一臺計算機既是客戶又是伺服器,在這種方式下,作業系統會有某種優化;但是普遍情況下是客戶端和伺服器在不同的機器上,它們通過區域網或廣域網連線。 ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515071743420-1257701829.png) 客戶通過傳送訊息與伺服器通訊,客戶端並不需要知道這些訊息是在本地機器上處理,還是通過網路被送到遠端機器上處理。對於客戶端而言,這兩種情形是一樣的:都是傳送請求並得到迴應。 ## 什麼是按需分頁 在作業系統中,程序是以頁為單位載入到記憶體中的,按需分頁是一種`虛擬記憶體`的管理方式。在使用請求分頁的系統中,只有在嘗試訪問頁面所在的磁碟並且該頁面尚未在記憶體中時,也就發生了`缺頁異常`,作業系統才會將磁碟頁面複製到記憶體中。 ## 多處理系統的優勢 隨著處理器的不斷增加,我們的計算機系統由單機系統變為了多處理系統,多處理系統的吞吐量比較高,多處理系統擁有多個並行的處理器,這些處理器共享時鐘、記憶體、匯流排、外圍裝置等。 ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515071750852-2011069228.png) 多處理系統由於可以共享資源,因此可以開源節流,省錢。整個系統的可靠性也隨之提高。 ## 什麼是核心 在計算機中,核心是一個計算機程式,它是作業系統的核心,可以控制作業系統中所有的內容。核心通常是在 boot loader 裝載程式之前載入的第一個程式。 這裡還需要了解一下什麼是 `boot loader`。 >boot loader 又被稱為引導載入程式,它是一個程式,能夠將計算機的作業系統放入記憶體中。在電源通電或者計算機重啟時,BIOS 會執行一些初始測試,然後將控制權轉移到引導載入程式所在的`主引導記錄(MBR)` 。 ## 什麼是實時系統 實時作業系統對時間做出了嚴格的要求,實時作業系統分為兩種:**硬實時和軟實時** `硬實時作業系統`規定某個動作必須在規定的時刻內完成或發生,比如汽車生產車間,焊接機器必須在某一時刻內完成焊接,焊接的太早或者太晚都會對汽車造成永久性傷害。 `軟實時作業系統`雖然不希望偶爾違反最終的時限要求,但是仍然可以接受。並且不會引起任何永久性傷害。比如數字音訊、多媒體、手機都是屬於軟實時作業系統。 你可以簡單理解硬實時和軟實時的兩個指標:**是否在時刻內必須完成以及是否造成嚴重損害**。 ## 什麼是虛擬記憶體 `虛擬記憶體`是一種記憶體分配方案,是一項可以用來輔助記憶體分配的機制。我們知道,應用程式是按頁裝載進記憶體中的。但並不是所有的頁都會裝載到記憶體中,計算機中的硬體和軟體會將資料從 RAM 臨時傳輸到磁碟中來彌補記憶體的不足。如果沒有虛擬記憶體的話,一旦你將計算機記憶體填滿後,計算機會對你說 ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515071803308-424659045.png) 呃,不,**對不起,您無法再載入任何應用程式,請關閉另一個應用程式以載入新的應用程式**。對於虛擬記憶體,計算機可以執行操作是檢視記憶體中最近未使用過的區域,然後將其複製到硬碟上。虛擬記憶體通過複製技術實現了 **妹子,你快來看哥哥能裝這麼多程式** 的資本。複製是自動進行的,你無法感知到它的存在。 ## 什麼是程序和程序表 `程序`就是正在執行程式的例項,比如說 Web 程式就是一個程序,shell 也是一個程序,文章編輯器 typora 也是一個程序。 作業系統負責管理所有正在執行的程序,作業系統會為每個程序分配特定的時間來佔用 CPU,作業系統還會為每個程序分配特定的資源。 作業系統為了跟蹤每個程序的活動狀態,維護了一個`程序表`。在程序表的內部,列出了每個程序的狀態以及每個程序使用的資源等。 http://courses.cs.vt.edu/csonline/OS/Lessons/Processes/index.html 這個網站上面有一個關於程序狀態輪轉的動畫,做的真是太好了。 ## 什麼是執行緒,執行緒和程序的區別 這又是一道老生常談的問題了,從作業系統的角度來回答一下吧。 我們上面說到程序是正在執行的程式的例項,而執行緒其實就是程序中的單條流向,因為執行緒具有程序中的某些屬性,所以執行緒又被稱為輕量級的程序。瀏覽器如果是一個程序的話,那麼瀏覽器下面的每個 tab 頁可以看作是一個個的執行緒。 下面是執行緒和程序持有資源的區別 ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515071813686-341668732.png) 執行緒不像程序那樣具有很強的獨立性,執行緒之間會共享資料 建立執行緒的開銷要比程序小很多,因為建立執行緒僅僅需要`堆疊指標`和`程式計數器`就可以了,而建立程序需要作業系統分配新的地址空間,資料資源等,這個開銷比較大。 ## 使用多執行緒的好處是什麼 多執行緒是程式設計師不得不知的基本素養之一,所以,下面我們給出一些多執行緒程式設計的好處 * 能夠提高對使用者的響應順序 * 在流程中的資源共享 * 比較經濟適用 * 能夠對多執行緒架構有深入的理解 ## 什麼是 RR 排程演算法 `RR(round-robin)` 排程演算法主要針對分時系統,RR 的排程演算法會把時間片以相同的部分並迴圈的分配給每個程序,RR 排程演算法沒有優先順序的概念。這種演算法的實現比較簡單,而且每個執行緒都會佔有時間片,並不存線上程飢餓的問題。 ## 導致系統出現死鎖的情況 死鎖的出現需要同時滿足下面四個條件 * `互斥(Mutual Exclusion)`:一次只能有一個程序使用資源。如果另一個程序請求該資源,則必須延遲請求程序,直到釋放該資源為止。 * `保持並等待(Hold and Wait)`:必須存在一個程序,該程序至少持有一個資源,並且正在等待獲取其他程序當前所持有的資源。 * `無搶佔(No Preemption)`:資源不能被搶佔,也就是說,在程序完成其任務之後,只能由擁有它的程序自動釋放資源。 * `迴圈等待(Circular Wait)` :必須存在一組 {p0,p1,..... pn} 的等待程序,使 p0 等待 p1 持有的資源,p1 等待由 p2 持有的資源, pn-1 正在等待由 pn 持有的資源,而 pn 正在等待由 p0 持有的資源。 ## RAID 的不同級別 RAID 稱為 `磁碟冗餘陣列`,簡稱 `磁碟陣列`。利用虛擬化技術把多個硬碟結合在一起,成為一個或多個磁碟陣列組,目的是提升效能或資料冗餘。 RAID 有不同的級別 * RAID 0 - 無容錯的條帶化磁碟陣列 * RAID 1 - 映象和雙工 * RAID 2 - 記憶體式糾錯碼 * RAID 3 - 位元交錯奇偶校驗 * RAID 4 - 塊交錯奇偶校驗 * RAID 5 - 塊交錯分散式奇偶校驗 * RAID 6 - P + Q冗餘 ## 什麼是 DMA DMA 的中文名稱是`直接記憶體訪問`,它意味著 CPU 授予 I/O 模組許可權在不涉及 CPU 的情況下讀取或寫入記憶體。也就是 DMA 可以不需要 CPU 的參與。這個過程由稱為 DMA 控制器(DMAC)的晶片管理。由於 DMA 裝置可以直接在記憶體之間傳輸資料,而不是使用 CPU 作為中介,因此可以緩解總線上的擁塞。DMA 通過允許 CPU 執行任務,同時 DMA 系統通過系統和記憶體匯流排傳輸資料來提高系統併發性。 ## 多執行緒程式設計的好處是什麼 對不起,我忍不住想偷笑 ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515071952119-961934356.png) 說直白點,為什麼單執行緒能夠處理的卻要用多執行緒來處理?當然是為了提高程式的~~裝逼~~並行能力了。多執行緒`在某些情況下`能夠使你程式執行的更快,這也是為什麼多核 CPU 會出現,但是多核 CPU 的出現會導致資料的一致性問題,不過這些問題程式設計師就能解決。另一個角度來說,多執行緒程式設計能夠提高程式設計師的程式設計能力和程式設計思維。同時也能提高程式設計師的管理能力,你如果把每條執行緒流當作羅老師時間管理的女主一樣,能夠及時協調好所有P友的關係,那你也是超神程式設計師了,所以,是誰說程式設計師不會做管理的?Doug Lea 大佬牛逼!!! >ps:Doug Lea 大佬開發的 JUC 工具包,此處不加狗頭。 ## 什麼是裝置驅動程式 在計算機中,裝置驅動程式是一種計算機程式,它能夠控制或者操作連線到計算機的特定裝置。驅動程式提供了與硬體進行互動的軟體介面,使作業系統和其他計算機程式能夠訪問特定裝置,不用需要了解其硬體的具體構造。 ## 程序間的通訊方式 ### 通訊概念 程序間的通訊方式比較多,首先你需要理解下面這幾個概念 * 競態條件:即兩個或多個執行緒同時對一共享資料進行修改,從而影響程式執行的正確性時,這種就被稱為`競態條件(race condition)`。 * 臨界區:不僅`共享資源`會造成競態條件,事實上共享檔案、共享記憶體也會造成競態條件、那麼該如何避免呢?或許一句話可以概括說明:**禁止一個或多個程序在同一時刻對共享資源(包括共享記憶體、共享檔案等)進行讀寫**。換句話說,我們需要一種 `互斥(mutual exclusion)` 條件,這也就是說,如果一個程序在某種方式下使用共享變數和檔案的話,除該程序之外的其他程序就禁止做這種事(訪問統一資源)。 一個好的解決方案,應該包含下面四種條件 1. 任何時候兩個程序不能同時處於臨界區 2. 不應對 CPU 的速度和數量做任何假設 3. 位於臨界區外的程序不得阻塞其他程序 4. 不能使任何程序無限等待進入臨界區 ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515072002996-174255777.png) * 忙等互斥:當一個程序在對資源進行修改時,其他程序必須進行等待,程序之間要具有互斥性,我們討論的解決方案其實都是基於忙等互斥提出的。 ### 解決方案 程序間的通訊用專業一點的術語來表示就是 `Inter Process Communication,IPC`,它主要有下面幾種通訊方式 ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515072010442-655494220.png) * `訊息傳遞`:訊息傳遞是程序間實現通訊和同步等待的機制,使用訊息傳遞,程序間的交流不需要共享變數,直接就可以進行通訊;訊息傳遞分為傳送方和接收方 * `先進先出佇列`:先進先出佇列指的是兩個不相關聯程序間的通訊,兩個程序之間可以彼此相互程序通訊,這是一種全雙工通訊方式 * `管道`:管道用於兩個相關程序之間的通訊,這是一種半雙工的通訊方式,如果需要全雙工,需要另外一個管道。 * `直接通訊`:在這種程序通訊的方式中,程序與程序之間只存在一條連結,程序間要明確通訊雙方的命名。 * `間接通訊`:間接通訊是通訊雙方不會直接建立連線,而是找到一箇中介者,這個中介者可能是個物件等等,程序可以在其中放置訊息,並且可以從中刪除訊息,以此達到程序間通訊的目的。 * `訊息佇列`:訊息佇列是核心中儲存訊息的連結串列,它由訊息佇列識別符號進行標識,這種方式能夠在不同的程序之間提供全雙工的通訊連線。 * `共享記憶體`:共享記憶體是使用所有程序之間的記憶體來建立連線,這種型別需要同步程序訪問來相互保護。 ## 程序間狀態模型 ```shell cat chapter1 chapter2 chapter3 | grep tree ``` 第一個程序是 `cat`,將三個檔案級聯並輸出。第二個程序是 `grep`,它從輸入中選擇具有包含關鍵字 `tree` 的內容,根據這兩個程序的相對速度(這取決於兩個程式的相對複雜度和各自所分配到的 CPU 時間片),可能會發生下面這種情況,`grep` 準備就緒開始執行,但是輸入程序還沒有完成,於是必須阻塞 grep 程序,直到輸入完畢。 當一個程序開始執行時,它可能會經歷下面這幾種狀態 ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515072028565-300912062.png) 圖中會涉及三種狀態 1. `執行態`,執行態指的就是程序實際佔用 CPU 時間片執行時 2. `就緒態`,就緒態指的是可執行,但因為其他程序正在執行而處於就緒狀態 3. `阻塞態`,除非某種外部事件發生,否則程序不能執行 邏輯上來說,執行態和就緒態是很相似的。這兩種情況下都表示程序`可執行`,但是第二種情況沒有獲得 CPU 時間分片。第三種狀態與前兩種狀態不同的原因是這個程序不能執行,CPU 空閒時也不能執行。 三種狀態會涉及四種狀態間的切換,在作業系統發現程序不能繼續執行時會發生`狀態1`的輪轉,在某些系統中程序執行系統呼叫,例如 `pause`,來獲取一個阻塞的狀態。在其他系統中包括 UNIX,當程序從管道或特殊檔案(例如終端)中讀取沒有可用的輸入時,該程序會被自動終止。 轉換 2 和轉換 3 都是由程序排程程式(作業系統的一部分)引起的,程序本身不知道排程程式的存在。轉換 2 的出現說明程序排程器認定當前程序已經運行了足夠長的時間,是時候讓其他程序執行 CPU 時間片了。當所有其他程序都執行過後,這時候該是讓第一個程序重新獲得 CPU 時間片的時候了,就會發生轉換 3。 >**程式排程指的是,決定哪個程序優先被執行和執行多久,這是很重要的一點**。已經設計出許多演算法來嘗試平衡系統整體效率與各個流程之間的競爭需求。 當程序等待的一個外部事件發生時(如從外部輸入一些資料後),則發生轉換 4。如果此時沒有其他程序在執行,則立刻觸發轉換 3,該程序便開始執行,否則該程序會處於就緒階段,等待 CPU 空閒後再輪到它執行。 ## 排程演算法都有哪些 排程演算法分為三大類:批處理中的排程、互動系統中的排程、實時系統中的排程 ### 批處理中的排程 #### 先來先服務 很像是先到先得。。。可能最簡單的非搶佔式排程演算法的設計就是 `先來先服務(first-come,first-serverd)`。使用此演算法,將按照請求順序為程序分配 CPU。最基本的,會有一個就緒程序的等待佇列。當第一個任務從外部進入系統時,將會立即啟動並允許執行任意長的時間。它不會因為執行時間太長而中斷。當其他作業進入時,它們排到就緒佇列尾部。當正在執行的程序阻塞,處於等待佇列的第一個程序就開始執行。當一個阻塞的程序重新處於就緒態時,它會像一個新到達的任務,會排在佇列的末尾,即排在所有程序最後。 ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515072039914-962597249.png) 這個演算法的強大之處在於易於理解和程式設計,在這個演算法中,一個單鏈表記錄了所有就緒程序。要選取一個程序執行,只要從該佇列的頭部移走一個程序即可;要新增一個新的作業或者阻塞一個程序,只要把這個作業或程序附加在佇列的末尾即可。這是很簡單的一種實現。 不過,先來先服務也是有缺點的,那就是沒有優先順序的關係,試想一下,如果有 100 個 I/O 程序正在排隊,第 101 個是一個 CPU 密集型程序,那豈不是需要等 100 個 I/O 程序執行完畢才會等到一個 CPU 密集型程序執行,這在實際情況下根本不可能,所以需要優先順序或者搶佔式程序的出現來優先選擇重要的程序執行。 #### 最短作業優先 批處理中,第二種排程演算法是 `最短作業優先(Shortest Job First)`,我們假設執行時間已知。例如,一家保險公司,因為每天要做類似的工作,所以人們可以相當精確地預測處理 1000 個索賠的一批作業需要多長時間。當輸入佇列中有若干個同等重要的作業被啟動時,排程程式應使用最短優先作業演算法 ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515072121852-1067573736.png) 如上圖 a 所示,這裡有 4 個作業 A、B、C、D ,執行時間分別為 8、4、4、4 分鐘。若按圖中的次序執行,則 A 的週轉時間為 8 分鐘,B 為 12 分鐘,C 為 16 分鐘,D 為 20 分鐘,平均時間內為 14 分鐘。 現在考慮使用最短作業優先演算法執行 4 個作業,如上圖 b 所示,目前的週轉時間分別為 4、8、12、20,平均為 11 分鐘,可以證明最短作業優先是最優的。考慮有 4 個作業的情況,其執行時間分別為 a、b、c、d。第一個作業在時間 a 結束,第二個在時間 a + b 結束,以此類推。平均週轉時間為 (4a + 3b + 2c + d) / 4 。顯然 a 對平均值的影響最大,所以 a 應該是最短優先作業,其次是 b,然後是 c ,最後是 d 它就只能影響自己的週轉時間了。 >需要注意的是,在所有的程序都可以執行的情況下,最短作業優先的演算法才是最優的。 #### 最短剩餘時間優先 最短作業優先的搶佔式版本被稱作為 `最短剩餘時間優先(Shortest Remaining Time Next)` 演算法。使用這個演算法,排程程式總是選擇剩餘執行時間最短的那個程序執行。當一個新作業到達時,其整個時間同當前程序的剩餘時間做比較。如果新的程序比當前執行程序需要更少的時間,當前程序就被掛起,而執行新的程序。這種方式能夠使短期作業獲得良好的服務。 ### 互動式系統中的排程 互動式系統中在個人計算機、伺服器和其他系統中都是很常用的,所以有必要來探討一下互動式排程 #### 輪詢排程 一種最古老、最簡單、最公平並且最廣泛使用的演算法就是 `輪詢演算法(round-robin)`。每個程序都會被分配一個時間段,稱為`時間片(quantum)`,在這個時間片內允許程序執行。如果時間片結束時程序還在執行的話,則搶佔一個 CPU 並將其分配給另一個程序。如果程序在時間片結束前阻塞或結束,則 CPU 立即進行切換。輪詢演算法比較容易實現。排程程式所做的就是維護一個可執行程序的列表,就像下圖中的 a,當一個程序用完時間片後就被移到佇列的末尾,就像下圖的 b。 ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515072134156-665548691.png) #### 優先順序排程 事實情況是不是所有的程序都是優先順序相等的。例如,在一所大學中的等級制度,首先是院長,然後是教授、祕書、後勤人員,最後是學生。這種將外部情況考慮在內就實現了`優先順序排程(priority scheduling)` ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515072141095-420267844.png) 它的基本思想很明確,每個程序都被賦予一個優先順序,優先順序高的程序優先執行。 但是也不意味著高優先順序的程序能夠永遠一直執行下去,排程程式會在每個時鐘中斷期間降低當前執行程序的優先順序。如果此操作導致其優先順序降低到下一個最高程序的優先順序以下,則會發生程序切換。或者,可以為每個程序分配允許執行的最大時間間隔。當時間間隔用完後,下一個高優先順序的程序會得到執行的機會。 #### 最短程序優先 對於批處理系統而言,由於最短作業優先常常伴隨著最短響應時間,一種方式是根據程序過去的行為進行推測,並執行估計執行時間最短的那一個。假設每個終端上每條命令的預估執行時間為 `T0`,現在假設測量到其下一次執行時間為 `T1`,可以用兩個值的加權來改進估計時間,即`aT0+ (1- 1)T1`。通過選擇 a 的值,可以決定是儘快忘掉老的執行時間,還是在一段長時間內始終記住它們。當 a = 1/2 時,可以得到下面這個序列 ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515072149014-1378644999.png) 可以看到,在三輪過後,T0 在新的估計值中所佔比重下降至 1/8。 有時把這種通過當前測量值和先前估計值進行加權平均從而得到下一個估計值的技術稱作 `老化(aging)`。這種方法會使用很多預測值基於當前值的情況。 #### 彩票排程 有一種既可以給出預測結果而又有一種比較簡單的實現方式的演算法,就是 `彩票排程(lottery scheduling)`演算法。他的基本思想為程序提供各種系統資源的`彩票`。當做出一個排程決策的時候,就隨機抽出一張彩票,擁有彩票的程序將獲得資源。比如在 CPU 進行排程時,系統可以每秒持有 50 次抽獎,每個中獎程序會獲得額外執行時間的獎勵。 > 可以把彩票理解為 buff,這個 buff 有 15% 的機率能讓你產生 `速度之靴` 的效果。 #### 公平分享排程 如果使用者 1 啟動了 9 個程序,而使用者 2 啟動了一個程序,使用輪轉或相同優先順序排程演算法,那麼使用者 1 將得到 90 % 的 CPU 時間,而使用者 2 將之得到 10 % 的 CPU 時間。 為了阻止這種情況的出現,一些系統在排程前會把程序的擁有者考慮在內。在這種模型下,每個使用者都會分配一些CPU 時間,而排程程式會選擇程序並強制執行。因此如果兩個使用者每個都會有 50% 的 CPU 時間片保證,那麼無論一個使用者有多少個程序,都將獲得相同的 CPU 份額。 ## 頁面置換演算法都有哪些 | 演算法 | 註釋 | | :-------------------- | :----------------------- | | 最優演算法 | 不可實現,但可以用作基準 | | NRU(最近未使用) 演算法 | 和 LRU 演算法很相似 | | FIFO(先進先出) 演算法 | 有可能會拋棄重要的頁面 | | 第二次機會演算法 | 比 FIFO 有較大的改善 | | 時鐘演算法 | 實際使用 | | LRU(最近最少)演算法 | 比較優秀,但是很難實現 | | NFU(最不經常食用)演算法 | 和 LRU 很類似 | | 老化演算法 | 近似 LRU 的高效演算法 | | 工作集演算法 | 實施起來開銷很大 | | 工作集時鐘演算法 | 比較有效的演算法 | - `最優演算法`在當前頁面中置換最後要訪問的頁面。不幸的是,沒有辦法來判定哪個頁面是最後一個要訪問的,`因此實際上該演算法不能使用`。然而,它可以作為衡量其他演算法的標準。 - `NRU` 演算法根據 R 位和 M 位的狀態將頁面氛圍四類。從編號最小的類別中隨機選擇一個頁面。NRU 演算法易於實現,但是效能不是很好。存在更好的演算法。 - `FIFO` 會跟蹤頁面載入進入記憶體中的順序,並把頁面放入一個連結串列中。有可能刪除存在時間最長但是還在使用的頁面,因此這個演算法也不是一個很好的選擇。 - `第二次機會`演算法是對 FIFO 的一個修改,它會在刪除頁面之前檢查這個頁面是否仍在使用。如果頁面正在使用,就會進行保留。這個改進大大提高了效能。 - `時鐘` 演算法是第二次機會演算法的另外一種實現形式,時鐘演算法和第二次演算法的效能差不多,但是會花費更少的時間來執行演算法。 - `LRU` 演算法是一個非常優秀的演算法,但是沒有`特殊的硬體(TLB)`很難實現。如果沒有硬體,就不能使用 LRU 演算法。 - `NFU` 演算法是一種近似於 LRU 的演算法,它的效能不是非常好。 - `老化` 演算法是一種更接近 LRU 演算法的實現,並且可以更好的實現,因此是一個很好的選擇 - 最後兩種演算法都使用了工作集演算法。工作集演算法提供了合理的效能開銷,但是它的實現比較複雜。`WSClock` 是另外一種變體,它不僅能夠提供良好的效能,而且可以高效地實現。 **最好的演算法是老化演算法和WSClock演算法**。他們分別是基於 LRU 和工作集演算法。他們都具有良好的效能並且能夠被有效的實現。還存在其他一些好的演算法,但實際上這兩個可能是最重要的。 ## 影響排程程式的指標是什麼 會有下面幾個因素決定排程程式的好壞 * CPU 使用率: CPU 正在執行任務(即不處於空閒狀態)的時間百分比。 * 等待時間 這是程序輪流執行的時間,也就是程序切換的時間 * 吞吐量 單位時間內完成程序的數量 * 響應時間 這是從提交流程到獲得有用輸出所經過的時間。 * 週轉時間 從提交流程到完成流程所經過的時間。 ## 什麼是殭屍程序 殭屍程序是已完成且處於終止狀態,但在程序表中卻仍然存在的程序。殭屍程序通常發生在父子關係的程序中,由於父程序仍需要讀取其子程序的退出狀態所造成的。 ![](https://img2020.cnblogs.com/blog/1515111/202005/1515111-20200515073122009-1254205867.png)