②原语P、V是不可再分的原子操作 ③信号灯满足的要求 记录挂起的进程(用队列) 唤醒策略(考虑优先级、时间等)
②原语P、V是不可再分的原子操作 ③信号灯满足的要求 记录挂起的进程(用队列) 唤醒策略(考虑优先级、时间等)
④一个例子 “生产者消费者”问题 const n=20 shared var缓冲区长度n,缓冲区项目总数t semaphore mutex:=1;{用于保证互斥} in:=0;{用于同步,可挂起 consumer} spaces. n 用于同步,可挂起 producer}
④一个例子 “生产者-消费者”问题 const n=20 shared var 缓冲区长度n,缓冲区项目总数t; semaphare mutex:=1; {用于保证互斥} in:=0; {用于同步,可挂起consumer} spaces:=n; {用于同步,可挂起producer}
process producer; var 1 Integer: repeat producer(i) P(Spaces) P(mutex) 添加项目倒缓冲区; V(mutex) V(in) Drever end producer;
process producer; var i:integer; repeat producer(i); P(spaces); P(mutex); 添加项目i到缓冲区; V(mutex); V(in); forever end producer;
process consumer, var j integer, repeat P(in) P(mutex) 从缓冲区移出一个项目到j V(mutex V(Spaces) forever end consumer
process consumer; var j:integer; repeat P(in); P(mutex); 从缓冲区移出一个项目到j; V(mutex); V(spaces); forever end consumer;
⑤注意在访问共享资源前不能忘记执行 次P操作释放资源时不要忽略执行一次V 操作
⑤注意:在访问共享资源前,不能忘记执行 一次P操作;释放资源时不要忽略执行一次V 操作