操作系统|时间片轮转调度算法(RR)

模拟实现非抢占式

将进程信息表的信息根据进入时间排序,判断当前时间线下有哪些进程到达,将其插入到等待队列中,等待分配一个时间片,若进程未全部执行结束,将其插入队尾,等待下次分配。
在进行插入队尾前判断当前时间下哪些进程到达,将其依次插入到队尾中

单步执行进程

//单步执行进程
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);
}
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值