操作系统课程设计实践报告_第1页
操作系统课程设计实践报告_第2页
操作系统课程设计实践报告_第3页
操作系统课程设计实践报告_第4页
操作系统课程设计实践报告_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

南通大学计算机科学与技术学院操作系统实验报告班级:软件工程121姓名:金凯学号:1102052019指导老师:戴树贵时间:19周一周开始的图形界面程序流程图一览开始的图形界面页面替换移臂调度银行家算法处理机管理页面替换移臂调度银行家算法处理机管理先进先出最近最少使用最佳页面替换先来先服务优先级调度先进先出最近最少使用最佳页面替换先来先服务优先级调度死锁的避免电梯调度最短查找时间先来先服务时间轮转法死锁的避免电梯调度最短查找时间先来先服务时间轮转法实验内容处理机管理FCFS:在多道程序或多任务系统中,系统中同时处于就绪态的进程又若干个,也就是说能运行的进程数远远大于处理机个数,为了使系统中的各个进程能有条不紊的运行,必须选择某种调度策略,以选择一进程占用处理机。RR:如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,那么先来先服务FCFS(firstcomefirstservice)总是把当前处于就绪队列之首的那个进程调度到运行状态。也就说,它只考虑进程进入就绪队列的先后,而不考虑它的下一个CPU周期的长短及其他因素。FCFS算法简单易行,但性能却不大好。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。优先级调度:(1)当该算法用于作业调度时,系统从后备作业队列中选择若干个优先级最高的,且系统能满足资源要求的作业装入内存运行。(2)当该算法用于进程调度时,将把处理机分配给就绪进程队列中优先级最高的进程。①先来先服务intfcfs()/*先来先服务算法*/{fcfsinput();floattime_temp=0;inti;intnumber_schedul;time_temp=tasks[0].come_time;for(i=0;i<counter;i++){tasks[i].run_begin_time=time_temp;tasks[i].run_end_time=tasks[i].run_begin_time+tasks[i].run_time;tasks[i].run_flag=1;time_temp=tasks[i].run_end_time;number_schedul=i;tasks[number_schedul].order=i+1;}fcfsoutput();return0;}intfcfsinput()/*进程参数的初始化,按照教材127页最上面的表格*/{ task_structtt;inti,j;//初始化进程数counter=3;//初始化每个到达系统的时间tasks[0].come_time=rand()%9;tasks[1].come_time=rand()%9;tasks[2].come_time=rand()%9;for(i=1;i<3;i++){ for(j=0;j<3-i;j++) { if(tasks[j].come_time>tasks[j+1].come_time) { tt=tasks[j]; tasks[j]=tasks[j+1]; tasks[j+1]=tt; } }}//初始化每个进程估计运行的时间tasks[0].run_time=28;tasks[1].run_time=9;tasks[2].run_time=3;//初始化每个进程的名字 tasks[0].name='A';tasks[1].name='B';tasks[2].name='C'; cout<<"************************先来先服务算法************************"<<endl<<endl;for(i=0;i<counter;i++){tasks[i].run_begin_time=0;tasks[i].run_end_time=0;tasks[i].order=0;tasks[i].run_flag=0;}return0;}intfcfsoutput()/*调度结果输出*/{inti;floatturn_round_time=0,f1,w=0;cout<<"作业名到达时间运行时间开始时间停止时间运行次序周转时间"<<endl;for(i=0;i<counter;i++){f1=tasks[i].run_end_time-tasks[i].come_time;turn_round_time+=f1;w+=(f1/tasks[i].run_time);cout<<""<<tasks[i].name<<'\t'<<""<<tasks[i].come_time<<'\t'<<""<<tasks[i].run_time<<'\t'<<""<<tasks[i].run_begin_time<<'\t'<<""<<tasks[i].run_end_time<<'\t'<<tasks[i].order<<'\t'<<f1<<'\t'<<endl;}cout<<"平均周转时间:"<<turn_round_time/counter<<endl;cout<<"平均带权周转时间:"<<w/counter<<endl;cout<<""; return0;}②优先级调度intps()/*优先级调度*/{psinput();floattemp_time=0;inti=0,j;intnumber_schedul,temp_counter;intmax_priority;max_priority=tasks[i].priority;j=1;while((j<counter)&&(tasks[i].come_time==tasks[j].come_time)){if(tasks[j].priority>=tasks[i].priority){max_priority=tasks[j].priority;i=j;}j++;}/*查找第一个被调度的进程*//*对第一个被调度的进程求相应的参数*/number_schedul=i;tasks[number_schedul].run_begin_time=tasks[number_schedul].come_time;tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;tasks[number_schedul].run_flag=1;temp_time=tasks[number_schedul].run_end_time;tasks[number_schedul].order=1;temp_counter=1;while(temp_counter<counter){max_priority=0;for(j=0;j<counter;j++){if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag))if(tasks[j].priority>max_priority){max_priority=tasks[j].priority;number_schedul=j;}}tasks[number_schedul].run_begin_time=temp_time;tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;tasks[number_schedul].run_flag=1;temp_time=tasks[number_schedul].run_end_time;temp_counter++;tasks[number_schedul].order=temp_counter;}psoutput();return0;}intpsinput()/*进程参数的初始化*/{inti;//初始化进程数counter=3;//初始化每个到达系统的时间tasks[0].come_time=4;tasks[1].come_time=5;tasks[2].come_time=6;//初始化每个进程估计运行的时间tasks[0].run_time=5;tasks[1].run_time=10;tasks[2].run_time=8;//初始化每个进程的名字 tasks[0].name='A';tasks[1].name='B';tasks[2].name='C'; //初始化优先级 tasks[0].priority=rand()%5+3;tasks[1].priority=rand()%3;tasks[2].priority=rand()%3; cout<<"****************************优先级调度算法****************************"<<endl<<endl;for(i=0;i<counter;i++){tasks[i].run_begin_time=0;tasks[i].run_end_time=0;tasks[i].order=0;tasks[i].run_flag=0;}return0;}intpsoutput()/*调度结果输出*/{inti;floatturn_round_time=0,f1,w=0;cout<<"作业名到达时间运行时间开始时间停止时间优先级运行次序周转时间"<<endl;for(i=0;i<1;i++){f1=tasks[i].run_end_time-tasks[i].come_time;turn_round_time+=f1;w+=(f1/tasks[i].run_time);cout<<""<<tasks[i].name<<'\t'<<""<<tasks[i].come_time<<'\t'<<""<<tasks[i].run_time<<'\t'<<""<<tasks[i].run_begin_time<<'\t'<<""<<tasks[i].run_end_time<<'\t'<<'\t'<<tasks[i].priority<<'\t'<<tasks[i].order<<'\t'<<f1<<'\t'<<endl;}for(i=1;i<counter;i++){f1=tasks[i].run_end_time-tasks[i].come_time;turn_round_time+=f1;w+=(f1/tasks[i].run_time);cout<<""<<tasks[i].name<<'\t'<<""<<tasks[i].come_time<<'\t'<<""<<tasks[i].run_time<<'\t'<<""<<tasks[i].run_begin_time<<'\t'<<""<<tasks[i].run_end_time<<'\t'<<tasks[i].priority<<'\t'<<tasks[i].order<<'\t'<<f1<<'\t'<<endl;}cout<<"平均周转时间:"<<turn_round_time/counter<<endl;cout<<"平均带权周转时间:"<<w/counter<<endl; return0;}③时间片轮转法intrr(){intn=3,num=0;node*head=NULL;node*tail=NULL;cout<<"*********************时间片轮转调度算法*********************"<<endl<<endl;for(inti=0;i<n;i++){node*temp=newnode; if(i==0)strcpy(temp->name,"A"); if(i==1)strcpy(temp->name,"B"); if(i==2)strcpy(temp->name,"C");temp->need_time=rand()%4+1;temp->state='R';//初始状态每个进程均为运行态temp->allocation=0; //初始时进程均不占用cpunum+=temp->need_time;//用num来限制循环的次数if(!head){tail=head=temp;}else{tail->next=temp;tail=temp;tail->next=head;}}node*p;p=head;cout<<endl<<"初始时刻:"<<endl;cout<<"进程"<<'\t'<<"剩余时间"<<'\t'<<"占用cpu时间"<<endl;while(p!=tail){ cout<<""<<p->name<<'\t'<<""<<p->need_time<<'\t'<<'\t'<<p->allocation<<'s'<<endl; p=p->next;}cout<<""<<tail->name<<'\t'<<""<<tail->need_time<<'\t'<<'\t'<<p->allocation<<'s'<<endl;node*q;intlabel=1;inti=1;while(label==1&&i<=num){ cout<<endl; label=0;while(!p->need_time){ p=p->next;}if(p->need_time){ p->need_time--; p->allocation++; if(p->need_time==0) { p->state='E'; } label=1; p=p->next;}cout<<"执行"<<i<<"秒后:"<<endl;q=head;cout<<"进程"<<'\t'<<"剩余时间"<<'\t'<<"占用cpu时间"<<endl;while(q!=tail){ cout<<""<<q->name<<'\t'<<""<<q->need_time<<'\t'<<'\t'<<q->allocation<<'s'<<endl; q=q->next;}cout<<""<<tail->name<<'\t'<<""<<tail->need_time<<'\t'<<'\t'<<q->allocation<<'s'<<endl;i++;}cout<<endl<<""; return0;}页面替换算法FIFO先进先出页面替换算法,基于程序总是按线性顺序来访问物理空间这一假设,总是淘汰最先调入主存的页面,即淘汰在主存中驻留时间最长的页面,认为驻留时间最长的页不再使用的可能性最大。LRU最近最少使用页面替换算法淘汰的页面是在最近一段时间内最久未被访问的那一页,它是基于程序局部性原理来考虑的,认为那些刚被使用过的页面可能还要立即被使用,而那些在较长时间内未被使用的页面可能不会立即使用。OPT最佳页面替换算法,当要调入一页而必须淘汰旧页时,应该淘汰以后不再访问的页,或距现在最长时间后要访问的页面。①最佳页面替换算法voidOPT(){ intlength; intopt[100]={0}; intpageLength; intoptPage[100]={0}; intcompare[100]={0}; intcompares=1; inti,j,k; cout<<"***************************最佳页面调度算法***********************"<<endl; pageLength=3; length=9; cout<<"时刻t"<<'\t'; for(i=0;i<length;i++) { cout<<i<<'\t'; }cout<<endl<<"引用串"<<'\t'; for(i=1;i<=length;i++) { opt[i]=rand()%5+1; cout<<opt[i]<<'\t'; } for(i=1;i<=length;i++) { compares=1; for(intll=1;ll<=100;ll++) { compare[ll]=0; } intflag=0; for(j=1;j<=pageLength;j++) { if(opt[i]==optPage[j]) { flag=1; j=pageLength+1; } elseif(optPage[j]==0) { optPage[j]=opt[i]; j=pageLength+1; flag=1; } } if(flag==1){ } else { for(j=1;j<=pageLength;j++) { for(intk=i;k<=length;k++) { if(optPage[j]==opt[k]) { k=length+1; } else { compare[compares]++; } } compares++; } for(k=1;k<pageLength;k++) { if(compare[k]>=compare[k+1]) { compare[k+1]=compare[k]; } else { } } flag=compare[pageLength]; for(k=1;k<=pageLength;k++) { if(flag==compare[k]) { flag=k; k=pageLength+1; } } cout<<"→淘汰"<<optPage[flag]<<endl; optPage[flag]=opt[i]; } cout<<endl<<"t="<<i-1<<"时"<<'\t'; for(intjk=1;jk<=pageLength;jk++) { cout<<"P"<<jk<<'\t'; } cout<<endl<<'\t'; for(ints=1;s<=pageLength;s++){ cout<<optPage[s]<<'\t'; } cout<<endl; }}②先进先出页面替换算法voidFIFO(){ intlength; intfifo[100]={0}; intpageLength; intfifoPage[100]={0}; inti,j; cout<<"***********************先进先出页面调度算法**************************"<<endl; pageLength=3; length=9; cout<<"时刻t"<<'\t'; for(i=0;i<length;i++) { cout<<i<<'\t'; }cout<<endl<<"引用串"<<'\t'; for(i=1;i<=length;i++) { fifo[i]=rand()%5+1; cout<<fifo[i]<<'\t'; } for(i=1;i<=length;i++){ intflag=0; for(j=1;j<=pageLength;j++){ if(fifo[i]==fifoPage[j]){ flag=1; j=pageLength+1; }elseif(fifoPage[j]==0){ fifoPage[j]=fifo[i]; j=pageLength+1; flag=1; } } if(flag==1) { } else { cout<<"→淘汰"<<fifoPage[1]<<endl; for(j=1;j<=pageLength;j++){ fifoPage[j]=fifoPage[j+1]; } fifoPage[pageLength]=fifo[i]; } cout<<endl<<"t="<<i-1<<"时"<<'\t'; for(intjk=1;jk<=pageLength;jk++) { cout<<"P"<<jk<<'\t'; } cout<<endl<<'\t'; for(ints=1;s<=pageLength;s++){ cout<<fifoPage[s]<<'\t'; } cout<<endl; } }③最近最少使用页面替换算法voidLRU(){ intlength; intlru[100]={0}; intpageLength; intlruPage[100]={0}; inti,j; cout<<"***********************最近最少使用页面替换算法***********************"<<endl; pageLength=3; length=9; cout<<"时刻t"<<'\t'; for(i=0;i<length;i++) { cout<<i<<'\t'; }cout<<endl<<"引用串"<<'\t'; for(i=1;i<=length;i++) { lru[i]=rand()%5+1; cout<<lru[i]<<'\t'; } for(i=1;i<=length;i++){ intflag=0; for(j=1;j<=pageLength;j++){ if(lru[i]==lruPage[j]){ for(intcc=j;cc>0;cc--){ lruPage[cc]=lruPage[cc-1]; } lruPage[1]=lru[i]; flag=1; j=pageLength+1; }elseif(lruPage[j]==0){ for(intvv=j;vv>0;vv--){ lruPage[vv]=lruPage[vv-1]; } lruPage[1]=lru[i]; j=pageLength+1; flag=1; } } if(flag==1) { } else { cout<<"→淘汰"<<lruPage[pageLength]<<endl; for(j=pageLength;j>0;j--){ lruPage[j]=lruPage[j-1]; } lruPage[1]=lru[i]; } cout<<endl<<"t="<<i-1<<"时"<<'\t'; for(intjk=1;jk<=pageLength;jk++) { cout<<"P"<<jk<<'\t'; } cout<<endl<<'\t'; for(ints=1;s<=pageLength;s++){ cout<<lruPage[s]<<'\t'; } cout<<endl; }}移臂调度FCFS先来先服务驱动调度算法中,移动臂是随机移动的,不考虑各I/O请求之间的相对次序和移动臂当前所处的位置,进程等待I/O请求的时间会很长,寻道性能较差。SSTF最短查找时间优先驱动调度算法考虑I/O请求之间的区别,总是执行查找时间最短的请求,与FCFS算法相比有较好的寻道性能。电梯调度算法,每次总是选择沿移动臂的移动方向最近的那个柱面,若同一柱面上有多个请求,还需进行旋转优化。如果当前移动方向上没有访问请求时,就改变移动臂的移动方向,然后,处理所遇到的最近的I/O请求。①先来先服务算法voidybfcfs(){ intnum=100; intcurrentNum=rand()%100; intjustNum; intlength=6; intfcfs[100]={0}; intsum=0; cout<<"*************************先来先服务调度算法***********************"<<endl; cout<<"默认磁盘柱面数量为100"<<endl; cout<<"当前存取臂的位置为:"<<currentNum<<endl; cout<<"请求队列序列为:"; for(inti=1;i<=length;i++){ fcfs[i]=rand()%100; cout<<fcfs[i]<<'\t'; } sum=sum+abs(currentNum-fcfs[1]); for(intj=1;j<length;j++) { sum=sum+abs(fcfs[j]-fcfs[j+1]); } cout<<endl; cout<<"存取臂移动序列为:"<<currentNum; for(intk=1;k<=length;k++) { cout<<"-"<<fcfs[k]; } cout<<endl<<"存取臂移动总量为:"<<sum<<endl;}②最短查找时间算法 voidsstf(){ intnum=100; intcurrentNum=rand()%100; intjustNum=rand()%100; intlength=6; intcompare[100]={0}; intsstf[100]={0}; intfinalSstf[100]={0}; intsum=0; cout<<"***************************最短查找时间算法*************************"<<endl; cout<<"默认磁盘柱面数量为100"<<endl; cout<<"当前存取臂的位置为:"<<currentNum<<endl;// cout<<"刚完成的柱面号:"<<justNum<<endl; cout<<"请求队列序列为:"; inti,j; for(i=1;i<=length;i++){ sstf[i]=rand()%100; cout<<sstf[i]<<'\t'; } intk; for(i=1;i<length;i++){//排序 for(intj=1;j<length;j++){ if(sstf[j]>sstf[j+1]){ k=sstf[j+1]; sstf[j+1]=sstf[j]; sstf[j]=k; } } } for(i=1;i<=length;i++) { //找出夹在currentNum值的两个数i,i-1 if(currentNum>sstf[i]){ }else{ k=i; i=length+1; } } intheight; intlow; finalSstf[1]=currentNum; intflag=1; sstf[0]=10000000; intlen=length; for(j=1;j<=len;){ height=abs(currentNum-sstf[k]); low=abs(currentNum-sstf[k-1]); flag++; if(height>=low){ finalSstf[flag]=sstf[k-1]; currentNum=sstf[k-1]; k=k-1; sum=sum+low; }else{ finalSstf[flag]=sstf[k]; sum=sum+height; currentNum=sstf[k]; } for(intll=k;ll<len;ll++){ sstf[ll]=sstf[ll+1]; } sstf[len]=10000000; len--; } cout<<endl<<"存取臂移动序列为:"<<finalSstf[1]; for(j=2;j<=length+1;j++){ cout<<"-"<<finalSstf[j]; } cout<<endl<<"存取臂移动总量为:"<<sum<<endl;}③电梯调度算法voiddianti(){ cout<<"***************************电梯调度算法*************************"<<endl; intnum=100; intcurrentNum=rand()%100; intjustNum=31; intlength=6; intdianti[100]={0}; intfinalDianti[100]={0}; intsum=0; inti; cout<<"默认磁盘柱面数量为100"<<endl; cout<<"当前存取臂的位置为:"<<currentNum<<endl; cout<<"刚完成的柱面请求号:"<<justNum<<endl; cout<<"请求队列序列为:"<<endl; for(i=1;i<=length;i++) { dianti[i]=rand()%100; cout<<dianti[i]<<'\t'; } cout<<endl; intk; for(i=1;i<length;i++){//排序 for(intj=1;j<length;j++){ if(dianti[j]>dianti[j+1]){ k=dianti[j+1]; dianti[j+1]=dianti[j]; dianti[j]=k; } } } for(i=1;i<=length;i++){ //找出夹在currentNum值的两个数i,i-1 if(currentNum>dianti[i]){} else { k=i; i=length+1; } } finalDianti[1]=currentNum; intflag=1; for(i=k;i<length;i++){ flag++; finalDianti[flag]=dianti[i]; } flag++; finalDianti[flag]=dianti[length]; for(i=k-1;i>0;i--) { flag++; finalDianti[flag]=dianti[i]; } finalDianti[flag+1]=dianti[1]; cout<<"存取臂移动序列为:"<<finalDianti[1]; for(intj=2;j<=length+1;j++){ cout<<"-"<<finalDianti[j]; sum=sum+abs(finalDianti[j-1]-finalDianti[j]); } cout<<endl; cout<<"存取臂移动总量为:"<<sum<<endl;}银行家算法银行家算法:Dijkstra(1965)提出了一种能够避免死锁的调度算法,称为银行家算法。其基本思想是:系统中的所有进程放入一个进程集合,先把资源试探性地分配给它。然后找出剩余资源能满足最大需求量的进程,进行分配。voidprint(int*Max,int*Allocation,int*Need,int*Available,intp,intr){ inti,j,flag=1; cout<<("进程号请求的占用的C-A:需要的可用")<<endl; cout<<"P[i]Claim AllocationNeedAvailable"<<endl<<endl;//这是一个表头,下面是英文,上面用汉字说明作用 for(i=0;i<p;i++) { cout<<"P"<<i<<'\t'; for(j=0;j<r;j++) { cout<<*(Max+i*r+j)<<""; } cout<<'\t';//制表符,用于排列,无特殊意义 for(j=0;j<r;j++) { cout<<*(Allocation+i*r+j)<<""; } cout<<'\t'; for(j=0;j<r;j++) { cout<<*(Need+i*r+j)<<""; } cout<<'\t'; if(flag==1) { for(j=0;j<r;j++) { cout<<*(Available+j)<<""; } flag=0; } cout<<endl<<endl; }}boolcheckSafe(int*Need,int*Allocation,int*Available,intp,intr){ inti=0,j=0,k=0,m=0,count=0,flag1=0,flag2=0; int*list,*Work; //设置工作向量Work,安全序列list,均用指针来做。数组太麻烦了 bool*Finish; //完成标志Finish Work=newint[r]; Finish=newbool[p]; list=newint[p]; //初始化完成标志Finish,默认为false for(i=0;i<p;i++) *(Finish+i)=false; //初始化工作向量Work for(i=0;i<r;i++) *(Work+i)=*(Available+i); //进行安全检查 while(k<p) { //判断Finish[i]是否为true,且需求向量小于工作向量 flag1=0; for(j=0;j<r;j++) { if(*(Finish+m)!=true) { if(*(Need+m*r+j)>*(Work+j)) { flag1=0; break; } flag1=1; } } //若flag1==1即Finish[i]为true,且需求向量小于工作向量,则该进程可以获得资源 if(flag1==1) { for(j=0;j<r;j++) { *(Work+j)+=*(Allocation+m*r+j); } *(Finish+m)=true; *(list+k)=m; count=0; k++; } else { count++; } if(count==5) break; m++; if(m==5) m=0; } //若所有进程的*(Finish+i)==true,表示系统处于安全状态 for(i=0;i<p;i++) { if(*(Finish+i)!=true) { flag2=0; break; } else { flag2=1; } } delete[]Work; delete[]Finish; //若系统处于安全状态,则输出存在的安全序列,否则安全检测算法结束 if(flag2==1) { cout<<"存在安全序列:"; for(i=0;i<p;i++) cout<<"P"<<*(list+i)<<""; cout<<endl<<endl; delete[]list; returntrue; } else { returnfalse; }}intsisuo(){ intp=5,r=3,i; //进程数为5,资源数为3 //Max为5*3的最大需求矩阵,Available为可利用资源向量, //Allocation为5*3的分配矩阵,Need为5*3的需求矩阵,请求向量Request1 int*Max,*Available,*Allocation,*Need,*Request1; Max=newint[p*r]; Available=newint[r]; Allocation=newint[p*r]; Need=newint[p*r]; Request1=newint[r]; //初始化Max矩阵 //753 //322 //902 //222 //433 *(Max+0*r+0)=7;*(Max+0*r+1)=5;*(Max+0*r+2)=3; *(Max+1*r+0)=3;*(Max+1*r+1)=2;*(Max+1*r+2)=2; *(Max+2*r+0)=9;*(Max+2*r+1)=0;*(Max+2*r+2)=2; *(Max+3*r+0)=2;*(Max+3*r+1)=2;*(Max+3*r+2)=2; *(Max+4*r+0)=4;*(Max+4*r+1)=3;*(Max+4*r+2)=3; //初始化Allocation矩阵 //010 //200 //302 //211 //002 *(Allocation+0*r+0)=0;*(Allocation+0*r+1)=1;*(Allocation+0*r+2)=0; *(Allocation+1*r+0)=2;*(Allocation+1*r+1)=0;*(Allocation+1*r+2)=0; *(Allocation+2*r+0)=3;*(Allocation+2*r+1)=0;*(Allocation+2*r+2)=2; *(Allocation+3*r+0)=2;*(Allocation+3*r+1)=1;*(Allocation+3*r+2)=1; *(Allocation+4*r+0)=0;*(Allocation+4*r+1)=0;*(Allocation+4*r+2)=2; //初始化可利用资源向量Available //332 *(Available+0)=3; *(Available+1)=3; *(Available+2)=2; //初始化Need矩阵,c-a for(i=0;i<p*r;i++) { *(Need+i)=*(Max+i)-*(Allocation+i); } //打印初始化数据 cout<<"T0时刻的系统资源分配情况:"<<endl<<endl; print(Max,Allocation,Need,Available,p,r); //p1请求资源矩阵为Request1(1,0,2) *(Request1+0)=rand()%2+0;*(Request1+1)=rand()%2+0;*(Request1+2)=rand()%2+0; cout<<"P1进程的请求向量为:"; for(intj=0;j<r;j++) { cout<<*(Request1+j)<<""; } cout<<endl<<endl; //请求资源数与最大需求资源数进行逐一比较 intflag=0; for(i=0;i<r;i++) { if(*(Request1+i)>*(Need+1*r+i)) { flag=0; break; } else { flag=1; } } //若请求资源数小于最大需求资源数,则进行资源分配判断,否则算法结束 if(flag==1) { //请求资源数与剩余资源数进行逐一比较 intflag2=0; for(inti=0;i<r;i++) { if(*(Request1+i)>*(Available+i)) { flag=0; break; } else { flag2=1; } } //若请求资源数小于最大需求资源数,则进行试探分配,否则算法结束 if(flag2==1) { //系统试探着进行资源分配 for(inti=0;i<r;i++) { *(Available+i)-=*(Request1+i); *(Allocation+1*r+i)+=*(Request1+i); *(Need+1*r+i)-=*(Request1+i); } //试探分配完成后,对该状态进行安全检测,若通过检测,则分配, //否则本次试探分配作废,恢复原来资源分配状态 if(checkSafe(Need,Allocation,Available,p,r)) { cout<<"分配资源后系统处于安全状态,可进行分配!"<<endl<<endl; //打印分配后的数据 cout<<"为进程分配资源后,T1时刻系统资源分配情况:"<<endl<<endl; print(Max,Allocation,Need,Available,p,r); cout<<""; cout<<"程序测试BY:金凯"<<endl; cout<<""; cout<<"测试结果:符合银行家算法,可以防止死锁"<<endl; } else { cout<<"分配资源后系统处于不安全状态,系统不分配该资源!"<<endl; //本次试探分配作废,恢复原来资源分配状态 for(inti=0;i<r;i++) { *(Available+i)+=*(Request1+i); *(Allocation+1*r+i)-=*(Request1+i); *(Need+1*r+i)+=*(Request1+i); } } } else { cout<<"请求资源出错,无足够资源可分配!"<<endl; } } else { cout<<"请求资源出错,请求资源数不能大于需求资源数!"<<endl; } delete[]Max; delete[]Available; delete[]Allocation; delete[]Need; delete[]Request1; return0;}可以运行的程序代码如下:#include<iostream>#include<cstring>usingnamespacestd;intfcfsoutput();/*调度结果输出*/intfcfsinput();//进程参数的初始化intpsinput();intpsoutput();voidkaishi();#defineMAX10structnode//建立链表来存放进程数据{charname[5];//进程名称intneed_time;//所需要的时间intallocation;//占用cpu的情况charstate;//目前的状态R为运行,E为运行完毕node*next;//链表的尾结点};structtask_struct{charname;/*进程名称*/intnumber;/*进程编号*/floatcome_time;/*到达时间*/floatrun_begin_time;/*开始运行时间*/floatrun_time;/*运行时间*/floatrun_end_time;/*运行结束时间*/intpriority;/*优先级*/intorder;/*运行次序*/intrun_flag;/*调度标志*/}tasks[MAX]; intcounter;/*实际进程个数*/intfcfs()/*先来先服务算法*/{fcfsinput();floattime_temp=0;inti;intnumber_schedul;time_temp=tasks[0].come_time;for(i=0;i<counter;i++){tasks[i].run_begin_time=time_temp;tasks[i].run_end_time=tasks[i].run_begin_time+tasks[i].run_time;tasks[i].run_flag=1;time_temp=tasks[i].run_end_time;number_schedul=i;tasks[number_schedul].order=i+1;}fcfsoutput();return0;}intfcfsinput()/*进程参数的初始化,按照教材127页最上面的表格*/{ task_structtt;inti,j;//初始化进程数counter=3;//初始化每个到达系统的时间tasks[0].come_time=rand()%9;tasks[1].come_time=rand()%9;tasks[2].come_time=rand()%9;for(i=1;i<3;i++){ for(j=0;j<3-i;j++) { if(tasks[j].come_time>tasks[j+1].come_time) { tt=tasks[j]; tasks[j]=tasks[j+1]; tasks[j+1]=tt; } }} //初始化每个进程估计运行的时间tasks[0].run_time=28;tasks[1].run_time=9;tasks[2].run_time=3;//初始化每个进程的名字 tasks[0].name='A'; tasks[1].name='B'; tasks[2].name='C'; cout<<"************************先来先服务算法************************"<<endl<<endl;for(i=0;i<counter;i++){tasks[i].run_begin_time=0;tasks[i].run_end_time=0;tasks[i].order=0;tasks[i].run_flag=0;}return0;}intfcfsoutput()/*调度结果输出*/{inti;floatturn_round_time=0,f1,w=0;cout<<"作业名到达时间运行时间开始时间停止时间运行次序周转时间"<<endl;for(i=0;i<counter;i++){f1=tasks[i].run_end_time-tasks[i].come_time;turn_round_time+=f1;w+=(f1/tasks[i].run_time);cout<<""<<tasks[i].name<<'\t'<<""<<tasks[i].come_time<<'\t'<<""<<tasks[i].run_time<<'\t'<<""<<tasks[i].run_begin_time<<'\t'<<""<<tasks[i].run_end_time<<'\t'<<tasks[i].order<<'\t'<<f1<<'\t'<<endl;}cout<<"平均周转时间:"<<turn_round_time/counter<<endl;cout<<"平均带权周转时间:"<<w/counter<<endl;cout<<""; return0;}/**/intps()/*优先级调度*/{psinput();floattemp_time=0;inti=0,j;intnumber_schedul,temp_counter;intmax_priority;max_priority=tasks[i].priority;j=1;while((j<counter)&&(tasks[i].come_time==tasks[j].come_time)){if(tasks[j].priority>=tasks[i].priority){max_priority=tasks[j].priority;i=j;}j++;}/*查找第一个被调度的进程*//*对第一个被调度的进程求相应的参数*/number_schedul=i;tasks[number_schedul].run_begin_time=tasks[number_schedul].come_time;tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;tasks[number_schedul].run_flag=1;temp_time=tasks[number_schedul].run_end_time;tasks[number_schedul].order=1;temp_counter=1;while(temp_counter<counter){max_priority=0;for(j=0;j<counter;j++){if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag))if(tasks[j].priority>max_priority){max_priority=tasks[j].priority;number_schedul=j;}}tasks[number_schedul].run_begin_time=temp_time;tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;tasks[number_schedul].run_flag=1;temp_time=tasks[number_schedul].run_end_time;temp_counter++;tasks[number_schedul].order=temp_counter;}psoutput();return0;}intpsinput()/*进程参数的初始化*/{inti;//初始化进程数counter=3;//初始化每个到达系统的时间tasks[0].come_time=4;tasks[1].come_time=5;tasks[2].come_time=6;//初始化每个进程估计运行的时间tasks[0].run_time=5;tasks[1].run_time=10;tasks[2].run_time=8;//初始化每个进程的名字 tasks[0].name='A'; tasks[1].name='B'; tasks[2].name='C'; //初始化优先级 tasks[0].priority=rand()%5+3; tasks[1].priority=rand()%3; tasks[2].priority=rand()%3; cout<<"****************************优先级调度算法****************************"<<endl<<endl;for(i=0;i<counter;i++){tasks[i].run_begin_time=0;tasks[i].run_end_time=0;tasks[i].order=0;tasks[i].run_flag=0;}return0;}intpsoutput()/*调度结果输出*/{inti;floatturn_round_time=0,f1,w=0;cout<<"作业名到达时间运行时间开始时间停止时间优先级运行次序周转时间"<<endl;for(i=0;i<1;i++){f1=tasks[i].run_end_time-tasks[i].come_time;turn_round_time+=f1;w+=(f1/tasks[i].run_time);cout<<""<<tasks[i].name<<'\t'<<""<<tasks[i].come_time<<'\t'<<""<<tasks[i].run_time<<'\t'<<""<<tasks[i].run_begin_time<<'\t'<<""<<tasks[i].run_end_time<<'\t'<<'\t'<<tasks[i].priority<<'\t'<<tasks[i].order<<'\t'<<f1<<'\t'<<endl;}for(i=1;i<counter;i++){f1=tasks[i].run_end_time-tasks[i].come_time;turn_round_time+=f1;w+=(f1/tasks[i].run_time);cout<<""<<tasks[i].name<<'\t'<<""<<tasks[i].come_time<<'\t'<<""<<tasks[i].run_time<<'\t'<<""<<tasks[i].run_begin_time<<'\t'<<""<<tasks[i].run_end_time<<'\t'<<tasks[i].priority<<'\t'<<tasks[i].order<<'\t'<<f1<<'\t'<<endl;}cout<<"平均周转时间:"<<turn_round_time/counter<<endl;cout<<"平均带权周转时间:"<<w/counter<<endl; return0;}/**/intrr(){intn=3,num=0;node*head=NULL;node*tail=NULL;cout<<"*********************时间片轮转调度算法*********************"<<endl<<endl;for(inti=0;i<n;i++){node*temp=newnode; if(i==0)strcpy(temp->name,"A"); if(i==1)strcpy(temp->name,"B"); if(i==2)strcpy(temp->name,"C");temp->need_time=rand()%4+1;temp->state='R';//初始状态每个进程均为运行态temp->allocation=0; //初始时进程均不占用cpunum+=temp->need_time;//用num来限制循环的次数if(!head){tail=head=temp;}else{tail->next=temp;tail=temp;tail->next=head;}}node*p;p=head;cout<<endl<<"初始时刻:"<<endl;cout<<"进程"<<'\t'<<"剩余时间"<<'\t'<<"占用cpu时间"<<endl;while(p!=tail){ cout<<""<<p->name<<'\t'<<""<<p->need_time<<'\t'<<'\t'<<p->allocation<<'s'<<endl; p=p->next;}cout<<""<<tail->name<<'\t'<<""<<tail->need_time<<'\t'<<'\t'<<p->allocation<<'s'<<endl;node*q;intlabel=1;inti=1;while(label==1&&i<=num){ cout<<endl; label=0;while(!p->need_time){ p=p->next;}if(p->need_time){ p->need_time--; p->allocation++; if(p->need_time==0) { p->state='E'; } label=1; p=p->next;}cout<<"执行"<<i<<"秒后:"<<endl;q=head;cout<<"进程"<<'\t'<<"剩余时间"<<'\t'<<"占用cpu时间"<<endl;while(q!=tail){ cout<<""<<q->name<<'\t'<<""<<q->need_time<<'\t'<<'\t'<<q->allocation<<'s'<<endl; q=q->next;}cout<<""<<tail->name<<'\t'<<""<<tail->need_time<<'\t'<<'\t'<<q->allocation<<'s'<<endl;i++;}cout<<endl<<""; return0;}/**/voidprint(int*Max,int*Allocation,int*Need,int*Available,intp,intr){ inti,j,flag=1; cout<<("进程号请求的占用的C-A:需要的可用")<<endl; cout<<"P[i]Claim AllocationNeedAvailable"<<endl<<endl;//这是一个表头,下面是英文,上面用汉字说明作用 for(i=0;i<p;i++) { cout<<"P"<<i<<'\t'; for(j=0;j<r;j++) { cout<<*(Max+i*r+j)<<""; } cout<<'\t';//制表符,用于排列,无特殊意义 for(j=0;j<r;j++) { cout<<*(Allocation+i*r+j)<<""; } cout<<'\t'; for(j=0;j<r;j++) { cout<<*(Need+i*r+j)<<""; } cout<<'\t'; if(flag==1) { for(j=0;j<r;j++) { cout<<*(Available+j)<<""; } flag=0; } cout<<endl<<endl; }}boolcheckSafe(int*Need,int*Allocation,int*Available,intp,intr){ inti=0,j=0,k=0,m=0,count=0,flag1=0,flag2=0; int*list,*Work; //设置工作向量Work,安全序列list,均用指针来做。数组太麻烦了 bool*Finish; //完成标志Finish Work=newint[r]; Finish=newbool[p]; list=newint[p]; //初始化完成标志Finish,默认为false for(i=0;i<p;i++) *(Finish+i)=false; //初始化工作向量Work for(i=0;i<r;i++) *(Work+i)=*(Available+i); //进行安全检查 while(k<p) { //判断Finish[i]是否为true,且需求向量小于工作向量 flag1=0; for(j=0;j<r;j++) { if(*(Finish+m)!=true) { if(*(Need+m*r+j)>*(Work+j)) { flag1=0; break; } flag1=1; } } //若flag1==1即Finish[i]为true,且需求向量小于工作向量,则该进程可以获得资源 if

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论