操作系统作业调度实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二作业调度
一、实验名称
作业调度算法的模拟实现
二、实验目标
作业调度又称宏观调度,其主要任务是对磁盘设备上大量的后备作业,以一定的原则进行挑选,给选中的作业分配内存等必须的资源,建立其相应的进程,让其投入运行。本实验要求学生用高级程序设计语言编写和调试一个简化的作业调度程序,模拟实现的调度算法包括:先来先服务调度算法,短作业优先调度算法,响应比高者优先调度算法等,并对这些算法的性能做比较和评价。以加深学生对作业、作业调度以及作业调度的各种算法的理解。
三、实验环境要求
Windows+Visual C++ 6.0;
四、实验基本原理
作业调度主要是完成作业从后备状态到执行状态的转变,以及从执行状态到完成状态的转变。
(1)创建JCB(作业控制块):系统在作业进入后备状态时为每个作业创建一个作业控制块(JCB),从而使该作业可被调度程序感知。当该作业执行完毕进入完成状态时候,系统自动撤销其JCB并释放有关资源,进而撤销该作业。
(2)按照作业调度算法,从后备队列中挑选一作业投入运行。作业调度程序为运行作业建立相应的进程,并分配资源。
(3)主要的作业调度算法包括:先来先服务(FCFS)、短作业优先和最高响应比。
(4)调度策略的指标:最常用的调度性能指标有,周转时间(带权)、吞吐率、响应时间以及设备利用率。
五、数据结构设计
(1)作业控制块,包括作业的基本信息描述。
struct time //时间的数据结构
{
int hour;
int minute;
};
struct Job //作业
{
string jobname; //作业名
time intime; //进入时间
int runtime; //作业估计运行时间
time starttime; //作业开始时间
time endtime; //作业结束时间
int cycletime; //作业周转时间
float cltime; //作业带权周转时间
bool haverun; //是否已运行
};
六、流程图
图1 作业调度算法流程图七、源代码
#include
#include
using namespace std;
struct time //时间的数据结构
{
int hour;
int minute;
};
struct Job //作业
{
string jobname; //作业名
time intime; //进入时间
int runtime; //作业估计运行时间
time starttime; //作业开始时间
time endtime; //作业结束时间
int cycletime; //作业周转时间
float cltime; //作业带权周转时间
bool haverun; //是否已运行
};
float T=0;//作业平均周转时间
float W=0;//作业带权平均周转时间
void showInput(Job job[],int &n) //输入提示
{
cout<<"**********请按作业进入时间先后顺序输入*********"< for(int i=0;i { cout<<"作业"< cout<<"作业名:"; cin>>job[i].jobname; cout<<"作业进入时间:"; scanf("%d:%d",&job[i].intime.hour,&job[i].intime.minute); cout<<"作业估计运行时间:"; cin>>job[i].runtime; job[i].starttime.hour=0; job[i].starttime.minute=0; job[i].endtime.hour=0; job[i].endtime.minute=0; job[i].cycletime=0; job[i].cltime=0; job[i].haverun=false; //标记为未运行 cout<<"*********************"< } } void Init(Job job[],int &n)//初始化 { for(int i=0;i { job[i].starttime.hour=0; job[i].starttime.minute=0; job[i].endtime.hour=0; job[i].endtime.minute=0; job[i].cycletime=0; job[i].cltime=0; job[i].haverun=false; //标记为未运行 } T=0; W=0; } void showTime(time time) //显示时间 { cout< } int timeDiff(time t1,time t2) //计算时间差,时间t1比t2大 { return t1.hour*60+t1.minute-(t2.hour*60+t2.minute); } time timeAdd(time time,int addtime) //时间相加 { time.hour+=addtime/60; time.minute+=addtime%60; if(time.minute>=60) { time.hour++; time.minute-=60; } return time; } bool comtime(time t1,time t2)//比较两个时间的大小,第一个大就返回TRUE { if(t1.hour>t2.hour) return true; else if(t1.hour==t2.hour&&t1.minute>=t2.minute) return true; else return false; } void showResult(Job job[],int &n) //显示结果 { cout<<"jobname\tintime\truntime\tsttime\tendtime\t周转时间(分钟)\t带权周转时间"< cout<<"*********************************************************** ********"< for(int i=0;i { cout< showTime(job[i].intime); cout<<"\t"< showTime(job[i].starttime);