首页 > 编程知识 正文

死锁四个,进程卡死

时间:2023-05-06 00:58:39 阅读:157274 作者:4926

前言1、死锁定义1、死锁的引出2、死锁发生原因2、死锁策略1、死锁预防2、死锁避免3、存储库算法4、死锁检测与恢复5、死锁忽略总结

前言:以下是本文的正文内容

另一方面,死锁的定义1 .死锁的引出死锁(deallocks )是指多个进程(线程)在执行过程中,因相互争夺资源而导致的相互等待的现象,如果没有外力的作用,就无法进行这些操作此时,称为系统处于死锁状态,或者系统发生死锁,将这些永远相互等待的进程(线程)称为死锁进程(线程)

生产者--消费者问题

//文件中的共享缓冲区intfd=open(buffer.txt ); write(FD,0,sizeof ) (int ); //inwrite(FD,0,sizeof ) ) int ); out//信号量的定义和初始化semaphore full=0 //要生产的产品个数semaphore empty=BUFFER_SIZE; //可用缓冲区数量semaphore mutex=1; //互斥信号量//生产者producer(item ) ) p ) empty; //生产者首先确定缓冲器数量empty是否已满,empty==0,块p(mutex ); 在操作//文件之前,“mutex”禁止其他进程操作该文件并将其导入in,并将item v (mutex )放在in位置; //文件使用完毕,释放文件资源v(full ); //生产者生产产品,增加full,消费者就可以消费了}//消费者Consumer (() (p ) ); 当full==0时,缓冲器为空,读取屏蔽p(mutex )的out,从文件中的out位置读取到item,打印item; v(mutex ); v(Empty ); //只要消费者消费产品,增加缓冲区数量,增加empty,生产者就可以继续生产}此时,生产者和消费者都可以首先调用p(empty )/p (full ),调用互斥信号量mutex,从而使流程正确

但是,如果把这两个优先顺序对调一下的话:

这里,设mutex初始值为1,empty初始值为0,缓冲器已满

在生产者中,p(mutex )将mutex设定为0,//p )将empty设定为-1,生产者进行封锁,然后消费者开始(p ) mutex ),mutex设定为0,执行p ) mutex )将mutex设定为-1

生产者需要释放empty才能执行。 这意味着消费者必须执行v (加密)。 目前,消费者已卡在p ) P(mutex )中,无法释放

消费者必须释放mutex才能运行。 生产者必须执行v(metux )。 生产者卡在上面的p ) P(empty )也不能释放

在生产者p(empty )下执行,依赖于消费者,消费者在以下执行,依赖于生产者p(empty )下的命令,形成循环并等待,从而导致死锁。

2 .死锁发生原因原因:

)1)系统资源竞争

由于系统资源的竞争,导致系统资源不足,资源分配不当,出现死锁。

)2)进程的执行推进顺序不合适

在进程运行期间,请求和释放资源的顺序不正确会导致死锁。

死锁的四个必要条件

1 .互斥条件:

一次只能在一个进程中使用资源。 这意味着在一段时间内,资源只能用于一个进程。 如果此时另一个进程请求资源,则请求进程只能等待。

2 .要求和保留条件:

一个进程本身占用资源(一个或多个)的同时,还没有填满资源,正在等待其他进程释放该资源。

3 .不能抢占的条件:

别人已经占有了某种资源,不能因为自己也需要这种资源就剥夺别人的资源。

4 .循环等待条件:

在几个进程之间形成顺利循环等待资源的关系

这4个条件是死锁的必要条件,只要系统不发生死锁,这些条件就一定成立,只要不满足上述条件的任一个,就不会发生死锁。

二.死锁策略死锁处理方法概述

1 .死锁预防破坏死锁发生的条件,不占用资源申请其他资源2 .死锁回避检测每个资源的要求,发生死锁时拒绝3 .死锁检测恢复在检测到死锁发生的情况下,通过全局处理几个流程

在流程运行之前,一次性申请所有必需的资源,不会占用资源申请其他资源

优点:简单易实施,安全。

缺点:由于某些资源未得到满足,进程无法启动。 另外,已经满足的其他资源也没有被利用,资源的利用率大幅降低,导致资源的浪费。 过程中经常发生饥饿现象

**方法2:**重新排列资源类型。 资源申请必须按顺序进行,不会发生循环等待

坏处:还是会造成资源的浪费

2 .避免死锁在使用前判断,只允许不发生死锁的进程申请资源。 死锁的避免是利用多馀的检查信息,判断在分配资源时是否发生死锁,仅在不发生死锁的情况下进行

才分配资源。

两种避免办法:

1、如果一个进程的请求会导致死锁,则不启动该进程
2、如果一个进程的增加资源请求会导致死锁 ,则拒绝该申请。

问题:

上图含有5个进程:P0-P4
Allocation:占有的资源,以P1 为例,占用资源A3个,资源B0个,资源C2个
Need:需要的资源
Available:系统中剩余的资源

分析:
当前系统剩余资源:ABC = 230,给 P1,P1可以执行完,P1 执行完 Available ABC = 532,P3 可以执行,P3 执行完,Available ABC = 743
其他进程都可以执行…A 是安全序列

3.银行家算法

银行家算法通过对进程需求、占有和系统拥有资源的实时统计,确保系统在分配给进程资源不会造成死锁才会给与分配

int Available[1..m]; //每种资源剩余数量int Allocation[1..n, 1..m]; //已分配资源数量int Need[1..n, 1..m]; //进程还需的各种资源数量int Max[1..n, 1..m];//进程总共需要的资源数量int Work[1..m]; //工作向量bool Finifh[1..n]; //进程是否结束Work = Available;Finifh[1..n] = false;while(true){ for(i = 1; i <= n; i++) { // Need[i] <= Work 这个任务是可以完成的 if(Finish[i] == false && Need[i] <= Work) { Work = Work + Allocation[i]; // Work 累加系统曾分配给 i 的资源 Finish[i] = true; break; } else { goto end; } }}End: for(i = 1; i <=n; i++) if(Finish[i] == false) return "deadlock";

相关数据结构:

可利用资源向量Available:用于表示系统里边各种资源剩余的数目。由于系统里边拥有的资源通常都是有很多种(假设有m种),所以,我们用一个有m个元素的数组来表示各种资源。数组元素的初始值为系统里边所配置的该类全部可用资源的数目,其数值随着该类资源的分配与回收动态地改变。

分配矩阵Allocation:顾名思义,就是用于表示已经分配给各个进程的各种资源的数目。也是一个nxm的矩阵。

需求矩阵Need:用于表示进程仍然需要的资源数目,用一个nxm的矩阵表示。系统可能没法一下就满足了某个进程的最大需求(通常进程对资源的最大需求也是只它在整个运行周期中需要的资源数目,并不是每一个时刻都需要这么多),于是,为了进程的执行能够向前推进,通常,系统会先分配个进程一部分资源保证进程能够执行起来。那么,进程的最大需求减去已经分配给进程的数目,就得到了进程仍然需要的资源数目了。

所以,根据该算法可以解决上面的问题


其时间复杂度是 T(n) = O(m* n^2),m是资源数,n是进程数

死锁避免的优点:

不需要死锁预防中的抢占和重新运行进程,并且比死锁预防的限制要少

死锁避免的缺点:

必须事先声明每个进程请求的最大资源量
考虑的进程必须无关的,也就是说,它们执行的顺序必须没有任何同步要求的限制
分配的资源数目必须是固定的
在占有资源时,进程不能退出

4.死锁检测与恢复

定时检测或者是发现资源利用率低时检测

检测算法:

Finish[1..n] = false;if(Allocation[i] == 0) Finish[i]=true;...//和Banker算法完全一样for(i=1;i<=n;i++)if(Finish[i]==false)deadlock = deadlock + {i};

检测处问题,进程解锁:

1.抢占资源:从一个或多个进程中抢占足够数量的资源分配给死锁进程,以解除死锁状态。
2.终止(或撤销)进程:终止或撤销系统中的一个或多个死锁进程,直至打破死锁状态。

5.死锁忽略

死锁出现不是确定的, 可以用重启动来处理死锁,
Windows和Linux都采用了死锁忽略的方法:

死锁忽略的处理代价最小这种机器上出现死锁的概率比其他机器低死锁可以用重启来解决,PC重启造成的影响小 总结

提示:这里对文章进行总结:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。