设计一个按先来先服务,算法时间片轮转法,优先数调度算法实现处理器调度的程序。c++
时间: 2024-03-14 14:45:18 浏览: 59
好的,以下是一个简单的处理器调度程序,包括先来先服务、时间片轮转和优先数调度算法的实现。
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
// 进程结构体
struct Process {
int id; // 进程ID
int burst_time; // 进程运行时间
int priority; // 进程优先级
int remaining_time; // 进程剩余运行时间
};
// 先来先服务算法
void FCFS(vector<Process>& processes) {
int n = processes.size();
int current_time = 0;
int waiting_time = 0;
int turnaround_time = 0;
for (int i = 0; i < n; i++) {
// 进程等待时间 = 前面所有进程运行时间的总和
waiting_time += current_time;
// 进程完成时间 = 进程等待时间 + 进程运行时间
turnaround_time += waiting_time + processes[i].burst_time;
// 更新当前时间
current_time += processes[i].burst_time;
}
// 输出平均等待时间和平均周转时间
cout << "FCFS: ";
cout << "Average Waiting Time = " << (double)waiting_time / n << ", ";
cout << "Average Turnaround Time = " << (double)turnaround_time / n << endl;
}
// 时间片轮转算法
void RR(vector<Process>& processes, int time_quantum) {
int n = processes.size();
int current_time = 0;
int waiting_time = 0;
int turnaround_time = 0;
int remaining_processes = n;
queue<int> q; // 用队列存储还未完成的进程
// 将所有进程的剩余运行时间初始化为进程的运行时间
for (int i = 0; i < n; i++) {
processes[i].remaining_time = processes[i].burst_time;
}
// 循环直到所有进程都完成
while (remaining_processes > 0) {
// 将剩余运行时间不为0的进程加入队列
for (int i = 0; i < n; i++) {
if (processes[i].remaining_time > 0) {
q.push(i);
}
}
// 处理队列中的进程
while (!q.empty()) {
int index = q.front();
q.pop();
// 如果剩余运行时间小于时间片,直接运行完该进程
if (processes[index].remaining_time <= time_quantum) {
current_time += processes[index].remaining_time;
waiting_time += current_time - processes[index].burst_time;
turnaround_time += current_time;
processes[index].remaining_time = 0;
remaining_processes--;
}
// 否则运行一个时间片
else {
current_time += time_quantum;
processes[index].remaining_time -= time_quantum;
q.push(index);
}
}
}
// 输出平均等待时间和平均周转时间
cout << "RR: ";
cout << "Average Waiting Time = " << (double)waiting_time / n << ", ";
cout << "Average Turnaround Time = " << (double)turnaround_time / n << endl;
}
// 优先数调度算法
void Priority(vector<Process>& processes) {
int n = processes.size();
int current_time = 0;
int waiting_time = 0;
int turnaround_time = 0;
// 按优先级从高到低排序
sort(processes.begin(), processes.end(), [](const Process& p1, const Process& p2) {
return p1.priority > p2.priority;
});
// 将所有进程的剩余运行时间初始化为进程的运行时间
for (int i = 0; i < n; i++) {
processes[i].remaining_time = processes[i].burst_time;
}
// 循环直到所有进程都完成
while (true) {
int min_priority = INT_MAX;
int index = -1;
// 找到优先级最高的可运行进程
for (int i = 0; i < n; i++) {
if (processes[i].remaining_time > 0 && processes[i].priority < min_priority) {
min_priority = processes[i].priority;
index = i;
}
}
// 如果没有可运行进程,退出循环
if (index == -1) {
break;
}
// 运行该进程
current_time += processes[index].remaining_time;
waiting_time += current_time - processes[index].burst_time;
turnaround_time += current_time;
processes[index].remaining_time = 0;
}
// 输出平均等待时间和平均周转时间
cout << "Priority: ";
cout << "Average Waiting Time = " << (double)waiting_time / n << ", ";
cout << "Average Turnaround Time = " << (double)turnaround_time / n << endl;
}
int main() {
vector<Process> processes = {
{1, 10, 2},
{2, 5, 3},
{3, 8, 1},
{4, 6, 4},
{5, 9, 5}
};
int time_quantum = 2;
FCFS(processes);
RR(processes, time_quantum);
Priority(processes);
return 0;
}
```
以上程序实现了三种处理器调度算法:先来先服务、时间片轮转和优先数调度算法。其中,FCFS 函数实现了先来先服务算法,RR 函数实现了时间片轮转算法,Priority 函数实现了优先数调度算法。在调用这三个函数之前,我们需要定义一个包含所有进程的 vector,并设置好每个进程的 ID、运行时间和优先级。同时,如果使用时间片轮转算法,需要指定时间片大小。
程序输出每种算法的平均等待时间和平均周转时间。
注意:以上程序仅供参考,实际使用时需要根据具体情况进行修改和完善。
阅读全文