多级反馈队列算法

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

、题目同时具有高、中、低三级调度的调度队列模型的模拟实现。、设计思路设置三个反馈队列(使用动态链表的形式),第一级的时间片为8,第二级的时间片为16,第三级的时间片为32。由用户输入进程名称及其每个进程执行所需的时间。并将这些进程送至第一级反馈队列,采用先来先服务原则调用执行,若该进程在第一级反馈队列中就已经执行完毕,则将进程从内存中移除;未完成的进入二级反馈队列队尾等待执行。同理,进程在二级反馈队列若执行完,就可将进程从内存中移除,否则进入第三级反馈队列执行。第三级队列设置为循环队列,即若程序第一次未完成,则将程序放至队列队尾,等待下次调用执行,直到所有的程序运行完毕为止。源程序及运行结果程序代码:#includestdio.h#includemalloc.h#includestring.hstructpoly{charname[2];//进程名称inttime;//完成进程所需的时间structpoly*next;};structpoly*newlink(void)//建立反馈队列,使用尾插法{structpoly*p1,*head,*p2;p1=(structpoly*)malloc(sizeof(structpoly));p1-name[0]=0;p1-time=0;head=p1;while(p1-name[0]!='#'){p2=(structpoly*)malloc(sizeof(structpoly));printf(请输入进程名称和完成该进程所需的时间(以#结束):);scanf(%s%d,&p2-name,&p2-time);p1-next=p2;p1=p2;}p1-next=NULL;p1=head-next;printf(队列进入第一级链栈,初始情况为:\n);printf(name\t\ttime);printf(\n);while(p1-name[0]!='#'){printf(%s\t\t%d\n,p1-name,p1-time);p1=p1-next;}returnhead;}//-------------------------------------------------------voidfeedback3(structpoly*head3)//进入第三级反馈队列,时间片长度为32.且第三级链表设为循环链表格式{structpoly*p1,*p2;intt=32;intn=0;p1=head3-next;printf(\n\n第二级队列运行完后,第三级队列的初始情况为:\n);printf(name\t\ttime);printf(\n);//rightwhile(p1-next!=head3){printf(%s\t\t%d\n,p1-name,p1-time);p1=p1-next;}printf(%s\t\t%d\n,p1-name,p1-time);p1=head3-next;while(head3-next!=head3){p1-time=p1-time-t;if(p1-time0){printf(\n%s经32个时间片后还余%d个时间片,进入三级队列的队尾等待下次执行,p1-name,p1-time);p1=p1-next;}else{if(p1-next!=head3){printf(进程%s经32个时间片后结束,可以将其从内存中移除!,p1-name);strcpy(p1-name,p1-next-name);p1-time=p1-next-time;p2=p1-next;p1-next=p2-next;free(p2);}else{printf(\n进程%s经32个时间片后结束,可以将其从内存中移除!\n此时所有进程均已调试结束!\n,p1-name);free(p1);free(head3);//所有进程都已经结束,将队列中剩余的点删除.break;}}if(p1=head3){n++;p1=head3-next;printf(\n经%d次工作后队列三中还有的队列为:,n);printf(\nname\t\ttime\n);while(p1-next!=head3){printf(%s\t\t%d\n,p1-name,p1-time);p1=p1-next;}printf(%s\t\t%d\n,p1-name,p1-time);p1=head3-next;}}}//-------------------------------------------------------voidfeedback2(structpoly*head2)//进入第二级反馈队列,时间片为16{structpoly*p1;structpoly*head3,*p31,*p32;intt=16;p1=head2-next;printf(\n\n第一级队列运行完后,第二队列中的初始情况为:\n);printf(name\t\ttime);printf(\n);while(p1-name[0]!='#'){printf(%s\t\t%d\n,p1-name,p1-time);p1=p1-next;}p31=(structpoly*)malloc(sizeof(structpoly));head3=p31;p1=head2-next;while(p1-name[0]!='#'){p1-time=p1-time-t;if(p1-time0){p32=(structpoly*)malloc(sizeof(structpoly));strcpy(p32-name,p1-name);p32-time=p1-time;p31-next=p32;p31=p32;printf(\n进程%s,运行完16个时间片后还剩余%d个时间片,进入三级反馈队列!,p1-name,p1-time);}else{printf(\n进程%s经16个时间片后结束,可以将其从内存中移除!,p1-name);}head2=p1;p1=p1-next;//每读取完一个数据并对它进行操作后就将该节点释放free(head2);}free(p1);p31-next=head3;feedback3(head3);}//-------------------------------------------------------voidfeedback1(structpoly*head1)//第一级反馈队列,时间片为8{structpoly*p1;structpoly*head2,*p21,*p22;intt=8;inti;p1=head1-next;p21=(structpoly*)malloc(sizeof(structpoly));head2=p21;while(p1-name[0]!='#'){p1-time=p1-time-t;if(p1-time0){p22=(structpoly*)malloc(sizeof(structpoly));strcpy(p22-name,p1-name);p22-time=p1-time;p21-next=p22;p21=p22;printf(\n进程%s,运行完8个时间片后还剩余%d个时间片,进入二级反馈队列!,p1-name,p1-time);}else{printf(\n进程%s经8个时间片后结束,可以将其从内存中移除!,p1-name);//队列一的话不需要将该节点从链表中删除,所以可以简单地表示成这样。实际并没有释放该节点}head1=p1;p1=p1-next;//每读取完一个数据并对它进行操作后就将该节点释放free(head1);}free(p1);p22=(structpoly*)malloc(sizeof(structpoly));p22-name[0]='#';p21-next=p22;feedback2(head2);}//-------------------------------------------------voidmain(){structpoly*head1;//printf(请输入进程名称及完成该进程所需的时间(以#号结束));head1=newlink();feedback1(head1);//进入第一级反馈队列}

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功