mg12's Blog

paint my world ...

作业调度算法

这是我一年前的操作系统实验之一, 一个单道处理系统的作业等待模拟程序.
当时参考了在 C 语言之家的一篇文章 <<操作系统调度算法实现的又一算法>>.
最近收到几封邮件来问这个, 应该都是大三的该交实验报告了.
可惜我换邮箱了, 今天才看到邮件. 我自己再看了一次, 回忆一下...

全部代码(VC++6.0), 流程图, 运行截图

设计思路:
1.每个进程有一个作业控制块(JCB)表示。进程控制块包含如下信息:作业号、作业到达时间、作业要求服务时间、 等待时间、 开始运行时间、 结束运行时间、周转时间、带权周转时间、优先权和是否已经完成;
2. 设置一个作业数量num;
3.由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素;
4.分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法对输入进程进行调度;
5.先来先服务(FCFS)对先来的作业优先处理;
6.最短作业优先(SJF)对已就绪作业进行短程序优先服务;
7.响应比=(等待时间+需要服务时间)/需要服务时间,响应比高者优先(HRN)是对已就绪作业进行响应比高者优先服务,以免一些程序长时间不能被执行;
8.对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,以比较各种算法的优缺点。

作业调度算法:
///////////////////////////////////////////////////////////////////////////
// 先到先服务算法
int FCFS()
{
	int current;
	for(int i=0; i<num; i++)
	{
		if(!JCB[i].finish)
		{
			current=i; // 找到第一个还没完成的作业
			break;
		}
	}
	for(int j=i; j<num; j++) // 和后面的作业比较
	{
		if(!JCB[j].finish && JCB[j].arrTime<JCB[current].arrTime)
		{
			current=j; // 找出先来的未完成作业
		}
	}
	return current; // 返回当前作业
}
///////////////////////////////////////////////////////////////////////////
// 短作业优先算法
int SJF(int pre)
{
	int current;
	for(int i=0; i<num; i++)
	{
		if(!JCB[i].finish)
		{
			current=i; // 找到第一个还没完成的作业
			break;
		}
	}
	for(int j=i; j<num; j++) // 和后面的作业比较
	{
		if( !JCB[j].finish) // 还没完成(运行)
		{
			if(JCB[current].arrTime<=JCB[pre].finTime) // 如果作业在上一个作业完成之前到达
			{
				if(JCB[j].arrTime<=JCB[pre].finTime && JCB[j].serTime<JCB[current].serTime )
					current=j; // 找出到达时间在上一个作业完成之前,服务时间比较小的未完成作业
			}
			else // 如果作业是在上一个作业完成之后到达
			{
				if(JCB[j].arrTime<JCB[current].arrTime)
					current=j; // 找出比较早到达的一个
				if(JCB[j].arrTime==JCB[current].arrTime) // 如果同时到达
					if(JCB[j].serTime<JCB[current].serTime)
						current=j; // 找出服务时间比较短的一个
			}
		}
	}
	return current; // 返回当前作业
}
///////////////////////////////////////////////////////////////////////////
// 高响应比优先算法
int HRN(int pre)
{
	int current=1;
	// 优先权 =(等待时间+服务时间)/服务时间
	for(int i=0; i<num; i++)
	{
		JCB[i].waiTime=JCB[pre].finTime-JCB[i].arrTime; // 等待时间 =上一个作业的完成时间-到达时间
		JCB[i].priority=(JCB[i].waiTime+JCB[i].serTime)/JCB[i].serTime;
	}
	for(i=0; i<num; i++)
	{
		if(!JCB[i].finish)
		{
			current=i; // 找到第一个还没完成的作业
			break;
		}
	}
	for(int j=i; j<num; j++) // 和后面的作业比较
	{
		if( !JCB[j].finish) // 还没完成(运行)
		{
			if(JCB[current].arrTime<=JCB[pre].finTime) // 如果作业在上一个作业完成之前到达
			{
				if(JCB[j].arrTime<=JCB[pre].finTime && JCB[j].priority>JCB[current].priority )
					current=j; // 找出到达时间在上一个作业完成之前,优先权高的作业
			}
			else // 如果作业是在上一个作业完成之后到达
			{
				if(JCB[j].arrTime<JCB[current].arrTime)
					current=j; // 找出比较早到达的一个
				if(JCB[j].arrTime==JCB[current].arrTime) // 如果同时到达
					if(JCB[j].priority>JCB[current].priority)
						current=j; // 找出服务时间比较短的一个
			}
		}
	}
	return current; // 返回当前作业
}

放假了, 继续上网.Tango/BuuF for FlashGet 1.81

Comments

小可seven329 Thursday, January 25, 2007 2:09:04 PM

内个.....飘一半儿bia几掉下来了..
介么专业的东东贴出来真是欠捏吧...

mg12 Thursday, January 25, 2007 2:34:52 PM

- -!
偶尔贴一个而已...
准备学你, 开多一个号, 还没想好名字, 呵呵~

倾听寂静evil1213 Friday, January 26, 2007 8:41:39 AM

C++我最头痛了 学不会了

vichair Tuesday, January 30, 2007 6:03:49 AM

VB教程我找了半天都没找到,好在过年了要回家了,回家就有现成人员教我了,哇哈哈

Tiramisuqingshuidanmu Tuesday, March 6, 2007 10:25:18 AM

作业调度算法我也实现过。嘿嘿。看来是同行啦。那我借你模板用下啦~~

Anonymous Thursday, April 19, 2007 12:25:24 AM

JING writes: 终于找到你了呵呵,借用一下,谢谢了

Anonymous Tuesday, April 24, 2007 12:38:17 PM

Anonymous writes: Thank you very much!!!

How to use Quote function:

  1. Select some text
  2. Click on the Quote link

Write a comment

Comment
(BBcode and HTML is turned off for anonymous user comments.)

If you can't read the words, press the small reload icon.


Smilies