1.無論生產(chǎn)者穴豫、消費者使用緩沖池時應(yīng)保證互斥使用(互斥信號量mutex )
2.生產(chǎn)者和消費者間交叉有序:
? 有序的控制最根源在產(chǎn)品數(shù)量上。
? 設(shè)置兩個信號量:
? ? ? ? ?分別針對生產(chǎn)者椿息、消費者設(shè)置不同的信號量,empty和full分別表示緩沖池中空緩沖池和滿緩沖池(即產(chǎn)品)的數(shù)量签赃。
1)兩個生產(chǎn)者同時的情況
假設(shè)的時間片輪轉(zhuǎn)順序如下
produce;
? ? ? ? ?produce;
wait(e);
wait(m);
buffer(in):=nexp;
? ? ? ? wait(e);
? ? ? ? wait(m);
? ? ? ? buffer(in):=nexp;
in:=(in+1)mod n;
signal(m);
signal(f);
? ? ? ?in:=(in+1)mod n;
? ? ? ?signal(m);
? ? ? signal(f);
1號生產(chǎn)者的wait操作使e=n-1哨坪,m=0
當(dāng)1號正在in=0的buffer[0]放入產(chǎn)品時,2號來到轿腺,wait(e)仍通過两嘴,e=n-2;但wait(m)會使2號阻塞族壳。m=-1憔辫,e=n-2。
轉(zhuǎn)入1號生產(chǎn)者執(zhí)行使in=1,仿荆,喚醒m上的等待者——2號生產(chǎn)者螺垢,但可能并不立即切換到2號運行,而是其分到的cpu時間完成后再轉(zhuǎn)到2號赖歌。此時m=0枉圃,f=1。
回到2號進程后庐冯,將產(chǎn)品放入緩沖區(qū)孽亲;in=2;m=1展父;f=2返劲。
2)生產(chǎn)者等待消費者情況
假設(shè)的時間片輪轉(zhuǎn)順序如下
produce;
wait(e);
wait(m);
buffer(in):=nexp;
? ? ? ? wait(f);
? ? ? ? wait(m);
? ? ? ? ?nextc:=buffer(out);
in:=(in+1)mod n;
signal(m);
signal(f);
? ? ? ?out:=(out+1) mod n;
? ? ? ?signal(m);
? ? ? ?signal(e);
? ? ? ?consume;?
設(shè)當(dāng)前運行到一個臨界點,緩沖區(qū)滿了栖茉,而生產(chǎn)者先來了要生產(chǎn)篮绿。
e=0;m=1吕漂;f=n
注意:signal原語喚醒的因wait阻塞的進程后該進程并不需再重新執(zhí)行wait亲配。
3)2個生產(chǎn)者2個消費者同步模擬分析
produce;
? ? ? ? ? wait(f);
? ? ? ? ? wait(m);
? ? ? ? ? ? ? ? ? ?nextc:=buffer(out);
? ? ? ? ? ? ? ? ? ? ? ? produce;
wait(e);
wait(m);
buffer(in):=nexp;
? ? ? ? ? ?out:=(out+1) mod n;
? ? ? ? ? ?signal(m);
? ? ? ? ? ?signal(e);
? ? ? ? ? ? ? ? ? ? ? wait(e);
? ? ? ? ? ? ? ? ? ? ? wait(m);
? ? ? ? ? ? ? ? ? ? ? ?buffer(in):=nexp;
in:=(in+1)mod n;
signal(m);
signal(f);
? ? ? ? ?consume;
? ? ? ? ? ? ?in:=(in+1)mod n;
? ? ? ? ? ? ? signal(m);
? ? ? ? ? ? ? signal(f);
? ? ? ? ? ? ? wait(f);
? ? ? ? ? ? ? ?wait(m);
? ? ? ? ? ? ? ? ? ? ? ?nextc:=buffer(out);
? ? ? ? ? ? ?out:=(out+1) mod n;
? ? ? ? ? ? ? signal(m);
? ? ? ? ? ? ? signal(e);
AND信號量的方式
consumer :
? ? repeat
? ? ? ? ? ?Swait(full, mutex);
? ? ? nextc:=buffer(out);
? ? ? out:=(out+1) mod n;
? ? ? ? Ssignal(mutex, empty);
? ? consume the item in nexc;
until? false;