21xrx.com
2025-04-04 02:15:28 Friday
文章检索 我的文章 写文章
C++编程实现高级响应比优先算法
2023-07-08 01:42:49 深夜i     21     0
C++ 编程 高级响应比优先算法

高级响应比优先算法是一种常用的进程调度算法,可以实现更好的CPU利用率和响应性能。本文将介绍如何使用C++编程实现该算法。

1. 算法原理

高级响应比优先算法是基于响应比优先算法的改进版本。响应比的计算公式为:

响应比 = (等待时间 + 执行时间) / 执行时间

高级响应比优先算法引入了优先级因子,即:

优先级因子 = 1 + (等待时间 / 执行时间)

在优先级相同的情况下,选择优先级因子更高的进程先执行。

2. 实现步骤

(1)定义进程类

首先定义一个进程类Process,包含进程的ID、到达时间、执行时间、等待时间和优先级因子等属性。以下是进程类的代码:

class Process {
public:
  int id// 进程ID
  int arrive_time; // 到达时间
  int exec_time; // 执行时间
  int wait_time; // 等待时间
  double priority; // 优先级因子
  Process(int id, int arrive_time, int exec_time)
    this->id = id;
    this->arrive_time = arrive_time;
    this->exec_time = exec_time;
    this->wait_time = 0;
    this->priority = 0.0;
  
};

(2)读取进程列表

在main函数中,读取进程列表。以下是读取进程列表的代码:

int main() {
  vector<Process> processes;
  // 读取进程列表
  for (int i = 0; i < n; i++) {
    int id, arrive_time, exec_time;
    cin >> id >> arrive_time >> exec_time;
    processes.push_back(Process(id, arrive_time, exec_time));
  }
  // ...
}

(3)计算进程的优先级因子

为每个进程计算优先级因子,并按照优先级从高到低排序。以下是计算优先级因子的代码:

// 计算进程的等待时间和优先级因子
for (int i = 0; i < processes.size(); i++) {
  int wait_time = 0;
  for (int j = 0; j < i; j++) {
    if (processes[j].arrive_time <= processes[i].arrive_time) {
      wait_time += min(processes[i].exec_time, processes[j].exec_time);
    }
  }
  processes[i].wait_time = wait_time;
  processes[i].priority = 1.0 + (double)wait_time / (double)processes[i].exec_time;
}
// 按照优先级从高到低排序
sort(processes.begin(), processes.end(), [](Process &a, Process &b)
  return a.priority > b.priority;
);

(4)按照优先级顺序执行进程

按照优先级顺序执行进程,并计算每个进程的平均等待时间和平均周转时间。以下是按照优先级顺序执行进程的代码:

// 按照优先级顺序执行进程,并计算每个进程的平均等待时间和平均周转时间
int current_time = processes[0].arrive_time;
double total_wait_time = 0.0;
double total_turnaround_time = 0.0;
for (int i = 0; i < processes.size(); i++) {
  Process &p = processes[i];
  total_wait_time += p.wait_time;
  total_turnaround_time += p.wait_time + p.exec_time;
  current_time += p.exec_time;
}
double avg_wait_time = total_wait_time / (double)processes.size();
double avg_turnaround_time = total_turnaround_time / (double)processes.size();
cout << "Avg waiting time: " << avg_wait_time << endl;
cout << "Avg turnaround time: " << avg_turnaround_time << endl;

3. 完整代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Process {
public:
  int id; // 进程ID
  int arrive_time; // 到达时间
  int exec_time; // 执行时间
  int wait_time; // 等待时间
  double priority; // 优先级因子
  Process(int id, int arrive_time, int exec_time)
    this->id = id;
    this->arrive_time = arrive_time;
    this->exec_time = exec_time;
    this->wait_time = 0;
    this->priority = 0.0;
  
};
int main() {
  int n;
  cin >> n;
  vector<Process> processes;
  // 读取进程列表
  for (int i = 0; i < n; i++) {
    int id, arrive_time, exec_time;
    cin >> id >> arrive_time >> exec_time;
    processes.push_back(Process(id, arrive_time, exec_time));
  }
  // 计算进程的等待时间和优先级因子
  for (int i = 0; i < processes.size(); i++) {
    int wait_time = 0;
    for (int j = 0; j < i; j++) {
      if (processes[j].arrive_time <= processes[i].arrive_time) {
        wait_time += min(processes[i].exec_time, processes[j].exec_time);
      }
    }
    processes[i].wait_time = wait_time;
    processes[i].priority = 1.0 + (double)wait_time / (double)processes[i].exec_time;
  }
  // 按照优先级从高到低排序
  sort(processes.begin(), processes.end(), [](Process &a, Process &b)
    return a.priority > b.priority;
  );
  // 按照优先级顺序执行进程,并计算每个进程的平均等待时间和平均周转时间
  int current_time = processes[0].arrive_time;
  double total_wait_time = 0.0;
  double total_turnaround_time = 0.0;
  for (int i = 0; i < processes.size(); i++) {
    Process &p = processes[i];
    total_wait_time += p.wait_time;
    total_turnaround_time += p.wait_time + p.exec_time;
    current_time += p.exec_time;
  }
  double avg_wait_time = total_wait_time / (double)processes.size();
  double avg_turnaround_time = total_turnaround_time / (double)processes.size();
  cout << "Avg waiting time: " << avg_wait_time << endl;
  cout << "Avg turnaround time: " << avg_turnaround_time << endl;
  return 0;
}

4. 总结

通过C++编程实现高级响应比优先算法,我们可以更好地理解该算法的原理和实现方法。在实际应用中,我们可以根据不同的需求选择合适的调度算法,以实现更好的CPU利用率和响应性能。

  
  

评论区