(八)作业调度

作业调度主要有FIFO,运算时间短的作业优先,优先数调度算法,响应比最高者优先调度算法,均衡调度算法
模拟最高响应比优先作业调度算法
输入:作业流文件,其中存储的是一系列要执行的作业,
每个作业包括三个数据项:
作业号、作业进入系统的时间(用一整数表示,如10:10,表示成1010)、估计执行时间(单位分)优先级(0级最高)
参数用空格隔开,下面是示例:
1 800 50
2 815 30
3 830 25
4 835 20
5 845 15
6 900 10
7 920 5
其中调度时刻为最后一个作业到达系统的时间!
输出作业号!进入内存的时间!每行输出一个作业信息
本程序包括:FIFO,运算时间短的作业优先,优先数调度算法,响应比最高者优先调度算法

作业调度

    
#include < stdio.h >
#include
< iostream.h >
#include
< iomanip.h >
#include
< string .h >

const int MAXJOB = 50 ; // 定义最大作业

// 定义数据结构体
typedef struct node{
int number;
int reach_time;
int reach_hour;
int reach_minite;
int need_time;

int privilege;

float excellent;

int start_time;
int wait_time;

int visited;
}job;

job jobs[MAXJOB];
int quantity;

// 初始化函数
void initial()
{
int i;

for (i = 0 ;i < MAXJOB;i ++ ){
jobs[i].number
= 0 ;
jobs[i].reach_time
= 0 ;
jobs[i].reach_hour
= 0 ;
jobs[i].reach_minite
= 0 ;

jobs[i].privilege
= 0 ;

jobs[i].excellent
= 0 ;

jobs[i].start_time
= 0 ;
jobs[i].wait_time
= 0 ;

jobs[i].visited
= 0 ;
}
quantity
= 0 ;
}

// 重置作业数据函数
void reset()
{
int i;

for (i = 0 ;i < MAXJOB;i ++ ){
jobs[i].start_time
= 0 ;
jobs[i].wait_time
= 0 ;

jobs[i].visited
= 0 ;
}

}

// 读入作业数据函数
void readData()
{
FILE
* fp;
char fname[ 20 ];
int i;

cout
<< " 请输入作业数据文件名: " ;
strcpy(fname,
" 8job.txt " );
cin
>> fname;

if ((fp = fopen(fname, " r " )) == NULL){
cout
<< " 错误,文件打不开,请检查文件名:) " << endl;
}
else {
while ( ! feof(fp)){
fscanf(fp,
" %d %d %d %d " , & jobs[quantity].number, & jobs[quantity].reach_time, & jobs[quantity].need_time, & jo
bs[quantity].privilege);
jobs[quantity].reach_hour
= jobs[quantity].reach_time / 100 ;
jobs[quantity].reach_minite
= jobs[quantity].reach_time % 100 ;
quantity
++ ;
}
// 输出初始作业数据
cout << " 输出初始作业数据 " << endl;
cout
<< " --------------------------------------------------------------- " << endl;
cout.setf(
2 );
cout
<< setw( 10 ) << " 作业号 " << setw( 12 ) << " 到达时间 " << setw( 14 ) << " 所需时间(分) " << setw( 14 ) << " 优先级(0>1) " << endl;

for (i = 0 ;i < quantity;i ++ ){
cout
<< setw( 10 ) << jobs[i].number << setw( 12 ) << jobs[i].reach_time << setw( 14 ) << jobs[i].need_time << setw( 14 ) << jobs[i].privil
ege
<< endl;
}
}

}

// FIFO算法
void FIFO()
{
int i;
int current_hour;
int current_minute;

int total_time = 0 ;

// 输出作业流
cout << endl;
cout
<< endl << " FIFO算法作业流 " << endl;
cout
<< " --------------------------------------------------------------- " << endl;
cout.setf(
2 );
cout
<< setw( 10 ) << " 作业号 " << setw( 12 ) << " 到达时间 " << setw( 12 ) << " 开始时间 " << setw( 14 ) << " 周转时间(分) " << endl;

current_hour
= jobs[ 0 ].reach_hour;
current_minute
= jobs[ 0 ].reach_minite;
for (i = 0 ;i < quantity;i ++ ){
jobs[i].start_time
= current_hour * 100 + current_minute;
jobs[i].wait_time
= (current_hour - jobs[i].reach_hour) * 60 + (current_minute - jobs[i].reach_minite) + jobs[i
].need_time;

cout
<< setw( 10 ) << jobs[i].number << setw( 12 ) << jobs[i].reach_time << setw( 12 ) << jobs[i].start_time << setw( 14 ) << jobs[i].wait_
time
<< endl;

current_hour
= current_hour + (jobs[i].need_time + current_minute) / 60 ;
current_minute
= (jobs[i].need_time + current_minute) % 60 ;

total_time
+= jobs[i].wait_time;
}

cout
<< endl << " 总周转时间: " << total_time << " 平均周转时间: " << total_time / quantity << endl;
}


// 运算时间短的作业优先算法
void shorter()
{
int i,j,p;
int current_hour;
int current_minute;
int current_need_time;

int total_time = 0 ;

// 输出作业流
cout << endl;
cout
<< endl << " 时间短作业优先算法作业流(开始调度时刻为最后一个作业到达系统的时间) " << endl;
cout
<< " ------------------------------------------------------------------------ " << endl;
cout.setf(
2 );
cout
<< setw( 10 ) << " 作业号 " << setw( 12 ) << " 到达时间 " << setw( 14 ) << " 所需时间(分) " << setw( 12 ) << " 开始时间 " << setw( 14 ) << " 周转时间(分) " << endl;

current_hour
= jobs[quantity - 1 ].reach_hour;
current_minute
= jobs[quantity - 1 ].reach_minite;
for (i = 0 ;i < quantity;i ++ ){
current_need_time
= 30000 ;
for (j = 0 ;j < quantity;j ++ ){
if ((jobs[j].visited == 0 ) && (jobs[j].need_time < current_need_time)){
p
= j;
current_need_time
= jobs[j].need_time;
}
}

jobs[p].start_time
= current_hour * 100 + current_minute;
jobs[p].wait_time
= (current_hour - jobs[p].reach_hour) * 60 + (current_minute - jobs[p].reach_minite) + jobs[p
].need_time;

cout
<< setw( 10 ) << jobs[p].number << setw( 12 ) << jobs[p].reach_time << setw( 14 ) << jobs[p].need_time << setw( 12 ) << jobs[p].start_
time
<< setw( 14 ) << jobs[p].wait_time << endl;

current_hour
= current_hour + (jobs[p].need_time + current_minute) / 60 ;
current_minute
= (jobs[p].need_time + current_minute) % 60 ;

jobs[p].visited
= 1 ;

total_time
+= jobs[p].wait_time;
}
cout
<< endl << " 总周转时间: " << total_time << " 平均周转时间: " << total_time / quantity << endl;
}

// 优先数调度算法
void privilege()
{
int i,j,p;
int current_hour;
int current_minute;
int current_privilege;

int total_time = 0 ;

// 输出作业流
cout << endl;
cout
<< endl << " 优先数调度算法作业流(开始调度时刻为最后一个作业到达系统的时间) " << endl;
cout
<< " ------------------------------------------------------------------------ " << endl;
cout.setf(
2 );
cout
<< setw( 10 ) << " 作业号 " << setw( 12 ) << " 到达时间 " << setw( 14 ) << " 优先级(0>1) " << setw( 12 ) << " 开始时间 " << setw( 14 ) << " 周转时间(分) " << endl;

current_hour
= jobs[quantity - 1 ].reach_hour;
current_minute
= jobs[quantity - 1 ].reach_minite;
for (i = 0 ;i < quantity;i ++ ){
current_privilege
= 30000 ;
for (j = 0 ;j < quantity;j ++ ){
if ((jobs[j].visited == 0 ) && (jobs[j].privilege < current_privilege)){
p
= j;
current_privilege
= jobs[j].privilege;
}
}
jobs[p].start_time
= current_hour * 100 + current_minute;
jobs[p].wait_time
= (current_hour - jobs[p].reach_hour) * 60 + (current_minute - jobs[p].reach_minite) + jobs[p
].need_time;

cout
<< setw( 10 ) << jobs[p].number << setw( 12 ) << jobs[p].reach_time << setw( 14 ) << jobs[p].privilege << setw( 12 ) << jobs[p].start_
time
<< setw( 14 ) << jobs[p].wait_time << endl;

current_hour
= current_hour + (jobs[p].need_time + current_minute) / 60 ;
current_minute
= (jobs[p].need_time + current_minute) % 60 ;

jobs[p].visited
= 1 ;

total_time
+= jobs[p].wait_time;
}
cout
<< endl << " 总周转时间: " << total_time << " 平均周转时间: " << total_time / quantity << endl;
}

// 响应比最高者优先调度算法
void excellent()
{
int i,j,p;
int current_hour;
int current_minute;
float current_excellent;

int total_time = 0 ;
// 输出作业流
cout << endl;
cout
<< endl << " 响应比高者优先调度算法作业流(开始调度时刻为最后一个作业到达系统的时间) " << endl;
cout
<< " ------------------------------------------------------------------------ " << endl;
cout.setf(
2 );
cout
<< setw( 10 ) << " 作业号 " << setw( 12 ) << " 到达时间 " << setw( 12 ) << " 开始时间 " << setw( 14 ) << " 周转时间(分) " << endl;

current_hour
= jobs[quantity - 1 ].reach_hour;
current_minute
= jobs[quantity - 1 ].reach_minite;
for (i = 0 ;i < quantity;i ++ ){
current_excellent
=- 1 ;
for (j = 0 ;j < quantity;j ++ ){
if (jobs[j].visited == 0 ){
jobs[j].wait_time
= (current_hour - jobs[j].reach_hour) * 60 + (current_minute - jobs[j].reach_minite);
jobs[j].excellent
= ( float )(jobs[j].wait_time / jobs[j].need_time);
}
}

for (j = 0 ;j < quantity;j ++ ){
if ((jobs[j].visited == 0 ) && (jobs[j].excellent > current_excellent)){
p
= j;
current_excellent
= jobs[j].excellent;
}
}
jobs[p].start_time
= current_hour * 100 + current_minute;
jobs[p].wait_time
= (current_hour - jobs[p].reach_hour) * 60 + (current_minute - jobs[p].reach_minite) + jobs[p
].need_time;

cout
<< setw( 10 ) << jobs[p].number << setw( 12 ) << jobs[p].reach_time << setw( 12 ) << jobs[p].start_time << setw( 14 ) << jobs[p].wait_
time
<< endl;

current_hour
= current_hour + (jobs[p].need_time + current_minute) / 60 ;
current_minute
= (jobs[p].need_time + current_minute) % 60 ;

jobs[p].visited
= 1 ;

total_time
+= jobs[p].wait_time;
}
cout
<< endl << " 总周转时间: " << total_time << " 平均周转时间: " << total_time / quantity << endl;

}

// 显示版权信息函数
void version()
{
cout
<< endl << endl;

cout
<< " ┏━━━━━━━━━━━━━━━━━━━━━━━┓ " << endl;
cout
<< " ┃     作业调度模拟系统        ┃ " << endl;
cout
<< " ┠───────────────────────┨ " << endl;
cout
<< " ┃   (c)All Right Reserved Neo       ┃ " << endl;
cout
<< " ┃      [email protected]          ┃ " << endl;
cout
<< " ┃     version 2004 build 1122      ┃ " << endl;
cout
<< " ┗━━━━━━━━━━━━━━━━━━━━━━━┛ " << endl;

cout
<< endl << endl;
}

void main()
{
version();
initial();

readData();

FIFO();

shorter();
reset();

privilege();
reset();

excellent();


}

转载于:https://my.oschina.net/garyun/blog/602943

猜你喜欢

转载自blog.csdn.net/weixin_34319111/article/details/91774451