进程按达到时间放入就绪队列,就绪队列的进程按优先级高低以时间片轮转进行运行,运行一次优先级减一,服务时间完成则从就绪队列撤销的最高优先数优先算法用C++怎么写
时间: 2023-07-20 07:29:58 浏览: 50
以下是一个简单的实现代码,实现了进程的创建、就绪队列的管理、时间片轮转调度、优先级调度等功能:
```c++
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
// 进程结构体
struct Process {
int pid; // 进程 ID
int arrivalTime; // 到达时间
int serviceTime; // 服务时间
int priority; // 优先级
int remainingTime;// 剩余服务时间
};
// 按到达时间排序的比较函数
bool cmpArrivalTime(const Process& p1, const Process& p2) {
return p1.arrivalTime < p2.arrivalTime;
}
// 按优先级排序的比较函数
bool cmpPriority(const Process& p1, const Process& p2) {
return p1.priority > p2.priority;
}
// 时间片轮转调度算法
void RR(vector<Process>& processes, int quantum) {
int n = processes.size();
queue<Process> readyQueue; // 就绪队列
int currentTime = 0; // 当前时间
int finishedCount = 0; // 完成进程数
while (finishedCount < n) {
// 将到达时间小于等于当前时间的进程加入就绪队列
for (int i = 0; i < n; i++) {
if (processes[i].arrivalTime <= currentTime && processes[i].remainingTime > 0) {
readyQueue.push(processes[i]);
}
}
if (readyQueue.empty()) {
// 没有进程可执行,时间加一
currentTime++;
continue;
}
// 从就绪队列中取出一个进程
Process currentProcess = readyQueue.front();
readyQueue.pop();
// 执行当前进程 quantum 时间
int executeTime = min(quantum, currentProcess.remainingTime);
currentTime += executeTime;
currentProcess.remainingTime -= executeTime;
if (currentProcess.remainingTime <= 0) {
// 当前进程执行完毕
finishedCount++;
cout << "进程 " << currentProcess.pid << " 执行完毕,完成时间为 " << currentTime << endl;
} else {
// 当前进程未执行完毕,加入就绪队列末尾
readyQueue.push(currentProcess);
}
}
}
// 优先级调度算法
void Priority(vector<Process>& processes) {
int n = processes.size();
priority_queue<Process, vector<Process>, decltype(&cmpPriority)> readyQueue(cmpPriority); // 优先级队列
int currentTime = 0; // 当前时间
int finishedCount = 0; // 完成进程数
while (finishedCount < n) {
// 将到达时间小于等于当前时间的进程加入优先级队列
for (int i = 0; i < n; i++) {
if (processes[i].arrivalTime <= currentTime && processes[i].remainingTime > 0) {
readyQueue.push(processes[i]);
}
}
if (readyQueue.empty()) {
// 没有进程可执行,时间加一
currentTime++;
continue;
}
// 从优先级队列中取出一个进程
Process currentProcess = readyQueue.top();
readyQueue.pop();
// 执行当前进程
currentTime += currentProcess.remainingTime;
currentProcess.remainingTime = 0;
finishedCount++;
cout << "进程 " << currentProcess.pid << " 执行完毕,完成时间为 " << currentTime << endl;
}
}
int main() {
vector<Process> processes = {
{1, 0, 4, 2, 4},
{2, 1, 3, 1, 3},
{3, 2, 2, 3, 2},
{4, 3, 4, 4, 4},
{5, 4, 5, 2, 5},
};
// 按到达时间排序
sort(processes.begin(), processes.end(), cmpArrivalTime);
// 时间片轮转调度算法,时间片为 2
RR(processes, 2);
// 优先级调度算法
Priority(processes);
return 0;
}
```
以上代码实现了进程的创建,按到达时间排序,时间片轮转调度算法和优先级调度算法。可以根据实际需求进行修改和扩展。