多级反馈队列调度模拟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#include
struct PCB
{
char name[20]; //进程名
int pro_time; //执行时间
int have_deal_time; //进程已执行时间
};
struct Queue //队列链表
{
PCB queue[20]; //队列长度
int time; //各个队列的时间片
int k; //记住自己是第几个节点
int pro_num; //队列中进程数
Queue *next;
};
void instruction(); //模拟原理
void deal(bool); //模拟处理机处理相应队列
bool ask(); //询问模拟方式(处理过程中是否有新进程到达)
void input_proc(); //读入就绪进程数和新到达的进程
bool Go_on(); //模拟结束询问是否继续模拟
int new_pro_arrive_time; //新进程到达时间
bool deal_with_new_pro();
Queue *Queue_head; //指向就绪队列队链表的头指针
int count=0; //统计节点的个数
int Time=0; //处理机运行时间
void main()
{
Queue_head=NULL;
bool go_on=true;
bool no;
bool have;
while(go_on)
{
instruction();
input_proc();
have=ask();
if(have)
{
printf("\n请输入新进程 到达时间 进程名 进程执行时间/23 xunlei 8/:");
scanf("%d",&new_pro_arrive_time);
}
deal(have); //调用处理机处理函数
no=Go_on();
if(no)
go_on=false;
}
}
void instruction() //模拟原理
{
printf("\n说明:C语言模拟多级反馈队列调度,队列优先级依次升高,队列时间片依次降低,后一对\n\n列比前一队列长1倍,本次模拟第一队列时间片为2,若有新进程到达,放入第一队列\n");
printf("\n******************************************************************************\n");
}
bool Go_on()
{
int choose;
printf("\n是否继续模拟【1:是 2:否】\n");
printf("\n请选择:");
scanf("%d",&choose);
if(choose==2)
return true;
{Time=0;count=0;return false;}
}
void input_proc()
{
int proc_num; //输入的进程数量
int i=-1; //队列中的第i个进程
Queue *p; //队列链表节点
p=(Queue*)malloc(sizeof(Queue));
p->next=NULL;
p->k=++count;
p->time=2;
printf("\n请输入就绪进程数:");
scanf("%d",&proc_num);
p->pro_num=proc_num; //就绪进程数
printf("\n请输入进程名和执行时间/xunlei 8/:\n");
while((proc_num--)) //读入进程至第一队列
{
i++;
scanf("%s%d",&p->queue[i].name,&p->queue[i].pro_time);
p->queue[i].have_deal_time=0;
}
Queue_head=p;
}
bool ask()
{
int choose;
printf("\n模拟过程中是否有新进程到达【1:有 2:无】\n");
printf("\n请选择:");
scanf("%d",&choose);
if(choose
== 1)
return true;
return false;
}
void deal(bool have)
{
Queue *p,*q; //链表头指针
p=Queue_head;
int flag; //用于标识是否有进程进入下一队列
int proc_num; //记下有多少进程进入下一队列
int i; //正在处理队列中进程位置
int j;
int creat;
int duilie=0; //队列序数
do //队列之间循环
{
duilie++;
printf("\n队列 %d:",duilie);
printf("(时间片%d)\n",p->time);
creat=1;
proc_num=0;
flag=0;
j=0;
for(i=0;i
{
if(p->time>=p->queue[i].pro_time)
{Time+=p->queue[i].pro_time;printf("\n进程 %s 在 %d 时刻执行完\n",p->queue[i].name,Time);}
else
{
flag=1; //表示有未完成的进程进入下一队列
proc_num++; //统计下一队列的进程数
Time+=p->time; //cpu执行时间
p->queue[i].pro_time-=p->time;
p->queue[i].have_deal_time+=p->time;
printf("\n进程 %s 未执行完(已处理:%d 剩余:%d ),调到下一队列\n",p->queue[i].name,p->queue[i].have_deal_time,p->queue[i].pro_time);
if(creat==1) //如果是队列的第一个节点则创建
{
creat=0;
q=(Queue*)malloc(sizeof(Queue)); //创建下一队列
q->next=NULL;
q->k=++count; //本节点是第几个节点
q->time=(int)pow(2,q->k); //本节点的时间片长度
p->next=q;
}
q->queue[j++]=p->queue[i]; //将未执行完的进程调到下一队列
}
if(have&&Time>=new_pro_arrive_time&&p->k == 1)
{
printf("\n有新进程到达,放入本队列末尾\n");
p->pro_num++;
scanf("%s%d",&p->queue[p->pro_num-1].name,&p->queue[p->pro_num-1].pro_time);
p->queue[p->pro_num-1].have_deal_time=0;
have=false;
}
if(have&&Time>=new_pro_arrive_time&&p->k >= 1)
have=deal_with_new_pro();
}
p->pro_num=0; //每一队列执行完后进程数为零
if(flag==1)
{
p=q;
p->pro_num=proc_num; //下一进程的数目
}
}
while(flag == 1 );
}
bool deal_with_new_pro()
{
bool no;
Queue *p;
p=Queue_head;
printf("\n有新进程到达,放入第一队列,处理机开始处理新到达的进程,\n");
printf("\n*************************************************************\n");
scanf("%s%d",&p->queue[0].name,&p->queue[0].pro_time);
p->queue[0].have_deal_time=0;
for(int i=1; p->pro_num==0 ; p=p->next,i++)
{
printf("\n队列 %d:",i);
printf("(时间片%d)\n",p->time);
if(p->time>=p->queue[0].pro_time)
{
Time+=p->queue[0].pro_time;printf("\n新进程 %s 在 %d 时刻执行完\n",p->queue[0].name,Time);
printf("\n***********************************************************************\n");
break;
}
els
e
{
Time+=p->time; //cpu执行时间
p->queue[0].pro_time-=p->time;
p->queue[0].have_deal_time+=p->time;
printf("\n新进程 %s 未执行完(已处理:%d 剩余:%d ),调到下一队列\n",p->queue[0].name,p->queue[0].have_deal_time,p->queue[0].pro_time);
p->next->queue[p->next->pro_num] = p->queue[0];
if(p->next->pro_num!=0)
{
p->next->pro_num++;
printf("\n************************************************************\n");
}
}
}
no=false;
return no;
}