学无先后,达者为师

网站首页 编程语言 正文

动态演示操作系统进程调度算法,FCFS, RR, SPN, SRT, HRRN

作者:crazybobo1207 更新时间: 2023-10-15 编程语言

之前写了一个静态效果的:C/C++实现操作系统进程调度算法,FCFS, RR, SPN, SRT, HRRN-CSDN博客

这次改成了动态演示,使用了上古神器MFC(微软基础类库)来做界面-_-#

定义一个定时器Timer,然后把之前的代码都放到这个Timer里,每隔0.1秒钟执行。进程数改成10个。

部分代码如下,俺是C和C++混用,比如有时候用#define定义符号常量,没用const定义常量。

//主要代码片段

#define ScheduleFunNum 5	//5个调度算法
#define ProcedureNum 10		//10个进程
#define MaxTime 100			//总共最大时长
#define TimeSlice 4			//RR算法时间片

//代码略

void CCPUScheduleDlg::Init()
{
	// TODO: 在此处添加实现代码.
	
	//kill所有定时器
	for (int i = 0; i < ScheduleFunNum; i++)
	{
		KillTimer(i);
	}

	//初始化方块区域,全部置“空”
	for (int x = 0; x < MaxTime; x++)
	{
		for (int y = 0; y < ProcedureNum; y++)
		{
			square[x][y] = 0;
		}
	}

	//清空进程列表
	procedureList.clear();

	//置初始时间为0
	time = 0;
}


void CCPUScheduleDlg::InitProcedureInfo()
{
	//pid, arriveTime, serviceTime, eclapsedTime, remainTime, accmulateTime
	//进程id,到达时间,服务时间,已服务时间,剩余时间,已用时间片
	CPUProcedure p1(1, 0, 6, 0, 6, 0);
	CPUProcedure p2(2, 2, 2, 0, 2, 0);
	CPUProcedure p3(3, 4, 4, 0, 4, 0);
	CPUProcedure p4(4, 5, 5, 0, 5, 0);
	CPUProcedure p5(5, 8, 12, 0, 12, 0);
	CPUProcedure p6(6, 12, 2, 0, 2, 0);
	CPUProcedure p7(7, 15, 8, 0, 8, 0);
	CPUProcedure p8(8, 18, 2, 0, 2, 0);
	CPUProcedure p9(9, 22, 5, 0, 5, 0);
	CPUProcedure p10(10, 25, 12, 0, 12, 0);

    //代码略
}


void CCPUScheduleDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	if (nIDEvent == 1)  //FCFS
	{
		//某个进程到达,将此进程扔进List
		for (int i = 0; i < ProcedureNum; i++)
		{
			if (time == procedure[i].arriveTime)
			{
				procedureList.push_back(procedure[i]);
			}
		}
		
		//遍历进程List,根据不同的调度算法,判断当前轮到哪个进程执行
		CPUProcedure p;
		if (!procedureList.empty())
		{
			p = procedureList.front();
			procedureList.pop_front();
		
			square[time][p.pid - 1] = 1;  //如果当前时间是0,选择的进程id是1,则将square[0][0]置1
			p.eclapsedTime++;
			p.remainTime--;

			if (p.remainTime != 0)	//如果当前进程未执行完毕,将其放回进程List
			{
				procedureList.push_front(p);
			}
		}

		if (time < MaxTime - 1)
		{
			time++;
		}
		else
		{
			KillTimer(1);
		}

		OnPaint();
		
	}

	else if (nIDEvent == 2) //非抢占SJF
	{

    //以下代码略

动态视频如下,有两个RR算法,其中一个是俺自己造的,和原始的RR算法有点区别。

进程调度动态演示

原文链接:https://blog.csdn.net/crazybobo1207/article/details/133801580

  • 上一篇:没有了
  • 下一篇:没有了
栏目分类
最近更新