• 大小: 7KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-14
  • 语言: C/C++
  • 标签:

资源简介

《操作系统》第四版,最高响应比算法实现作业调度,作业信息可以自行输入,输出作业号,到达时间,运行时间,完成时间,等等,输出平均周转时间,带权周转时间,调度顺序,

资源截图

代码片段和文件信息

# 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)//若存在当前作业后面的作业的到达时

评论

共有 条评论

相关资源