计算机操作系统5.docx
- 文档编号:15132815
- 上传时间:2023-07-01
- 格式:DOCX
- 页数:11
- 大小:52.97KB
计算机操作系统5.docx
《计算机操作系统5.docx》由会员分享,可在线阅读,更多相关《计算机操作系统5.docx(11页珍藏版)》请在冰点文库上搜索。
计算机操作系统5
计算机操作系统实验报告
姓名:
班别:
学号:
一,实验题目:
银行家算法实现
二,实验目的:
了解掌握银行家算法,学会模拟实现资源分配,同时有要求编写和调试一个系统分配资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生.
三,实验内容:
在多道程序系统中,虽可借助与多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险---死琐。
产生死锁的原因可归结为两点:
1:
竞争资源。
当系统中供多个进程共享的资源如打印机、公用队列等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁。
2:
进程间推进顺序非法。
进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生进程死锁。
最有代表性的避免死锁的算法,是Dijkstra的银行家算法。
这是由于该算法能用与银行系统现金贷款的发放而得名的。
实验要求:
运行所设计的银行家算法,打印所运行的结果。
四,实验步聚:
1.算法描述:
设Request[i]是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Rj类型的资源,当Pi发出资源请求后,系统按下面步骤进行检查:
(1)如果Requesti[j]<=Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Requesti[j]<=Available[j],便转向步骤3;否则,表示尚无足够资源,Pi须等待。
(3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:
Available[j]:
=Available[j]-Requesti[j];Allocation[i,j]:
=Allocation[i,j]+Requesti[j];Need[i,j]:
=Need[i,j]-Requesti[j];
(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
数据结构银行家算法中的数据结构:
(1)可利用资源向量Available。
这是一个含有n个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。
如果Available[j]=K,则表示系统中现有Rj类资源K个。
(2)最大需求矩阵Max。
这是一个m*n的矩阵,它定义了系统中n个进程中每一个进程对m类资源的最大需求。
如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
(3)分配矩阵Allocation。
这也是一个m*n的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。
如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。
(4)需求矩阵Need。
这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。
如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。
(5)工作数组Work.。
这是一个含有n个元素的数组,它代表可以提供分配的资源数,初始值是Available中的数值,随着资源的回收,它的值也会改变,公式是Work[i]=Work[i]+Allocation[i]。
五,实验结果:
六,实验总结:
通过本次实验我了解掌握银行家算法,学会模拟实现资源分配,编写和调试一个系统分配资源的简单模拟程序,观察死锁产生的条件,使用了适当的算法,有效的防止和避免死锁的发生。
七,附录
#include
#include
#include
#defineSOURCESIZE3
#definePCBSIZE5
typedefstruct{
charname[3];
intMax[SOURCESIZE];//最大需求矩阵
intAllocation[SOURCESIZE];//分配矩阵
intNeed[SOURCESIZE];//需求矩阵
intfinish;
}PCB;
//初始化进程
PCB*InitPCB()
{
PCB*p=(PCB*)malloc(PCBSIZE*sizeof(PCB));
inti,j;
printf("InputtheMaxvectorandAllocationvector:
\n");
printf("name\t%s\t%s\n","Max","Allocation");
for(i=0;i { strcpy(p[i].name,"p"); itoa(i,&p[i].name[1],10); printf("%s\t",p[i].name); for(j=0;j { scanf("%d",&p[i].Max[j]); } for(j=0;j { scanf("%d",&p[i].Allocation[j]); } for(j=0;j { p[i].Need[j]=p[i].Max[j]-p[i].Allocation[j]; } } returnp; } //初始化可用向量 int*InitAvailable() { int*Available=(int*)malloc(SOURCESIZE*sizeof(int)); printf("InputtheAvailablevector: "); for(inti=0;i { scanf("%d",&Available[i]); } printf("\n"); returnAvailable; } //打印数组 voidPrintArray(intarray[]) { for(inti=0;i { if(i==SOURCESIZE-1) printf("%-8d",array[i]); else printf("%-4d",array[i]); } } //银行家算法检查系统是否安全 intCheckPCB(PCB*p,int*Available) { intwork[SOURCESIZE],i,j; intfinish=0,count=0;//finish用于计数完成的进程 for(i=0;i work[i]=Available[i]; for(i=0;i p[i].finish=false; printf("run: \nname\t%-16s%-16s","Work","Need"); printf("%-16s%-16s%s\n","Allocation","Available","finish"); //找不到满足要求的进程时跳出循环 while(finish { for(i=0,count=0;i { if(p[i].finish==false) { for(j=0;j { if(p[i].Need[j]>work[j]) break; } //need[i,j]<=work[j]&&p[i].finish==true if(j==SOURCESIZE) { count=0; finish++; p[i].finish=true; //打印完成的进程 printf("%s\t",p[i].name); PrintArray(work); PrintArray(p[i].Need); PrintArray(p[i].Allocation); for(j=0;j { work[j]+=p[i].Allocation[j]; } PrintArray(work); printf("true\n"); } } } } for(i=0;i { //打印未完成进程 if(p[i].finish==false){ printf("%s\t",p[i].name); PrintArray(work); PrintArray(p[i].Need); PrintArray(p[i].Allocation); PrintArray(work); printf("false\n"); } } intflag; if(finish==PCBSIZE) { printf("Thesystemissafe.\n\n"); flag=true; } else { printf("Thesystemisnotsafe.\n\n"); flag=false; } returnflag; } //进程发起请求资源 voidRequestPCB(PCB*p,int*Available) { inti,j,k; printf("Request: \ninputthenumberofprocess: "); scanf("%d",&i); printf("inputtheRequestvector: "); for(j=0;j { scanf("%d",&k); p[i].Allocation[j]+=k; p[i].Need[j]-=k; Available[j]-=k; } printf("\n"); } intmain() { PCB*p=InitPCB(); int*Available=InitAvailable(); //打印各进程需要资源信息 printf("info: \nname\t%-16s%-16s","Max","Allocation"); printf("%-16s%s\n","Need","Available"); for(inti=0;i { printf("%s\t",p[i].name); PrintArray(p[i].Max); PrintArray(p[i].Allocation); PrintArray(p[i].Need); if(i==0) PrintArray(Available); printf("\n"); } printf("\n"); if(! CheckPCB(p,Available)) { exit(0); } RequestPCB(p,Available); //打印各进程需要资源信息 printf("info: \nname\t%-16s%-16s","Max","Allocation"); printf("%-16s%s\n","Need","Available"); for(i=0;i { printf("%s\t",p[i].name); PrintArray(p[i].Max); PrintArray(p[i].Allocation); PrintArray(p[i].Need); if(i==0) PrintArray(Available); printf("\n"); } printf("\n"); if(! CheckPCB(p,Available)) { exit(0); } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 操作系统