写了这个程序后我对时间片轮转算法有了更深的了解:在算法中系统将所有的就绪进程按先来先服务的原则排成一个队列。每次调度时,把CPU分配给队首进程,并令其执行一个时间片。一直到程序运行完成,每个程序轮流享用着cpu的资源。#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
char name[20];
int round;
int cputime;
int arrivetime;
int needtime;
char state;
int count;
struct node *next;
}PCB;
PCB *ready=NULL,*run=NULL,*finish=NULL;
int num,i;
void GetFirst();
void Output();
void InsertTime(PCB *in);
void InsertFinish(PCB *in);
void TimeCreate();
void RoundRun();
int main(void)
{
printf("请输入要创建的进程数目:\n");
scanf("%d",&num);
TimeCreate();
RoundRun();
Output();
}
void GetFirst() /*取得第一个就绪队列节点*/
{
run = ready;
if(ready!=NULL)
{
run ->state = 'R';
ready = ready ->next;
run ->next = NULL;
}
}
void Output() /*输出队列信息*/
{
PCB *p;
p = ready;
printf("进程名\tcpu时间\t需要时间\t进程状态\t计数器\n");
while(p!=NULL)
{
printf("%s\t%d\t%d\t\t%c\t\t%d\n",p->name,p->cputime,p->needtime,p->state,p->count);
p = p->next;
}
p = finish;
while(p!=NULL)
{
printf("%s\t%d\t%d\t\t%c\t\t%d\n",p->name,p->cputime,p->needtime,p->state,p->count);
p = p->next;
}
p = run;
while(p!=NULL)
{
printf("%s\t%d\t%d\t\t%c\t\t%d\n",p->name,p->cputime,p->needtime,p->state,p->count);
p = p->next;
}
}
void InsertTime(PCB *in) /*将进程插入到就绪队列尾部*/
{
PCB *fst;
fst = ready;
if(ready == NULL)
{
in->next = ready;
ready = in;
}
else
{
while(fst->next != NULL)
{
fst = fst->next;
}
in ->next = fst ->next;
fst ->next = in;
}
}
void InsertFinish(PCB *in) /*将进程插入到完成队列尾部*/
{
PCB *fst;
fst = finish;
if(finish == NULL)
{
in->next = finish;
finish = in;
}
else
{
while(fst->next != NULL)
{
fst = fst->next;
}
in ->next = fst ->next;
fst ->next = in;
}
}
void TimeCreate() /*时间片输入函数*/
{
PCB *tmp;
int i;
printf("输入进程名字 到达时间 进程所需时间 时间片大小:\n");
for(i = 0;i < num; i++)
{
if((tmp = (PCB *)malloc(sizeof(PCB)))==NULL)
{
perror("malloc");
exit(1);
}
scanf("%s %d %d %d",tmp->name,&(tmp->arrivetime),&(tmp->needtime),&(tmp ->round));
getchar();
tmp ->cputime = 0;
tmp ->state ='W';
// tmp->prio=0;
tmp ->count = 0;
InsertTime(tmp);
}
}
void RoundRun() /*时间片轮转调度算法*/
{
int flag = 1;
GetFirst();
while(run != NULL)
{
Output();
while(flag)
{
run->cputime++ ;
run->needtime--;
run->count++;
if(run->needtime == 0)
{
run ->state = 'F';
InsertFinish(run);
flag = 0;
}
else if(run->count == run->round)
{
run->state = 'W';
run->count=0;
InsertTime(run);
flag = 0;
}
}
flag = 1;
GetFirst();
}
}
实验测试: