- 利用信号量实现进程互斥(模式)
- 利用信号量实现前驱关系(模式)
- 利用记录型信号量实现同步(模式)
1.利用信号量实现进程互斥(模式)
为使多个进程互斥的访问某临界资源,须为该资源设置一互斥信号量mutex,并设其初始值为1,然后将各进程访问资源的临界区CS置于wait(mutex)和signal(mutex)之间即可。
/**例:用记录型信号量实现两个
进程互斥使用一台打印机*/
Var mutex: semaphore :=1; //表示打印机
begin
parbegin
p1: begin
repeat
… …
wait(mutex);
使用打印机
signal(mutex);
… …
until false;
end
parend
p2: begin
repeat
… …
wait(mutex);
使用打印机
signal(mutex);
… …
until false;
end
利用信号量实现前驱关系(模式)
设有两个并发执行的进程P1和P2,P1中有语句S1,P2中有语句S2,希望在S1执行后再执行S2。
使进程P1和P2共享一个公用信号量S,并赋予其初值为0
进程P1: S1;
signal(S);
进程P2: wait(S);
S2;
Var a, b, c, d, e, f, g; semaphore :=0, 0, 0, 0, 0, 0, 0;
begin
parbegin
begin S1; signal(a); signal(b); end;
begin wait(a); S2; signal(c); signal(d); end;
begin wait(b); S3; signal(e); end;
begin wait(c); S4; signal(f); end;
begin wait(d); S5; signal(g); end;
begin wait(e); wait(f); wait(g); S6; end;
parend
end
3: 利用记录型信号量实现同步(模式)
P1,p2两进程因合作完成一项任务而共用一个变量x。
进程p2将处理结果送入x;进程P1将x的结果打印。
即:p2:x=处理结果;
p1:Print(x);
如何实现该合作关系?
Var empty: semaphore :=1; //变量x可赋值使用,即P1 的print(x)已完成
full: semaphore :=0; //变量x已赋值,即P2可 print(x)
begin
parbegin
p1: begin
repeat
… …
wait(full);
print(x);
signal(empty);
… …
until false;
end
parend
begin
parbegin
p2: begin
repeat
… …
wait(empty);
x:=处理结果;
signal(full);
… …
until false;
end
parend