什么是死锁
- 定义:
- 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
- 此时称系统处于死锁状态,而这些永远在互相等待的进程称为死锁进程。
死锁产生的条件
死锁的出现必须同时满足以下四个条件,缺一不可。
- 互斥:所谓互斥就是进程在某一时间内独占资源(更准确得说,对于某个资源访问有限制。若资源数量有限,也有可能产生死锁)。
- 请求与保持:已经持有某一资源的进程不必释放当前拥有的资源,就可以申请并获得更多的资源。
- 不可剥夺:进程已获得资源,在末使用完之前,不能强行剥夺。
- 循环等待:若干进程之间形成一种头尾相接的循环等待资源关系,每个进程都在等待循环链中另一进程持有的资源。
死锁的预防
既然死锁的出现需要同时依赖上述四个条件,那么我们只需要打破其中任意一个或多个条件就可以成功预防死锁了。
打破互斥条件。
- 即允许进程同时访问某些资源。
- 但是,有的资源是不允许被同时访问的,像打印机等等,这是由资源本身的属性所决定的。所以,这种办法并无实用价值。
打破请求与保持条件
- 进程在运行前一次性地向系统申请它所需要的全部资源。
- 如果某个进程所需的全部资源得不到满足,则不分配任何资源,此进程暂不运行。只有当系统能够满足当前进程的全部资源需求时,才一次性地将所申请的资源全部分配给该进程。
- 由于运行的进程已占有了它所需的全部资源,所以不会发生占有资源又申请资源的现象,因此不会发生死锁。
打破不可剥夺条件
- 允许进程强行从占有者那里夺取某些资源。
- 当一个进程已占有了某些资源,它又申请新的资源,但不能立即被满足时,它必须释放所占有的全部资源,以后再重新申请。它所释放的资源可以分配给其它进程。这就相当于该进程占有的资源被隐蔽地强占了。这种预防死锁的方法实现起来困难,会降低系统性能。
打破循环等待条件
- 前面三种预防策略都很棘手,所以大部分预防死锁的算法都把重心放在这里。
- 为预防循环等待条件的出现,可以实行资源有序分配策略。采用这种策略,即把资源事先分类编号,按号分配,使进程在申请,占用资源时不会形成循环链。所有进程对资源的请求必须严格按资源序号递增的顺序提出。进程占用了小号资源,才能申请大号资源,就不会产生循环链,从而预防了死锁。