作业调度算法
Thursday, 25. January 2007, 08:07:28
这是我一年前的操作系统实验之一, 一个单道处理系统的作业等待模拟程序.
当时参考了在 C 语言之家的一篇文章 <<操作系统调度算法实现的又一算法>>.
最近收到几封邮件来问这个, 应该都是大三的该交实验报告了.
可惜我换邮箱了, 今天才看到邮件. 我自己再看了一次, 回忆一下...
全部代码(VC++6.0), 流程图, 运行截图
当时参考了在 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; // 返回当前作业
}

小可 # 25. January 2007, 14:09
介么专业的东东贴出来真是欠捏吧...
mg12 # 25. January 2007, 14:34
偶尔贴一个而已...
准备学你, 开多一个号, 还没想好名字, 呵呵~
倾听寂静 # 26. January 2007, 08:41
vichair # 30. January 2007, 06:03
Tiramisu # 6. March 2007, 10:25
Anonymous # 19. April 2007, 00:25
终于找到你了呵呵,借用一下,谢谢了
Anonymous # 24. April 2007, 12:38
Thank you very much!!!