21xrx.com
2024-11-22 06:17:43 Friday
登录
文章检索 我的文章 写文章
C++编程实现高级响应比优先算法
2023-07-08 01:42:49 深夜i     --     --
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利用率和响应性能。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复