操作系统|高响应比优先算法(HRRN)

模拟实现的为非抢占式

首先,根据时间线的时间判断进程时间是否到达,如果进程时间到达,将进程存入缓冲池中,在每次执行前先计算出缓冲池中的进程响应比,得到响应比最高的进程信息,单步执行该进程

进程对象的创建

单步执行进程信息

//单步执行进程
void TmpOfPrccess(Process& process, int n)
{
	//如果服务时间等于剩余服务时间,则证明该进程第一次被调度
	if (process._ServiceTime == process._RemainSeviceTime)
	{
		//设定开始时间
		process._BeginTime = process._LineTime;
	}
	//如果剩余服务时间大于等于一个时间片的时间
	if (process._RemainSeviceTime >= n)
	{
		//剩余时间减少一个时间片的时间
		process._RemainSeviceTime -= n;
		//时间线向后移动一个时间片
		process._LineTime += n;
	}
	else  //如果剩余时间小于一个时间时间片的时间
	{
		//时间线向后移动一个该进程的剩余时间
		process._LineTime += process._RemainSeviceTime;
		process._RemainSeviceTime = 0;  //将剩余时间置为0
	}
	if (process._RemainSeviceTime == 0)  //如果剩余时间为0,则证明该进程结束调度
	{
		process._FinishTime = process._LineTime;  // 设定结束时间,计算周转时间,带权周转时间
		process._rTime = process._FinishTime - process._EnterTime;
		process._PowerTime = (double)process._rTime / process._ServiceTime;
	}
}

计算高响应比

//根据响应比排序
void FirstSort(vector<Process>& process)
{
	if (process.size() == 0)
		return;
	for (int i = 0; i < process.size() - 1; i++)
	{
		for (int j = 0; j < process.size() - i - 1; j++)
		{
			if (process[j]._First < process[j + 1]._First)
				Swap(process[j], process[j + 1]);
		}
	}
}

根据响应比大小排序

//根据响应比排序
void FirstSort(vector<Process>& process)
{
	if (process.size() == 0)
		return;
	for (int i = 0; i < process.size() - 1; i++)
	{
		for (int j = 0; j < process.size() - i - 1; j++)
		{
			if (process[j]._First < process[j + 1]._First)
				Swap(process[j], process[j + 1]);
		}
	}
}

高响应比优先算法(HRRN)

/高响应比优先
void HRRN(vector<Process> process)
{
	if (process.size() == 0)
		return;
	EnterTimeSort(process);
	vector<Process> q;   //结束信息表
	vector<Process> tmp;  //缓冲池
	process[0]._LineTime = process[0]._EnterTime;  //设置时间线起始时间
	while (!process.empty() || !tmp.empty())   //都不为空
	{
		auto begin = process.begin();
		while (begin != process.end())  //判断当前时间下有些进程到达
		{
			if (begin->_EnterTime <= begin->_LineTime)
			{ 
				tmp.push_back(*begin);   //进程到达放入缓冲池中
				begin = process.erase(process.begin());
			}
			else
				begin++;
		}
		//计算响应比
		CalculateFirst(tmp);
		//根据响应比排序
		FirstSort(tmp);
		if (tmp.size() != 0)
		{
			auto begin = tmp.begin();
			//单步执行进程
			TmpOfPrccess(*begin, begin->_ServiceTime);
			q.push_back(*begin);
			tmp.erase(tmp.begin());
		}
		//当调度池中没有进程时,且时间线的时间不足以使下一个进程进入到调度池中,修改时间线
		if (!process.empty() && tmp.size() == 0 && process[0]._LineTime < process[0]._EnterTime)
		{
			process[0]._LineTime = process[0]._EnterTime;
		}
	}
	OutPut(q);
}


版权声明:本文为weixin_44030298原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。