21xrx.com
2024-09-20 00:52:39 Friday
登录
文章检索 我的文章 写文章
C++实现FCFA和SJF算法输入作业运行时间
2023-06-24 03:34:19 深夜i     --     --
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算法是非常有价值的。通过编写代码,你可以更深入地了解算法的原理,并发现代码中隐藏的细节和错误。祝你好运!

  
  

评论区

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