计操实验 多级反馈队列C语言
需求:
1.队列4级,每一级的队列长度均为10;第一级的时间片为T,第二级的时间片为2T,第三级的时间片为4T,第四级的时间片为8T;(T的大小自己定)
2.非立即抢占的剥夺式调度算法;
3.要有:在调度高级别队列时,有新来的进程进入系统。
流程图:
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define T 1
typedef struct Node
{
int ArrivalTime; //到达时间
int WorkTime; //服务时间
int number; //到达顺序
int flag; //0等待,1运行完成
struct Node *next;
}Process;
typedef struct QueueList
{
int TimeSlice; //时间片
int length; //队列长度
Process *front; //队列第一个进程指针
struct QueueList *next;
}Queue;
Queue *head = NULL;
Process *Finish = NULL; //已完成
int time = 0;
void InitQueue()
{
Queue *temp;
for(int i=0;i<4;i++)
{
temp = (Queue*)malloc(sizeof(Queue));
temp->front = NULL;
temp->TimeSlice = pow(2,i)*T;
temp->length = 10;
temp->next = NULL;
if(head == NULL)
{
head = temp;
temp = NULL;
}
else
{
Queue *temp2;
temp2 = head;
while(temp2->next != NULL)
{
temp2 = temp2->next;
}
temp2->next = temp;
temp = NULL;
}
}
}
void InitProcess()
{
int num;
printf("请输入进程数量:");
scanf("%d",&num);
if(num > 10)
{
printf("超过队列长度!");
exit(1);
}
Process *temp;
for(int i=0;i<num;i++)
{
temp = (Process*)malloc(sizeof(Process));
printf("请输入第%d个进程的到达时间及服务时间:",i+1);
scanf("%d %d",&temp->ArrivalTime,&temp->WorkTime);
temp->flag = 0;
temp->next = NULL;
temp->number = i+1;
if(head->front == NULL)
{
temp->next = NULL;
head->front = temp;
}
else
{
Process *temp2;
temp2 = head->front;
while(temp2->next != NULL)
{
temp2 = temp2->next;
}
temp->next = NULL;
temp2->next = temp;
}
}
}
void Insert2NextQueue(Process *P,Queue *Q)
{
//将进程P插入Q队尾
if(Q->front == NULL)
{
P->next = NULL;
Q->front = P;
}
else
{
Process *temp;
temp = Q->front;
while(temp->next != NULL)
{
temp = temp->next;
}
P->next = NULL;
temp->next = P;
}
}
void RunFirstProcess(Queue *Q)
{
if(Q->front->WorkTime <= Q->TimeSlice)
{
time += Q->front->WorkTime;
Q->front->WorkTime = 0;
Q->front->flag = 1;
printf("t=%d时刻:第%d个进程运行结束\n",time,Q->front->number);
Process *temp,*temp2;
temp = Finish;
temp2 = Q->front->next;
if(Finish == NULL)
{
Finish = Q->front;
Finish->next = NULL;
}
else
{
while(temp->next != NULL)
{
temp = temp->next;
}
Q->front->next = NULL;
temp->next = Q->front;
}
Q->front = temp2;
}
else
{
Q->front->WorkTime -= Q->TimeSlice;
time += Q->TimeSlice;
Process *temp,*temp2;
temp = Q->front;
temp2 = Q->front->next;
if(Q->next != NULL)
{
Insert2NextQueue(temp,Q->next);
Q->front = temp2;
}
else
{
//Insert2NextQueue(Q->front,Q);
if(temp2 != NULL)
{
Q->front = temp2;
if(temp2->next != NULL)
{
temp2 = temp2->next;
}
temp2->next = temp;
temp->next = NULL;
}
}
}
}
void MLFQ()
{
Queue *Q1=head;
Queue *Q2=Q1->next;
Queue *Q3=Q2->next;
Queue *Q4=Q3->next;
while(1)
{
if(Q1->front != NULL && time >= Q1->front->ArrivalTime)
{
//Q1取第一个进程运行
RunFirstProcess(Q1);
}
else
{
if(Q2->front != NULL && time >= Q2->front->ArrivalTime)
{
//Q2取第一个进程运行
RunFirstProcess(Q2);
}
else
{
if(Q3->front != NULL && time >= Q3->front->ArrivalTime)
{
//Q3取第一个进程运行
RunFirstProcess(Q3);
}
else
{
if(Q4->front != NULL && time >= Q4->front->ArrivalTime)
{
//Q4取第一个进程运行
RunFirstProcess(Q4);
}
else
{
if(Q1->front != NULL || Q2->front != NULL || Q3->front != NULL || Q4->front != NULL)
{
time++;
}
else
{
printf("所有进程运行完毕");
}
break;
}
}
}
}
}
}
int main()
{
InitQueue();
InitProcess();
MLFQ();
return 0;
}