一.实现进程互斥
1.分析并发进程的活动,划分临界区(如:要访问临界资源打印机,那就要将访问打印机的代码放在临界区)
2.设置互斥信号量mutex,初值为1
3.在临界区之前执行P(mutex)
4.在临界区之后执行V(mutex)
- 在这个过程中其实可以理解为把临界区也当成了一个特殊的资源,并且它的数量为1
- 对不同的临界资源需要设置不同的互斥信号量
- P、V操作必须成对出现
二.实现进程同步
进程同步:在进程并发执行的过程中,有些操作必须有特定的“一前一后”执行顺序,但异步并发的过程中是很难做到控制进程1的某一行代码在进程0某一行代码之后执行。此时就需要进程同步,让本来异步并发的进程互相配合,有序推进。
1.确定什么地方需要实现同步,也就是要实现“一前一后”执行的两个操作
2.设置同步信号量S,初值为0
3.在前操作之后执行V(S)
4.在后操作之前执行P(S)
- 举例:在这里要求代码4必须在代码2之后执行
- 在这个过程中,信号量S其实就是一个标志,标志着代码2是否已经执行
- 首先P1进行执行完代码2,然后执行V操作使得S的值从0变成1
- 然后P2进程在代码2之前执行P操作使得S值变为0,S值>=0,这就代表着此时有剩余资源(也就代表着代码2已经被执行),P2进程就不会执行block原语,就会继续执行代码4
- 如果此时没有执行代码2和V操作,直接执行P操作,那么执行完P操作之后,S的值会从0变为-1,S值<0,这就说明没有剩余资源了(也就是代表代码2还没有被执行),那么P2进程会执行block原语,主动请求阻塞,不会执行代码4。之后当执行完代码2,并且执行了V操作,使得S从-1变到0,并且此时有进程在该信号量的阻塞队列里,那么在V操作中会执行wakeup原语,唤醒P2进程,P2就会继续执行代码4
- 这样就保证了代码4必须在代码2之后执行
三.实现进程前驱
进程P1中有一个语句S1,P2中有一个语句S2,P3中有一个语句S3…P6进程中有一个语句S6。这6个语句的执行顺序要求如下:
- 也就是说S1执行之后才能执行S2和S3,S2执行之后才能执行S4和S5等等
- 可以看到其实就是更复杂的多层进程同步问题,那么实现方法基本是和进程同步一样的
1.为每一对前驱关系设置一个同步信号量
2.在前操作之后为相应的同步信号量执行V操作
3.在后操作之前为相应的同步信号量执行P操作 - 也就是如下的操作: