操作系统实验:银行家算法C语言实现

操作系统实验:银行家算法C语言实现银行家算法C语言实现#include<stdio.h>#include<stdlib.h>#defineok1#definetrue1#definefalse0intclaim[100][100]={0};//各个进程需要的最大资源数量intalloc[100][100]={0};//各个进程已分配的资源数量intneed[100][100]={0};//各个进程还需要的资源数量intresource[100]={

大家好,又见面了,我是你们的朋友全栈君。

银行家算法C语言实现

#include<stdio.h>
#include<stdlib.h>
#define ok 1
#define true 1
#define error 0
#define false 0
int claim[100][100] = { 
0}; // 各个进程需要的最大资源数量
int alloc[100][100] = { 
0}; // 各个进程已分配的资源数量
int need[100][100] = { 
0};  // 各个进程还需要的资源数量
int resource[100] = { 
0};   // 各个资源的总数
char name[100] = { 
0};      // 各个资源的名字
int available[100] = { 
0};  // 可分配的资源数
int work[100] = { 
0};       // 用于存放alloc+available两个数组和的值
int finish[100] = { 
0};     // 判断是否分配完成
int ss[100] = { 
0};         // 安全序列
int request[100] = { 
0};    // 请求单独分配的资源数量
int n, m; // n:进程的数量 m:资源的种数
int init()
{ 

int i, j;
//char Name;
printf("请输入进程所需资源的种数:");
scanf("%d", &m);
for(i = 0; i < m; i++)
{ 

printf("请输入资源%d的名字:", i);
fflush(stdin);// 用于刷新缓冲区,VScode这里一定要这么做
scanf("%c", &name[i]);
//name[i] = Name;
printf("请输入资源%c的资源总数:", name[i]);
scanf("%d", &resource[i]);
}
printf("==============================\n");
printf("请输入各个资源可分配的资源数:\n");
for(i = 0; i < m; i++)
{ 

printf("%c:", name[i]);
scanf("%d", &available[i]);
}
printf("==============================\n");
printf("请输入进程的数量:");
scanf("%d", &n);
printf("请输入各个进程需要的最大资源数量:\n");
for(i = 0; i < n; i++)
{ 

for(j = 0; j < m; j++)
scanf("%d", &claim[i][j]);
}
printf("==============================\n");
printf("请输入各个进程已分配的资源数量:\n");
for(i = 0; i < n; i++)
{ 

for(j = 0; j < m; j++)
scanf("%d", &alloc[i][j]);
}
return ok;
}
int safe()
{ 

int i, j, k, s = 0;
int flag;
int t;
//初始化work数组,在available数组改变时用于替换available数组进行加法的运算。
for(j = 0; j < m; j++)
work[j] = available[j];
//初始化finish数组,用于在分配完之后跳过这个进程。
for(i = 0; i < n; i++)
finish[i] = false;
//算出各个进程还需要的各种资源的数量。
for(i = 0; i < n; i++)
{ 

for(j = 0; j < m; j++)
{ 

need[i][j] = claim[i][j] - alloc[i][j];
}
}
printf("==============================\n");
printf("各个进程还需要的资源数量:\n");
for(i = 0; i < n; i++)
printf("%c ", name[i]);
printf("\n");
for(i = 0; i < n; i++)
{ 

for(j = 0; j < m; j++)
{ 

printf("%d ", need[i][j]);
}
printf("\n");
}
printf("==============================\n");
printf("判断是否安全:");
for(i = 0; i < n; i++)
{ 

t = 0;
for(j = 0; j < m; j++)
{ 

if(work[j] >= need[i][j] && finish[i] == false)
{ 

t++;
if(t == m)
{ 

for(k = 0; k < m; k++)
work[k] = work[k] + alloc[i][k];
finish[i] = true;
ss[s++] = i;
i = -1;//保证每次都从第一行开始找起
}
}    
}
}
for(i = 0; i < n; i++)
{ 

if(finish[i] == false)
{ 
   
printf("不安全!");
return error;
}
}
printf("安全,存在一个安全序列:");
for(i = 0; i < n; i++)
{ 

printf("P%d", ss[i]);
if(i < n-1)
printf("->");
}
printf("\n");
return ok;
}
int  banker()
{ 

int p, i, j;
int flag = true;
printf("==============================\n");
printf("请输入第几个进程请求分配的资源(0~%d):", n-1);
scanf("%d", &p);
printf("请分别输入请求分配的资源数量:\n");
for(i = 0; i < m; i++)
{ 

printf("%c:", name[i]);
scanf("%d", &request[i]);
}
for(j = 0; j < m; j++)
{ 

if((request[j] + alloc[p][j]) > claim[p][j])
{ 

printf("不合理\n");
flag = false;
break;
}
else
{ 

if(request[j] > available[j])
{ 

printf("不可能\n");
flag = false;
break;
}
}
}
if(flag)
{ 

test(p);  // 尝试将请求的资源数量分配到请求的进程
safe();
reset(p); // 重置可分配的数组和已分配的数组
}
return ok;
}
int test(int i)
{ 

int j;
for(j = 0; j < m; j++)
{ 

available[j] = available[j] - request[j];
alloc[i][j] = alloc[i][j] + request[j];
}
}
int reset(int i)
{ 

int j;
for(j = 0; j < m; j++)
{ 

available[j] = available[j] + request[j];
alloc[i][j] = alloc[i][j] - request[j];
}
}
int main()
{ 

int t = 0;
while(t != 4){ 

printf("------------------------------\n");
printf(" 银行家算法模拟 \n");
printf("------------------------------\n");
printf("1: 初始化 2:判断是否安全\n");
printf("3:请求分配 4:退出 \n");
printf ("请选择(1~4):");
scanf("%d", &t);
switch(t)
{ 

case 1 :
init();
break;
case 2:
safe();
break;
case 3:
banker();
break;
case 4 :
printf("银行家算法模拟结束Bye!");
exit(0);
}
}
return 0;
} 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137843.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 激光slam综述_激光slam原理

    激光slam综述_激光slam原理本篇是记录曾书格老师的课程《激光slam理论与实践》先贴一下个人总结(有理解的不正确的,麻烦指出来):第一章:激光SLAM简要介绍1、输出Metricalmap尺度地图,slam分为两种:基于滤波的filter-based的SLAM,和Graph-based的SLAM。2、(1)基于Graph-based的代表是cartographer,可以修复t时刻之前的误差分为两部…

  • leetcode 链表相加_数据结构与算法链表

    leetcode 链表相加_数据结构与算法链表给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。/** * Definition for singly-linked list. * struct ListNode { * int val; *

  • MFC消息_为什么发消息对方不回

    MFC消息_为什么发消息对方不回由arain于星期二,11/02/2010-10:44发表MSGmessage;  if(::PeekMessage(&message,NULL,0,0,PM_REMOVE)){      ::TranslateMessage(&message); //把键盘消息翻译成字符消息      ::DispatchMessage(&message

  • pyCharm全局搜索不能正常使用的解決方法

    pyCharm全局搜索不能正常使用的解決方法解决pyCharm全局搜索不能使用的方法

  • SM4加密Java实现

    SM4加密Java实现可直接使用,参考csdn上一位老哥的。packagecom.hps.test2;importjava.util.Arrays;publicclassSMS4{privatestaticfinalintENCRYPT=1;privatestaticfinalintDECRYPT=0;publicstaticfinalintROUND=32;…

  • 1、时间轮[通俗易懂]

    1、时间轮[通俗易懂]一、什么是时间轮?作为一个粗人,咱不扯什么高级的词汇,直接上图:上面是一张时间轮的示意图,可以看到,这个时间轮就像一个钟表一样,它有刻度,图中画了9个格子,每个格子表示时间精度,比如每个格子表示1s,那么转一圈就是9s,对于钟表上的秒针来说它的最小刻度是1s,秒针转一圈就是60s。时间轮上每个格子储存了一个双向链表,用于记录定时任务,当指针转到对应的格子的时候,会检查对应的任务是否到期,如果到期就会执行链条上的任务。二、为什么使用时间轮?我认为这个世界上任何事物的出现都有它的原因,只是大部分事

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号