作業系統的知識點整理
阿新 • • 發佈:2019-12-31
程式管理
程式與執行緒分別是什麼?
- 程式是系統進行資源分配和排程的一個獨立單位,它可以擁有自己的地址空間;引入程式是為了使多個程式可以併發地執行,以提高系統的資源利用率和吞吐量。
- 執行緒是程式的一個實體,是CPU排程的基本單位,它是比程式更小的能獨立執行的一個單位;引入執行緒是為了減少程式在併發過程中的開銷,使OS的併發效率更高。
兩者有什麼區別?
- 程式是資源分配的最小單位,執行緒是排程的最小單位;
- 一個執行緒只能屬於一個程式,而一個程式可以有多個執行緒,但至少有一個執行緒;
- 程式本身保有資源,而執行緒只含有一些維持活動所必不可少的資源,本身不擁有系統資源。
為什麼執行緒排程的開銷比程式小?
- 由於程式是一個資源的擁有者,因此在建立或撤銷程式的過程中,系統都要為之建立或回收程式控制塊、分配或回收記憶體;同時,在程式切換時,系統需要保留當前程式的CPU環境,再設定新選中的程式的CPU環境;所以對程式的排程是相對複雜的,需要花費大量的處理機時間。
- 而執行緒雖然具有許多傳統程式所具有的特徵,但本身不保有資源;並且,由於同一個程式中的資源是所有執行緒共享的,所以執行緒可以通過這些資料來進行更加方便快捷的通訊,從而降低一些系統開銷。因此相比於程式,執行緒能擁有更快的排程速度,又稱為“輕型程式”。
程式有哪幾種狀態?
- 就緒狀態 :程式已經獲得除處理機以外的全部所需資源,只要獲得處理機便可立即執行,則稱此時的狀態為就緒狀態
- 執行狀態 :當程式已經獲得處理機,且其程式正在處理機上執行,則稱程式此時的狀態為執行狀態
- 阻塞狀態 :正在執行的程式,由於等待某個事件發生而無法執行時,便放棄處理機而處於阻塞狀態。引起阻塞狀態的事件可以有多種,例如,等待I/O完成、申請緩衝區不能滿足、等待訊號等等
執行緒同步的方式有哪些?
- 互斥量 :採用互斥物件機制,只有擁有互斥物件的執行緒才有訪問公共資源的許可權。因為互斥物件只有一個,所以可以保證公共資源不會被多個執行緒同時訪問;但是這樣很容易造成死鎖(
- 訊號量 :它允許同一時刻多個執行緒訪問同一資源,但是需要控制統一時刻訪問此資源的最大執行緒數量;當需要一個計數器來限制可以使用某共享資源的數目時,可以使用“訊號量”物件。
- 事件(訊號):通過通知操作的方式來保持多執行緒同步,還可以方便地實現多執行緒優先順序的比較操作,即事件機制允許一個執行緒在處理完一個任務後,主動喚醒另一個執行緒執行任務。
經典的程式同步問題有哪些?
- 生產者-消費者問題
- 問題描述 :一組生產者程式和一組消費者程式共享一塊初始為空,大小確定的緩衝區,只有當緩衝區不為滿的時候,生產者程式才可以將訊息放入緩衝區,否則就要等待;只有當緩衝區不為空的時候,消費者程式才可以從中取出訊息,否則就要等待;緩衝區一次只能被一個程式所訪問。
- 問題分析 :生產者和消費者程式對緩衝區的訪問是互斥關係,而生產者與消費者本身又存在同步關係,即訊息必須先被生產,然後才能被消費。因而可以為對緩衝區的訪問設定一個互斥量,再設定兩個訊號量,一個記錄空閒緩衝區單元,一個記錄滿緩衝區單元,從而實現生產者與消費者的同步。
- 哲學家進餐問題
- 問題描述 :一張圓桌上坐著五名哲學家,每兩個哲學家之間擺一根筷子,哲學家只有同時拿起左右兩根筷子才可以用餐,用餐完成後將筷子放回原處。
- 問題分析 :為防止哲學家各取一根筷子而出現死鎖,需要新增一定的限制條件。
- 幾種解決方案如下 :
- 限制至多隻允許有四位哲學家同時去拿左邊的筷子,最終能保證至少有一位哲學家能夠進餐,並在用畢時能釋放出他用過的筷子,從而使更多的哲學家能夠進餐
- 限制僅當哲學家左右手兩邊的筷子都可用時,才允許拿起筷子進餐;即使用AND訊號量機制解決問題
- 讀者-寫者問題
- 問題描述 :有讀者和寫者兩個併發程式共享一個資料,多個讀程式可以同時訪問資料,但寫程式的資料訪問與其他程式都互斥
- 問題分析 :讀者與寫者互斥,寫者與寫者互斥,讀者與讀者共享。所以需要一個互斥量實現讀寫程式與寫寫程式的互斥,此外還需要引入一個計數器對讀執行緒進行計數,使得讀讀同步,讀寫互斥。
- 幾種解決方案如下 :
- 讀者優先 :但只要讀者源源不斷,寫者就得不到資源,容易造成寫者飢餓
- 讀寫公平 :讀者與寫者公平競爭資源,但只要之前有已經排好隊的讀者,就算寫者獲取到了資源,也要等待所有讀者執行緒結束
- 寫者優先 :雖然之前已經排好隊的讀者可以優先訪問資源,但在這之後的讀者則需要等待寫者程式結束。只要寫者源源不斷,後面的讀者就得不到資源,容易造成讀者飢餓
程式間的通訊方式有哪些?
- 程式通訊,是指程式間的資訊交換。因此,對於用訊號量進行的程式間的互斥和同步,由於其所交換的資訊量少而被歸結為低階通訊。
- 所謂程式間的高階通訊是指 :使用者可以利用作業系統所提供的一組通訊命令傳送大量資料,而作業系統隱藏了程式通訊的實現細節,即通訊過程對使用者來說是透明的。
- 高階通訊機制可以歸結為三大類 :
- 管道通訊 :管道通訊是一種半雙工的通訊方式,資料只能在程式間單向流動;其中,傳送訊息的稱為寫程式,接收訊息的稱為讀程式。管道主要分為普通管道和命名管道,它們的區別在於,普通管道只能在具有親緣關係(如父子程式)的程式間流動,而命名管道允許無親緣關係的程式進行通訊。
- 訊息緩衝通訊 :多個獨立的程式之間可以通過訊息緩衝機制來相互通訊。這種通訊的實現是以訊息緩衝區為中間機制。通訊雙方的傳送和接收操作均以訊息為單位。在儲存器中,訊息緩衝區被組織成佇列,通常稱為訊息佇列;訊息佇列一旦建立後即可由多執行緒共享。
- 共享記憶體通訊 :由於訊息緩衝需要佔用CPU進行訊息複製,OS提供了一種允許程式間直接進行資料交換的通訊方式,即共享記憶體。它可以不通過中間機制,直接將共享的記憶體頁面對映到相互通訊的程式格子的虛擬地址空間中去,從而使多個程式可以直接訪問同一個實體記憶體頁面,如同訪問自己的私有空間一樣。但由於記憶體實體存在於計算機系統中,只能由處於同一個計算機系統中的程式共享,不方便網路通訊。
處理機排程與死鎖
作業系統中的程式排程演演算法有哪些?
- 先來先服務排程演演算法 :每次選擇最先進入該佇列的程式
- 短作業優先排程演演算法 :每次選一個預計執行時間最短的程式
- 高優先權優先排程演演算法 :
- 非搶佔式優先權演演算法 :一旦將處理機分配給就緒佇列中優先權最高的程式後,該程式便一直執行下去,直到執行完成或該程式主動放棄處理機;這種排程演演算法主要用於批處理系統中,也可用於某些對實時性要求不嚴格的實時系統中。
- 搶佔式優先權排程演演算法 :同樣是將處理機分配給當前最高優先權的程式,但是,若執行期間出現了優先權更高的程式,則立即停止當前程式的執行,重新將處理機分配給新的優先權最高的程式。通常用於要求比較嚴格的實時系統中,以及對效能要求較高的批處理和分時系統中。
什麼是死鎖?
在兩個或多個併發程式中,如果每個程式持有某種資源而又等待著其他程式釋放它們現在保有著的某種資源,且在改變這種狀態之前都不能繼續推進,則稱這一組程式產生了死鎖。簡單來說就是多個程式的無限期阻塞與相互等待。
死鎖產生的條件是什麼?
主要有以下四個條件,只要其中一條不成立,則不會產生死鎖 :
- 互斥條件 :一個資源一次只能被一個程式呼叫
- 請求與保持條件 :一個程式因請求資源而阻塞時,對已經獲得的資源保持不放
- 不可剝奪條件 :程式獲得的資源,在完全使用完之前,不進行強行剝奪
- 環路等待條件 :若干程式之間形成一種頭尾相接的環形等待關係
解決死鎖的基本方法有哪些?
- 預防死鎖 :
- 資源一次性分配 :(破壞請求和保持條件)
- 可剝奪資源 :當某程式新的的資源未滿足時,釋放已經佔有的資源(破壞不可剝奪條件)
- 資源有序分配 :系統給每類資源富裕一個編號,每一個程式按編號遞增的順序請求資源,釋放則相反(破壞環路等待條件)
- 避免死鎖 :
- 銀行家演演算法 :從當前狀態出發,按照系統各類資源剩餘量逐個檢查各程式需要申請的資源量,找到一個各類資源申請量均不大於系統剩餘資源量的程式P1,然後將資源分配給它,假定P1完成工作後將歸還其佔有的所有資源,更新系統剩餘資源狀態並移除程式列表中的P1,然後繼續尋找下一個能滿足條件的程式。如果找到一個序列能使所有客戶(程式)都完成工作,則銀行家(OS)是安全的。
- 檢測死鎖 :
- 為每個程式、每個資源指定唯一編號
- 設定一張資源分配表,記錄各程式與佔用資源之間的關係
- 設定一張程式等代表,記錄各程式與要申請的資源之間的關係
- 依次檢測資源的佔有及請求情況,如果出現環路則說明引發了死鎖
- 解除死鎖 :
- 剝削資源 :從其他程式剝削足夠數量的資源給死鎖程式,以解除死鎖
- 撤銷程式 :最簡單的撤銷方式是使全部死鎖程式都夭折掉;稍微溫和一點的方式是按照某種順序逐個撤銷程式,知道有足夠的資源可用,使死鎖狀態消除為止
儲存器管理
動態連續分配有哪些演演算法?
動態分割槽分配又稱為可變分割槽分配,是一種動態規劃記憶體的分割槽方法。這種方法不預先將記憶體劃分,而是在程式裝入記憶體時,根據程式的大小動態地建立分割槽,並使分割槽的大小正好適合程式的需要。因此係統中分割槽的 大小和數目時可變的。動態連續分配主要有以下演演算法 :
- 首次適應演演算法 :空閒分割槽以地址遞增的次序連結。分配記憶體時順序查詢,找到大小滿足要求的第一個空閒分割槽
- 最佳適應演演算法 :空閒分割槽按容量遞增形成分割槽鏈,找到第一個能滿足要求的空閒分割槽
- 最壞適應演演算法 :又稱最大適應演演算法,空閒分割槽以容量遞減的次序連結,找到第一個能滿足要求的空閒分割槽,也就是挑選出最大的分割槽。
分頁和分段儲存管理有什麼區別?
- 頁是資訊的物理單位,分頁是為了實現離散分配方式,以消減記憶體的“碎片”,提高記憶體利用率,從而滿足系統的需要。段是資訊的邏輯單位,它含有的是一組意義相對完整的資訊,能夠更好地滿足使用者的需要。
- 頁的大小固定且由系統確定,而段的長度卻不固定,取決於使用者所編寫的程式。
- 分頁的作業地址空間是一維的,即單一的線性空間,程式設計師只需要用一個記憶符,即可表示一段地址;分段的作業地址空間是二維的,程式設計師在標識一個地址時,即需要給出段名,又需要給出段內地址。
什麼是虛擬記憶體?
如果存在一個程式,所需記憶體空間超過了計算機可以提供的實際記憶體,那麼由於該程式無法裝入記憶體,也就無法執行。為瞭解決這個問題,即引申出了虛擬記憶體的概念。
- 基於區域性性原理,在程式裝入時,可以只將程式的一部分裝入記憶體,而將其它部分留在外存。在程式執行過程中,當訪問的資訊不再記憶體時,再由作業系統將所需要的部分調入記憶體,然後繼續執行程式。另一方面,作業系統會將暫時不使用的內容換出到外存上,從而騰出空間存放將要調入記憶體的資訊。
- 這樣,就好像是作業系統為使用者提供了一個比實際容量大得多的儲存器,稱為虛擬儲存器。
虛擬儲存器有什麼特點?
- 多次性 :一個作業可以分多次被調入記憶體。多次性是虛擬儲存所特有的屬性。
- 對換性 :指作業執行過程中存在換進換出的過程。
- 虛擬性 :指其從邏輯上擴充了記憶體的容量。虛擬性是虛擬儲存器最重要的特徵,也是其最終目標;它是建立在多次性和對換性基礎上的,而多次性和對換性又是建立在離散分配的基礎上。
常用的頁面置換演演算法有哪些?
- 最佳置換演演算法 :只存在於理論中的演演算法,優先置換最長未來世界不會被訪問的頁面。
- 先進先出演演算法 :優先置換最早被調入的頁面。
- 最近最久未使用演演算法 :對最佳置換演演算法的一種嘗試,優先置換最近最久未使用的頁面。演演算法賦予每個頁面一個訪問欄位,用來記錄上次頁面被訪問到現在所經歷的時間t,每次置換時把t值最大的頁面。置換出去。這是一種較好的演演算法,但需要較多的硬體支援,如暫存器和棧。
- 時鐘演演算法 :又稱最近未使用演演算法,是最近最久未使用的近似演演算法;該演演算法會為頁面設定一個訪問位,並將頁面連結為一個環形佇列,頁面被訪問時流將訪問位置為1。頁面置換時,如果當前指標所指頁面的訪問位為0,則置換,否則,就將其置換為0,然後繼續判斷下一個,直到遇到一個訪問位為0的頁面為止。
- 改進時鐘演演算法 :在時鐘演演算法的基礎上新增一個修改位,替換時根據訪問位和修改位進行綜合判斷。優先替換訪問位和修改位都是0的頁面,其實是訪問位為0修改位為1的頁面。
其他的想起來再整理(`・ω・´)