实现进程互斥
1.分析并发进程的关键活动,划定临界区(如:对临界资源打印机的访问)
2.设置互斥信号量mutex,初始值为1 (mutex n.互斥)
3.进入区P(mutex)--申请资源
4.退出区V(mutex)--释放资源
注意:
对于不同的临界资源需要设置不同的互斥信号量mutex
P/V操作必须成对出现,缺少P就不难保证临界资源的互斥访问,缺少V就会导致资源永不被释放
实现进程同步
让各并发进程按照要求有序进行推进。
P1,P2并发执行,由于存在异步性,二者交替推进的次序是不确定的。
若P2的代码4要基于p1的代码1和代码2的运行结果才能执行,就必须保证代码4一定要在代码2之后执行
P1(){代码1;代码2;代码3;
}
P2(){代码4;代码5;代码6;
}
我们分析在什么地方需要实现同步关系,必须保证以前以后之心两个操作,会哦这两句代码,设置同步信号量S,初始值为0
semaphore S=0;//初始化信号量,初始值为0P1(){代码1;代码2;V(S);代码3;
}
P2(){P(S);代码4;代码5;代码6;
}
当先执行p1再执行p2的时候
执行完代码1和2,S++变为了1
然后执行到P(S)时,表示有可用资源,执行S(--)S的值会变回0
P2进程不会执行block原语,而是继续往下执行代码4
如果先执行p2再执行p1
由于S=0,S--后变为了-1,表示这个时候没有可用的资源,因此会执行block原语,主动请求阻塞
等执行完代码1和代码2后,执行V(S)让S++,S变回0
此时S的值依然<=0因此执行wakeup指令,唤醒P2进程,此时p2可继续执行代码4
实现前驱关系
进程P1中有一句代码S1,P2中又一句代码S2,P3中...这些代码要求按照一定的顺序来执行
此时每一对前去关系都是一个进程同步的问题(需要保证一前一后操作)
1.要为每一对前去关系各设置一个信号同步量
2.在前操作之后对响应的同步信号量执行V操作
3.在后操作之前对响应的同步信号量执行P操作
前V后P