用C语言编写非抢占式优先级调度算法
时间: 2023-09-12 18:08:03 浏览: 107
基于优先级的非抢占、抢占进程调度算法模拟程序java源码+项目使用说明.zip
下面是一个简单的用C语言编写的非抢占式优先级调度算法的示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_TASKS 10
// 任务结构体
typedef struct {
int id; // 任务ID
int priority; // 任务优先级
int burst_time; // 任务执行时间
} Task;
Task tasks[MAX_TASKS]; // 任务数组
int num_tasks = 0; // 任务个数
// 添加任务
void add_task(int id, int priority, int burst_time) {
if (num_tasks >= MAX_TASKS) {
printf("Error: too many tasks!\n");
exit(1);
}
tasks[num_tasks].id = id;
tasks[num_tasks].priority = priority;
tasks[num_tasks].burst_time = burst_time;
num_tasks++;
}
// 选择下一个任务
int select_next_task() {
int i, max_priority = -1, max_priority_index = -1;
for (i = 0; i < num_tasks; i++) {
if (tasks[i].burst_time > 0) {
if (tasks[i].priority > max_priority) {
max_priority = tasks[i].priority;
max_priority_index = i;
}
}
}
return max_priority_index;
}
// 执行任务
void execute_task(int index) {
tasks[index].burst_time--;
}
// 主函数
int main() {
int i, j, total_time = 0;
// 添加任务
add_task(1, 2, 5);
add_task(2, 1, 4);
add_task(3, 3, 2);
add_task(4, 1, 3);
// 执行任务
while (1) {
int index = select_next_task();
if (index < 0) {
break; // 所有任务都已完成
}
execute_task(index);
printf("Task %d is running...\n", tasks[index].id);
total_time++;
}
// 输出结果
printf("Total time: %d\n", total_time);
for (i = 0; i < num_tasks; i++) {
printf("Task %d: ", tasks[i].id);
for (j = 0; j < tasks[i].burst_time + tasks[i].priority; j++) {
if (j < tasks[i].priority) {
printf("P");
} else {
printf(".");
}
}
printf("\n");
}
return 0;
}
```
在这个示例中,我们定义了一个Task结构体来表示任务,其中包含任务的ID、优先级和执行时间。我们还定义了一个数组tasks来存储所有的任务。
在主函数中,我们添加了四个任务,并按照它们的优先级顺序执行它们。我们使用select_next_task函数来选择下一个要执行的任务,该函数遍历所有尚未完成的任务,选择优先级最高的任务。我们使用execute_task函数来执行任务,该函数将该任务的执行时间减少1。
在主函数的循环中,我们一直选择下一个要执行的任务,直到所有任务都已完成。在每次执行任务时,我们输出当前正在执行的任务的ID,以及总时间total_time递增1。
最后,我们输出每个任务的时间轴,其中“P”表示该任务的优先级,而“.”表示该任务正在等待或已完成。
阅读全文