deadlock


死锁形成的原因是不同进程所持有和申请的锁形成了一个环,出现死锁一般表明程序代码中有bug。
在Linux内核中,为了避免死锁,有几条措施:
1   spin lock获得后不会发生进程调度;
2   获取多把spin lock时,所有进程按照锁的地址大小顺序获取;
3   要使用多个锁的子系统中,对各种锁的使用会形成一个获取顺序的约定,(可参考mm/rmap.c)
4  Linux内核中有一个nmi不可屏蔽中断,如果系统发现关中断时间过长,就会认为发生了死锁,触发这个中断。当然这种措施并不能发现那些未关中断获取的锁导致的死锁。
总而言之,死锁是一种bug,linux内核中并没有什么能够在系统发生死锁之后还能够恢复过来的机制。 不过美国washington大学的Nooks项目好像在这方面有些改进。(参见http://nooks.cs.washington.edu/


说得好,系统最好能尽可能的检测到死锁的发生,然后直接panic来个核心转储,这样有利于分析和解决问题。

Solaris就是这样做的,部分死锁就会被内核检测并panic。


银行家算法就是个学院派的东西,我至今没看到哪个系统用这种方法预防死锁!用一句话来概括就是:理论上可

行的东西,实践上未必可行!

通常避免死锁类的方法,实现起来都不可行,包括单一资源和多种资源的银行家算法,以及两阶段加锁法。

应用的比较多的是死锁的检测和预防,死锁产生的有下列四个条件:

1、互斥

2、占有且等待

3、不可抢占

4、环路等待

这四个条件都是死锁发生所必须的条件,只要破坏这其中的某一个条件就行了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要解决 "deadlock detected" 的问题,可以使用以下步骤: 1. 首先,了解 "deadlock detected" 是指在数据库中发生了死锁情况。死锁是指两个或多个事务相互等待对方释放锁资源而无法继续执行的情况。 2. 接下来,需要确定哪些对象或资源造成了死锁。根据引用和引用[2]中提到的错误信息,可能是由于位图索引的误用导致了死锁。因此,需要检查位图索引的使用情况。 3. 一种常见的解决死锁的方法是通过调整事务的并发控制机制来避免死锁的发生。可以考虑使用不同的事务隔离级别,如读已提交、可重复读或串行化,以减少死锁的可能性。 4. 另外,可以优化查询和修改数据库的操作,以减少对共享资源的争夺。例如,通过使用合适的索引、优化查询语句、减少不必要的锁定等方式来改善性能。 5. 此外,监控数据库的性能和运行状况,及时发现并解决潜在的死锁问题。可以使用数据库性能监控工具,如Oracle Enterprise Manager或第三方监控工具来实现。 总结起来,要解决 "deadlock detected" 的问题,需要检查位图索引的使用情况,调整事务隔离级别,优化查询和修改操作,并监控数据库性能。这些步骤将有助于解决死锁问题并提高数据库的性能。 : ORA-04020: deadlock detected while trying to lock object : Oracle ORA-00060: Deadlock detected. More info in file /var/oracle/app/diag/rdbms/... : ISAPI c:windowsmicrosoft.netframeworkv2.0.50727aspnet_isapi.dll reports deadlock detected.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值