实验三 进程死锁

本文详细介绍了如何通过编程实现银行家算法,包括理解算法原理、构建数据结构和流程图,以及编写一个用于模拟系统资源分配和安全检查的C语言程序。通过实例展示了如何判断系统是否处于安全状态并处理资源请求。
摘要由CSDN通过智能技术生成

【实验目的】

1.理解银行家算法。

2.掌握进程安全性检查的方法及资源分配的方法。

【实验内容】

编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。

例4-1某系统有A、B、C、D4类资源共5个进程(PO、P1、P2、P3、P4)共享,

各进程对资源的需求和分配情况如表4-1所示。

表4-1各进程对资源的需求和分配情况表

进程

已占资源

最大需求数

A

B

C

D

A

B

C

D

P0

0

0

1

2

0

0

1

2

P1

1

0

0

0

1

7

5

0

P2

1

1

5

4

2

3

5

6

P3

0

6

3

2

0

6

5

2

P4

0

0

1

1

0

6

5

6

现在系统中A、B、C、D4类资源分别还剩1、5、2、0个,请按银行家算法回答下列问题:

①现在系统是否处于安全状态?

②如果现在进程Pl提出需要(0、4、2、0)个资源的请求,系统能否满足它的请求?

【实验步骤】

1.数据结构

int Available[100];//可利用资源数组

int Max[50][100];//最大需求矩阵

int Allocation[50][100];//分配矩阵

int Need[50][100];//需求矩阵

int Request[50][100];

int Finish[50];

int p[50];

int pnum,rnum;//pnum个进程,rnum个资源

int IsSafe()

2.程序流程图

银行家算法:

安全性算法:

3.实验代码

#include <stdio.h>

int Available[100];//可利用资源数组

int Max[50][100];//最大需求矩阵

int Allocation[50][100];//分配矩阵

int Need[50][100];//需求矩阵

int Request[50][100];

int Finish[50];

int p[50];

int pnum,rnum;//pnum个进程,rnum个资源

int IsSafe()

{

int i,j,l = 0;

int Work[100];//可利用资源数组

for(i = 0; i < rnum; i++)

Work[i]=Available[i];

for(i = 0; i < pnum; i++)

Finish[i]=0;

for(i = 0; i < pnum; i++)

{

if(Finish[i] == 1)

continue;

else

{

for(j = 0; j < rnum; j++)

{

if(Need[i][j]>Work[j])

break;

}

if(j == rnum)

{

int k = 0;

Finish[i] = 1;

for(k = 0; k < rnum; k++)

Work[k] += Allocation[i][k];

p[l++] = i;

i = -1;

}

else

continue;

}

if(l == pnum)

{

printf("系统是安全的!\n");

printf("安全序列是:\n");

for(i = 0; i < l; i++)

{

printf("P%d",p[i]);

if(i != l-1)

printf("-->");

}

printf("\n");

return 1;

}

}

}

int main()

{//银行家算法

int i,j,mi;

printf("输入进程的数目:\n");

scanf("%d",&pnum);

printf("输入资源的种类:\n");

scanf("%d",&rnum);

printf("输入每个进程最多所需的各资源数,按照%dx%d矩阵输入:\n",pnum,rnum);

for(i = 0; i < pnum; i++)

{

for(j = 0; j < rnum; j++)

{

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

}

}

printf("输入每个进程已分配的各资源数,也按照%dx%d矩阵输入:\n",pnum,rnum);

for(i = 0; i < pnum; i++)

{

for(j = 0; j < rnum; 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 < rnum; i++)

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

IsSafe();

while(1)

{

printf("输入要申请资源的进程号(注:第1个进程号为0,以此类推):\n");

scanf("%d",&mi);

printf("输入进程所请求的各资源的数量\n");

for(i = 0; i < rnum; i++)

scanf("%d",&Request[mi][i]);

for(i = 0; i < rnum; i++)

{

if(Request[mi][i] > Need[mi][i])

{

printf("你输入的请求数超过进程的需求量!\n");

return 0;

}

if(Request[mi][i] > Available[i])

{

printf("你输入的请求数超过系统有的资源数!\n");

return 0;

}

}

for(i = 0; i < rnum; i++)

{

Available[i] -= Request[mi][i];

Allocation[mi][i] += Request[mi][i];

Need[mi][i] -= Request[mi][i];

}

if(IsSafe() == 1)

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

else

{

printf("你的请求被拒绝!\n");

for(i = 0;i < rnum; i++)

{

Available[i] += Request[mi][i];

Allocation[mi][i] -= Request[mi][i];

Need[mi][i] += Request[mi][i];

}

for(i = 0; i < pnum; i++)

Finish[i] = 0;

char YesOrNo;

printf("你还想再次请求分配吗?是请输入y/Y,否请输入n/N,再确定.\n");

while(1)

{

fflush(stdin);

scanf("%c", &YesOrNo);

if(YesOrNo == 'y' || YesOrNo == 'Y' || YesOrNo == 'n' || YesOrNo == 'N')

break;

else

{

printf("请按要求输入!\n");

continue;

}

}

if(YesOrNo == 'y' || YesOrNo == 'Y')

continue;

else

break;

}

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值