死锁(死锁)
死锁是一种在
执行过程中
等待两个或多个过程的现象,这是由资源竞争引起的。如果没有外力的
作用,他们将无法前进。此时,
系统处于死锁状态或系统产生死锁,并且总是互相等待的过程称为死锁的过程。由于资源占用是相互排斥的,当一个
进程申请资源,它使
程序无法继续
运行,没有外力的帮助,从而导致死锁的一个特殊的现象,在一个案例中,有在执行程序的永久性堵住两个或多个
线程(等待)。每个线程都在等待被其他线程和被占用的资源。例如,如果线程锁定记录1等记录2,线程B锁记录2等待1的纪录,使两个线程死锁。在
计算机系统中,如果系统的资源分配
策略是不恰当的,它更可能是由程序员写的程序有
错误,这将导致不正当竞争资源死锁的现象。有许多实现如锁,锁,共享互斥锁,锁表、树、时间戳协议等。锁有许多的粒度,如桌上的锁,或在记录锁。
造成僵局的
原因主要是:
(1)系统资源不足。
(2)进程的进度
顺序不合适。
(3)资源
配置不当等。
如果系统资源充足,就可以满足进程的资源请求,死锁的可能性很低,否则将陷入死锁,争夺有限的资源。
死锁产生的四个必要
条件:
(1)互斥条件:资源只能一次使用一个进程。
(2)请求和保持条件:当进程被请求资源阻塞时,已获得的资源被保留起来。
(3)非剥夺条件:使用过程中获得的资源在使用结束前不得以武力剥夺。
(4)循环等待条件:若干进程形成头部和尾部之间的循环等待资源关系。
这四个条件是死锁的必要条件。只要死锁发生,这些条件就一定会成立,如果上述条件不满足,就不会发生死锁。
死锁的预防与
解除:
了解死锁的原因,尤其是四个必要条件,死锁,死锁是可以避免的,预防和消除。因此,如何避免在系统设计中的四个必要条件,进程调度等,以及如何确定资源的合理分配,从而避免永久占用系统资源的过程。此外,为了防止处于等待状态的资源状况的过程中,在系统的运行中,每个系统可满足动态
检测使资源的过程,并根据
检查结果来决定资源的分配,如果分配系统死锁的发生,也不会被分配,因此,或被分配。资源配置要合理规划。
如何最小化死锁
虽然不能完全避免死锁,死锁的数量可以减少。减少死锁的锁可以提高事务吞吐量和减少系统开销,因为只有很少的事务回滚,而回滚将
取消执行的交易的所有
工作。申请重新提交因为死锁回滚。
下面的
方法有助于最小化死锁:
(1)以相同的顺序访问对象。
(2)避免事务中的
用户交互。
(3)在批量过程中保持事务的短。
(4)使用低隔离级别。
(5)使用绑定
连接。
以相同的顺序访问对象
如果所有的事务
都是以相同的顺序访问,死锁的可能性会降低。例如,如果两个并发事务获得锁的供应商表格然后在部分表得到锁,另一个事务被在供应商表前一交易完成。当第一个事务提交或滚回来,第二交易继续。没有死锁。存储过程用于所有数据的
修改,能规范的访问对象的顺序。
避免事务中的用户交互
避免写作涉及的用户交互的事务,因为没有用户交互运行批
处理用户
查询的响应比手工快得多,如
应用程序请求
参数提示。例如,如果交易是等待用户
输入,而用户去吃午餐或是周末回家,用户挂了这个交易使它不可能完成。这将降低系统的吞吐量,因为事务持有的所有锁被释放只有在事务提交或回滚。即使没有死锁,其他事务访问相同的资源将被阻塞,等待完成交易。
在批处理过程中保持事务的短
死锁通常发生在需要长时间运行的几个事务同时在同一数据库中执行时,事务越长,锁或更新锁的时间越长,从而阻塞其他活动,并可能导致死锁。
在批处理中
维护事务可以最大限度地减少
网络流量,从而减少事务完成和释放锁的可能延迟。
使用低隔离级别
决定交易是否可以运行在较低的隔离级别,提交读事务执行允许读取数据,其他事务已读取(未修改)无需等待要完成的第一笔交易。使用较低的隔离级别(例如,提交读)而不使用较高的隔离级别(例如串口读取),可以缩短持有共享锁的时间,从而减少锁争用。
使用绑定连接
使用绑定连接,打开到同一应用程序的两个或多个连接可以相互协作。