欢迎来到天天文库
浏览记录
ID:25448624
大小:60.00 KB
页数:6页
时间:2018-11-20
《用c++实现进程安全序列搜索算法》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、用C++实现进程安全序列搜索算法用C++实现进程安全序列搜索算法 在多道程序系统中,可通过多个进程的并发执行来改善系统的资源利用率,提高系统的处理能力。为了避免与时间有关的错误,人们建立了各种同步机构。但是有这样一种种与时间有关的错误需要进一步研究和探讨,这就是死锁问题。所谓死锁是指两个或两个以上进程处于无休止地等待永远不成立的条件的状态。 Dijkstra的银行家算法是最有代表性的避免死锁算法。允许进程动态地申请资源,系统在进行资源分配之前,先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,便将资源分配给进程;否则,进程进入等待状
2、态。所谓安全状态,是指系统能按某种顺序(P1,P2,,Pn)来为每个进程分配其所需资源,直至最大需求,使每个进程都可顺序完成。我们称(P1,P2,,Pn)序列为安全序列。若系统不存在这样一个安全序列,则称系统处于不安全状态。 1算法的设计与流程 1.1算法流程图 如图1所示。 1.2算法的数据结构 1)可利用资源向量Available,它是一个最多含有100个元素的数组,其中的每一个元素代表一类可利用的资源的数目,其初始值是系统中所配置的该类全部可用资源数目。其数值随该类资源的分配和回收而动态地改变。如果Available(j)=k,标
3、是系统中现有j类资源k个。 2)最大需求矩阵Max,这是一个nm的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max(i,j)=k,表示进程i需要j类资源的最大数目为k。 3)分配矩阵Allocation,这也是一个nm的矩阵,它定义了系统中的每类资源当前一分配到每一个进程的资源数。如果Allocation(i,j)=k,表示进程i当前已经分到j类资源的数目为k。Allocationi表示进程i的分配向量,有矩阵Allocation的第i行构成。 4)需求矩阵Need,这还是一个nm的矩阵,用以表示每个进程还需要的各
4、类资源的数目。如果Need(i,j)=k,表示进程i还需要j类资源k个,才能完成其任务。Needi表示进程i的需求向量,由矩阵Need的第i行构成。 5)上述三个矩阵间存在关系:Need(i,j)=Max(i,j)-Allocation(i,j); 1.3安全性检测 1)如果Requesti≤Need,则转向步骤2;否则,认为出错,因为它所请求的资源数已超过它当前的最大需求量。 2)如果Requesti≤Available,则转向步骤3;否则,表示系统中尚无足够的资源满足i的申请,i必须等待。 3)系统试探性地把资源分配给进
5、程i,并修改下面数据结构中的数值: Available=Available-Requesti Allocationi=Allocationi+Requesti Needi=Needi-Requesti 4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。如果安全才正式将资源分配给进程i,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程i等待。 2算法的实现 用C++语言编写主体程序如下: #include #include<STRING.H> #include<STDIO.H&
6、gt; #defineFalse0 #defineTrue1 usingnamespacestd; intMax[100][100]={0};//各进程所需各类资源的最大需求intAvaliable[100]={0};//系统可用资源.L. charname[100]={0};//资源的名称 intAllocation[100][100]={0};//系统已分配资源 intNeed[100][100]={0};//还需要资源 intRequest[100]={0};//请求资源向量 inttemp[100]={0};//存放安全
7、序列 int=100;//进程的最大数为 intN=100;//资源的最大数为 intsafe()//安全性算法 {inti,k=0,m,apply,Finish[100]={0}; intj; intflag=0; ;I++){ apply=0; for(j=0;j<N;J++){ if(Finish[i]==FalseNeed[i][j]<=++) ;I++){ if(Finish[i]==False){ cout<<"系统不安全"<<ENDL;不成功系统不安全 return-1;
8、}} cout<<"系统是安全的!"<<ENDL;如果安全,输出成功 cout<<"分配的序列:
此文档下载收益归作者所有