多线程中死锁的产生和避免

(一)死锁的概念

  死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力作用,他们将无法推进下去。此时系统处于死锁状态或系统产生了死锁,这些互相等待的进程称为死锁进程。
  假如在你的电脑上只有一台打印机和一台输入设备,进程A正在使用输入设备,并且上了锁,同时又提出想要使用打印机的请求,此时打印机正在被进程B所占用,也上了锁,巧了进程B现在在没有释放打印机前也想使用输入设备,因此这两个进程就在不断地等待、申请、被拒绝,均无法继续进行陷入了死锁状态。
     在这里插入图片描述

(二)产生死锁的条件

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

  • 互斥条件:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。
  • 请求和保持条件(占有且等待):一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。
  • 不剥夺条件(不可抢占):别人已经占有了某项资源不能因为自己也需要该资源,就去把别人的资源抢过来。
  • 环路等待条件(循环等待):存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。
                           在这里插入图片描述

(三)如何避免死锁

  因为产生死锁需要四个条件,那么只需这四个条件中至少有一个条件得不到满足则就不可发生死锁了,由于互斥条件是非共享资源必须的,不仅不可改变还要遵守,所以主要破坏其他三个产生死锁的条件:

  • 破坏请求和保持条件
      (1) 一次性的申请所有资源,之后不在申请资源,如果不满足资源条件则得不到资源分配,简单安全易实施,但降低资源利用率
      (2) 只获得初期资源运行,之后将运行完的资源释放,请求新的资源。资源利用率提高减少进程饥饿

  • 破坏不可抢占条件
      当一个进程获得某种不可抢占资源,提出新的资源申请,若不能满足,则释放所有资源,以后需要再次重新申请。实现复杂,会延长进程的周转周期还会影响系统吞吐量

  • 破坏循环等待条件:对资源进行排号,按照序号递增的顺序请求资源,若进程获得序号高的资源想要获得序号低的资源,则需要先释放序号高的资源。虽避免了循环等待,可是方法低效。

巨人的肩膀:https://blog.csdn.net/guaiguaihenguai/article/details/80303835

猜你喜欢

转载自blog.csdn.net/weixin_42647166/article/details/104720373