资源简介
《操作系统》第四版,最高响应比算法实现作业调度,作业信息可以自行输入,输出作业号,到达时间,运行时间,完成时间,等等,输出平均周转时间,带权周转时间,调度顺序,
代码片段和文件信息
# include
# include
# include
#define WAIT “Wait“//就绪状态
#define RUN “Run“//运行状态
#define FINISH “Finish“//完成状态
#define JOBNUMBER 20 //设置最大进程测试数为20
struct JCB {
char jobName[10];//作业名
int arriveTime;//到达时间
int runTime;//需要运行时间
int startTime;//开始时间
int endTime;//完成时间
int turnoverTime;//周转时间
float useWeightTurnoverTime;//带权周转时间
char processStatus[10];//进程状态
};
static int currentTime = 0;//当前时间
static int finishNumber = 0;//进程完成数量
char JobArray[JOBNUMBER][10];//存放数组名信息的二元数组
float priority[JOBNUMBER];//存放进程优先级的一元数组
int num=0;//用户创建进程个数
void loop(struct JCB* jcb int i);
//创建作业函数
void createJCB(struct JCB* jcb) {
printf(“请用户输入想要创建的进程个数:“);
scanf_s(“%d“ & num);
if (num > JOBNUMBER)
printf(“进程个数超过最大进程数!\n“);
else {
for (int i = 0; i < num; i++) {
printf(“请用户依次输入第%d的作业的作业号 到达时间 需要运行时间\n“i+1);
scanf_s(“%s“ &jcb[i].jobName sizeof(jcb[i].jobName));//作业号
scanf_s(“%d“ &jcb[i].arriveTime);//到达时间
scanf_s(“%d“ &jcb[i].runTime);//需要运行时间
jcb[i].startTime = 0;//作业开始时间初始化为0
jcb[i].endTime = 0;//作业结束时间初始化为0
jcb[i].turnoverTime = 0;//作业周转时间初始化为0
jcb[i].useWeightTurnoverTime = 0.0;//作业带权周转时间初始化为0
strcpy_s(jcb[i].processStatus WAIT);//作业状态初始化为等待
}
}
printf(“---------------------------------------------\n“);
}
//将所有作业打印输出
void printJob(struct JCB* jcb) {
printf(“当前时间为%d\n“ currentTime);
printf(“作业号 到达时间 需要运行时间 开始时间 完成时间 周转时间 带权周转时间 进程状态\n“);
for (int i = 0; i < num; i++) {
if (strcmp(jcb[i].processStatus FINISH) == 0)//如果进程为finish状态
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)//如果进程为run状态
printf(“%s\t%d\t%4d\t\t%d\t运行中\t none\t none %s\n“ jcb[i].jobName jcb[i].arriveTime jcb[i].runTime jcb[i].startTime jcb[i].processStatus);
else //如果进程为wait状态
printf(“%s\t%d\t%4d\t\t未运行\tnone\t none\t none %s\n“ jcb[i].jobName jcb[i].arriveTime jcb[i].runTime jcb[i].processStatus);
}
printf(“---------------------------------------------\n“);
}
//计算平均带权周转时间
float weightTurnoverTimeCount(struct JCB* jcb) {
float sum = 0.0;//所有作业的带权周转时间之和
for (int i = 0; i < num; i++)
sum += jcb[i].useWeightTurnoverTime;
return sum / num;//平均带权周转时间=所有带权周转时间之和/总的作业数目
}
//计算平均周转时间
float turnOverTimeCount(struct JCB* jcb) {
float sum = 0.0;//所有作业的周转时间之和
for (int i = 0; i < num; i++)
sum += jcb[i].turnoverTime;
return sum / num;//平均周转时间=所有周转时间之和/总的作业数目
}
//比较各个进程之间的到达时间按升序排列 ,用户创建好作业以后,需要按照作业到达的先后顺序排序
void compare(struct JCB* jcb)
{
struct JCB temp;
for (int i = 0; i < num; i++)
{
int min = jcb[i].arriveTime minIndex = i;//将当前作业的到达时间默认为最早的,依次和后面的作业相比较
for (int j = i + 1; j < num; j++)
{
if (jcb[j].arriveTime < min)//若存在当前作业后面的作业的到达时
- 上一篇:分治法—最近点对.cpp
- 下一篇:C++基础入门.md
评论
共有 条评论