死锁产生的四个必要条件:
- 互斥条件:一个资源一次只能被一个进程访问。即某个资源在一段时间内只能由一个进程占有,不能同时被两个或两个以上的进程占 有。这种独占资源如CD-ROM驱动器,打印机等等,必须在占有该资源的进程主动释放它之后,其它进程才能占有该资源。这是由资源本身的属性所决定的。
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。进程至少已经占有一个资源,但又申请新的资源;由于该资源已被另外进程占有,此时该进程阻塞;但是,它在等待新资源之时,仍继续占用已占有的资源。
- 不剥夺条件:进程已经获得的资源,在未使用完之前不能强行剥夺,而只能由该资源的占有者进程自行释放。
- 循环等待条件:若干资源形成一种头尾相接的循环等待资源关系。
预防死锁:
- 破坏互斥条件:有些资源必须互斥使用,无法破坏互斥条件;
- 破坏不剥夺条件:增加系统开销,降低吞吐量 ;
- 破坏请求和保持条件:严重浪费系统资源,还可能会导致饥饿现象;
- 破坏循环等待条件:浪费系统资源,并造成编程不便;
避免死锁:
安全状态:找到一个 分配资源的序列,让所有进程顺利完成;
银行家算法:把os看成银行家,操作系统管理的资源看成银行家管理的资金,进行向操作系统请求分配资源相当于用户向银行家贷款,操作系统按照银行家指定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统中现存的资源可以满足它的最大需求量,则按照当前申请量分配资源,否则就推迟分配,当进程在执行中继续申请资源时,先测试该进程已占有的资源数与本次申请的资源数之和是否超过了该进程对资源的最大资源量,若超过则拒绝分配资源,若没有超过则测试系统现存的资源量能否满足该进程尚需的最大资源量,若能满足,则按照当前申请量分配资源,否则推迟分配;
解除死锁:
资源剥夺:挂起某些死锁进程并剥夺它的资源,以便让其他进程继续推进;
撤销进程法:强制撤销部分甚至全部死锁进程,并剥夺这些进程的资源;
进程回退法:让进程回退到足以避免死锁的地步;