文章出處

實驗二、作業調度模擬程序實驗

專業 13物聯網  姓名 張欣怡 學號 201306104135

一、 實驗目的

(1)加深對作業調度算法的理解;

(2)進行程序設計的訓練。

二、 實驗內容和要求

       用高級語言編寫一個或多個作業調度的模擬程序。

      單道批處理系統的作業調度程序。作業一投入運行,它就占有計算機的一切資源直到作業完成為止,因此調度作業時不必考慮它所需要的資源是否得到滿足,它所運行的時間等因素。

一、 實驗方法、步驟及結果測試

 

  1. 源程序名:壓縮包文件(rarzip)中源程序名 9321.c

可執行程序名:9321.exe

  1. 算法思想:

         作業調度算法:

         1) 采用先來先服務(FCFS)調度算法,即按作業到達的先后次序進行調度。總是首先調度在系統中等待時間最長的作業。

         2) 短作業優先 (SJF) 調度算法,優先調度要求運行時間最短的作業。

         3) 響應比高者優先(HRRN)調度算法,為每個作業設置一個優先權(響應比),調度之前先計算各作業的優先權,優先數高者優先調度。RP (響應比) 作業周轉時間 / 作業運行時間=1+作業等待時間/作業運行時間。

          每個作業由一個作業控制塊JCB表示,JCB可以包含以下信息:作業名、提交(到達)時間、所需的運行時間、所需的資源、作業狀態、鏈指針等等。

         作業的狀態可以是等待WWait)、運行RRun)和完成FFinish)三種之一。每個作業的最初狀態都是等待W

   在短優先作業調度算法中和最高響應比算法中,運用了冒泡排序的算法進行排序。運用結構體和數組進行作業的存儲。

  1. 主要程序段及其解釋:

#include<stdio.h>
#include<stdlib.h>
#include <conio.h>


struct Job {
//定義作業控制塊JCB
char name[10]; //作業名
float subtime; //作業提交時間
float runtime; //作業所需的運行時間

float Tb; //作業運行時刻
float Tc; //作業完成時刻
float Ti; //周轉時間
float Wi; //帶權周轉時間

};


int input(struct Job *j,int n);//輸入作業內容
void output(struct Job *j,int n);//輸出作業內容
void FCFS(struct Job *j,int n);
float addallruntime(struct Job *j,int n);//得到總的時間
void SJF(struct Job *j,int n,float allruntime);
void HRRF(struct Job *j,int n,float allruntime);
struct Job job[24]={0};
int main()
{
int n=0;
int i;
float a=0.0,b=0.0;//a存放作業平均周轉時間,b存放平均帶權周轉時間
float allruntime=0.0;
printf("*********歡迎使用作業調度模擬系統***********\n");
n=input(job,n);
allruntime=addallruntime(job,n);

printf("\n1.FCFS 2.SJF 3.HRN");
printf("\n請選擇作業調度算法:");
scanf("%d",&i);
if(i==1)
{
FCFS(job,n);
}
else if(i==2)
{
SJF(job,n,allruntime);
}else if(i==3)
{
HRRF(job,n,allruntime);
}
else
{

}

printf("\n*******運行結果*********");

output(job,n);
for(i=0;i<n;i++)
{
a=a+job[i].Ti;
}
a=a/n;
printf("\n此調度的平均周轉時間:%f",a);
for(i=0;i<n;i++)
{
b=b+job[i].Wi;
}
b=b/n;
printf("\n此調度的帶權平均周轉時間:%f\n",b);

return 0;
}
int input(struct Job *j,int n)//輸入作業
{

int i;
printf("請輸入作業數:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("\n作業號%d:",i);
printf("\n請輸入作業名");
scanf("%s",job[i].name);


printf("\n請輸入作業提交時刻");
scanf("%f",&job[i].subtime);

printf("\n請輸入作業運行時間");
scanf("%f",&job[i].runtime);


}

return n;

}
void output(struct Job *j,int n)//打印輸出作業信息

{
int i;
printf("\n各個作業的情況");
printf("\n作業名");

printf(" 作業運行時刻");
printf(" 作業完成時刻");
printf(" 周轉時間");
printf(" 帶權周轉時間");



for(i=0;i<n;i++)
{

printf("\n%s",j[i].name);

printf(" %5.2f",j[i].Tb);
printf(" %5.2f",j[i].Tc);
printf(" %5.2f",j[i].Ti);
printf(" %5.2f",j[i].Wi);
}

}

float addallruntime(struct Job *j,int n)//得到所有作業運行時間
{
int i;
float allruntime=0.0;
for(i=0;i<n;i++)
{


allruntime=allruntime+job[i].runtime;
}
return allruntime;
}

void FCFS(struct Job *j,int n)
{
int i;
j[0].Tb=j[0].subtime;
j[0].Tc=j[0].Tb+j[0].runtime;
j[0].Ti=j[0].Tc-j[0].subtime;
j[0].Wi=j[0].Ti/j[0].runtime;
for(i=1;i<n;i++)
{

j[i].Tb=j[i-1].Tc;
j[i].Tc=j[i].Tb+j[i].runtime;
j[i].Ti=j[i].Tc-j[i].subtime;
j[i].Wi=j[i].Ti/j[i].runtime;

}
}
void SJF(struct Job *j,int n,float allruntime)
{
float mintime=0;
struct Job jtemp={0};

int min=0;

int startwork=0;
float i;
int k;
for(i=0;i<allruntime;)
{
mintime=j[startwork].runtime;//假設一個剩余時間的最小值
for(k=startwork;k<n;k++)
{

if(j[k].runtime<=mintime&&j[k].subtime<=i)//此作業的剩余時間更少則將其記為最少
{
mintime=j[k].runtime;
min=k;
}

}
j[min].Tb=i;

j[min].Tc=j[min].Tb+j[min].runtime;
j[min].Ti=j[min].Tc-j[min].subtime;
j[min].Wi=j[min].Ti/j[min].runtime;

jtemp=j[startwork];
j[startwork]=j[min];
j[min]=jtemp;

startwork++;

i=i+mintime;
}

}
void HRRF(struct Job *j,int n,float allruntime)
{

float maxrb=0;
struct Job jtemp={0};

int z=0;
float time=0;
int startwork=0;
float i;
int k;
for(i=0;i<allruntime;)
{
maxrb=(i-j[startwork].subtime)/j[startwork].runtime+1;//假設是最高響應比

for(k=startwork;k<n;k++)
{



if(j[k].subtime<=i&&(i-j[k].subtime)/j[k].runtime+1>=maxrb)//此作業的最高響應比更高,則將其記為更高
{
time=j[k].runtime;

z=k;
}

}


j[z].Tb=i;
j[z].Tc=j[z].Tb+j[z].runtime;
j[z].Ti=j[z].Tc-j[z].subtime;
j[z].Wi=j[z].Ti/j[z].runtime;

jtemp=j[startwork];
j[startwork]=j[z];
j[z]=jtemp;



startwork++;
i=i+time;
}
}

 

運行結果及分析

 

 

四.        實驗總結

在這次作業調度的實驗中,熟悉了三種(先來先服務,短作業優先,最高響應比優先)作業的調度情況,對于算法的輸入輸出的程序還是比較清楚的,但在算法中,計算的式子還是比較模糊,對于某些計算公式還是不太清楚。但總體在這次實驗中收獲還是多多的。


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()