-
什么是死锁
- 在并发环境下,各进程因竞争资源而造成的一种互相等待对方资源,导致各进程都阻塞,都无法向前推进的现象。
- 发生死锁后,若无外力干涉,这些进程都将无法向前推进。
-
进程死锁、饥饿、死循环的区别
- 死锁:各进程互相等待对方手里的资源,导致各进程阻塞,都无法向前推进的现象。
- 饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。
- 死循环:某进程执行过程中一直跳不出某个循环的现象。
共同点 区别 死锁 进程无法顺利向前推进 至少有两个或两个以上的进程同时发生死锁。发生死锁的进程一定处于阻塞态 饥饿 进程无法顺利向前推进 可能只有一个进程发生饥饿。既可能是阻塞态(得不到I/O设备),也可能是就绪态(得不到处理机) 死循环 进程无法顺利向前推进 可能只有一个进程发生死循环。可以是运行态。死锁和饥饿是管理者(操作系统)的问题,死循环是被管理者的问题。 -
死锁产生的必要条件
- 互斥条件:只有对互斥使用的资源的竞争才会导致死锁。
- 不剥夺条件:进程获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
- 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占用,此时请求进程被阻塞,但又对自己已有的资源保持不放。
- 循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程以获得的资源同时被下一个进程所请求。
- 注意:发生死锁时一定有循环等待,但是发生循环等待时未必死锁。
-
死锁的处理策略
-
预防死锁:破坏死锁产生的四个必要条件中的一个或几个。
- 破坏互斥条件:把只能互斥使用的资源改造成允许共享使用。但是很多时候都无法破坏互斥条件。
- 破坏不剥夺条件:
- 方案一:当某个进程请求新的资源得不到满足时,它必须立即释放保持的所有资源,待以后需要时再重新申请。
- 方案二:当某个进程需要的资源被其他进程占用的时候,可以由操作系统协助,将想要的资源强行剥夺。
- 缺点:实现起来比较复杂;释放已经获得的资源会造成前一阶段工作的失效;反复申请和释放资源会增加系统开销,降低系统吞吐量。
- 破坏请求和保持条件:
- 采用静态分配方法:即进程在运行前一次申请完它所需要的全部资源,在它的资源为满足前,不让它投入运行。
- 缺点:资源利用率低;也有可能导致某些进程饥饿。
- 破坏循环等待条件:
- 采用顺序资源分配:首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源。
- 缺点:不方便增加新设备(需要重新分配所有的编号);浪费资源(使用资源的顺序和编号递增的顺序不一致)。
-
避免死锁:用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)。
- 安全序列:指如果系统按照这种序列分配资源,则每个进程都能顺利完成。(安全序列可能有多个)
- 不安全状态:系统找不出任何一个安全序列。如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态。
- 银行家算法:在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。
-
死锁的检测和解除:允许死锁的发生,操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁。
- 死锁的检测
- 用某种数据结构来保存资源的请求和分配信息
- 提供一种算法,利用上述信息来检测系统是否已进入死锁状态
- 死锁的解除
- 资源剥夺法:挂起某些死锁进程,并抢夺它的资源,将这些资源分配给其他的死锁进程。
- 撤销进程法:强制撤销部分甚至全部死锁进程,并剥夺这些进程的资源。
- 进程回退法:让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。
- 死锁的检测
-
-
数据库系统中如何解决死锁
- 查出线程杀死
- 设置锁的超时时间
- 指定获取锁的顺序