什么是安全序列
所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。
如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也就有可能重新回到安全状态,不过我们在分配资源之前总是要考虑到最坏的情况。
如果系统处于安全状态,就一定不会发生死锁。如果系统进入了不安全状态,就可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)
因此可以在资源分配之前预先预判这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是"银行家算法"的核心思想。
银行家算法
银行家算法是荷兰学者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种资源
每个进程在运行前先声明对各种资源地最大需求