1. 程式人生 > >[作業系統]複習四 程序 同步互斥 死鎖

[作業系統]複習四 程序 同步互斥 死鎖

程序和程式的本質區別在於動態靜態特徵

系統中感知程序的唯一實體是PCB(程序控制塊,process control block)

程序和執行緒的區別:

程序是執行中的程式,一個程序中包含若干執行緒,它們共享程序所擁有的資源。在OS中,程序是分配資源的基本單位,執行緒是獨立執行和獨立排程的基本單位,執行緒比程序要小,基本上不擁有系統資源,因此排程的開銷也更小。執行緒和程序的區別在於,子程序和父程序之間有不同的程式碼和資料空間,而執行緒則共享其所屬程序的資料空間。

總結:(1)就地址空間和其它資源而言,程序之間相互獨立,而同一程序的各執行緒間共享,某一程序的執行緒在其他程序中不可見。(2)就通訊而言,程序間通訊IPCI(Inter-Process Communication)通過作業系統,執行緒間可以直接讀寫程序資料段(如全域性變數)來進行通訊——需要程序同步和互斥手段的輔助,以保證資料一致性。(3)就排程和切換,執行緒上下文切換比程序上下文切換快得多。

程序狀態轉換:①執行②就緒③阻塞

執行:當一個程序在處理器上執行時,稱其為執行狀態,對於單處理器系統來說,處於執行狀態的程序只有一個。在沒有其他程序可執行時(比如所有程序都處於阻塞狀態),通常會自動執行系統的空閒程序。

就緒:當一個程序獲得了除處理器以外的一切所需資源,一旦得到處理器就可執行,稱之為就緒。就緒程序可以按照優先順序來劃分佇列,比如,當一個程序由於時間片用完而進入就緒狀態時,排入低優先順序佇列,當程序由I/O 操作完成而進入就緒狀態時,處於高優先順序佇列

阻塞:也稱等待或睡眠,即一個程序正在等待某一事件的發生(例如請求I/O而等待I/O 完成)而暫時停止執行,這樣即使把處理器分配給程序也無法執行,故稱之為阻塞。


一次只能被一個程序所佔用的資源就是所謂的臨界資源。典型的臨界資源比如物理上的印表機,或是存在硬碟或記憶體中被多個程序所共享的一些變數和資料等(如果這類資源不被看成臨界資源加以保護,那麼很有可能造成丟資料的問題)。

(1)      程序同步-程序之間的合作(比如程序B需要從緩衝區讀取程序A的資訊,當緩衝區為空時,因為程序B讀不到資訊而阻塞,當程序A產生資訊放入緩衝區時,程序B才被喚醒)

(2)      程序互斥-程序之間的制約(當一個程序A進入臨界區使用臨界資源,另一個程序B必須等待,只有當前臨界資源被A釋放後,B才能解除阻塞狀態)

實現臨界區互斥的基本方法

硬體實現方法

通過硬體實現臨界區最簡單的辦法就是

關CPU的中斷)。從計算機原理我們知道,CPU進行程序切換是需要通過中斷來進行。如果遮蔽了中斷那麼就可以保證當前程序順利的將臨界區程式碼執行完,從而實現了互斥。這個辦法的步驟就是:(遮蔽中斷--執行臨界區--開中斷)。但這樣做並不好,這大大限制了處理器交替執行任務的能力。並且將關中斷的許可權交給使用者程式碼,那麼如果使用者程式碼遮蔽了中斷後不再開,那系統豈不是跪了?

還有硬體的指令實現方式,這個方式和接下來要說的訊號量方式如出一轍。但是通過硬體來實現,這裡就不細說了。

訊號量實現方式

這也是我們比較熟悉P V操作。通過設定一個表示資源個數的訊號量S,通過對訊號量S的P和V操作來實現程序的的互斥。

   PV操作分別來自荷蘭語PasserenVrijgeven,分別表示佔有和釋放P V操作是作業系統的原語,意味著具有原子性。

   P操作首先減少訊號量,表示有一個程序將佔用或等待資源,然後檢測S是否小於0,如果小於0則阻塞,如果大於0則佔有資源進行執行。

   V操作是和P操作相反的操作,首先增加訊號量,表示佔用或等待資源的程序減少了1個。然後檢測S是否小於0,如果小於0則喚醒——等待使用S資源的其它程序。

一些經典利用訊號量實現同步的問題

生產者--消費者問題

問題描述:生產者-消費者問題是一個經典的程序同步問題,該問題最早由Dijkstra提出,用以演示他提出的訊號量機制。本作業要求設計在同一個程序地址空間內執行的兩個執行緒。生產者執行緒生產物品,然後將物品放置在一個空緩衝區中供消費者執行緒消費。消費者執行緒從緩衝區中獲得物品,然後釋放緩衝區。當生產者執行緒生產物品時,如果沒有空緩衝區可用,那麼生產者執行緒必須等待消費者執行緒釋放出一個空緩衝區。當消費者執行緒消費物品時,如果沒有滿的緩衝區,那麼消費者執行緒將被阻塞,直到新的物品被生產出來

這裡生產者和消費者是既同步又互斥的關係,首先只有生產者生產了,消費著才能消費,這裡是同步的關係。但他們對於臨界區的訪問又是互斥的關係。因此需要三個訊號量emptyfull用於同步緩衝區,而mut變數用於在訪問緩衝區時是互斥的。

讀者--寫者問題

問題描述:

一個數據檔案或記錄,統稱資料物件,可被多個程序共享,其中有些程序只要求讀稱為"讀者",而另一些程序要求寫或修改稱為"寫者"

規定:允許多個讀者同時讀一個共享物件,但禁止讀者、寫者同時訪問一個共享物件,也禁止多個寫者訪問一個共享物件,否則將違反Bernstein併發執行條件。

通過描述可以分析,這裡的讀者和寫者是互斥的,而寫者和寫者也是互斥的,但讀者之間並不互斥。

由此我們可以設定3個變數,一個用來統計讀者的數量,另外兩個分別用於對讀者數量讀寫的互斥,讀者和寫著,寫者和寫者的互斥。

哲學家進餐問題

問題描述:

有五個哲學家,他們的生活方式是交替地進行思考和進餐。哲學家們公用一張圓桌,周圍放有五把椅子,每人坐一把。在圓桌上有五個碗和五根筷子,當一個哲學家思考時,他不與其他人交談,飢餓時便試圖取用其左、右最靠近他的筷子,但他可能一根都拿不到。只有在他拿到兩根筷子時,方能進餐,進餐完後,放下筷子又繼續思考。


根據問題描述,五個哲學家分別可以看作是五個程序。五隻筷子分別看作是五個資源。只有當哲學家分別擁有左右的資源時,才得以進餐。如果不指定規則,當每個哲學家手中只拿了一隻筷子時會造成死鎖,從而五個哲學家都因為吃不到飯而餓死。因此我們的策略是讓哲學家同時拿起兩隻筷子。因此我們需要對每個資源設定一個訊號量,此外,還需要使得哲學家同時拿起兩隻筷子而設定一個互斥訊號量

死鎖:在多個程式同時執行的情況下,多個程序之間可能出現競爭一定數量的資源,若某個程序申請資源,則此時資源不可用,那麼即將進入等待狀態,如果所申請的資源被其他等待程序所佔有,那麼該程序有可能永遠處於等待狀態而無法改變狀態。——這就是死鎖情況。

產生死鎖的原因是:

(1)    因為系統資源不足

(2)    程序執行推進的順序不合適

(3)    資源分配不對等

產生死鎖的四個必要條件是:

(1)      互斥條件,一個資源每次只能被一個程序使用,如果有另一個程序申請該資源,那麼申請程序必須等到該資源被釋放為止。

(2)      請求與保持條件(佔有並等待),一個程序必須佔有至少一個資源,並等待另一為其他程序所佔有的資源

(3)      不剝奪條件(非搶佔)),程序已獲得的資源,在未使用完之前,不能強行剝奪,只能在程序完成任務和自動釋放

(4)      迴圈等待條件,若干程序之間形成的一種頭尾相接的迴圈等待資源關係,例如有一組等待程序{p0,p1,p2,p3,p4}, p0 等待的資源為p1所佔有,p1 等待的資源為p2所佔有,p2等待的資源為p3所佔有,p3 等待的資源為p4所佔有,而p4 等待的資源為P1 所佔有。

無論static還是非static的全域性變數,不加限制隨意訪問都可能出現同步問題;

無論static還是非static的區域性變數,每個執行緒都是私有的,其他的執行緒不會對其進行干擾,因此不會出現同步問題。

有5個可用的某類資源,由四個程序共享,每個程序最多可申請(?)個資源,使系統不死鎖?

設臨界資源為m, 共享程序為n個,每個程序最多可以申請x個資源,則

當m>n 時,m>n(x-1) 使系統不死鎖,當m<n 時,x=1;

因此x=2;

決死鎖的基本方法:

預防死鎖:

資源一次性分配:(破壞請求和保持條件

可剝奪資源:即當某程序新的資源未滿足時,釋放已佔有的資源(破壞不可剝奪條件

資源有序分配法:系統給每類資源賦予一個編號,每一個程序按編號遞增的順序請求資源,釋放則相反(破壞環路等待條件

避免死鎖:

預防死鎖的幾種策略,會嚴重地損害系統性能。因此在避免死鎖時,要施加較弱的限制,從而獲得 較滿意的系統效能由於在避免死鎖的策略中,允許程序動態地申請資源。因而,系統在進行資源分配之前預先計算資源分配的安全性。若此次分配不會導致系統進入不安全狀態,則將資源分配給程序;否則,程序等待。其中最具有代表性的避免死鎖演算法銀行家演算法

檢測死鎖

首先為每個程序和每個資源指定一個唯一的號碼;

然後建立資源分配表程序等待表,例如:

解除死鎖:

當發現有程序死鎖後,便應立即把它從死鎖狀態中解脫出來,常採用的方法有:

剝奪資源:從其它程序剝奪足夠數量的資源給死鎖程序,以解除死鎖狀態

撤消程序:可以直接撤消死鎖程序或撤消代價最小的程序,直至有足夠的資源可用,死鎖狀態.消除為止;所謂代價是指優先順序、執行代價、程序的重要性和價值等。