时间片轮转调度算法代码及解释
时间: 2023-09-20 21:12:17 浏览: 85
下面是时间片轮转调度算法的 C++ 代码实现,代码中有详细的注释解释算法的执行过程:
```c++
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
// 进程结构体,包含进程 ID 和 CPU 执行时间
struct Process {
int pid;
int burst;
int remaining;
};
// 时间片轮转调度算法函数
void rrScheduling(vector<Process>& processes, int quantum) {
int n = processes.size(); // 进程数量
queue<Process> q; // 进程队列
int currentTime = 0; // 当前时间
int totalWaitingTime = 0; // 总等待时间
int totalTurnaroundTime = 0; // 总周转时间
int completed = 0; // 已完成的进程数量
// 将所有进程放入队列中
for (int i = 0; i < n; i++) {
processes[i].remaining = processes[i].burst;
q.push(processes[i]);
}
// 开始调度
while (completed < n) {
Process current = q.front(); // 取出队列中的第一个进程
q.pop();
// 执行当前进程
int executeTime = min(current.remaining, quantum); // 计算当前进程执行的时间片长度
current.remaining -= executeTime; // 更新当前进程的剩余执行时间
currentTime += executeTime; // 更新当前时间
// 更新等待时间和周转时间
totalWaitingTime += currentTime - current.burst - current.remaining;
totalTurnaroundTime += currentTime - current.burst;
// 将执行完的进程放回队列中
if (current.remaining == 0) { // 如果当前进程已经执行完成
completed++; // 计数器加一
} else {
q.push(current); // 否则将当前进程重新放回队列中
}
}
// 输出统计结果
cout << "Average waiting time: " << (double)totalWaitingTime / n << endl;
cout << "Average turnaround time: " << (double)totalTurnaroundTime / n << endl;
}
int main() {
// 测试数据
vector<Process> processes = {{1, 10}, {2, 5}, {3, 8}, {4, 7}, {5, 6}};
int quantum = 2;
rrScheduling(processes, quantum);
return 0;
}
```
时间片轮转调度算法的核心思想是将 CPU 时间分成一段一段的时间片,每次只执行一个时间片长度的进程,然后将该进程放回队列中,执行下一个进程。如果某个进程的时间片用完之前没有执行完成,那么将该进程重新放回队列中,等待下一次执行。
在上面的代码实现中,我们使用了一个 `queue` 来保存所有的进程,初始时将所有进程都放入队列中。然后,我们不断从队列中取出一个进程来执行,直到所有进程都执行完成。在执行每个进程的时候,我们使用一个变量 `executeTime` 来记录该进程执行的时间片长度,并将当前时间 `currentTime` 更新为该进程执行完后的时间。如果该进程的剩余执行时间为 0,表示该进程已经执行完成,我们将 `completed` 计数器加一;否则,我们将该进程重新放回队列中,等待下一次执行。
最后,我们输出平均等待时间和平均周转时间,以评估算法的性能。
阅读全文