内容正文:
操作系统原理(第2版)
3.3.2 使用信号量实现进程互斥
方法:为要进入的临界区设置一个互斥信号量mutex,将mutex.value初值设置为1,然后将各进程的临界区(访问临界资源的那段代码)置于P(mutex) 和V(mutex) 之间。程序模型如下:
Semaphore mutex;
mutex.value=1;
cobegin
process Pi() // i=1, 2, 3, …, n
{
… //与临界资源无关的代码
P(mutex);
临界区;
V(mutex);
… //与临界资源无关的剩余代码
}
coend
3.3 信号量机制
互斥信号量
当两个或多个进程使用初值为1的信号量(称为互斥信号量)时,可以保证任何时刻只能有一个进程进入临界区。如果每个进程在进入临界区前都对信号量执行一个P操作,而在退出临界区时对该信号量执行一个V操作,就能实现多个进程互斥的进入各自的临界区(访问临界资源的那段程序代码)。
3.3 信号量机制
例如,有两个进程P1和P2要访问某一临界资源,它们各自的临界区为L1和L2。可设S为这两个进程的互斥信号量,其S.value的初值为1。这时,只需把临界区置于P(S) 和V(S) 之间即可实现两进程的互斥。
3.3 信号量机制
进程P1:
…
P(S);
L1;
V(S);
… 进程P2:
…
P(S);
L2;
V(S);
…
3.3.3 使用信号量实现进程同步
若干进程为完成一个共同的任务而相互合作,这就需要相互合作的进程在某些协调点处(即需要同步的地方)插入对信号量的P操作或V操作,以便协调它们的工作(实现进程间的同步)。
例:在公共汽车上,司机和售票员各司其职地工作(各自相当于一个独立运行的进程)。司机
只有等售票员关好车门后才能
启动汽车,售票员只有等司机
停好车后才能开车门,两者必
须密切配合、协调一致。
进程的同步是采用信号应
答方式来进行的。
3.3 信号量机制
使用信号量实现进程同步示例
程序模型如下:
Semaphore Start,Open;
Start.value=0,Open.value=0;
cobegin
process 司机()
{
while(1)
{ P(Start);
启动汽车;
正常行驶;
到站停车;
V(Open);
}
}
process 售票员()
{
while(1)
{
关车门;
V(Start);
售票;
P(Open);
开车门;
}
}
coend
使用信号量实现进程同步示例
例:进程P1~P4存在如右图所示的
运行次序:
并发执行的程序描述如下:
Semaphore a,b,c,d;
a.value=0,b.value=0,c.value=0,d.value=0;
cobegin
process P1()
{ P1;V(a);V(b); }
process P2()
{ P(a);P2;V(c); }
process P3()
{ P(b); P3;V(d); }
process P4()
{ P(c);P(d);P4; }
coend
有向边上的字母代表信号量,有向边的起始端进程在执行结束时,要对该信号量实施V操作,而有向边的结束端进程在执行之前则要对该信号量实施P操作,这样就确保了多个合作进程按事先约定的顺序执行。
例 包裹自动分拣系统中存在两个进程:一个是拣入进程,一个是拣出进程。拣入进程将包裹放入分拣筐,拣出进程则从分拣筐中取出包裹,分拣筐一次只能存放一个包裹(见下图)。试通过P、V操作写出这两个并发进程能够正确执行的程序。
拣入进程和拣出进程交替分拣包裹的P、V操作流程示意图
3.3 信号量机制