银行家算法的全过程

董新尧 2024-11-15 20:34:02
最佳回答
算法的实现初始化  由用户输入数据,分别对可利用资源向量矩阵**ailable、最大需求矩阵max、分配矩阵allocation、需求矩阵need赋值。银行家算法  在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。   银行家算法的基本思想是分配兹源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。   设进程cusneed提出请求request [i],则银行家算法按如下规则进行判断。   (1)如果request [cusneed] [i]<= need[cusneed][i],则转(2);否则,出错。   (2)如果request [cusneed] [i]<= **ailable[cusneed][i],则转(3);否则,出错。   (3)系统试探分配兹源,修改相关数据:   **ailable[i]-=request[cusneed][i];   allocation[cusneed][i]+=request[cusneed][i];   need[cusneed][i]-=request[cusneed][i];   (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。安全性检查算法  (1)设置两个工作向量work=**ailable;fin**h   (2)从进程集合中找到一个满足下述条件的进程,   fin**h==false;   need<=work;   如找到,执行(3);否则,执行(4)   (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。   work+=allocation;   fin**h=true;   goto 2   (4)如所有的进程fin**h= true,则表示安全;否则系统不安全。编辑本段算法(c++实现)  #include<iostream>   using namespace std;   #include<string.h>   #include<stdio.h>   #define false 0   #define true 1   int max[100][100]={0};//各进程所需各类资源的最大需求   int **aliable[100]={0};//系统可用资源   char name[100]={0};//资源的名称   int allocation[100][100]={0};//系统已分配兹源   int need[100][100]={0};//还需要资源   int request[100]={0};//请求资源向量   int temp[100]={0};//存放安全序列   int work[100]={0};//存放系统可提供资源   int m=100;//作业的最大数为100   int n=100;//资源的最大数为100   void showdata()//显示资源矩阵   {   int i,j;   cout<<"系统目前可用的资源[**aliable]:"<<endl;   for(i=0;i<n;i++)cout<<name[i]<<" ";   cout<<endl;   for (j=0;j<n;j++)cout<<**aliable[j]<<" ";//输出分配兹源   cout<<endl;   cout<<" max allocation need"<<endl;   cout<<"进程名 ";   for(j=0;j<3;j++){   for(i=0;i<n;i++)cout<<name[i]<<" ";   cout<<" ";   }   cout<<endl;   for(i=0;i<m;i++){   cout<<" "<<i<<" ";   for(j=0;j<n;j++)cout<<max[i][j]<<" ";   cout<<" ";   for(j=0;j<n;j++)cout<<allocation[i][j]<<" ";   cout<<" ";   for(j=0;j<n;j++)cout<<need[i][j]<<" ";   cout<<endl;   }   }   int changdata(int i)//进行资源分配   {   int j;   for (j=0;j<m;j++) {   **aliable[j]=**aliable[j]-request[j];   allocation[i][j]=allocation[i][j]+request[j];   need[i][j]=need[i][j]-request[j];   }   return 1;   }   int safe()//安全性算法   {   int i,k=0,m,apply,fin**h[100]={0};   int j;   int flag=0;   work[0]=**aliable[0];   work[1]=**aliable[1];   work[2]=**aliable[2];   for(i=0;i<m;i++){   apply=0;   for(j=0;j<n;j++){   if (fin**h[i]==false&&need[i][j]<=work[j]){   apply++;   if(apply==n){   for(m=0;m<n;m++)work[m]=work[m]+allocation[i][m];//变分配数   fin**h[i]=true;   temp[k]=i;i=-1;   k++;flag++;   }   }   }   }   for(i=0;i<m;i++){   if(fin**h[i]==false){   cout<<"系统不安全"<<endl;//不成功系统不安全   return -1;   }   }   cout<<"系统是安全的!"<<endl;//如果安全,输出成功   cout<<"分配的序列:";   for(i=0;i<m;i++){//输出运行进程数组   cout<<temp[i];   if(i<m-1) cout<<"->";   }   cout<<endl;   return 0;   }   void share()//利用银行家算法对申请资源对进行判定   {   char ch;   int i=0,j=0;   ch='y';   cout<<"请输入要求分配的资源进程号(0-"<<m-1<<"):";   cin>>i;//输入须申请的资源号   cout<<"请输入进程 "<<i<<" 申请的资源:"<<endl;   for(j=0;j<n;j++){   cout<<name[j]<<":";   cin>>request[j];//输入需要申请的资源   }   for (j=0;j<n;j++){   if(request[j]>need[i][j])//判断申请是否大于需求,若大于则出错   {   cout<<"进程 "<<i<<"申请的资源大于它需要的资源";   cout<<" 分配不合理,不予分配!"<<endl;   ch='n';   break;   }   else {   if(request[j]>**aliable[j])//判断申请是否大于当前资源,若大于则   {   //出错   cout<<"进程"<<i<<"申请的资源大于系统现在可利用的资源";   cout<<" 分配出错,不予分配!"<<endl;   ch='n';   break;   }   }   }   if(ch=='y') {   changdata(i);//根据进程需求量变换资源   showdata();//根据进程需求量显示变换后的资源   safe();//根据进程需求量进行银行家算法判断   }   }   void addresources(){//添加资源   int n,flag;   cout<<"请输入需要添加资源种类的数量:";   cin>>n;   flag=n;   n=n+n;   for(int i=0;i<n;i++){   cout<<"名称:";   cin>>name[flag];   cout<<"数量:";   cin>>**aliable[flag++];   }   showdata();   safe();   }   void delresources(){//删除资源   char ming;   int i,flag=1;   cout<<"请输入需要删除的资源名称:";   do{   cin>>ming;   for(i=0;i<n;i++)   if(ming==name[i]){   flag=0;   break;   }   if(i==n)   cout<<"该资源名称不存在,请重新输入:";   }   while(flag);   for(int j=i;j<n-1;j++){   name[j]=name[j+1];   **aliable[j]=**aliable[j+1];   }   n=n-1;   showdata();   safe();   }   void changeresources(){//修改资源函数   cout<<"系统目前可用的资源[**aliable]:"<<endl;   for(int i=0;i<n;i++)   cout<<name[i]<<":"<<**aliable[i]<<endl;   cout<<"输入系统可用资源[**aliable]:"<<endl;   cin>>**aliable[0]>>**aliable[1]>>**aliable[2];   cout<<"经修改后的系统可用资源为"<<endl;   for (int k=0;k<n;k++)   cout<<name[k]<<":"<<**aliable[k]<<endl;   showdata();   safe();   }   void addprocess(){//添加作业   int flag=m;   m=m+1;   cout<<"请输入该作业的最打需求量[max]"<<endl;   for(int i=0;i<n;i++){   cout<<name[i]<<":";   cin>>max[flag][i];   need[flag][i]=max[flag][i]-allocation[flag][i];   }   showdata();   safe();   }   int main()//主函数   {   int i,j,number,choice,m,n,flag;   char ming;   cout<<"*****************资源管理系统的设计与实现*****************"<<endl;   cout<<"请首先输入系统可供资源种类的数量:";   cin>>n;   n=n;   for(i=0;i<n;i++){   cout<<"资源"<<i+1<<"的名称:";   cin>>ming;   name[i]=ming;   cout<<"资源的数量:";   cin>>number;   **aliable[i]=number;   }   cout<<endl;   cout<<"请输入作业的数量:";   cin>>m;   m=m;   cout<<"请输入各进程的最大需求量("<<m<<"*"<<n<<"矩阵)[max]:"<<endl;   for(i=0;i<m;i++)   for(j=0;j<n;j++)   cin>>max[i][j];   do{   flag=0;   cout<<"请输入各进程已经申请的资源量("<<m<<"*"<<n<<"矩阵)[allocation]:"<<endl;   for(i=0;i<m;i++)   for(j=0;j<n;j++){   cin>>allocation[i][j];   if(allocation[i][j]>max[i][j])   flag=1;   need[i][j]=max[i][j]-allocation[i][j];   }   if(flag)   cout<<"申请的资源大于最大需求量,请重新输入!\n";   }   while(flag);   showdata();//显示各种资源   safe();//用银行家算法判定系统是否安全   while(true){   cout<<"**************银行家算法演示***************"<<endl;   cout<<" 1:增加资源 "<<endl;   cout<<" 2:删除资源 "<<endl;   cout<<" 3:修改资源 "<<endl;   cout<<" 4:分配兹源 "<<endl;   cout<<" 5:增加作业 "<<endl;   cout<<" 0:离开 "<<endl;   cout<<"*******************************************"<<endl;   cout<<"请选择功能号:";   cin>>choice;   switch(choice){   case 1: addresources();break;   case 2: delresources();break;   case 3: changeresources();break;   case 4: share();break;   case 5: addprocess();break;   case 0: choice=0;break;   default: cout<<"请正确选择功能号(0-5)!"<<endl;break;   }   }   return 1;   } 20210311
汇率兑换计算器

类似问答
  • 请问招行全币**刷港币结算的过程是怎样的?
    • 2024-11-15 17:49:38
    • 提问者: 未知
    您好,若您持有的我行**,卡面有v**a、mastercard、jcb或美**通标识,即可境外(含港澳台)使用(包括网上支付)。**境外通过国际线路的消费都会以美元结算,如果消费金额为非美元,会产生两种货币间的兑换费用,为交易金额的1.5%。如果消费金额为美元,则不会产生结汇手续费
  • 简述银行家算法。
    • 2024-11-15 03:33:44
    • 提问者: 未知
    参**:解析:操作系统按银行家制定的规则为进程分配兹源,可以使系统保持在安全状态,具体方法如下:①进程首次申请资源的分配。如果系统现存资源可以满足该进程的最大...
  • 关于银行家算法的一个问题:安全序列是唯一的么?
    • 2024-11-15 20:11:46
    • 提问者: 未知
    安全序列必须不唯一,对于银行家算法先用安全性算法试判断,所有值进程为true即可实现 lz可以翻翻教材
  • 你见过最差的算法工程师能差到什么程度?
    • 2024-11-15 23:18:01
    • 提问者: 未知
    文字检测中,pixellink为何要引入link?ocr中,crnn为何要引入一个rnn?机器学习系统中,lightgbm是如何针对xgboost存在的...并行计算比较cool,老老实实写那个过程太boring。...
  • 包商银行**提额的全过程
    • 2024-11-15 09:33:51
    • 提问者: 未知
    有很多卡友们都对包商银行**提额全过程的问题有疑惑,那么今天我爱卡小编就给卡友们说一下,以下是关于包商银行信用...2、在满足以上条件后的提额方法:(1)包商银行自动为你...
  • 密码学中的rsa算法和椭圆曲线算法的加密过程是怎样的?
    • 2024-11-15 23:23:01
    • 提问者: 未知
    以上算法和图片引自 understanding cryptography by c.paar, p=(x1,y1),q=...上图引自 http://www. uam.es/personal_pdi/cie ncias/fchamizo/asignaturas/cripto1011/ecc.pdf ...
  • 求**的过程
    • 2024-11-15 23:16:41
    • 提问者: 未知
    带自己的**去银行,到银行填张单子,在取票排队
  • 仲裁过程中的财产保全由哪个**执行
    • 2024-11-15 07:49:10
    • 提问者: 未知
    一、仲裁过程中的财产保全由什么**执行虽然当事人的财产保全申请是向仲裁委员会提出的,但仲裁委员会无权对公民、法人或者其他组织的财产采取强制措施。仲裁委员会只能将当事人的申请提交人民...
  • 上市公司发行股票的全过程
    • 2024-11-15 17:10:26
    • 提问者: 未知
    上市公司发行股票的全过程:股票在上市发行前,上市公司与股票的代理发行证券商签定代理发行合同,确定股票发行的方式,明确各方面的责任。股票代理发行的方式按发行承担的风险不同,一般分为包销发行方式和代理发行方式两种。一、包销发行是由代理股票发行的证券商一次性将上市公司所新发行的全部或部分股票承购下来,并垫支相当股票发行价格的全部资本。由于金融机构一般都有较雄厚的资金,可以预先垫支,以满足上市公司急需大量...
  • 新股发行的全过程
    • 2024-11-15 16:55:14
    • 提问者: 未知
    比如 一只新的股票要上市 要经历哪些阶段啊?2。要申购一只新股要怎么申购呢?除了网上申购 还有没有别的新股申购方式?3。网上申购具体又怎么...3、通常的发行与特别的发行 ...
汇率兑换计算器

热门推荐
热门问答
最新问答
推荐问答
新手帮助
常见问题
房贷计算器-九子财经 | 备案号: 桂ICP备19010581号-1 商务联系 企鹅:2790-680461

特别声明:本网为公益网站,人人都可发布,所有内容为会员自行上传发布",本站不承担任何法律责任,如内容有该作者著作权或违规内容,请联系我们清空删除。