一、基本概念
1.同步與互斥
同步:兩個或兩個以上進程要協作完成一個任務。
互斥:兩個或兩個以上進程競爭一個資源。
2.臨界段
臨界資源:一段時間內只允許一個進程訪問的資源。
臨界段:進程訪問臨界資源的程序段
二、信號量
1.操作
(1)初始化操作,信號量能初始化爲非負的值。
(2)semWait操作,能減小信號量的值,如結果值爲負,執行semWait操作的進程就被封鎖。
(3)semSignal操作,能增加信號量的值,如果結果值非正,那麼原先因執行semWait操作而阻塞的進程被解除阻塞。
2.信號量實現互斥
semWait(s)
臨界段
semSignal(s)
3.信號量實現同步
由進程A semWait,進程BsemSignal
4.生產消費者問題
buffers:緩衝區的大小
mutex:互斥信號量
product:有無產品
生產者:
while(){
produce new product;
semWait(buffers);
semWait(mutex);
put product into buffers;
semSignal(mutex);
semSignal(products);
}
消費者:
while(){
semWait(products);
semWait(mutex);
getproduct from buffers;
semSignal(mutex);
semSignal(buffers);
consumeproduct;
}
5.讀者/寫者問題
讀者進程之間不需要互斥,但寫進程必須與其他所有寫進程和讀進程互斥。
信號量:mutex(互斥信號量),wrt,count(計數器)
寫進程:
while(){
semWait(wrt);
write information;
semSignal(wrt);
}
讀進程:
while(){
semWait(mutex);
if (++count == 1)
semWait(wrt);
semWait(mutex)
read information;
semSignal(mutex);
if ( --count == 0)
semSignal(wrt);
semSignal(mutex);
}
三、進程間數據通信
1.消息通信
一個進程要向另一個進程發送消息,先要向系統申請一個緩衝區,填寫了消息正文和其他有關消息的特徵、控制信息後,通過消息通信機構將該消息送到接收其他消息隊列中。
接收進程在一個適當時機從消息隊列中移出一個消息,讀取所有的信息後,再釋放消息緩衝區。
2.共享存儲區
3.管道
四、死鎖
1.死鎖產生原因
幾個進程各自佔了對方要的資源
2.產生死鎖的條件
(1)互斥執行
每次只能允許一個進程佔有和使用一個資源,其他申請該資源的進程被阻塞。
(2)保持並等待
當進程等待分配給它新的資源時,保持佔有已分配的資源。
(3)不可剝奪
不能強迫移去進程佔有的未使用完的資源。
(4)循環等待
存在一個閉合的進程──資源鏈,以致每一個進程至少佔有鏈中下一個進程所需要的一個資源。
3.死鎖的預防
(1)互斥執行
無法預防。
(2)保持並等待
進程一次申請它所有需要的資源。
(3)不可剝奪
如果進程不能獲得進一步的資源,要求其釋放原先佔有的資源。
(4)循環等待
資源排序,如果一個進程已經佔有了資源A,那麼它接下來只能申請排在A後面的資源。
此外還有銀行家算法用於死鎖避免,Coffman算法用於死鎖檢測。
4.死鎖解除
(1)強迫撤銷所有死鎖進程
(2)逐個撤銷死鎖進程
(3)相繼剝奪進程所佔資源