多级反馈队列算法

有些瑕疵,但也勉强够用了

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
	
int T = 10;//单位时间片长度

typedef struct process
{
	int id;
	int time;
	int needtime;//剩余时间
}process;

typedef struct queue
{
	int priority;//优先级
	int timechip;//时间片
	process queue[10];//队列
}queue;

void qinit(queue* q, int len);//就绪队列初始化
void enter(process n, queue* q);//进程n入队
process quit(queue* q);//取出队列中首个非空进程
int isempty(queue* q);//判断队列是否为空
int isfull(queue* q);//判断队列是否满
double uniform(double a, double b, long int* seed);//产生均匀分布随机数

int main()
{
	long int seed = rand();
	queue q[4];
	qinit(q, 4);

	int t = 0;//单位时间起始
	int id = 0;//进程id起始
	int cpu = 0;//cpu是否被占用
	int time_to_free_cpu = 0;//cpu占用解除的时间

	while (1)
	{
		t++;//单位时间增加
		if (t == time_to_free_cpu)
		{
			cpu = 0;
		}//cpu占用时间结束
		
		double r;
		if (r = uniform(0, 1, &seed) >= 0.99 && !isfull(&q[0]) && !isfull(&q[1]) && !isfull(&q[2]) && !isfull(&q[3]))
		{
			process p;
			p.id = ++id;
			p.needtime = (int)uniform(1, 17.0 * T, &seed);
			p.time = p.needtime;/*(0.3 * uniform(0, 1.0 * T, &seed) + 0.3 * uniform(0, 2.0 * T, &seed) + 0.2 * uniform(0, 4.0 * T, &seed) + 0.2 * uniform(0, 8.0 * T, &seed));*/
			enter(p, &q[0]);
		}//每一个单位时间内均有0.25的概率产生新进程,其可在第一个队列未满时入队
		if (cpu == 0)//cpu未被占用
		{
			if (!isempty(&q[0]))
			{
				cpu = 1;//cpu被占用
				process n = quit(&q[0]);
				time_to_free_cpu = t + min(q[0].timechip, n.needtime);

				if (q[0].timechip < n.needtime)
				{
					n.needtime -= q[0].timechip;
					enter(n, &q[1]);
				}//在第一轮里面没有处理完,则进入第二个队列
				else
				{
					printf("进程id=%d,需要时间%d,于t=%d时处理完毕\n", n.id, n.time, time_to_free_cpu);
				}
			}
			else if (!isempty(&q[1]))
			{
				cpu = 1;//cpu被占用
				process n = quit(&q[1]);
				time_to_free_cpu = t + min(q[1].timechip, n.needtime);

				if (q[1].timechip < n.needtime)
				{
					n.needtime -= q[1].timechip;
					enter(n, &q[2]);
				}//在第二轮里面没有处理完,则进入第三个队列
				else
				{
					printf("进程id=%d,需要时间%d,于t=%d时处理完毕\n", n.id, n.time, time_to_free_cpu);
				}
			}
			else if (!isempty(&q[2]))
			{
				cpu = 1;//cpu被占用
				process n = quit(&q[2]);
				time_to_free_cpu = t + min(q[2].timechip, n.needtime);

				if (q[2].timechip < n.needtime)
				{
					n.needtime -= q[2].timechip;
					enter(n, &q[3]);
				}//在第三轮里面没有处理完,则进入第四个队列
				else
				{
					printf("进程id=%d,需要时间%d,于t=%d时处理完毕\n", n.id, n.time, time_to_free_cpu);
				}
			}
			else if (!isempty(&q[3]))
			{
				cpu = 1;//cpu被占用
				process n = quit(&q[3]);
				time_to_free_cpu = t + min(q[3].timechip, n.needtime);

				if (q[3].timechip < n.needtime)
				{
					n.needtime -= q[3].timechip;
					enter(n, &q[3]);
				}//在第四轮里面没有处理完,则在第四个队列里面继续
				else
				{
					printf("进程id=%d,需要时间%d,于t=%d时处理完毕\n", n.id, n.time, time_to_free_cpu);
				}
			}
		}
	}

	return 0;
}

double uniform(double a, double b, long int* seed)
{
	double t;
	*seed = 2045 * (*seed) + 1;
	*seed = (*seed) % 1048576;
	t = (*seed) / 1048576.0;
	t = a + (b - a) * t;
	return (t);
}

void qinit(queue* q, int len)
{
	for (int i = 0; i < len; i++)
	{
		q[i].priority = i + 1;
		for (int j = 0; j < 10; j++)
		{
			q[i].queue[j].time = q[i].queue[j].needtime = q[i].queue[j].id = 0;
		}
		q[i].timechip = T * pow(2, i);
	}
}//初始化就绪队列

process quit(queue* q)
{
	process temp;
	for (int i = 9; i >= 0; i--)
	{
		if (q->queue[i].id != 0)
		{
			temp = q->queue[i];
			q->queue[i].time = q->queue[i].needtime = q->queue[i].id = 0;
			return temp;
			break;
		}
	}
}

void enter(process n, queue* q)
{
	for (int i = 9; i > 0; i--)
	{
		q->queue[i] = q->queue[i - 1];
	}
	q->queue[0] = n;
}

int isfull(queue* q)
{
	if (q->queue[9].id != 0)
	{
		return 1;
	}
	return 0;
}

int isempty(queue* q)
{
	if (q->queue[0].id == 0)
	{
		return 1;
	}
	return 0;
}

/*
虽然改进的大部分问题,但仍然存在优先级较低的队列里后进队的进程将之前的进程挤掉的情况发生
*/

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
多级反馈队列算法是一种用于调度进程的算法,它将进程分为多个队列,并根据进程的优先级和执行时间的长度将进程放入不同的队列中。队列越高,进程的优先级越高,执行时间也越短。当一个进程在一个队列中执行了一段时间后,如果还没有完成,它将被移到更低优先级的队列中,以便给更高优先级的进程更多的机会。 以下是一个简单的 C++ 实现多级反馈队列算法代码示例: ```c++ #include <iostream> #include <queue> using namespace std; // 进程结构体 struct Process { int id; // 进程 ID int priority; // 进程优先级 int execution; // 执行时间 }; // 定义多级反馈队列 queue<Process> q1, q2, q3; // 调度函数 void schedule() { // 先处理高优先级队列 q1 if (!q1.empty()) { Process p = q1.front(); q1.pop(); // 执行进程 cout << "Process " << p.id << " is running in q1." << endl; // 如果还未执行完成,则放入下一个队列 q2 if (p.execution > 1) { p.execution--; p.priority++; q2.push(p); } } // 如果 q1 为空,则处理中优先级队列 q2 else if (!q2.empty()) { Process p = q2.front(); q2.pop(); // 执行进程 cout << "Process " << p.id << " is running in q2." << endl; // 如果还未执行完成,则放入下一个队列 q3 if (p.execution > 1) { p.execution--; p.priority++; q3.push(p); } } // 如果 q1 和 q2 都为空,则处理低优先级队列 q3 else if (!q3.empty()) { Process p = q3.front(); q3.pop(); // 执行进程 cout << "Process " << p.id << " is running in q3." << endl; // 如果还未执行完成,则放回队列 q3 if (p.execution > 1) { p.execution--; q3.push(p); } } } int main() { // 将进程放入队列 q1.push({1, 3, 3}); q1.push({2, 1, 4}); q1.push({3, 2, 2}); q1.push({4, 4, 1}); // 调度进程 while (!q1.empty() || !q2.empty() || !q3.empty()) { schedule(); } return 0; } ``` 在这个示例中,我们定义了一个简单的进程结构体,包括进程 ID、优先级和执行时间。我们使用三个队列 q1、q2 和 q3 来模拟多级反馈队列,其中 q1 为高优先级队列,q2 为中优先级队列,q3 为低优先级队列。在调度函数中,我们首先处理 q1 中的进程,如果 q1 中没有进程,则处理 q2 中的进程,如果 q2 中也没有进程,则处理 q3 中的进程。在处理进程时,我们根据进程的优先级和执行时间将其放入不同的队列中,以模拟多级反馈队列算法的调度过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值