使用java实现银行家算法
银行家算法核心
先寻找满足系统当前剩余的资源量(avaliable)>=进程运行所需的资源数的进程(need),再假设这个进程安全校验是成功的,当这个进程运行完毕后,释放资源后,现在系统当前剩余的资源(avaliable)=avaliable+该线程之前已分配的资源(allocation),将该节点进程设为处理时忽略进程,再以上条件为前提进行安全校验。
安全校验:一个进程获得资源后,运行完毕,释放之前分配的资源,其他的线程可以继续运行,而不会造成死锁。
这样就会产生回溯。
满足条件:是否存在一个进程运行所需的资源数<=当前系统剩余的资源数。
查找操作:先判断回溯的步长(层数)是否等于节点的个数,如果等于说明已经找到了正确路径,返回真给上一层,如果不满足,则看一下此层是否存在满足条件的节点,如果存在,这一该节点为回溯点开始查找操作。如果都不存在,说明上一层的回溯点不是我们要找的节点,返回假给上一层,并回溯回到上一层节点,将忽略标记清楚,换另一个满足条件的节点继续在进行查找操作。
先以一个满足条件的节点进行忽略标记(下一次查找时可忽略此节点),回溯的步长加一,再进行查找操作(下一层)。
importjava.util.Arrays; publicclassBanksTest{ //用于存储预操作后的资源变化 staticint[]new_Avaliable=null; //用于存储预操作的完成度 staticboolean[]new_finish=null; //用于保存最终的进程执行顺序,初始化为非法进程-1 staticintright[]={-1,-1,-1,-1,-1}; publicstaticvoidmain(String[]args){ //最大需求量 int[][]max={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; //当前系统可用资源量 int[]avaliable={3,3,2}; //每个进程运行还需资源量 int[][]need=newint[5][3]; //每个进程已分配的资源量 int[][]allocation={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; //用于第一深度预判的初始化 booleanfinish[]={false,false,false,false,false}; //获取每个进程运行时还需的资源量 for(inti=0;iavaliable[j]){ break; } } //不满足则处理下一个节点进程 if(j 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。