简析代码:void SJF(PCB pro[],int num) { int time,done_time; float sum_T_time,sum_QT_time; int i,pronum; PCBQueue *ready_queue; PCB *curpro,pro1[MAXSIZE]; printf("\n\t\t\t\t\t短作业优先算法进程调度模拟\n\n"); printf("\t————————————————————————————————————————————————\n"); sortWithEnterTime(pro, num); ready_queue = (PCBQueue*)malloc(sizeof(PCBQueue)); if(!ready_queue) { printf("分配就绪队列头结点空间失败!"); exit(1); } Queueinit(ready_queue); EnterQueueOfRuntime(ready_queue,&pro[0]); time = pro[0].arrivetime; pronum = 1; //记录当前的进程 sum_T_time = 0, sum_QT_time = 0; i=0; while(ready_queue->size>0) { curpro=poll(ready_queue);//就绪队列中的队头进程进入CPU中运行 if(time<curpro->arrivetime) { //如果该进程与上一次运行的进程结束时间之间有间隔,则将CPU运行时间变为该进程到达时间 time=curpro->arrivetime; } done_time=time+curpro->running_time; curpro->start_time=time; curpro->done_time=done_time; curpro->zztime = done_time - curpro->arrivetime;//周转时间 curpro->dqzztime = curpro->zztime / curpro->running_time;//带权周转时间 //打印正在运行的进程 PrintRunningprogram(curpro); //将curpro的信息复制到pro1[i]中 CopyProgram(&pro1[i],curpro); i++; sum_T_time += curpro->zztime; sum_QT_time += curpro->dqzztime; while(pronum<num) { //将在CPU中的进程运行的时间内到达的进程放入就绪队列 if(pro[pronum].arrivetime<=done_time) { EnterQueueOfRuntime(ready_queue,&pro[pronum]); pronum++; } else { break; } } //打印就绪队列 PrintReadyqueue(ready_queue); time=done_time; if(ready_queue->size==0&&pronum<num) { //防止出现前一个进程执行完到下一个进程到达之间无进程进入 EnterQueueOfRuntime(ready_queue,&pro[pronum]); pronum++; } } PrintSortOfRunningprogram(pro1,num); printf("\t平均周转时间为:%.2f\n", sum_T_time / num); printf("\t平均带权周转时间为:%.2f\n",sum_QT_time/num); }
时间: 2024-03-18 21:43:00 浏览: 20
这是一个短作业优先算法的进程调度模拟函数。其主要实现过程如下:
1. 初始化变量和就绪队列,并将第一个进程加入就绪队列。
2. 进入while循环,每次从就绪队列中取出一个执行时间最短的进程,将其放入CPU中运行,更新时间和该进程的完成时间、开始时间、周转时间和带权周转时间等信息,同时将该进程的信息复制到另一个数组中保存。
3. 在该进程运行的时间段内,将在此期间到达的进程加入就绪队列。
4. 打印当前正在运行的进程和就绪队列中的进程信息。
5. 循环直到所有进程都被执行完毕,计算平均周转时间和带权周转时间,并输出结果。
需要注意的是,该函数依赖于一些其他函数的实现,如排序函数、队列初始化函数、进程加入队列函数、从队列中取出进程函数等。
相关问题
编写C程序,模拟“最短作业优先(SJF)” 调度算法,编写以下函数,计算平均带权周转时间并返回,空函数: double sjf_weighted_time (int *arrival_time, int *run_time, int num){ },主函数int job_num = 5;//job number int arrival_time[] = { 0, 1, 2, 5, 7 };//arrival time int run_time[] = { 8, 2, 3, 10, 9 };//run time //SJF double result = sjf_weighted_time(arrival_time, run_time, job_num); printf("%.2lf", result);
以下是实现最短作业优先(SJF)算法计算平均带权周转时间的 C 语言代码:
```c
#include <stdio.h>
double sjf_weighted_time(int *arrival_time, int *run_time, int num) {
double completion_time[num], turn_around_time[num], waiting_time[num], total_waiting_time = 0, total_turn_around_time = 0;
// 完成时间初始化为0
for (int i = 0; i < num; i++) {
completion_time[i] = 0;
}
// 按到达时间排序作业
for (int i = 0; i < num; i++) {
for (int j = i + 1; j < num; j++) {
if (arrival_time[i] > arrival_time[j]) {
int temp = arrival_time[i];
arrival_time[i] = arrival_time[j];
arrival_time[j] = temp;
temp = run_time[i];
run_time[i] = run_time[j];
run_time[j] = temp;
}
}
}
// 计算完成时间和周转时间
for (int i = 0; i < num; i++) {
if (i == 0) {
completion_time[i] = arrival_time[i] + run_time[i];
} else {
if (arrival_time[i] > completion_time[i - 1]) {
completion_time[i] = arrival_time[i] + run_time[i];
} else {
completion_time[i] = completion_time[i - 1] + run_time[i];
}
}
turn_around_time[i] = completion_time[i] - arrival_time[i];
}
// 计算带权周转时间和平均带权周转时间
for (int i = 0; i < num; i++) {
waiting_time[i] = turn_around_time[i] - run_time[i];
total_waiting_time += waiting_time[i];
total_turn_around_time += turn_around_time[i];
}
return total_turn_around_time / num / run_time[0];
}
int main() {
int job_num = 5;
int arrival_time[] = {0, 1, 2, 5, 7};
int run_time[] = {8, 2, 3, 10, 9};
double result = sjf_weighted_time(arrival_time, run_time, job_num);
printf("平均带权周转时间为:%.2lf", result);
return 0;
}
```
该程序实现了最短作业优先(SJF)算法计算平均带权周转时间的功能。主函数中定义了作业数、到达时间数组和运行时间数组,然后调用 `sjf_weighted_time` 函数计算平均带权周转时间,并输出结果。
编写C程序,模拟“最短作业优先(SJF)” 调度算法,编写以下函数,计算平均带权周转时间并返回double sjf_weighted_time (int *arrival_time, int *run_time, int num){ }
好的,我了解了您的要求,下面是一个参考实现:
```c
#include <stdio.h>
double sjf_weighted_time(int *arrival_time, int *run_time, int num) {
int i, j, min_index, current_time;
double total_time = 0, total_weight = 0;
int *remaining_time = malloc(num * sizeof(int)); // 用于记录每个作业的剩余执行时间
int *finished = malloc(num * sizeof(int)); // 用于记录每个作业是否已经执行完毕
// 初始化剩余执行时间和已完成标记
for (i = 0; i < num; i++) {
remaining_time[i] = run_time[i];
finished[i] = 0;
}
current_time = 0;
for (i = 0; i < num; i++) {
// 选取剩余执行时间最短的作业
min_index = -1;
for (j = 0; j < num; j++) {
if (!finished[j] && (min_index == -1 || remaining_time[j] < remaining_time[min_index])) {
min_index = j;
}
}
// 更新当前时间和剩余执行时间
current_time += remaining_time[min_index];
remaining_time[min_index] = 0;
// 计算带权周转时间和带权重
total_time += current_time - arrival_time[min_index];
total_weight += (current_time - arrival_time[min_index]) / (double) run_time[min_index];
// 标记作业已完成
finished[min_index] = 1;
}
free(remaining_time);
free(finished);
return total_weight / num;
}
int main() {
int arrival_time[] = {0, 1, 2, 3};
int run_time[] = {6, 8, 7, 3};
int num = 4;
double weighted_time = sjf_weighted_time(arrival_time, run_time, num);
printf("平均带权周转时间为 %.2f\n", weighted_time);
return 0;
}
```
在上面的代码中,我们使用了两个数组来记录每个作业的剩余执行时间和是否已经完成。在每次循环中,我们选取剩余执行时间最短的作业进行执行,并更新当前时间和剩余执行时间。然后计算带权周转时间和带权重,并标记作业已完成。最后计算所有作业的平均带权周转时间并返回。
注意,在实际使用时,需要按照作业的到达时间进行排序,以保证算法的正确性。