本文共 1105 字,大约阅读时间需要 3 分钟。
操作系统之PV操作
今天在做操作系统老师布置的操作系统作业,但是碰到了一个有关pv操作的问题,由于对pv操作的理解不是很透彻,所以我查阅了很多资料,下面来简单的通俗的介绍一下pv操作 公用信号量:实现进程间的互斥,初值=1或资源的数目 私用信号量:实现进程间的同步,初值=0或某个整数 2、信号量S的物理意义:S>=0时表示某资源的可用数,s<0时其绝对值表示阻塞队列中等待该资源的进程数。P、V操作是实现进程同步与互斥的常用方法。 3、P操作表示申请一个资源,V操作表示释放一个资源。 P操作的定义:S=S-1,若S>=0,则执行P操作的进程继续执行;若S<0,则置该进程为阻塞状态,并将其插入阻塞队列。 Procedure P(Var S:Semaphore); Begin S:=S-1; If S<0 then w(S) {执行P操作的进程插入等待队列} End; V操作定义:S=S+1,若S>0则执行V操作的进程继续执行;若S<0,则从阻塞状态唤醒一个进程,并将其插入就绪队列,执行V操作的进程继续执行。 Procedure V(Var S:Semaphore); Begin S:=S+1 If S<=0 then R(s) {从阻塞队列中唤醒一个进程} End; 利用PV操作实现进程的互斥 令信号量mutex的初值为1,当进入临界区时执行P操作,退出临界区时执行V操作。这样利用PV操作实现进程互斥的代码段如下: P(mutex) 临界区 V(mutex) 所以,下面我们来看看这道题,如下图,请用并行语句和P、V操作描述图中任务执行过程。 int f1=0; //表示进程P1是否执行完毕int f2=0; //表示进程P2是否执行完毕int f3=0; //表示进程P3是否执行完毕int f4=0; //表示进程P4是否执行完毕int f5=0; //表示进程P5是否执行完毕int f6=0; //表示进程P6是否执行完毕main(){ cobegin p1(); p2(); p3(); p4(); p5(); p6(); coend}p1(){ ... v(f1); v(f1);}p2(){ p(f1); ... v(f2);}p3(){ p(f1); ... v(f3);}p4(){ p(f2); ... v(f4); v(f4);}p5(){ p(f4); ... v(f5);}p6(){ p(f3); p(f4); ... v(f6);}p7(){ p(f5); p(f6); ...}