什么是操作系统死锁:条件与检测算法

操作系统的主要目标是提供硬件和软件资源之间的适当通信,并为程序提供公共服务。当一个操作系统进程想要访问任何资源时,它首先向它想要访问的特定资源发送请求,然后利用该资源,最后在使用后释放该资源。假设许多进程试图同时访问一种资源,在这种情况下,很难一次向所有进程提供一种资源,因此出现了死锁的概念。因此,本文将描述死锁是如何发生的,以及如何克服这种死锁情况。

什么是操作系统死锁?

定义:Dead-Lock是一种情况,即两个或多个处理器正在等待某个事件发生,但这种没有发生的事件是死锁条件,处理器被称为处于死锁状态。例如,让我们假设一个实时场景,其中有两辆车a和B,由两名单独的司机在一条单行道上驾驶。现在的情况是,A车的司机说他往北走是正确的方向,而B车的司机说他往南走是正确的方向。但是两辆车都不后退让另一辆车前进,这种情况被称为死锁条件。


汽车示例
汽车示例

为了更好地理解,让我们考虑另一个例子,其中有两个资源R1、R2和两个进程P1和P2,其中R1被分配给P1, R2被分配给P2。如果P1想要访问R2,我们知道R2是P2持有的,现在P2想要访问R1, P1只在访问R2时执行,P2也只在访问R1时执行这种情况就是死锁状态。

Processor-Example
processor-example

死锁条件

以下是发生死锁的四个重要条件,如果所有条件同时发生,就有一定的机会发生死锁。

互斥

这意味着无论我们使用什么资源都必须以一种相互排斥的方式使用。一次只有一个进程使用一种资源。例如,打印进程正在进行,突然另一个进程试图中断打印进程。所以这里在互斥情况下,只有打印任务完成后才会处理下一个任务。同时共享资源可以消除互斥现象,这在实际中是不可能的。

互斥
互斥

没有优先购买权

根据先发制人的基于算法,如果有优先级任务试图中断当前任务。抢占算法占有当前任务,首先执行优先级任务,然后返回到第一个任务。上面的例子解释了一种情况,一个进程在执行时就持有资源,即P1只有在执行后才能释放R1,类似的P2只有在执行后才能释放R2。如果没有抢占,可能会发生死锁。


No-Preemption-Example
no-preemption-example

持有和等待

一个过程持有一些资源,正在等待额外的资源,但这些资源是由其他一些进程获得的。从上述示例中,P1是保持R1并等待R2,其中通过P2获取R2,并且P2保持R2并等待R1,其中通过P1获取R1是保持和等待情况死锁可能发生在系统中。

Hold-and-Wait-Example
hold-and-wait-example

循环等待

如果一个进程正在等待分配给另一个进程的资源,而该进程正在等待资源,那么就称一组进程处于死锁状态,这与上面解释的示例类似,其中进程处于循环形式。P1等待R2, R2被分配给P2, P2等待R1, R1被分配给P1,这是一个循环等待形式,如果这个条件满足死锁发生。

Circular-Wait-Example
circular-wait-example

死锁检测算法

当我们将资源分配给进程时,操作系统会重新检查系统中是否发生了死锁,或者没有使用两种主要的死锁检测算法时,它们是

  • 单一实例
  • 资源类型的多个实例

单一实例

单一实例是指系统拥有所有资源的单一实例的情况。它又称为等待图算法或资源分配图。资源分配图由一组进程和一组资源组成,它们被表示为两个不同的顶点。对资源分配图中的资源进行修改,并表示为等待图形式。其中,等待图形式只有以顶点表示的过程,如下图所示:

  • 资源分配图:进程P1、P2、P3和资源R1、R2、R3表示在资源分配图中。
  • 等待图表:只有P1、P2、P3进程在等待图表中被提及。
  • 如果存在一个循环条件,如果一个进程在一个方向上有一个连续的流,这意味着循环条件退出,等待图处于死锁条件。

示例1:下面的示例显示没有死锁状态,因为在等待图表中没有观察到的连续流动。

单例 -  instance-example1
single-instance-example1

示例2:发生了死锁状态,因为从P1到P4存在连续的循环流。

单实例——Example2
single-instance-example2

如果死锁在系统中发生得非常频繁,那么检测算法就会被频繁使用。如果检测算法的使用更多,那么就会有更多的开销和更多的计算时间。因此,为了克服这个问题,我们在之后调用算法,给出相同的时间,这就是如何使用图的权重来检测死锁。

资源类型的多个实例

资源类型的多个实例是指系统拥有所有资源的多个实例,这也称为Bankers算法。根据Bankers的算法,一旦流程获得了所有所需的资源,它就会释放资源。

让我们考虑以下示例,假设有3个进程p0,p1,p2和资源类型a,b,c其中aCPU, B可以是打印机,C可以是键盘。“0”表示资源的可用性。

案例(i):假设我们取P0和P2中存在的条件请求为“000”条件,我们应该检查哪个请求被满足,P0进程在分配进程后释放进程,然后下一个P2进程在分配进程后释放进程。就像这样,一个接一个的进程依次释放P0, P2, P3, P1, P4。最后是可用资源P7, P2, P6。可用序列是不存在死锁的条件。

Bankers-Algorithm-Example1
bankers-algorithm-example1

例(2):假设P2是001而不是000,现在应用银行家算法来检查死锁条件,其中所有5个进程中只执行P0。因此,除了P0之外,P1、P2、P3、P4都处于死锁状态。

Bankers-Example2
bankers-example2

应用程序死锁的

死锁的应用可以用一个在线考试成绩的实时例子来解释,在这个例子中,一些学生试图在发布的时候访问他们的大学网站。可以观察到,有时web页面不会同时加载给多个用户,这是一个死锁条件。这可以用任何一种算法来克服。

优势

死锁的好处是

  • 在死锁避免中没有观察到抢占
  • 这个过程没有延迟

缺点

死锁的缺点是

  • 要使用的资源必须提前知道
  • 长期堵塞过程
  • 抢占损失是遗传的。

本文概述了两种或两种以上进程发生死锁的情况和导致死锁发生的三种条件,以及两种算法即检测存在死锁的资源共享算法死锁条件银行家算法是一种避免死锁的算法。这里有一个问题:“如果死锁被忽略了会发生什么?”

添加评论