一、信号量实现互斥问题
进程互斥:当一个进程访问临界资源时,另一个想要访问该临界资源的进程需要先等待,直到当前临界资源访问完成为止。
参照如下措施:
注意:对不同的临界资源需要设罝不同的互斥信号量,P、v操作必须成对出现。缺少P(mutex)就不能保证临界资源的互斥访问。缺少V(mutex) 会导致资源永不被释放,等待进程永不被唤醒。
如摄像头和打印机就是不同的临界资源,设置的信号量需要不同(如m1,m2);
semapore mutex=1;//初始化信号量
p1(){
..
p(mutex);//申请资源
..
//进入临界区
v(mutex);//释放资源
..
}
p2(){
..
p(mutex);//申请资源
..
//进入临界区
v(mutex);//释放资源
..
}
根据如上的信号量机制,当mutex=1时,第一个进程p1申请资源后,mutex=0,我们无法进行访问第二个进程p2,但是当第一个进程访问完成后mutex=1,才可以进行第二个资源的访问,这实现了一个互斥的原理。
二、信号量实现同步问题
同步:让并发执行的进程按要求有序的执行。(进程存在异步性)
实现前分析:
1.分析什么地方需要“同步关系”,必须保证“一前一后”的两个操作。
2.设置同步信号量为0
3.前v后p(先执行的进程之后加v,后执行的进程之前加p);
如:
semaphore s=0;
//代码段1要先执行,在执行代码段2
p1(){
..
//代码段1
v(s);
..
}
p2(){
p(s);
//代码段2
}
则实现了代码段1未执行的情况下代码四无法执行,因为开始前s=0;则p2无法执行;
分析过程:
在p1\p2异步执行的情况下,因为s=0;进程2在执行时s--;则s=-1;因为s<0,则会被插入阻塞队列中,当p1进程在执行时,代码段1执行完成后v操作 s=0;则wakeup唤醒了p2进程.p2开始执行
三、前驱图关系问题
利用进程的同步原理:前v后p(先执行的进程之后加v,后执行的进程之前加p);
wait():p操作
signal():v操作
例:
版权声明:本文为hacv131原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。