操作系统---先来先服务、短进程调度

时间:2022-07-02 14:25:26

#include<iostream>
using namespace std;
static const int MaxNum=100;
    int  ArrivalTime[MaxNum];
    int  ServiceTime[MaxNum];
    int  FinishTime[MaxNum];
    int  WholeTime[MaxNum];//周转时间;
    double  WeightWholeTime[MaxNum];//带权周转时间
    int visit[MaxNum]={0};
    int n;
    void creat(){
        for(int i=0;i<n;i++)
        {FinishTime[i]=0,
        WholeTime[i]=0,
        WeightWholeTime[i]=0;}    
    
    }
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    void FCFS(){
        int beginTime[MaxNum];//进程开始时间;
        beginTime[0]=ArrivalTime[0];
        FinishTime[0]= beginTime[0]+ServiceTime[0];
            //计算第i个进程完成时间
    for(int i=1;i<n;i++)
    {
        if(ArrivalTime[i]<(beginTime[i-1]+ServiceTime[i-1]))
            beginTime[i]=beginTime[i-1]+ServiceTime[i-1];
            //提前到达,等待前面完成
        else
            beginTime[i]=ArrivalTime[i];
            //后到达,处理机等待;
        FinishTime[i]=beginTime[i]+ServiceTime[i];
            //计算第i个进程完成的时间
    }
            //求周转时间;
       for(i=0;i<n;i++)
       {
        WholeTime[i]=FinishTime[i]-    ArrivalTime[i];
        //周转时间=完成时间-到达时间;
       }
            //求带权周转时间
       for(i=0;i<n;i++)
       {
            WeightWholeTime[i]=WholeTime[i]/(ServiceTime[i]*1.0);
       }


    }

    double AverageWT_FCFS(){
        //FCFS平均周转时间
       double sum=0;
       for(int i=0;i<n;i++)
       {
           sum+=WholeTime[i];

       }
       return sum/(n*1.0);
    
    }
    
    double AverageWWT_FCFS(){
        //FCFS平均带权周转时间
        double sum=0;
       for(int i=0;i<n;i++)
       {
           sum+=WeightWholeTime[i];

       }
       return sum/(n*1.0);
    
    }
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

    int cmp(int use_Time){
        //use_Time表示现在系统已经操作多少时间了
        int x;//x表示下一个要执行的进程;

        for(int i=0;i<n;i++)
        {    
            if(visit[i]==0)
            {x=i;break;}
        }
         x=i;
       for( i=0;i<n;i++)
       {
            if(visit[i]==1)continue;
            if(use_Time>=ArrivalTime[i] && ServiceTime[i]<ServiceTime[x])
                x=i;
       
       }
       //cout<<"x==="<<x<<endl;
        return x;
    
    }
    void SJF(){
        int beginTime[MaxNum];//进程开始时间;
        beginTime[0]=ArrivalTime[0];
        FinishTime[0]= beginTime[0]+ServiceTime[0];

        int pre=0;//完成的进程下标;
        visit[0]=1;

        for(int j=1;j<n;j++)
    {
        int i=cmp(FinishTime[pre]);
        if(ArrivalTime[i]<(beginTime[pre]+ServiceTime[pre]))
            beginTime[i]=beginTime[pre]+ServiceTime[pre];
            //提前到达,等待前面完成
        else
            beginTime[i]=ArrivalTime[i];
            //后到达,处理机等待;
        FinishTime[i]=beginTime[i]+ServiceTime[i];
            //计算第i个进程完成的时间
        visit[i]=1;//标记已经访问过了;
        pre=i;
    }
            //求周转时间;
       for(int i=0;i<n;i++)
       {
        WholeTime[i]=FinishTime[i]-    ArrivalTime[i];
        //周转时间=完成时间-到达时间;
       }
            //求带权周转时间
       for(i=0;i<n;i++)
       {
            WeightWholeTime[i]=WholeTime[i]/(ServiceTime[i]*1.0);
       }
    
    
    }
    double AverageWT_SJF(){
    //SJF平均周转时间
       double sum=0;
       for(int i=0;i<n;i++)
       {
           sum+=WholeTime[i];

       }
       return sum/(n*1.0);
    }
    double AverageWWT_SJF(){
    //SJF平均带权周转时间
        double sum=0;
       for(int i=0;i<n;i++)
       {
           sum+=WeightWholeTime[i];

       }
       return sum/(n*1.0);
    }
void main(){
  freopen("text.txt","rt",stdin);
    
    int i=0;
    //cout<<"请输入进程个数"<<endl;
    cin>>n;
//    cout<<"进程到达系统时刻分别为"<<endl;
    for(i=0;i<n;cin>>ArrivalTime[i++]);
//    cout<<"进程需要服务时间分别为:"<<endl;
    for(i=0;i<n;cin>>ServiceTime[i++]);
    FCFS();
    cout<<"FCFS平均周转时间"<<AverageWT_FCFS()<<endl;
    cout<<"FCFS平均带权周转时间"<<AverageWWT_FCFS()<<endl;
    creat();
    SJF();
    cout<<"SJF平均周转时间"<<AverageWT_SJF()<<endl;
    cout<<"SJF平均带权周转时间"<<AverageWWT_SJF()<<endl;
}