C语言实现银行家算法源代码

更新时间:2023-12-23 07:21:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C语言实现银行家算法源代码

#include "stdio.h"

#define MAXPROCESS 50 /*最大进程数*/ #define MAXRESOURCE 100 /*最大资源数*/ #define true 1 #define false 0

int AVAILABLE[MAXRESOURCE]; /*可用资源数组*/ int MAX[MAXPROCESS][MAXRESOURCE]; /*最大需求矩阵*/ int ALLOCATION[MAXPROCESS][MAXRESOURCE]; /*分配矩阵*/ int NEED[MAXPROCESS][MAXRESOURCE]; /*需求矩阵*/ int REQUEST[MAXPROCESS][MAXRESOURCE]; /*进程需要资源数*/

int FINISH[MAXPROCESS]; /*系统是否有足够的资源分配*/ int p[MAXPROCESS]; /*记录序列*/ int m,n; /*m个进程,n个资源*/ void Init(); int Safe(); void Bank(); void main() { Init(); Safe(); Bank();

} /*最大资源数*/

void Init() /*初始化算法*/ { int i,j;

printf("请输入进程的数目:\\n"); scanf("%d",&m);

printf("请输入资源的种类:\\n"); scanf("%d",&n);

printf("请输入每个进程最多所需的各资源数,按照%dx%d矩阵输入\\n",m,n); for(i=0;i<m;i++) for(j=0;j<n;j++)

scanf("%d",&MAX[i][j]);

printf("请输入每个进程已分配的各资源数,也按照%dx%d矩阵输入\\n",m,n); for(i=0;i<m;i++) {

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

scanf("%d",&ALLOCATION[i][j]);

NEED[i][j]=MAX[i][j]-ALLOCATION[i][j]; if(NEED[i][j]<0) {

printf("您输入的第%d个进程所拥有的第%d个资源数错误,请重新输入:\\n",i+1,j+1); j--; continue; } } }

printf("请输入各个资源现有的数目:\\n"); for(i=0;i<n;i++) {

scanf("%d",&AVAILABLE[i]); } }

int Safe() /*安全性算法,返回值:true,false*/ {

int i,j,k,l=0;

int Work[MAXRESOURCE]; /*工作数组*/ for(i=0;i<n;i++) Work[i] = AVAILABLE[i]; for(i=0;i<m;i++) {

FINISH[i] = false; }

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

if(FINISH[i] == true) { continue; } else {

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

if(NEED[i][j]>Work[j]) { break; } } if(j==n) {

FINISH[i]=true; for(k=0;k<n;k++)

{

Work[k]+=ALLOCATION[i][k]; } p[l++]=i; i=-1; } else { continue; } } if(l==m) {

//cout<<"系统是安全的"<<endl; printf("系统是安全的\\n");

//cout<<"安全序列:"<<endl; printf("安全序列:\\n"); for(i=0;i<l;i++) {

//cout<<p[i];

printf("%d",p[i]); if(i!=l-1) {

printf("-->"); } }

return true; } }

printf("系统是不安全的\\n"); return false; }

void Bank() /*银行家算法*/ {

int i,cusneed; char again; while(1) {

printf("请输入要申请资源的进程号(注:第1个进程号为0,依次类推)\\n"); scanf("%d",&cusneed);

printf("请输入进程所请求的各资源的数量\\n"); for(i=0;i<n;i++) {

scanf("%d",&REQUEST[cusneed][i]); }

for(i=0;i<n;i++) {

if(REQUEST[cusneed][i]>NEED[cusneed][i]) {

printf("您输入的请求数超过进程的需求量!请重新输入!\\n"); continue; }

if(REQUEST[cusneed][i]>AVAILABLE[i]) {

printf("您输入的请求数超过系统有的资源数!请重新输入!\\n"); continue; } }

for(i=0;i<n;i++) {

AVAILABLE[i]-=REQUEST[cusneed][i];

ALLOCATION[cusneed][i]+=REQUEST[cusneed][i]; NEED[cusneed][i]-=REQUEST[cusneed][i]; } if(Safe()) {

printf("同意分配请求!\\n"); } else {

printf("您的请求被拒绝!\\n"); for(i=0;i<n;i++) {

AVAILABLE[i]+=REQUEST[cusneed][i];

ALLOCATION[cusneed][i]-=REQUEST[cusneed][i]; NEED[cusneed][i]+=REQUEST[cusneed][i]; } }

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

FINISH[i]=false; }

printf("您还想再次请求分配吗?是请按y/Y,否请按其它键\\n"); scanf("%c",&again);

if(again=='y'||again=='Y') { continue; } break; } }

本文来源:https://www.bwwdw.com/article/ay75.html

Top