最短作業優先演算法(不完善)
阿新 • • 發佈:2019-02-03
最短作業優先(SJF)
問題描述:
最短作業優先(SJF)是一種除錯任務請求的除錯策略。每個任務請求都含有請求時間(即向系統提交請求的時間)和持續時間(即完成任務所需時間)屬性。當前任務完成後,SJF策略選擇最短持續時間的任務執行;如果多個任務具有相同持續時間,那麼選擇請求時間最早的任務。任務的等待時間為實際開始的時間和請求時間的差值。
給定任務的請求時間和持續時間列表,設計一個程式,使用短作業優先演算法求平均等待時間。
函式說明
實現方法:
float minWaitingTime(int *requestTimes,int *durations,int n)
輸入:requestTimes 表示任務請求時間的整數列表;durations 表示任務持續時間的整數列表;n 表示任務的數量。
輸出:返回使用**非搶佔式**SJF排程而計算出的所有任務平均等待時間浮點數。
舉例:
當requestTimes={0,2,4,5},durations={7,4,1,4},n=4
時,返回平均等待時間為4.000000。
下面為個人寫的實現程式碼,有某些用例測試無法通過:
float minWaitingTime(int *requestTimes,int *durations,int n)
{
/*方法一:自己所寫*/
int ctime=0; //當前時間
int *wtime=(int*)malloc(n*sizeof(int)); //每個作業的等待時間
int *flag=(int*)malloc(n*sizeof(int)); //每個作業是否執行的標誌,若執行則置1
int i=0; //總迴圈變數
int next=0; //下一個進入處理的作業序號
int min=500; //最短的作業執行時間隨,開始的時候便取個很大的值
float totaltime=0;
for(;i<n;i++) //初始將每個作業等待時間和其標誌都置0
{
wtime[i]=0;
flag[i]=0;
}
for(i=0;i<n;i++)
{
if(i==0) //第一次執行的時候,不用考慮作業的執行時間長短,直接把requestTimes[0]==0所對應的那個作業投入執行 &&requestTimes[0]==0
{
//if(requestTimes[0]!=0) ctime+=requestTimes[0];
flag[i]=1;
ctime+=durations[i];
for(int j=0;j<n;j++) //只有當該作業還沒被執行時,才能累加等待時間
{
if(flag[j]==0)
{
wtime[j]=ctime-requestTimes[j];
}
}
}
else //if(requestTimes[0]!=0)
{
for(int k=0;k<n;k++) //找出剩下的作業中,執行時間最短的一個
{
if(flag[k]==0) //如果其標誌為0,則是剩下的沒有執行的作業
{
if(durations[k]<min) //找出執行時間最小的那個
{
min=durations[k];
next=k;
}
}
}
flag[next]=1; //將最小執行時間那個作業置1,表示它被運行了
ctime=ctime+min; //此時系統時間加上最小的執行時間
min=500; //又要將min取到非常非常大以進入下一次迴圈
for(int m=0;m<n;m++)
{
if(flag[m]==0) //當該作業還沒被執行時,才能累加等待時間
{
wtime[m]=ctime-requestTimes[m]; //用當前的系統時間減去它的開始時間,即得到其等待時間
}
}
}
}
for(i=0;i<n;i++) //計算總等待時間
{
totaltime+=wtime[i];
}
return totaltime/n; //返回平均等待時間
/*方法二:參考http://blog.csdn.net/u013749540/article/details/52312910內容
int *flag=(int*)malloc(n*sizeof(int)); //每個作業是否執行的標誌,若執行則置1
int *ready=(int*)malloc(n*sizeof(int)); //還未執行,並且在當前時間前就已經就緒的作業(即處於等待狀態)
int ready_n=0; //還未執行並且已經處於等待狀態的作業數
int ctime=0; //當前時間
float wtime=0; //已執行作業的總等待時間
int current=0; //當前作業的序號
int next=0; //下一個進入處理的作業序號
int min=500; //最短的作業執行時間,開始的時候便取個很大的值
int i=0; //總迴圈變數
for(;i<n;i++) //初始將每個作業等待時間和其標誌都置0
{
ready[i]=0;
flag[i]=0;
}
for(i=0;i<n;i++)
{
//if(i==0&&requestTimes[0]!=0) ctime=requestTimes[0];
wtime=wtime+(ctime-requestTimes[current]); //已執行的總等待時間=上一次wtime+當前系統時間-作業開始時間
ctime=ctime+durations[current]; //目前的系統時間=上一次ctime+當前作業執行時間
flag[current]=1; //編號為current的作業運行了就將其標誌置1
ready_n=0;
for(int j=0;j<n;j++) //將還未執行並且已經處於等待狀態的作業編號裝入ready[]陣列
{
if(flag[j]==0&&requestTimes[j]<=ctime)
{
ready[ready_n++]=j;
}
}
min=500;
for(int k=0;k<ready_n;k++) //從ready[]陣列中把執行時間最少的那個作業找出來,並將其編號賦給next
{
if(durations[ready[k]]<min)
{
min=durations[ready[k]];
next=ready[k];
}
}
current=next; //將下一個任務賦給當前任務,進入下一次迴圈
}
return wtime/n; //返回平均等待時間
*/
}
void main()
{
int retime[]={0,2,4,5};//{1,1,1,2};//
int drtime[]={7,4,1,4};//{4,3,5,1};//
int n=sizeof(retime)/sizeof(int);
float wt=minWaitingTime(retime,drtime,n);
printf("平均等待時間為:%f\n",wt);
}