您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 课程设计-死锁的检测与分析系统的设计
**大学计算机科学与技术学院课程设计报告(2006~2007学年度第2学期)课程名称操作系统课程设计项目名称死锁的检测与分析系统的设计姓名学号专业班级地点教师(一)设计任务与目的:目的与要求:本设计的目的是通过对死锁检测算法的模拟,来了解死锁检测中的数据结构的设计和使用以及资源分配图在死锁检测中的应用。具体要求如下:⑴模拟一个死锁检测算法;⑵该算法能通过简化资源分配图来检测死锁;⑶资源分配图可以用矩阵的形式表示;⑷输出结果为有死锁或无死锁。(二)设计思路及过程:(1)定义结构体数组noderesource[MAX];nodeprocess[MAX];(2)输入资源号和进程号并存入一维数组resource[MAX];和process[MAX];(3)将刚才输入的资源号和进程号按表格输出(见运行结果);(4)根据进程间的关系process[a].ziyuan==resource[b].ziyuan(5)将初始等待表中的list[process[a].jinchen][resource[b].jinchen]赋值为1;(6)根据bij=bij∨(bik∧bkj)判断初始等待占用表中的进程是否含有间接等待关系实现语句为:list[a][b]=list[a][b]||(list[a][k]&&list[k][b])(7)利用循环语句判断baa(a=1,2,…,n)是否等于1,取值为1时,就表示存在一组进程,它们循环等待资源,在资源分配图中会形成环路,也即系统出现了死锁,否则无死锁!(三)系统的原理框图(资源分配图按照我两次输入的数据来画):(1)第一次输入的资源表和进程表:资源分配表:进程等待表:资源号进程号进程号资源号111222233331(2)第二次输入的资源表和进程表:资源分配表:进程等待表:资源号进程号进程号资源号1222211333(四)实验中主要问题及故障现象的分析及设计结论:本实验主要出现的问题就是如何将资源分配图转化为矩阵的于那里比较难理解,编程方面利用FOR循环语句将其实现还是223131131232比较容易实现的,此实验的输出结果比较简单,但中间过程有点复杂,利用FOR语句比较多,但搞清了等待占用表的原理在编程方面就比较好实现了(五)编程体会和心得:刚看到‘死锁的检测与分析’感觉还是蛮简单的,但看了设计的任务之后感觉无从着手,没有思路,不能理解,然后回寝室后,连忙查看相关的书,以及通过上网查找相关的资料,最终对如何将资源分配图转化成矩阵有了初步的认识和了解。此次课程设计共用了大概一个星期时间,经过跟同学请教和看书.上网查找资料,最终将程序编写完成(按照附的等待占用表编写),并且符合了实验要求!通过这次实践,我很高兴可以学到书上没有的知识,让我对于死锁有了更深入的理解。我相信,只要自己在每一次实践中能仔细思考,课程设计其实都不会很难,关键在于自己能不能认真思考,能不能亲自动手做实验,而不是想着其他人的劳动果实,其次你还要多操作,只有多操作才能从中发现问题,才能及时向老师和同学请教,解决问题,从而更好的掌握书本中知识。还有通过这次实践也让我懂得了;老师安排课程设计目的不在于你做了多少,不在于你做得好不好,关键在于你能否认真去对待,在于你能否通过这次设计对课本上知识有了更深刻的认识,在于能否从中学到书本上学不到的知识。因此,我会认真地对待我的每一次实验。(六)源程序:#includeiostream.hvoidGAO(){coutendl;cout************************************************endl;cout*****死锁检测算法*****endl;cout**********endl;cout*****----madebyGAO*****endl;cout*****-------07.6.12*****endl;cout************************************************endl;coutendl;}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////typedefstruct//定义结构体{intziyuan;intjinchen;}node;//结构体变量constintMAX=99;//定义表的最大行数noderesource[MAX];//结构体变量数组nodeprocess[MAX];//结构体变量数组intRNUM;//定义资源数intPNUM;//定义进程数///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidfirst()//函数的初始化{ints;for(s=0;sMAX;s++)//将资源分配表和进程等待表中的资源号和进程号赋为0{resource[s].jinchen=0;resource[s].ziyuan=0;process[s].jinchen=0;process[s].ziyuan=0;}RNUM=0;PNUM=0;}//读数据文件///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////intinput()//输入资源表和进程表(以数字表示资源号和进程号){inti,x,y;cout请输入资源和进程的总数(中间以空格区分):endl;cinx;ciny;RNUM=x;PNUM=y;cout请输入资源分配表的资源号(中间以空格区分):endl;for(i=0;iRNUM;i++){cinresource[i].ziyuan;}cout请输入资源分配表的进程号(中间以空格区分):endl;for(i=0;iRNUM;i++){cinresource[i].jinchen;}cout请输入进程等待表的进程号(中间以空格区分):endl;for(i=0;iPNUM;i++){cinprocess[i].ziyuan;}cout请输入进程等待表的资源号(中间以空格区分):endl;for(i=0;iPNUM;i++){cinprocess[i].jinchen;}cout----------------------------------------------------endl;//输出刚才输入的资源表和进程表cout资源分配表:endl;cout资源编号进程编号endl;for(i=0;iRNUM;i++){coutresource[i].ziyuanresource[i].jinchenendl;}cout----------------------------------------------------endl;cout进程等待表:endl;cout进程编号资源编号endl;for(i=0;iPNUM;i++){coutprocess[i].ziyuanprocess[i].jinchenendl;}return1;}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidsisuo()//定义类检验是否死锁{intlist[MAX][MAX];//定义二维数组代表输入的资源和进程号inta,b,k,sign,maxpp=0;for(a=0;aMAX;a++){for(b=0;bMAX;b++){list[a][b]=0;//初始化数组,将数组的每个元素初始化为0}}for(a=0;aRNUM;a++)//在资源表和进程表中寻找最大进程号{if(resource[a].jinchenmaxpp){maxpp=resource[a].jinchen;}}for(a=0;aPNUM;a++){if(process[a].jinchenmaxpp){maxpp=process[a].jinchen;}}for(a=0;aPNUM;a++)//构造初始等待占用表{for(b=0;bRNUM;b++){if(process[a].ziyuan==resource[b].ziyuan){list[process[a].jinchen][resource[b].jinchen]=1;}}}cout初始时的等待占用表:endl;//输出初时等待占用表for(a=1;amaxpp+1;a++){for(b=1;bmaxpp+1;b++){coutlist[a][b];}coutendl;}coutendl;for(a=0;amaxpp+1;a++){for(b=0;bmaxpp+1;b++){for(k=0;kmaxpp+1;k++){list[a][b]=list[a][b]||(list[a][k]&&list[k][b]);//根据bij=bij∨(bik∧bkj)判断初始等待占用表中的进程是否含有间接等待关系}}}cout检测后的等待占用表:endl;//输出检测后的等待占用表for(a=1;amaxpp+1;a++){for(b=1;bmaxpp+1;b++){coutlist[a][b];}coutendl;}coutendl检测结果(是否存在死锁):endl;//判断是否存在死锁cout----------------------------------------------endl;for(a=0;amaxpp+1;a++){if(list[a][a]==1)//利用循环语句判断baa(a=1,2,…,n)是否等于1,取值为1时,就表示存在一组进程,它们循环等待资源,在资源分配图中会形成环路,也即系统出现了死锁{sign=1;//标志break;}}if(sign==1){cout存在死锁endl;}if(sign!=1){cout不存在死锁endl;}}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidmain()//主函数{GAO();first();input();sisuo();}(七)实验结果(如图):附:(1)系统软件硬件环境:apple操作系统,AMDAthlon(tn)64Processor3000+,1.81GHz,480MB的内存,在microsoftvisualc++6.0上运行成功。(2)实验数据:resource[s].jinchen=0;资源分配表中的进程号resource[s].ziyuan=0;资源分配表中的资源号process[s].jinchen=0;进程等待表中的进程号process[s].ziyuan=0;进程等待表中的资源号RNUM=0;资源总数PNUM=0进程总数(3)使用说明及参考资料:因为书上没有写关于等待占用表这方面的知识,所
本文标题:课程设计-死锁的检测与分析系统的设计
链接地址:https://www.777doc.com/doc-4742948 .html