21xrx.com
2025-03-29 05:35:31 Saturday
文章检索 我的文章 写文章
C++实现FCFA和SJF算法输入作业运行时间
2023-06-24 03:34:19 深夜i     13     0
C++ FCFA SJF 作业 运行时间

在计算机科学中,作业调度算法是指如何有效地处理和安排设备上的多个作业。其中常用的两种作业调度算法是FCFA(First-Come-First-Served Algorithm)和SJF(Shortest Job First Algorithm)。在本文中,我们将使用C++来实现这两种算法,并输入作业运行时间进行测试。

首先,让我们介绍FCFA算法。该算法是一种先进先出的调度算法,在进程队列中按照到达时间从早到晚的顺序执行作业。代码实现如下:

#include <iostream>
using namespace std;
int main()
{
  int num, bt[20], wt[20], tat[20], avwt = 0, avtat = 0;
  cout<<"Enter total number of processes(maximum 20):";
  cin>>num;
  cout<<endl<<"Enter Process Burst Time:";
  for(int i = 0; i < num; i++)
  {
    cout<<endl<<"P["<< i + 1<<"]:";
    cin>>bt[i];
  }
  wt[0] = 0;
  for(int i = 1; i < num; i++)
  {
    wt[i] = 0;
    for(int j = 0; j < i; j++)
      wt[i] += bt[j];
  }
  cout<<"\nProcess\t Burst Time \t Waiting Time \t Turnaround Time";
  for(int i = 0; i < num; i++)
  {
    tat[i] = bt[i] + wt[i];
    avwt += wt[i];
    avtat += tat[i];
    cout<<endl<<"P["<< i + 1<<"]"<< "\t\t" << bt[i]<< "\t\t" << wt[i]<< "\t\t" << tat[i];
  }
  avwt /= i;
  avtat /= i;
  cout<<endl<<"Average Waiting Time:"<< avwt;
  cout<<endl<<"Average Turnaround Time:"<< avtat;
  return 0;
}

FCFA算法的特点是:在同等条件下,先来的进程先被执行,可能导致作业等待的事件变长。下面,让我们来介绍SJF算法。该算法是根据作业的运行时间进行安排的,即根据剩余时间最短的作业先执行。代码实现如下:

#include<bits/stdc++.h>
using namespace std;
int main(){
  int n,i,j,t=0;
  float wt=0,tt=0;
  cout<<"Enter the number of processes: ";
  cin>>n;
  float bt[n], at[n], ct[n];
  int p[n];
  cout<<"Enter the burst time and arrival time respectively: "<<endl;
  for(i=0;i<n;i++){
    cout<<"Process "<<i+1<<" :";
    cin>>bt[i]>>at[i];
    p[i]=i+1;
  }
  float temp,min,sum_bt=0,avgwt,avgtt;
  for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      if(at[i]<at[j]){
        temp=p[j];
        p[j]=p[i];
        p[i]=temp;
        temp=at[j];
        at[j]=at[i];
        at[i]=temp;
        temp=bt[j];
        bt[j]=bt[i];
        bt[i]=temp;
      }
    }
  }
  for(int i=0;i<n;i++){
    if(i==0){
      ct[i]=at[i]+bt[i];
    }
    else{
      if(at[i]>ct[i-1]){
        ct[i]=at[i]+bt[i];
      }
      else{
        ct[i]=bt[i]+ct[i-1];
      }
    }
  }
  for(i=0;i<n;i++){
    tt+=ct[i]-at[i];
  }
  avgtt=tt/n;
  cout<<endl<<"Average waiting time: "<<avgtt<<endl;
  return 0;
}

SJF算法的特点是:利用预测算法,调度程序可以更好地预测哪个程序需要先执行。但是,由于需要评估所有未完成的作业的运行时间,因此该算法可能会导致优先级反转问题。

在以上两种算法中,我们可以使用C++来输入作业的运行时间,并测试不同的输入结果。无论你是初学者还是经验丰富的编程人员,在学习C++过程中,运用FCFA和SJF算法是非常有价值的。通过编写代码,你可以更深入地了解算法的原理,并发现代码中隐藏的细节和错误。祝你好运!

  
  

评论区