模拟实现的为非抢占式
首先,根据时间线的时间判断进程时间是否到达,如果进程时间到达,将进程存入缓冲池中,在每次执行前先计算出缓冲池中的进程响应比,得到响应比最高的进程信息,单步执行该进程
单步执行进程信息
//单步执行进程
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);
}