操作系统------银行家算法(C语言)

(1)基本概念

    死锁:多个进程在执行过程中,因为竞争资源会造成相互等待的局面。如果没有外力作用,这些进程将永远无法向前推进。此时称系统处于死锁状态或者系统产生了死锁。

    安全序列:系统按某种顺序并发进程,并使它们都能达到获得最大资源而顺序完成的序列为安全序列。

    安全状态:能找到安全序列的状态称为安全状态,安全状态不会导致死锁。

    不安全状态:在当前状态下不存在安全序列,则系统处于不安全状态。

 (2)银行家算法

    银行家算法顾名思义是来源于银行的借贷业务,一定数量的本金要满足多个客户的借贷周转,为了防止银行家资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。

在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其它进程使用资源。如果资源分配不当,就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。

    当一进程提出资源申请时,银行家算法执行下列步骤以决定是否向其分配资源:

    1)检查该进程所需要的资源是否已超过它所宣布的最大值。

    2)检查系统当前是否有足够资源满足该进程的请求。

    3)系统试探着将资源分配给该进程,得到一个新状态。

    4)执行安全性算法,若该新状态是安全的,则分配完成;若新状态是不安全的,则恢复原状态,阻塞该进程。

(3)算法代码

银行家算法中的进程: 
包含进程Pi的需求资源数量(也是最大需求资源数量,MAX) 
已分配给该进程的资源A(Allocation) 
还需要的资源数量N(Need=M-A)

Available为空闲资源数量,即资源池(注意:资源池的剩余资源数量+已分配给所有进程的资源数量=系统中的资源总量)

程序需要的头文件:

#include "stdio.h"

#include "math.h"

 

程序定义的数组:

 ALL_RESOURCE[3]  //各种资源的数目总和

MAX[5][3]           //M个进程对N类资源最大资源需求量

AVAILABLE[3]       //系统可用资源数

ALLOCATION[5][3]   //M个进程已经得到N类资源的资源量

NEED[5][3]          //M个进程还需要N类资源的资源量

Request[20]          //请求资源个数

 

程序定义的方法:

showdata()        //函数showdata,输出资源分配情况

changdata(int k)    //分配资源

rstordata(int k)     //恢复现场

check(int s)       //函数check,检查是否安全

bank()           //银行家算法主体

#include "stdio.h"
#include "math.h"
#define FALSE 0
#define TRUE 1

int M=5 ; //总进程数
int N=3 ; //资源种类
int ALL_RESOURCE[3]={10,5,7};//各种资源的数目总和
int MAX[5][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; //M个进程对N类资源最大资源需求量
int AVAILABLE[3]={4,4,4}; //系统可用资源数
int ALLOCATION[5][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; //M个进程已经得到N类资源的资源量
int NEED[5][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}}; //M个进程还需要N类资源的资源量
int Request[20]; //请求资源个数

void showdata() //函数showdata,输出资源分配情况
{
   int i,j;

   printf(" 各进程已经得到的资源量(allocation): \n");
   printf("\t资源0 \t资源1\t 资源2 \n");
   for (i=0;i<M;i++)
   {
	 printf("进程p%d: ",i);

     for (j=0;j<N;j++)
		printf("  %d\t",ALLOCATION[i][j]);
	 printf("\n");
   }
	printf("\n");
	printf("各进程还需要的资源量(need): \n");
    printf("\t资源0 \t资源1\t 资源2\n");
   for (i=0;i<M;i++)
   {
	 printf("进程p%d: ",i);
     for (j=0;j<N;j++)   
		 printf("  %d\t",NEED[i][j]);
     printf("\n");
   }
   printf("\n");
}

void changdata(int k) //分配资源
{
   int j;
   for (j=0;j<N;j++)
   {
     AVAILABLE[j]=AVAILABLE[j]-Request[j];
     ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
     NEED[k][j]=NEED[k][j]-Request[j];
   }
}

void rstordata(int k) //恢复现场
{
   int j;
   for (j=0;j<N;j++)
   { AVAILABLE[j]=AVAILABLE[j]+Request[j];
     ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
     NEED[k][j]=NEED[k][j]+Request[j];
   }
}

int check(int s) //函数check,检查是否安全
{ int WORK,FINISH[10];
    int i,j,k=0;
    for(i=0;i<M;i++)FINISH[i]=FALSE;
    for(j=0;j<N;j++)
     {
		WORK=AVAILABLE[j];
        i=s;
        do
        {
			if(FINISH[i]==FALSE&&NEED[i][j]<=WORK)
            {
               WORK=WORK+ALLOCATION[i][j];
               FINISH[i]=TRUE;
               i=0;
            }
			else
            { 
				i++;
			}
        }while(i<M);
        for(i=0;i<M;i++)
			if(FINISH[i]==FALSE)
			{
				printf("\n您输入有误!请重新输入!\n");
				return 1;
			}
     }
	printf("批准请求,资源已分配!\n");

    return 0;
}

void bank()   //银行家算法主体
{
	int i=0,j=0,flag,k=0;
	while(k==0)
	{
		flag=0;
		showdata();
		i=-1;
		while(i<0||i>=M)
		{
			printf(" 请输入需申请资源的进程号(从P0到P%d,否则重输入!): P",M-1);
			scanf("%d",&i);
			if(i<0||i>=M)
			printf(" 输入的进程号不存在,重新输入!");
		}
		printf("\n请输入进程P%d申请的资源数:",i);
		 for (j=0;j<N;j++)
		 {
			printf("\n资源%d:",j);
			scanf("%d",&Request[j]);
			if(Request[j]>NEED[i][j]) //若请求的资源数大于进程还需要i类资源的资源量j
			{
				 printf("进程P%d申请的资源数大于进程P%d还需要类资源的资源量!\n",i,i,j);
				 printf("申请不合理,出错!请重新选择!\n");
				 flag=1; break;
			}

			if(Request[j]>AVAILABLE[j]) //若请求的资源数大于可用资源数
			{
				printf("进程P%d申请的资源数大于系统可用%d类资源的资源量!\n",i,j);
				printf("申请不合理,出错!请重新选择!\n");
				flag=1; break;
			}
		 }
		 if(flag==0)
		 {
			changdata(i); //调用changdata(i)函数,改变资源数
			printf("系统目前各种资源可用的数为(available): \n[");
			   for (j=0;j<N;j++)
				  {  printf("%d  ",AVAILABLE[j]); }
			   printf("]\n\n");  

			if(check(i)) //若系统安全
			{
				rstordata(i); //调用rstordata(i)函数,恢复资源数
				showdata();   //输出资源分配情况
			}
			else       //若系统不安全
				showdata(); //输出资源分配情况
		 }
		 printf("\n");
		 printf("是否继续,继续请按0,结束请按1:\t");
		 scanf("%d",&k);
	}         
}

int main()
{
	int i,j;
	printf("各种资源的总数量(all): \n[");
   for (j=0;j<N;j++)
   {  printf("%d  ",ALL_RESOURCE[j]); }
   printf("]\n\n");

   printf("系统目前各种资源可用的数为(available): \n[");
   for (j=0;j<N;j++)
      {  printf("%d  ",AVAILABLE[j]); }
   printf("]\n\n");  
	
   printf("进程最大资源需求量(MAX): \n");
   for (i=0;i<M;i++)
   {
	  printf("进程P%d  ",i);
	  for(j=0;j<N;j++)
      {  printf("%d  ",MAX[i][j]); 
	  
	  }
	  printf("\n");
	}
	printf("\n");
	bank();     
	
}

 

 

转载于:https://www.cnblogs.com/951201193-wzc/p/10294933.html

操作系统课的实验(银行家算法)#include "malloc.h"   #include "stdio.h"   #include "stdlib.h"   #define alloclen sizeof(struct allocation)   #define maxlen sizeof(struct max)   #define avalen sizeof(struct available)   #define needlen sizeof(struct need)   #define finilen sizeof(struct finish)   #define pathlen sizeof(struct path)   struct allocation   {   int value;   struct allocation *next;   };   struct max   {   int value;   struct max *next;   };   struct available /*可用资源数*/   {   int value;   struct available *next;   };   struct need /*需求资源数*/   {   int value;   struct need *next;   };   struct path   {   int value;   struct path *next;   };   struct finish   {   int stat;   struct finish *next;   };   int main()   {   int row,colum,status=0,i,j,t,temp,processtest;   struct allocation *allochead,*alloc1,*alloc2,*alloctemp;   struct max *maxhead,*maxium1,*maxium2,*maxtemp;   struct available *avahead,*available1,*available2,*workhead,*work1,*work2,*worktemp,*worktemp1;   struct need *needhead,*need1,*need2,*needtemp;   struct finish *finihead,*finish1,*finish2,*finishtemp;   struct path *pathhead,*path1,*path2;   printf("\n请输入系统资源的种类数:");   scanf("%d",&colum);   printf("请输入现时内存中的进程数:");   scanf("%d",&row);   printf("请输入已分配资源矩阵:\n");   for(i=0;i<row;i++)   {   for (j=0;jnext=alloc2->next=NULL;   scanf("%d",&allochead->value);   status++;   }   else   {   alloc2=(struct allocation *)malloc(alloclen);   scanf("%d,%d",&alloc2->value);   if(status==1)   {   allochead->next=alloc2;   status++;   }   alloc1->next=alloc2;   alloc1=alloc2;   }   }   }   alloc2->next=NULL;   status=0;   printf("请输入最大需求矩阵:\n");   for(i=0;i<row;i++)   {   for (j=0;jnext=maxium2->next=NULL;   scanf("%d",&maxium1->value);   status++;   }   else   {   maxium2=(struct max *)malloc(maxlen);   scanf("%d,%d",&maxium2->value);   if(status==1)   {   maxhead->next=maxium2;   status++;   }   maxium1->next=maxium2;   maxium1=maxium2;   }   }   }   maxium2->next=NULL;   status=0;   printf("请输入现时系统剩余的资源矩阵:\n");   for (j=0;jnext=available2->next=NULL;   work1->next=work2->next=NULL;   scanf("%d",&available1->value);   work1->value=available1->value;   status++;   }   else   {   available2=(struct available*)malloc(avalen);   work2=(struct available*)malloc(avalen);   scanf("%d,%d",&available2->value);   work2->value=available2->value;   if(status==1)   {   avahead->next=available2;   workhead->next=work2;   status++;   }   available1->next=available2;   available1=available2;   work1->next=work2;   work1=work2;   }   }   available2->next=NULL;   work2->next=NULL;   status=0;   alloctemp=allochead;   maxtemp=maxhead;   for(i=0;i<row;i++)   for (j=0;jnext=need2->next=NULL;   need1->value=maxtemp->value-alloctemp->value;   status++;   }   else   {   need2=(struct need *)malloc(needlen);   need2->value=(maxtemp->value)-(alloctemp->value);   if(status==1)   {   needhead->next=need2;   status++;   }   need1->next=need2;   need1=need2;   }   maxtemp=maxtemp->next;   alloctemp=alloctemp->next;   }   need2->next=NULL;   status=0;   for(i=0;inext=finish2->next=NULL;   finish1->stat=0;   status++;   }   else   {   finish2=(struct finish*)malloc(finilen);   finish2->stat=0;   if(status==1)   {   finihead->next=finish2;   status++;   }   finish1->next=finish2;   finish1=finish2;   }   }   finish2->next=NULL; /*Initialization compleated*/   status=0;   processtest=0;   for(temp=0;temp<row;temp++)   {   alloctemp=allochead;   needtemp=needhead;   finishtemp=finihead;   worktemp=workhead;   for(i=0;istat==0)   {   for(j=0;jnext,worktemp=worktemp->next)   if(needtemp->valuevalue)   processtest++;   if(processtest==colum)   {   for(j=0;jvalue+=alloctemp->value;   worktemp1=worktemp1->next;   alloctemp=alloctemp->next;   }   if(status==0)   {   pathhead=path1=path2=(struct path*)malloc(pathlen);   path1->next=path2->next=NULL;   path1->value=i;   status++;   }   else   {   path2=(struct path*)malloc(pathlen);   path2->value=i;   if(status==1)   {   pathhead->next=path2;   status++;   }   path1->next=path2;   path1=path2;   }   finishtemp->stat=1;   }   else   {   for(t=0;tnext;   finishtemp->stat=0;   }   }   else   for(t=0;tnext;   alloctemp=alloctemp->next;   }   processtest=0;   worktemp=workhead;   finishtemp=finishtemp->next;   }   }   path2->next=NULL;   finishtemp=finihead;   for(temp=0;tempstat==0)   {   printf("\n系统处于非安全状态!\n");   exit(0);   }   finishtemp=finishtemp->next;   }   printf("\n系统处于安全状态.\n");   printf("\n安全序列为: \n");   do   {   printf("p%d ",pathhead->value);   }   while(pathhead=pathhead->next);   printf("\n");   return 0;   } #include "string.h" #include #include #define M 5 #define N 3 #define FALSE 0 #define TRUE 1 /*M个进程对N类资源最大资源需求量*/ int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; /*系统可用资源数*/ int AVAILABLE[N]={10,5,7}; /*M个进程对N类资源最大资源需求量*/ int ALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; /*M个进程已经得到N类资源的资源量 */ int NEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; /*M个进程还需要N类资源的资源量*/ int Request[N]={0,0,0}; void main() { int i=0,j=0; char flag='Y'; void showdata(); void changdata(int); void rstordata(int); int chkerr(int); showdata(); while(flag=='Y'||flag=='y') { i=-1; while(i=M) { printf("请输入需申请资源的进程号(从0到"); printf("%d",M-1); printf(",否则重输入!):"); scanf("%d",&i); if(i=M)printf("输入的进程号不存在,重新输入!\n"); } printf("请输入进程"); printf("%d",i); printf("申请的资源数\n"); for (j=0;jNEED[i][j]) { printf("进程"); printf("%d",i); printf("申请的资源数大于进程"); printf("%d",i); printf("还需要"); printf("%d",j); printf("类资源的资源量!申请不合理,出错!请重新选择!\n"); /*printf("申请不合理,出错!请重新选择!\n");*/ flag='N'; break; } else { if(Request[j]>AVAILABLE[j]) { printf("进程"); printf("%d",i); printf("申请的资源数大于系统可用"); printf("%d",j); printf("类资源的资源量!申请不合理,出错!请重新选择!\n"); /*printf("申请不合理,出错!请重新选择!\n");*/ flag='N'; break; } } } if(flag=='Y'||flag=='y') { changdata(i); if(chkerr(i)) { rstordata(i); showdata(); } else showdata(); } else showdata(); printf("\n"); printf("是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: "); scanf("%c",&flag); } } void showdata() { int i,j; printf("系统可用的资源数为:\n"); printf(" "); for (j=0;j<N;j++){ printf(" 资源"); printf("%d",j); printf(":"); printf("%d",AVAILABLE[j]); /*printf("\n");*/ /* cout<<endl; // cout<<"各进程资源的最大需求量:"<<endl<<endl; // for (i=0;i<M;i++) // { // cout<<"进程"<<i<<":"; // for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<MAX[i][j]; // cout<<endl; */ } printf("\n"); printf("各进程还需要的资源量:\n"); for (i=0;i<M;i++) { printf(" 进程"); printf("%d",i); printf(":"); for (j=0;j<N;j++){ printf("资源"); printf("%d",j); printf(":"); printf("%d",NEED[i][j]); /*printf("\n");*/ } printf("\n"); } printf("各进程已经得到的资源量: \n"); for (i=0;i<M;i++) { printf(" 进程"); printf("%d",i); /*printf(":\n");*/ for (j=0;j<N;j++){ printf("资源"); printf("%d",j); printf(":"); printf("%d",ALLOCATION[i][j]); /*printf("\n");*/ } printf("\n"); } } void changdata(int k) { int j; for (j=0;j<N;j++) { AVAILABLE[j]=AVAILABLE[j]-Request[j]; ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j]; NEED[k][j]=NEED[k][j]-Request[j]; } }; void rstordata(int k) { int j; for (j=0;j<N;j++) { AVAILABLE[j]=AVAILABLE[j]+Request[j]; ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j]; NEED[k][j]=NEED[k][j]+Request[j]; } }; int chkerr(int s) { int WORK,FINISH[M],temp[M]; int i,j,k=0; for(i=0;i<M;i++)FINISH[i]=FALSE; for(j=0;j<N;j++) { WORK=AVAILABLE[j]; i=s; while(i<M) { if (FINISH[i]==FALSE&&NEED[i][j]<=WORK) { WORK=WORK+ALLOCATION[i][j]; FINISH[i]=TRUE; temp[k]=i; k++; i=0; } else { i++; } } for(i=0;i<M;i++) if(FINISH[i]==FALSE) { printf("\n"); printf("系统不安全!!! 本次资源申请不成功!!!\n"); printf("\n"); return 1; } } printf("\n"); printf("经安全性检查,系统安全,本次分配成功。\n"); printf("\n"); printf(" 本次安全序列:"); for(i=0;i"); } printf("\n"); return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值