【是什么】
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。若无外力作用,它们将无法推进下去。
【怎么形成的】(傻傻的进程)
要了解形成过程,需要明白以下前提:(以进程为中心进行的阐述)
① 进程只有有了资源才能执行,就像人必须吃饭才能生存下去。
② 操作系统是用来分配资源的,分配的原则是进程申请,只要有就给。这类似“被啃老”的父母的行为。
③ 进程的上一级是作业。N个进程组成作业,也就是说要想完成一个作业,要将其分块(分进程)进行。比如要想完成今天的homework,分别需要完成语文,数学,英语。这“homework”就是作业,“语数外”就是进程。
正文:
现有T1、T2两个进程和R1、 R2两个资源,两个进程要想完成,均必须使用R1R2两个资源。
正常情况下:
T1用完R1,R2,自身完成,释放资源。T2用完R1,R2,自身完成,释放资源。
非正常情况:
T1执行,需要R1,申请成功。紧接着T2执行,需要R2,申请成功。
T1执行到一半,需要R1了,再申请,操作系统也没此资源了,所以T1只有等待。同理,T2在等待着R2资源。
进程哪有人类这么聪明,它可不知道“舍得”的道理,所以就会一直傻等着操作系统给它分配指定资源。
等着等着,如果无外界干预,就会等到地老天荒。
这种现象就叫做“死锁”。
由上,我们可总结出产生死锁的必要条件:
① 互斥地使用资源
② 占有且等待资源
③ 非抢夺式分配
④ 循环等待资源
挺容易理解,在这就不进一步解释了。需要指出一点的是:如果产生了死锁,肯定4个条件都被满足了。可如果这4个条件被满足了,不一定会产生死锁。
【怎么解决】
形成了死锁,进程就搁置了,作业也就完成不了了。怎么解决呢?
防止
防止防止,在根源上制止。也就是说,采取了这些策略,死锁肯定不会发生
① 静态分配资源
在进程开始之初,需申请完其所需的所有资源。系统如果能满足,就给了进程让其执行。如果不能满足,进程等待。像上栗中,T1如果要执行,需要把R1R2资源都申请到,然后执行。此时,即使T2要执行,因没有资源,也需等待。
② 按序分配资源
将资源编号,规定进程申请资源时必须从小开始。像上栗中,先将R1R2分别编号为1、2。T1先申请了1号去执行了,此时,T2要想执行,必须也是先申请1号,结果没有,所以T2必须等待。这样,等T1需要2号资源时,也能成功申请到。
③ 剥夺式分配资源
顾名思义,如果进程T1和T2之间能互相抢,弱肉强食,也能让进程继续下去。
避免
可以明显感觉到,用“防止”策略时,对资源的利用率下降了。所以我们再找找别的方法:
避免,就是还按以前资源分配的方式,等估计可能会发生死锁时,采取策略。
其可采取“银行家算法”。以一个例题为例解释。
此时,系统只有2个资源可被调用了,可把资源给了进程2,满足了其最大需求量,然后进程2完成,同时释放6个资源。然后进程1和进程3依次进行。
检测
“死锁检测”程序定时检查这两张表,如上图中就发生了死锁。P1在等P2释放r3,P2在等P3释放r2,P3在等P1释放r5。形成了循环,形成了死锁。
【小结】
死锁就是进程像毛毛虫围圈,形成了死循环。