死锁(参考王道)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JACK_JYH/article/details/81974588

可剥夺资源:是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺。例如,优先权高的进程可以剥夺优先权低的进程的处理机。又如,内存区可由存储器管理程序,把一个进程从一个存储区移到另一个存储区,此即剥夺了该进程原来占有的存储区,甚至可将一进程从内存调到外存上,可见,CPU和主存均属于可剥夺性资源

不可剥夺资源:当系统把这类资源分配给某进程后,再不能强行收回,只能在进程用完后自行释放,如磁带机、打印机等。

死锁产生的原因?

1.系统资源竞争

系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因争夺资源而陷入僵局。只有对不可剥夺资源的竞争才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。

2.进程推进顺序非法

进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁,例如,并发进程P1,P2分别保持了资源R1,R2,而进程P1申请资源R2,进程P2申请资源R1时,两者都会因为所需资源被占用而阻塞。

信号量使用不当也会造成死锁,进程相互彼此等待对方的消息,结果也会使得这些进程间无法继续向前推进。例如A等待进程B发的消息,进程B又在等待进程A发的消息,可以看出进程A和B不是因为竞争同一资源,而是在等待对方的资源导致死锁。

3.死锁产生的必要条件

互斥条件:进程要求对所分配的资源具有排他性。

扫描二维码关注公众号,回复: 2910663 查看本文章

不可剥夺条件:进程所获的资源在未使用完毕前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放。

请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己获得的资源保持不放。

循环等待条件:存在一种进程资源的循环等待链,链中每一个进程获得资源同时被链中下一个进程请求。

注解:但是有链不代表死锁,因为可能某个节点分叉释放资源后,链就被打破了。资源分配图含圈而系统又不一定有死锁的原因是同类资源大于1,但若系统中每类资源都只有一个资源,则资源分配图含圈就变成了系统出现死锁的充分不必要条件。

死锁的处理策略

1.预防死锁

设置某些条件,破坏产生死锁的四个必要条件中的一个或几个,以防止发生死锁。

策略:保守,宁可闲置资源

模式:一次请求所有资源,资源剥夺,资源按序分配。

优点:适用于做突发式处理的进程,不必进行剥夺。

缺点:效率低,进程初始化时间延长,剥夺次数过多,不便灵活申请资源

2.避免死锁

在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免死锁。

策略:是“预防”和”检测“的折中(在运行时判断是否可能死锁)

模式:虚招可能的安全允许顺序

优点:不必进行剥夺

缺点:必须知道将来的资源需求,进程不能被长时间阻塞。

3.死锁的检测及解除

无需采取任何限制性策略,允许进程在运行过程中发生死锁。通过系统检测机构及时的检测死锁的发生,然后采取某种措施解除死锁。

策略:宽松,只要允许就分配资源

模式:定期检查死锁是否已经发生

优点:不延长进程初始化时间,允许对进程进行现场处理。

缺点:通过剥夺解除死锁造成损失。

注解:预防死锁和避免死锁都属于事先预防策略,但预防死锁的限制条件比较严格,实现起来简单,但往往导致系统的效率低,资源利用率低,避免死锁的限制条件相对宽松,资源分配后需要通过算法来判断是否进入不安全状态,实现起来较为复杂。

预防死锁具体方法

1.破坏互斥条件

如果允许系统资源都能共享使用,则系统不会进入死锁状态,但有些资源根本不能同时访问,入打印机等临界资源只能互斥使用,所以,破坏互斥条件而预防死锁不太可行。

2.破坏不剥夺条件

当一个一保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,他必须释放已经保持的所有资源,待以后需要时再重新申请。该策略实现起来比较复杂,释放已经获得的资源可能造成前一段工作的失效,反复申请和释放资源会导致系统开销,降低系统吞吐量。这种方法常用语状态易于保存和恢复的资源,如CPU的寄存处,内存资源,一般不能用于打印机之类资源

3.破坏请求和保持条件

采用预先静态分配的方式,即进程在运行前一次申请完它所需要的全部资源,在他的资源未满足前,不把它投入运行,一旦投入运行,这些资源就一直归它所有,也不再提出其他资源请求,这样就可以保证系统不会发生死锁。

4.破坏循环等待条件

可采用顺序资源分配法,首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源一次申请完。

死锁避免

安全状态:是指系统能按照某种进程推进顺序(P1,P2,...,Pn),为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺序地完成。此时称P1,P2,...P3为安全序列,如果系统无法找到一个安全序列,则称系统处于不安全状态。

银行家算法:

我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

为保证资金的安全,银行家规定:

(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;

(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;

(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;

(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。

数据结构:

1)可利用资源向量Available

是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目。如果Available[j]=K,则表示系统中现有Rj类资源K个。

2)最大需求矩阵Max

这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。

3)分配矩阵Allocation

这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的 数目为K。

4)需求矩阵Need。

这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。

Need[i,j]=Max[i,j]-Allocation[i,j]

算法描述

初始化

由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。

银行家算法

在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。

银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。

设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。

(1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转(2);否则,出错。

(2)如果REQUEST [cusneed] [i]<= AVAILABLE[i],则转(3);否则,等待。

(3)系统试探分配资源,修改相关数据:

AVAILABLE[i]-=REQUEST[cusneed][i];

ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];

NEED[cusneed][i]-=REQUEST[cusneed][i];

(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

安全性检查算法

(1)设置两个工作向量Work=AVAILABLE;FINISH

(2)从进程集合中找到一个满足下述条件的进程,

FINISH==false;

NEED<=Work;

如找到,执行(3);否则,执行(4)

(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。

Work=Work+ALLOCATION;

Finish=true;

GOTO 2

(4)如所有的进程Finish= true,则表示安全;否则系统不安全。

死锁检测和解除

(死锁定理)资源分配图简化:https://blog.csdn.net/coding1994/article/details/52474731

解除:

1资源剥夺法:挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程,但应防止被挂起的进程长时间得不到资源,而处于资源匮乏的状态。

2.撤销进程法:强制撤销部分,甚至全部死锁进程并剥夺这些进程的资源,撤销的原则可按进程优先级和撤销进程代价的高低进程

3.进程回退法:让一(多个)进程回退到足以回避死锁的地步,进程回退时自愿释放资源而不是被剥夺,要求系统保持进程的历史消息,设置还原点。

经典例题

1.某系统中有三个并发今进程都需要四个同类资源,则该系统必然不会发生死锁的最小资源是(10)

解释:最平均最容易产生死锁,三个都是3个,还剩一个,分配给谁都能保证不会产生死锁。

2.解除死锁通常不采用的方法是(D)

A.终止一个死锁进程 B.终止所有死锁进程

C.从死锁进程处抢夺资源 D.从非死锁进程处抢夺资源

3.死锁状态与安全状态的关系是(D)

A.死锁状态有可能是安全状态 B.安全状态有可能成为死锁状态

C.不安全状态就是死锁状态 D.死锁状态一定是不安全状态

4.死锁检测时检查的是(资源有向图)

5.某个系统采用下列资源分配策略。如果一个进程提出资源请求而得不到满足,而此时没有由于等待资源而被阻塞的进程,则自己就被阻塞。而当此时已有等待资源而被阻塞的进程,则检查所有由于等待资源而被阻塞的进程。如果它们有申请进程所需的资源,则将这些资源取出分配给申请进程,这种分配策略会导致(D)

A.死锁 B 颠簸 C回退 D饥饿

6.下面是一个并发进程的程序代码,正确的是(B)

Semaphore x1=x2=y=1;
Int c1=c2=0;
P1()
{
    while(1){
        P(x1);
        if(++c1==1)P(y);
        V(x1);
        computer(A);
        P(x1);
        if(--c1==0)V(y);
        V(x1);
    }
}

P2()
{
    while(1){
        P(x2);
        if(++c2==1)P(y);
        V(x2);
        computer(B);
        P(x2);
        if(--c2==0)V(y);
        V(x2);
    }
}

A.进程不会死锁,也不会饥饿 B进程不会死锁,但是会饥饿

C进程会死锁,但是不会饥饿 D进程会死锁,也会饥饿

7.某银行计算机系统要实现一个电子转账系统,基本的业务流程是,首先对转出方和转入方的账户进行加锁,然后进行转账业务,最后对转出方和转入方账户进行解锁。如果不采取任何措施,系统会不会发生死锁?为什么?请设计一个能够避免死锁的方法。

系统会死锁,因为对两个账户进行加锁操作是可以分割的,若此时有两个用户同时进行转账,P1先对账户A进行加锁,再申请账户B,P2先对账户B进行加锁,再申请账户A,此时产生死锁。解决的办法是:可以采用资源顺序分配的方法对账户A,B账户进行编号,用户转账时只能按照编号由小到大进行加锁,也可以采用资源预分配法,要求用户在使用资源之前将所有资源一次性申请到。

猜你喜欢

转载自blog.csdn.net/JACK_JYH/article/details/81974588
今日推荐