该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
ready=s;
}
}
//优先数创建初始PCB信息
void create1(char alg)
{
PCB *p;
int i,time;
char na[10];
ready=NULL; //就绪队列头文件
finish=NULL; //完成队列头文件
run=NULL; //运行队列头文件
printf("输入进程号和运行时间:\n"); //输入进程标志和所需时间创建PCB
for(i=1;i<=N;i++)
{
p=(PCB *)malloc(sizeof(PCB));
scanf("%s",na);
scanf("%d",&time);
strcpy(p->name,na);
p->cputime=0;
p->needtime=time;
p->state='w';
p->prio=50-time;
if(ready!=NULL) //就绪队列不空,调用插入函数插入
insert1(p);
else
{
p->next=ready; //创建就绪队列的第一个PCB
ready=p;
}
}
//clrscr();
printf(" 优先数算法输出信息:\n");
printf("***********************************************\n");
prt(alg); //输出进程PCB信息
run=ready; //将就绪队列的第一个进程投入运行
ready=ready->next;
run->state='R';
}
//优先数调度算法
void priority(char alg)
{
while(run!=NULL) //当运行队列不空时,有进程正在运行
{
run->cputime=run->cputime+1;
run->needtime=run->needtime-1;
run->prio=run->prio-3; //每运行一次优先数降低3个单位
if(run->needtime==0) //如所需时间为0将其插入完成队列
{
run->next=finish;
finish=run;
run->state='F'; //置状态为完成态
run=NULL; //运行队列头指针为空
if(ready!=NULL) //如就绪队列不空
firstin(); //将就绪队列的第一个进程投入运行
}
else //没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列
if((ready!=NULL)&&(run->prioprio))
{
run->state='W';
insert1(run);
firstin(); //将就绪队列的第一个进程投入运行
}
prt(alg); //输出进程PCB信息
}
}
//主函数
void main()
{
char algo; //算法标记
//clrscr();
printf("输入进程数:\n");
scanf("%d",&N); //输入进程数
create1(algo); //优先数算法
priority(algo);
}