zoukankan      html  css  js  c++  java
  • 具体分析死锁产生的条件与原因

    一、定义

    死锁:集合中的每个进程都在等待仅仅能由本集合中的其它进程才干引发的事件。那么该组进程是死锁的。

    因为资源占用是相互排斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续执行。这就产生了死锁这一特殊现象。

    二、产生死锁的必要条件

    1)相互排斥条件:指进程对所分配到的资源进行排它性使用。即在一段时间内某资源仅仅由一个进程占用。假设此时还有其他进程请求资源,则请求者仅仅能等待,直至占有资源的进程

    用毕释放。

    2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程堵塞,但又对自己已获得的其他资源保持不放。

    3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺。仅仅能在使用完时由自己释放。

    4)环路等待条件:指在发生死锁时。必定存在一个进程——资源的环形链,即进程集合{P0,P1,P2,...。Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源。……,Pn正在等待已被P0占用的资源。

    三、死锁产生的原因

    1.竞争资源引起进程死锁
    当系统中供多个进程共享的资源如打印机、公用队列的等,其数目不足以满足诸进程的须要时,会引起诸进程对资源的竞争而产生死锁。

    1)可剥夺资源和不可剥夺资源

    系统中的资源能够分为两类,一类是可剥夺资源,是指某进程在获得这类资源后,该资源能够再被其它进程或系统剥夺。比如。优先权高的进程能够剥夺优先权低的进程的处理机。又如,内存区可由存储器管理程序,把一个进程从一个存储区移到还有一个存储区,此即剥夺了该进程原来占有的存储区,甚至可将一进程从内存调到外存上,可见,CPU和主存均属于可剥夺性资源。

    PU还有一类资源是不可剥夺资源,当系统把这类资源分配给某进程后。再不能强行收回,仅仅能在进程用完后自行释放,如磁带机、打印机等。

    2)竞争不可剥夺资源
    在系统中所配置的不可剥夺资源。因为它们的数量不能满足诸进程执行的须要。会使进程在执行过程中,因争夺这些资源而陷于僵局。比如。系统中仅仅有一台打印机R1和一台磁带机R2,可供进程P1和P2共享。假定PI已占用了打印机R1,P2已占用了磁带机R2。若P2继续要求打印机R1,P2将堵塞;P1若又要求磁带机,P1也将堵塞。于是,在P1和P2之间就形成了僵局。两个进程都在等待对方释放自己所须要的资源,可是它们又都因不能继续获得自己所须要的资源而不能继续推进。从而也不能释放自己所占有的资源。以致进入死锁状态。

    3)竞争暂时资源
    上面所说的打印机资源属于可顺序反复使用型资源。称为永久资源。另一种所谓的暂时资源,这是指由一个进程产生,被另一个进程使用,短时间后便没用的资源,故也称为消耗性资源。如硬件中断、信号、消息、缓冲区内的消息等。它也可能引起死锁。比如,S1,S2,S3是暂时性资源。进程P1产生消息S1,又要求从P3接收消息S3。进程P3产生消息S3,又要求从进程P2处接收消息S2。进程P2产生消息S2,又要求从P1处接收产生的消息S1。假设消息通信按例如以下顺序进行:
    P1: ...Relese(S1);Request(S3); ...
    P2: ...Relese(S2)。Request(S1)。 ...
    P3: ...Relese(S3);Request(S2)。 ...
    并不可能发生死锁。

    但若改成下述的执行顺序:

    P1: ...Request(S3)。Relese(S1);...
    P2: ...Request(S1)。Relese(S2); ...
    P3: ...Request(S2);Relese(S3)。 ...
    则可能发生死锁。

    2.进程推进顺序不当引起死锁
    因为进程在执行中具有异步性特征,这可能使P1和P2两个进程按下述两种顺序向前推进。
    1)进程推进顺序合法
    当进程P1和P2并发运行时。假设依照下述顺序推进:P1:Request(R1); P1:Request(R2); P1: Relese(R1);P1: Relese(R2)。 P2:Request(R2); P2:Request(R1)。 P2: Relese(R2);P2: Relese(R1);这两个进程便可顺利完毕,这样的不会引起进程死锁的推进顺序是合法的。

    2)进程推进顺序非法
    若P1保持了资源R1,P2保持了资源R2,系统处于不安全状态,由于这两个进程再向前推进,便可能发生死锁。

    比如。当P1执行到P1:Request(R2)时,将因R2已被P2占用而堵塞;当P2执行到P2:Request(R1)时,也将因R1已被P1占用而堵塞,于是发生进程死锁。

    四、处理方法

    在系统中已经出现死锁后,应该及时检測到死锁的发生。并採取适当的措施来解除死锁。
    1) 预防死锁。
    这是一种较简单和直观的事先预防的方法。方法是通过设置某些限制条件。去破坏产生死锁的四个必要条件中的一个或者几个。来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。

    可是因为所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量减少。预防死锁的方法有:

    ①摒弃“请求和保持”条件
    ②摒弃“不剥夺”条件
    ③摒弃“环路等待”条件
    2) 避免死锁。
    该方法相同是属于事先预防的策略,但它并不须事先採取各种限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。
    避免死锁算法有银行家算法。

    3)检測和解除死锁。
    先检測:这样的方法并不须事先採取不论什么限制性措施,也不必检查系统是否已经进入不安全区,此方法同意系统在执行过程中发生死锁。

    但可通过系统所设置的检測机构,及时地检測出死锁的发生。并精确地确定与死锁有关的进程和资源。检測方法包含定时检測、效率低时检測、进程等待时检測等。

    然后解除死锁:採取适当措施,从系统中将已发生的死锁清除掉。
    这是与检測死锁相配套的一种措施。当检測到系统中已发生死锁时。须将进程从死锁状态中解脱出来。经常使用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于堵塞状态的进程,使之转为就绪状态,以继续执行。死锁的检測和解除措施。有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。

    共享锁和排他锁的差别
    共享锁:假设事务T对数据A加上共享锁后,则其它事务仅仅能对A再加共享锁,不能加排他锁。获准共享锁的事务仅仅能读数据,不能改动数据。
    排他锁:假设事务T对数据A加上排他锁后。则其它事务不能再对A加任不论什么类型的封锁。获准排他锁的事务既能读数据,又能改动数据。
    共享锁下其他用户能够并发读取,查询数据。但不能改动。添加,删除数据。

    

    

    
  • 相关阅读:
    leetcode 48. Rotate Image
    leetcode 203. Remove Linked List Elements 、83. Remove Duplicates from Sorted List 、82. Remove Duplicates from Sorted List II(剑指offer57 删除链表中重复的结点) 、26/80. Remove Duplicates from Sorted ArrayI、II
    leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes
    leetcode 58. Length of Last Word
    安卓操作的一些问题解决
    leetcode 378. Kth Smallest Element in a Sorted Matrix
    android studio Gradle Build速度加快方法
    禁用gridview,listview回弹或下拉悬停
    Android Studio找不到FragmentActivity类
    安卓获取ListView、GridView等滚动的距离(高度)
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6846186.html
Copyright © 2011-2022 走看看