Linux--死锁产生条件及避免死锁算法

一.什么是死锁?

所谓死锁是指在多道程序系统中,一组进程中的每一个进程均无限期的等待被该组进程中的另一个进程所占有且永远不会释放的资源,这种现象称系统处于死锁状态。

 

二.死锁产生的原因?

1.竞争资源,系统产生的资源有限不能满足每个进程的需求。

2.多道程序运行时,进程推进顺序不合理。

 

三.形成死锁四个必要条件?

1.互斥使用资源

2.请求和保持资源

3.不可抢夺资源

4.循环等待资源

 

四.解决死锁问题的方法?

解决思索问题一般有三种方法。

1.      死锁预防。

预先确定一些资源分配策略,进程按规定申请资源,系统按预定的策略进行分配,这些分配策略均能使产生思索的四个必要条件中的一个条件不成立,从而使系统不会发生死锁。

 

2.      死锁避免。

当进程提出资源申请时系统动态测试资源分配情况,仅当能确保系统安全时才把资源分配给进程。一个死锁避免常用的算法是银行家算法。

 

银行家算法:见下

 

3.      死锁检测和解除。

允许系统中发生死锁现象,及对资源的申请和分配不加任何限制,只要有剩余的资源就把资源分配给申请进程,因此,就可能出现死锁。


银行家算法:

首先需要定义状态和安全状态的概念。系统的状态是当前给进程分配的资源情况。因此,状态包含两个向量Resource(系统中每种资源的总量)和Available(未分配给进程的每种资源的总量)及两个矩阵Claim(表示进程对资源的需求)和Allocation(表示当前分配给进程的资源)。安全状态是指至少有一个资源分配序列不会导致死锁。当进程请求一组资源时,假设同意该请求,从而改变了系统的状态,然后确定其结果是否还处于安全状态。如果是,同意这个请求;如果不是,阻塞该进程知道同意该请求后系统状态仍然是安全的。


blog:http://blog.csdn.net/speedme/article/details/17621471

#include <stdio.h> #include <string.h> #define M 50 int max[M][M], allocation[M][M],need[M][M],available[M]; /*定义全局变量*/ int i=0, j=0, n=0, m=0; /*n--进程数 m--资源种数*/ void main() { int SafeCheck(); void print(); int c,p,q; int req[M], allocation1[M][M],need1[M][M],available1[M]; printf("*****************银行家算法****************\n"); printf("请输入进程总数: "); scanf("%d", &n); /*输入进程总数*/ printf("请输入资源种类总数: "); scanf("%d", &m); /*输入资源种类总数*/ printf("请输入每个进程对每类资源的最大矩阵 :\n"); for(i=0;i<n; i++) { printf("进程%d:\n",i); for(j=0;j<m; j++) { printf("\t资源%d:",j); scanf("%2d",&max[i][j]); /*输入最大矩阵*/ } } printf("请输入每个进程每类资源已分配的资源数 :\n"); for(i=0;i<n; i++) { printf("进程%d:\n",i); for(j=0;j<m; j++) { printf("\t资源%d:",j); scanf("%d", &allocation[i][j]); /*输入已分配资源数*/ } } printf("还需要的资源数为 :"); for (i=0;i<n; i++) { printf("\n进程%d\n",i); for(j=0;j<m; j++) { need[i][j]=max[i][j]-allocation[i][j]; printf("\t资源%d:",j); printf("%2d",need[i][j]); /*输出还需要的资源数*/ } } printf("\n请输入每类资源的可用资源数:\n"); for (j=0;j<m; j++) { printf("\t资源%d:",j); scanf("%d", &available[j]); /*输入可用资源数*/ } /*检测已知的状态是否安全*/ if (SafeCheck()) /*如果已知的状态安全则执行以下代码*/ { do { p=0,q=0; printf("\n输入请求资源的进程号: P"); scanf("%d", &i); /*输入请求资源的进程号*/ printf("输入该进程所需的每类资源的资源数 :\n"); for(j=0;j<m; j++) { printf("\t资源 Z%d ",j); scanf("%d",&req[j]); /*输入该进程所需的资源数 */ } for(j=0;j<m; j++) if(req[j]>need[i][j]) /*判断请求是否超过最大资源数*/ { p=1; break; } if(p) printf("申请的资源数超过所需的资源数的最大值,拒绝分配资源!\n"); else { for(j=0;j<m; j++) if(req[j]>available[j]) /*判断请求是否超过可用资源数 */ { q=1; break; } if(q) printf("申请的资源数超过可用资源数的最大值,拒绝分配资源!\n"); else { for(j=0;j<m; j++) /*请求满足条件 */ { available1[j]=available[j]; /* 保存原已分配的资源数,需要的资源数,和可用的资源数*/ allocation1[i][j]=allocation[i][j]; need1[i][j]=need[i][j]; available[j]=available[j]-req[j]; /* 系统尝试把资源分配给请求的进程 */ allocation[i][j]=allocation[i][j]+req[j]; need[i][j]=need[i][j]-req[j]; } printf("试分配了资源.\n"); print(); /*输出可用资源数*/ /*进行安全检测*/ if(SafeCheck()==0) /*分配后状态不安全*/ { for (j=0;j<m; j++) { available[j]=available1[j]; /* 还原分配前的已分配的资 源数,仍需要的资源数和可用的资源数 */ allocation[i][j]=allocation1[i][j]; need[i][j]=need1[i][j]; } printf("系统不安全状态,拒绝分配资源!:\n"); printf("试分配作废,系统资源恢复!\n"); print(); } else { printf("资源分配成功!\n"); printf("系统新状态:\n"); printf("进程 已分配资源数 需要的资源数\n"); for (i=0;i<n; i++) { printf("%2d",i); printf(" "); for(j=0;j<m; j++) printf("%2d",allocation[i][j]); printf(" "); for(j=0;j<m; j++) printf("%2d",need[i][j]); printf("\n"); } print(); } } } printf("\nDo you want to continue? 1 or 0 ?\n"); /*判断是否继续进行资源分配*/ scanf("%d",&c); } while (c==1); } } int SafeCheck() /*安全性检测函数 */ { int k=0,f, v=0; int work[M],a[M]; char finish[M]; for(i=0;i<n; i++) finish[i]='F'; /*初始化各进程均没得到足够资源并等待完成*/ for(j=0;j<m; j++) work[j]=available[j]; /*用work[j]表示进程可用的各类资源数 */ k=n; do { /*for(j=0;j<m; j++) temp[j]=work[j]; 保存扫描进程前的可用资源数*/ for (i=0;i<n; i++) { if (finish[i]=='F') //检测待完成的进程 { f=1; for (j=0;j<m; j++) if (need[i][j]>work[j]) f=0; if (f==1) /*找到还没完成的且需求数小于可提供进程继续运行的*/ { finish[i]='T'; // 标志已完成的进程 a[v++]=i; /*记录安全序列 */ for (j=0;j<m; j++) work[j]=work[j]+allocation[i][j]; /*释放该进程已分配的资源*/ } } } /* for (j=0;j<m; j++) { if(temp[j]!=work[j]) k=1; }*/ }while(k--); f=1; for (i=0;i<n; i++) /*判断是否所有的进程都完成*/ { if (finish[i]=='F') { f=0; break; } } if (f==0) /*若有进程没完成,则为不安全状态*/ { printf("不安全状态.\n"); return(0); /*不安全状态标志*/ } else /* 否则为安全状态*/ { printf("系统为安全状态.\n"); printf("进程安全序列为:\n"); for (i=0;i<n;i++) printf ("%d ",a[i]); /*输出安全序列*/ printf("\n"); return(1); /*安全状态标志*/ } } void print() /*输出函数*/ { printf("系统可用资源: \n"); for(j=0;j<m; j++) { printf("\t资源%d ",j); printf("%2d ",available[j]); printf("\n"); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值