操作系统实验四
银行家算法
题目
利用银行家算法写一个系统安全性检测程序(要求对关键步骤进行注释),判定如下系统的安全性。已知系统有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;
}
运行截图如下:
此次实验有参考他人算法,安全性的计算有点取巧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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训练数据并当服务器共享给他人