作业调度:单道系统下FCFS、SJF、HRRN以及多道系统下
FCFS、优先级调度代码设计
原题:实验⼆ 作业调度---设计测试实验
1.编写并调试⼀个单道系统的作业调度模拟程序。
调度模型:描述调度模型(可以采⽤模块化⽅法并⽤框图说明)
开始程序,选择调度算法,然后输⼊作业信息。不论选什么调度算法,作业均按到达先后顺序排队。如果是FCFS模式,每次调度时取出队头作业运⾏;如果是SJF模式,每次调度遍历队列,到已到达作业中运⾏时间最少的,并取出运⾏;如果是HRRN模式,每次调度遍历队列,到已到达作业中响应⽐最⼤的,并取出运⾏。作业运⾏时,计算该作业的运⾏数据(完成时间,周转时间、带权周转时间等)并打印,且更新这组作业的总周转时间和总带权周转时间。所有作业运⾏完以后,计算这组作业的平均周转时间和平均带权周转时间。
作业调度算法:分别采⽤FCFS、SJF、HRRN的调度算法
要求:
1)定义JCB并操作之。
2)描述作业队列。
⼀个就绪队列,作业按到达先后顺序排队。
3)对每种算法都要求打印每个作业的开始运⾏时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间和带权平均周转时间。⽐较各种算法的优缺点。
FCFS算法只考虑作业的等待时间,忽视了作业的运⾏时间,不利于短作业。⽽SJF算法正好与之相反,只考虑作业运⾏时间,⽽忽视了作业的等待时间,不利于长作业。HRRN算法则是既考虑了作业的等待时间,⼜考虑了作业的运⾏时间,因此既照顾了短作业,⼜不致使长作业的等待时间过长,从⽽改善了处理机调度的性能。不过在某些特殊情况下,HRRN算法的调度结果可能和FCFS算或SJF算法的相同。
编写代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define getjcb(type) (type*)malloc(sizeof(type))
int n;//作业数
float T1=0,T2=0;//所有作业周转时间、带权周转时间总和
int times=0;//系统时间
struct jcb//作业控制块
{
char name[10];//作业标识符或作业名称
int reachtime;//到达时刻
int starttime;//开始运⾏时刻
int needtime;//要求服务时间
int finishtime;//作业完成时刻
float cycletime;//作业周转时间
float cltime;//带权周转时间
char state;//作业状态,R即Ready,W即Waiting,F即Finished
struct jcb *next;//指向作业队列下⼀个作业的JCB
}*ready=NULL,*p,*q;//分别指向队头作业、当前作业,q作为辅助
typedef struct jcb JCB;
void inital()//建⽴作业控制块队列,按先来先服务模式排队
{
int i;
printf("\n输⼊作业数:\n");
scanf("%d", &n);
for(i = 0; i<n; i++)
{
{
p = getjcb(JCB);
printf("\n\n输⼊作业名:\n");
scanf("%s", p->name);
p->reachtime = i;
printf("\n作业默认到达时间:\n%d\n", i);
printf("\n输⼊作业要运⾏的时间:\n");
scanf("%d", &p->needtime);
p->state ='W';
p->next =NULL;
if(ready ==NULL)//如果队空
ready = q = p;//插⼊到队头
else//否则队⾮空
{
q->next = p;//插⼊到队尾
q = p;
}
getchar();//接收信号,继续执⾏程序
}
}
void disp(JCB *q,int m)//显⽰作业的周转时间及带权周转时间等{
printf("\n作业%s正在运⾏,估计其运⾏情况:\n",q->name);    printf("开始运⾏时刻:%d\n",q->starttime);
printf("完成时刻:%d\n",q->finishtime);
printf("周转时间:%f\n",q->cycletime);
printf("带权周转时间:%f\n",q->cltime);
}
void running(JCB *p,int m)//运⾏作业
{
//先将要运⾏的作业从队列中分离出来
if(p == ready)//如果要运⾏作业在队头
{
ready = p->next;//分离队头
p->next =NULL;
}
else//否则从队头逐个查
{
q = ready;
while(q->next!= p) q=q->next;
q->next = p->next;//到后分离
}
//计算作业的完成时间,周转时间等等
p->starttime = times;
p->state ='R';
p->finishtime = p->starttime + p->needtime;
p->cycletime = (float)(p->finishtime - p->reachtime);
p->cltime = (float)(p->cycletime / p->needtime);
T1 += p->cycletime;
T2 += p->cltime;
disp(p, m);//显⽰计算数据
//作业完成,更新系统时间,删除作业
times += p->needtime;
p->state ='F';
printf("\n%s has been finished!\n", p->name);
free(p);
getchar();//接收信号以继续运⾏程序
}
void final()//所有作业运⾏完后打印平均周转时间,平均带权周转时间{
float s,t;
t=T1/n;
s=T2/n;
printf("\n\n作业已经全部完成!\n");
printf("\n%d个作业的平均周转时间是:%f",n,t);
printf("\n%d个作业的平均带权周转时间是:%f\n",n,s);
}
void sjf(int m)//最短作业优先模式
{
JCB *min;//指向最短作业
int i,iden;
system("cls");//清屏
inital();//建⽴作业控制块队列,并初始化
for(i=0;i<n;i++)
{
p=min=ready;//从队头开始
iden=1;
do{//寻最短作业
if(p->state=='W'&&p->reachtime<=times)
if(iden)//到第⼀个在此刻或之前到达的待运⾏作业
{
min=p;
iden=0;
}
else if(p->needtime<min->needtime) min=p;
p=p->next;
}while(p!=NULL);
if(iden)//此刻之前没有作业到达
{
i--;//纠正已完成作业数量
times++;//更新系统时间
if(times>100)//判断等待作业到达时间是否过长
{
printf("\nruntime is too long … error\n");
getchar();
}
}
else//否则运⾏作业
{
running(min, m);
}
}
final();//所有作业运⾏完后查看平均周转时间、平均带权周转时间}
void fcfs(int m)//先来先服务模式
{
int i, iden;
system("cls");//清屏
inital();//建⽴作业控制块队列,并初始化
for(i = 0; i<n; i++)
{
p = ready;//从队头开始
iden = 1;
do{
do{
//到第⼀个在此刻或之前到达的待运⾏作业
if(p->state =='W'&&p->reachtime <= times) iden = 0;
//没到则继续
if(iden) p = p->next;
}while(p!=NULL&&iden);//直到到为⽌或者到队尾
if(iden)//没有到⼀个在此刻之前到达的待运⾏作业
{
i--;//纠正已完成作业数
printf("\n没有满⾜要求的进程,需等待\n");
times++;//更新系统时间
if(times>100)//判断等待时间是否过长
{
printf("\n时间过长!\n");
}
}
else//否则运⾏作业
{
running(p, m);
}
}
final();//所有作业运⾏完后查看平均周转时间、平均带权周转时间}
void hrrn(int m)//最⾼响应⽐优先模式
{
JCB *max;//指向响应⽐最⾼的作业
int i,iden;
float a,b;
jfinal优缺点
system("cls");
inital();
for(int i=0;i<n;i++)
{
p=max=ready;
iden=1;
do{//寻最⾼响应⽐作业
if(p->state=='W'&&p->reachtime<=times)
if(iden)//到第⼀个在此刻或之前到达的待运⾏作业
{
max=p;
iden=0;
//计算响应⽐
a=times-max->reachtime+max->needtime;
a/=max->needtime;
}
else {
//计算响应⽐
b=times-p->reachtime+p->needtime;
b/=p->needtime;
if(a<b){//更新最⼤响应⽐
a=b;
max=p;
}
}
p=p->next;
}while(p!=NULL);
if(iden)//此刻之前没有作业到达
{
i--;//纠正已完成作业数量
times++;//更新系统时间
if(times>100)//判断等待作业到达时间是否过长
if(times>100)//判断等待作业到达时间是否过长
{
printf("\nruntime is too long … error\n");
getchar();
}
}
else//否则运⾏作业
{
running(max, m);
}
}
final();
}
void menu()//提供服务菜单
{
int m;//存储⽤户选择
system("cls");//清屏
printf("\n\n\t\t*********************************************\t\t\n");    printf("\t\t\t\t作业调度演⽰\n");
printf("\t\t*********************************************\t\t\n");
printf("\n\n\n\t\t\t1.先来先服务算法.");
printf("\n\t\t\t2.最短作业优先算法.");
printf("\n\t\t\t3.最⾼响应⽐优先算法.");
printf("\n\t\t\t0.退出程序.");
printf("\n\n\t\t\t\t选择所要操作:");
scanf("%d", &m);//接收⽤户选择
switch (m)//进⾏服务
{
case 1:
fcfs(m);
getchar();
system("cls");
break;
case 2:
sjf(m);
getchar();
system("cls");
break;
case 3:
hrrn(m);
getchar();
system("cls");
break;
case 0:
system("cls");
break;
default:
printf("选择错误,重新选择.\n");
getchar();
system("cls");
menu();
}
}
int main()
{
menu();//打开菜单,提供服务
system("pause");//终端窗⼝停靠
return 0;
}
2.编写并调试⼀个多道系统的作业调度模拟程序。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。