procedure wait(s) var s:semaphore S. value-1: n block(S, L); 选 procedure signal(s) S value:=S value+1 IfS value <=0 then wakeup(S, L); 我的步与通信2 信号量集机制 AND型信号量集机制 A、B交替执行 向引入 process A: wait(Mutex) JuDmutex=0 进程A、B讨问共事据D和E s process B: wait(Mutex); JUEmutex=0 信号量 Mutex=1, Mute 则I process A process: wait(Mute);则 Mutex=1,阻嘉 wait(Mutex) wait(Mutex) 的发生死锁 wait(Mutex): AND同步机制的思想 Swait(s1S2,…Sn) Signal(s1, S2,...,Sn) For i=l to n do Endfor 将所有等待Si资源的进程移到就绪队列。 ndfor 将进程插入第i(Sik1)个管待队列 作系统|进程的 设该进程的程序计撒器到Swai操作的开始6 操 作 系 统 | 进 程 的 同 步 与 通 信 31 CUIT 徐虹 procedure wait(s) var s:semaphore; begin S.value := S.value – 1; If S.value < 0 then block(S,L); end procedure signal(s) var s:semaphore; begin S.value := S.value + 1; If S.value < = 0 then wakeup(S,L); end 操 作 系 统 | 进 程 的 同 步 与 通 信 32 CUIT 徐虹 -1 -2 -1 操 作 系 统 | 进 程 的 同 步 与 通 信 33 CUIT 徐虹 ¾信号量集机制 ¾AND型信号量集机制 ¾问题引入 进程A、B访问共享数据D和E 信号量Dmutex=1,Emutex=1 process A : wait(Dmutex) ; wait(Emutex) ; process B : wait(Emutex) ; wait(Dmutex) ; 操 作 系 统 | 进 程 的 同 步 与 通 信 34 CUIT 徐虹 A、 B交替执行: process A : wait(Dmutex) ; 则Dmutex = 0 process B : wait(Emutex) ; 则Emutex = 0 process A : wait(Emutex) ; 则Emutex = -1,阻塞 process B : wait(Dmutex) ; 则Dmutex = -1,阻塞 发生死锁。 操 作 系 统 | 进 程 的 同 步 与 通 信 35 CUIT 徐虹 ¾AND同步机制的思想 Swait(S1,S2,…,Sn) If S1>=1 and S2>=1 and … and Sn>=1 then For i:=1 to n do Si := Si – 1; Endfor Else 将进程插入第i(Si<1)个等待队列。 设置该进程的程序计数器到Swait操作的开始。 Endif 操 作 系 统 | 进 程 的 同 步 与 通 信 36 CUIT 徐虹 Ssignal(S1,S2,…,Sn) For i:=1 to n do Si := Si + 1; 将所有等待Si资源的进程移到就绪队列。 Endfor