您好,欢迎来到步遥情感网。
搜索
您的当前位置:首页多级反馈队列算法

多级反馈队列算法

来源:步遥情感网
1-1、题目

同时具有高、中、低三级调度的调度队列模型的模拟实现。 1-2、设计思路

设置三个反馈队列(使用动态链表的形式),第一级的时间片为8,第二级的时间片为16,第三级的时间片为32。由用户输入进程名称及其每个进程执行所需的时间。并将这些进程送至第一级反馈队列,采用先来先服务原则调用执行,若该进程在第一级反馈队列中就已经执行完毕,则将进程从内存中移除;未完成的进入二级反馈队列队尾等待执行。同理,进程在二级反馈队列若执行完,就可将进程从内存中移除,否则进入第三级反馈队列执行。第三级队列设置为循环队列,即若程序第一次未完成,则将程序放至队列队尾,等待下次调用执行,直到所有的程序运行完毕为止。 1-3、源程序及运行结果 程序代码:

#include #include #include struct poly {

char name[2];//进程名称 int time;//完成进程所需的时间

struct poly *next; };

struct poly *newlink(void) //建立反馈队列,使用尾插法 {

struct poly *p1, *head, *p2;

p1 = ( struct poly* )malloc( sizeof(struct poly ) ); p1->name[0]=0;p1->time=0; head = p1;

while( p1->name[0]!='#') {

p2 = ( struct poly* )malloc( sizeof(struct poly) );

printf( \"请输入进程名称和完成该进程所需的时间(以#结

束):\" );

scanf(\"%s%d\ p1->next=p2; p1=p2; }

p1->next = NULL; p1=head->next;

printf(\"队列进入第一级链栈,初始情况为:\\n\");

printf(\"name\\time\"); printf(\"\\n\");

while(p1->name[0]!='#') {

printf(\"%s\\ %d\\n\ p1=p1->next; }

return head; }

//-------------------------------------------------------void feedback3(struct poly *head3)

//进入第三级反馈队列,时间片长度为32.且第三级链表设为循环链表格式 {

struct poly *p1,*p2; int t=32; int n=0;

p1=head3->next;

printf(\"\\n\\n第二级队列运行完后,第三级队列的初始情况为:\\n\"); printf(\"name\\time\"); printf(\"\\n\");//right while(p1->next!=head3) {

printf(\"%s\\ %d\\n\ p1=p1->next; }

printf(\"%s\\ %d\\n\p1=head3->next;

while(head3->next!=head3) {

p1->time=p1->time-t; if(p1->time>0) {

printf(\"\\n%s经32个时间片后还余%d个时间片,进入三级队列

的队尾等待下次执行\

p1=p1->next; } else {

if(p1->next!=head3) {

printf(\"进程%s经32个时间片后结束,可以将其从内存中移

除!\

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\

free(p1);free(head3);//所有进程都已经结束,将队列中

剩余的点删除.

break; } }

if(p1=head3) {

n++;

p1=head3->next;

printf(\"\\n经%d次工作后队列三中还有的队列为:\printf(\"\\nname\\time\\n\"); while(p1->next!=head3) {

printf(\"%s\\ %d\\n\ p1=p1->next;

}

printf(\"%s\\ %d\\n\ p1=head3->next; } } }

//------------------------------------------------------- void feedback2(struct poly *head2) //进入第二级反馈队列,时间片为16 {

struct poly *p1;

struct poly *head3,*p31,*p32; int t=16;

p1=head2->next;

printf(\"\\n\\n第一级队列运行完后,第二队列中的初始情况为:\\n\"); printf(\"name\\time\"); printf(\"\\n\");

while(p1->name[0]!='#') {

printf(\"%s\\ %d\\n\ p1=p1->next; }

p31=(struct poly*)malloc(sizeof(struct poly)); head3=p31;

p1=head2->next;

while(p1->name[0]!='#') {

p1->time=p1->time-t; if(p1->time>0) {

p32=(struct poly*)malloc(sizeof(struct poly)); strcpy(p32->name,p1->name); p32->time=p1->time; p31->next=p32; p31=p32;

printf(\"\\n进程%s,运行完16个时间片后还剩余%d个时间片,

进入三级反馈队列!\

} else {

printf(\"\\n进程%s经16个时间片后结束,可以将其从内存中移

除!\

}

head2=p1;

p1=p1->next;//每读取完一个数据并对它进行操作后就将该节点释

free(head2); }

free(p1);

p31->next=head3; feedback3(head3); }

//-------------------------------------------------------void feedback1(struct poly *head1) //第一级反馈队列,时间片为8 {

struct poly *p1;

struct poly *head2,*p21,*p22; int t=8; int i;

p1=head1->next;

p21=(struct poly*)malloc(sizeof(struct poly)); head2=p21;

while(p1->name[0]!='#') {

p1->time=p1->time-t; if(p1->time>0) {

p22=(struct poly*)malloc(sizeof(struct poly)); strcpy(p22->name,p1->name); p22->time=p1->time; p21->next=p22; p21=p22;

printf(\"\\n进程%s,运行完8个时间片后还剩余%d个时间片,进

入二级反馈队列!\

} else {

printf(\"\\n进程%s经8个时间片后结束,可以将其从内存中移

除!\

//队列一的话不需要将该节点从链表中删除,所以可以简单地表示

成这样。实际并没有释放该节点 }

head1=p1;

p1=p1->next;//每读取完一个数据并对它进行操作后就将该节点释

free(head1); }

free(p1);

p22=(struct poly*)malloc(sizeof(struct poly)); p22->name[0]='#'; p21->next=p22; feedback2(head2); }

//------------------------------------------------- void main() {

struct poly *head1; }

//printf(\"请输入进程名称及完成该进程所需的时间(以#号结束)\"); head1=newlink();

feedback1(head1);//进入第一级反馈队列

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- obuygou.com 版权所有 赣ICP备2024042798号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务