pv信号量与死锁

 

 

信号量S的物理含义

S>0:表示有S个资源可用;S=0表示无资源可用;S<0绝对值表示等待队列或链表中的进程个数。信号量的初值应大于等于0。

PV原语小结

通过操作信号量来处理进程间的同步与互斥的问题。其核心就是一段不可分割不可中断的程序。

信号量是由操作系统来维护的,用户进程只能通过初始化和两个标准原语(P、V原语)来访问,它们在执行时是不可中断的。初始化可指定一个非负整数,即空闲资源总数。

P原语:P是荷兰语Proberen(测试)的首字母。为阻塞原语,负责把当前进程由运行状态转换为阻塞状态,直到另外一个进程唤醒它。操作为:申请一个空闲资源(把信号量减1),则若成功,则退出;若失败,则该进程被阻塞;

V原语:V是荷兰语Verhogen(增加)的首字母。为唤醒原语,负责把一个被阻塞的进程唤醒,它有一个参数表,存放着等待被唤醒的进程信息。操作为:释放一个被占用的资源(把信号量加1),如果发现有被阻塞的进程,则选择一个唤醒之。

P(S):表示申请一个资源,S减 1;若 减1 后仍S>=0,则该进程继续执行;若 减1 后 S<0,表示已无资源可用,需要将自己阻塞起来。

V(S):表示释放一个资源,S加 1;若 加1 后S>0,则该进程继续执行;若 加1 后 S<=0,表示等待队列上有等待进程,需要将第一个等待的进程唤醒。

PV原语对信号量的操作可以分为三种情况:


1. 把信号量视为一个加锁标志位,实现对一个共享变量的互斥访问。

实现过程:
P(mutex); // mutex的初始值为1
访问该共享数据
V(mutex);
非临界区
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

互斥信号量是根据临界资源的类型设置的。有几种类型的临界资源就设置几个互斥信号量。它代表该类临界资源的数量,或表示是否可用,其初值一般为“1”。


2. 把信号量视为是某种类型的共享资源的剩余个数,实现对一类共享资源的访问。

实现过程:
P(resource); // resource的初始值为该资源的个数N
使用该资源;
V(resource);
非临界区
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5


3. 把信号量作为进程间的同步工具

实现过程:
临界区C1; P(S);
V(S);     临界区C2;
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

同步信号量是根据进程的数量设置的。一般情况下,有几个进程就设置几个同步信号量,表示该进程是否可以执行,或表示该进程是否执行结束,其初值一般为“0”。

同步与互斥的解题思路

  1. 分清哪些是互斥问题(互斥访问临界资源的),哪些是同步问题(具有前后执行顺序要求的)。

  2. 对互斥问题要设置互斥信号量,不管有互斥关系的进程有几个或几类,通常只设置一个互斥信号量,且初值为1,代表一次只允许一个进程对临界资源访问。

  3. 对同步问题要设置同步信号量,通常同步信号量的个数与参与同步的进程种类有关,即同步关系涉及几类进程,就有几个同步信号量。同步信号量表示该进程是否可以开始或该进程是否已经结束。

  4. 在每个进程中用于实现互斥的PV操作必须成对出现;用于实现同步的PV操作也必须成对出现,但可以分别出现在不同的进程中;在某个进程中如果同时存在互斥与同步的P操作,则其顺序不能颠倒,必须先执行对同步信号量的P操作,再执行对互斥信号量的P操作,但V操作的顺序没有严格要求。

为什么P操作不能颠倒?

解进程同步和互斥问题的方法步骤

1) 关系分析。找出问题中的进程数,并且分析它们之间的同步和互斥关系。同步、互斥关系直接按照上面的经典范式改写。

2) 整理思路。找出解决问题的关键点,并且根据做过的题目找出解决的思路。根据进程的操作流程确定P操作、V操作的大致顺序。

3) 设置信号量。根据上面两步,设置需要的信号量,确定初值,完善整理。

死锁:如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么该进程集合就是死锁的。

死锁的条件(四个同时满足):

(1)互斥:每个资源要么已经分配给一个进程,要么就是可用的;

(2)占有和等待:已经得到的某个资源的进程请求新的资源;

(3)不可抢占:已经分配的资源不能强制被抢占,只能进程自己显示的释放;

(4)环路等待:存在一种进程资源的循环等待链。

死锁的处理策略:

(1)死锁预防:破坏死锁的四个条件之一

  破环互斥条件:允许资源共享

  破环占有和等待条件:采用预先静态分配

  不可抢占:请求新资源得不到时,释放已经保持占有的资源,待以后重新申请

  环路等待:采用顺序资源分配法

(2)死锁避免:死锁避免事先预防策略,但是是采用资源动态分配的过程中,防止系统进入不安全状态,以避免死锁。

  银行家算法:可利用资源矢量Available,请求矢量Request

        最大需求矩阵Max,分配矩阵Allocation,需求矩阵Need

        通过Need=Max-Allocation获得每个进程需要的各类资源数Need矩阵

        一般每个进程请求矢量应该小于等于Need的值

        试探分配:Available=Avaliable-Request

             Allocate相对应的项=Allocate相对应的项+Request

             Need相对应的项=Need相对应的项-Request

        安全性算法:检查资源分配后,系统是否属于安全状态,如果安全才正式分配资源,否则作废。一般通过安全性算法推算一个安全序列(核心)。  

(3)死锁检测与解除:

  检测死锁:利用死锁原理化简资源分配图检测死锁的存在

  死锁解除:资源剥夺、撤销进程、进程回退

猜你喜欢

转载自blog.csdn.net/learner811/article/details/71248513