互斥条件:
只有对必须互斥使用的资源进行申请才会导致死锁;
破坏方式:
如果把只能互斥使用的资源改为共享使用,系统就不会进入死锁状态;
缺点:
并不是所有的资源都可以破坏互斥条件,为了系统安全很多时候需要保留互斥性;
不剥夺条件:
进程所获得的资源在未使用完之前,不可被其他进程获取,只能主动释放;
破坏方式:
当某个进程请求的资源被其他进程占有无法得到时,进行主动释放,带以后需要再进行申请;
当某个进程需要的资源被其他进程占有时,通过操作系统协助将所需要的资源剥夺,这个方式需要考虑优先级;缺点:
- 实现起来较为复杂;
- 释放已获得的资源可能造成前一阶段工作的失效,这种方法只适用于易保存和恢复的资源;
- 增加了系统开销,降低了系统吞吐量;
- 若采用方案一可能会因为每次获得的资源都放弃而导致饥饿;
请求和保持条件:
进程已经保持了一个资源但又提出了新的资源,而该资源又被其他进程占有,这个时候请求进程被堵塞,自己的资源又保持不放;
破坏方式:
可以采用静态分配,使进程在运行前一次申请完所需资源,资源申请完才投入运行,一旦投入运行,进程结束前所占有的资源不会将资源释放;
缺点:
如果进程执行的过程中一直持有资源就会造成严重的资源浪费,资源利用率变低;
该策略也有可能导致某些进程因为所需资源一直无法同时得到而产生饥饿;
循环等待条件:
发生死锁的时候会有资源的循环等待链,链中的每一个进程掌握另外进程所需要而自身也需要的资源,它们之间互相请求互相不释放从而导致都拿不到所需要的资源;
破坏方式:
采用顺序资源分配法,给系统中的资源编号,规定每个进程按编号的顺序请求资源,同类资源一次申请完;
缺点:
- 一旦有新的设备就需要重新编号;
- 进程实际使用的顺序跟编号顺序不一致,会导致资源浪费;
- 必须按规定次序申请资源,用户编程麻烦;
安全序列:
如果系统按照这种序列进行分配资源则所有的进程都能顺利完成,只要找出一个安全序列,系统就是安全状态不会出现死锁,安全序列可能是多个;
不安全状态:
如果分配完资源之后系统找不出一个安全序列,那这个时候系统就进入了不安全状态,这就意味着系统可能会无法继续执行下去,不过如果有进程提前归还了一些资源,那么系统也有可能重新回到安全状态,也就是说死锁一定处于不安全状态,但是不安全状态不一定就会发生死锁;
因此可以在资源分配之前判断系统进入的状态;
核心思想:
在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态,如果会进入不安全状态就暂时不答应这次请求,让该进程先堵塞等待;