最短作业优先调度
Posted 01-李嘉秀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短作业优先调度相关的知识,希望对你有一定的参考价值。
#include<stdio.h>
#define Time int
#define M 100
typedef struct process{
char name[M];//进程名
int priority;//优先数
int reachtime;//到达时间
int needtime;//需要时间
int usedtime;//已用时间
int completetime;//完成时间
int time1;//周转时间内
int time2;//带权周转时间
int state;//进程状态
int Ptime;//时间片大小
}PCB; //进程控制块
int n;
PCB pcb[M];
int pTime;
void print(int n){
int i;
printf("################################最短作业优先进程调度############################\\n");
printf("--------------------------------------------------------------------------------\\n");
printf("进程名 需要时间 到达时间 完成时间 周转时间 带权周转时间\\n");
for(i=0;i<n;i++){
printf("%s\\t %d\\t \\t %d\\t\\t%d\\t\\t%d\\t %d\\n",pcb[i].name,pcb[i].needtime,pcb[i].reachtime,pcb[i].completetime,pcb[i].time1,pcb[i].time2);
}
printf("--------------------------------------------------------------------------------\\n");
}
void SJsort(int n){
int i;
int j;
int a=0;
int b;
PCB temp;
//判断
for(b=0;b<n;b++){
a=a+pcb[b].needtime;
if(a>=pcb[n-1].reachtime){
printf("%d\\n",b+1);
break;
}
}
for(i=b+1;i<n;i++){
for(j=i;j<n;j++){
if(pcb[i].needtime>pcb[j].needtime){
temp=pcb[j];
pcb[j]=pcb[i];
pcb[i]=temp;
}
}
}
}
void main(){
int i;
int j;
float avertime1=0.00;
float avertime2=0.00;
PCB temp;
printf("请输入进程数:");
scanf("%d",&n);
for(i=0;i<n;i++){
printf("\\n请输入进程名:");
scanf("%s",&pcb[i].name);
printf("请输入需要的时间:");
scanf("%d",&pcb[i].needtime);
printf("请输入到达的时间:");
scanf("%d",&pcb[i].reachtime);
}
SJsort(n);
print(n);
for(i=0;i<n;i++){
while(pcb[i].needtime!=0){
printf("\\n请按任意键继续......\\n");
printf("\\n");
fflush(stdin);
getchar();
printf(" 当前运行的程序是:\\n");
printf("--------------------------------------------------------------------------------\\n");
printf("进程名 需要时间 到达时间 完成时间 周转时间 带权周转时间\\n");
if(i==0){
pcb[i].completetime=pcb[i].needtime+pcb[i].reachtime;//计算完成时间
}
else{
pcb[i].completetime=pcb[i-1].completetime+pcb[i].needtime;//计算完成时间
}
pcb[i].time1=pcb[i].completetime-pcb[i].reachtime;//计算周转时间
pcb[i].time2=pcb[i].time1/pcb[i].needtime;//计算带权周转时间
printf("%s\\t %d\\t \\t %d\\t\\t%d\\t\\t%d\\t %d\\n",pcb[i].name,pcb[i].needtime,pcb[i].reachtime,pcb[i].completetime,pcb[i].time1,pcb[i].time2);
printf("--------------------------------------------------------------------------------\\n");
pcb[i].needtime=0;
printf("\\n");
print(n);
}
}
for(i=0;i<n;i++){
avertime1=avertime1+pcb[i].time1;
avertime2=avertime2+pcb[i].time2;
}
printf("该进程的平均周转时间是:");
printf("%.2f\\n",avertime1/n);
printf("该进程的平均带全周转时间是:");
printf("%.2f\\n",avertime2/n);
printf(" 提示:最短作业优先进程调度结束!\\n");
}
以上是关于最短作业优先调度的主要内容,如果未能解决你的问题,请参考以下文章
(王道408考研操作系统)第二章进程管理-第二节2:调度算法评价指标
操作系统王道考研 p15 调度算法:先来先服务最短作业优先最高响应比优先
调度算法先来先服务(FCFS)最短作业优先(SJF)和最高响应比优先(HRRN)算法