操作系统——作业调度

  • 格式: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();