多级反馈队列-实验-操作系统_第1页
多级反馈队列-实验-操作系统_第2页
多级反馈队列-实验-操作系统_第3页
多级反馈队列-实验-操作系统_第4页
多级反馈队列-实验-操作系统_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

实验名称:多级反馈队列调度09091201丁奎荣一、实验目的:1、综合应用下列知识点设计并实现操作系统的进程调度,进程状态转换,多组级反馈队列进程调度算法。2、加深理解操作系统进程调度的过程。3、加深理解多级反馈队列进程调度算法。二、实验内容:1、采用一种熟悉的语言,编制程序,最好采用C/C++,界面设计可采用其它自己喜欢的语言。2、采用多级反馈队列进程调度算法进行进程调度。3、每个进程对应一个PCB。在PCB中包括进程标识符pid、进程的状态标志status、进程优先级priority、进程的队列指针next和表示进程生命周期的数据项life(在实际系统中不包括该项)。4、创建进程时即创建一个PCB,各个进程的pid都是唯一的,pid时在1到100范围的一个整数。可以创建一个下标为1到100的布尔数组,“真”表示下标对应的进程号是空闲的,“假”表示下标对应的进程号已分配给某个进程。5、进程状态status的取值为“就绪ready”或“运行run”,刚创建时,状态为“ready”。被进程调度程序选中后变为“run”。6、进程优先级priority是0到49范围内的一个随机整数。7、生命周期life是1到5范围内的一个随机整数。8、初始化时,创建一个邻接表,包含50各就绪队列,各就绪队列的进程优先级priority分别是0到49。9、为了模拟用户动态提交任务的过程,要求动态创建进程。进入进程调度循环后,每次按ctrl+f即动态创建一个过程,然后将该PCB插入就绪队列中。按ctrl+q退出进程调度循环。10、在进程调度循环中,每次选择优先级最大的就绪进程来执行。将其状态从就绪变为运行,通过延时一段时间来模拟该进程执行一个时间片的过程,然后优先级减半,生命周期减一。设计图形用户界面GUI,在窗口中显示该进程和其他所有进程的PCB内容。如果将该运行进程的生命周期不为0,则重新把它变为就绪状态,插入就绪对列中;否则该进程执行完成,撤销其PCB。以上为一次进程调度循环。四、程序主要流程图:实验源程序:#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstructnode/*进程节点信息*/{}}}voidPrioCreate()/*创建就绪队列输入函数*/{ReadyQueue*tmp;inti;printf("输入就绪队列的个数:\n");scanf("%d",&ReadyNum);printf("输入每个就绪队列的CPU时间片:\n");for(i=0;i<ReadyNum;i++){if((tmp=(ReadyQueue*)malloc(sizeof(ReadyQueue)))==NULL){perror("malloc");exit(1);}scanf("%d",&(tmp->round));/*输入此就绪队列中给每个进程所分配的CPU时间片*/tmp->prio=50-tmp->round;/*设置其优先级,时间片越高,其优先级越低*/tmp->LinkPCB=NULL;/*初始化其连接的进程队列为空*/tmp->next=NULL;InsertPrio(tmp);/*按照优先级从高到低,建立多个就绪队列*/}}voidGetFirst(ReadyQueue*queue)/*取得某一个就绪队列中的队头进程*/{run=queue->LinkPCB;if(queue->LinkPCB!=NULL){run->state='R';queue->LinkPCB=queue->LinkPCB->next;run->next=NULL;}}voidInsertLast(PCB*in,ReadyQueue*queue)/*将进程插入到就绪队列尾部*/{PCB*fst;fst=queue->LinkPCB;if(queue->LinkPCB==NULL){in->next=queue->LinkPCB;queue->LinkPCB=in;}else{while(fst->next!=NULL){fst=fst->next;}in->next=fst->next;fst->next=in;}}voidProcessCreate()/*进程创建函数*/{PCB*tmp;inti;printf("输入进程的个数:\n");scanf("%d",&num);printf("输入进程名字和进程所需时间:\n");for(i=0;i<num;i++){if((tmp=(PCB*)malloc(sizeof(PCB)))==NULL){perror("malloc");exit(1);}scanf("%s",tmp->name);getchar();/*吸收回车符号*/scanf("%d",&(tmp->needtime));tmp->cputime=0;tmp->state='W';tmp->prio=50-tmp->needtime;/*设置其优先级,需要的时间越多,优先级越低*/tmp->round=Head->round;tmp->count=0;InsertLast(tmp,Head);/*按照优先级从高到低,插入到就绪队列*/}}voidRoundRun(ReadyQueue*timechip)/*时间片轮转调度算法*/{intflag=1;GetFirst(timechip);while(run!=NULL){while(flag){run->count++;run->cputime++;run->needtime--;if(run->needtime==0)/*进程执行完毕*/{run->state='F';InsertFinish(run);flag=0;}elseif(run->count==timechip->round)/*时间片用完*/{run->state='W';run->count=0;/*计数器清零,为下次做准备*/InsertLast(run,timechip);flag=0;}}flag=1;GetFirst(timechip);}}voidMultiDispatch()/*多级调度算法,每次执行一个时间片*/{intflag=1;intk=0;ReadyQueue*point;point=Head;GetFirst(point);while(run!=NULL){Output();if(Head->LinkPCB!=NULL)point=Head;while(flag){run->count++;run->cputime++;run->needtime--;if(run->needtime==0)/*进程执行完毕*/{run->state='F';InsertFinish(run);flag=0;}elseif(run->count==run->round)/*时间片用完*/{run->state='W';run->count=0;/*计数器清零,为下次做准备*/if(point->next!=NULL){run->round=point->next->round;/*设置其时间片是下一个就绪队列的时间片*/InsertLast(run,point->next);/*将进程插入到下一个就绪队列中*/flag=0;}else{RoundRun(point);/*如果为最后一个就绪队列就调用时间片轮转算法*/break;}}++k;if(k==3){ProcessCreate();}}flag=1;if(point->LinkPCB==NULL)/*就绪队列指针下移*/point=point->next;if(point->next==NULL){RoundRun(point);break;}GetFirst(point);}}五、实验中遇到的问题和实验中的重点1.使用C++对于多级反馈模拟过程进行描述,需要对计数器KillTimer();ONTIMER();进行设计。通过在计数器中对函数run()设计并在ONTIMER()中对run函数调用从而完成多级反馈队列运行的模拟。在变成过程中要对ONTIMER手动映射

温馨提示

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

评论

0/150

提交评论