Linux线程死锁

死锁

死锁是操作系统或软件运行的一种状态:在多任务系统下,当一个或多个进程等待系统资源,而资源又被进程本身或其它进程占用时,就形成了死锁。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象。

死锁产生的四个必要条件

  • 互斥条件:资源是独占且排他使用的,进程对于资源的使用是互斥的,同一时间,只允许一个进程获取资源。
  • 不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行剥夺,只能由获得该资源的进程进行释放。
  • 请求和保持条件:进程每次重新申请资源时,仍然占用已分配到的资源。
  • 循环等待条件:在发生死锁时一定存在一个进程等待队列,前一个进程占用后一个进程所需要的资源,最后一个又占用第一个进程所需要的资源,形成一个进程等待环路。

若要发生死锁,则必定满足以上所有条件。

死锁预防

既然我们知道了死锁产生的四个必要条件,那么我们要预防死锁的话,使它不能满足这几个条件就可以了。

资源互斥是资源使用的固有特性,我们无法改变,所以我们只能针对剩下三个条件。

  • 破坏不可剥夺条件:一个进程在获得申请资源之前就处于等待状态,等待期间,它占有的资源将被隐式的释放重新加入到系统的资源列表中,可以被其它进程使用,而这个进程只有重新获得自己原有的资源和申请的资源才能重新启动。
  • 破坏请求和保持条件:
  1. 静态分配:每个进程在最开始时就分配好所需要的空间。
  2. 动态分配:每个进程在申请所需要的资源时不占用系统资源。
  • 破坏循环等待条件:将资源进程编号,将稀缺资源给与较大的编号,在申请资源时按顺序进行。

死锁避免

系统对进程发出的每一个系统可以满足的资源申请进行检查,并根据检查结果决定是否分配资源,若分配后可能发生死锁,则不分配。如果系统能保证所有进程在有限时间内得到所需要的全部资源,则处于安全状态,否则不安全。

猜你喜欢

转载自blog.csdn.net/fapengcheng1996/article/details/80172078