1 解釋一下什麼是操作系統
操作系統是運行在計算機上最重要的一種軟件,它管理計算機的資源和進程以及所有的硬件和軟件。它為計算機硬件和軟件提供了一種中間層
通常情況下,計算機上會運行着許多應用程序,它們都需要對内存和 CPU 進行交互,操作系統的目的就是為了保證這些訪問和交互能夠準确無誤的進行。
2 解釋一下操作系統的主要目的是什麼
操作系統是一種軟件,它的主要目的有三種
管理計算機資源,這些資源包括 CPU、内存、磁盤驅動器、打印機等。
提供一種圖形界面,就像我們前面描述的那樣,它提供了用戶和計算機之間的橋梁。
為其他軟件提供服務,操作系統與軟件進行交互,以便為其分配運行所需的任何必要資源。
3 操作系統的種類有哪些
操作系統通常預裝在你購買計算機之前。大部分用戶都會使用默認的操作系統,但是你也可以升級甚至更改操作系統。但是一般常見的操作系統隻有三種:Windows、macOS 和 Linux。
4 操作系統結構
4.1 單體系統
在大多數系統中,整個系統在内核态以單一程序的方式運行。整個操作系統是以程序集合來編寫的,鍊接在一塊形成一個大的二進制可執行程序,這種系統稱為單體系統。
在單體系統中構造實際目标程序時,會首先編譯所有單個過程(或包含這些過程的文件),然後使用系統鍊接器将它們全部綁定到一個可執行文件中
在單體系統中,對于每個系統調用都會有一個服務程序來保障和運行。需要一組實用程序來彌補服務程序需要的功能,例如從用戶程序中獲取數據。可将各種過程劃分為一個三層模型
除了在計算機初啟動時所裝載的核心操作系統外,許多操作系統還支持額外的擴展。比如 I/O 設備驅動和文件系統。這些部件可以按需裝載。在 UNIX 中把它們叫做 共享庫(shared library),在 Windows 中則被稱為 動态鍊接庫(Dynamic Link Library,DLL)。他們的擴展名為 .dll,在 C:\Windows\system32 目錄下存在 1000 多個 DLL 文件,所以不要輕易删除 C 盤文件,否則可能就炸了哦。
4.2 分層系統
分層系統使用層來分隔不同的功能單元。每一層隻與該層的上層和下層通信。每一層都使用下面的層來執行其功能。層之間的通信通過預定義的固定接口通信。
4.3 微内核
為了實現高可靠性,将操作系統劃分成小的、層級之間能夠更好定義的模塊是很有必要的,隻有一個模塊 --- 微内核 --- 運行在内核态,其餘模塊可以作為普通用戶進程運行。由于把每個設備驅動和文件系統分别作為普通用戶進程,這些模塊中的錯誤雖然會使這些模塊崩潰,但是不會使整個系統死機。
MINIX 3 是微内核的代表作,它的具體結構如下
在内核的外部,系統的構造有三層,它們都在用戶态下運行,最底層是設備驅動器。由于它們都在用戶态下運行,所以不能物理的訪問 I/O 端口空間,也不能直接發出 I/O 命令。相反,為了能夠對 I/O 設備編程,驅動器構建一個結構,指明哪個參數值寫到哪個 I/O 端口,并聲稱一個内核調用,這樣就完成了一次調用過程。
4.4 客戶-服務器模式
微内核思想的策略是把進程劃分為兩類:服務器,每個服務器用來提供服務;客戶端,使用這些服務。這個模式就是所謂的 客戶-服務器模式。
客戶-服務器模式會有兩種載體,一種情況是一台計算機既是客戶又是服務器,在這種方式下,操作系統會有某種優化;但是普遍情況下是客戶端和服務器在不同的機器上,它們通過局域網或廣域網連接。
客戶通過發送消息與服務器通信,客戶端并不需要知道這些消息是在本地機器上處理,還是通過網絡被送到遠程機器上處理。對于客戶端而言,這兩種情形是一樣的:都是發送請求并得到回應。
5 什麼是按需分頁
在操作系統中,進程是以頁為單位加載到内存中的,按需分頁是一種虛拟内存的管理方式。在使用請求分頁的系統中,隻有在嘗試訪問頁面所在的磁盤并且該頁面尚未在内存中時,也就發生了缺頁異常,操作系統才會将磁盤頁面複制到内存中。
6 多處理系統的優勢
随着處理器的不斷增加,我們的計算機系統由單機系統變為了多處理系統,多處理系統的吞吐量比較高,多處理系統擁有多個并行的處理器,這些處理器共享時鐘、内存、總線、外圍設備等。
多處理系統由于可以共享資源,因此可以開源節流,省錢。整個系統的可靠性也随之提高。
7 什麼是内核
在計算機中,内核是一個計算機程序,它是操作系統的核心,可以控制操作系統中所有的内容。内核通常是在 boot loader 裝載程序之前加載的第一個程序。
這裡還需要了解一下什麼是 boot loader。
boot loader 又被稱為引導加載程序,它是一個程序,能夠将計算機的操作系統放入内存中。在電源通電或者計算機重啟時,BIOS 會執行一些初始測試,然後将控制權轉移到引導加載程序所在的主引導記錄(MBR) 。
8 什麼是實時系統
實時操作系統對時間做出了嚴格的要求,實時操作系統分為兩種:硬實時和軟實時
硬實時操作系統規定某個動作必須在規定的時刻内完成或發生,比如汽車生産車間,焊接機器必須在某一時刻内完成焊接,焊接的太早或者太晚都會對汽車造成永久性傷害。
軟實時操作系統雖然不希望偶爾違反最終的時限要求,但是仍然可以接受。并且不會引起任何永久性傷害。比如數字音頻、多媒體、手機都是屬于軟實時操作系統。
你可以簡單理解硬實時和軟實時的兩個指标:是否在時刻内必須完成以及是否造成嚴重損害。
9 什麼是虛拟内存
虛拟内存是一種内存分配方案,是一項可以用來輔助内存分配的機制。我們知道,應用程序是按頁裝載進内存中的。但并不是所有的頁都會裝載到内存中,計算機中的硬件和軟件會将數據從 RAM 臨時傳輸到磁盤中來彌補内存的不足。如果沒有虛拟内存的話,一旦你将計算機内存填滿後,計算機會對你說
呃,不,對不起,您無法再加載任何應用程序,請關閉另一個應用程序以加載新的應用程序。對于虛拟内存,計算機可以執行操作是查看内存中最近未使用過的區域,然後将其複制到硬盤上。虛拟内存通過複制技術實現了 妹子,你快來看哥哥能裝這麼多程序 的資本。複制是自動進行的,你無法感知到它的存在。
10 什麼是進程和進程表
進程就是正在執行程序的實例,比如說 Web 程序就是一個進程,shell 也是一個進程,文章編輯器 typora 也是一個進程。
操作系統負責管理所有正在運行的進程,操作系統會為每個進程分配特定的時間來占用 CPU,操作系統還會為每個進程分配特定的資源。
操作系統為了跟蹤每個進程的活動狀态,維護了一個進程表。在進程表的内部,列出了每個進程的狀态以及每個進程使用的資源等。
http://courses.cs.vt.edu/csonline/OS/Lessons/Processes/index.html ( http://courses.cs.vt.edu/csonline/OS/Lessons/Processes/index.html ) 這個網站上面有一個關于進程狀态輪轉的動畫,做的真是太好了。
11 什麼是線程,線程和進程的區别
這又是一道老生常談的問題了,從操作系統的角度來回答一下吧。
我們上面說到進程是正在運行的程序的實例,而線程其實就是進程中的單條流向,因為線程具有進程中的某些屬性,所以線程又被稱為輕量級的進程。浏覽器如果是一個進程的話,那麼浏覽器下面的每個 tab 頁可以看作是一個個的線程。
下面是線程和進程持有資源的區别
線程不像進程那樣具有很強的獨立性,線程之間會共享數據
創建線程的開銷要比進程小很多,因為創建線程僅僅需要堆棧指針和程序計數器就可以了,而創建進程需要操作系統分配新的地址空間,數據資源等,這個開銷比較大。
12 使用多線程的好處是什麼
多線程是程序員不得不知的基本素養之一,所以,下面我們給出一些多線程編程的好處
能夠提高對用戶的響應順序
在流程中的資源共享
比較經濟适用
能夠對多線程架構有深入的理解
13 什麼是 RR 調度算法
RR(round-robin) 調度算法主要針對分時系統,RR 的調度算法會把時間片以相同的部分并循環的分配給每個進程,RR 調度算法沒有優先級的概念。這種算法的實現比較簡單,而且每個線程都會占有時間片,并不存在線程饑餓的問題。
14 導緻系統出現死鎖的情況
死鎖的出現需要同時滿足下面四個條件
互斥(Mutual Exclusion):一次隻能有一個進程使用資源。如果另一個進程請求該資源,則必須延遲請求進程,直到釋放該資源為止。
保持并等待(Hold and Wait):必須存在一個進程,該進程至少持有一個資源,并且正在等待獲取其他進程當前所持有的資源。
無搶占(No Preemption):資源不能被搶占,也就是說,在進程完成其任務之後,隻能由擁有它的進程自動釋放資源。
循環等待(Circular Wait) :必須存在一組 {p0,p1,..... pn} 的等待進程,使 p0 等待 p1 持有的資源,p1 等待由 p2 持有的資源, pn-1 正在等待由 pn 持有的資源,而 pn 正在等待由 p0 持有的資源。
15 RAID 的不同級别
RAID 稱為 磁盤冗餘陣列,簡稱 磁盤陣列。利用虛拟化技術把多個硬盤結合在一起,成為一個或多個磁盤陣列組,目的是提升性能或數據冗餘。
RAID 有不同的級别
RAID 0 - 無容錯的條帶化磁盤陣列
RAID 1 - 鏡像和雙工
RAID 2 - 内存式糾錯碼
RAID 3 - 比特交錯奇偶校驗
RAID 4 - 塊交錯奇偶校驗
RAID 5 - 塊交錯分布式奇偶校驗
RAID 6 - P Q 冗餘
16 什麼是 DMA
DMA 的中文名稱是直接内存訪問,它意味着 CPU 授予 I/O 模塊權限在不涉及 CPU 的情況下讀取或寫入内存。也就是 DMA 可以不需要 CPU 的參與。這個過程由稱為 DMA 控制器(DMAC)的芯片管理。由于 DMA 設備可以直接在内存之間傳輸數據,而不是使用 CPU 作為中介,因此可以緩解總線上的擁塞。DMA 通過允許 CPU 執行任務,同時 DMA 系統通過系統和内存總線傳輸數據來提高系統并發性。
17 多線程編程的好處是什麼
對不起,我忍不住想偷笑
說直白點,為什麼單線程能夠處理的卻要用多線程來處理?當然是為了提高程序的裝逼并行能力了。多線程在某些情況下能夠使你程序運行的更快,這也是為什麼多核 CPU 會出現,但是多核 CPU 的出現會導緻數據的一緻性問題,不過這些問題程序員就能解決。另一個角度來說,多線程編程能夠提高程序員的編程能力和編程思維。同時也能提高程序員的管理能力,你如果把每條線程流當作羅老師時間管理的女主一樣,能夠及時協調好所有 P 友的關系,那你也是超神程序員了,所以,是誰說程序員不會做管理的?Doug Lea 大佬牛逼!!!
ps:Doug Lea 大佬開發的 JUC 工具包,此處不加狗頭。
18 什麼是設備驅動程序
在計算機中,設備驅動程序是一種計算機程序,它能夠控制或者操作連接到計算機的特定設備。驅動程序提供了與硬件進行交互的軟件接口,使操作系統和其他計算機程序能夠訪問特定設備,不用需要了解其硬件的具體構造。
19 進程間的通信方式
19.1 通信概念
進程間的通信方式比較多,首先你需要理解下面這幾個概念
競态條件:即兩個或多個線程同時對一共享數據進行修改,從而影響程序運行的正确性時,這種就被稱為競态條件(race condition)。
臨界區:不僅共享資源會造成競态條件,事實上共享文件、共享内存也會造成競态條件、那麼該如何避免呢?或許一句話可以概括說明:禁止一個或多個進程在同一時刻對共享資源(包括共享内存、共享文件等)進行讀寫。換句話說,我們需要一種 互斥(mutual exclusion) 條件,這也就是說,如果一個進程在某種方式下使用共享變量和文件的話,除該進程之外的其他進程就禁止做這種事(訪問統一資源)。
一個好的解決方案,應該包含下面四種條件
任何時候兩個進程不能同時處于臨界區
不應對 CPU 的速度和數量做任何假設
位于臨界區外的進程不得阻塞其他進程
不能使任何進程無限等待進入臨界區
忙等互斥:當一個進程在對資源進行修改時,其他進程必須進行等待,進程之間要具有互斥性,我們讨論的解決方案其實都是基于忙等互斥提出的。
19.2 解決方案
進程間的通信用專業一點的術語來表示就是 Inter Process Communication,IPC,它主要有下面幾種通信方式
消息傳遞:消息傳遞是進程間實現通信和同步等待的機制,使用消息傳遞,進程間的交流不需要共享變量,直接就可以進行通信;消息傳遞分為發送方和接收方
先進先出隊列:先進先出隊列指的是兩個不相關聯進程間的通信,兩個進程之間可以彼此相互進程通信,這是一種全雙工通信方式
管道:管道用于兩個相關進程之間的通信,這是一種半雙工的通信方式,如果需要全雙工,需要另外一個管道。
直接通信:在這種進程通信的方式中,進程與進程之間隻存在一條鍊接,進程間要明确通信雙方的命名。
間接通信:間接通信是通信雙方不會直接建立連接,而是找到一個中介者,這個中介者可能是個對象等等,進程可以在其中放置消息,并且可以從中删除消息,以此達到進程間通信的目的。
消息隊列:消息隊列是内核中存儲消息的鍊表,它由消息隊列标識符進行标識,這種方式能夠在不同的進程之間提供全雙工的通信連接。
共享内存:共享内存是使用所有進程之間的内存來建立連接,這種類型需要同步進程訪問來相互保護。
20 進程間狀态模型
cat chapter1 chapter2 chapter3 | grep tree
第一個進程是 cat,将三個文件級聯并輸出。第二個進程是 grep,它從輸入中選擇具有包含關鍵字 tree 的内容,根據這兩個進程的相對速度(這取決于兩個程序的相對複雜度和各自所分配到的 CPU 時間片),可能會發生下面這種情況,grep 準備就緒開始運行,但是輸入進程還沒有完成,于是必須阻塞 grep 進程,直到輸入完畢。
當一個進程開始運行時,它可能會經曆下面這幾種狀态
圖中會涉及三種狀态
運行态,運行态指的就是進程實際占用 CPU 時間片運行時
就緒态,就緒态指的是可運行,但因為其他進程正在運行而處于就緒狀态
阻塞态,除非某種外部事件發生,否則進程不能運行
邏輯上來說,運行态和就緒态是很相似的。這兩種情況下都表示進程可運行,但是第二種情況沒有獲得 CPU 時間分片。第三種狀态與前兩種狀态不同的原因是這個進程不能運行,CPU 空閑時也不能運行。
三種狀态會涉及四種狀态間的切換,在操作系統發現進程不能繼續執行時會發生狀态 1的輪轉,在某些系統中進程執行系統調用,例如 pause,來獲取一個阻塞的狀态。在其他系統中包括 UNIX,當進程從管道或特殊文件(例如終端)中讀取沒有可用的輸入時,該進程會被自動終止。
轉換 2 和轉換 3 都是由進程調度程序(操作系統的一部分)引起的,進程本身不知道調度程序的存在。轉換 2 的出現說明進程調度器認定當前進程已經運行了足夠長的時間,是時候讓其他進程運行 CPU 時間片了。當所有其他進程都運行過後,這時候該是讓第一個進程重新獲得 CPU 時間片的時候了,就會發生轉換 3。
程序調度指的是,決定哪個進程優先被運行和運行多久,這是很重要的一點。已經設計出許多算法來嘗試平衡系統整體效率與各個流程之間的競争需求。
當進程等待的一個外部事件發生時(如從外部輸入一些數據後),則發生轉換 4。如果此時沒有其他進程在運行,則立刻觸發轉換 3,該進程便開始運行,否則該進程會處于就緒階段,等待 CPU 空閑後再輪到它運行。
21 調度算法都有哪些
調度算法分為三大類:批處理中的調度、交互系統中的調度、實時系統中的調度
21.1 批處理中的調度
先來先服務
很像是先到先得。。。可能最簡單的非搶占式調度算法的設計就是 先來先服務(first-come,first-serverd)。使用此算法,将按照請求順序為進程分配 CPU。最基本的,會有一個就緒進程的等待隊列。當第一個任務從外部進入系統時,将會立即啟動并允許運行任意長的時間。它不會因為運行時間太長而中斷。當其他作業進入時,它們排到就緒隊列尾部。當正在運行的進程阻塞,處于等待隊列的第一個進程就開始運行。當一個阻塞的進程重新處于就緒态時,它會像一個新到達的任務,會排在隊列的末尾,即排在所有進程最後。
這個算法的強大之處在于易于理解和編程,在這個算法中,一個單鍊表記錄了所有就緒進程。要選取一個進程運行,隻要從該隊列的頭部移走一個進程即可;要添加一個新的作業或者阻塞一個進程,隻要把這個作業或進程附加在隊列的末尾即可。這是很簡單的一種實現。
不過,先來先服務也是有缺點的,那就是沒有優先級的關系,試想一下,如果有 100 個 I/O 進程正在排隊,第 101 個是一個 CPU 密集型進程,那豈不是需要等 100 個 I/O 進程運行完畢才會等到一個 CPU 密集型進程運行,這在實際情況下根本不可能,所以需要優先級或者搶占式進程的出現來優先選擇重要的進程運行。
最短作業優先
批處理中,第二種調度算法是 最短作業優先(Shortest Job First),我們假設運行時間已知。例如,一家保險公司,因為每天要做類似的工作,所以人們可以相當精确地預測處理 1000 個索賠的一批作業需要多長時間。當輸入隊列中有若幹個同等重要的作業被啟動時,調度程序應使用最短優先作業算法
如上圖 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) 算法。使用這個算法,調度程序總是選擇剩餘運行時間最短的那個進程運行。當一個新作業到達時,其整個時間同當前進程的剩餘時間做比較。如果新的進程比當前運行進程需要更少的時間,當前進程就被挂起,而運行新的進程。這種方式能夠使短期作業獲得良好的服務。
21.2 交互式系統中的調度
交互式系統中在個人計算機、服務器和其他系統中都是很常用的,所以有必要來探讨一下交互式調度
輪循調度
一種最古老、最簡單、最公平并且最廣泛使用的算法就是 輪循算法(round-robin)。每個進程都會被分配一個時間段,稱為時間片(quantum),在這個時間片内允許進程運行。如果時間片結束時進程還在運行的話,則搶占一個 CPU 并将其分配給另一個進程。如果進程在時間片結束前阻塞或結束,則 CPU 立即進行切換。輪循算法比較容易實現。調度程序所做的就是維護一個可運行進程的列表,就像下圖中的 a,當一個進程用完時間片後就被移到隊列的末尾,就像下圖的 b。
優先級調度
事實情況是不是所有的進程都是優先級相等的。例如,在一所大學中的等級制度,首先是院長,然後是教授、秘書、後勤人員,最後是學生。這種将外部情況考慮在内就實現了優先級調度(priority scheduling)
它的基本思想很明确,每個進程都被賦予一個優先級,優先級高的進程優先運行。
但是也不意味着高優先級的進程能夠永遠一直運行下去,調度程序會在每個時鐘中斷期間降低當前運行進程的優先級。如果此操作導緻其優先級降低到下一個最高進程的優先級以下,則會發生進程切換。或者,可以為每個進程分配允許運行的最大時間間隔。當時間間隔用完後,下一個高優先級的進程會得到運行的機會。
最短進程優先
對于批處理系統而言,由于最短作業優先常常伴随着最短響應時間,一種方式是根據進程過去的行為進行推測,并執行估計運行時間最短的那一個。假設每個終端上每條命令的預估運行時間為 T0,現在假設測量到其下一次運行時間為 T1,可以用兩個值的加權來改進估計時間,即aT0 (1- 1)T1。通過選擇 a 的值,可以決定是盡快忘掉老的運行時間,還是在一段長時間内始終記住它們。當 a = 1/2 時,可以得到下面這個序列
可以看到,在三輪過後,T0 在新的估計值中所占比重下降至 1/8。
有時把這種通過當前測量值和先前估計值進行加權平均從而得到下一個估計值的技術稱作 老化(aging)。這種方法會使用很多預測值基于當前值的情況。
調度
有一種既可以給出預測結果而又有一種比較簡單的實現方式的算法,就是 調度(lottery scheduling)算法。他的基本思想為進程提供各種系統資源的。當做出一個調度決策的時候,就随機抽出一張,擁有的進程将獲得資源。比如在 CPU 進行調度時,系統可以每秒持有 50 次抽獎,每個中獎進程會獲得額外運行時間的獎勵。
可以把理解為 buff,這個 buff 有 15% 的幾率能讓你産生 速度之靴 的效果。
公平分享調度
如果用戶 1 啟動了 9 個進程,而用戶 2 啟動了一個進程,使用輪轉或相同優先級調度算法,那麼用戶 1 将得到 90 % 的 CPU 時間,而用戶 2 将之得到 10 % 的 CPU 時間。
為了阻止這種情況的出現,一些系統在調度前會把進程的擁有者考慮在内。在這種模型下,每個用戶都會分配一些 CPU 時間,而調度程序會選擇進程并強制執行。因此如果兩個用戶每個都會有 50% 的 CPU 時間片保證,那麼無論一個用戶有多少個進程,都将獲得相同的 CPU 份額。
22 頁面置換算法都有哪些
算法
注釋
最優算法
不可實現,但可以用作基準
NRU(最近未使用) 算法
和 LRU 算法很相似
FIFO(先進先出) 算法
有可能會抛棄重要的頁面
第二次機會算法
比 FIFO 有較大的改善
時鐘算法
實際使用
LRU(最近最少)算法
比較優秀,但是很難實現
NFU(最不經常使用)算法
和 LRU 很類似
老化算法
近似 LRU 的高效算法
工作集算法
實施起來開銷很大
工作集時鐘算法
比較有效的算法
最優算法在當前頁面中置換最後要訪問的頁面。不幸的是,沒有辦法來判定哪個頁面是最後一個要訪問的,因此實際上該算法不能使用。然而,它可以作為衡量其他算法的标準。
NRU 算法根據 R 位和 M 位的狀态将頁面分為四類。從編号最小的類别中随機選擇一個頁面。NRU 算法易于實現,但是性能不是很好。存在更好的算法。
FIFO 會跟蹤頁面加載進入内存中的順序,并把頁面放入一個鍊表中。有可能删除存在時間最長但是還在使用的頁面,因此這個算法也不是一個很好的選擇。
第二次機會算法是對 FIFO 的一個修改,它會在删除頁面之前檢查這個頁面是否仍在使用。如果頁面正在使用,就會進行保留。這個改進大大提高了性能。
時鐘 算法是第二次機會算法的另外一種實現形式,時鐘算法和第二次算法的性能差不多,但是會花費更少的時間來執行算法。
LRU 算法是一個非常優秀的算法,但是沒有特殊的硬件(TLB)很難實現。如果沒有硬件,就不能使用 LRU 算法。
NFU 算法是一種近似于 LRU 的算法,它的性能不是非常好。
老化 算法是一種更接近 LRU 算法的實現,并且可以更好的實現,因此是一個很好的選擇
最後兩種算法都使用了工作集算法。工作集算法提供了合理的性能開銷,但是它的實現比較複雜。WSClock 是另外一種變體,它不僅能夠提供良好的性能,而且可以高效地實現。
最好的算法是老化算法和 WSClock 算法。他們分别是基于 LRU 和工作集算法。他們都具有良好的性能并且能夠被有效的實現。還存在其他一些好的算法,但實際上這兩個可能是最重要的。
23 影響調度程序的指标是什麼
會有下面幾個因素決定調度程序的好壞
CPU 使用率:
CPU 正在執行任務(即不處于空閑狀态)的時間百分比。
等待時間
這是進程輪流執行的時間,也就是進程切換的時間
吞吐量
單位時間内完成進程的數量
響應時間
這是從提交流程到獲得有用輸出所經過的時間。
周轉時間
從提交流程到完成流程所經過的時間。
24 什麼是僵屍進程
僵屍進程是已完成且處于終止狀态,但在進程表中卻仍然存在的進程。僵屍進程通常發生在父子關系的進程中,由于父進程仍需要讀取其子進程的退出狀态所造成的。
關注我,帶你更好的學習編程。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!