c语言实现作业调度先来先服务和短进程优先,先来先服务和高响应比优先调度算法C语言实现...
先來先服務(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 友益文书类似软件_团队成员分享 | 港中
- 下一篇: java io体系_java IO流的体