进程调度的实现-多级反馈队列调度算法的设计与研究

本文探讨了多级反馈队列调度算法(MFQ),该算法通过设置多个优先级递减的就绪队列,结合FCFS和时间片轮转策略,以适应各种进程需求。在算法实现中,当高优先级进程到达时,若已有进程在执行,会等待当前进程时间片结束后再切换。文章包括算法流程图、程序代码和不同时间片大小的运行结果分析。
摘要由CSDN通过智能技术生成

多级反馈队列调度算法是目前公认的较好的一种进程调度算法,它能较好的满足各类进程的需要。
1、多级反馈队列调度算法(MFQ)的基本思想
MFQ算法首先设置多个就绪队列。队列的优先级递减,且各队列时间片大小也不同。例如我实现的算法里,设置了3个队列,第一队列优先级>第二队列>第三队列,且后一个队列的时间片大小是前一个的2倍。

每个队列都采用FCFS策略排列。首先调度高优先级队列内的进程,如果此进程在时间片内不能运行完,则将它加入下一个队列。这样到了最后一个队列,就成了RR算法。

如果有高优先级的进程到达,则放弃正在调度的进程,转向调度最高优先级的进程。这里我的实现不是很完美,我的算法里当高优先级进程到达时,如果有进程正在运行,则需要等到这个进程时间片结束才能转到高优先级进程

2、算法实现流程图
算法实现流程图

3、程序

#include <iostream>
#include <algorithm>
#include <iomanip>
#include <queue>
#include <vector>
using namespace std;

//声明部分

bool chooserand;

//作业结构体
typedef struct PCW
{
   
	int Numbers;					//进程个数
	int ID;							//进程号
	int ComeTime;					//到达时间
	int ServerTime;					//服务时间
	int FinishTime;					//完成时间
	int TurnoverTime;				//周转时间
	double WeightedTurnoverTime;	//带权周转时间
}PCW;

/*
函数功能:输入作业信息
参数说明:
PCWList		 vector<PCW>&		PCW链
timeslice	int						第一队列时间片
*/
void InputPCW(vector<PCW>& PCWList, int timeslice, int num1, int num2);

/*
函数功能:MFQ算法
参数说明:
PCWList		 vector<PCW>&		PCW链
timeslice	int						第一队列时间片
*/
void MFQ(vector<PCW>& PCWList, int timeslice);

/*
函数功能:显示结果
参数说明:
PCWList		 vector<PCW>&		PCW链
*/
void show(vector<PCW>& PCWList);

/*
函数功能:比较函数,用于sort(),按ComeTime升序排列
参数说明:
p1			const PCW&				PCW
p2			const PCW&				PCW
*/
bool CmpByComeTime(const PCW& p1, const PCW& p2);







//主函数部分

int main()
{
   
	//随机函数
	srand(time(NULL));
	
	int chooseContinue;

	do {
   
		cout << "输入0随机继续测试\n";
		cout << "输入1继续手动输入测试\n";
		cin >> chooserand;

		int num1 = rand() % 100 + 1;
		int num2 = rand() % 30;



		vector<PCW> PCWList;
		int timeslice = 1;

		cout << num1 << " " << num2 << endl;

		//输入时间片大小,作业信息
		InputPCW(PCWList, timeslice, num1, num2);

		//进行MFQ算法运算
		MFQ(PCWList, timeslice);

		//显示结果
		show(PCWList);
		cout << "输入0退出程序\n";
		cout << "输入1继续测试\n";
		cin >> chooseContinue;
	} while (chooseContinue == 1);
}




//函数部分



//输入作业信息
void InputPCW(vector<PCW>& PCWList, int timeslice, int num1, int num2)
{
   
	int Numbers;					//进程个数
	int sequence = 0;					//进程标识(用于计算循环次数

	cout << "输入第一队列时间片大小: ";
	cin >
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值