1.介绍

在多编程环境或者芯片互联中,多个进程可能会争夺一组有限的资源。如果进程请求资源,而该资源目前不可用,则该进程将等待它。有时,这种等待过程永远不会成功访问资源。这种等待资源会导致三种情况——死锁、活锁和饿死。

在本文中,我们将讨论这三个条件。

2.死锁deadlock

在本节中,我们将首先讨论死锁、其必要条件以及如何防止死锁。

2.1.什么是死锁?

死锁是指进程因获取资源而相互阻止的情况,并且进程在等待另一个进程持有的资源时没有取得任何进展。

78a0d91adf6599800a18aa2f5beb1769.png

上图显示了进程1和进程2之间的死锁。两个进程都持有一个资源,并等待另一个进程持有的另一个资源。这是一个死锁,因为在其中一个进程放弃其资源之前,进程1和进程2都无法取得进展。

2.2 死锁的必要条件

要成功将场景描述为死锁,以下四个条件必须同时保持:

1 -至少需要一个资源由其他非可共享模式的进程持有。任何其他请求该资源的进程都需要等待。


2 -进程必须持有一个资源,并请求其他进程当前持有的其他资源。

3 -资源不能从进程中强制释放。进程只有在认为要释放后才能自愿释放资源。

4 -一组进程p0等待p1,p1等待p2,pn等待p0


2.3 如何防止死锁

为了防止死锁的发生,需要破坏上一节中讨论的至少一个必要条件。让我们来研究以下任何条件是否为错误的可能性:

破坏1:例如,在只读文件系统中,一个或多个进程可以授予可共享访问权限。然而,这种情况并不总是错误的。

破坏2:我们需要保证一旦进程请求资源,它当时不会持有任何其他资源。一般来说,进程在开始执行之前应该请求所有资源。

破坏3:进程需要确保如果新请求的资源不可用,它将自动释放所有当前持有的资源。

破坏4:通过强制所有资源请求的排序,并确保每个进程按递增的顺序请求资源。即如果进程需求请求资源r0,r1,r2...rn。那么所有资源都要依次请求资源r0,r1,r2...rn。

3.活锁livelock

在本节中,我们将讨论活锁,它类似于死锁,但有一个细微的区别。

3.1 活锁是什么?

在活锁的情况下,活锁场景中涉及的进程状态会不断变化。另一方面,这些流程仍然相互依赖,永远无法完成任务。

更多推荐