(八)作业调度
作業(yè)調(diào)度主要有FIFO,運算時間短的作業(yè)優(yōu)先,優(yōu)先數(shù)調(diào)度算法,響應(yīng)比最高者優(yōu)先調(diào)度算法,均衡調(diào)度算法
模擬最高響應(yīng)比優(yōu)先作業(yè)調(diào)度算法
輸入:作業(yè)流文件,其中存儲的是一系列要執(zhí)行的作業(yè),
每個作業(yè)包括三個數(shù)據(jù)項:
作業(yè)號、作業(yè)進(jìn)入系統(tǒng)的時間(用一整數(shù)表示,如10:10,表示成1010)、估計執(zhí)行時間(單位分)優(yōu)先級(0級最高)
參數(shù)用空格隔開,下面是示例:
1 800 50
2 815 30
3 830 25
4 835 20
5 845 15
6 900 10
7 920 5
其中調(diào)度時刻為最后一個作業(yè)到達(dá)系統(tǒng)的時間!
輸出作業(yè)號!進(jìn)入內(nèi)存的時間!每行輸出一個作業(yè)信息
本程序包括:FIFO,運算時間短的作業(yè)優(yōu)先,優(yōu)先數(shù)調(diào)度算法,響應(yīng)比最高者優(yōu)先調(diào)度算法
#include<iostream.h>
#include<iomanip.h>
#include<string.h>
const int MAXJOB=50; //定義最大作業(yè)
//定義數(shù)據(jù)結(jié)構(gòu)體
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;
//初始化函數(shù)
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;
}
//重置作業(yè)數(shù)據(jù)函數(shù)
void reset()
{ int i;
for(i=0;i<MAXJOB;i++){
jobs[i].start_time=0;
jobs[i].wait_time=0;
jobs[i].visited=0;
}
}
//讀入作業(yè)數(shù)據(jù)函數(shù)
void readData()
{
FILE *fp;
char fname[20];
int i;
cout<<"請輸入作業(yè)數(shù)據(jù)文件名:";
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++;
}
//輸出初始作業(yè)數(shù)據(jù)
cout<<"輸出初始作業(yè)數(shù)據(jù)"<<endl;
cout<<"---------------------------------------------------------------"<<endl;
cout.setf(2);
cout<<setw(10)<<"作業(yè)號"<<setw(12)<<"到達(dá)時間"<<setw(14)<<"所需時間(分)"<<setw(14)<<"優(yōu)先級(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;
//輸出作業(yè)流
cout<<endl;
cout<<endl<<"FIFO算法作業(yè)流"<<endl;
cout<<"---------------------------------------------------------------"<<endl;
cout.setf(2);
cout<<setw(10)<<"作業(yè)號"<<setw(12)<<"到達(dá)時間"<<setw(12)<<"開始時間"<<setw(14)<<"周轉(zhuǎn)時間(分)"<<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<<"總周轉(zhuǎn)時間:"<<total_time<<" 平均周轉(zhuǎn)時間:"<<total_time/quantity<<endl;
}
//運算時間短的作業(yè)優(yōu)先算法
void shorter()
{
int i,j,p;
int current_hour;
int current_minute;
int current_need_time;
int total_time=0;
//輸出作業(yè)流
cout<<endl;
cout<<endl<<"時間短作業(yè)優(yōu)先算法作業(yè)流(開始調(diào)度時刻為最后一個作業(yè)到達(dá)系統(tǒng)的時間)"<<endl;
cout<<"------------------------------------------------------------------------"<<endl;
cout.setf(2);
cout<<setw(10)<<"作業(yè)號"<<setw(12)<<"到達(dá)時間"<<setw(14)<<"所需時間(分)"<<setw(12)<<"開始時間"<<setw(14)<<"周轉(zhuǎn)時間(分)"<<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<<"總周轉(zhuǎn)時間:"<<total_time<<" 平均周轉(zhuǎn)時間:"<<total_time/quantity<<endl;
}
//優(yōu)先數(shù)調(diào)度算法
void privilege()
{
int i,j,p;
int current_hour;
int current_minute;
int current_privilege;
int total_time=0;
//輸出作業(yè)流
cout<<endl;
cout<<endl<<"優(yōu)先數(shù)調(diào)度算法作業(yè)流(開始調(diào)度時刻為最后一個作業(yè)到達(dá)系統(tǒng)的時間)"<<endl;
cout<<"------------------------------------------------------------------------"<<endl;
cout.setf(2);
cout<<setw(10)<<"作業(yè)號"<<setw(12)<<"到達(dá)時間"<<setw(14)<<"優(yōu)先級(0>1)"<<setw(12)<<"開始時間"<<setw(14)<<"周轉(zhuǎn)時間(分)"<<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<<"總周轉(zhuǎn)時間:"<<total_time<<" 平均周轉(zhuǎn)時間:"<<total_time/quantity<<endl;
}
//響應(yīng)比最高者優(yōu)先調(diào)度算法
void excellent()
{
int i,j,p;
int current_hour;
int current_minute;
float current_excellent;
int total_time=0;
//輸出作業(yè)流
cout<<endl;
cout<<endl<<"響應(yīng)比高者優(yōu)先調(diào)度算法作業(yè)流(開始調(diào)度時刻為最后一個作業(yè)到達(dá)系統(tǒng)的時間)"<<endl;
cout<<"------------------------------------------------------------------------"<<endl;
cout.setf(2);
cout<<setw(10)<<"作業(yè)號"<<setw(12)<<"到達(dá)時間"<<setw(12)<<"開始時間"<<setw(14)<<"周轉(zhuǎn)時間(分)"<<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<<"總周轉(zhuǎn)時間:"<<total_time<<" 平均周轉(zhuǎn)時間:"<<total_time/quantity<<endl;
}
//顯示版權(quán)信息函數(shù)
void version()
{
cout<<endl<<endl;
cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;
cout<<" ┃ 作業(yè)調(diào)度模擬系統(tǒng) ┃"<<endl;
cout<<" ┠───────────────────────┨"<<endl;
cout<<" ┃ (c)All Right Reserved Neo ┃"<<endl;
cout<<" ┃ sony006@163.com ┃"<<endl;
cout<<" ┃ version 2004 build 1122 ┃"<<endl;
cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;
cout<<endl<<endl;
}
void main()
{
version();
initial();
readData();
FIFO();
shorter();
reset();
privilege();
reset();
excellent();
}
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/FCWORLD/archive/2010/12/04/1896363.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
- 上一篇: 【题解】luogu P1941 飞扬的小
- 下一篇: hdu2095