日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

C/C++實(shí)現(xiàn)操作系統(tǒng)進(jìn)程調(diào)度算法,F(xiàn)CFS, RR, SPN, SRT, HRRN

作者:crazybobo1207 更新時(shí)間: 2023-10-14 編程語(yǔ)言

程序?qū)崿F(xiàn)了5種進(jìn)程調(diào)度算法,分別是:FCFS、RR(分別令時(shí)間片等于1、4)、SPN、SRT、HRRN。

其中,SPN、SRT、HRRN這三種調(diào)度算法,需要對(duì)進(jìn)程列表里的進(jìn)程進(jìn)行排序,排序之后,再選擇列表里的第一個(gè)進(jìn)程執(zhí)行。不同的調(diào)度算法,sort方法的排序規(guī)則不同,可以在重載<運(yùn)算符時(shí),指定這些排序規(guī)則。

本程序的優(yōu)點(diǎn)在于,一旦實(shí)現(xiàn)了其中一個(gè)調(diào)度算法,比如實(shí)現(xiàn)了最基本的FCFS之后,只要增加一個(gè)排序邏輯,即在重載<運(yùn)算符時(shí),增加新的排序規(guī)則(一個(gè)case分支),立馬可以實(shí)現(xiàn)一種新的調(diào)度算法。

進(jìn)程信息定義在方法InitProcedureInfo中,包括:procedureID(進(jìn)程ID), arriveTime(進(jìn)程到達(dá)時(shí)間), serviceTime(服務(wù)時(shí)間), eclapsedTime(已服務(wù)時(shí)間), remainTime(剩余服務(wù)時(shí)間), accumulateTime(累計(jì)服務(wù)時(shí)間)。

#include <list>
#include <iostream>
using namespace std;

#define PROCEDURENUM 5	
#define MAXTIME 30		

enum scheduleFun { FCFS, RR, SPN, SRT, HRRN };

int currentTime = 0;
int timeSlice = 4;
int scheduleFun;

class Procedure
{
public:
	int procedureID;
	int arriveTime;
	int serviceTime;
	int eclapsedTime;
	int remainTime;
	int accumulateTime;

public:
	Procedure(int _procedureID = 0, int _arriveTime = 0, int _serviceTime = 0, int _eclapsedTime = 0, int _remainTime = 0, int _accumulateTime = 0)
	{
		procedureID = _procedureID;
		arriveTime = _arriveTime;
		serviceTime = _serviceTime;
		eclapsedTime = _eclapsedTime;
		remainTime = _remainTime;
		accumulateTime = _accumulateTime;
	}

	bool operator<(const Procedure& p)
	{
		switch (scheduleFun)
		{
		case SPN:	//SPN:最短進(jìn)程優(yōu)先(最短作業(yè)優(yōu)先,非搶占式)
			return this->remainTime - 9999 * this->eclapsedTime < p.remainTime - 9999 * p.eclapsedTime;

		case SRT:	//SRT:最短剩余時(shí)間優(yōu)先(最短作業(yè)優(yōu)先,搶占式)
			return this->remainTime < p.remainTime;  //升序排序
			break;

		case HRRN:	//HRRN:最高響應(yīng)比優(yōu)先,R = (w + s) / s = 1 + w / s,其中R表示響應(yīng)比,w表示已經(jīng)等待的時(shí)間,s表示期待服務(wù)的時(shí)間(降序排序)
			return 1 + (currentTime - this->arriveTime) / this->serviceTime > 1 + (currentTime - p.arriveTime) / p.serviceTime;
			break;
		}
	}
};

Procedure procedure[PROCEDURENUM];
list<Procedure> procedureList;
int scheduleResult[PROCEDURENUM][MAXTIME];
Procedure departProcedure;
bool departProcedureExsit = false;

void InitProcedureInfo();			//初始化進(jìn)程信息、進(jìn)程調(diào)度結(jié)果、當(dāng)前時(shí)間
void PutArriveProcedureIntoList();	//某個(gè)進(jìn)程到達(dá),將此進(jìn)程扔進(jìn)List
void FindProcedure();				//遍歷進(jìn)程List,判斷當(dāng)前執(zhí)行哪個(gè)進(jìn)程,直接取List中的第一個(gè)進(jìn)程(因?yàn)檫M(jìn)程List已按要求排序)
void PrintScheduleResult();			//輸出進(jìn)程調(diào)度結(jié)果
void ProcedureSchedule();			//進(jìn)程調(diào)度算法

int main()
{
	scheduleFun = FCFS;
	ProcedureSchedule();

	scheduleFun = RR;
	timeSlice = 1;
	ProcedureSchedule();

	scheduleFun = RR;
	timeSlice = 4;
	ProcedureSchedule();

	scheduleFun = SPN;
	ProcedureSchedule();

	scheduleFun = SRT;
	ProcedureSchedule();

	scheduleFun = HRRN;
	ProcedureSchedule();

	return 0;
}

//初始化:進(jìn)程信息、進(jìn)程調(diào)度結(jié)果、當(dāng)前時(shí)間
void InitProcedureInfo()
{
	//procedureID, arriveTime, serviceTime, eclapsedTime, remainTime, accumulateTime
	Procedure p1(1, 0, 3, 0, 3, 0);
	Procedure p2(2, 2, 6, 0, 6, 0);
	Procedure p3(3, 4, 4, 0, 4, 0);
	Procedure p4(4, 6, 5, 0, 5, 0);
	Procedure p5(5, 8, 2, 0, 2, 0);
	procedure[0] = p1;
	procedure[1] = p2;
	procedure[2] = p3;
	procedure[3] = p4;
	procedure[4] = p5;

	for (int i = 0; i < PROCEDURENUM; i++)
	{
		for (int j = 0; j < MAXTIME; j++)
		{
			scheduleResult[i][j] = 0;
		}
	}

	currentTime = 0;
}

//輸出進(jìn)程調(diào)度結(jié)果
void PrintScheduleResult()
{
	for (int i = 0; i < PROCEDURENUM; i++)
	{
		for (int j = 0; j < MAXTIME; j++)
		{
			if (scheduleResult[i][j] == 1)
			{
				cout << "■";
			}
			else
			{
				cout << "  ";
			}
		}
		cout << endl;
	}
}

//某個(gè)進(jìn)程到達(dá),將此進(jìn)程扔進(jìn)List
void PutArriveProcedureIntoList()
{
	for (int i = 0; i < PROCEDURENUM; i++)
	{
		if (procedure[i].arriveTime == currentTime)
		{
			procedureList.push_back(procedure[i]);
		}
	}
	if (departProcedureExsit == true)
	{
		procedureList.push_back(departProcedure);
		departProcedureExsit = false;
	}
}

//遍歷進(jìn)程List,判斷當(dāng)前執(zhí)行哪個(gè)進(jìn)程,直接取List中的第一個(gè)進(jìn)程(因?yàn)檫M(jìn)程List已按要求排序)
void FindProcedure()
{
	Procedure p;

	if (!procedureList.empty())
	{
		p = procedureList.front();
		procedureList.pop_front();

		if (scheduleFun == FCFS || scheduleFun == SPN || scheduleFun == SRT || scheduleFun == HRRN)
		{
			p.eclapsedTime++;
			p.remainTime--;
			scheduleResult[p.procedureID - 1][currentTime] = 1;

			if (p.remainTime != 0)	//如果當(dāng)前進(jìn)程未執(zhí)行完畢,將其放回List最前面
			{
				procedureList.push_front(p);
			}
		}

		if (scheduleFun == RR)
		{
			if (p.remainTime > 0 && p.accumulateTime < timeSlice)
			{
				scheduleResult[p.procedureID - 1][currentTime] = 1;
				p.eclapsedTime++;
				p.remainTime--;
				p.accumulateTime++;

				if (p.remainTime > 0 && p.accumulateTime < timeSlice)
				{
					procedureList.push_front(p);
				}
				else if (p.remainTime > 0 && p.accumulateTime == timeSlice)
				{
					int flag = 0;

					for (int i = 0; i < PROCEDURENUM; i++)
					{
						if (currentTime == procedure[i].arriveTime - 1)
						{
							flag = 1;
						}
					}

					if (flag == 0)
					{
						p.accumulateTime = 0;
						procedureList.push_back(p);
					}
					else
					{
						p.accumulateTime = 0;
						departProcedure = p;
						departProcedureExsit = true;
					}
				}
			}
		}
	}
}

void ProcedureSchedule()
{
	switch (scheduleFun)
	{
	case FCFS:
		cout << "FCFS算法" << endl << endl;
		break;
	case RR:
		cout << "RR算法 q=" << timeSlice << endl << endl;
		break;
	case SPN:
		cout << "SPN算法" << endl << endl;
		break;
	case SRT:
		cout << "SRT算法" << endl << endl;
		break;
	case HRRN:
		cout << "HRRN算法" << endl << endl;
		break;
	}

	InitProcedureInfo();

	while (currentTime < MAXTIME)
	{
		PutArriveProcedureIntoList();

		if (scheduleFun == SPN || scheduleFun == SRT || scheduleFun == HRRN)
		{
			if (!procedureList.empty())
			{
				procedureList.sort();
			}
		}

		FindProcedure();
		currentTime++;
	}

	PrintScheduleResult();
}

運(yùn)行結(jié)果如下,一次性顯示結(jié)果,下次做個(gè)能動(dòng)態(tài)顯示中間過(guò)程的。

原文鏈接:https://blog.csdn.net/crazybobo1207/article/details/133500418

  • 上一篇:沒(méi)有了
  • 下一篇:沒(méi)有了
欄目分類(lèi)
最近更新