⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 banker.c

📁 操作系统中的银行家算法 C语言实现 VC6.0编译
💻 C
字号:
#include<stdio.h>
#include <string.h>
#define RES 3
#define PRO 5
int Security();
int rqt[PRO][RES];
int mx[PRO][RES]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int alloc[PRO][RES]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
int avl[RES]={3,3,2};
int ned[PRO][RES]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
int Work[RES];                          /*工作数组*/
int tempWork[PRO][RES];
int Finish[PRO];
int p[PRO];                             /*记录序列*/
int static Flag=0;
void PrintHead()
{
	printf("  ----------------------------------------------------------------------\n");
	printf("  |      Max     |      Allocation     |      Need    |    Available   |\n");
	printf("  ----------------------------------------------------------------------\n");
	printf("  | A    B    C  |     A    B    C     |   A   B   C  |   A    B    C  |\n");
	printf("  ----------------------------------------------------------------------\n");
}
void List()
{
	int i;
	for(i=0;i<PRO;i++)
	if (i==0)
	printf("P%d|  %d   %d    %d  |     %d    %d    %d     |   %d   %d   %d  |   %d    %d    %d  |\n",i,mx[i][0],mx[i][1],mx[i][2],alloc[i][0],alloc[i][1],alloc[i][2],ned[i][0],ned[i][1],ned[i][2],avl[0],avl[1],avl[2]);
	else
	printf("P%d|  %d   %d    %d  |     %d    %d    %d     |   %d   %d   %d  |                |\n",i,mx[i][0],mx[i][1],mx[i][2],alloc[i][0],alloc[i][1],alloc[i][2],ned[i][0],ned[i][1],ned[i][2]);
	printf("  ----------------------------------------------------------------------\n");
	printf("	                      T0时刻的资源分配表                              \n");
}
void Print()
{
	printf("  -------------------------------------------------------------------------\n");
	printf("  |    Work    |    Need    |   Allocation  |   Work+Allocation  |        | \n");
	printf("  ---------------------------------------------------------------| Finish |\n");
	printf("  | A   B   C  |  A  B  C   |   A   B   C   |   A     B     C    |        |\n");
	printf("  -------------------------------------------------------------------------\n");
}
void Success()
{
	int j;
	int i;
	int k;
	int temp_work[1][3];
	for(j=0;j<PRO;j++)
	{
		i=p[j];
		if (j==PRO-1)
		{
			for (k=0;k<3;k++)
			{
				temp_work[0][k]=tempWork[i][k]+alloc[i][k];
			}
			printf("P%d| %d   %d   %d  |  %d  %d  %d   |   %d   %d   %d   |   %d     %d     %d    |",i,tempWork[i][0],tempWork[i][1],tempWork[i][2],ned[i][0],ned[i][1],ned[i][2],alloc[i][0],alloc[i][1],alloc[i][2],temp_work[0][0],temp_work[0][1],temp_work[0][2]);
		}
		else
		printf("P%d| %d   %d   %d  |  %d  %d  %d   |   %d   %d   %d   |   %d     %d     %d    |",i,tempWork[i][0],tempWork[i][1],tempWork[i][2],ned[i][0],ned[i][1],ned[i][2],alloc[i][0],alloc[i][1],alloc[i][2],tempWork[p[j+1]][0],tempWork[p[j+1]][1],tempWork[p[j+1]][2]);
		if (Finish[i]==1) printf("  true  |");
		else printf("  false  |");
		printf("\n");
	}
		printf("  -------------------------------------------------------------------------\n");
		printf("	                     T0时刻的安全序列                                      \n");
}
int Security()                                    /*安全性算法*/
{
    int i,j,k,l=0;
	int tempflag=0;
    for(i=0;i<RES;i++)
		Work[i]=avl[i];
    for(i=0;i<PRO;i++)
    {
        Finish[i]=0;
    }
    for(i=0;i<PRO;i++)
    {    
        if(Finish[i]==1)
        {
            continue;
        }
        else
        {
            for(j=0;j<RES;j++)
            {
                if(ned[i][j]>Work[j])
                {
                    break;
                }
            }
			
			
            if(j==RES)
            { 
                Finish[i]=1;
				if (tempflag==0)
				{
					for (k=0;k<RES;k++)
						tempWork[i][k]=avl[k];
					
			}
                for(k=0;k<RES;k++)
                {
                    Work[k]+=alloc[i][k];
					if (tempflag!=0)
					{
						tempWork[i][k]=tempWork[p[l-1]][k]+alloc[p[l-1]][k];
					}
					
                }
				tempflag++;
                p[l++]=i;
                i=-1;
            }
            else
            {
                continue; 
            }
        }
        if(l==PRO)
        {
            printf("  系统是安全的\n");
            printf("  安全序列:");
            for(i=0;i<l;i++)
            {
                printf("%d",p[i]);
                if(i!=l-1)
                {
                    printf("-->");
                }
            }
			 printf("\n");
			 if (Flag==0)
			 {
			Print();
			 Success();
			 }
			 Flag++;
            return 1;
        }
    }
    printf("  系统是不安全的\n");
    return 0;
} 

void Banker()                /*银行家算法*/
{
    int i,ProId;
    char again;
    while(1)
    {
temp:printf("  请输入要申请资源的进程号 ");
        scanf("%d",&ProId);
   printf("  请输入进程所请求的各资源的数量 Request(A B C) ");
		scanf("%d %d %d",&rqt[ProId][0],&rqt[ProId][1],&rqt[ProId][2]);
        for(i=0;i<RES;i++)
        {
            if(rqt[ProId][i]>ned[ProId][i])
            {
                printf("  您输入的请求数超过进程的需求量,请重新输入!\n");
                goto temp;
            }
            if(rqt[ProId][i]>avl[i])
            {
                printf("  您输入的请求数超过系统有的资源数,请重新输入!\n");
                goto temp;
            }
        }
        for(i=0;i<RES;i++)
        {
            avl[i]-=rqt[ProId][i];
            alloc[ProId][i]+=rqt[ProId][i];
            ned[ProId][i]-=rqt[ProId][i];
        }
        if(Security())
        {
            printf("  资源请求分配成功!\n");
        }
        else
        {
            printf("  您的请求被拒绝!\n");
        }
        for(i=0;i<PRO;i++)
        {
            Finish[i]=0;
        }
		for(i=0;i<RES;i++)      //资源回收
		{
			avl[i]+=rqt[ProId][i];
			alloc[ProId][i]-=rqt[ProId][i];
			ned[ProId][i]+=rqt[ProId][i];
            }
        printf("  您还想再次请求分配吗?是请按y/Y,否请按其它键");
		getchar();
        scanf("%c",&again);
        if(again=='y'||again=='Y')
        {
            continue;
        }
        break;
	}
}


int  main()
{
    int i=0,j=0,k;
    printf("  ----------------------------------------------------------------------\n");
	printf("  |                                                                    |\n");
	printf("  |                                                                    |\n");
	printf("  |                    银行家算法  0500303132                          |\n");
	printf("  |                     05计算机1  周文兵                              |\n");
	printf("  |                                                                    |\n");
	printf("  ----------------------------------------------------------------------\n");
	printf("\n");
	printf("\n");
    PrintHead();
	List();
	k=Security();
	if (k==1)
	{
			Banker();
	}

}
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -