b11121b3国4 buffer:array O,..., n-1 of item; --…- in, out:integer: =0.0; 我的同步与通信4 producer: begin repeat wait(full) next product; wait(mutex) ait(empty); out: =(out+1)mod n: signal(empty); in :=(in+1)mod n 的同步 signal(mutex) 46 wait(empty) wait(full empty>=0则数据送入级冲区 full>=0则从级冲区取走数据 empty 被阻(瀹 ful<0被阻骞(空 empty >0 empty<=0释放一个空缓冲区,唤腹一个 作系统|进程的 full<=0数据装入缓冲区,唤一个 阻塞的生产者进程 阻塞的消费者进程8 操 作 系 统 | 进 程 的 同 步 与 通 信 43 CUIT 徐虹 操 作 系 统 | 进 程 的 同 步 与 通 信 44 CUIT 徐虹 变量定义: begin Var mutex,empty,full:semaphore:=1,n,0; buffer:array[0,…,n-1] of item; in,out:integer := 0,0; 操 作 系 统 | 进 程 的 同 步 与 通 信 45 CUIT 徐虹 parbegin producer: begin repeat produce next product ; wait (empty); wait (mutex); buffer(in):=nextp ; in := (in+1) mod n ; signal (full); signal (mutex); until false ; end 操 作 系 统 | 进 程 的 同 步 与 通 信 46 CUIT 徐虹 consumer: begin repeat wait (full); wait (mutex); nextc := buffer(out); out := (out+1) mod n; signal (empty); signal (mutex); consume the item in nextc; until false ; end parend end 操 作 系 统 | 进 程 的 同 步 与 通 信 47 CUIT 徐虹 wait(empty) empty >= 0 则数据送入缓冲区 empty < 0 被阻塞 (满) signal(empty) empty > 0 empty <= 0 释放一个空缓冲区,唤醒一个 阻塞的生产者进程 操 作 系 统 | 进 程 的 同 步 与 通 信 48 CUIT 徐虹 wait(full) full >= 0 则从缓冲区取走数据 full < 0 被阻塞 (空) signal(full) full > 0 full <= 0 数据装入缓冲区,唤醒一个 阻塞的消费者进程