进程P1、P2、P3、P4和P5的前趋图如图所示。
若用PV操作控制进程P1~P5并发执行的过程,则需要设置5个信号量S1、S2、S3、S4和S5,进程间同步所使用的信号量标注在图中的边上,且信号量S1~S5的初值都等于零,初始状态下进程P1开始执行。在如图所示的PV操作示意图中a、b和c处应分别填写(1);d和e处应分别填写(2),f和g处应分别填写(3)。
(3)处是()
A.P(S3)和V(S4)V(S5)
B.P(S3)和P(S4)P(S5)
C.V(S3)和V(S4)V(S5)
D.V(S3)和P(S4)P(S5)
参考答案:B
解析:
在多道程序系统中,由于资源共享与进程合作,使各进程之间可能产生两种形式的制约关系,一种是间接相互制约,例如,在仅有一台打印机的系统中,有两个进程A和B,如果进程A需要打印时,系统已将打印机分配给进程B,则进程A必须阻塞;一旦进程B将打印机释放,系统便将进程A唤醒,使之由阻塞状态变为就绪状态;另一种是直接相互制约,例如,输入进程A通过单缓冲区向进程B提供数据。当该缓冲区为空时,进程B不能获得所需的数据而阻塞,一旦进程A将数据送入缓冲区中,进程B就被唤醒。反之,当缓冲区满时,进程A就被阻塞,仅当进程B取走缓冲区中的数据时,才唤醒进程A。
进程同步主要源于进程合作,是进程之间共同完成一项任务时直接发生相互作用的关系,为进程之间的直接制约关系。在多道程序系统中,这种进程间在执行次序上的协调是必不可少的;进程互斥主要源于资源共享,是进程之间的间接制约关系。在多道程序系统中,每次只允许一个进程访问的资源称为临界资源,进程互斥要求保证每次只有一个进程使用临界资源。在每个进程中访问临界资源的程序段称为临界区,进程进入临界区要满足一定的条件,以保证临界资源的安全使用和系统的正常运行。
信号量
信号量是一个二元组(S,Q),其中S是一个整形变量,初值为非负数,Q为一个初始状态为空的等待队列。在多道程序系统中,信号量机制是一种有效的实现进程同步与互斥的工具。信号量的值通常表示系统中某类资源的数目,若它大于0,则表示系统中当前可用资源的数量;若它小于0,则表示系统中等待使用该资源的进程数目,即在该信号量队列上排队的PCB的个数。信号量的值是可变的,由PV操作来改变。
PV操作是对信号量进行处理的操作过程,而且信号量只能由PV操作来改变。P操作是对信号量减1,意味着请求系统分配一个单位资源,若系统无可用资源,则进程变为阻塞状态;V操作是对信号量加1,意味着释放一个单位资源,加1后若信号量小于等于0,则从就绪队列中唤醒一个进程,执行V操作的进程继续执行。
对信号量S进行P操作,记为P(S);对信号量S进行V操作,记为V(S)。P(S)和V(S)的处理过程如表所示。
P(S)和V(S)的处理过程 | |
P(S) | V(S) |
S=S-1; if(S<0) { 当前进程进入等待队列Q; 阻塞当前进程; } else 当前进程继续; | S=S+1; if(S<=0) { 从等待队列Q中取出一个进程P; 进程P进入就绪队列; 当前进程继续; } else 当前进程继续; |
实现互斥模型 使用信号量机制实现进程互斥时,需要为临界资源设置一个互斥信号量S,其初值通常为1。在每个进程中将临界区代码置于P(S)和V(S)之间。必须成对使用PV原语,缺少P原语则不能保证互斥访问,缺少V原语则不能在使用临界资源之后将其释放。而且,PV原语不能次序颠倒、重复或遗漏。 实现同步模型 使用信号量机制实现进程同步时,需要为进程设置一个同步信号量S,其初值通常为0。在进程需要同步的地方分别插入P(S)和V(S)。一个进程使用P原语时,则另一个进程往往使用V原语与之对应。具体怎么使用要根据实际情况决定,下面举个简单例子来加以说明。 有两个进程P1和P2,P1的功能是计算x=a+b的值,a和b是常量,在P1的前面代码中能得到;P2的功能是计算y=x+1的值。若这两个进程在并发执行,则有同步关系:P2要执行y=x+1时必须等到P1已经执行完x=a+b语句。P2进程可能会因为要等待x的值而阻塞,如果是这样的话,P1进程就要在计算出x的值后唤醒P2进程。因此,为了使P1和P2正常运行,用信号量来实现其同步的过程如表所示。
P1和P2的同步过程 | |
P1 | P2 |
… x=a+b; V(S); … | … P(S); y=x+1; … |
再举一个较为复杂的例子,以加深对PV操作的理解。设有两个并发进程Read和Print,Read负责从输入设备读入信息到一个容量为N的缓冲区,Print负责从缓冲区中取出信息送打印机输出。设置信号量mutex的初值为1,empty的初值为N,full的初值为0,则程序如表所示。 在本题中,从题目的前趋图,可以得知以下约束关系: ①P1执行完毕,P2与P3才能开始; ②P2执行完毕,P4才能开始; ③P2与P3都执行完,P5才能开始。
实现Read和Print的程序 | |
Read | |
begin P(empty); P(mutex); 读入; V(mutex); V(full); end | begin P(full) P(mutex); 输出 V(mutex); V(empty) end |
分析清楚这种制约关系,解题也就容易了。
①从“P1执行完毕,P2与P3才能开始”可以得知:P2与P3中的b与d位置,分别应填P(S1)和P(S2),以确保在P1执行完毕以前,P2与P3不能执行。当然当P1执行完毕时,应该要对此解锁,所以P1中的a位置应填V(S1)与V(S2)。
②从“P2执行完毕,P4才能开始”可以得知:P4的f位置,应填P(S3),而P2的结束位置c应有V(S3)。
③从“P2与P3都执行完,P5才能开始”可以得知:P5的g位置,应填P(S4)与P(S5),而对应的P2的结束位置c应有V(S4),结合前面的结论可知,c应填V(S3)与V(S4)。而e应填V(S5)。