银行家算法
来源:互联网 发布:备份与恢复软件 编辑:程序博客网 时间:2024/06/15 22:32
实验:银行家算法
实验设计说明:
1. 在程序开头声明进程名字name,进程状态finish,进程的最大需求量MAX,还需要的资源need,各类资源的总数allsourse,可利用的资源available,进程已分配的资源allocation;
2. 输入数据后先把各进程已分配的资源allocation和need输出;
3. 然后在bank函数中,先给work向量赋予available的值,接着进行判断。
4. 如果进程的初始状态为F,且进程所需的各类资源小于work,则给进程分配资源,运行完后释放资源,并将状态设为T,并将i的值设为-1(目的成功执行后又重头开始);
5. 循环执行4;
6. 最后判断进程为T的个数,如果等于进程个数,说明系统安全;否则安全;
实验代码:
#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
#define M 3
#define N 5
int R;//进程总数
int W;//资源总类数
char name[N];
char finish[N];
int MAX[N][M];
int need[N][M];
intallocation[N][M];
intallsourse[N];//各类资源的总数
intavailable[M];//可用的资源数
void output_allocation()
{
int i,j;
for(i=0;i<N;i++)
{
printf("%c",name[i]);
for(j=0;j<M;j++)
{
printf("%d",allocation[i][j]);
}
printf("\n");
}
}
void output_need()
{
int i,j;
for(i=0;i<N;i++)
{
printf("%c",name[i]);
for(j=0;j<M;j++)
{
printf("%d",need[i][j]);
}
printf("\n");
}
}
void bank()
{
int i=0,j=0;
int m=0,y=0;
int work[M];
for(i=0;i<M;i++)
{
work[i]=available[i];
}
for(i=0;i<N;i++)
{
if(finish[i]=='F')
{
if(need[i][m]<=work[m]&&need[i][m+1]<=work[m+1]&&need[i][m+2]<=work[m+2])
{
work[m]=work[m]+allocation[i][m];
work[m+1]=work[m+1]+allocation[i][m+1];
work[m+2]=work[m+2]+allocation[i][m+2];
finish[i]='T';
printf("name\tneed\tallocation\twork\tfinish\t\n");
printf("%c %d %d %d %d %d %d %d %d %d %c",name[i],need[i][m],need[i][m+1],need[i][m+2],allocation[i][m],allocation[i][m+1],allocation[i][m+2],work[m],work[m+1],work[m+2],finish[i]);
printf("\n");
i=-1;//重头开始判断
}
}
}
for(i=0;i<N;i++)
{
if(finish[i]=='T')
y++;
}
if(y==N)
{
printf("系统是安全的");
}
else
{
printf("系统不安全 ");
}
}
int main()
{
intR,W,i,j,p;
printf("进程总数为:");
scanf("%d",&R);
printf("资源总类数为:");
scanf("%d",&W);
printf("各进程名为:\n");
for(i=0;i<R;i++)
{
scanf("%s",&name[i]);
}
printf("各进程初始状态:\n");
for(i=0;i<R;i++)
{
scanf("%s",&finish[i]);
}
printf("各资源总数为:\n");
for(i=0;i<W;i++)
{
scanf("%d",&allsourse[i]);
}
printf("各进程的最大需求量:\n");
printf("注意最大需求量要小于各进程总数:");
for(i=0;i<R;i++)
{
for(j=0;j<W;j++)
scanf("%d",&MAX[i][j]);
}
printf("已分配的资源总数:\n");
for(i=0;i<R;i++)
{
for(j=0;j<W;j++)
scanf("%d",&allocation[i][j]);
}
output_allocation();
printf("还需要的资源数:\n");
for(i=0;i<R;i++)
{
for(j=0;j<W;j++)
{
need[i][j]=MAX[i][j]-allocation[i][j];
}
}
output_need();
printf("各类可利用的资源数:");
for(i=0;i<W;i++)
{
p=allsourse[i];
for(j=0;j<R;j++)
p=p-allocation[j][i];
available[i]=p;
}
for(i=0;i<W;i++)
{
printf("%d",available[i]);
}
printf("\n");
bank();
}
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- PAT-A 1075. PAT Judge (25)
- 5-13 Insert or Merge (25分)
- 从0开始学习 GitHub 系列之「01.初识 GitHub」
- Java并发之同步工具类
- 关于指向派生类的基类指针或引用
- 银行家算法
- 三星霸气垄断 OLED手机面板供不应求
- mysql在连接中删除root账号
- 欢迎使用CSDN-markdown编辑器
- java中常见的中文乱码总结
- Servlet Filter 技术防止XSS攻击的过滤器例子
- Apache配置同一IP使用多域名对应多个网站
- Eclipse下junit@Test出现Type mismatch: cannot convert from Test to Annotation错误
- python3生成csv文件的正确姿势