• 死锁


      谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。

      资源分为可抢占资源和不可抢占资源。可抢占资源可以从拥有它的进程中抢占而不发生任何副作用。不可抢占资源是指在不引起相关的计算失败的情况下,无法把它从占有它的进程中抢占过来。

      虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件

    1. 互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
    2. 请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
    3. 不可抢占条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
    4. 环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0P1P2···Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……Pn正在等待已被P0占用的资源。

      发生死锁是上述四个条件一定是同时满足的,如果其中任何一个条件不成立,死锁就不会发生。 

    鸵鸟算法

     传说中鸵鸟看到危险就把头埋在地底下。当你对某一件事情没有一个很好的解决方法时,那就忽略它,就像鸵鸟面对危险时会把它深埋在沙砾中,装作看不到。这样的算法称为“鸵鸟算法“。这实在不算是一个算法,但却是目前实际系统采用最多的一种策略。例如在计算机操作系统中,当死锁真正发生且影响系统正常运行时,手动干预—重新启动。

    检测死锁与恢复死锁

      在使用这种技术时,系统并不试图阻止死锁的发生,而是允许死锁发生,当检测到死锁发生后,采取措施进行恢复。

      在系统中已经出现死锁后,应该及时检测到死锁的发生,并采取适当的措施来解除死锁。目前处理死锁的方法可归结为以下四种:

    1.  预防死锁。这是一种较简单和直观的事先预防的方法。方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。但是由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低。
    2. 避免死锁。该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。安全状态和不安全状态的区别是:从安全状态出发,系统能够保证所有进程都能够完成;而从不安全状态出发,就没有这样的保证。经典的死锁避免算法例如银行家算法。
    3. 检测死锁。这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。
    4. 解除死锁。这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资 源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施,有可能使系统获得较好的资源利用率和吞吐量,但在实 现上难度也最大。

    其他问题

      两阶段加锁(two-phase locking):在第一阶段,进程试图对所有资源进行加锁,一次加锁一个资源;如果第一个阶段加锁成功,就开始第二个阶段,完成任务后释放资源。如果在第一阶段每个进程需要的资源已经被抢占,那么释放所有加锁的资源,然后重新开始第一阶段。

      活锁:指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。 活锁和活锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。

    饥饿:一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行的状态。

  • 相关阅读:
    加快网站访问速度——Yslow极限优化
    Jquery应用实例
    js获取文本框(或文本域)光标位置以及设置光标位置
    编程挑战
    图片view设置gif动图
    判断手机中是否安装了某个App
    session发送的get请求、post请求、上传、下载
    图片的拉伸stretchableImageWithLeftCapWidth
    IOS数据懒加载
    IOS页面(控制器之间)传值之Block
  • 原文地址:https://www.cnblogs.com/wxgblogs/p/5719508.html
Copyright © 2020-2023  润新知