操作系统|短作业优先调度算法(short job first, SJF)

模拟的实现为非抢占式

短作业优先,以为着当在已经到达的进程中,选择所需运行时间最短的先执行。
首先我们需要一个缓冲池(等待队列),在缓冲池中保存已经到达的进程。
将缓冲池中的进程信息根据服务时间进行排序
没选择缓冲池中所需服务时间最短的优先执行

单次进行进程调度

在函数中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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值