struct Process { int pid; // 进程编号 int arrival_time; // 到达时间 int burst_time; // 执行时间 int priority; // 优先级 int remaining_time; // 每个进程的剩余执行时间 }processes[n];根据此结构体写一个非抢占式优先调度算法,c语言,函数中会给出进程,无需手动输入
时间: 2024-03-14 13:44:34 浏览: 229
采用非抢占式短作业优先算法的进程调度程序
下面是一个非抢占式优先调度算法的C语言代码,它基于给定的进程结构体。该算法假定进程已按到达时间排序。
```c
#include <stdio.h>
struct Process {
int pid; // 进程编号
int arrival_time; // 到达时间
int burst_time; // 执行时间
int priority; // 优先级
int remaining_time; // 每个进程的剩余执行时间
};
void priorityScheduling(struct Process p[], int n) {
int i, j;
int waiting_time = 0, turnaround_time = 0;
float average_waiting_time, average_turnaround_time;
// 计算每个进程的剩余执行时间
for(i = 0; i < n; i++) {
p[i].remaining_time = p[i].burst_time;
}
printf("\nProcess\t|Waiting Time|Turnaround Time\n");
// 遍历每个进程
for(i = 0; i < n; i++) {
// 找到优先级最高的进程
int highest_priority = i;
for(j = i + 1; j < n; j++) {
if(p[j].arrival_time <= waiting_time && p[j].priority < p[highest_priority].priority) {
highest_priority = j;
}
}
// 计算等待时间和周转时间
waiting_time += (waiting_time >= p[highest_priority].arrival_time) ? 0 : (p[highest_priority].arrival_time - waiting_time);
turnaround_time = waiting_time + p[highest_priority].burst_time;
printf("P%d\t|\t%d\t|\t%d\n", p[highest_priority].pid, waiting_time, turnaround_time);
// 更新等待时间
waiting_time += p[highest_priority].burst_time;
// 更新平均等待时间和平均周转时间
average_waiting_time += waiting_time;
average_turnaround_time += turnaround_time;
// 更新剩余执行时间
p[highest_priority].remaining_time = 0;
}
// 计算平均等待时间和平均周转时间
average_waiting_time /= n;
average_turnaround_time /= n;
printf("\nAverage Waiting Time: %f", average_waiting_time);
printf("\nAverage Turnaround Time: %f", average_turnaround_time);
}
int main() {
int n, i;
printf("Enter the number of processes: ");
scanf("%d", &n);
struct Process processes[n];
// 输入进程的信息
for(i = 0; i < n; i++) {
printf("\nEnter the arrival time, burst time and priority for process P%d: ", i + 1);
processes[i].pid = i + 1;
scanf("%d %d %d", &processes[i].arrival_time, &processes[i].burst_time, &processes[i].priority);
}
// 调用非抢占式优先调度算法
priorityScheduling(processes, n);
return 0;
}
```
该算法首先计算每个进程的剩余执行时间。然后,它遍历每个进程并找到优先级最高的进程。接着,它计算等待时间和周转时间,并更新等待时间和剩余执行时间。最后,它计算平均等待时间和平均周转时间,并输出结果。
阅读全文