软考程序员知识点操作系统之死锁问题

程序员 责任编辑:小狐狸 2016-09-23

添加老师微信

备考咨询

加我微信

摘要:下面希赛小编为大家整理的软考程序员操作系统之死锁问题,希望能帮助学友们。

>>>>>希赛网改版上线5周年庆,感恩钜惠!全场买就减,较高立减500,还有1元秒杀,5折限时抢购,众多“豪”礼等你来享,进入抢购!


 下面希赛小编为大家整理的软考程序员知识点操作系统之死锁问题,希望能帮助学友们。具体内容如下:


       死锁问题

       死锁的规范定义:集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的。

       一种情形,此时执行程序中两个或多个线程发生一直堵塞(等待),每个线程都在等待被其他线程占用并堵塞了的资源。例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象。

       计算机系统中,如果系统的资源分配策略不当,更常见的可能是程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象。

       在两个或多个任务中,如果每个任务锁定了其他任务试图锁定的资源,此时会造成这些任务一直阻塞,从而出现死锁。例如:事务A获取了行1的共享锁。事务B获取了行2的共享锁。

       排他锁,等待事务B完成并释放其对行2持有的共享锁之前被阻塞。

       排他锁,等待事务A完成并释放其对行1持有的共享锁之前被阻塞。

       事务B完成之后事务A才能完成,但是事务B由事务A阻塞。该条件也称为循环依赖关系:事务A依赖于事务B,事务B通过对事务A的依赖关系关闭循环。

       除非某个外部进程断开死锁,否则死锁中的两个事务都将无限期等待下去。Microsoft SQL Server数据库引擎死锁监视器定期检查陷入死锁的任务。如果监视器检测到循环依赖关系,将选择其中一个任务作为牺牲品,然后终止其事务并提示错误。这样,其他任务就可以完成其事务。对于事务以错误终止的应用程序,它还可以重试该事务,但通常要等到与它一起陷入死锁的其他事务完成后执行。

       在应用程序中使用特定编码约定可以减少应用程序导致死锁的机会。有关详细信息,请参阅将死锁减至最少。

       死锁经常与正常阻塞混淆。事务请求被其他事务锁定的资源的锁时,发出请求的事务一直等到该锁被释放。默认情况下,除非设置了LOCK_TIMEOUT,否则SQL Server事务不会超时。因为发出请求的事务未执行任何操作来阻塞拥有锁的事务,所以该事务是被阻塞,而不是陷入了死锁。最后,拥有锁的事务将完成并释放锁,然后发出请求底事务将获取锁并继续执行。

       死锁有时称为抱死。

       不只是关系数据库管理系统,任何多线程系统上都会发生死锁,并且对于数据库对象的锁之外的资源也会发生死锁。例如,多线程操作系统中的一个线程要获取一个或多个资源(例如,内存块)。如果要获取的资源当前为另程所拥有,则第一个线程可能必须等待拥有线程释放目标资源。这就是说,对于该特定资源,等待线程依赖于拥有线程。在数据库引擎实例中,当获取非数据库资源(例如,内存或线程)时,会话会死锁。

       在示例中,对于Part表锁资源,事务T1依赖于事务T2。同样,对于Supplier表锁资源,事务T2依赖于事务T1。因为这些依赖关系形成了一个循环,所以在事务T1和事务T2之间存在死锁。

       当表进行了分区并且ALTER TABLE的LOCK_ESCALATION设置设为AUTO时也会发生死锁。当LOCK_ESCALATION设为AUTO时,通过允许数据库引擎在HoBT级别而不是TABLE级别锁定表分区会增加并发情况。但是,当单独的事务在某个表中持有分区锁并希望在其他事务分区上的某处持有锁时,会导致发生死锁。通过将LOCK_ESCALATION设为TABLE可以避免这种类型的死锁,但此设置会因强制某个分区的大量更新以等待某个表锁而减少并发情况。


       返回目录:软考程序员知识点操作系统汇总


     希赛软考网,拥有十四年软考培训经验,希赛网一直坚持自主研发,将丰富的软考培训经验有效融入教程研发过程,自成体系的软考在线题库软考历年真题)、软考培训教材软考视频教程,多样的培训方式包括在线辅导面授、和,使考生的学习更具系统性,辅导更具针对性。采用全程督学机制,,软考平均通过率在全国。

更多资料
更多课程
更多真题
温馨提示:因考试政策、内容不断变化与调整,本网站提供的以上信息仅供参考,如有异议,请考生以权威部门公布的内容为准!

软考备考资料免费领取

去领取

!
咨询在线老师!