模拟的实现为非抢占式
短作业优先,以为着当在已经到达的进程中,选择所需运行时间最短的先执行。
首先我们需要一个缓冲池(等待队列),在缓冲池中保存已经到达的进程。
将缓冲池中的进程信息根据服务时间进行排序
没选择缓冲池中所需服务时间最短的优先执行
单次进行进程调度
在函数中process为单条进程信息,n为系统分配的时间片长度
//单步执行进程
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 SJF(vector<Process> process)
{
if (process.size() == 0)
return;
vector<Process> q; //创建进程结束信息记录表
EnterTimeSort(process); //根据进入时间排序
process[0]._LineTime = process[0]._EnterTime; //设定时间线起始时间
vector<Process> tmp; //创建缓冲池
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++;
}
if (tmp.size() != 0)
{
ServiceTimeSort(tmp); //将缓冲池中的进程信息根据进程服务时间排序
auto Tbegin = tmp.begin();
TmpOfPrccess(*Tbegin, Tbegin->_RemainSeviceTime); //将服务时间最短的进行单步执行
q.push_back(*Tbegin); //将该进程信息存入结束信息记录表
tmp.erase(tmp.begin()); //从缓冲池中删除该进程信息
}
//当缓冲池中没有进程时,但进程信息表不为空,切时间线时间不满足下一个进程到达,修改时间线时间
if (tmp.size() == 0 && !process.empty() && process[0]._EnterTime > process[0]._LineTime)
{
process[0]._LineTime = process[0]._EnterTime;
}
}
//打印结束表
OutPut(q);
}