日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

c语言实现作业调度先来先服务和短进程优先,先来先服务和高响应比优先调度算法C语言实现...

發(fā)布時間:2023/12/10 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言实现作业调度先来先服务和短进程优先,先来先服务和高响应比优先调度算法C语言实现... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

先來先服務(wù)和高響應(yīng)比優(yōu)先調(diào)度算法C語言實現(xiàn)

1、進(jìn)程調(diào)度與作業(yè)調(diào)度的區(qū)別:

作業(yè)調(diào)度:根據(jù)作業(yè)控制塊(JCB)中的信息,檢查系統(tǒng)中的資源是否滿足作業(yè)對資源的需求,以及按照一定的調(diào)度算法,從外存的后備隊列中選取某些作業(yè)調(diào)入內(nèi)存,并為它們創(chuàng)建進(jìn)程,分配必要的資源。然后再將新創(chuàng)建的進(jìn)程排在就緒隊列上等待調(diào)度。

進(jìn)程調(diào)度:保存當(dāng)前進(jìn)程的處理機(jī)的現(xiàn)場信息,如程序計數(shù)器、多個通用寄存器中的內(nèi)容等,然后按某種算法從就緒隊列中選取一個進(jìn)程,將其狀態(tài)轉(zhuǎn)換為運(yùn)行狀態(tài),再把進(jìn)程控制塊內(nèi)有關(guān)處理機(jī)現(xiàn)場的信息裝入處理器相應(yīng)的各個寄存器中,把處理器的控制權(quán)交予該進(jìn)程,讓它從上次的斷點處恢復(fù)運(yùn)行。

進(jìn)程調(diào)度時讓某個就緒狀態(tài)的進(jìn)程到處理機(jī)上運(yùn)行,而作業(yè)調(diào)度只是使作業(yè)具有了競爭處理機(jī)的機(jī)會。

2、單道批處理系統(tǒng)與多道批處理系統(tǒng)的區(qū)別:

(1)單道批處理系統(tǒng)(Simple Batch Processing System):系統(tǒng)對作業(yè)的處理是成批進(jìn)行的,但在內(nèi)存中始終只保持一道作業(yè)。

特點:自動性、順序性、單道性

主要問題:CPU與I/O設(shè)備忙閑不均,對計算為主的作業(yè),外設(shè)空閑;對I/O為主的作業(yè),CPU空閑。

多道批處理系統(tǒng)(Multiprogrammed Batch Processing System):在內(nèi)存中同時存放幾個作業(yè),宏觀上并行運(yùn)行——都處于運(yùn)行狀態(tài),但都沒運(yùn)行完;微觀上串行運(yùn)行——各作業(yè)交替使用CPU

特點:調(diào)度性、無序性、多道性

主要問題:①作業(yè)平均周轉(zhuǎn)時間長:短作業(yè)的周轉(zhuǎn)時間顯著增長;

②無交互能力:整個作業(yè)完成后或者中間出錯時,才與用戶交互,不利于調(diào)試和修改。

3、用到的公式:

完成時間 = 開始時間 +需要運(yùn)行時間

周轉(zhuǎn)時間 = 完成時間 -到達(dá)時間

帶權(quán)周轉(zhuǎn)時間 = 需要運(yùn)行時間/周轉(zhuǎn)時間

等待時間 = 當(dāng)前時間 -到達(dá)時間

優(yōu)先權(quán) = (等待時間 +需要運(yùn)行時間) /需要運(yùn)行時間

4、高響應(yīng)比優(yōu)先算法特點:

①當(dāng)?shù)却龝r間相同時,短進(jìn)程的優(yōu)先權(quán)高;

②當(dāng)需要運(yùn)行時間相同時,作業(yè)的優(yōu)先權(quán)又取決于等待時間,相當(dāng)于先到先服務(wù);

③長作業(yè)的優(yōu)先級可以隨著等待時間的增加而提高,因此長作業(yè)等待一段時間后仍能得到調(diào)度。

5、源代碼:

#include

#include

#include

#define WAIT "Wait"//就緒狀態(tài)

#define RUN "Run"//運(yùn)行狀態(tài)

#define FINISH "Finish"//完成狀態(tài)

#define JOBNUMBER 5 //設(shè)置進(jìn)程測試數(shù)為5

typedef struct JCB{

char jobName[10];//作業(yè)名

int arriveTime;//到達(dá)時間

int runTime;//需要運(yùn)行時間

int startTime;//開始時間

int endTime;//完成時間

int turnoverTime;//周轉(zhuǎn)時間

float useWeightTurnoverTime;//帶權(quán)周轉(zhuǎn)時間

char processStatus[10];//進(jìn)程狀態(tài)

};

static int currentTime = 0;//當(dāng)前時間

static int finishNumber = 0;//進(jìn)程完成數(shù)量

char JobArray[JOBNUMBER][10];//存放數(shù)組名信息的二元數(shù)組

float priority[JOBNUMBER];//存放進(jìn)程優(yōu)先級的一元數(shù)組

//創(chuàng)建JCB

void createJCB(struct JCB* jcb){

freopen("input.txt","r",stdin);

printf("從文件中讀入三個參數(shù)的數(shù)據(jù):\n");

printf("作業(yè)號 到達(dá)時間 需要運(yùn)行時間\n");

for(int i = 0; i < 5; i++){

scanf("%s", &jcb[i].jobName);//作業(yè)號

scanf("%d", &jcb[i].arriveTime);//到達(dá)時間

scanf("%d", &jcb[i].runTime);//需要運(yùn)行時間

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āng)前時間為%d\n", currentTime);

printf("作業(yè)號 到達(dá)時間 需要運(yùn)行時間 開始時間 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間 進(jìn)程狀態(tài)\n");

for(int i = 0; i < JOBNUMBER; i++){

if(strcmp(jcb[i].processStatus, FINISH) == 0)//如果進(jìn)程為finish狀態(tài),這樣輸出

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)//如果進(jìn)程為run狀態(tài),這樣輸出

printf("%s\t%d\t%4d\t\t%d\t運(yùn)行中\(zhòng)t none\t none %s\n", jcb[i].jobName, jcb[i].arriveTime, jcb[i].runTime, jcb[i].startTime, jcb[i].processStatus);

else //如果進(jìn)程為wait狀態(tài),這樣輸出

printf("%s\t%d\t%4d\t\t未運(yùn)行\(zhòng)tnone\t none\t none %s\n", jcb[i].jobName, jcb[i].arriveTime, jcb[i].runTime, jcb[i].processStatus);

}

printf("---------------------------------------------\n");

}

//計算平均帶權(quán)周轉(zhuǎn)時間

float weightTurnoverTimeCount(struct JCB* jcb){

float sum = 0.0;

for(int i = 0; i < JOBNUMBER; i++)

sum += jcb[i].useWeightTurnoverTime;

return sum / JOBNUMBER;

}

//計算平均周轉(zhuǎn)時間

float turnOverTimeCount(struct JCB* jcb){

float sum = 0.0;

for(int i = 0; i < JOBNUMBER; i++)

sum += jcb[i].turnoverTime;

return sum / JOBNUMBER;

}

//比較各個進(jìn)程之間的到達(dá)時間,按升序排列

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;

}

}

//打印進(jìn)程調(diào)度順序,平均周轉(zhuǎn)時間及平均帶權(quán)周轉(zhuǎn)時間

void printInfo(struct JCB* jcb){

printf("1、進(jìn)程調(diào)度順序為:%s -> %s -> %s -> %s -> %s\n", JobArray[0], JobArray[1], JobArray[2], JobArray[3], JobArray[4]);

printf("2、平均周轉(zhuǎn)時間為:%.2f\n",turnOverTimeCount(jcb));

printf("3、平均帶權(quán)周轉(zhuǎn)時間為:%.2f\n", weightTurnoverTimeCount(jcb));

printf("------------------測試完畢 版權(quán)歸鄧欽藝所有---------\n");

}

//兩算法共同循環(huá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++;

}

}

}

//先來先服務(wù)調(diào)度算法

void firstComeFirstServed(struct JCB* jcb){

createJCB(jcb);

compare(jcb);

int i = 0;

//進(jìn)程調(diào)度currentTime每次加1,直到進(jìn)程全部被調(diào)度完成為止

for(; finishNumber != JOBNUMBER; currentTime++){

if(currentTime < jcb[0].arriveTime)//當(dāng)前時間小于第一個節(jié)點到來時間時,直接打印

printJob(jcb);

else{

strcpy(JobArray[i], jcb[i].jobName);

loop(jcb, i);

i++;

}

}

printInfo(jcb);//打印進(jìn)程調(diào)度順序,平均周轉(zhuǎn)時間及平均帶權(quán)周轉(zhuǎn)時間

currentTime = 0;//靜態(tài)變量當(dāng)前時間置位

finishNumber = 0;//靜態(tài)變量完成進(jìn)程數(shù)量置位

}

//高響應(yīng)比優(yōu)先調(diào)度算法

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)//當(dāng)前時間小于第一個節(jié)點到來時間時,直接打印

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);//打印進(jìn)程調(diào)度順序,平均周轉(zhuǎn)時間及平均帶權(quán)周轉(zhuǎn)時間

currentTime = 0;//當(dāng)前時間置位

finishNumber = 0;//完成進(jìn)程數(shù)量置位

}

//菜單函數(shù)

void menu(struct JCB* jcb){

int input;

while(true){

printf("------------3114005847 鄧欽藝-----------------\n");

printf("| 1、先來先服務(wù)調(diào)度算法 |\n");

printf("| 2、響應(yīng)比高者優(yōu)先調(diào)度算法 |\n");

printf("| 3、退出 |\n");

printf("----------------------------------------------\n");

printf("請輸入序號以繼續(xù)程序:");

scanf("%d", &input);

switch(input){

case 1:firstComeFirstServed(jcb);

break;

case 2:highestResponseRatioNext(jcb);

break;

case 3:

exit(0);

default:printf("輸入有誤,請重新輸入!!!\n");

break;

}

}

}

//主函數(shù)

int main(){

struct JCB jcb[JOBNUMBER];

menu(jcb);

system("pause");

return 0;

}

6、運(yùn)行結(jié)果:

①測試用例:其中三個參數(shù)分別是作業(yè)名稱,到達(dá)時間以及需要運(yùn)行時間

②主菜單顯示:

③先來先服務(wù)算法調(diào)度結(jié)果:

④高響應(yīng)比優(yōu)先算法調(diào)度:

總結(jié)

以上是生活随笔為你收集整理的c语言实现作业调度先来先服务和短进程优先,先来先服务和高响应比优先调度算法C语言实现...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。