死锁的机制与预防
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
死锁产生的原因及四个必要条件
产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之
一不满足,就不会发生死锁。
死锁的解除与预防:
理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和
解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确
定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态
的情况下占用资源。因此,对资源的分配要给予合理的规划。
比较有名气的预防思索的算法是银行家算法:
银行家算法设计:
1.设进程i提出请求Request[n],则银行家算法按如下规则进行判断。
(1)如果Request[n]>Need[i,n],则报错返回。
(2)如果Request[n]>Available,则进程i进入等待资源状态,返回。
(3)假设进程i的申请已获批准,于是修改系统状态:
Available=Available-Request
Allocation=Allocation+Request
Need=Need-Request
(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
2.安全性检查
(1)设置两个工作向量Work=Available;Finish =False
(2)从进程集合中找到一个满足下述条件的进程,
Finish =False
Need<=Work
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work=Work+Allocation
Finish=True
GO TO 2
(4)如所有的进程Finish =true,则表示安全;否则系统不安全。
3.数据结构
假设有M个进程N类资源,则有如下数据结构:
#define W 10
#define R 20
int A ; //总进程数
int B ; //资源种类
int ALL_RESOURCE[W]; //各种资源的数目总和
int MAX[W] ; //M个进程对N类资源最大资源需求量
int AVAILABLE ; //系统可用资源数
int ALLOCATION[W] ; //M个进程已经得到N类资源的资源量
int NEED[
W] ; //M个进程还需要N类资源的资源量
int Request ; //请求资源个数
5.4主要函数说明
void showdata(); //主要用来输出资源分配情况
void changdata(int); //主要用来输出资源分配后后的情况
void rstordata(int); //用来恢复资源分配情况,如:银行家算法时,由于分配不安全则要恢复资源分配情况
int chkerr(int); //银行家分配算法的安全检查
void bank() ; //银行家算法
银行家算法的课程设计(二)VC++6.02008-01-28 15:29源程序
数据结构分析:
假设有M个进程N类资源,则有如下数据结构:
#define W 10
#define R 20
int A ; //总进程数
int B ; //资源种类
int ALL_RESOURCE[W]; //各种资源的数目总和
int MAX[W] ; //M个进程对N类资源最大资源需求量
int AVAILABLE ; //系统可用资源数
int ALLOCATION[W] ; //M个进程已经得到N类资源的资源量
int NEED[W] ; //M个进程还需要N类资源的资源量
int Request ; //请求资源个数
第3章 程序清单#include
using namespace std;
#define MAXPROCESS 50 /*最大进程数*/
#define MAXRESOURCE 100 /*最大资源数*/
int AVAILABLE[MAXRESOURCE]; /*可用资源数组*/
int MAX[MAXPROCESS][MAXRESOURCE]; /*最大需求矩阵*/
int ALLOCATION[MAXPROCESS][MAXRESOURCE]; /*分配矩阵*/
int NEED[MAXPROCESS][MAXRESOURCE]; /*需求矩阵*/
int REQUEST[MAXPROCESS][MAXRESOURCE]; /*进程需要资源数*/
bool FINISH[MAXPROCESS]; /*系统是否有足够的资源分配*/
int p[MAXPROCESS]; /*记录序列*/
int m,n; /*m个进程,n个资源*/
void Init();
bool Safe();
void Bank();
int main()
{
Init();
Safe();
Bank();
}
void Init() /*初始化算法*/
{
int i,j;
cout<<"\t---------------------------------------------------"<
cin>>m;
cout<<"请输入资源的种类:";
cin>>n;
cout<<"请输入每个进程最多所需的各资源数,按照"<
cout<<"请输入每个进程已
分配的各资源数,也按照"<
for(j=0;j
cin>>ALLOCATION[j];
NEED[j]=MAX[j]-ALLOCATION[j];
if(NEED[j]<0)
{
cout<<"您输入的第"<j--;
continue;
}
}
}
cout<<"请输入各个资源现有的数目:"<
cin>>AVAILABLE;
}
}
void Bank() /*银行家算法*/
{
int i,cusneed;
char again;
while(1)
{
cout<<"请输入要申请资源的进程号(注:第1个进程号为0,依次类推)"<
cout<<"请输入进程所请求的各资源的数量"<
cin>>REQUEST[cusneed];
}
for(i=0;i
if(REQUEST[cusneed]>NEED[cusneed])
{
cout<<"您输入的请求数超过进程的需求量!请重新输入!"<
}
if(REQUEST[cusneed]>AVAILABLE)
{
cout<<"您输入的请求数超过系统有的资源数!请重新输入!"<
}
}
for(i=0;i
AVAILABLE-=REQUEST[cusneed];
ALLOCATION[cusneed]+=REQUEST[cusneed];
NEED[cusneed]-=REQUEST[cusneed];
}
if(Safe())
{
cout<<"同意分配请求!"<
else
{
cout<<"您的请求被拒绝!"<
AVAILABLE+=REQUEST[cusneed];
ALLOCATION[cusneed]-=REQUEST[cusneed];
NEED[cusneed]+=REQUEST[cusneed];
}
}
for(i=0;i
FINISH=false;
}
cout<<"您还想再次请求分配吗?是请按y/Y,否请按其它键"<
if(again=='y'||again=='Y')
{
continue;
}
break;
}
}
bool Safe() /*安全性算法*/
{
int i,j,k,l=0;
int Work[MAXRESOURCE]; /*工作数组*/
for(i=0;i
for(i=0;i
FINISH=false;
}
for(i=0;i
if(FINISH==true)
{
continue;
}
else
{
for(j=0;j
if(NEED[j]>Work[j])
{
break;
}
}
if(j==n)
{
FINISH=true;
for(k=0;k
Work[k]+=ALLOCATION[k];
} if(i!=l-1)
p[l++]=i;
i=-1;
}
else
{
continue;
}
}
if(l==m)
{
cout<<"系统是安全的"<
cout<
{
cout<<"-->";
}
}
cout<<""<
}
}
cout<<"系统是不安全的"<
}