一、实验目的和内容
1、实验目的
用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。
2、实验内容
编写并调试一个单道处理系统的作业等待模拟程序。
作业等待算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。
对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,以比较各种算法的优缺点。
二、实验方案
1、先来先服务算法
原理:每次调度是从就绪队列中,选择一个最先进入就绪队列的进程,把处理器分配给该进程,使之得到执行。该进程一旦占有了处理器,它就一直运行下去,直到该进程完成或因发生事件而阻塞,才退出处理器。
特点:利于长进程,而不利于短进程。
2、短作业优先服务算法
原理:它是从就绪队列中选择一个估计运行时间最短的进程,将处理器分配给该进程,使之占有处理器并执行,直到该进程完成或因发生事件而阻塞,然后退出处理器,再重新调度。
3、最高响应比优先算法
原理:它是从就绪队列中选择一个响应比最高的进程,让其获得处理器执行,直到该进程完成或因等待事件而退出处理器为止。
特点:既照顾了短进程,又考虑了进程到达的先后次序,也不会使长进程长期得不到服务,因此是一个比较全面考虑的算法,但每次进行调度时,都需要对各个进程计算响应比。所以系统开销很大,比较复杂。
4、源代码
#include #include #include typedef struct JCB //定义作业控制块JCB结构体 { int ID; //作业标识数ID float requesttime; //作业运行所需要时间requesttime int runtime; //作业实际运行时间runtime int arrivetime; //作业到达时间arrivetime int starttime; //作业开始时间starttime int finishtime; //作业完成时间finishtime float zhuantime; //作业周转时间zhuantime }JCB; #define N 100 //宏定义 JCB jcb[N]; //定义作业块数组 int jcbnum; //定义作业块个数 void init(); //初始化函数 void FCFS(); //先来先服务算法 void SJF(); //短作业优先算法 void HRN(); //高响应比算法 void init() //初始化作业调度块 { int j=0; int req; while(j<=0||j>2000) //实现作业的输入 { cout<<"请输入作业个数:(1--2000)"; cin>>j; } jcbnum=j; for(j=0;j cout<<"请输入第"< jcb[j].ID=j+1; jcb[j].requesttime=req; jcb[j].arrivetime=j; jcb[j].starttime=0; jcb[j].finishtime=0; jcb[j].zhuantime=0; } } void FCFS() //先到先服务算法的实现 { int i;float a,b;b=a=0; cout<<"你选择用先到先服务算法进行作业调度,结果如下:"< int runtime=0; jcb[i].finishtime=jcb[i].starttime+jcb[i].requesttime; jcb[i].zhuantime=jcb[i].finishtime-jcb[i].arrivetime; cout<<" "< a+=jcb[i].zhuantime; b+=jcb[i].zhuantime/jcb[i].requesttime; } cout<<"平均周转时间:"< cout<<"平均带权周转时间:"<} void SJF()//短作业优先算法 { int i,j,r,c,fin=0; float a,b;a=b=0;c=jcbnum; cout<<"你选择用短作业优先算法进行作业调度,结果如下"< { r=0; for(i=0;i r=i; jcb[r].starttime=fin; jcb[r].finishtime=fin+jcb[r].requesttime; jcb[r].zhuantime=jcb[r].finishtime-jcb[r].arrivetime; a+=jcb[r].zhuantime; b+=jcb[r].zhuantime/jcb[r].requesttime; cout<<" "< for(j=r;j jcb[j].ID=jcb[j+1].ID; jcb[j].requesttime=jcb[j+1].requesttime; jcb[j].arrivetime=jcb[j+1].arrivetime; } jcbnum--; }cout<<"平均周转时间:"< cout<<"平均带权周转时间:"< cout< void HRN()//高响应比算法 { int i,j,r,c; float a,b; a=b=0; c=jcbnum; int waittime=0; //进程等待处理机所用时间 cout<<"你选择高响应比优先算法进行作业调度,结果如下:"< { r=0; for(i=0;i r=i; jcb[r].starttime=waittime; jcb[r].finishtime=waittime+jcb[r].requesttime; jcb[r].zhuantime=jcb[r].finishtime-jcb[r].arrivetime; a+=jcb[r].zhuantime; b+=jcb[r].zhuantime/jcb[r].requesttime; cout<<" "< for(j=r;j jcb[j].ID=jcb[j+1].ID; jcb[j].requesttime=jcb[j+1].requesttime; jcb[j].arrivetime=jcb[j+1].arrivetime; } jcbnum--; } cout< //主函数 void main() { bool flog=1; int i=0; char ch; cout<<"********************************"< init(); a1: cout<<"请选择你要做的选项(1--3):"; cin>>i; if(i>=0&&i<=3){ switch(i) { case 1:FCFS();break; //选择"1"的时候调用的是FCFS算法 case 2:SJF();break; //选择"2"的时候调用的是SJF算法 case 3:HRN();break; //选择"3"的时候调用的是HRN算法 } cout< cin>>ch; if(ch=='y'||ch=='Y') flog=1; else flog=0; } } 三、实验数据、结果分析 运行结果 四、总结下载本文