c语言实现作业调度先来先服务和短进程优先,先来先服务和高响应比优先调度算法C语言实现...
先來先服務和高響應比優先調度算法C語言實現
1、進程調度與作業調度的區別:
作業調度:根據作業控制塊(JCB)中的信息,檢查系統中的資源是否滿足作業對資源的需求,以及按照一定的調度算法,從外存的后備隊列中選取某些作業調入內存,并為它們創建進程,分配必要的資源。然后再將新創建的進程排在就緒隊列上等待調度。
進程調度:保存當前進程的處理機的現場信息,如程序計數器、多個通用寄存器中的內容等,然后按某種算法從就緒隊列中選取一個進程,將其狀態轉換為運行狀態,再把進程控制塊內有關處理機現場的信息裝入處理器相應的各個寄存器中,把處理器的控制權交予該進程,讓它從上次的斷點處恢復運行。
進程調度時讓某個就緒狀態的進程到處理機上運行,而作業調度只是使作業具有了競爭處理機的機會。
2、單道批處理系統與多道批處理系統的區別:
(1)單道批處理系統(Simple Batch Processing System):系統對作業的處理是成批進行的,但在內存中始終只保持一道作業。
特點:自動性、順序性、單道性
主要問題:CPU與I/O設備忙閑不均,對計算為主的作業,外設空閑;對I/O為主的作業,CPU空閑。
多道批處理系統(Multiprogrammed Batch Processing System):在內存中同時存放幾個作業,宏觀上并行運行——都處于運行狀態,但都沒運行完;微觀上串行運行——各作業交替使用CPU
特點:調度性、無序性、多道性
主要問題:①作業平均周轉時間長:短作業的周轉時間顯著增長;
②無交互能力:整個作業完成后或者中間出錯時,才與用戶交互,不利于調試和修改。
3、用到的公式:
完成時間 = 開始時間 +需要運行時間
周轉時間 = 完成時間 -到達時間
帶權周轉時間 = 需要運行時間/周轉時間
等待時間 = 當前時間 -到達時間
優先權 = (等待時間 +需要運行時間) /需要運行時間
4、高響應比優先算法特點:
①當等待時間相同時,短進程的優先權高;
②當需要運行時間相同時,作業的優先權又取決于等待時間,相當于先到先服務;
③長作業的優先級可以隨著等待時間的增加而提高,因此長作業等待一段時間后仍能得到調度。
5、源代碼:
#include
#include
#include
#define WAIT "Wait"//就緒狀態
#define RUN "Run"//運行狀態
#define FINISH "Finish"//完成狀態
#define JOBNUMBER 5 //設置進程測試數為5
typedef struct JCB{
char jobName[10];//作業名
int arriveTime;//到達時間
int runTime;//需要運行時間
int startTime;//開始時間
int endTime;//完成時間
int turnoverTime;//周轉時間
float useWeightTurnoverTime;//帶權周轉時間
char processStatus[10];//進程狀態
};
static int currentTime = 0;//當前時間
static int finishNumber = 0;//進程完成數量
char JobArray[JOBNUMBER][10];//存放數組名信息的二元數組
float priority[JOBNUMBER];//存放進程優先級的一元數組
//創建JCB
void createJCB(struct JCB* jcb){
freopen("input.txt","r",stdin);
printf("從文件中讀入三個參數的數據:\n");
printf("作業號 到達時間 需要運行時間\n");
for(int i = 0; i < 5; i++){
scanf("%s", &jcb[i].jobName);//作業號
scanf("%d", &jcb[i].arriveTime);//到達時間
scanf("%d", &jcb[i].runTime);//需要運行時間
jcb[i].startTime = 0;
jcb[i].endTime = 0;
jcb[i].turnoverTime = 0;
jcb[i].useWeightTurnoverTime = 0.0;
strcpy(jcb[i].processStatus, WAIT);
printf("%s\t%d\t%d\n",jcb[i].jobName, jcb[i].arriveTime,jcb[i].runTime);
}
printf("---------------------------------------------\n");
freopen("CON", "r", stdin);
}
//打印用途
void printJob(struct JCB* jcb){
printf("當前時間為%d\n", currentTime);
printf("作業號 到達時間 需要運行時間 開始時間 完成時間 周轉時間 帶權周轉時間 進程狀態\n");
for(int i = 0; i < JOBNUMBER; i++){
if(strcmp(jcb[i].processStatus, FINISH) == 0)//如果進程為finish狀態,這樣輸出
printf("%s\t%d\t%4d\t\t%d\t%d\t %d\t %.2f\t %s\n", jcb[i].jobName, jcb[i].arriveTime, jcb[i].runTime, jcb[i].startTime, jcb[i].endTime, jcb[i].turnoverTime, jcb[i].useWeightTurnoverTime, jcb[i].processStatus);
else if(strcmp(jcb[i].processStatus, RUN) == 0)//如果進程為run狀態,這樣輸出
printf("%s\t%d\t%4d\t\t%d\t運行中\t none\t none %s\n", jcb[i].jobName, jcb[i].arriveTime, jcb[i].runTime, jcb[i].startTime, jcb[i].processStatus);
else //如果進程為wait狀態,這樣輸出
printf("%s\t%d\t%4d\t\t未運行\tnone\t none\t none %s\n", jcb[i].jobName, jcb[i].arriveTime, jcb[i].runTime, jcb[i].processStatus);
}
printf("---------------------------------------------\n");
}
//計算平均帶權周轉時間
float weightTurnoverTimeCount(struct JCB* jcb){
float sum = 0.0;
for(int i = 0; i < JOBNUMBER; i++)
sum += jcb[i].useWeightTurnoverTime;
return sum / JOBNUMBER;
}
//計算平均周轉時間
float turnOverTimeCount(struct JCB* jcb){
float sum = 0.0;
for(int i = 0; i < JOBNUMBER; i++)
sum += jcb[i].turnoverTime;
return sum / JOBNUMBER;
}
//比較各個進程之間的到達時間,按升序排列
void compare(struct JCB* jcb){
for(int i = 0; i < JOBNUMBER; i++){
int min = jcb[i].arriveTime, minIndex = i;
for(int j = i + 1; j < JOBNUMBER; j++){
if(jcb[j].arriveTime < min){
min = jcb[j].arriveTime;
minIndex = j;
}
}
struct JCB temp = jcb[i];
jcb[i] = jcb[minIndex];
jcb[minIndex] = temp;
}
}
//打印進程調度順序,平均周轉時間及平均帶權周轉時間
void printInfo(struct JCB* jcb){
printf("1、進程調度順序為:%s -> %s -> %s -> %s -> %s\n", JobArray[0], JobArray[1], JobArray[2], JobArray[3], JobArray[4]);
printf("2、平均周轉時間為:%.2f\n",turnOverTimeCount(jcb));
printf("3、平均帶權周轉時間為:%.2f\n", weightTurnoverTimeCount(jcb));
printf("------------------測試完畢 版權歸鄧欽藝所有---------\n");
}
//兩算法共同循環遍歷部分
void loop(struct JCB* jcb, int i){
jcb[i].startTime = currentTime;
jcb[i].endTime = jcb[i].startTime + jcb[i].runTime;
jcb[i].turnoverTime = jcb[i].endTime - jcb[i].arriveTime;
jcb[i].useWeightTurnoverTime = jcb[i].runTime * 1.0 / jcb[i].turnoverTime;
strcpy(jcb[i].processStatus, RUN);
while(true){
if(currentTime == jcb[i].endTime){
strcpy(jcb[i].processStatus, FINISH);
finishNumber++;
if(finishNumber == JOBNUMBER)
printJob(jcb);
currentTime--;
break;
}
else{
printJob(jcb);
currentTime++;
}
}
}
//先來先服務調度算法
void firstComeFirstServed(struct JCB* jcb){
createJCB(jcb);
compare(jcb);
int i = 0;
//進程調度currentTime每次加1,直到進程全部被調度完成為止
for(; finishNumber != JOBNUMBER; currentTime++){
if(currentTime < jcb[0].arriveTime)//當前時間小于第一個節點到來時間時,直接打印
printJob(jcb);
else{
strcpy(JobArray[i], jcb[i].jobName);
loop(jcb, i);
i++;
}
}
printInfo(jcb);//打印進程調度順序,平均周轉時間及平均帶權周轉時間
currentTime = 0;//靜態變量當前時間置位
finishNumber = 0;//靜態變量完成進程數量置位
}
//高響應比優先調度算法
void highestResponseRatioNext(struct JCB* jcb){
createJCB(jcb);
compare(jcb);
int i = 0, j = 0;
for(; finishNumber != JOBNUMBER; currentTime++){
float maxPriority = 0.0;
int indexPriority = 0;
if(currentTime < jcb[0].arriveTime)//當前時間小于第一個節點到來時間時,直接打印
printJob(jcb);
else{
for(int i = 0; i < JOBNUMBER; i++){
if(strcmp(jcb[i].processStatus, FINISH) != 0){
int waitTime = currentTime - jcb[i].arriveTime;
priority[i] = (waitTime + jcb[i].runTime) / jcb[i].runTime;
if(priority[i] > maxPriority){
maxPriority = priority[i];
indexPriority = i;
}
}
}
strcpy(JobArray[j++], jcb[indexPriority].jobName);
loop(jcb, indexPriority);
}
}
printInfo(jcb);//打印進程調度順序,平均周轉時間及平均帶權周轉時間
currentTime = 0;//當前時間置位
finishNumber = 0;//完成進程數量置位
}
//菜單函數
void menu(struct JCB* jcb){
int input;
while(true){
printf("------------3114005847 鄧欽藝-----------------\n");
printf("| 1、先來先服務調度算法 |\n");
printf("| 2、響應比高者優先調度算法 |\n");
printf("| 3、退出 |\n");
printf("----------------------------------------------\n");
printf("請輸入序號以繼續程序:");
scanf("%d", &input);
switch(input){
case 1:firstComeFirstServed(jcb);
break;
case 2:highestResponseRatioNext(jcb);
break;
case 3:
exit(0);
default:printf("輸入有誤,請重新輸入!!!\n");
break;
}
}
}
//主函數
int main(){
struct JCB jcb[JOBNUMBER];
menu(jcb);
system("pause");
return 0;
}
6、運行結果:
①測試用例:其中三個參數分別是作業名稱,到達時間以及需要運行時間
②主菜單顯示:
③先來先服務算法調度結果:
④高響應比優先算法調度:
總結
以上是生活随笔為你收集整理的c语言实现作业调度先来先服务和短进程优先,先来先服务和高响应比优先调度算法C语言实现...的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 友益文书类似软件_团队成员分享 | 港中
- 下一篇: java io体系_java IO流的体
