操作系统 进程死锁

操作系统中的进程死锁

当两个或更多个进程需要一些资源来完成它们的执行,而这些资源由另一个进程持有时,操作系统中会发生死锁。

操作系统中的进程死锁

在上图中,进程1拥有资源1并且需要获取资源2。同样,进程2拥有资源2并且需要获取资源1。进程1和进程2陷入了死锁状态,因为它们都需要对方的资源来完成执行,但它们都不愿意放弃自己的资源。

Coffman条件

如果满足以下四个Coffman条件,就会发生死锁。但这些条件并非互斥。

Coffman条件如下所示−

  • 互斥

应该有一个资源一次只能由一个进程持有。在下图中, Resource 1只有一个实例,并且只被进程1持有。

操作系统中的进程死锁

  • 持有和等待

一个进程可以持有多个资源,并且仍然可以从持有这些资源的其他进程请求更多资源。在下图中,进程2持有 Resource 2和 Resource 3,并且正在请求由进程1持有的 Resource 1。

操作系统中的进程死锁

  • 不可抢占

不能强制从一个进程中抢占资源。进程只能自愿释放资源。在下图中,进程2不能从进程1中抢占Resource 1。只有当进程1自愿放弃资源并且完成执行后,该资源才会被释放。

操作系统中的进程死锁

  • 循环等待

一个进程正在等待第二个进程持有的资源,第二个进程正在等待第三个进程持有的资源,依此类推,直到最后一个进程正在等待由第一个进程持有的资源。这形成了一个循环链。例如:进程1被分配了Resouce 2,并且正在请求Resource 1。同样,进程2被分配了Resouce 1,并且正在请求Resource 2。这形成了一个循环等待环。

操作系统中的进程死锁

死锁检测

资源调度程序可以检测到死锁,因为它会跟踪分配给不同进程的所有资源。在检测到死锁之后,可以使用以下方法解决死锁−

  • 终止所有参与死锁的进程。这不是一个好的方法,因为这些进程所做的所有进展将被销毁。
  • 资源可以从某些进程中抢占并分配给其他进程,直到死锁被解决。

死锁预防

在死锁发生之前预防死锁非常重要。因此,系统在执行每个事务之前都会检查它,以确保它不会导致死锁。如果有哪怕一点机会某个事务未来可能导致死锁,系统将不允许其执行。

死锁规避

最好是在发生死锁之前避免死锁而不是事后采取措施。等待图可以用于死锁规避。然而,这只对较小的数据库有用,因为在较大的数据库中可能变得非常复杂。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程