生活随笔
收集整理的這篇文章主要介紹了
作业调度算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include <stdio.h>
#include <string.h>
#include <conio.h>/*conio.h是一個包含一些字符處理函數的頭文件,如getch(),
getch()是無顯示的從鍵盤接收一個字符,有顯示的接收是getchar()*/
typedef char string[10]; /* //定義string為含有10個字符元素的字符數組類型*/
struct task {
string name; /*作業號*/
int arrTime; /* 作業到達時間*/
int serTime; /*作業要求服務時間*/
int waiTime; /*等待時間*/
int begTime; /*開始運行時間*/
int finTime; /*結束運行時間*/
int turTime; /*周轉時間*/
int wTuTime; /*帶權周轉時間*/
int priority;/*優先權*/
int finish;/*是否已經完成*/
}JCB[5];
int num;
void input()
{
int i;
system("cls");
printf("\nPlease input task number: ");
scanf("%d", &num);
for(i=0;i<num;i++)
{
printf("\nPlease input task NO.%d:\n",i);
printf(" The name of task: ");
scanf("%s",JCB[i].name);
printf(" The time arrive: ");
scanf("%d",&JCB[i].arrTime);
printf(" The time need: ");
scanf("%d",&JCB[i].serTime);
JCB[i].priority = 0;
JCB[i].finish =0;
}
}
int FCFS()
{
int current;
int i,j;
for(i=0; i<num; i++)
{
if(!JCB[i].finish)
{
current=i; /* 找到第一個還沒完成的作業*/
break;
}
}
for( j=i; j<num; j++) /* 和后面的作業比較*/
{
if(!JCB[j].finish && JCB[j].arrTime<JCB[current].arrTime)
{
current=j; /*找出先來的未完成作業*/
}
}
return current; /* 返回當前作業*/
}
int SJF(int pre)
{
int current,i,j;
for(i=0; i<num; i++)
{
if(!JCB[i].finish)
{
current=i; /*找到第一個還沒完成的作業*/
break;
}
}
for(j=i; j<num; j++) /* 和后面的作業比較*/
{
if( !JCB[j].finish) /* 還沒完成(運行)*/
{
if(JCB[current].arrTime<=JCB[pre].finTime)/*如果作業在上一個作業完成之前到達*/
{
if(JCB[j].arrTime<=JCB[pre].finTime && JCB[j].serTime<JCB[current].serTime )
current=j; /* 找出到達時間在上一個作業完成之前,服務時間比較小的未完成作業*/
}
else /*如果作業是在上一個作業完成之后到達*/
{
if(JCB[j].arrTime<JCB[current].arrTime)
current=j; /*找出比較早到達的一個*/
if(JCB[j].arrTime==JCB[current].arrTime) /*如果同時到達*/
if(JCB[j].serTime<JCB[current].serTime)
current=j; /*找出服務時間比較短的一個*/
}
}
}
return current; /*返回當前作業*/
}
int HRN(int pre)
{
int current=1,i,j;
/* 優先權 =(等待時間+服務時間)/服務時間*/
for(i=0; i<num; i++)
{
JCB[i].waiTime=JCB[pre].finTime-JCB[i].arrTime; /*等待時間 =上一個作業的完成時間-到達時間*/
JCB[i].priority=(JCB[i].waiTime+JCB[i].serTime)/JCB[i].serTime;
}
for(i=0; i<num; i++)
{
if(!JCB[i].finish)
{
current=i; /*找到第一個還沒完成的作業*/
break;
}
}
for( j=i; j<num; j++) /*和后面的作業比較*/
{
if( !JCB[j].finish) /* 還沒完成(運行)*/
{
if(JCB[current].arrTime<=JCB[pre].finTime) /*如果作業在上一個作業完成之前到達*/
{
if(JCB[j].arrTime<=JCB[pre].finTime && JCB[j].priority>JCB[current].priority )
current=j;/* 找出到達時間在上一個作業完成之前,優先權高的作業*/
}
else /* 如果作業是在上一個作業完成之后到達*/
{
if(JCB[j].arrTime<JCB[current].arrTime)
current=j; /* 找出比較早到達的一個*/
if(JCB[j].arrTime==JCB[current].arrTime) /* 如果同時到達*/
if(JCB[j].priority>JCB[current].priority)
current=j; /*找出服務時間比較短的一個*/
}
}
}
return current;/*返回當前作業*/
}
void runing(int i, int times, int pre, int staTime, int endTime)
{
if(times==0)
{
JCB[i].begTime=JCB[i].arrTime;
JCB[i].finTime=JCB[i].begTime+JCB[i].serTime;
JCB[i].turTime=JCB[i].serTime;
JCB[i].wTuTime=1.0;
staTime=JCB[i].begTime;
}
else
{
if(JCB[i].arrTime>JCB[pre].finTime)
JCB[i].begTime=JCB[i].arrTime;
else
JCB[i].begTime=JCB[pre].finTime;
JCB[i].finTime=JCB[i].begTime+JCB[i].serTime;
JCB[i].turTime=JCB[i].finTime-JCB[i].arrTime;
JCB[i].wTuTime=JCB[i].turTime/JCB[i].serTime;
}
if(times==num-1)
endTime=JCB[i].finTime;
JCB[i].finish=1;
}
void print(int i,int times)
{
if(times==0)
{
printf(" name arrTime serTime begTime finTime turTime wTuTime\n");
}
printf("%9s%9d%9d%9d%9d%9df%9df\n",
JCB[i].name,JCB[i].arrTime,JCB[i].serTime,
JCB[i].begTime,JCB[i].finTime,JCB[i].turTime,JCB[i].wTuTime);
}
void check( )
{
int i;
int staTime, endTime, sumTurTime=0.0, sumWTuTime=0.0, aveTurTime, aveWTuTime;
int current=0, times=0, pre=0;
JCB[pre].finTime=0;
printf("\n-- FCFS -----------------------------------------------------------------\n");
for(times=0; times<num; times++)
{
current=FCFS();
runing(current, times, pre, staTime, endTime);
print(current, times);
pre=current;
}
for(i=0; i<num; i++)
{
sumTurTime+=JCB[i].turTime;
sumWTuTime+=JCB[i].wTuTime;
}
aveTurTime=sumTurTime/num;
aveWTuTime=sumWTuTime/num;
printf("(total) %9.2f%9.2f%9.2f%9.2f\n",staTime,endTime,aveTurTime,aveWTuTime);
printf("-------------------------------------------------------------------------\n");
for(i=0; i<num; i++)
{
JCB[i].finish=0;
}
staTime, endTime, sumTurTime=0.0, sumWTuTime=0.0, aveTurTime, aveWTuTime;
current=0; times=0; pre=0;
JCB[pre].finTime=0;
printf("\n-- SJF ------------------------------------------------------------------\n");
for(times=0; times<num; times++)
{
current=SJF(pre);
runing(current, times, pre, staTime, endTime);
print(current, times);
pre=current;
}
for(i=0; i<num; i++)
{
sumTurTime+=JCB[i].turTime;
sumWTuTime+=JCB[i].wTuTime;
}
aveTurTime=sumTurTime/num;
aveWTuTime=sumWTuTime/num;
printf("(total) %9d%9d%9d%9d\n",staTime,endTime,aveTurTime,aveWTuTime);
printf("-------------------------------------------------------------------------\n");
for(i=0; i<num; i++)
{
JCB[i].finish=0;
}
staTime, endTime, sumTurTime=0.0, sumWTuTime=0.0, aveTurTime, aveWTuTime;
current=0; times=0; pre=0;
JCB[pre].finTime=0;
printf("\n-- HRN ------------------------------------------------------------------\n");
for(times=0; times<num; times++)
{
current=HRN(pre);
runing(current, times, pre, staTime, endTime);
print(current, times);
pre=current;
}
for(i=0; i<num; i++)
{
sumTurTime+=JCB[i].turTime;
sumWTuTime+=JCB[i].wTuTime;
}
aveTurTime=sumTurTime/num;
aveWTuTime=sumWTuTime/num;
printf("(total) %9d%9d%9d f%9df\n",staTime,endTime,aveTurTime,aveWTuTime);
printf("-------------------------------------------------------------------------\n");
}
void main()
{
char again;
do {
system("cls"); /*清屏*/
printf("please input 4 groups of datas:\n");
input();
check();
printf("Continue...(Y/N): ");
do{
again = getch();
}while(again!='Y' && again!='y' && again!='N' && again!='n');
}while(again=='Y' || again=='y');
}
總結
以上是生活随笔為你收集整理的作业调度算法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。