21xrx.com
2024-11-22 06:29:21 Friday
登录
文章检索 我的文章 写文章
基于FCFS的C++作业调度算法实现
2023-07-02 17:59:37 深夜i     --     --
FCFS(First Come First Serve)算法 C++编程语言 作业调度 实现算法 调度器

FCFS(先来先服务)是一种简单的调度算法,是作业调度中最基本、最简单的一种算法。它的调度原则是按照作业提交的顺序进行调度,当CPU可用时将下一个就绪作业调度到CPU运行。下面介绍如何使用C++实现基于FCFS的作业调度算法。

首先,我们需要定义一个作业类,包括作业ID、提交时间、运行时间等属性。代码如下:


class Job {

public:

  int id;

  int arrTime;

  int burstTime;

  int startTime;

  int finishTime;

  // 构造函数

  Job(int id, int arrTime, int burstTime)

    this->id = id;

    this->arrTime = arrTime;

    this->burstTime = burstTime;

    this->startTime = -1;

    this->finishTime = -1;

  

};

接下来,我们需要定义一个作业队列,用于存储所有的作业。


vector<Job> jobs;

然后,我们需要编写一个计算作业等待时间的函数。该函数计算作业的等待时间,即从作业到达系统的时间到作业开始执行的时间。如果作业在CPU空闲时到达,则等待时间为0。


void calculateWaitTime(vector<Job>& jobs, vector<int>& waitTime) {

  waitTime[0] = 0;

  for (int i = 1; i < jobs.size(); i++) {

    waitTime[i] = jobs[i-1].burstTime + waitTime[i-1];

  }

}

接下来,我们需要编写一个计算作业周转时间的函数。该函数计算作业的周转时间,即从作业到达系统的时间到作业完成的时间。


void calculateTurnaroundTime(vector<Job>& jobs, vector<int>& turnaroundTime, vector<int>& waitTime) {

  turnaroundTime[0] = jobs[0].burstTime + waitTime[0];

  for (int i = 1; i < jobs.size(); i++) {

    turnaroundTime[i] = jobs[i].burstTime + waitTime[i];

  }

}

最后,我们需要编写一个主函数,实现基于FCFS的作业调度算法。对于每个作业,首先检查作业是否到达了CPU空闲。如果作业到达了CPU空闲,则将其立即调度到CPU运行。否则,将其加入作业队列,等待CPU运行。


int main() {

  jobs.push_back(Job(1, 0, 6));

  jobs.push_back(Job(2, 2, 4));

  jobs.push_back(Job(3, 4, 3));

  jobs.push_back(Job(4, 6, 5));

  jobs.push_back(Job(5, 8, 2));

  

  sort(jobs.begin(), jobs.end(), [](const Job& a, const Job& b) {

    return a.arrTime < b.arrTime;

  });

  vector<int> waitTime(jobs.size());

  vector<int> turnaroundTime(jobs.size());

  calculateWaitTime(jobs, waitTime);

  calculateTurnaroundTime(jobs, turnaroundTime, waitTime);

  int totalWaitTime = accumulate(waitTime.begin(), waitTime.end(), 0);

  int totalTurnaroundTime = accumulate(turnaroundTime.begin(), turnaroundTime.end(), 0);

  cout << "作业ID 时间片到达时间 执行时间 等待时间 周转时间" << endl;

  for (int i = 0; i < jobs.size(); i++) {

    cout << jobs[i].id << "\t" << jobs[i].arrTime << "\t\t" << jobs[i].burstTime << "\t\t"

       << waitTime[i] << "\t\t" << turnaroundTime[i] << endl;

  }

  cout << "平均等待时间: " << (float)totalWaitTime / (float)jobs.size() << endl;

  cout << "平均周转时间: " << (float)totalTurnaroundTime / (float)jobs.size() << endl;

  return 0;

}

上述代码实现了基于FCFS的作业调度算法,并计算了每个作业的等待时间和周转时间,以及平均等待时间和平均周转时间。

总的来说,基于FCFS的作业调度算法只考虑了作业的到达顺序,而没有考虑作业的执行时间、优先级等因素。因此,对于长作业时间的作业,FCFS算法可能会导致平均等待时间和周转时间较长。在实际应用中,需要根据具体的情况选择不同的调度算法。

  
  

评论区

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