分布式操作系统.ppt
利用定序器和事件计数器实现P和VP(s) V(s)semaphores; semaphores;{ { int i; advance(s.e); i:=ticket(s.t); } await(s.e,i+1-s.initial_value);}eventcount in,out;sequencer Pticket,Cticket;buffer: array[0..N]ofmessage;producer() consumer(){ { int t,i:=1; int u,i:=1; message: m; message m; while(true) while(true) { { m:=produce(); t:=ticket(Pticket); u:=ticket(Cticket); /*一次一个生产者*/ /*一次一个消费者*/ await(in,t); awit(out,u); awit(out,t-N+1); await(in,u+1); /*等待一个空缓冲区别*/ /*等待一个消息*/ buffer[tmodN]:=m; m:=buffer[umodN]; advance(in); advance(out); /*信号一个满缓冲区及*/ /*信号一个满缓冲区*/ /*允许其它生产者*/ /*允许其它消费者*/ consume(m); } }} }图-利用定序器和事件计数器实现生产者和消费者问题eventcount E;sequencer T;Pboth(R,S)semaphoreR,S;{ int q,r,s; q:=ticket(T); await(E,q); r:=ticket(R.t); s:=ticket(S.t); advance(E); await(R.e,r+1-R.initial_value); await(R.e,r+1-R.initial_value);}图-利用定序器和事件计数器实现SimultaneousP利用定序器和事件计数器实现P和VP(s) V(s)semaphores; semaphores;{ { int i; advance(s.e); i:=ticket(s.t); } await(s.e,i+1-s.initial_value);}eventcount in,out;sequencer Pticket,Cticket;buffer: array[0..N]ofmessage;producer() consumer(){ { int t,i:=1; int u,i:=1; message: m; message m; while(true) while(true) { { m:=produce(); t:=ticket(Pticket); u:=ticket(Cticket); /*一次一个生产者*/ /*一次一个消费者*/ await(in,t); awit(out,u); awit(out,t-N+1); await(in,u+1); /*等待一个空缓冲区别*/ /*等待一个消息*/ buffer[tmodN]:=m; m:=buffer[umodN]; advance(in); advance(out); /*信号一个满缓冲区及*/ /*信号一个满缓冲区*/ /*允许其它生产者*/ /*允许其它消费者*/ consume(m); } }} }图-利用定序器和事件计数器实现生产者和消费者问题eventcount E;sequencer T;Pboth(R,S)semaphoreR,S;{ int q,r,s; q:=ticket(T); await(E,q); r:=ticket