1、实现进程互斥2、实现进程同步3、实现进程的前驱关系
信号量机制实现进程互斥
1、/*信号量机制实现进程互斥*/semaphore mutex = 1; //初始化信号量P1 {} { ... P(mutex); //使用临界资翮堠江辰源前需要加锁 临界区代码段... V(mutex); //使用临界资源后需要解锁 ...}P2 {} { ... P(mutex); //使用临界资源前需要加锁 临界区代码段... V(mutex); //使用临界资源后需要解锁 ...}
2、分析并发进程的关键活动,划定临界区(如对临界资源打印机的访问就应该放在临界区)。2、设置互斥信号量mutex,初值为1。3、在临界区之前执行P(mutex)。4、在临界区之后执行V(mutex)。
3、对不同的临界资源需要设置不同的互斥信号量。P、V操作必须成对出现。缺少P(mutex)就不能保证临界资源的互斥访问。缺少V(mutex)就会导致资源永不被释放,等待进程永不被唤醒。
信号量机制实现进程同步
1、用信号量实现进程同步:1、分析什么地方需要实现“同步关系”,即必须保证“一前一后”执行的两个操作。2、设置同步信号量s,初始为0。3、在“前操作”之后执行V(s)。4、在“后操作”之前执行P(s)。
2、/*信号量机制实现同步*/semaphore s = 0;P1 {} { 代码1; 代码2; V(s); 代码3;}P2 {} { P(s); 代码4; 代码5; 代码6;}
3、若先执行到V猾诮沓靥(s)操作,则 s++ 后 s = 1。之后当执行到P(s)操作时,由于 s = 1,表示有可用资源,会执行s--,s的值变回0,P2进程不会执行block原语,而胡啥高友岛思继续往下执行代码4。若先执行到P(s)操作,由于 s = 0, s--后 s = -1,表示此时没有可用资源,因此P操作中会执行block原语,主动请求阻塞。之后当执行完代码2,继而执行V(s)操作,s++,是s变回0,由于此时有进程在该信号量对应的阻塞队列中,因此会在V操作中执行wakeup原语,唤醒P2进程。这样P2就可以继续执行代码4了。
信号量机制实现前驱关系
1、进程P1中有句代码s1,P2中有句代码s2...P3...P6中有句代码s6.这些代码要求按如下前驱图所示的顺序来执行:s1--->s2,s1--->s3,s2--->s4,s2--->s5,s3--->s6,s4--->s6,s5--->s6。
2、其实每一对前驱关系都是一个进程同步问题(需要保证一前一后的操作),因此:1、要为每一对前驱关系各设置一个同步变量2、在“前操作”之后对相应的同步变量执行V操作3、在“后操作”之前对相应的同步变量执行P操作
3、P1() { ... S1; V(A); V(B) ...}P2() { ... P(A); S2; V(C); V(D);}P3() { ... P(B); S3; V(G); ...}...