进程死锁

两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

1、产生死锁的原因
(1)系统资源不足
(2)资源分配不当
(3)进程运行推进顺序不合适

2、产生死锁的必要条件
(1)互斥条件:一个资源每次只能被一个进程使用;
(2)进程已获得的资源,在未使用完之前,不能强行剥夺;
(3)一个进程因请求资源而阻塞时,对已获得的资源保持不放;
若干进程之间形成一种首尾相接的循环等待资源关系。

3、处理死锁的策略
(1)忽略死锁:鸵鸟算法
(2)检测死锁并恢复。让死锁发生,检测它们是否发生,一旦发生死锁,采取行动解决问题。恢复策略:利用抢占恢复、利用回滚恢复、通过杀死进程恢复
(3)死锁避免。仔细对资源进行分配,动态得避免死锁。银行家算法
(4)死锁预防。通过破坏引起死锁的四个必要条件之一,防止死锁的发生。

4、死锁预防
死锁的产生原因和解除
(1)破坏互斥条件
没法破坏,是资源本身的性质所引起的。
(2)破坏请求与保持条件
①所有进程在开始运行之前,必须一次性获得所有资源,如果无法获得完全,释放已经获得的资源,等待;
②所有进程在开始运行之前,只获得初始运行所需要的资源,然后在运行过程中不断请求新的资源,同时释放自己已经用完的资源。    
相比第一种而言,第二种方式要更加节省资源,不会浪费(因为第一种可能出现一种资源只在进程结束用那么一小下,但却从头到尾都被占用,使用效率极低),而且,减少了进程饥饿的情况。
(3)破坏不可抢占条件
说起来简单,只要当一个进程申请一个资源,然而却申请不到的时候,必须释放已经申请到的所有资源。但是做起来很复杂,需要付出很大的代价,加入该进程已经持有了类似打印机(或者其他的有必要连续工作的)这样的设备,申请其他资源的时候失败了,必须释放打印机资源,但是人家用打印机已经用过一段时间了,此时释放打印机资源很可能造成之后再次是用打印机时两次运行的信息不连续(得不到正确的结果)。
(4)破坏循环等待条件
设立一个规则,让进程获取资源的时候按照一定的顺序依次申请,不能违背这个顺序的规则。必须按照顺序申请和释放,想要申请后面的资源必须先把该资源之前的资源全部申请,想要申请前面的资源必须先把该资源之后的资源(前提是已获得)全部释放。
5、死锁的其他问题
两阶段锁协议
socket—TCP通信死锁问题
死锁与活锁的区别,死锁与饥饿的区别
(1)两阶段加锁
在第一阶段,进程试图对所有所需的记录进行加锁。一次锁一个记录。如果第一阶段加锁成功,就开始第二阶段,完成更新后释放锁。在第一阶段并没有做实际的工作。如果在第一阶段某个进程需要的记录已经被加锁,那么该进程释放它所有的记录,然后重新开始第一阶段。
(2)通信死锁
在一系列进程中,每个进程因为等待另外一个进程引发的事件而产生阻塞,这就是通信死锁。
如:在网络通信中,进程A向进程B发送请求消息,然后阻塞直至B回复。假设请求消息丢失,A将阻塞以等待回复,而B会阻塞等待一个向其发送命令的请求,因此发送死锁。
(3)活锁
是指线程1可以使用资源,但它很礼貌,让其他线程先使用资源,线程2也可以使用资源,但它很绅士,也让其他线程先使用资源。这样你让我,我让你,最后两个线程都无法使用资源。
(4)饥饿
是指如果线程T1占用了资源R,线程T2又请求封锁R,于是T2等待。T3也请求资源R,当T1释放了R上的封锁后,系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后,系统又批准了T4的请求……,T2可能永远等待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值