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

C++实现最高响应比调度算法(HRRN)详解:小白也能掌握的操作系统作业调度实战

在操作系统课程中,作业调度算法是一个核心知识点。其中,最高响应比算法(Highest Response Ratio Next, 简称 HRRN)是一种兼顾短作业优先和避免长作业“饥饿”的优秀调度策略。本文将手把手教你用 C++语言 实现这一经典算法,即使你是编程新手,也能轻松理解并运行代码。

什么是最高响应比算法?

HRRN 是一种非抢占式的作业调度算法。它通过计算每个等待作业的“响应比”来决定下一个执行的作业。响应比的计算公式如下:

响应比 = (等待时间 + 服务时间) / 服务时间

- 等待时间:作业从提交到当前时刻所等待的时间。
- 服务时间:作业本身需要的 CPU 执行时间。

这个公式意味着:短作业天然具有较高的响应比,但随着等待时间增长,长作业的响应比也会逐渐升高,从而避免被无限期推迟——这正是 HRRN 的巧妙之处。

C++实现最高响应比调度算法(HRRN)详解:小白也能掌握的操作系统作业调度实战 C++最高响应比算法 作业调度算法C++ HRRN调度C++实现 操作系统调度算法 第1张

C++实现步骤详解

我们将用 C++ 编写一个完整的 HRRN 调度模拟程序。程序将接收一组作业(包含到达时间和执行时间),然后按照 HRRN 规则输出调度顺序、完成时间、周转时间等信息。

1. 定义作业结构体

首先,我们需要一个结构体来存储每个作业的信息:

struct Job {    int id;           // 作业ID    int arrivalTime;  // 到达时间    int burstTime;    // 执行时间(服务时间)    int startTime;    // 开始执行时间    int finishTime;   // 完成时间    int waitingTime;  // 等待时间    int turnaroundTime; // 周转时间    bool executed;    // 是否已执行};

2. 主调度逻辑

核心思想是:在每个调度时刻,遍历所有已到达但未执行的作业,计算它们的响应比,选择响应比最高的作业执行。

#include <iostream>#include <vector>#include <iomanip>using namespace std;void hrrnScheduling(vector<Job>& jobs) {    int n = jobs.size();    int currentTime = 0;    int completed = 0;    // 初始化    for (auto& job : jobs) {        job.executed = false;    }    cout << setw(5) << "ID"          << setw(10) << "Arrival"          << setw(10) << "Burst"          << setw(10) << "Start"          << setw(10) << "Finish"          << setw(12) << "Turnaround"          << setw(10) << "Waiting" << endl;    while (completed < n) {        int candidate = -1;        double maxRatio = -1;        // 寻找已到达且未执行的作业中响应比最高的        for (int i = 0; i < n; i++) {            if (!jobs[i].executed && jobs[i].arrivalTime <= currentTime) {                double waitingTime = currentTime - jobs[i].arrivalTime;                double responseRatio = (waitingTime + jobs[i].burstTime) / (double)jobs[i].burstTime;                if (responseRatio > maxRatio) {                    maxRatio = responseRatio;                    candidate = i;                }            }        }        // 如果没有找到可执行作业,推进时间        if (candidate == -1) {            currentTime++;            continue;        }        // 执行选中的作业        Job& job = jobs[candidate];        job.startTime = currentTime;        job.finishTime = currentTime + job.burstTime;        job.turnaroundTime = job.finishTime - job.arrivalTime;        job.waitingTime = job.turnaroundTime - job.burstTime;        job.executed = true;        cout << setw(5) << job.id             << setw(10) << job.arrivalTime             << setw(10) << job.burstTime             << setw(10) << job.startTime             << setw(10) << job.finishTime             << setw(12) << job.turnaroundTime             << setw(10) << job.waitingTime << endl;        currentTime = job.finishTime;        completed++;    }}

3. 主函数与测试

int main() {    vector<Job> jobs = {        {1, 0, 6},        {2, 2, 3},        {3, 4, 2},        {4, 6, 5}    };    cout << "=== C++最高响应比算法 (HRRN) 调度结果 ===" << endl;    hrrnScheduling(jobs);    return 0;}

运行结果与分析

以上代码运行后,会输出每个作业的调度详情。例如,作业2虽然比作业1晚到,但由于其较短的执行时间,在适当时候获得了较高的响应比而被优先调度。这种机制有效平衡了效率与公平性。

总结

通过本教程,你已经掌握了如何用 C++语言实现最高响应比算法(HRRN)。该算法是操作系统调度算法中的重要一环,特别适用于批处理系统。希望你能将此代码用于学习、实验或课程设计。

记住,理解算法背后的逻辑比死记代码更重要。动手修改作业参数,观察调度顺序的变化,你会对 作业调度算法C++ 有更深刻的认识!

SEO关键词回顾:C++最高响应比算法、作业调度算法C++、HRRN调度C++实现、操作系统调度算法。