死锁产生的原因
产生死锁的原因主要有两个:一个是竞争资源,系统资源在分配时出现失误,进程间对资源的相互争夺而造成僵局;二是多道程序运行时,进程推进顺序不合理
产生死锁的必要条件
- 互斥条件
- 不可剥夺条件
- 请求和保持条件
- 循环等待条件
解决死锁的方法
- 预防死锁:在任何系统操作前(如分配资源、调度进程等),事先评估系统的可能情况,严格采取措施使得死锁的四个必要条件不成立
- 基本思想:防范于未然
- 具体做法:破坏产生死锁的四个必要条件
- 采用资源游戏分配策略,破坏了死锁的四个必要条件中的循环等待条件
- 避免死锁
- 基本思想:系统对进程发出的每一个系统能够满足的资源申请进行动态监测,并根据检查结果决定是否分配资源;如果分配后系统可能发生死锁,则不予分配,否则予以分配
- 检查与解除死锁
- 忽略死锁
如何防止循环等待条件的发生。
采用资源的有序分配法。基本思想是,将系统中的所有资源顺序编号。一般原则是,较为紧缺、稀少的资源的编号较大。进程申请资源时,必须严格按照资源编号的顺序进行,否则系统不予分配。即一个进程只有得到编号小的资源,才能申请编号较大的资源;释放资源时,应按编号递减的次序进行。
死锁避免和死锁预防的区别
死锁预防是设法至少破坏产生死锁的四个必要条件之一,严格地防止死锁的出现,而死锁避免则不那么严格地限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一定发生死锁。死锁避免是在系统运行过程中注意避免死锁的最终发生
Dijkstra等人提出的银行家算法,其主要思想是什么?它能够解决实际中的死锁问题吗?为什么?
主要思想:进程首先提出对资源的最大需求量,当进程在执行中每次申请资源时,系统测试该进程已占资源与本次申请的资源数之和是否超过该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过,则系统在测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前申请分配资源,否则也要推迟分配。
这样做,能保证在任何时刻至少有一个进程可以得到所需要的全部资源而执行结束,执行结束后归还的资源加入系统剩余资源中,这些资源又至少可以满足另一个进程的最大需求,于是可以保证系统中所有进程都能在有限的时间内得到需要的全部资源