计操实验 多级反馈队列C语言

计操实验 多级反馈队列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;
}




评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值