操作系统实验四

银行家算法

题目
利用银行家算法写一个系统安全性检测程序(要求对关键步骤进行注释),判定如下系统的安全性。已知系统有5个进程P0、P1、P2、P3、P4,三类资源A、B、C,当前时刻可用资源向量a=(0,0,0),各进程对资源的需求和占用情况如表所示,请问此时系统是否处于安全状态?
表1 进程需求资源情况表

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define RE 100

int flag_need = 1;//标志进程请求资源数量是否出错 
int row,col;
int Max[RE][RE],Allocation[RE][RE],Need[RE][RE],finish[RE] = {0},Available[RE],Work[RE],P[RE];//定义最大需求矩阵、已获得资源矩阵等 

void init(){   //初始化 

    printf("输入进程数:\n");
    scanf("%d",&row);
    printf("输入资源数:\n");
    scanf("%d",&col);
    printf("输入每个进程最多需要的资源数按照%d x %d矩阵输入:\n",row,col);//最大需求矩阵存储在MAX[i][j]中 
    int i,j;
    for(i = 0;i < row;i ++){
       for(j = 0;j < col;j ++){
           scanf("%d",&Max[i][j]);
       }      
    }
    printf("输入每个进程已经分配的资源数按照%d x %d矩阵输入:\n",row,col);//已分配资源矩阵ALLOCATION[i][j] 
    for(i = 0;i < row;i ++){
       for(j = 0;j < col;j ++){
           scanf("%d",&Allocation[i][j]);
           Need[i][j] = Max[i][j]-Allocation[i][j];  //max=allocation+need 
           if(Need[i][j] < 0){ //进程所请求的资源不可能为负数 
              printf("进程P%d的R%d资源出错\n");
              flag_need = 0;
           }
       }      
    }
    printf("请输入现有各资源数:\n");//现有资源:一个一维向量 availabe 
    for(i = 0;i < col;i ++){
       scanf("%d",&Available[i]);
       Work[i] = Available[i];
    }   
}
 
void print(bool x){//打印安全序列或者说明不安全 
    int k;
    if(x){
       printf("系统是安全的\n安全序列为:");
       for(k = 0;k < row - 1;k ++){
              printf("%d ->",P[k]);
           }
       printf("%d\n",P[k]);
    }
    else
       printf("系统不安全\n"); 
} 
 
bool isSafe(){ //判断系统是否安全 
    int k = 0,len = 0,lastlen = 0;
    int i,j;
    while(len < row){ //依次对系统中的进程进行判断 
       for(i = 0;i < row;i ++){//对一个进程中的每个资源请求进行判断 
           if(finish[i] != 1){//该进程仍需要申请资源 
              k = 0;
              for (j = 0;j < col;j ++){
                  if (Need[i][j] <= Work[j]) //当前进程中的每一个资源是否对应能被满足 
                     k ++;   
              }
              if (k == col) {//满足访问所有需求 

                  finish[i] = 1;
                  P[len] = i;//放进程安全序列
                  for(j = 0;j < col;j ++){
                     Work[j] += Allocation[i][j];
                  }
                  len ++;  //统计进程个数
                  break;
              }             
           }
       }
       /*len 控制对每个进程的访问,len=row,证明所有进程都被访问完毕,存在一个安全序列
	     finish[i]
		 k控制对进程对需求每一个资源的访问 */
       //上一次循环长度与下一次相等,则出现不安全情况,进程未被完全访问 
       if (lastlen == len){//如果进程访问资源满足不了需求,即Len不会+1,导致Len值不会修改,因此lastlen=len,从而说明系统不安全 
           break;
       }else{
           lastlen = len;
       }
    }
      if(len == row){
       return true;
     }
     else {
       return false;
    }

}


int main (){
    init();
    print(isSafe());
    return 0;

}

运行截图如下:

此次实验有参考他人算法,安全性的计算有点取巧

posted @   星星盛开的地方  阅读(158)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示