歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux管理 >> Linux網絡

linux網絡編程之進程間通信基礎(二) 死鎖、信號量與PV原語簡介

一、死鎖

(1) 死鎖是指多個進程之間相互等待對方的資源,而在得到對方資源之前又不釋放自己的資源,這樣 ,造成循環等待的一種現象。如果所有進程都在等待一個不可能發生的事,則進程就死鎖了。

(2)死鎖產生的必要 條件:

互斥條件

進程對資源進行排它性使用,即在一段時間內某資源僅為一個進程所占用。

請求和保持條件

當進程因請求資源而阻塞時,對已獲得的資源保持不放。

不可剝奪條件

進程已獲得的資源在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。

環路等待條件

各個進程組成封閉的環形鏈,每個進程都等待下一個進程所占用的資源

(3)防止死鎖的辦法

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

可剝奪資源:(破壞不可剝奪條件)

資源有序分配法:(破壞循環等待條件)

(4)死鎖避免

預防死鎖的幾種策略,會嚴重地損害系統性能。因此在避免死鎖時,要施加較弱的限制,從 而獲得較滿意的系統性能。

由於在避免死鎖的策略中,允許進程動態地申請資源。因而,系統在進行資源分配之前預先 計算資源分配的安全性。若此次分配不會導致系統進入不安全狀態,則將資源分配給進程;否則,進程等待。其中最具有代 表性的避免死鎖算法是銀行家算法。

(5)銀行家算法

為保證資金的安全,銀行家規定:

*  當一 個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客;

*  顧客可以分期貸款,但貸款的總數不 能超過最大需求量

* 當銀行家現有的資金不能滿足顧客尚需的貸款數額時,對顧客的貸款可推遲支付,但總能使顧客在 有限的時間裡得到貸款

* 當顧客得到所需的全部資金後,一定能在有限的時間裡歸還所有的資金.

(6)哲學家 就餐問題

五個哲學家圍在一個圓桌就餐,每個人都必須拿起兩根筷子才能用餐,當每個人都先拿起左筷子,等待右 筷子的時候就會造成死鎖。

哲學家就餐問題解法

服務生解法

最多4個哲學家

僅當一個哲學家兩邊筷子都可用時才允許他拿筷子

給所有哲學家編號,奇數號的哲 學家必須首先拿左邊的筷子,偶數號的哲學家則反之

二、信號量與PV原語

(1)信號量

信號量和P、V 原語由Dijkstra(迪傑斯特拉)提出

struct semaphore

{

int value;

pointer_PCB queue;

};

信號量

互斥:P、V在同一個進程中

同步:P、V在不同進程中

信號量值含義

S>0:S表示可用資源的個數

S=0:表示無可用資源,無等待進程

S<0:|S|表示等待隊列中進程個數

(2)P原語偽代碼

P(s)

{

s.value = s.value--;

if (s.value < 0)

{

該進程狀態置為等待狀狀態

將該進程的PCB指針插入相應的等待隊列s.queue末尾

}

}

注意,PV 操作都是原子性操作,要麼全部執行要麼全部不執行,在阻塞後返回也算是完成一個流程,但如果設 置了IPC_NOWAIT選項,當資源暫且不可用時直接返回錯誤,此時對信號量的操作都沒有執行。

(3)V原語偽代碼

V(s)

{

s.value = s.value++;

if (s.value < =0)

{

喚醒相應等待隊列s.queue中等待的一個進程

改變其狀態為就緒態

並將其插入就緒隊列

}

}

(4)用PV原語解決司機與售票員問題

(5)用PV原語解決民航售票問題

每 個客戶端都在執行PV這樣的操作流程

(6)用PV原語解決汽車租賃問題

有一汽車租賃公司有兩部敞篷車可以 出租,假定同時來了四個顧客都要租敞篷車,那麼肯定會有兩個人租不到。

每個顧客都在執行PV這樣的操作流程。

Copyright © Linux教程網 All Rights Reserved