作业调度算法C实现.docx
《作业调度算法C实现.docx》由会员分享,可在线阅读,更多相关《作业调度算法C实现.docx(45页珍藏版)》请在冰豆网上搜索。
作业调度算法C实现
计算机操作系统
实验报告
学号:
姓名:
班级:
实验时间:
2011-10-10
实验编号
002
实验名称
作业调度算法
实验目的和要求
通过对作业调度算法的模拟加深对作业概念和作业调度算法的理解
实验内容
(1)模拟FCFS算法实现作业调度
(2)模拟短作业优先算法实现作业调度
模拟最高相应比优先算法实现作业调度
一、实验题目
输入:
作业流文件,其中存储的是一系列要执行的作业,
每个作业包括三个数据项:
作业号、作业进入系统的时间(用一小数表示,如10:
10,表示成10.10)、估计执行时间(单位小时,以十进制表示)
参数用空格隔开,下面是示例:
18.000.5
28.150.3
38.300.25
48.350.20
58.450.15
69.000.10
79.200.05
其中调度时刻为最后一个作业到达系统的时间!
输出:
作业号进入内存的时间,每行输出一个作业信息。
并输出每一种调度算法的平均周转时间和平均带权周转时间。
二、算法设计思路
首先用一个switch函数做界面选择进入哪一种算法。
用一个内来定义作业
floats;//提交时间
floatj;//执行时间
floatk;//开始时间
floatw;//完成时间
floatz;//周转时间
floatd;//带权周转时间
1,先来先服务,首先计算第一个作业的完成时间,周转时间,带权周转时间。
再用for循环来计算剩下每一个作业的完成时间,周转时间,带权周转时间。
然后再算出平均周转时间和平均带权周转时间。
2,短作业有优先,首先计算第一个作业的完成时间,周转时间,带权周转时间。
再用来计算其他作业的。
其中在for循环中嵌套while函数,在每一次计算前判断处于等待状态的作业个数,然后按执行时间,从短到长排序,将排在第一个的作业计算。
以此类推。
3.响应比,与短作业优先类似,只是在排序前,循环计算一次响应比,用一个数组来存放响应比,然后按照优先比从小到大排序,然后计算。
三、算法流程图
主要的算法是响应比优先,所以这里只画了响应比优先的流程图,下面为响应比算法函数的代码:
voidxyb(zuoyea[])
{
intj=0,k=0,c=0,b=0;
floatm=0;
floatn=0;
floatx=0;
floatz[N];//存放z[]数组
zuoyet;
a[0].k=a[0].s;
a[0].w=a[0].k+a[0].j;
a[0].z=a[0].w-a[0].s;
a[0].d=a[0].z/a[0].j;
m=a[0].z;
n=a[0].d;
for(j=1;j
{
k=j;
while(a[k].s<=a[j-1].w&&k{
k++;
}
for(c=j;c{
z[c]=(a[j-1].w-a[c].s)/a[c].j;
}
for(c=j;c{
for(b=c+1;b{
if(z[c]>z[b])
{
t=a[c];
a[c]=a[b];
a[b]=t;
x=z[c];
z[c]=z[b];
z[b]=x;
}
}
}
a[j].k=a[j-1].w;
a[j].w=a[j].k+a[j].j;
a[j].z=a[j].w-a[j].s;
a[j].d=a[j].z/a[j].j;
m+=a[j].z;
n+=a[j].d;
}
cout<<"响应比的平均周转时间为:
"<cout<<"响应比的平均带权周转时间为:
"<}
根据以上的代码画出流程图如下:
判断进入准备状态的作业
以数组z[]来存放响应比
计算
以响应比大小进行排序
响应比算法流程图
三、算法中用到的数据结构
classzuoye
{
public:
floats;//输入时间
floatj;//执行时间
floatk;//开始时间
floatw;//完成时间
floatz;//周转时间
floatd;//带权周转时间
};
voidfcfs(zuoyea[]);//先来服务
voiddzy(zuoyea[]);//短作业优先
voidxyb(zuoyea[]);//响应比
voidmulu(zuoyea[]);//选择目录
voidshuchu(zuoyea[]);//输出结果
四、算法的主要模块
响应比函数是其中比较重要的模块,其中计算的过程:
用循环函数for来计算,
for(j=1;j
{
k=j;
while(a[k].s<=a[j-1].w&&k{
k++;
}
/*用while函数来判断处于准备状态的工作,即输入时间<最后一个已完作业的完成时间*/
for(c=j;c{
z[c]=(a[j-1].w-a[c].s)/a[c].j;
}
/*用循环函数来计算处于准备状态作业的响应比,在z[]为储存响应比的数组。
*/
for(c=j;c{
for(b=c+1;b{
if(z[c]>z[b])
{
t=a[c];
a[c]=a[b];
a[b]=t;
x=z[c];
z[c]=z[b];
z[b]=x;
}
}
/*用冒泡算法按照响应比的大小,从小到大将作业进行排序*/
}
a[j].k=a[j-1].w;
a[j].w=a[j].k+a[j].j;
a[j].z=a[j].w-a[j].s;
a[j].d=a[j].z/a[j].j;
m+=a[j].z;//计算总的周转时间
n+=a[j].d;//计算总的带权周转时间
}
五、实验代码
#include"iostream.h"
#defineN30
inti=0;
classzuoye
{
public:
floats;//输入时间
floatj;//执行时间
floatk;//开始时间
floatw;//完成时间
floatz;//周转时间
floatd;//带权周转时间
};
voidfcfs(zuoyea[]);//先来服务
voiddzy(zuoyea[]);//短作业优先
voidxyb(zuoyea[]);//响应比
voidmulu(zuoyea[]);//选择目录
voidshuchu(zuoyea[]);//输出结果
voidmain()
{
zuoyea[N];
cout<<"输入0,0结束";
do
{
cout<<"请输入第"<
";
cin>>a[i].s>>a[i].j;
i++;
}while(i=0);//用do...while函数来控制输入
mulu(a);
shuchu(a);
}
voidmulu(zuoyea[])
{
intm;
cout<<"请选择算法:
"<cout<<"1.先来先服务算法;"<cout<<"2.短作业优先;"<cout<<"3.优先比算法;"<cin>>m;
switch(m)//switch函数来选择算法
{
case1:
fcfs(a);break;
case2:
dzy(a);break;
case3:
xyb(a);break;
default:
{
cout<<"错误,请重新输入!
"<mulu(a);
}
}
}
voidshuchu(zuoyea[])
{
cout<<"提交\t"<<"执行\t"<<"开始\t"<<"完成\t"<<"周转\t"<<"带权周转"<intj;
for(j=0;j
{
cout<}
}
voidfcfs(zuoyea[])
{
intj=1;
floatm=0;//总周转时间
floatn=0;//总带权周转时间
a[0].k=a[0].s;
a[0].w=a[0].k+a[0].j;
a[0].z=a[0].w-a[0].s;
a[0].d=a[0].z/a[0].j;
m=a[0].z;
n=a[0].d;
for(j=1;j
{
a[j].k=a[j-1].w;//开始时间
a[j].w=a[j].k+a[j].j;//完成时间
a[j].z=a[j].w-a[j].s;//周转时间
a[j].d=a[j].z/a[j].j;//带权周转时间
m+=a[j].z;
n+=a[j].d;
}
cout<<"fcfs平均周转时间为:
"<cout<<"fcfs平均带权周转时间为:
"<}
voiddzy(zuoyea[])
{
intj=0,k=0,c=0,b=0;
floatm=0;
floatn=0;
zuoyet;
a[0].k=a[0].s;
a[0].w=a[0].k+a[0].j;
a[0].z=a[0].w-a[0].s;
a[0].d=a[0].z/a[0].j;
m=a[0].z;
n=a[0].d;
for(j=1;j
{
k=j;
while(a[k].s<=a[j-1].w&&k{
k++;
}
for(c=j;c{
for(b=c+1;b{
if(a[c].j>a[b].j)
{
t=a[c];
a[c]=a[b];
a[b]=t;
}
}
}
a[j].k=a[j-1].w;
a[j].w=a[j].k+a[j].j;
a[j].z=a[j].w-a[j].s;
a[j].d=a[j].z/a[j].j;
m+=a[j].z;
n+=a[j].d;
}
cout<<"短作业优先的平均周转时间为:
"<cout<<"短作业优先的平均带权周转时间为:
"<}
voidxyb(zuoyea[])
{
intj=0,k=0,c=0,b=0;
floatm=0;
floatn=0;
floatx=0;
floatz[N];//存放z[]数组
zuoyet;
a[0].k=a[0].s;
a[0].w=a[0].k+a[0].j;
a[0].z=a[0].w-a[0].s;
a[0].d=a[0].z/a[0].j;
m=a[0].z;
n=a[0].d;
for(j=1;j
{
k=j;
while(a[k].s<=a[j-1].w&&k{
k++;
}
for(c=j;c