進程同步
進程同步的基本概念
兩種形式的制約關系
() 間接相互制約關系
() 直接相互制約關系
臨界資源(Critical Resouce)
生產者消費者(producerconsumer)問題是一個著名的進程同步問題它描述的是有一群生產者進程在生產產品並將這些產品提供給消費者進程去消費為使生產者進程與消費者進程能並發執行在兩者之間設置了一個具有n個緩沖區的緩沖池生產者進程將它所生產的產品放入一個緩沖區中 消費者進程可從一個緩沖區中取走產品去消費盡管所有的生產者進程和消費者進程都是以異步方式運行的但它們之間必須保持同步即不允許消費者進程到一個空緩沖區去取產品也不允許生產者進程向一個已裝滿產品且尚未被取走的緩沖區中投放產品
Var n integer;
type item=…;
var buffer:array[ … n] of item;
in out: … n;
counter: … n;
指針in和out初始化為在生產者和消費者進程的描述中noop是一條空操作指令while condition do noop語句表示重復的測試條件(condication)重復測試應進行到該條件變為false(假)即到該條件不成立時為止在生產者進程中使用一局部變量nextp用於暫時存放每次剛生產出來的產品而在消費者進程中則使用一個局部變量nextc用於存放每次要消費的產品
producer: repeat
…
produce an item in nextp;
…
while counter=n do noop;
buffer[in]∶ =nextp;
in∶ =in+ mod n;
counter∶ =counter+;
until false;
consumer: repeat
while counter= do noop;
nextc∶=buffer[out];
out∶=(out+) mod n;
counter∶=counter;
consumer the item in nextc;
until false;
雖然上面的生產者程序和消費者程序在分別看時都是正確的而且兩者在順序執行時其結果也會是正確的但若並發執行時就會出現差錯問題就在於這兩個進程共享變量counter生產者對它做加操作消費者對它做減操作這兩個操作在用機器語言實現時常可用下面的形式描述
register∶=counter;register∶=counter;
register∶=register+;register∶=register;
counter∶=register;counter∶=register;
假設counter的當前值是如果生產者進程先執行左列的三條機器語言語句然後消費者進程再執行右列的三條語句則最後共享變量counter的值仍為反之如果讓消費者進程先執行右列的三條語句然後再讓生產者進程執行左列的三條語句counter值也還是但是如果按下述順序執行
register∶=counter;(register =)
register∶=register+;(register =)
register∶=counter;(register =)
register∶=register ;(register =)
counter∶=register;(counter=)
counter∶=register;(counter=)
臨界區(critical section)
可把一個訪問臨界資源的循環進程描述如下
repeat
critical section;
remainder section;
until false;
同步機制應遵循的規則
() 空閒讓進
() 忙則等待
() 有限等待
() 讓權等待
了解更多計算機相關基礎課程視頻
[] [] []
From:http://tw.wingwit.com/Article/program/czxt/201311/24205.html