当前位置:文档之家› 各类作业调度算法

各类作业调度算法

实验二作业调度实验一. 目的要求:用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。

二. 例题:为单道批处理系统设计一个作业调度程序。

由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。

作业调度算法:采用先来先服务(FCFS)调度算法,即按作业提交的先后次序进行调度。

总是首先调度在系统中等待时间最长的作业。

每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。

作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。

每个作业的最初状态总是等待W。

各个等待的作业按照提交时刻的先后次序排队,总是首先调度等待队列中队首的作业。

每个作业完成后要打印该作业的开始运行时刻、完成时刻、周转时间和带权周转时间,这一组作业完成后要计算并打印这组作业的平均周转时间、带权平均周转时间。

调度算法的流程图如下图所示。

三 . 实习题:1、编写并调试一个单道处理系统的作业等待模拟程序。

作业等待算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。

对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,以比较各种算法的优缺点。

2、编写并调度一个多道程序系统的作业调度模拟程序。

作业调度算法:采用基于先来先服务的调度算法。

可以参考课本中的方法进行设计。

对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。

3、编写并调试一个多道程序系统的作业调度模拟程序。

作业调度算法:采用基于优先级的作业调度。

可以参考课本中的例子自行设计。

三 . 实验过程:1、编写并调试一个单道处理系统的作业等待模拟程序。

先来先服务(FCFS):main.cpp:/***先来先服作业调度算法模拟*/#include <string>#include <iostream>#define MAX_SOURCE 1000 //资源总数(对于单通道的作业调度可以忽略系统资源问题)using namespace std;struct jobCB{string name;double subtime;//提交时间double runtime;//运行时间double source;//资源char state;//进程状态struct jobCB *next; //链指针}*ready,*rail,*p;int length;double maxsource;double now_source;double allTi;//总周转时间double allWi;//总带权周转时间double time;//时钟void init(){time=0;length=0;allTi=0;allWi=0;maxsource=MAX_SOURCE;now_source=0;rail=ready=p=NULL;}void destroy(){maxsource+=p->source;//释放资源time+=p->runtime;p->state='f';delete p;}void running(){p->state='r';double Tc = time+ p->runtime;//完成时刻double Ti = Tc - p->subtime;//周转时间double Wi = Ti/p->runtime;//带权周转时间cout<<"\n作业"<<p->name<<"信息:"<<endl;cout<<"\n录入时间运行时间开始运行的时刻完成时刻周转时间带权周转时间"<<endl;cout<<"\n"<<p->subtime<<"\t "<<p->runtime<<"\t "<<time<<" \t"<<Tc<<"\t "<<Ti<<" \t"<<Wi<<endl;allTi+=Ti;allWi+=Wi;destroy();}void display(){cout<<"\n----------------------------------------------------------"<<endl;for(int i=0; i< length; i++){p = ready;ready = ready->next;p->state = 'r';running();}cout<<"\n----------------------------------------------------------"< <endl;}void in_queue(){now_source+=p->source;//分配资源给作业if(maxsource>=now_source){if(ready==NULL){ready=rail=p;}else{rail->next=p;rail=p;}length ++;}else{now_source-=p->source;//回退cout<<"没有足够资源!"<<endl;return;}}void input(){int n;cout<<" --先来先服作业调度算法模拟--"<<endl;cout<<"请输入作业数: "<<endl;cin>>n;for(int i = 0; i < n; i++){p = new jobCB;cout<<"当前作业录入时间:"<<time;cout<<"\n请输入作业名: ";cin>>p->name;cout<<"\n请输入作业所需的运行时间: ";cin>>p->runtime;cout<<"\n请输入作业所需的资源: ";cin>>p->source;p->state = 'w';p->subtime = time;time++;p->next = NULL;in_queue();}}int main(){init();input();display();cout<<"\n这组作业的平均周转时间为: "<<allTi / length<<endl;cout<<"\n这组作业的带权平均周转时间为: "<<allWi / length<<endl; return 0;}(程序测试运行结果在附件里)短作业优先(SJF):main.cpp:/***短作业优先作业调度算法模拟*/#include <string>#include <iostream>#define MAX_SOURCE 1000using namespace std;struct jobCB{string name;double subtime;//提交时间double runtime;//运行时间double source;//资源char state;//进程状态struct jobCB *next; //链指针}*ready,*rail,*p;int length;double maxsource; //资源总数,对于单通道作业调度,资源部分可以去掉(由于当时写多道时是在单道上直接修改的,所以这里多道部分仍然在)double now_source; //当前资源double allTi;//总周转时间double allWi;//总带权周转时间double time;//时钟void init(){time=0;length=0;allTi=0;allWi=0;maxsource=MAX_SOURCE;now_source=0;rail=ready=p=NULL;}void destroy(){Maxsource+=p->source;//释放资源time+=p->runtime;p->state='f';delete p;}void running(){p->state='r';double Tc = time+ p->runtime;//完成时刻double Ti = Tc - p->subtime;//周转时间double Wi = Ti/p->runtime;//带权周转时间cout<<"\n作业"<<p->name<<"信息:"<<endl;cout<<"\n录入时间运行时间开始运行的时刻完成时刻周转时间带权周转时间"<<endl;cout<<"\n"<<p->subtime<<"\t "<<p->runtime<<"\t "<<time<<" \t"<<Tc<<"\t "<<Ti<<" \t"<<Wi<<endl;allTi+=Ti;allWi+=Wi;destroy();}void display(){cout<<"\n----------------------------------------------------------"<<endl;for(int i=0; i< length; i++){p = ready;ready = ready->next;p->state = 'r';running();}cout<<"\n----------------------------------------------------------"<}void in_queue(){int flag=0;now_source+=p->source;//分配资源给作业jobCB *q1,*q2;if(maxsource>=now_source){if(ready==NULL){ready=rail=p;}else{if(p->runtime<ready->runtime){p->next=ready;ready=p;}else {q1=ready;q2=ready->next;while(q2!=NULL){if(q2->runtime>p->runtime) {p->next=q2;q1->next=p;flag=1;}q1=q2;q2=q2->next;}if(flag==0)q1->next=p;}}length ++;}else{now_source-=p->source;//回退cout<<"没有足够资源!"<<endl;return;}void input(){int n;cout<<" ---短作业优先作业调度算法模拟---"<<endl;cout<<"请输入作业数: "<<endl;cin>>n;for(int i = 0; i < n; i++){p = new jobCB;cout<<"当前作业录入时间:"<<time;cout<<"\n请输入作业名: ";cin>>p->name;cout<<"\n请输入作业所需的运行时间: ";cin>>p->runtime;cout<<"\n请输入作业所需的资源: ";cin>>p->source;p->state = 'w';p->subtime = time;time++;p->next = NULL;in_queue();}}int main(){init();input();display();cout<<"\n这组作业的平均周转时间为: "<<allTi / length<<endl;cout<<"\n这组作业的带权平均周转时间为: "<<allWi / length<<endl; return 0;}(程序测试运行结果在附件里)响应比高者优先(HRN):main.cpp:/***响应比高优先作业调度算法模拟*/#include <string>#include <iostream>#include <list>#define MAX_SOURCE 1000using namespace std;struct jobCB{string name;double subtime;//提交时间double runtime;//运行时间double source;//资源char state;//进程状态struct jobCB *next; //链指针}*p;list <jobCB*> jobqueue; //声明作业调度队列,使用STL(标准模板库)的listlist <jobCB*> ::iterator it;int length;double maxsource;double now_source;double allTi;//总周转时间double allWi;//总带权周转时间double time;//时钟double inputfinishtime;//输入结束时间void init(){time=0;length=0;allTi=0;allWi=0;inputfinishtime=0;maxsource=MAX_SOURCE;now_source=0;p=NULL;}void destroy(){maxsource+=p->source;time+=p->runtime;p->state='f';}void running(){p->state='r';double Tc = time+ p->runtime;//完成时刻double Ti = Tc - p->subtime;//周转时间double Wi = Ti/p->runtime;//带权周转时间cout<<"\n作业"<<p->name<<"信息:"<<endl;cout<<"\n录入时间运行时间开始运行的时刻完成时刻周转时间带权周转时间响应比"<<endl;cout<<"\n"<<p->subtime<<"\t "<<p->runtime<<"\t "<<time<<" \t"<<Tc<<"\t "<<Ti<<" \t"<<Wi<<"\t"<<(inputfinishtime-p->subtime)/p->runtime+1<<endl;allTi+=Ti;allWi+=Wi;destroy();}void display(){cout<<"\n----------------------------------------------------------"<<endl;for(int i=0; i< length; i++){p=jobqueue.front();//取出队首元素jobqueue.pop_front();//出队p->state = 'r';running();}cout<<"\n----------------------------------------------------------"<<endl;}void in_queue()//按所有作业到达后再计算响应比(即固定优先比),所有作业都提交完成的时间是n*提交单个作业时间(1){now_source+=p->source;//分配资源给作业if(maxsource>=now_source){jobqueue.push_back(p);length ++;}else{now_source-=p->source;//回退cout<<"没有足够资源!"<<endl;return;}}double makeout_ResR(jobCB *p)//算出响应比,因为优先比是waittime/runtime+1,所以这里直接比较waittime/runtime->(inputfinishtime-subtime)/runtime{//cout<<(inputfinishtime-p->subtime)/p->runtime<<" \t";return (inputfinishtime-p->subtime)/p->runtime;}bool compare(jobCB *first,jobCB *second) //用于list排序的compare函数{if(makeout_ResR(first)>makeout_ResR(second)) return true;else return false;}void input(){int n;cout<<" ---响应比优先作业调度算法模拟---"<<endl;cout<<"请输入作业数: "<<endl;cin>>n;inputfinishtime=n*1;for(int i = 0; i < n; i++){p = new jobCB;cout<<"当前作业录入时间:"<<time;cout<<"\n请输入作业名: ";cin>>p->name;cout<<"\n请输入作业所需的运行时间: ";cin>>p->runtime;cout<<"\n请输入作业所需的资源: ";cin>>p->source;p->state = 'w';p->subtime = time;time++;p->next = NULL;in_queue();}jobqueue.sort(compare);}int main(){init();input();display();cout<<"\n这组作业的平均周转时间为: "<<allTi / length<<endl;cout<<"\n这组作业的带权平均周转时间为: "<<allWi / length<<endl; return 0;}(程序测试运行结果在附件里)2、编写并调度一个多道程序系统的作业调度模拟程序。

相关主题