版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验二时间片轮转【实验目的】通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。【实验内容】问题描述:设计程序模拟进程的时间片轮转RR调度过程。假设有n个进程分别在T1,…,Tn时刻到达系统,它们需要的服务时间分别为S1,…,Sn。分别利用不同的时间片大小q,采用时间片轮转RR进程调度算法进行调度,计算每个进程的完成时间,周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。程序要求如下:1)进程个数n;每个进程的到达时间T1,…,Tn和服务时间S1,…,Sn;输入时间片大小q。2)要求时间片轮转法RR调度进程运行,计算每个进程的周转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间;3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:进程B开始运行”等等;4)输出:要求输出计算出来的每个进程的周转时间,带权周转时间,所有进程的平均周转时间,带权平均周转时间。源程序在VisualC++6.0中实现//RR算法#include<iostream.h>#include<iomanip.h>#include<stdio.h>#include<conio.h>#include<malloc.h>#include<stdlib.h>typedefintQElemType;#defineOK1#defineERROR0#defineOVERFLOW-1typedefintStatus;typedefstructQNode{ QElemTypedata; structQNode*next;}QNode,*QueuePtr;typedefstruct{ QueuePtrfront; QueuePtrrear;}LinkQueue;StatusInitQueue(LinkQueue&Q);StatusDestroyQueue(LinkQueue&Q);StatusEnQueue(LinkQueue&Q,QElemTypee);intDeQueue(LinkQueue&Q,QElemTypee);boolQueueEmpty(LinkQueue&Q);staticconstintMaxNum=100;intn,q,ArrivalTime[MaxNum],ServiceTime[MaxNum],FinishedTime[MaxNum],WholeTime[MaxNum];doubleWeightWholeTime[MaxNum],Average_WT=0,Average_WWT=0;LinkQueueQ;voidRR(int*ArrivalTime,int*ServiceTime,intn,intq,LinkQueue&Q);voidmain(){cout<<"请输入进程总数n的值(0<n<=100):"<<endl;cin>>n;while(n<0||n>100){ cout<<"你输入的n的值不正确,请重新输入!"<<endl; cin>>n;}cout<<"请依次输入各个进程的到达时间:"<<endl;for(inti=0;i<n;i++)cin>>ArrivalTime[i];cout<<"请依次输入各个进程的服务时间:"<<endl;for(i=0;i<n;i++)cin>>ServiceTime[i];cout<<"请输入时间片q的值(0<q<=200):"<<endl;cin>>q;while(q<0||q>200){ cout<<"你输入的q值不正确,请重新输入!"<<endl; cin>>q;}RR(ArrivalTime,ServiceTime,n,q,Q);//调用RR算法}//RR算法的具体实现voidRR(int*ArrivalTime,int*ServiceTime,intn,intq,LinkQueue&Q){intcountTime=0,e;intSTime[MaxNum],pushed[MaxNum];for(inti=0;i<n;i++){STime[i]=ServiceTime[i];pushed[i]=0;}InitQueue(Q);EnQueue(Q,0);pushed[0]=1;inttime=0;while(QueueEmpty(Q)==false){ e=DeQueue(Q,e); if(STime[e]>q) {STime[e]=STime[e]-q; countTime+=q;} else {countTime+=STime[e];STime[e]=0;FinishedTime[e]=countTime; } while(time<countTime){ if(STime>0){ cout<<"时刻"<<setw(2)<<time<<":进程"<<e<<"正在运行"<<endl; } time++; } for(i=1;i<n;i++) { if(STime!=0&&i!=e&&ArrivalTime[i]<countTime&&pushed[i]==0||STime!=0&&i!=e&&ArrivalTime[i]==countTime) { EnQueue(Q,i);pushed[i]=1; } } if(STime[e]>0)//判断进程e是否已执行完 { EnQueue(Q,e); } }for(i=0;i<n;i++){//求周转时间和带权周转时间 WholeTime[i]=FinishedTime[i]-ArrivalTime[i]; WeightWholeTime[i]=(double)(WholeTime[i]*1.000000/ServiceTime[i]);Average_WT+=WholeTime[i]; Average_WWT+=WeightWholeTime[i];}Average_WT/=n;//求平均周转时间Average_WWT/=n;//求平均带权周转时间//----------------输出----------------cout<<"完成:"<<"";for(i=0;i<n;i++)cout<<setw(8)<<FinishedTime[i]<<"";cout<<endl;cout<<"周转:"<<"";for(i=0;i<n;i++)cout<<setw(8)<<WholeTime[i]<<"";cout<<endl;cout<<"带权:"<<"";for(i=0;i<n;i++)cout<<setw(8)<<setiosflags(ios::fixed)<<setprecision(2)<<WeightWholeTime[i]<<"";cout<<endl;cout<<"平均周转时间为:"<<Average_WT<<endl;cout<<"平均带权周转时间为:"<<Average_WWT<<endl;DestroyQueue(Q);}//初始化链队列QStatusInitQueue(LinkQueue&Q){ Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q.front)exit(OVERFLOW); Q.front->next=NULL; returnOK;}//销毁链队列QStatusDestroyQueue(LinkQueue&Q){ while(Q.front){ Q.rear=Q.front->next; free(Q.front); Q.front=Q.rear; } returnOK;}//入队StatusEnQueue(LinkQueue&Q,QElemTypee){QueuePtr p=(QueuePtr)malloc(sizeof(QNode)); if(!p)exit(OVERFLOW); p->data=e;p->next=NULL; Q.rear->next=p; Q.rear=p; returnOK;}//出队,并用e返回出队节点的元素值intDeQueue(LinkQueue&Q,QElemTypee){ QueuePtrp; if(Q.front==Q.rear)returnERROR; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p){Q.rear=Q.front;} free(p); returne;}//判断链队列Q是否为空boolQueueEmpty(LinkQueue&Q){ if(Q.front==Q.rear) returntrue; elsereturnfalse;}实例运行截图实验三银行家算法【实验目的】通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。【实验内容】问题描述:设计程序模拟预防进程死锁的银行家算法的工作过程。假设有系统中有n个进程P1,…,Pn,有m类可分配的资源R1,…,Rm,在T0时刻,进程Pi分配到的j类资源为Allocationij个,它还需要j类资源Needij个,系统目前剩余j类资源Workj个,现采用银行家算法进行进程资源分配预防死锁的发生。程序要求如下:1)判断当前状态是否安全,如果安全,给出安全序列;如果不安全给出理由。2)对于下一个时刻T1,某个进程Pk会提出请求Request(R1,…,Rm),判断分配给Pk进程请求的资源之后。3)输入:进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置);4)输出:如果安全输出安全的进程序列,不安全提示信息。源程序在VisualC++6.0中实现#include<stdio.h>#include<stdlib.h>/*----------------------常量定义--------------------*/#defineF0#defineT1#definen5//进程数量#definem3//资源种类数量/*--------------------------------------------------*//*--------------------数据结构定义------------------*/intAvailable[m]={3,5,2};//可用资源intWork[m];//工作向量intFinish[n];//用以判断系统是否有足够资源分给相应进程voidRecycle();//若进程运行完资源回收intbackDos();//判断所有进程是否运行完,完后返回操作系统/*--------------------------------------------------*//*-----------------------进程-----------------------*/structPCB{intflag;//状态标志,是否运行完intMax[m];//资源最大需求量intAllocation[m];//已分配资源intNeed[m];//还需要的资源intRequest[m];//请求资源量}P[n];/*-----------------------函数声明--------------------*/inttryAdminister(intnum);//试分配voidsafeCheck(intnum);//安全性检查voidPrint();//状态输出/*主函数(只需改变n、m和下面的初始数组便可形成新的进程量,资源量和状态)*/intmain(){inti,j,num;inttotal[n][m]={{4,3,1},{3,3,2},{4,1,7},{7,4,3},{5,3,3}};inthave[n][m]={{0,2,1},{1,0,1},{0,1,3},{3,2,1},{0,2,0}};intwant[n][m]={{4,1,0},{2,3,1},{4,0,4},{4,2,2},{5,1,3}};for(i=0;i<n;i++)//初始化进程资源分配状态for(j=0;j<m;j++){P[i].flag=F;P[i].Max[j]=total[i][j];P[i].Allocation[j]=have[i][j];P[i].Need[j]=want[i][j];}Print();//状态输出while(scanf("%d",&num)!=EOF){printf("输入进程%d对这三类资源的需求向量(用空格隔开):\n",num); scanf("%d%d%d",&P[num].Request[0],&P[num].Request[1],&P[num].Request[2]); if(&P[num].Request[0]<0||&P[num].Request[1]<0||&P[num].Request[2]<0){ printf("非法请求!\n\n"); returnF; }if(tryAdminister(num)==T)safeCheck(num);Recycle();//资源回收if(backDos()==T)//所有进程完则返回操作系统return0;Print();}return0;}/*--------------------------------------------------------------------*//*----------------------------试分配函数-----------------------------*/inttryAdminister(intnum)//试分配{intj;for(j=0;j<m;j++)if(P[num].Request[j]>P[num].Need[j]){printf("非法请求!\n\n");returnF;}elseif(P[num].Request[j]>Available[j]){printf("%d号资源不够,无法分配,进程%d等待。\n\n",j,num);returnF;}for(j=0;j<m;j++){Available[j]=Available[j]-P[num].Request[j];P[num].Allocation[j]=P[num].Allocation[j]+P[num].Request[j];P[num].Need[j]=P[num].Need[j]-P[num].Request[j];}returnT;}/*-------------------------------安全性检查函数-------------------------------*/voidsafeCheck(intnum){inti,j;intl[n],k;//安全序列for(j=0;j<m;j++)//初始化工作向量Work[j]=Available[j];for(i=0;i<n;i++)//初始化判断向量{Finish[i]=F;l[i]=0;}k=0;for(i=0;i<n;i++){if(Finish[i]==F){for(j=0;j<m;j++)if(P[i].Need[j]>Work[j])break;if(j==m)//如果分配成功{for(j=0;j<m;j++)Work[j]=Work[j]+P[i].Allocation[j];Finish[i]=T;l[k]=i;k++;//安全序列i=-1;//就重新查找下一个可分配成功的进程}}}for(i=0;i<n;i++)if(Finish[i]==F){printf("分配不成功,系统将处于不安全状态.\n\n");for(j=0;j<m;j++)//若分配不成功将进程num恢复到初始时刻状态{Available[j]=Available[j]+P[num].Request[j];P[num].Allocation[j]=P[num].Allocation[j]-P[num].Request[j];P[num].Need[j]=P[num].Need[j]+P[num].Request[j];}break;}if(i==n){printf("系统安全,一个进程安全序列如下:\n");for(i=0;i<n;i++)if(i!=n-1)printf("P%d——>",l[i]);elseprintf("P%d\n\n",l[i]);}}/*------------------------------------状态输出-----------------------------*/voidPrint(){inti;printf("此时资源分配情况:\n");printf("********************************************************************\n");printf("\t最大需求\t已分配\t\t需要分配\t可用资源\n");for(i=0;i<n;i++)//输出进程资源分配状态{printf("P%d\t%d%d%d\t\t",i,P[i].Max[0],P[i].Max[1],P[i].Max[2]);printf("%d%d%d\t\t",P[i].Allocation[0],P[i].Allocation[1],P[i].Allocation[2]);printf("%d%d%d\t\t",P[i].Need[0],P[i].Need[1],P[i].Need[2]);if(i==0)pr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 核磁科护理工作总结
- 教育培训行业工程师工作总结
- 电商供应链管理总结
- 初中班主任工作感悟与反思
- 婚纱店前台工作心得
- 教育科研行业教学改革建议
- 2024年度企事业单位聘用司机及车辆安全培训服务合同3篇
- 得寿山石默想语文阅读理解
- 白鹅微课程设计
- 波形发生器的课程设计
- 《销售人员回款培训》课件
- GB/T 45008-2024稀土热障涂层材料锆酸钆镱粉末
- 全国第三届职业技能大赛(数字孪生应用技术)选拔赛理论考试题库(含答案)
- 保险公司2024年工作总结(34篇)
- 物理实验知到智慧树章节测试课后答案2024年秋沈阳理工大学
- 应用数理统计知到智慧树章节测试课后答案2024年秋中国农业大学
- 文艺复兴史学习通超星期末考试答案章节答案2024年
- 创新转化管理智慧树知到期末考试答案章节答案2024年山东大学
- 二级公立医院绩效考核三级手术目录(2020版)
- 6人小品《没有学习的人不伤心》台词完整版
- 压力容器耐压试验
评论
0/150
提交评论