操作系统-银行家算法实验C语言
银行家算法C语言代码

#include "malloc.h"#include "stdio.h"#include "stdlib.h"#define alloclen sizeof(struct allocation)#define maxlen sizeof(struct max)#define avalen sizeof(struct available)#define needlen sizeof(struct need)#define finilen sizeof(struct finish)#define pathlen sizeof(struct path)struct allocation{int value;struct allocation *next;};struct max{int value;struct max *next;};struct available /*¿ÉÓÃ×ÊÔ´Êý*/{int value;struct available *next;};struct need /*ÐèÇó×ÊÔ´Êý*/{int value;struct need *next;};struct path{int value;struct path *next;};struct finish{int stat;struct finish *next;};int main(){int row,colum,status=0,i,j,t,temp,processtest;struct allocation *allochead,*alloc1,*alloc2,*alloctemp;struct max *maxhead,*maxium1,*maxium2,*maxtemp;struct available *avahead,*available1,*available2,*workhead,*work1,*work2,*worktemp ,*worktemp1;struct need *needhead,*need1,*need2,*needtemp;struct finish *finihead,*finish1,*finish2,*finishtemp;struct path *pathhead,*path1,*path2;printf("\nplease input the kinds of resourse:");scanf("%d",&colum);printf("please input the total number of the progress in the memory:");scanf("%d",&row);printf("please input the matrix of resourses that has allocated :\n"); for(i=0;i<row;i++){for (j=0;j<colum;j++){printf("Please input the number of system resources %c that has been allocated to process p%d:",'A'+j,i);if(status==0){allochead=alloc1=alloc2=(structallocation*)malloc(alloclen);alloc1->next=alloc2->next=NULL;scanf("%d",&allochead->value);status++;}else{alloc2=(struct allocation *)malloc(alloclen);scanf("%d,%d",&alloc2->value);if(status==1){allochead->next=alloc2;status++;}alloc1->next=alloc2;alloc1=alloc2;}}}alloc2->next=NULL;status=0;printf("please input the matrix of progress' maximumrequests:\n");for(i=0;i<row;i++){for (j=0;j<colum;j++){printf("Please input process p%d's maximum requests of system resources %c:",i,'A'+j);if(status==0){maxhead=maxium1=maxium2=(struct max*)malloc(maxlen); maxium1->next=maxium2->next=NULL;scanf("%d",&maxium1->value);status++;}else{maxium2=(struct max *)malloc(maxlen);scanf("%d,%d",&maxium2->value);if(status==1){maxhead->next=maxium2;status++;}maxium1->next=maxium2;maxium1=maxium2;}}}maxium2->next=NULL;status=0;printf("ÇëÊäÈëÏÖʱϵͳʣÓàµÄ×ÊÔ´¾ØÕó:\n");for (j=0;j<colum;j++){printf("ÖÖÀà %c µÄϵͳ×ÊÔ´Ê£Óà:",'A'+j);if(status==0){avahead=available1=available2=(structavailable*)malloc(avalen);workhead=work1=work2=(structavailable*)malloc(avalen);available1->next=available2->next=NULL;work1->next=work2->next=NULL;scanf("%d",&available1->value);work1->value=available1->value;status++;}else{available2=(struct available*)malloc(avalen); work2=(struct available*)malloc(avalen);scanf("%d,%d",&available2->value);work2->value=available2->value;if(status==1){avahead->next=available2;workhead->next=work2;status++;}available1->next=available2;available1=available2;work1->next=work2;work1=work2;}}available2->next=NULL;work2->next=NULL;status=0;alloctemp=allochead;maxtemp=maxhead;for(i=0;i<row;i++)for (j=0;j<colum;j++){if(status==0){needhead=need1=need2=(structneed*)malloc(needlen);need1->next=need2->next=NULL;need1->value=maxtemp->value-alloctemp->value; status++;}else{need2=(struct need *)malloc(needlen);need2->value=(maxtemp->value)-(alloctemp->value);if(status==1){needhead->next=need2;status++;}need1->next=need2;need1=need2;}maxtemp=maxtemp->next;alloctemp=alloctemp->next;}need2->next=NULL;status=0;for(i=0;i<row;i++){if(status==0){finihead=finish1=finish2=(structfinish*)malloc(finilen);finish1->next=finish2->next=NULL;finish1->stat=0;status++;}else{finish2=(struct finish*)malloc(finilen);finish2->stat=0;if(status==1){finihead->next=finish2;status++;}finish1->next=finish2;finish1=finish2;}}finish2->next=NULL; /*Initialization compleated*/ status=0;processtest=0;for(temp=0;temp<row;temp++){alloctemp=allochead;needtemp=needhead;finishtemp=finihead;worktemp=workhead;for(i=0;i<row;i++){worktemp1=worktemp;if(finishtemp->stat==0){for(j=0;j<colum;j++,needtemp=needtemp->next,worktemp=worktemp->nex t)if(needtemp->value<=worktemp->value)processtest++;if(processtest==colum){for(j=0;j<colum;j++){worktemp1->value+=alloctemp->value;worktemp1=worktemp1->next;alloctemp=alloctemp->next;}if(status==0){pathhead=path1=path2=(structpath*)malloc(pathlen);path1->next=path2->next=NULL;path1->value=i;status++;}else{path2=(struct path*)malloc(pathlen);path2->value=i;if(status==1){pathhead->next=path2;status++;}path1->next=path2;path1=path2;}finishtemp->stat=1;}else{for(t=0;t<colum;t++)alloctemp=alloctemp->next;finishtemp->stat=0;}}elsefor(t=0;t<colum;t++){needtemp=needtemp->next;alloctemp=alloctemp->next; }processtest=0;worktemp=workhead;finishtemp=finishtemp->next;}}path2->next=NULL;finishtemp=finihead;for(temp=0;temp<row;temp++){if(finishtemp->stat==0){printf("\nϵͳ´¦Óڷǰ²È«×´Ì¬!\n"); exit(0);}finishtemp=finishtemp->next;}printf("\nϵͳ´¦ÓÚ°²È«×´Ì¬.\n");printf("\n°²È«ÐòÁÐΪ: \n");do{printf("p%d ",pathhead->value);}while(pathhead=pathhead->next);printf("\n");return 0;}。
C语言实验报告范例

C语言实验报告范例
实验题目:C语言实现银行家算法
实验目的:掌握C语言实现银行家算法的基本思想,并能熟练应用矩阵处理实现银行
家算法的功能。
实验内容:
1. 利用C语言实现银行家算法的核心思想,利用矩阵处理实现其核心功能模块。
2. 银行家算法是一种负责实现“当前分配”的基于矩阵的编程模型。
该算法可以通
过利用安全状态来识别一次可行解,从而解决请求和分配资源的冲突问题。
3. 根据上述信息,我们设计了C语言实现银行家算法的基本框架,包括初始化步骤、可行性检查步骤、回滚步骤以及主步骤。
4. 在初始化步骤中,我们采用矩阵存储技术,将银行家算法中的各个参数保存起来,具体过程中采用数组存储。
5. 在可行性检查步骤中,我们判断当前系统状态是否处于安全状态,如果处于安全
状态,则继续完成下一步余额检查;否则,处理发生冲突时,回滚处理。
6. 在主步骤中,我们过程中判断若系统处于可行状态,则继续分配资源;否则,则
执行回滚操作,将系统恢复到上一状态。
实验结果和结论:
通过实验,我们学会了如何使用C语言来实现银行家算法,进而通过实现矩阵处理,
实现了该算法的核心功能模块。
此外,我们还学习了安全状态机制,进行系统可行性检查,和完成系统的分配工作,以达到有效地实现银行家算法的目的。
本次实验结论如下:
1. 通过C语言实现银行家算法中的核心功能模块,使系统的可行性检查得以有效实现;
2. 利用矩阵存储来实现系统的可行性检查,从而有效地节省时间和提高资源分配的
效率;
3. 通过回滚处理,有效地解决资源请求和分配冲突问题,使系统能够有效地实现安
全状态。
操作系统实验报告银行家算法

void change();当请求资源满足要求时,进行分配,系统资源发生改变;
int check();安全性算法,检查是否存在安全序列;
void outputsafe();输出安全序列的资源分配表。
4、检查代码,将编出的代码编译、链接,验证其正确性。
if (n==0)
printf("%6d%3d%3d\n",available[0],available[1],available[2]);
else
printf("\n");
}
line();
}
void change()//当Request[i,j]<=Available[j]时,系统把资源分配给进程P[i],Available[j]和Need[i,j]发生改变
line();
printf("资源情况Work Need Allocation Work+Allocation Finish\n");
printf("进程A B C A B C A B C A B C\n");
line();
for(n=0;n<5;n++)
printf("P%d%9d%3d%3d%5d%3d%3d%5d%3d%3d%6d%3d%3d%12s\n",safe[n],works[safe[n]][0],works[safe[n]][1],works[safe[n]][2],need[safe[n]][0],need[safe[n]][1],need[safe[n]][2],allocation[safe[n]][0],allocation[safe[n]][1],allocation[safe[n]][2],works[safe[n]][0]+allocation[safe[n]][0],works[safe[n]][1]+allocation[safe[n]][1],works[safe[n]][2]+allocation[safe[n]][2],finish[n]);
c语言银行家算法

c语言银行家算法在C语言中实现银行家算法,首先需要了解该算法的基本概念和原理。
银行家算法是一种避免死锁的资源分配算法,它模拟了银行贷款的过程。
当一个进程请求资源时,系统先检查分配后是否安全,如果是,则分配资源。
否则,进程必须等待,直到足够的资源可用。
以下是一个简单的银行家算法的C语言实现:```c#include <stdio.h>#define MaxProcs 5#define MaxResources 3int Allocation[MaxProcs][MaxResources] = {0};int Max[MaxProcs][MaxResources] = {0};int Allocation[MaxProcs][MaxResources] = {0};int Available[MaxResources] = {0};int Need[MaxProcs][MaxResources] = {0};int Work[MaxResources] = {0};int safeSeq[MaxProcs] = {0};int count = 0;void calcNeed() {for (int p = 0; p < MaxProcs; p++) {for (int r = 0; r < MaxResources; r++) {Need[p][r] = Max[p][r] - Allocation[p][r];}}}void checkSafe() {int finish[MaxProcs] = {0};int k, j;for (k = 0; k < MaxProcs; k++) {safeSeq[k] = -1;}while (count < MaxProcs) {for (k = 0; k < MaxProcs; k++) {if (finish[k] == 0) {for (j = 0; j < MaxResources; j++) {if (Need[k][j] > Work[j]) {break;}}if (j == MaxResources) {for (j = 0; j < MaxResources; j++) {Work[j] += Allocation[k][j];safeSeq[count++] = k;finish[k] = 1;}}}}}if (count == MaxProcs) {printf("系统是安全的\n");} else {printf("系统是不安全的\n");}}```。
操作系统实验报告--C语言实现银行家算法

实验报告程序源代码:#include <stdio.h>#include <stdlib.h>#include <conio.h># define m 50int no1; //进程数int no2; //资源数int r;int allocation[m][m],need[m][m],available[m],max[m][m];char name1[m],name2[m]; //定义全局变量void main(){void check();void print();int i,j,p=0,q=0;char c;int request[m],allocation1[m][m],need1[m][m],available1[m];printf("**********************************************\n");printf("* 银行家算法的设计与实现 *\n");printf("**********************************************\n");printf("请输入进程总数:\n");scanf("%d",&no1);printf("请输入资源种类数:\n");scanf("%d",&no2);printf("请输入Max矩阵:\n");for(i=0;i<no1;i++)for(j=0;j<no2;j++)scanf("%d",&max[i][j]); //输入已知进程最大资源需求量printf("请输入Allocation矩阵:\n");for(i=0;i<no1;i++)for(j=0;j<no2;j++)scanf("%d",&allocation[i][j]); //输入已知的进程已分配的资源数for(i=0;i<no1;i++)for(j=0;j<no2;j++)need[i][j]=max[i][j]-allocation[i][j]; //根据输入的两个数组计算出need矩阵的值printf("请输入Available矩阵\n");for(i=0;i<no2;i++)scanf("%d",&available[i]); //输入已知的可用资源数print(); //输出已知条件check(); //检测T0时刻已知条件的安全状态if(r==1) //如果安全则执行以下代码{do{q=0;p=0;printf("\n请输入请求资源的进程号(0~4):\n");for(j=0;j<=10;j++){scanf("%d",&i);if(i>=no1){printf("输入错误,请重新输入:\n");continue;}else break;}printf("\n请输入该进程所请求的资源数request[j]:\n");for(j=0;j<no2;j++)scanf("%d",&request[j]);for(j=0;j<no2;j++)if(request[j]>need[i][j]) p=1;//判断请求是否超过该进程所需要的资源数if(p)printf("请求资源超过该进程资源需求量,请求失败!\n");else{for(j=0;j<no2;j++)if(request[j]>available[j]) q=1;//判断请求是否超过可用资源数if(q)printf("没有做够的资源分配,请求失败!\n");else //请求满足条件{for(j=0;j<no2;j++){available1[j]=available[j];allocation1[i][j]=allocation[i][j];need1[i][j]=need[i][j];//保存原已分配的资源数,仍需要的资源数和可用的资源数available[j]=available[j]-request[j];allocation[i][j]+=request[j];need[i][j]=need[i][j]-request[j];//系统尝试把资源分配给请求的进程}print();check(); //检测分配后的安全性if(r==0) //如果分配后系统不安全{for(j=0;j<no2;j++){available[j]=available1[j];allocation[i][j]=allocation1[i][j];need[i][j]=need1[i][j];//还原已分配的资源数,仍需要的资源数和可用的资源数}printf("返回分配前资源数\n");print();}}}printf("\n你还要继续分配吗?Y or N ?\n");//判断是否继续进行资源分配c=getche();}while(c=='y'||c=='Y');}}void check() //安全算法函数{int k,f,v=0,i,j;int work[m],a[m];bool finish[m];r=1;for(i=0;i<no1;i++)finish[i]=false; // 初始化进程均没得到足够资源数并完成for(i=0;i<no2;i++)work[i]=available[i];//work[i]表示可提供进程继续运行的各类资源数k=no1;do{for(i=0;i<no1;i++){if(finish[i]==false){f=1;for(j=0;j<no2;j++)if(need[i][j]>work[j])f=0;if(f==1) //找到还没有完成且需求数小于可提供进程继续运行的资源数的进程{finish[i]=true;a[v++]=i; //记录安全序列号for(j=0;j<no2;j++)work[j]+=allocation[i][j]; //释放该进程已分配的资源}}}k--; //每完成一个进程分配,未完成的进程数就减1 }while(k>0);f=1;for(i=0;i<no1;i++) //判断是否所有的进程都完成{if(finish[i]==false){f=0;break;}}if(f==0) //若有进程没完成,则为不安全状态{printf("系统处在不安全状态!");r=0;}else{printf("\n系统当前为安全状态,安全序列为:\n");for(i=0;i<no1;i++)printf("p%d ",a[i]); //输出安全序列}}void print() //输出函数{int i,j;printf("\n");printf("*************此时刻资源分配情况*********************\n");printf("进程名/号 | Max | Allocation | Need |\n"); for (i = 0; i < no1; i++){printf(" p%d/%d ",i,i);for (j = 0; j < no2; j++){printf("%d ",max[i][j]);}for (j = 0; j < no2; j++){printf(" %d ",allocation[i][j]);}for (j = 0; j < no2; j++){printf(" %d ",need[i][j]);}printf("\n");}printf("\n");printf("各类资源可利用的资源数为:");for (j = 0; j < no2; j++){printf(" %d",available[j]);}printf("\n");}程序运行调试结果:1、程序初始化2、检测系统资源分配是否安全结果。
银行家算法操作系统实验报告

竭诚为您提供优质文档/双击可除银行家算法操作系统实验报告篇一:计算机操作系统银行家算法实验报告计算机操作系统实验报告一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
三、问题分析与设计:1、算法思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。
若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。
若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。
2、银行家算法步骤:(1)如果Requesti<or=need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。
(3)系统试探把要求的资源分配给进程pi,并修改下面数据结构中的数值:Available=Available-Request[i];Allocation=Allocation+Request;need=need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
3、安全性算法步骤:(1)设置两个向量①工作向量work。
它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,work=Allocation;②布尔向量Finish。
它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true。
(2)从进程集合中找到一个能满足下述条件的进程:①Finish[i]=false②need 如找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程p获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:work=work+Allocation;Finish[i]=true;转向步骤(2)。
操作系统-银行家算法C语言实现

银行家算法C语言实现以下便是代码实现#include"stdio.h"#include"stdlib.h"#include"string.h"int n,m;struct info{int claim[50];int allocation[50];int need[50];}pro[50];int available[50];int request[50];void init(){ int i,j;printf("请输入资源种类数:");scanf("%d",&n);for(i=0;i<n;i++){ printf("请输入第%d个资源的最大资源数:\n",i);scanf("%d",&available[i]);}printf("请输入进程数:");scanf("%d",&m);printf("请输入各进程对各资源的最大需求数:\n");for(i=0;i<m;i++){ printf("请输入第%d进程对各资源的最大需求数:\n",i);for(j=0;j<n;j++){scanf("%d",&pro[i].claim[j]);pro[i].allocation[j]=0;pro[i].need[j]=pro[i].claim[j];}}printf("\n");}int safe(){ int work[101];int finish[101];int xulie[101];int i,j,k,w=0;int flag=1,t=0;for(i=0;i<m;i++)finish[i]=0;for(i=0;i<n;i++)work[i]=available[i];for(i=0;i<m;i++){for(j=0;j<m;j++){if(finish[j]==0){for(k=0;k<n ;k++){if(flag==1&&work[k]>=pro[j].need[k])flag=1;elseflag=0;}if(flag==1){for(k=0;k<n;k++)work[k]=work[k]+pro[j].allocation[k];finish[j]=1;xulie[w++]=j;}flag=1;}}}for(i=0;i<m;i++)if(finish[i]==0) break;if(i<m){printf("系统是不安全的,进程等待,请重新输入进程\n");return 0;}else{printf("系统是安全的。
操作系统实验-银行家算法

银行家算法1.目的和要求本实验的目的是通过银行家算法模拟设计,了解死锁避免的基本原理,掌握安全状态和银行家算法算法。
2.实验内容用高级语言实现银行家算法,避免系统中的进程陷入死锁状态。
3.实验环境4.实验提示4.1 银行家算法在实施资源分配之前,先计算该次分配后所产生的状态是否安全,即是否存在一种顺序,使得所有的进程都能执行结束。
若安全则分配,否则拒绝分配。
Ps:安全状态:指系统能按照某种顺序如<P1,P2,…Pn>(称其为安全序列),来为每个进程分配其所需资源,直至最大需求,使每个进程都可顺利完成。
若不存在这样的一个安全序列,则称系统处于不安全状态。
○1银行算法中的数据结构:1.可利用资源向量Available:是一个含有m个元素的数组,其中每个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类资源全部可用资源数目。
2.最大需求矩阵Max:是一个n*m的矩阵,Max(i,j)=k表示进程i需要Rj资源的最大数目是k个。
3.分配矩阵Allocation:是一个n*m的矩阵, Allocation(i,j)=k表示进程i当前已分得Rj资源k个。
4.需求矩阵Need:也是一个n*m的矩阵, Need(i,j)=k表示进程i还需要Rj资源k个。
Need[i,j]=Max[i,j]-Allocation[i,j]○2安全性算法:1.设置两个向量:1)工作向量Work。
表示系统可供给进程继续运行所需要的各类资源数目。
2)Finish。
表示系统是否有足够的资源分配给进程。
2.从进程集合中找到一个能满足下述条件的进程:Finish[i]=false; Need i<=Work;如找到,执行步骤3;否则,执行步骤4。
3.当进程P i获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: Work=Work+Allocation;Finish[i]=true ;go to step 2;4.如果所有进程P i的Finish[i]=true ,则表示系统出于安全状态;否则,系统处于不安全状态。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
int n,m;
struct info
{
int claim[50];
int allocation[50];
int need[50];
}pro[50];
int available[50];
int request[50];
void init()
{ int i,j;
printf("请输入资源种类数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{ printf("请输入第%d个资源的最大资源数:\n",i);
scanf("%d",&available[i]);
}
printf("请输入进程数:");
scanf("%d",&m);
printf("请输入各进程对各资源的最大需求数:\n");
for(i=0;i<m;i++)
{ printf("请输入第%d进程对各资源的最大需求数:\n",i);
for(j=0;j<n;j++)
{
scanf("%d",&pro[i].claim[j]);
pro[i].allocation[j]=0;
pro[i].need[j]=pro[i].claim[j];
}
}
printf("\n");
}
int safe()
{ int work[101];
int finish[101];
int xulie[101];
int i,j,k,w=0;
int flag=1,t=0;
for(i=0;i<m;i++)
finish[i]=0;
for(i=0;i<n;i++)
work[i]=available[i];
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
if(finish[j]==0)
{
for(k=0;k<n ;k++)
{
if(flag==1&&work[k]>=pro[j].need[k])
flag=1;
else
flag=0;
}
if(flag==1)
{
for(k=0;k<n;k++)
work[k]=work[k]+pro[j].allocation[k];
finish[j]=1;
xulie[w++]=j;
}
flag=1;
}
}
}
for(i=0;i<m;i++)
if(finish[i]==0) break;
if(i<m)
{
printf("系统是不安全的,进程等待,请重新输入进程\n");
return 0;
}
else
{
printf("系统是安全的。
\n安全序列为:");
for(i=0;i<m-1;i++)
printf("%d --> ",xulie[i]);
printf("%d\n",xulie[m-1]);
return 1;
}
}
void allo()
{
int i,j;
printf("请输入申请资源的进程号:\n");
scanf("%d",&i);
printf("请输入请求资源数量:\n");
for(j=0;j<n;j++)
{
printf("资源%d : ",j);
scanf("%d",&request[j]);
if(request[j]>pro[i].need[j])
{
printf("进程%d申请的资源数大于它所需要的%d类资源数,请重新输入.\n",i,j);
j=j-1;
continue;
}
else if(request[j]>available[j])
{
printf("进程%d申请的资源数大于剩余的%d类资源数,请重新输入.\n",i,j);
j=j-1;
continue;
}
}
for(j=0;j<n;j++)
{
available[j]=available[j]-request[j];
pro[i].allocation[j]=pro[i].allocation[j]+request[j];
pro[i].need[j]=pro[i].need[j]-request[j];
}
if(safe()==1)
printf("请求分配成功!\n");
else
{
printf("请求分配被拒绝!\n");
for(j=0;j<n;j++)
{
available[j]=available[j]+request[j];
pro[i].allocation[j]=pro[i].allocation[j]-request[j];
pro[i].need[j]=pro[i].need[j]+request[j];
}
}
}
main()
{
int i;
init();
do
{
printf("选择1--用银行家算法;选择0--退出");
scanf("%d",&i);
if(i==1)
allo();
}while(i==1);
}。