📄 job.cpp
字号:
// 实验二 作业调度
// 单道批处理系统的作业等待模拟程序
// 采用先来先服务(FCFS),最短作业优先(SJF)的作业调度算法
// Copyright 2008 , by freedomer
#include "stdio.h"
#include <stdlib.h>
#include <conio.h>
#define getjcb(type) (type*)malloc(sizeof(type))
#define NULL 0
struct jcb { /*定义作业控制块JCB */
char name[10]; /*作业名*/
char state; /*作业状态*/
int need_t; /*作业需要运行时间*/
int submit_t; /*作业提交时刻*/
struct jcb* link;
}*ready=NULL,*p;
typedef struct jcb JCB;
int choose; /*选择算法记录*/
int begin_t=0, /*开始运行时刻,设定第一个作业的为0时刻*/
finish_t; /*完成时刻*/
float turnover_t, /*周转时间*/
with_t, /*带权时间*/
sumturnover_t=0.0, /*各个作业周转时间和*/
sumwith_t=0.0, /*各个作业带权时间和*/
advturnover_t, /*平均周转时间*/
advwith_t; /*平均带权时间*/
void sort() { /*建立作业用某个算法进行排列函数*/
JCB *first, *second;
int insert=0;
if(choose==1) { /*FCFS算法*/
if((ready==NULL)||((p->submit_t)<(ready->submit_t))) {
/*提交时间最早者,插入队首*/
p->link=ready;
ready=p;
}
else { /*作业比较提交时间,插入适当的位置中*/
first=ready;
second=first->link;
while(second!=NULL) {
if((p->submit_t)<(second->submit_t)) {
/*若插入作业比当前作业提交时间早,*/
/*插入到当前作业前面*/
p->link=second;
first->link=p;
second=NULL;
insert=1;
}
else { /*插入作业提交时间最晚,则插入到队尾*/
first=first->link;
second=second->link;
}
}
if(insert==0)
first->link=p;
}
}
else if(choose==2) { /*SJF算法*/
if((ready==NULL)||((p->need_t)<(ready->need_t))) {
/*运行时间最少者,插入队首*/
p->link=ready;
ready=p;
}
else { /*作业比较运行时间,插入适当的位置中*/
first=ready;
second=first->link;
while(second!=NULL) {
if((p->need_t)<(second->need_t)) {
/*若插入作业比当前作业运行时间更少,*/
/*插入到当前作业前面*/
p->link=second;
first->link=p;
second=NULL;
insert=1;
}
else { /*插入作业运行时间最多,则插入到队尾*/
first=first->link;
second=second->link;
}
}
if(insert==0)
first->link=p;
}
}
}
void input() { /*建立初始化作业控制块函数*/
int i,jobnum;
printf("\n 请输入要调度的作业个数?");
scanf("%d",&jobnum);
for(i=0;i<jobnum;i++) {
printf("\n 作业号No.%d:\n",i);
p=getjcb(JCB);
printf("\t 输入作业名:");
scanf("%s",p->name);
printf("\t 输入作业所需的运行时间:");
scanf("%d",&p->need_t);
p->submit_t=i; /*提交时间根据输入顺序累加1*/
p->state='w';
p->link=NULL;
sort(); /*调用sort函数*/
}
}
int space() {
int l=0; JCB* pr=ready;
while(pr!=NULL) {
l++;
pr=pr->link;
}
return(l);
}
void disp(JCB * pr) { /*建立作业显示函数,用于显示当前作业*/
printf("\n qname \t state \t needtime \t submittime \n");
printf("|%s\t",pr->name);
printf("|%c\t",pr->state);
printf("|%d\t\t",pr->need_t);
printf("|%d:00",pr->submit_t);
printf("\n");
}
void check() { /*建立作业查看函数 */
JCB* pr;
printf("\n **** 当前正在运行的作业是:%s",p->name);
/*显示当前运行作业*/
disp(p);
pr=ready;
printf("\n ****当前就绪队列状态为:\n");
/*显示就绪队列状态*/
while(pr!=NULL) {
disp(pr);
pr=pr->link;
}
}
void destroy() { /*建立作业撤消函数(作业运行结束,撤消作业)*/
printf("\n 作业 [%s] 已完成.\n",p->name);
printf("此作业的相关时间如下:\n");
printf("开始时刻:%d:00\n",begin_t);
printf("完成时刻:%d:00\n",finish_t);
printf("周转时间:%.3f\n",turnover_t);
printf("带权周转时间:%.3f\n",with_t);
begin_t=begin_t+p->need_t; /*下个作业的开始时间=前一个作业开始时间+其运行时间*/
free(p);
p->link=NULL;
}
void running() { /*计算在运行的作业的相应的时间,并将它释放*/
finish_t=begin_t+p->need_t;
turnover_t=finish_t-p->submit_t;
with_t=turnover_t/p->need_t;
sumturnover_t+=turnover_t;
sumwith_t+=with_t;
destroy(); /*调用destroy函数*/
}
void main() { /*主函数*/
int len,h=0;
char ch;
printf("\n\n\t1.先来先服务算法(FCFS)\n\n\t2.最短作业优先算法(SJF)\n");
printf("\n请选择所需要的算法...\n");
scanf("%d",&choose);
if((choose!=1)&&(choose!=2)) {
printf("选择错误!\n");
exit;
}
else {
input();
len=space();
while((len!=0)&&(ready!=NULL)) {
ch=getchar();
h++;
printf("\n The execute number:%d \n",h);
p=ready;
ready=p->link;
p->link=NULL;
p->state='R';
check();
running();
printf("\n 按任一键继续......");
ch=getchar();
}
printf("\n **所有作业都已经完成.**\n这组作业的相关时间如下:\n");
advturnover_t=sumturnover_t/len; /*组平均周转时间*/
advwith_t=sumwith_t/len; /*组带权平均周转时间*/
printf("组平均周转时间:%.3f\n组带权平均周转时间:%.3f\n",advturnover_t,advwith_t);
ch=getchar();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -