多级反馈队列调度模拟

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;ipro_num;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;
}

相关文档
最新文档