【操作系统】信号量实现互斥同步以及前驱图问题

一、信号量实现互斥问题

进程互斥:当一个进程访问临界资源时,另一个想要访问该临界资源的进程需要先等待,直到当前临界资源访问完成为止。

参照如下措施:

注意:对不同的临界资源需要设罝不同的互斥信号量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版权协议,转载请附上原文出处链接和本声明。