死锁的处理策略——避免死锁

什么是安全序列

所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。

如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也就有可能重新回到安全状态,不过我们在分配资源之前总是要考虑到最坏的情况。

如果系统处于安全状态,就一定不会发生死锁。如果系统进入了不安全状态,就可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)

因此可以在资源分配之前预先预判这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是"银行家算法"的核心思想。

银行家算法

银行家算法是荷兰学者Dijkstra为银行系统设计的,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。后来该算法被用在操作系统中,用于避免死锁。

核心思想:在进程提出资源申请时,先预判此处分配是否会导致系统进入不安全状态。如果会进入不安全状态,就暂时不答应这次请求,让线程先阻塞等待。

比如:系统中有5个进程P0~04,3种资源R0~R2,初始数量为(10,5,7),则某一时刻的情况可表示如下:

 

此时系统是否处于安全状态?

思路:尝试找出一个安全序列,依次检查剩余可用资源(3,3,2)是否能满足各进程的需求。

比如如果优先把资源分配给P1,那P1一定是可以顺利执行结束的。等P1结束了就归还资源。于是资源数就可以增加到(2,0,0)+(3,3,2)=(5,3,2)

将P1加入安全序列,并更新剩余可用资源值为(5,3,2)

依次检查剩余可用资源(5,3,2)是否满足剩余进程(不包括已加入安全序列的进程)的需求

可满足P3需求,将P3加入安全序列。并更新剩余进程(不包括已加入安全序列的进程)的需求

以此类推,共五次循环检查即可将5个进程都加入安全序列中,最终可得到一个安全序列。

说明此时系统处于安全状态,暂不可能发生死锁。

该算法称为安全性算法。可以很方便地用代码实现以上流程,每一轮检查都从编号较小地进程开始检查。

分析

假设系统中有n个进程,m种资源

每个进程在运行前先声明对各种资源地最大需求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值