用C++设计一个按先来先服务,算法时间片轮转法,优先数调度算法实现处理器调度的程序。
时间: 2024-03-13 07:43:57 浏览: 28
好的,下面是一个简单的 C++ 处理器调度程序,实现了先来先服务算法、时间片轮转法和优先数调度算法:
```c++
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
struct Process {
int id; // 进程ID
int arrival_time; // 到达时间
int burst_time; // 执行时间
int priority; // 优先数
};
// 按到达时间排序的比较函数
struct CompareArrivalTime {
bool operator()(const Process& p1, const Process& p2) const {
return p1.arrival_time > p2.arrival_time;
}
};
// 时间片轮转算法
void roundRobinScheduling(vector<Process>& processes, int quantum) {
queue<Process> readyQueue; // 就绪队列
int currentTime = 0; // 当前时间
int totalBurstTime = 0; // 总执行时间
int n = processes.size(); // 进程数
int i = 0; // 当前处理的进程索引
// 将所有进程按到达时间加入就绪队列
while (i < n) {
if (processes[i].arrival_time <= currentTime) {
readyQueue.push(processes[i]);
i++;
} else {
break;
}
}
// 处理就绪队列中的进程
while (!readyQueue.empty()) {
Process p = readyQueue.front();
readyQueue.pop();
// 计算本次执行时间
int remainingTime = p.burst_time;
if (remainingTime > quantum) {
remainingTime = quantum;
}
// 更新当前时间和总执行时间
currentTime += remainingTime;
totalBurstTime += remainingTime;
// 更新进程的剩余执行时间
p.burst_time -= remainingTime;
// 将未执行完的进程加入就绪队列
while (i < n) {
if (processes[i].arrival_time <= currentTime) {
readyQueue.push(processes[i]);
i++;
} else {
break;
}
}
if (p.burst_time > 0) {
readyQueue.push(p);
} else {
cout << "进程 " << p.id << " 完成,等待时间为 " << currentTime - p.arrival_time - p.burst_time << endl;
}
}
// 计算平均等待时间
double avgWaitTime = (double)(currentTime - totalBurstTime) / n;
cout << "平均等待时间为 " << avgWaitTime << endl;
}
// 优先数调度算法
void priorityScheduling(vector<Process>& processes) {
priority_queue<Process, vector<Process>, function<bool(Process, Process)>> readyQueue(
[](Process p1, Process p2) { return p1.priority < p2.priority; }); // 优先队列
int currentTime = 0; // 当前时间
int totalBurstTime = 0; // 总执行时间
int n = processes.size(); // 进程数
int i = 0; // 当前处理的进程索引
// 将所有进程按到达时间加入优先队列
while (i < n) {
if (processes[i].arrival_time <= currentTime) {
readyQueue.push(processes[i]);
i++;
} else {
break;
}
}
// 处理优先队列中的进程
while (!readyQueue.empty()) {
Process p = readyQueue.top();
readyQueue.pop();
// 更新当前时间和总执行时间
currentTime += p.burst_time;
totalBurstTime += p.burst_time;
cout << "进程 " << p.id << " 完成,等待时间为 " << currentTime - p.arrival_time - p.burst_time << endl;
// 将未执行完的进程加入优先队列
while (i < n) {
if (processes[i].arrival_time <= currentTime) {
readyQueue.push(processes[i]);
i++;
} else {
break;
}
}
}
// 计算平均等待时间
double avgWaitTime = (double)(currentTime - totalBurstTime) / n;
cout << "平均等待时间为 " << avgWaitTime << endl;
}
int main() {
vector<Process> processes = {
{1, 0, 5, 3},
{2, 1, 3, 2},
{3, 2, 8, 4},
{4, 3, 6, 5},
{5, 4, 4, 1},
};
// 先来先服务算法
priority_queue<Process, vector<Process>, CompareArrivalTime> readyQueue(processes.begin(), processes.end());
int currentTime = 0; // 当前时间
int totalBurstTime = 0; // 总执行时间
while (!readyQueue.empty()) {
Process p = readyQueue.top();
readyQueue.pop();
// 更新当前时间和总执行时间
currentTime += p.burst_time;
totalBurstTime += p.burst_time;
cout << "进程 " << p.id << " 完成,等待时间为 " << currentTime - p.arrival_time - p.burst_time << endl;
}
// 计算平均等待时间
double avgWaitTime = (double)(currentTime - totalBurstTime) / processes.size();
cout << "平均等待时间为 " << avgWaitTime << endl;
// 时间片轮转算法
roundRobinScheduling(processes, 3);
// 优先数调度算法
priorityScheduling(processes);
return 0;
}
```
这个程序中,`Process` 结构体表示一个进程,包括进程ID、到达时间、执行时间和优先数。`CompareArrivalTime` 结构体是按到达时间排序的比较函数,用于先来先服务算法中的就绪队列(使用了 STL 的 `priority_queue` 容器)。`roundRobinScheduling` 函数实现了时间片轮转算法,`priorityScheduling` 函数实现了优先数调度算法。最后,在 `main` 函数中调用这些函数以实现三种算法的处理器调度。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)