死锁的检测与解除C语言代码

  • 格式:docx
  • 大小:236.56 KB
  • 文档页数:8

下载文档原格式

  / 8
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验名称:死锁的检测与解除*名:***

学号:**********

专业班级:创新实验班111 指导老师:**

实验题目

死锁的检测与解除

实验目的

为了更清楚系统对死锁是如何检测和当死锁发生时如何解除死锁

设计思想

首先需要建立和银行家算法类似的数组结构,先把孤立的进程(没有占用资源的进程)放入一个数组中,根据死锁原理,找出既不阻塞又非独立的进程结点,使之成为孤立的结点并放入孤立数组中,再释放该进程的占用资源,继续寻找下一个孤立结点,如果所有进程都能放入孤立数组中,则系统不会发生死锁,如果有进程不能放入,则系统将发生死锁,并进行死锁解除,撤消所有的死锁进程,释放它们占用的资源。

主要数据结构

和银行家算法类似,需要建立相应的数组

int allocation[M][M];

int request[M][M];

int available[M];

int line[M]; //管理不占用资源的进程

int no[M]; //记录造成死锁的进程

int work[M];

流程图

开始

结束

输入总进程

输入资源数

输入Request

矩阵

输入Allocation

矩阵

是否发生死锁

死锁解除

输入available

矩阵

运行结果

图(1)不会发生死锁时

图(1)当发生死锁时

附录

源代码如下:

# include "stdio.h"

# define M 50

int allocation[M][M];

int request[M][M];

int available[M];

int line[M];

int no[M];

int n,m,i,j,f,a=0;

main()

{

void check();

void remove();

void show();

printf("输入进程总数:");

scanf("%d", &n);

printf("输入资源种类数量:");

scanf("%d", &m);

printf("输入进程已占用的资源Allocation:\n");

for(i=0;i

for(j=0;j

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

printf("输入进程的请求矩阵request:\n");

for(i=0;i

for(j=0;j

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

printf("输入系统可利用资源available:\n");

for (j=0;j

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

show();

check();

f=1;

for(i=0;i

{

if(line[i]==0)

{f=0;

no[a++]=i;//记录死锁序号

}

}

if(f==0)

{

printf("该系统将发生死锁!\n");

printf("造成死锁的进程为:");

for(i=0;i

printf("%2d",no[i]);

printf("\n");

remove();

show();

}

else{

printf("不会发生死锁!\n");

}

}

void check()//死锁检测

{

int k,;

int x;

int work[M];

for(i=0;i

line[i]=0;

for(i=0;i

{ x=0;

for(j=0;j

{

if(allocation[i][j]==0)

x++;

if(x==m)

line[i]=1;

}

}

for(j=0;j

work[j]=available[j];

k=n;

do{

for (i=0;i

{

if(line[i]==0)

{

f=1; //空置条件是否满足

for (j=0;j

if (request[i][j]>work[j])

f=0;

if (f==1) //找到满足条件的进程

{ line[i]=1;

for (j=0;j

work[j]=work[j]+allocation[i][j]; //释放资源

available[j]=work[j];

}

}

}

k--;

}while(k>0);

}

void remove() //死锁解除

{

for(i=0;i

{

if(line[i]==0)

{

for(j=0;j

{

available[j]+=allocation[i][j];

allocation[i][j]=0;

request[i][j]=0;

}

}

}

printf("死锁解除!\n");

}

void show()

{

printf("进程");

printf(" ");

printf("allocation");

printf(" ");

printf("request");

printf(" ");

printf("available");

printf("\n");