作业调度算法模拟
一、课题内容和要求
常见的作业调度算法有先来先服务算法、最短作业优先算法、响应比优先调度算法。
(1) 参考操作系统教材理解这3种算法。
(2) 实现这3个算法。
(3) 已知若干作业的到达时间和服务时间,用实现的算法计算对该组作业进行调度的平均周转时间Ttime和平均带权周转时间WTtime。
(4) 作业的到达时间和服务时间可以存放在文本文件record.txt中。
(5) 设计简单的交互界面,演示所设计的功能。(可以使用MFC进行界面的设计)
(6)可根据自己能力,在完成以上基本要求后,对程序功能进行适当扩充。
二、需求分析
模拟实现作业调度算法,包括:FCFS(先来先服务算法)、SJF(短作业优先算法)、HRN(最高响应比优先算法)、HPF(基于优先数调度算法)。
先来先服务算法:按照各个作业进入系统(输入井)的自然次序来调度算法。
短作业优先算法:优先调度并处理短作业。所谓的“短作业”并不是指物理作业 长度短,而是指作业的运行时间短。
最高响应比优先算法:优先调度并处理响应比最高的作业。
三、概要设计
函数中一些类:
主要功能函数的流程图
2、先来先服务:
3、最短作业优先:
4、最高响应比:
四、详细设计
1、程序代码
MFC头文件a.h内容:
const int defMaxJobNumber = 10; //作业数量的最大值
class Time //时间类
{
public:
int hour;
int minute;
};
class Job //作业类
{
public:
int ID; //作业编号
Time enter; //进入时间
int requesttime; //估计运行时间
int priority; //优先数
Time start; //开始时间
Time end; //结束时间
int Ttime; //周转时间
double WTtime; //带权周转时间
};
class schedule //调度类
{
public:
int size; //作业数
Job *job; //作业数组
int *r; //排序用数组
int Differ(Time t1,Time t2) //求两个时刻间的时间差t2-t1
{
int borrow = (t2.minute
return ((t2.hour-t1.hour-borrow)*60+(borrow*60+t2.minute-t1.minute));
}
public:
schedule() //构造函数
{
size = 0;
job = new Job[defMaxJobNumber];
r = new int[defMaxJobNumber-1];
}
void readFile() //从文件读信息
{
ifstream txtfile;
txtfile.open("record.txt");
int i = 0;
int entertime;
while(!txtfile.eof())
{
txtfile>>job[i].ID>>entertime>>job[i].requesttime>>job[i].priority;
job[i].enter.hour = entertime / 100; //取小时
job[i].enter.minute = entertime % 100; //取分钟
i++;
size++;
}
txtfile.close();
}
void FCFS() //先来先服务(First Come First Serve)
{
int hour,minute,carry;
job[0].start = job[0].enter;
hour = job[0].requesttime / 60;
minute = job[0].requesttime % 60;
job[0].end.minute = (job[0].start.minute + minute) % 60;
carry = (job[0].start.minute + minute) / 60; //carry是分钟累积超过60商
job[0].end.hour = job[0].start.hour + hour + carry;
job[0].Ttime = job[0].requesttime;
job[0].WTtime = ((double)job[0].Ttime) / job[0].requesttime;
for(int i=1;i
{
job[i].start = job[i-1].end;
hour = job[i].requesttime / 60;
minute = job[i].requesttime % 60;
job[i].end.minute = (job[i].start.minute + minute) % 60;
carry = (job[i].start.minute + minute) / 60;
job[i].end.hour = job[i].start.hour + hour + carry;
job[i].Ttime = Differ(job[i].enter,job[i].end); //周转时间
job[i].WTtime = ((double)job[i].Ttime) / job[i].requesttime; //带权周转时间
}
}
void SJF() //短作业优先(Shortest Job First)
{
int hour,minute,carry;
job[0].start = job[0].enter;
hour = job[0].requesttime / 60;
minute = job[0].requesttime % 60;
job[0].end.minute = (job[0].start.minute + minute) % 60;
carry = (job[0].start.minute + minute) / 60; //carry是分钟累积超过60的商
job[0].end.hour = job[0].start.hour + hour + carry;
job[0].Ttime = job[0].requesttime; //周转时间
job[0].WTtime = ((double)job[0].Ttime) / job[0].requesttime; //带权周转时间
for(int i=1;i
r[i] = i;
for(i=1;i
{
int index = i;
for(int j=i+1;j
if(job[r[j]].requesttime
index = j;
if(index!=i)
{
int w = r[i];
r[i] = r[index];
r[index] = w;
}
}
int dest=0;
for(i=1;i
{
int index = r[i];
job[index].start = job[dest].end;
hour = job[index].requesttime / 60;
minute = job[index].requesttime % 60;
job[index].end.minute = (job[index].start.minute + minute) % 60;
carry = (job[index].start.minute + minute) / 60;
job[index].end.hour = job[index].start.hour + hour + carry;
job[index].Ttime = Differ(job[index].enter,job[index].end);
job[index].WTtime = ((double)job[index].Ttime) / job[index].requesttime;
dest = index;
}
}
void HRN() //最高响应比优先(Highest Response_ratio Next)
{
int hour,minute,carry;
job[0].start = job[0].enter;
hour = job[0].requesttime / 60;
minute = job[0].requesttime % 60;
job[0].end.minute = (job[0].start.minute + minute) % 60;
carry = (job[0].start.minute + minute) / 60; //carry是分钟累积超过60的商
job[0].end.hour = job[0].start.hour + hour + carry;
job[0].Ttime = job[0].requesttime; //周转时间
job[0].WTtime = ((double)job[0].Ttime) / job[0].requesttime; 带权周转时间
int dest=0;
for(int i=1;i
r[i] = i;
for(i=1;i
{
int index = i;
for(int j=i+1;j
if(((double)Differ(job[r[j]].enter,job[dest].end))/job[r[j]].requesttime>
((double)Differ(job[r[index]].enter,job[dest].end))/job[r[index]].requesttime) //响应比=作业周转时间/作业处理时间
index = j;
if(index!=i)
{
int w = r[i];
r[i] = r[index];
r[index] = w;
}
//按排序后的作业序继续执行
index = r[i];
job[index].start = job[dest].end;
hour = job[index].requesttime / 60;
minute = job[index].requesttime % 60;
job[index].end.minute = (job[index].start.minute + minute) % 60;
carry = (job[index].start.minute + minute) / 60;
job[index].end.hour = job[index].start.hour + hour + carry;
job[index].Ttime = Differ(job[index].enter,job[index].end);
job[index].WTtime = ((double)job[index].Ttime) / job[index].requesttime;
dest = index;
}
}
};
五、测试数据及其结果分析
从文本文件中读取数据(书上的例子):
1 800 120 2
2 850 50 3
3 900 10 1
4 950 20 4
输出的平均周转时间、平均带权周转时间结果正确。
六、调试过程中的问题
调试过程中,对于MFC里面许多函数不熟悉,所以经常编译失败,我通过老师的帮助以及上网查询解决方法来不断修改错误,完善代码。这个程序没有考虑一些特殊情况,如:若有作业5的到达时间为11:10,执行时间是5分钟,则是否先于其它作业调入内存执行。
七、参考文献和查阅的资料
(1)黄刚、徐小龙、段卫华 《操作系统教程》 人民邮电出版社
(2)陈向群、杨芙清 《操作系统教程》 北京大学出版社
(3)沈显君、杨进才、张勇 《C++语言程序设计教程》 清华大学出版社
八、程序设计总结
1、首先要学会打开一个MFC文件,打开VC环境左上角“文件”-->“打开工作空间”,搜寻文件夹里面的.daw文件,直接打开就行。
2、在以往的程序设计实验中我一直都只能局限于DOS界面,这次在老师的帮助下我终于摆脱了编程的黑框框,进入了图形界面设计,对与我来是这是我编程领域的一个新的开始,对MFC简单操作的了解是我这次实验最大的收获。
3、进一步加深了对作业调度的理解,基本掌握了批处理作业调度算法的核心思想。同时,加强了自己的算法设计能力和编码能力。
作业调度120xx1504一实验目的1对作业调度的相关内容作进一步的理解2明白作业调度的主要任务3通过编程掌握作业调度的主要算法二…
南通大学计算机科学与技术学院操作系统作业调度实验报告班级计091姓名学号指导教师戴树贵一任务实现作业调度的三个算法a先来先服务算法…
实验报告作业调度计算机科学与技术04级一班022号剪晓光20xx1261实验二作业调度本组成员剪晓光王鹏张文艺余忠福一实验目的1理…
班姓名学号教师评定实验题目作业调度一实验目的本实验要求学生模拟作业调度的实现用高级语言编写和调试一个或多个作业调度的模拟程序了解作…
实验报告课程名称实验名称班学姓级号名指导教师基础实验一时间表调度实验1实验目的驱动交换网络实验用来考查学生对时间表调度原理的掌握情…
实验报告课程名称实验名称班学姓级号名指导教师基础实验一时间表调度实验1实验目的驱动交换网络实验用来考查学生对时间表调度原理的掌握情…
操作系统实验题设计一若干并发进程的进程调度程序一实验目的无论是批处理系统分时系统还是实时系统用户进程数一般都大于处理机数这将导致用…
沈阳理工大学课程设计任务书1沈阳理工大学目录1课程设计目的32课程设计要求33相关知识34需求分析45概要设计56详细设计67测试…