這是程序員cxuan的第七篇原創文章html
操做系統是運行在計算機上最重要的一種軟件,它管理計算機的資源和進程以及全部的硬件和軟件。它爲計算機硬件和軟件提供了一種中間層程序員
一般狀況下,計算機上會運行着許多應用程序,它們都須要對內存和 CPU 進行交互,操做系統的目的就是爲了保證這些訪問和交互可以準確無誤的進行。面試
操做系統是一種軟件,它的主要目的有三種算法
操做系統一般預裝在你購買計算機以前。大部分用戶都會使用默認的操做系統,可是你也能夠升級甚至更改操做系統。可是通常常見的操做系統只有三種:Windows、macOS 和 Linux。shell
4.一、單體系統編程
在大多數系統中,整個系統在內核態以單一程序的方式運行。整個操做系統是以程序集合來編寫的,連接在一塊造成一個大的二進制可執行程序,這種系統稱爲單體系統。瀏覽器
在單體系統中構造實際目標程序時,會首先編譯全部單個過程(或包含這些過程的文件),而後使用系統連接器將它們所有綁定到一個可執行文件中服務器
在單體系統中,對於每一個系統調用都會有一個服務程序來保障和運行。須要一組實用程序來彌補服務程序須要的功能,例如從用戶程序中獲取數據。可將各類過程劃分爲一個三層模型網絡
除了在計算機初啓動時所裝載的核心操做系統外,許多操做系統還支持額外的擴展。好比 I/O 設備驅動和文件系統。這些部件能夠按需裝載。在 UNIX 中把它們叫作 共享庫(shared library),在 Windows 中則被稱爲 動態連接庫(Dynamic Link Library,DLL)。他們的擴展名爲 .dll,在 C:\Windows\system32 目錄下存在 1000 多個 DLL 文件,因此不要輕易刪除 C 盤文件,不然可能就炸了哦。多線程
4.二、分層系統
分層系統使用層來分隔不一樣的功能單元。每一層只與該層的上層和下層通訊。每一層都使用下面的層來執行其功能。層之間的通訊經過預約義的固定接口通訊。
4.三、微內核
爲了實現高可靠性,將操做系統劃分紅小的、層級之間可以更好定義的模塊是頗有必要的,只有一個模塊 --- 微內核 --- 運行在內核態,其他模塊能夠做爲普通用戶進程運行。因爲把每一個設備驅動和文件系統分別做爲普通用戶進程,這些模塊中的錯誤雖然會使這些模塊崩潰,可是不會使整個系統死機。
MINIX 3 是微內核的表明做,它的具體結構以下
在內核的外部,系統的構造有三層,它們都在用戶態下運行,最底層是設備驅動器。因爲它們都在用戶態下運行,因此不能物理的訪問 I/O 端口空間,也不能直接發出 I/O 命令。相反,爲了可以對 I/O 設備編程,驅動器構建一個結構,指明哪一個參數值寫到哪一個 I/O 端口,並聲稱一個內核調用,這樣就完成了一次調用過程。
4.四、客戶-服務器模式
微內核思想的策略是把進程劃分爲兩類:服務器,每一個服務器用來提供服務;客戶端,使用這些服務。這個模式就是所謂的 客戶-服務器模式。
客戶-服務器模式會有兩種載體,一種狀況是一臺計算機既是客戶又是服務器,在這種方式下,操做系統會有某種優化;可是廣泛狀況下是客戶端和服務器在不一樣的機器上,它們經過局域網或廣域網鏈接。
客戶經過發送消息與服務器通訊,客戶端並不須要知道這些消息是在本地機器上處理,仍是經過網絡被送到遠程機器上處理。對於客戶端而言,這兩種情形是同樣的:都是發送請求並獲得迴應。
在操做系統中,進程是以頁爲單位加載到內存中的,按需分頁是一種虛擬內存的管理方式。在使用請求分頁的系統中,只有在嘗試訪問頁面所在的磁盤而且該頁面還沒有在內存中時,也就發生了缺頁異常,操做系統纔會將磁盤頁面複製到內存中。
隨着處理器的不斷增長,咱們的計算機系統由單機系統變爲了多處理系統,多處理系統的吞吐量比較高,多處理系統擁有多個並行的處理器,這些處理器共享時鐘、內存、總線、外圍設備等。
多處理系統因爲能夠共享資源,所以能夠開源節流,省錢。整個系統的可靠性也隨之提升。
在計算機中,內核是一個計算機程序,它是操做系統的核心,能夠控制操做系統中全部的內容。內核一般是在 boot loader 裝載程序以前加載的第一個程序。
這裏還須要瞭解一下什麼是 boot loader。
boot loader 又被稱爲引導加載程序,它是一個程序,可以將計算機的操做系統放入內存中。在電源通電或者計算機重啓時,BIOS 會執行一些初始測試,而後將控制權轉移到引導加載程序所在的主引導記錄(MBR) 。
實時操做系統對時間作出了嚴格的要求,實時操做系統分爲兩種:硬實時和軟實時
硬實時操做系統規定某個動做必須在規定的時刻內完成或發生,好比汽車生產車間,焊接機器必須在某一時刻內完成焊接,焊接的太早或者太晚都會對汽車形成永久性傷害。
軟實時操做系統雖然不但願偶爾違反最終的時限要求,可是仍然能夠接受。而且不會引發任何永久性傷害。好比數字音頻、多媒體、手機都是屬於軟實時操做系統。
你能夠簡單理解硬實時和軟實時的兩個指標:是否在時刻內必須完成以及是否形成嚴重損害。
虛擬內存是一種內存分配方案,是一項能夠用來輔助內存分配的機制。咱們知道,應用程序是按頁裝載進內存中的。但並非全部的頁都會裝載到內存中,計算機中的硬件和軟件會將數據從 RAM 臨時傳輸到磁盤中來彌補內存的不足。若是沒有虛擬內存的話,一旦你將計算機內存填滿後,計算機會對你說
呃,不,對不起,您沒法再加載任何應用程序,請關閉另外一個應用程序以加載新的應用程序。對於虛擬內存,計算機能夠執行操做是查看內存中最近未使用過的區域,而後將其複製到硬盤上。虛擬內存經過複製技術實現了 妹子,你快來看哥哥能裝這麼多程序 的資本。複製是自動進行的,你沒法感知到它的存在。
進程就是正在執行程序的實例,好比說 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 ) 這個網站上面有一個關於進程狀態輪轉的動畫,作的真是太好了。
這又是一道老生常談的問題了,從操做系統的角度來回答一下吧。
咱們上面說到進程是正在運行的程序的實例,而線程其實就是進程中的單條流向,由於線程具備進程中的某些屬性,因此線程又被稱爲輕量級的進程。瀏覽器若是是一個進程的話,那麼瀏覽器下面的每一個 tab 頁能夠看做是一個個的線程。
下面是線程和進程持有資源的區別
線程不像進程那樣具備很強的獨立性,線程之間會共享數據
建立線程的開銷要比進程小不少,由於建立線程僅僅須要堆棧指針和程序計數器就能夠了,而建立進程須要操做系統分配新的地址空間,數據資源等,這個開銷比較大。
十二、使用多線程的好處是什麼
多線程是程序員不得不知的基本素養之一,因此,下面咱們給出一些多線程編程的好處
可以提升對用戶的響應順序
在流程中的資源共享
比較經濟適用
可以對多線程架構有深刻的理解
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 0 - 無容錯的條帶化磁盤陣列
- RAID 1 - 鏡像和雙工
- RAID 2 - 內存式糾錯碼
- RAID 3 - 比特交錯奇偶校驗
- RAID 4 - 塊交錯奇偶校驗
- RAID 5 - 塊交錯分佈式奇偶校驗
- RAID 6 - P + Q 冗餘
DMA 的中文名稱是直接內存訪問,它意味着 CPU 授予 I/O 模塊權限在不涉及 CPU 的狀況下讀取或寫入內存。也就是 DMA 能夠不須要 CPU 的參與。這個過程由稱爲 DMA 控制器(DMAC)的芯片管理。因爲 DMA 設備能夠直接在內存之間傳輸數據,而不是使用 CPU 做爲中介,所以能夠緩解總線上的擁塞。DMA 經過容許 CPU 執行任務,同時 DMA 系統經過系統和內存總線傳輸數據來提升系統併發性。
對不起,我忍不住想偷笑
說直白點,爲何單線程可以處理的卻要用多線程來處理?固然是爲了提升程序的裝逼併行能力了。多線程在某些狀況下可以使你程序運行的更快,這也是爲何多核 CPU 會出現,可是多核 CPU 的出現會致使數據的一致性問題,不過這些問題程序員就能解決。另外一個角度來講,多線程編程可以提升程序員的編程能力和編程思惟。同時也能提升程序員的管理能力,你若是把每條線程流看成羅老師時間管理的女主同樣,可以及時協調好全部 P 友的關係,那你也是超神程序員了,因此,是誰說程序員不會作管理的?Doug Lea 大佬牛逼!!!
ps:Doug Lea 大佬開發的 JUC 工具包,此處不加狗頭。
在計算機中,設備驅動程序是一種計算機程序,它可以控制或者操做鏈接到計算機的特定設備。驅動程序提供了與硬件進行交互的軟件接口,使操做系統和其餘計算機程序可以訪問特定設備,不用須要瞭解其硬件的具體構造。
19.一、通訊概念
進程間的通訊方式比較多,首先你須要理解下面這幾個概念
競態條件:即兩個或多個線程同時對一共享數據進行修改,從而影響程序運行的正確性時,這種就被稱爲競態條件(race condition)。
臨界區:不只共享資源會形成競態條件,事實上共享文件、共享內存也會形成競態條件、那麼該如何避免呢?或許一句話能夠歸納說明:禁止一個或多個進程在同一時刻對共享資源(包括共享內存、共享文件等)進行讀寫。換句話說,咱們須要一種 互斥(mutual exclusion) 條件,這也就是說,若是一個進程在某種方式下使用共享變量和文件的話,除該進程以外的其餘進程就禁止作這種事(訪問統一資源)。
一個好的解決方案,應該包含下面四種條件
- 任什麼時候候兩個進程不能同時處於臨界區
- 不該對 CPU 的速度和數量作任何假設
- 位於臨界區外的進程不得阻塞其餘進程
- 不能使任何進程無限等待進入臨界區
忙等互斥:當一個進程在對資源進行修改時,其餘進程必須進行等待,進程之間要具備互斥性,咱們討論的解決方案其實都是基於忙等互斥提出的。
19.二、解決方案
進程間的通訊用專業一點的術語來表示就是 Inter Process Communication,IPC,它主要有下面幾種通訊方式
- 消息傳遞:消息傳遞是進程間實現通訊和同步等待的機制,使用消息傳遞,進程間的交流不須要共享變量,直接就能夠進行通訊;消息傳遞分爲發送方和接收方
- 先進先出隊列:先進先出隊列指的是兩個不相關聯進程間的通訊,兩個進程之間能夠彼此相互進程通訊,這是一種全雙工通訊方式
- 管道:管道用於兩個相關進程之間的通訊,這是一種半雙工的通訊方式,若是須要全雙工,須要另一個管道。
- 直接通訊:在這種進程通訊的方式中,進程與進程之間只存在一條連接,進程間要明確通訊雙方的命名。
- 間接通訊:間接通訊是通訊雙方不會直接創建鏈接,而是找到一箇中介者,這個中介者多是個對象等等,進程能夠在其中放置消息,而且能夠從中刪除消息,以此達到進程間通訊的目的。
- 消息隊列:消息隊列是內核中存儲消息的鏈表,它由消息隊列標識符進行標識,這種方式可以在不一樣的進程之間提供全雙工的通訊鏈接。
- 共享內存:共享內存是使用全部進程之間的內存來創建鏈接,這種類型須要同步進程訪問來相互保護。
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.一、批處理中的調度
先來先服務
很像是先到先得。。。可能最簡單的非搶佔式調度算法的設計就是 先來先服務(first-come,first-serverd)。使用此算法,將按照請求順序爲進程分配 CPU。最基本的,會有一個就緒進程的等待隊列。當第一個任務從外部進入系統時,將會當即啓動並容許運行任意長的時間。它不會由於運行時間太長而中斷。當其餘做業進入時,它們排到就緒隊列尾部。當正在運行的進程阻塞,處於等待隊列的第一個進程就開始運行。當一個阻塞的進程從新處於就緒態時,它會像一個新到達的任務,會排在隊列的末尾,即排在全部進程最後。
這個算法的強大之處在於易於理解和編程,在這個算法中,一個單鏈表記錄了全部就緒進程。要選取一個進程運行,只要從該隊列的頭部移走一個進程便可;要添加一個新的做業或者阻塞一個進程,只要把這個做業或進程附加在隊列的末尾便可。這是很簡單的一種實現。
不過,先來先服務也是有缺點的,那就是沒有優先級的關係,試想一下,若是有 100 個 I/O 進程正在排隊,第 101 個是一個 CPU 密集型進程,那豈不是須要等 100 個 I/O 進程運行完畢纔會等到一個 CPU 密集型進程運行,這在實際狀況下根本不可能,因此須要優先級或者搶佔式進程的出現來優先選擇重要的進程運行。
最短做業優先
批處理中,第二種調度算法是 最短做業優先(Shortest Job First),咱們假設運行時間已知。例如,一家保險公司,由於天天要作相似的工做,因此人們能夠至關精確地預測處理 1000 個索賠的一批做業須要多長時間。當輸入隊列中有若干個同等重要的做業被啓動時,調度程序應使用最短優先做業算法
如上圖 a 所示,這裏有 4 個做業 A、B、C、D ,運行時間分別爲 八、四、四、4 分鐘。若按圖中的次序運行,則 A 的週轉時間爲 8 分鐘,B 爲 12 分鐘,C 爲 16 分鐘,D 爲 20 分鐘,平均時間內爲 14 分鐘。
如今考慮使用最短做業優先算法運行 4 個做業,如上圖 b 所示,目前的週轉時間分別爲 四、八、十二、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.二、交互式系統中的調度
交互式系統中在我的計算機、服務器和其餘系統中都是很經常使用的,因此有必要來探討一下交互式調度
輪循調度
一種最古老、最簡單、最公平而且最普遍使用的算法就是 輪循算法(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 份額。
2二、頁面置換算法都有哪些
算法 註釋 最優算法 不可實現,但能夠用做基準 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 正在執行任務(即不處於空閒狀態)的時間百分比。等待時間
這是進程輪流執行的時間,也就是進程切換的時間吞吐量
單位時間內完成進程的數量響應時間
這是從提交流程到得到有用輸出所通過的時間。- 週轉時間
從提交流程到完成流程所通過的時間。
殭屍進程是已完成且處於終止狀態,但在進程表中卻仍然存在的進程。殭屍進程一般發生在父子關係的進程中,因爲父進程仍須要讀取其子進程的退出狀態所形成的。
往期精選
這是對cxuan熬夜肝文章最好的獎勵。
cxuan我寫的還行麼?喜歡做者