模拟实现非抢占式
将进程信息表的信息根据进入时间排序,判断当前时间线下有哪些进程到达,将其插入到等待队列中,等待分配一个时间片,若进程未全部执行结束,将其插入队尾,等待下次分配。
在进行插入队尾前判断当前时间下哪些进程到达,将其依次插入到队尾中
单步执行进程
//单步执行进程
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 RR(vector<Process> process)
{
if (process.size() == 0)
return;
vector<Process> Print;
queue<Process> Queue; //缓冲队
EnterTimeSort(process);
int q = 0; //时间片长度,以分钟为单位
cout << "请输入时间片的长度:";
cin >> q;
process[0]._LineTime = process[0]._EnterTime;
process[0]._BeginTime = process[0]._LineTime;
Queue.push(process[0]);
process.erase(process.begin());
while (Queue.size() != 0)
{
//将队头的进程执行一个时间片
cout<<Queue.front()._name;
TmpOfPrccess(Queue.front(), q);
//查看进程信息中有哪些进程到达,如果到达则存入队中等待执行
if (process.size() != 0)
{
auto begin = process.begin();
while (begin != process.end())
{
if (begin->_EnterTime <= begin->_LineTime)
{
Queue.push(*begin);
begin = process.erase(process.begin());
}
else
{
begin++;
}
}
}
//判断对头元素是否已经执行结束
Process tmp = Queue.front();
Queue.pop(); //出队
if (tmp._RemainSeviceTime != 0)
{
Queue.push(tmp);
}
else
{
Print.push_back(tmp); //保存到信息表中
}
//当调度池中没有进程时,且时间线的时间不足以使下一个进程进入到调度池中,修改时间线
if (process.size() != 0 && Queue.size() == 0 && process[0]._LineTime <= process[0]._EnterTime)
{
process[0]._LineTime = process[0]._EnterTime;
}
}
cout << endl;
OutPut(Print);
}