银行家算法(C实现 Visual Stdio 2005环境)

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>

int *available;
int *allocation;
int *max;
int *need;
int *request;
int resNum, proNum;
int requestPro;
//获取初始情况下各进程资源情况
void inputRes()
{
 int i,j;
 int res;

 printf("请输入进程数:");
 scanf("%d", &proNum);
 printf("请输入资源数:");
 scanf("%d", &resNum);

 available  = (int*)malloc(sizeof(int) * resNum);
 allocation = (int*)malloc(sizeof(int) * resNum * proNum);
 max        = (int*)malloc(sizeof(int) * resNum * proNum);
 need       = (int*)malloc(sizeof(int) * resNum * proNum);
 fflush(stdin);
   
 printf("请输入各进程所需的最大资源数/n");
 for (i = 0; i < proNum; i++){
  printf("P%d", i);
  for (j = 0; j < resNum; j++){
   printf("     ");
   res = (getch() - 48);
   *(max + (i * resNum) + j) = res;
      printf("%d", res);
   fflush(stdin);
  }
  printf("/n");
 }

 printf("请输入各进程已分配资源数/n");
 for (i = 0; i < proNum; i++){
  printf("P%d", i);
  for (j = 0; j < resNum; j++){
   printf("     ");
   res = (getch() - 48);
   *(allocation + (i * resNum) + j) = res;
      printf("%d", res);
   fflush(stdin);
  }
  printf("/n");
 }

 printf("各进程还需要的资源数/n");
 for (i = 0; i < proNum; i++){
  printf("P%d", i);
  for (j = 0; j < resNum; j++){
   *(need + (i * resNum) + j) = *(max + (i * resNum) + j) - *(allocation + (i * resNum) + j);
   printf("%6d",*(need + (i * resNum) + j));
  }
  printf("/n");
 }

 printf("系统可用资源数/n");
 for (i = 0; i < resNum; i++){
  printf("      ");
  res = (getch() - 48);
  available[i] = res;
     printf("%d", res);
  fflush(stdin);
 }
 printf("/n");
}
//输出各进程的资源情况
void outputRes()
{
 int i, j;
 printf("%12s %15s %10s %15s/n", "Max", "Allocation", "Need", "Available");
 for (i = 0; i < proNum; i++){
  printf("P%d",i);
  printf("   |");
  for (j = 0; j < resNum; j++){
      printf("%3d", (*(max + (i * resNum) + j)));
  }
  printf("   |");
  for (j = 0; j < resNum; j++){
      printf("%3d", (*(allocation + (i * resNum) + j)));
  }
  printf("   |");
  for (j = 0; j < resNum; j++){
      printf("%3d", (*(need + (i * resNum) + j)));
  }
  printf("   |");
  for (j = 0; j < resNum; j++){
      printf("%3d", available[j]);
  }
  printf("/n");
 }
}
//获得请求分配资源进程对各资源的请求数量
void getRequestRes()
{
 int i;
 int res;
   
 printf("请输入请求资源的进程号:");
 scanf("%d", &requestPro);
    printf("请输入%d对各资源的请求数量:", requestPro);
 request = (int*)malloc(sizeof(int) * resNum);
 for (i = 0; i < resNum; i++){
  printf("     ");
  res = (getch() - 48);
  request[i] = res;
     printf("%d", res);
  fflush(stdin);
 }
 printf("/n");
}
//为请求分配资源的进程分配请求的资源
int assignRes()
{
 int i;
  
 getRequestRes();
 //判断请求的资源是否大于该进程所需要的资源
 for (i = 0; i < resNum; i++){
  if (request[i] > *(need + (requestPro * resNum) + i)){
   printf("请求资源大于所需资源数,无法分配/n");
   return 0;
  }
 }
 //判断请求的资源是否大于系统可用资源
 for (i = 0; i < resNum; i++){
  if (request[i] > available[i]){
   printf("请求资源大于可用资源数,无法分配/n");
   return 0;
  }
 }
 //分配资源后修改相应资源状况
 for (i = 0; i < resNum; i++){
  *(allocation + (requestPro * resNum) + i) += request[i];
  *(need + (requestPro * resNum) + i) -= request[i];
  available[i] -= request[i];
 }
 return 1;
}
//给请求分配资源的进程分配资源后进行安全性检查
int secureCheck()
{
 int *work;
 bool *finish;
 int i, j;
 bool finishflag, findrun;
 work  = (int*)malloc(sizeof(int) * resNum);
 finish     = (bool*)malloc(sizeof(int) * proNum);
 finishflag = false;
    findrun = false;
 for (i = 0; i < resNum; i++){
  work[i] = available[i];
 }
 for (i = 0; i < proNum; i ++){
  finish[i] = false;
 }

 while(!finishflag){
  finishflag = true;
  for (i = 0; i < proNum; i++){
   if (!finish[i]){
    for (j = 0; j < resNum; j++){
     if (*(need + (i * resNum) + j) <= work[j])
      findrun = true;
     else{
      findrun = false;
      break;
     }
    }
    if (findrun){
     for (j = 0; j < resNum; j++)
         work[j] = work[j] + *(allocation + (i * resNum) + j);
                 finish[i] = true;
           finishflag = false;
    }
    else{
     for (int k = 0; k < proNum; k++){
      if (k != i){
          if (!finish[k]){
        for (int l = 0; l < resNum; l++){
             if (*(need + (k * resNum) + l) <= work[l])
                          findrun = true;
          else{
                          findrun = false;
           break;
          }
              }
        if (findrun){
         for (j = 0; j < resNum; j++)
              work[j] = work[j] + *(allocation + (k * resNum) + j);
                                  finish[k] = true;
                        finishflag = false;
         break;   //跳出for循环
        }
          }
      }
      else
       continue;//如果是请求量大于系统能提供量的那个进程则跳过
     }
     if (!findrun){//如果资源分配不安全,则将请求的资源还给系统
      for (int l = 0; l < resNum; l++){
                         *(allocation + (requestPro * resNum) + l) -= request[l];
                         *(need + (requestPro * resNum) + l) += request[l];
                         available[l] += request[l];
                        }
         return 0;
     }
    }
   }
  }
 }
    return 1;
}

void main()
{
 char ch;
 inputRes();
 printf("/n");
 printf("是否需要分配资源(Y//N):");
 while ((ch = getchar()) != 'N'){
     if (!assignRes()){
   printf("是否需要分配资源(Y//N):");
      continue;
     }
     printf("虚拟分配请求资源后/n");
     outputRes();
  if (!secureCheck()){
   printf("资源分配不安全,不能对%d进行资源分配/n", requestPro);
  }
  else{
   printf("%d请求的资源成功分配/n", requestPro);
         outputRes();
  }
  printf("是否需要分配资源(Y//N):");
 }
 free(max);
 free(available);
 free(allocation);
 free(need);
 free(request);
 getchar();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值