操作系统实验1——动态优先数调度算法

今天主要是记录操作系统这门课程的实验,实现动态优先数调度算法。

动态优先数调度算法,简单的说就是根据进程的优先级进行调度,优先级高的就先运行,优先级低的就后运行,主要实现思路如下:
在这里插入图片描述
具体步骤为:

  1. 定义进程控制块类:
//进程PCB类定义
class PCB
{
public:
	int ID;			//进程ID
	int runtime;		//进程已运行时间
	int lasttime;			//进程所需的剩余运行时间
	int alltime;			//进程的总运行时间
	int waittime = 1;		//进程等待时间
	int priority;    //进程优先级
	State state;			//进程所处状态
};
  1. 分别实例化五个进程对象,使用容器vector存储:
	vector<PCB>process;
	for (int i = 0; i < 5; i++)
	{
		PCB pcb;
		process.push_back(pcb);
	}
	process[0].ID = 0;
	process[0].runtime = 0;
	process[0].lasttime = 30;
	process[0].alltime = process[0].runtime + process[0].lasttime;
	process[0].priority = 5;
	process[0].state = wait;

	process[1].ID = 1;
	process[1].runtime = 0;
	process[1].lasttime = 20;
	process[1].alltime = process[1].runtime + process[1].lasttime;
	process[1].priority = 3;
	process[1].state = wait;

	process[2].ID = 2;
	process[2].runtime = 0;
	process[2].lasttime = 10;
	process[2].alltime = process[2].runtime + process[2].lasttime;
	process[2].priority = 6;
	process[2].state = wait;

	process[3].ID = 3;
	process[3].runtime = 0;
	process[3].lasttime = 40;
	process[3].alltime = process[3].runtime + process[3].lasttime;
	process[3].priority = 9;
	process[3].state = wait;

	process[4].ID = 4;
	process[4].runtime = 0;
	process[4].lasttime = 50;
	process[4].alltime = process[4].runtime + process[4].lasttime;
	process[4].priority = 15;
	process[4].state = wait;
  1. 运行调度算法
    对每个进程赋予不同参数,表示对进程的初始化。通过while循环不断进行进程调度,直到所有进程都为finish结束状态。
    当某个进程的处于wait就绪状态,同时优先数最高,则运行该进程,同时将该进程的优先数减三,而其它处于wait状态的进程优先数加一。
    当当前运行进程的剩余运行时间为0时,表明该进程已经运行完毕,则将其运行状态置为finish。
    打印本次调度循环的运行信息后,进入下一次调度循环,直至所有进程都运行完毕。
    当所有进程都处于finish状态时,结束循环,调度算法结束。
    具体代码如下:
	int timeslice = 0;                    //运行消耗的时间片
	int flag = 0;			//已经运行完毕的进程数
	while (process[0].lasttime || process[1].lasttime || process[2].lasttime || process[3].lasttime || process[4].lasttime)
	{
		float responses[5];
		for (int i = 0; i < 5; i++)
		{
			//
			int process_priority[] = { process[0].priority,process[1].priority,process[2].priority,process[3].priority,process[4].priority };
			for (int k = 0; k < 5; k++)
			{
				if (process[k].state == finish)
				{
					process_priority[k] = -pow(2,31);
				}
			}
			//如果某进程处于就绪状态,且其响应比是所有就绪进程中最高的,则运行该进程
			if ((process[i].state == wait) && (process[i].priority == *max_element(process_priority, process_priority + 5)))
			{
				process[i].state = run;
				cout << "进程" << process[i].ID << "开始运行" << endl;
				//将该进程的运行时间加1、剩余运行时间减1
				process[i].runtime += 1;
				process[i].lasttime -= 1;
				process[i].priority -= 3;
				//将其他就绪进程的等待时间加1
				for (int j = 0; j < 5; j++)
				{
					if (i == j || process[j].state == finish)
					{
						continue;
					}
					process[j].waittime += 1;
					process[j].priority += 1;
				}
				//如果该进程的剩余运行时间为0,则将该进程状态置为finish,同时flag+1
				if (0 == process[i].lasttime)
				{
					process[i].state = finish;
					flag++;
				}
				//如果该进程的剩余运行时间不为0,则将该进程状态置为wait
				else
				{
					process[i].state = wait;
				}
				//打印进程信息
				cout << "进程" << process[i].ID << "结束运行" << endl;
				printMessage();
			}
		}
		timeslice++;
		if (5 == flag)
		{
			cout << "所有进程运行结束," << "消耗运行时间片:" << timeslice << endl;
			break;
		}
	}

其中每次执行完调度都使用printMessage()打印一次当前进程信息,该函数如下:

void printMessage()
{
	cout << "等待队列:";
	for (int j = 0; j < 5; j++) {
		if (process[j].state == wait)
		{
			cout << "	" << process[j].ID;
		}
	}
	cout << endl;
	cout << "运行完毕队列:";
	for (int j = 0; j < 5; j++) {
		if (process[j].state == finish)
		{
			cout << "	" << process[j].ID;
		}
	}
	cout << endl;
	cout << "ID\talltime\truntime\tlasttime\tpriority\twaittime\tstate" << endl;
	for (int j = 0; j < 5; j++) {
		cout << process[j].ID << '\t' << process[j].alltime << '\t' << process[j].runtime << '\t' << process[j].lasttime << '\t' << '\t' << process[j].priority << '\t' << '\t' << process[j].waittime << '\t' << '\t' << process[j].state << endl;
	}
	cout << "--------------------------------------------------------" << endl;
}

下面是实现效果:
在这里插入图片描述

在这里插入图片描述

至此使用C++语言实现动态优先数调度算法。
该算法对于紧急进程比较友好,因为优先数高而能够得到提前运行、快速相应,但是对于低优先数的进程而言是十分不友好的,当系统进程数多时,可能低优先数会被安排到系统低负荷情况再进行运行,甚至可能一直没有得到运行。所以单纯的动态数优先算法并不适用于实际情况。

猜你喜欢

转载自blog.csdn.net/weixin_45224869/article/details/105908291