实验目的:
- 学习理解进程调度的作用,分类。
- 掌握常见的一些进程调度算法思想。
- 深刻理解进程调度中进程切换的基本过程。
实验内容:
- 编程模拟实现轮转调度算法或多级反馈队列调度算法。
实验步骤:
1.选择调度算法:
根据实验要求,选择轮转调度算法或多级反馈队列调度算法。
2.实现调度算法
根据选择的算法,编写代码模拟实现进程调度。在轮转调度算法中,需要设计一个轮转队列,依次执行每个进程;在多级反馈队列调度算法中,需要设计多个优先级队列,并根据一定的规则进行进程的转移和调度。
3.模拟进程切换过程:
在代码中模拟进程的创建、执行和切换过程。可以使用fork()系统调用创建子进程,并模拟进程的运行和切换。
4.观察调度效果:
运行程序,观察不同调度算法下的进程执行情况,包括每个进程的执行时间、等待时间等指标,以及系统整体的调度效率。
源代码:
轮转调度算法
#include <stdio.h>
#define MAX_PROCESSES 5
#define TIME_QUANTUM 2
struct Process {
int id;
int burst_time;
};
void roundRobinScheduling(struct Process processes[], int n) {
int remaining_time[MAX_PROCESSES];
for (int i = 0; i < n; i++) {
remaining_time[i] = processes[i].burst_time;
}
int current_time = 0;
while (1) {
int done = 1;
for (int i = 0; i < n; i++) {
if (remaining_time[i] > 0) {
done = 0; // There is still a process pending
if (remaining_time[i] > TIME_QUANTUM) {
current_time += TIME_QUANTUM;
remaining_time[i] -= TIME_QUANTUM;
printf("进程 %d正在执行时间。当前时间:%d\n" , processes[i].id, current_time);
} else {
current_time += remaining_time[i];
remaining_time[i] = 0;
printf("进程%d正在执行并已完成。当前时间:%d\n ", processes[i].id, current_time);
}
}
}
if (done == 1) {
break;
}
}
}
int main() {
struct Process processes[MAX_PROCESSES] = {{1, 6}, {2, 4}, {3, 2}, {4, 5}, {5, 3}};
int n = sizeof(processes) / sizeof(processes[0]);
roundRobinScheduling(processes, n);
return 0;
}
多级反馈队列调度算法
#include <stdio.h>
#define MAX_PROCESSES 5
struct Process {
int id;
int burst_time;
int priority;
};
void multilevelFeedbackQueue(struct Process processes[], int n) {
}
int main() {
struct Process processes[MAX_PROCESSES] = {{1, 6, 0}, {2, 4, 1}, {3, 2, 2}, {4, 5, 0}, {5, 3, 1}};
int n = sizeof(processes) / sizeof(processes[0]);
multilevelFeedbackQueue(processes, n);
return 0;
}
实验心得:
本次实验主要围绕进程调度展开,通过实现轮转调度算法或多级反馈队列调度算法,加深了对进程调度的理解。在编写代码的过程中,我对调度算法的工作原理有了更深入的认识,并学会了如何模拟进程的创建、执行和切换过程。通过观察调度效果,我能够评估不同算法对系统性能的影响,从而更好地选择适合特定场景的调度策略。这次实验让我深入了解了进程调度的重要性,为以后学习操作系统提供了良好的基础。