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

实验名称:死锁的检测与解除 姓名:杨秀龙

学号: 1107300432

指导老师:霍林

实验题目

死锁的检测与解除

实验目的

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

设计思想

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

主要数据结构

和银行家算法类似,需要建立相应的数组 int allocation[M][M]; int request[M][M]; int available[M];

int line[M]; //管理不占用资源的进程 int no[M]; //记录造成死锁的进程 int work[M];

流程图

运行结果

图(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];

intn,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

scanf("%d", &allocation[i][j]); printf("输入进程的请求矩阵request:\n"); for(i=0;i

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(f==0) {

printf("该系统将发生死锁!\n"); printf("造成死锁的进程为:"); for(i=0;i

void check()//死锁检测 { int k,; int x; int work[M]; for(i=0;i

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

void show() { printf("进程"); printf(" "); printf("allocation"); printf(" "); printf("request"); printf(" "); printf("available"); printf("\n");

for (i=0;i

printf(" "); for(j=0;j

printf("%2d",allocation[i][j]); printf(" "); for(j=0;j

printf("%2d",request[i][j]); printf(" printf("\n");

}

"); for(j=0;j0) break; printf("%2d",available[j]); } }

实验名称:死锁的检测与解除 姓名:杨秀龙

学号: 1107300432

指导老师:霍林

实验题目

死锁的检测与解除

实验目的

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

设计思想

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

主要数据结构

和银行家算法类似,需要建立相应的数组 int allocation[M][M]; int request[M][M]; int available[M];

int line[M]; //管理不占用资源的进程 int no[M]; //记录造成死锁的进程 int work[M];

流程图

运行结果

图(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];

intn,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

scanf("%d", &allocation[i][j]); printf("输入进程的请求矩阵request:\n"); for(i=0;i

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(f==0) {

printf("该系统将发生死锁!\n"); printf("造成死锁的进程为:"); for(i=0;i

void check()//死锁检测 { int k,; int x; int work[M]; for(i=0;i

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

void show() { printf("进程"); printf(" "); printf("allocation"); printf(" "); printf("request"); printf(" "); printf("available"); printf("\n");

for (i=0;i

printf(" "); for(j=0;j

printf("%2d",allocation[i][j]); printf(" "); for(j=0;j

printf("%2d",request[i][j]); printf(" printf("\n");

}

"); for(j=0;j0) break; printf("%2d",available[j]); } }


相关内容

  • 多处理机系统的死锁检测方法[综述]
  • 多处理机系统的死锁检测方法 摘要:在多处理机系统中,并发性得到了有效利用,但并发程序的不确定性使得死锁检测十分困难.针对现有的工作集中在使用分析.验证或测试的单一途径来检测死锁这一问题,本文通过分析现有工具的死锁检测能力,提出了综合使用工具的死锁检测方法.同时根据分析.验证和测试途径的不同特点,给出 ...

  • linux死锁检测的一种思路
  • 前言: 上一篇博文讲述了pstack的使用和原理. 和jstack一样, pstack能获取进程的线程堆栈快照, 方便检验和性能评估. 但jstack功能更加的强大, 它能对潜在的死锁予以提示, 而pstack只提供了线索, 需要gdb进一步的确定. 那Linux下, 如何去检测死锁, 如何让死锁的 ...

  • 数据库并发控制技术(3)
  • 在2级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读. 3级封锁协议3级封锁协议的内容是:1级封锁协议加上事务T在读取数据之前必须先对其加S锁,直到事务结束才释放.3级封锁协议除防止丢失或覆盖更新和不脏读数据外,还进一步防止了不可重复读和幻想读.例如下图,使用3级封锁协议解决了不可重 ...

  • 银行家算法模拟
  • 实验四 银行家算法模拟 [开发语言及实现平台或实验环境] C++/C# Microsoft Visual Studio 6.0/ Microsoft Visual Studio .NET 2003 [实验目的] (1)进一步理解利用银行家算法避免死锁的问题: (2)在了解和掌握银行家算法. (3)理 ...

  • 3-1处理机调度与死锁-作业
  • 第三章 处理机调度与死锁 1.选择题 1.下列算法中,操作系统用于作业调度的算法是. A.先来先服务算法 B.先进先出算法 C.最先适应算法 D.时间片轮转算法 2.在批处理系统中,周转时间是指 A.作业运行时间 B.作业等待时间和运行时间之和 C.作业的相对等待时间 D.作业被调度进入内存到运行完 ...

  • 死锁产生的原因和解锁的方法
  • 产生死锁的四个必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用. (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. (3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺. (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系. 二 ...

  • 2012华为校园招聘上机笔试题+机试+自己做出来的(转)
  • 1. 从两个数组的最后一个元素比较两个数组中不同元素的个数,如有 array1[5]={77,21,1,3,5}, array2[3]={1,3,5},从array1[4]与array2[2]比较开始,到array1[2]与array[0]比较结束.这样得出它们不同的元素个数为0,若array1[6 ...

  • 计算机安全技术三
  • 网络安全 48.堡垒主机位于内部网络的最外层 体的运行安全. 1.网络安全的基本属性是机密性.机密性.完整性 49.按地址过滤是最简单的过滤方式,它只限制数据包的93.说法错误的是安全问题是静态的 2.计算机病毒是计算机系统中一类隐藏在存储介质蓄意源地址和目的地址. 94.风险的识别与评估是安全管理 ...

  • 数据库期末考试简答题题型
  • 第1章 绪论 1 .试述数据.数据库.数据库系统.数据库管理系统的概念. 答: ( l)数据( Data ) :描述事物的符号记录称为数据.数据的种类有数字.文字.图形.图像.声音.正文等. ( 2 ) 数据库( DataBase ,简称 DB ) :数据库是长期储存在计算机内的.有组织的.可共享的 ...