当前位置:首页 > C++ > 正文

C++实现优先级调度算法(小白也能看懂的详细教程)

在操作系统中,优先级调度算法是一种常见的进程调度策略。它根据每个进程的优先级来决定哪个进程先执行:优先级高的进程先运行,优先级低的后运行。本文将带你从零开始,用C++语言实现一个简单的优先级调度算法,即使你是编程小白,也能轻松理解!

什么是优先级调度算法?

优先级调度算法的核心思想是:为每个进程分配一个优先级数值(通常数字越小表示优先级越高,也可以反过来),调度器总是选择当前就绪队列中优先级最高的进程来执行。

C++实现优先级调度算法(小白也能看懂的详细教程) C++优先级调度算法 操作系统调度 C++进程调度 优先级调度实现 第1张

C++实现步骤详解

我们将使用 C++ 的标准模板库(STL)中的 priority_queue(优先队列)来高效地实现这个算法。优先队列内部通常基于堆(heap)结构,能自动维护元素的顺序。

1. 定义进程结构体

首先,我们需要定义一个表示“进程”的结构体,包含进程ID、到达时间、执行时间以及优先级。

struct Process {    int pid;          // 进程ID    int arrival_time; // 到达时间    int burst_time;   // 执行时间(CPU需要的时间)    int priority;     // 优先级(数值越小,优先级越高)    // 构造函数    Process(int id, int at, int bt, int p)        : pid(id), arrival_time(at), burst_time(bt), priority(p) {}};

2. 自定义比较函数

C++ 的 priority_queue 默认是最大堆,但我们希望优先级高的(即 priority 值小的)排在前面,因此需要自定义比较逻辑。

// 自定义比较器:优先级高的(priority 小)排在前面struct ComparePriority {    bool operator()(const Process& a, const Process& b) {        return a.priority > b.priority; // 注意:这里用 > 表示小顶堆    }};

3. 主调度函数

下面是一个简化的非抢占式优先级调度实现(即一旦进程开始执行,就运行到完成)。

#include <iostream>#include <queue>#include <vector>using namespace std;void priorityScheduling(vector<Process>& processes) {    // 按到达时间排序(模拟时间推进)    sort(processes.begin(), processes.end(),         [](const Process& a, const Process& b) {             return a.arrival_time < b.arrival_time;         });    priority_queue<Process, vector<Process>, ComparePriority> pq;    int current_time = 0;    int completed = 0;    int n = processes.size();    int i = 0;    cout << "执行顺序:\n";    while (completed < n) {        // 将当前时间已到达的进程加入优先队列        while (i < n && processes[i].arrival_time <= current_time) {            pq.push(processes[i]);            i++;        }        if (!pq.empty()) {            Process p = pq.top();            pq.pop();            cout << "时间 " << current_time << " - 执行进程 P" << p.pid                  << "(优先级: " << p.priority << "),耗时 " << p.burst_time << "\n";            current_time += p.burst_time;            completed++;        } else {            // 如果没有就绪进程,时间推进到下一个进程到达            if (i < n) {                current_time = processes[i].arrival_time;            }        }    }}

4. 完整主函数示例

int main() {    vector<Process> processes = {        Process(1, 0, 5, 2),        Process(2, 1, 3, 1),        Process(3, 2, 8, 4),        Process(4, 3, 6, 3)    };    priorityScheduling(processes);    return 0;}

关键知识点总结

  • C++优先级调度算法利用了 STL 中的 priority_queue 实现高效调度。
  • 该算法属于操作系统调度的核心内容,广泛应用于多任务系统。
  • 本例是非抢占式的;若需抢占式(如 Linux 的实时调度),需在新高优先级进程到达时中断当前进程。
  • 通过合理设计 ComparePriority,可以灵活控制调度顺序。

结语

通过本教程,你已经掌握了如何用 C++ 实现基本的优先级调度算法。这不仅是学习C++进程调度的重要一步,也为理解更复杂的调度策略(如多级反馈队列)打下基础。动手试试修改代码,比如支持抢占式调度,或计算平均等待时间,加深理解吧!

SEO关键词提示:本文覆盖了 C++优先级调度算法、操作系统调度、C++进程调度、优先级调度实现 等核心关键词。