多级反馈队列调度算法是目前公认的较好的一种进程调度算法,它能较好的满足各类进程的需要。
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 >