死锁的原理以及避免算法

Linux学习-目录索引


1.死锁的定义

进程的死锁是指当两个或者多个进程互相持有对方所需要的资源,但双方都不释放资源,使得双方都处于等待状态,无法前往执行,从而产生死锁。
线程的死锁是指当多个线程去申请临界资源时申请公共的锁,可能两者在申请相互的锁,导致两者被挂起,这样就产生死锁了

2.死锁产生的原因

2.1:竞争资源引起进程死锁

当系统中供多个进程共享的资源如打印机、公用队列的等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁。

2.2:可剥夺资源和不可剥夺资源

系统中的资源分为两类:
可剥夺资源:一个进程获得资源后可以被其他进程抢占或者被系统剥夺,例如:优先权高的进程可以抢占优先权低的进程,再比如:内存区可由存储器管理程序,把一个进程从一个存储区移到另一个存储区,此即剥夺了该进程原来占有的存储区,甚至可将一进程从内存调到外存上,可见,CPU和主存均属于可剥夺性资源
不可剥夺资源:一个进程从系统得到资源后,系统就不能再回收该资源,也不能被其他人剥夺,只有等到该资源被进程释放后才可以被其他进程使用。比如:打印机

2.3:竞争不可剥夺资源

因为不可剥夺资源是有限的,并不一定能够满足进程的需要,所以会使进程在运行时在竞争这些资源而陷入死锁

2.4:竞争临时资源

一个进程产生的资源,被另一个进程使用,并且短时间内没有资源再产生了,也叫做消耗资源
比如:有p1,p2,p3三个进程,p1向p2发送消息并接受p3发送的消息,p2向p3发送消息并接受p2的消息,p3向p1发送消息并接受p2的消息,如果设置是先接到消息后发送消息,则所有的消息都不能发送,这就造成死锁。

2.5:进程推进顺序不当引起死锁

比如有两个进程P1,P2,都需要资源A,B,规定的顺序是P1先访问A资源,再访问B资源,然后P2再访问A资源,再访问B资源,但是进程间并不一定按照这个顺序进行,可能P1访问A资源,P2在访问B资源,因为就产生了死锁

3.死锁的产生必须满足一下特定的条件

  • 1.资源互斥和不共享:进程对于所分配的资源具有排它性,即一个资源只能被一个进程占用,直到被该进程释放,不能与其它进程共享该资源
  • 2.请求和保持条件:一个进程已经得到一个资源,依然去请求新的资源(即保持当前资源再去请求新资源)
  • 3.资源不可剥夺性:任何一个资源在没有被释放之前,任何进程都不可以对它剥夺占用。
  • 4.循环等待条件:当发生死锁时,所等待的进程必定会形成一个环路(类似于死循环),造成永久阻塞,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。

4.防止死锁的方法

即:只要破坏死锁产生的四个必要条件之一,就可以防止死锁了
但是目前没有那个操作系统可以实现,因此目前的方法是避免死锁而不是防止死锁

4.1.破坏资源互斥和不共享

资源可以共享就不会出现资源占用而等待问题,但是有的资源是不能共享的,比如打印机这类资源具有互斥性,所以破坏应有的互斥条件是不可靠的

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

4.2.破坏请求和保持条件

所以进程在运行前必须一次性申请够自己所需要的资源,这样就不会在运行期间去申请资源了,破坏了请求条件。即使一种资源不能满足它的需求时,也不会给它分配新的空闲资源,这样它就没有资源可申请,也就破坏了保持条件。
但是缺点是系统资源被严重浪费,其中有些资源可能仅在运行初期或运行快结束时才使用,甚至根本不使用。而且还会导致“饥饿”现象,当由于个别资源长期被其他进程占用时,将致使等待该资源的进程迟迟不能开始运行

4.3.破坏资源不可剥夺性

当一个进程保持某些不可剥夺资源时,请求新的资源时得不到满足,它必须释放已经保持的所有资源,待以后需要时再重新申请。
但是缺点是实现起来太复杂,释放已获得资源可能造成前面所做的工作不起作用,并且在请求和释放资源的过程中开销太大,降低了系统的吞吐量。这种方法常用于状态易于保存和恢复的资源。如CPU中的寄存器和内存资源,一般不能用于打印机类资源。

4.4.破坏循环等待条件

可采用线性资源分配法,先给每个进程分配序列号,规定每个进程按序列号递增的顺序进行申请资源,如果想要申请序列号低的资源,就必须释放相同的序列号资源或者更高的资源。
但是缺点是编号必须相对稳定,如果有新设备增加时,它的顺序就可能要发生变化,这就造成了多余工作量。还有经常会发生作业使用顺序和规定系列号顺序不一样,造成资源的浪费。并且这种规定顺序申请资源的方法必然会给编程者带来麻烦。

5.避免死锁的算法

5.1:线性资源分配法

这种算法资源必须按照某种规则给系统中的所有资源统一编号(例如打印机为1、磁带机为2、磁盘为3、等等),申请时必须申请序列号高的资源。系统要求申请进程:
1、对它所必须使用的而且属于同一类的所有资源,必须一次申请完;
2、在申请不同类资源时,必须按各类设备的编号依次申请。例如:进程P1,使用资源的顺序是R1,R2; 进程P2,使用资源的顺序是R2,R1;若采用动态分配有可能形成环路条件,造成死锁。
采用有序资源分配法:R1的编号为1,R2的编号为2;
P1:申请次序应是:R1,R2
P2:申请次序应是:R1,R2
这样就破坏了环路条件,避免了死锁的发生

5.2:系统安全状态法

即在系统分配资源之前,就应该检测此次资源分配的安全性,如果此次分配资源会导致进程进入安全状态,那就等待,如果不会,则分配资源。

5.3:银行家算法

四个条件:
1.分批向银行贷款时,申请的总额不能超过一开始申请的额度。
2.申请贷款时不能超过银行现有资金数目
3.当银行资金不能满足顾客贷款需求时,可以推迟支付,但是肯定会让顾客在需求时间内得到贷款
4.顾客拿到贷款后必须在规定时间内归还。

猜你喜欢

转载自blog.csdn.net/triorwy/article/details/80643753
今日推荐