对死锁的简单理解

【概念】

   死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,例如线程A锁住了记录1并等待记录2,线程B锁住了记录2并等待记录1,这样就产生了死锁现象。

【几个相关概念】

 

1、可重用性资源

  • 一种可供用户重复使用多次的资源

2、消耗性资源

  • 又称为临时性资源,是在进程运行期间,由进程动态地创建和消耗地
  • 可消耗资源通常是由生产者进程创建,由消费者进程消耗。

3、可抢占性资源

  • 某进程在获得这类资源后,该资源可以被其他进程或系统抢占。
  • 其中CPU和内存均属于可抢占资源

4、不可抢占资源

  • 一旦系统把资源分配给该进程后,就不能将它强行收回,只能在进程用完后自行释放。

【产生原因】

 

1、竞争不可抢占性资源

  • 通常系统中所拥有的不可抢占性资源数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因争夺资源而陷入僵局

2、竞争可消耗资源

 

3、进程推进顺序不当

  • 除了系统中多个进程对资源的竞争会引发死锁外,进程在运行过程中,对资源进行申请和释放的顺序是否合法,也是在系统中是否会产生死锁堆的一个重要因素

【产生条件】

1)互斥条件:进程对所分配到的资源不允许其他进程访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源之后才能访问。

2)请求和保持条件:进程获得一定的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此时请求阻塞,但又对自己活得的资源保持不放。

3)不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可剥夺,只能在使用完成后自己释放。

4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链。

【如何避免】

【死锁的预防]】是通过破坏产生条件来阻止死锁的产生,但这种方法破坏了系统的并行性和并发性。

死锁产生的前三个条件是死锁产生的必要条件,也就是说要产生死锁必须具备的条件,而不是存在这3个条件就一定产生死锁,那么只要在逻辑上回避了第四个条件就可以避免死锁。

避免死锁采用的是允许前三个条件存在,但通过合理的资源分配算法来确保永远不会形成环形等待的封闭进程链,从而避免死锁。该方法支持多个进程的并行执行,为了避免死锁,系统动态的确定是否分配一个资源给请求的进程。

常用的避免死锁的方法:

1、有序资源分配法

2、银行家算法

解决死锁问题的策略:

1、条件一:互斥条件

条件一是否定的,因为资源的互斥性是由其自身的性质决定的。但是可以采用虚拟设备技术能排除非共享设备死锁的可能。

2、条件二:不剥夺条件

很难实现。系统一般让资源占有者自己主动释放资源,而不是采用抢占的方式。

3、条件三:占有并等待

在资源分配策略上可以采取静态的一次性资源分配的方法来保证死锁不可能发生,这是一种很保守的静态预防死锁的方法,但是资源利用率低下。

4、条件四:环路条件

在进行资源分配前检查是否会出现环路,预测是否可能发生死锁,只要有这种可能就不予以分配。即采用动态分配资源的方法。

总结来看解决死锁的策略有以下几个:

1、采用资源静态分配方法预防死锁。

加锁顺序----->保证所有线程按照相同的顺序加锁

                   ----->但是需要提前知道所有可能会用到的锁,并对这些锁进行适当排序,但不太现实

2、采用资源动态分配、有效的控制分配方法来避免死锁。

加锁时限----->在尝试获取锁的时候加一个超时时间,超过该时间视为自动放弃对锁的请求

                   ----->但是当线程很多时,必然存在两个或者多个进程的超时时间一样活着接近的可能性会很大,

                            从而导致超时时间一样,又重新开始重试,导致新一轮的竞争,

3、当死锁发生时检测出死锁,并设法修复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值