操作系统——作业调度
- 格式:pdf
- 大小:122.80 KB
- 文档页数:5
操作系统——作业调度
实验⼆作业调度模拟程序
⼀、⽬的和要求
1. 实验⽬的
(1)加深对作业调度算法的理解;
(2)进⾏程序设计的训练。
2.实验要求
⽤⾼级语⾔编写⼀个或多个作业调度的模拟程序。
单道批处理系统的作业调度程序。作业⼀投⼊运⾏,它就占有计算机的⼀切资源直到作业完成为⽌,因此调度作业时不必考虑它所
需要的资源是否得到满⾜,它所运⾏的时间等因素。
作业调度算法:
1) 采⽤先来先服务(FCFS)调度算法,即按作业到达的先后次序进⾏调度。总是⾸先调度在系统中等待时间最长的作业。
2) 短作业优先 (SJF) 调度算法,优先调度要求运⾏时间最短的作业。
3) 响应⽐⾼者优先(HRRN)调度算法,为每个作业设置⼀个优先权(响应⽐),调度之前先计算各作业的优先权,优先数⾼者优先调度。
RP (响应⽐)= 作业周转时间 / 作业运⾏时间=1+作业等待时间/作业运⾏时间
每个作业由⼀个作业控制块JCB表⽰,JCB可以包含以下信息:作业名、提交(到达)时间、所需的运⾏时间、所需的资源、作业状态、链
指针等等。
作业的状态可以是等待W(Wait)、运⾏R(Run)和完成F(Finish)三种之⼀。每个作业的最初状态都是等待W。
⼀、 模拟数据的⽣成
1.允许⽤户指定作业的个数(2-24),默认值为5。
2. 允许⽤户选择输⼊每个作业的到达时间和所需运⾏时间。
3.(**)从⽂件中读⼊以上数据。
4.(**)也允许⽤户选择通过伪随机数指定每个作业的到达时间(0-30)和所需运⾏时间(1-8)。
⼆、 模拟程序的功能
1.按照模拟数据的到达时间和所需运⾏时间,执⾏FCFS, SJF和HRRN调度算法,程序计算各作业的开始执⾏时间,各作业的完
成时间,周转时间和带权周转时间(周转系数)。
2. 动态演⽰每调度⼀次,更新现在系统时刻,处于运⾏状态和等待各作业的相应信息(作业名、到达时间、所需的运⾏时间等)
对于HRRN算法,能在每次调度时显⽰各作业的响应⽐R情况。
3.(**)允许⽤户在模拟过程中提交新作业。
4.(**)编写并调度⼀个多道程序系统的作业调度模拟程序。 只要求作业调度算法:采⽤基于先来先服务的调度算法。 对于多道程
序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。
三、 模拟数据结果分析
1.对同⼀个模拟数据各算法的平均周转时间,周转系数⽐较。
2.(**)⽤曲线图或柱形图表⽰出以上数据,分析算法的优点和缺点。
四、 实验准备
序号准备内容完成情况
1什么是作业?
2⼀个作业具备什么信息?
3为了⽅便模拟调度过程,作
业使⽤什么⽅式的数据结构
存放和表⽰?JCB
4操作系统中,常⽤的作业调
4操作系统中,常⽤的作业调
度算法有哪些?
5如何编程实现作业调度算
法?
6模拟程序的输⼊如何设计更
⽅便、结果输出如何呈现更
好?
五、 其他要求
1.完成报告书,内容完整,规格规范。
2.实验须检查,回答实验相关问题。
注:带**号的条⽬表⽰选做内容。
⼆、实验内容
根据指定的实验课题,完成设计、编码和调试⼯作,完成实验报告。
三、实验环境
可以采⽤TC,也可以选⽤Windows下的利⽤各种控件较为⽅便的VB,VC等可视化环境。也可以⾃主选择其他实验环境。
四、实验原理及核⼼算法参考程序段
单道FCFS算法:
源代码:
#include
void SJF(int(*compare)(int a,int b));
typedef struct job{
char name[10];
char status; //状态
int arrtime; //到达时间
int reqtime; //作业所需时间
int startime; //开始时间
int fintime; //结束时间
float TAtime,TAWtime; //周转时间,带权周转时间
float prio; //响应⽐
}JOB;
int n,N;
JOB job[100];
int systime=0;
//菜单
void menu()
{
printf("\n\n |*************** 作业调度 *************|\n");
printf(" |======================================|\n");
printf(" | 1.读取作业 |\n");
printf(" | 2.伪随机数产⽣器 |\n");
printf(" | 3.作业调度 |\n");
printf(" | 0.退出 |\n");
printf(" |======================================|\n");
}
//读取TXT⽂档
int ReadFile()
{
int m=0;
int i=1;
FILE *fp; //定义⽂件指针
fp=fopen("作业.txt","r"); //打开⽂件
if(fp==NULL)
{
printf("File open error !\n");
exit(0);
} printf("\n 作业名称 到达时间 运⾏所需要时间\n");
while(!feof(fp))
{
fscanf(fp,"%s%d%d",&job[i].name,&job[i].arrtime,&job[i].reqtime); //fscanf()函数将数据读⼊
printf(" %s\t\t%d\t\t%d\n",job[i].name,job[i].arrtime,job[i].reqtime);
i++;
};
n=i;
if(fclose(fp)) //关闭⽂件
{
printf("Can not close the file !\n");
exit(0);
}
m=i-1;
return m;
}
//计算完成时间,周转时间,带权周转时间
void math_TA_TAW()
{
float sumTA=0,sumTAW=0;
int a=1;
while(a
{
if(a==1)
{
job[a].startime=job[a].arrtime;
}
else
{
if(job[a-1].fintime>=job[a].arrtime)
job[a].startime=job[a-1].fintime;
else
job[a].startime=job[a].arrtime;
}
job[a].fintime=job[a].startime+job[a].reqtime;
job[a].TAtime=job[a].fintime-job[a].arrtime;
job[a].TAWtime=job[a].TAtime/job[a].reqtime;
sumTA+=job[a].TAtime;
sumTAW+=job[a].TAWtime;
a++;
}
}
//输出
void Print()
{
int i;
n=n+N;
printf("\n 作业顺序 作业名称 到达时间 运⾏时间 完成时间 周转时间 带权周转时间\n");
for(i=1;i
printf(" N %d\t\t%s\t %d\t %d\t\t%d\t %.2f\t %.2f\n",i,job[i].name,job[i].arrtime,job[i].reqtime,job[i].fintime,job[i].TAtime,job[i].TAWtime);
printf("\n\t\t\t\t\t\t现在系统时间: %d\n",systime);
}
//伪随机数产⽣器
int Pseudo_random_number()
{
int i,r,a;
srand((unsigned)time(0)); //参数seed是rand()的种⼦,⽤来初始化rand()的起始值。
//输⼊作业数
printf(" 请输⼊随机数: ");
scanf("%d",&a);
r=rand()%a+5;
printf("\n 伪随机列表:\n\n");
for(i=1; i<=r; i++)
{
//作业到达时间
job[i].arrtime=rand()%29+1;
//作业运⾏时间
job[i].reqtime=rand()%8+1;
}
math_TA_TAW();
Print();
return n;
}
//交换artime
void SwapTime(int *x,int *y)
{
int temp;
temp=*x; *x=*y;
*y=temp;
}
//交换名字
void SwapName(char x[],char y[])
{
char temp[8];
strcpy(temp,x);
strcpy(x,y);
strcpy(y,temp);
}
//升序排序
int Descend(int a,int b)
{
return a
}
//先到先服务算法
void FCFS(int(*compare)(int a,int b))
{
int i,j,k,s;
for(i=0;i
{
k=i;
for(j=i+1;j
{
if((*compare)(job[j].arrtime,job[k].arrtime))
k=j;
}
if(k!=i)
{
SwapTime(&job[k].arrtime,&job[i].arrtime);
SwapName(job[k].name,job[i].name);
SwapTime(&job[k].reqtime,&job[i].reqtime);
}
}
math_TA_TAW();
printf("\n\n FCFS作业调度表:\n");
Print(job);
printf("\n\t0.返回主菜单 1.FCFS算法 2.SJF算法\n");
printf("\t选择: ");
scanf("%d",&s);
printf("\n");
if(s==0)
main();
else if(s==1)
FCFS(Descend);
else if(s==2)
SJF(Descend);
}
//短作业优先算法
void SJF(int(*compare)(int a,int b))
{
int i,j,k,s,a=1;
for(i=0;i
{
k=i;
for(j=i+1;j
{
if((*compare)(job[j].reqtime,job[k].reqtime))
k=j;
}
if(k!=i)
{
SwapTime(&job[k].arrtime,&job[i].arrtime);
SwapName(job[k].name,job[i].name);
SwapTime(&job[k].reqtime,&job[i].reqtime);
}
}
math_TA_TAW();
printf("\n\n SJF算法作业调度表:\n");
Print(job);
printf("\n\t0.返回主菜单 1.FCFS算法 2.SJF算法\n");
printf("\t选择: ");
scanf("%d",&s);
printf("\n");
if(s==0)
main();