《操作系统》实验三内容要求_第1页
《操作系统》实验三内容要求_第2页
《操作系统》实验三内容要求_第3页
《操作系统》实验三内容要求_第4页
《操作系统》实验三内容要求_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、操作系统实验二内容要求5 11 12【实验题目】:高响应比优先调度和时间片轮转RR进程调度算法【实验学时】:4学时【实验目的】 通过这次实验,加深对进程调度概念的理解,进一步掌握比FCFS和SJF更为复杂的进程调度算法的实现方法。【实验内容】问题描述:设计程序模拟进程的高响应比优先调度和时间片轮转RR调度过程。假设有n个进程分别在T1, ,Tn时刻到达系统,它们需要的服务时间分别为S1, ,Sn。如果选择RR算法,则需要指定时间片大小q,采用时间片轮转RR进程调度算法进行调度,如果选择高响应比优先调度算法,则可以直接调度,计算每个进程的完成时间,周转时间和带权周转时间,并且统计n个进程的平均周

2、转时间和平均带权周转时间。程序要求如下:1)进程个数n;每个进程的到达时间T1, ,Tn和服务时间S1, ,Sn;如果选择时间片轮转法,则要输入时间片大小q。2)要求高响应比优先和时间片轮转法RR调度进程运行,计算每个进程的周转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间;3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:进程B开始运行”等等;4)输出:要求输出计算出来的每个进程的周转时间,带权周转时间,所有进程的平均周转时间,带权平均周转时间。实现提示:用C+或者java语言实现提示:1)程序中进程调度时间变量描述如下:int ArrivalTi

3、me100;int ServiceTime100;int PServiceTime100;int FinishTime100;int WholeTime100;double WeightWholeTime100;double AverageWT,AverageWWT;bool Finished100;2)进程调度的实现过程如下: 变量初始化;typedef char string10; /* /定义string为含有10个字符元素的字符数组类型*/ struct task string name; /*作业号*/ int arrTime; /* 作业到达时间*/ int serTime; /*

4、作业要求服务时间*/ int waiTime; /*等待时间*/ int begTime; /*开始运行时间*/ int finTime; /*结束运行时间*/ int turTime; /*周转时间*/ int wTuTime; /*带权周转时间*/ int priority;/*优先权*/ int finish;/*是否已经完成*/ JCB10; int num; struct stud int name; int arrive; int run; int rest; char *state; struct stud *next; ; 接收用户输入n,T1, ,Tn,S1, ,Sn;str

5、uct stud *create() int a,i; struct stud *head, *rear,*p,*q,*t; head=rear=NULL; printf(n请输入进程数量:); scanf(%d,&a); printf(n请输入进程名称 到达时间 和 服务时间:n例如: 1 2 1n); for(i=0;iname,&p-arrive,&p-run); p-rest=p-run; p-state=ready; if(rear=NULL) head=p; p-next=NULL; rear=p; else t=NULL; q=head; while(q&q-arrivearri

6、ve) t=q; q=q-next; if(q=head) p-next=head; head=p; else if(t=rear) rear-next=p; p-next=NULL; rear=p; else t-next=p; p-next=q; return head; 选择算法,如果选择时间片轮转法,则输入时间片大小q,如果选择高响应比优先调度算法,则直接调度;void main() int number; while(true) printf(请选择算法:n); printf( 1. 高响应比优先调度算法n); printf( 2. 时间片轮转RR进程调度算法n); scanf(%d

7、,&number); if(number=1) char again; do system(cls); /*清屏*/ printf(please input 4 groups of datas:n); input(); check(); printf(Continue.(Y/N):n ); do again = getch(); while(again!=Y & again!=y & again!=N & again!=n); while(again=Y | again=y); if(number=2) struct stud *head; head=create(); output(head

8、) ; 按照用户选择的算法进行进程调度,计算进程的完成时间、周转时间和带权周转时间; /时间片轮转RR进程调度算法void output(struct stud *head) struct stud *p,*t,*r; int slice; printf(请输入时间片:); scanf(%d,&slice);while(head!=NULL) r=p=head; while(p!=NULL) t=head; p-rest=p-rest-slice; p-state=running; if(p-restrest=0; printf(n*n); printf(nametarrivetruntres

9、ttstaten); while(t!=NULL) printf(%dt%dt%dt%dt%sn,t-name,t-arrive,t-run,t-rest,t-state); t=t-next; if(p-rest=0)/*判断是否删除结点*/ if(p=head) head=p-next; free(p); p=head;/*删除头结点*/ else r-next=p-next; p=r-next; r=p; else r=p; p-state=ready; p=p-next; /高响应比优先度算法 void input() int i; system(cls); printf(n请输入进程

10、数量: ); scanf(%d, &num); for(i=0;inum;i+) printf(n请输入作业 NO.%d:n,i); printf( 作业名称: ); scanf(%s,JCB); printf( 到达时间: ); scanf(%d,&JCBi.arrTime); printf( 服务时间: ); scanf(%d,&JCBi.serTime); JCBi.priority = 0; JCBi.finish =0; int HRN(int pre) int current=1,i,j;/* 优先权 =(等待时间+服务时间)/服务时间*/ for(i=0; inum;

11、 i+) JCBi.waiTime=JCBpre.finTime-JCBi.arrTime; /*等待时间 =上一个作业的完成时间-到达时间*/ JCBi.priority=(JCBi.waiTime+JCBi.serTime)/JCBi.serTime; for(i=0; inum; i+) if(!JCBi.finish) current=i; /*找到第一个还没完成的作业*/ break; for( j=i; jnum; j+) /*和后面的作业比较*/ if( !JCBj.finish) /* 还没完成(运行)*/ if(JCBcurrent.arrTime=JCBpre.finTim

12、e) /*如果作业在上一个作业完成之前到达*/ if(JCBj.arrTimeJCBcurrent.priority ) current=j;/* 找出到达时间在上一个作业完成之前,优先权高的作业*/ else /* 如果作业是在上一个作业完成之后到达*/ if(JCBj.arrTimeJCBcurrent.priority) current=j; /*找出服务时间比较短的一个*/ return current;/*返回当前作业*/ void runing(int i, int times, int pre, int staTime, int endTime) if(times=0) JCBi

13、.begTime=JCBi.arrTime; JCBi.finTime=JCBi.begTime+JCBi.serTime; JCBi.turTime=JCBi.serTime; JCBi.wTuTime=1.0; staTime=JCBi.begTime; else if(JCBi.arrTimeJCBpre.finTime) JCBi.begTime=JCBi.arrTime; else JCBi.begTime=JCBpre.finTime; JCBi.finTime=JCBi.begTime+JCBi.serTime; JCBi.turTime=JCBi.finTime-JCBi.ar

14、rTime; JCBi.wTuTime=JCBi.turTime/JCBi.serTime; if(times=num-1) endTime=JCBi.finTime; JCBi.finish=1; 计算所有进程的平均周转时间和平均带权周转时间;void print(int i,int times) if(times=0) printf( 名称 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间n); printf(%9s%9d%9d%9d%9d%9d%9dn, JCB,JCBi.arrTime,JCBi.serTime, JCBi.begTime,JCBi.finTi

15、me,JCBi.turTime,JCBi.wTuTime); void check( ) int i; int staTime,endTime, sumTurTime=0.0, sumWTuTime=0.0, aveTurTime,aveWTuTime; int current=0, times=0, pre=0; JCBpre.finTime=0; for(i=0; inum; i+) JCBi.finish=0; staTime, endTime,sumTurTime=0.0, sumWTuTime=0.0, aveTurTime, aveWTuTime; current=0; times

16、=0; pre=0; JCBpre.finTime=0; printf(-n); for(i=0; inum; i+) JCBi.finish=0; staTime, endTime,sumTurTime=0.0, sumWTuTime=0.0, aveTurTime, aveWTuTime; current=0; times=0; pre=0; JCBpre.finTime=0; printf(n- HRRN -n); for(i=0; inum; i+) JCBi.finish=0; staTime, endTime,sumTurTime=0.0, sumWTuTime=0.0, aveT

17、urTime, aveWTuTime;current=0; times=0; pre=0; JCBpre.finTime=0; printf(n- HRRN -n); for(times=0; timesnum; times+) current=HRN(pre); runing(current, times, pre, staTime, endTime);print(current, times); pre=current; for(i=0; inum; i+) sumTurTime+=JCBi.turTime; sumWTuTime+=JCBi.wTuTime; aveTurTime=sumTurTime/num; aveWTuTime=sumWTuTime/num; printf(计与平均值) %9d%9d%9d%9dn,NULL,sumTurTime,aveTurTime,aveWTuTime); printf(-n); 按格式输出调度结果。 if(times=0) printf( 名称 到达时间 服务时间 开始时间 完成

温馨提示

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

评论

0/150

提交评论