改进代码,使它加入抢占式优先调度算法模拟,其中数据结构应该包含进程名、到达时间、服务时间、开始时间、完成时间、周转时间和带权周转时间,并计算平均周转时间和平均带权周转时间
时间: 2023-10-20 20:11:38 浏览: 78
可抢占的优先进程调度算法
好的,我明白您的问题。您需要对原有的代码进行改进,加入抢占式优先调度算法模拟,并且需要计算出各个进程的周转时间、带权周转时间以及平均周转时间和平均带权周转时间。数据结构中应该包含进程名、到达时间、服务时间、开始时间、完成时间、周转时间和带权周转时间。
为了实现抢占式优先调度算法,我们需要按照进程的优先级进行调度,当高优先级的进程到达后,如果当前正在执行的进程的优先级低于它,就需要暂停该进程,优先执行高优先级的进程。具体的实现方式可以参照以下代码:
```
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Q_SIZE 1000 // 定义队列的大小
// 定义进程结构体
typedef struct process {
char name[10]; // 进程名
int arrive_time; // 到达时间
int service_time; // 服务时间
int start_time; // 开始时间
int finish_time; // 完成时间
int turnaround_time; // 周转时间
float weighted_turnaround_time; // 带权周转时间
int priority; // 进程的优先级
} Process;
// 定义进程的队列
typedef struct queue {
Process data[Q_SIZE];
int front, rear, count;
} Queue;
// 初始化队列
void init_queue(Queue *queue) {
queue->front = queue->rear = queue->count = 0;
}
// 判断队列是否为空
int is_empty_queue(Queue *queue) {
return (queue->count <= 0);
}
// 判断队列是否已满
int is_full_queue(Queue *queue) {
return (queue->count >= Q_SIZE);
}
// 入队列
int enqueue(Queue *queue, Process process) {
if (is_full_queue(queue)) {
return 0;
}
queue->data[queue->rear] = process;
queue->rear = (queue->rear + 1) % Q_SIZE;
queue->count++;
return 1;
}
// 出队列
int dequeue(Queue *queue, Process *process) {
if (is_empty_queue(queue)) {
return 0;
}
*process = queue->data[queue->front];
queue->front = (queue->front + 1) % Q_SIZE;
queue->count--;
return 1;
}
// 计算平均周转时间和平均带权周转时间
void calculate_statistics(Process *processes, int n) {
int i;
float total_turnaround_time = 0, total_weighted_turnaround_time = 0;
for (i = 0; i < n; i++) {
total_turnaround_time += processes[i].turnaround_time;
total_weighted_turnaround_time += processes[i].weighted_turnaround_time;
}
printf("\n平均周转时间 = %f\n", total_turnaround_time / n);
printf("平均带权周转时间 = %f\n", total_weighted_turnaround_time / n);
}
// 抢占式优先调度算法
void preemptive_priority_scheduling(Process *processes, int n) {
int i, j, time = 0;
Queue ready_queue;
Process current_process, next_process;
init_queue(&ready_queue);
// 对进程按照到达时间进行排序
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (processes[i].arrive_time > processes[j].arrive_time) {
Process temp = processes[i];
processes[i] = processes[j];
processes[j] = temp;
}
}
}
enqueue(&ready_queue, processes[0]); // 将第一个进程入队列
current_process = ready_queue.data[0]; // 将就绪队列中的第一个进程设置为当前进程
current_process.start_time = current_process.arrive_time; // 设置当前进程的开始时间为到达时间
// 执行调度
while (!is_empty_queue(&ready_queue)) {
for (i = 0; i < n; i++) {
if (processes[i].arrive_time <= time && processes[i].priority > current_process.priority) {
next_process = processes[i];
break;
}
}
if (i == n) { // 如果没有更高优先级的进程,就继续执行当前进程
next_process = current_process;
time++;
next_process.service_time--;
if (next_process.service_time == 0) { // 当前进程执行完成
next_process.finish_time = time;
next_process.turnaround_time = next_process.finish_time - next_process.arrive_time;
next_process.weighted_turnaround_time = next_process.turnaround_time * 1.0 / next_process.service_time;
}
} else { // 找到了更高优先级的进程,将当前进程加入就绪队列,执行下一个进程
current_process.priority = 0;
enqueue(&ready_queue, current_process);
current_process = next_process;
current_process.priority = processes[i].priority;
current_process.start_time = time;
}
for (j = i + 1; j < n; j++) { // 将其它满足条件的进程加入就绪队列
if (processes[j].arrive_time <= time && processes[j].priority > 0) {
enqueue(&ready_queue, processes[j]);
}
}
// 如果当前进程已经执行完毕,从队列中删除
if (next_process.service_time == 0) {
dequeue(&ready_queue, ¤t_process);
}
}
// 输出每个进程的执行情况
printf("进程名\t到达时间\t服务时间\t开始时间\t完成时间\t周转时间\t带权周转时间\n");
for (i = 0; i < n; i++) {
printf("%s\t%8d\t%8d\t%8d\t%8d\t%8d\t%14.2f\n",
processes[i].name,
processes[i].arrive_time,
processes[i].service_time,
processes[i].start_time,
processes[i].finish_time,
processes[i].turnaround_time,
processes[i].weighted_turnaround_time);
}
// 计算平均周转时间和平均带权周转时间
calculate_statistics(processes, n);
}
int main() {
int i, n;
printf("请输入进程个数:");
scanf("%d", &n);
Process *processes = (Process *)malloc(n * sizeof(Process));
// 输入每个进程的信息
printf("请输入每个进程的信息:\n");
for (i = 0; i < n; i++) {
printf("请输入第%d个进程的信息(进程名 到达时间 服务时间 优先级):", i + 1);
scanf("%s%d%d%d", processes[i].name, &processes[i].arrive_time, &processes[i].service_time, &processes[i].priority);
}
// 执行抢占式优先调度算法
preemptive_priority_scheduling(processes, n);
free(processes);
return 0;
}
```
以上代码是一个完整的抢占式优先调度算法的实现,包括了进程的队列、入队列和出队列的操作以及计算各个统计量的函数。您可以根据您的需求进行修改和优化。
阅读全文