先来先服务算法(FCFS)和 短作业优先算法(SJF)

本文介绍了两种操作系统调度算法:先来先服务(FCFS)和短作业优先(SJF)。FCFS是最简单的调度策略,优先考虑等待时间最长的作业或进程,而SJF则根据作业的预计运行时间来确定优先级,短作业优先执行。这两种算法都可以应用于作业调度和进程调度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先来先服务算法(FCFS)

FCFS是最简单的调度算法,既可以用作作业调度,也可以用作进程调度

这种算法优先考虑系统中等待时间最长的作业(进程),而不管作业所需执行时间长短,

做法是从后备队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程,然后放入就绪队列

进程调度中使用此算法时,每次都从就绪的进程队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行,该进程会一直运行到完成或者因发生某事件而阻塞后,进程调度程序才会把处理机分配给其他进程

短作业优先算法(SJF)

由于在实际情况中短作业(进程)所占比例很大,为了让它们比长作业优先执行,就有了此算法

SJF顾名思义以作业长短来确定优先级,作业越短优先级越高,作业的长短用作业所需的运行时间来衡量,此算法一样也可以用做进程调度,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存运行

#include<iostream>  
#include<iomanip>  
using namespace std;  
  
static const int MaxNum=100;  
int  ArrivalTime[MaxNum];  
int  ServiceTime[MaxNum];  
int  FinishTime[MaxNum];  
int  WholeTime[MaxNum];  
double  WeightWholeTime[MaxNum];  
double AverageWT,AverageWWT;   
double WT , WWT;  
  
//-------------------------------------------------------------------  
//先来先服务调度算法  
//------------------------------------------------------------------  
void FCFS(int n)  
{  
    cout<<endl;  
    cout<<"FCFS:"<<endl;   
    cout<<"   进程ID"<<"         完成时间"<<"         周转时间"<<"      带权周转时间"<<endl;  
    //完成时间计算  
    for(int i = 0 ; i < n ; i++)  
    {  
        if(i==0){  
            FinishTime[0] = ArrivalTime[0] + ServiceTime[0];  
        }else{  
            FinishTime[i] = FinishTime[i-1] + ServiceTime[i];  
        }  
        WholeTime[i] = FinishTime[i] - ArrivalTime[i];  
        WeightWholeTime[i] = (float)WholeTime[i]  / (float)ServiceTime[i];  
        WT = WT + WholeTime[i];  
        WWT = WWT + WeightWholeTime[i];  
        cout<<"\t"<<setprecision(3)<<i+1<<"\t\t"<<setprecision(3)<<FinishTime[i]<<"\t\t"<<setprecision(3)<<WholeTime[i]<<"\t\t"<<setprecision(3)<<WeightWholeTime[i];  
        cout<<endl;  
    }  
    AverageWWT = WWT / n;  
    AverageWT = WT / n;  
    cout<<"平均周转时间为:        "<<setprecision(3)<<AverageWT<<endl; //保留三位有效数字  
    cout<<"平均带权周转时间为:     "<<setprecision(3)<<AverageWWT;  
    WT = 0;                         //WT和WWT最后要置零,因为我单独把计算周转时间等作为一个函数  
    WWT = 0;                        //如果不置零将导致后续引用该函数的出错  
    cout<<endl;  
}  
  
//---------------------------------------------------------------------------  
//短作业(进程)优先调度算法  
//-----------------------------------------------------------------------------  
void SJF(int n)  
{  
    cout<<endl;  
    cout<<"SJF:"<<endl;   
    cout<<"   进程ID"<<"         完成时间"<<"         周转时间"<<"      带权周转时间"<<endl;  
    int finish = 0;  
    int min,k;  
    int m[MaxNum] = {0};  
  
    //完成时间计算  
   /** FinishTime[0] = ArrivalTime[0] + ServiceTime[0];  
    finish = FinishTime[0];  
    WholeTime[0] = FinishTime[0] - ArrivalTime[0];  
        WeightWholeTime[0] = (float)WholeTime[0]  / (float)ServiceTime[0];  
        WT = WT + WholeTime[0];  
        WWT = WWT + WeightWholeTime[0];  
        cout<<"\t"<<setprecision(3)<<1<<"\t\t"<<setprecision(3)<<FinishTime[0]<<"\t\t"<<setprecision(3)<<WholeTime[0]<<"\t\t"<<setprecision(3)<<WeightWholeTime[0];  
        cout<<endl;  
  */
    for (int j = 0 ; j < n ; j++)  
    {     
        min = 5000;                             //将最小值设置的比较大,服务时间不可能能达到如此大  
        for (int i = 0 ; i < n; i++)         //找到最短服务时间  
            if(m[i]==0 && ServiceTime[i]<min&&ArrivalTime[i]<=finish)  
            {  
                min = ServiceTime[i];  
                k = i;  
            }  
        m[k] = 1;     
        FinishTime[k] = finish + min;           //计算该进程的完成时间  
        finish = FinishTime[k];                             //标记该进程  
          
    }  
  
    for(int i = 0 ; i < n ; i++)  
    {  
          
        WholeTime[i] = FinishTime[i] - ArrivalTime[i];  
        WeightWholeTime[i] = (float)WholeTime[i]  / (float)ServiceTime[i];  
        WT = WT + WholeTime[i];  
        WWT = WWT + WeightWholeTime[i];  
        cout<<"\t"<<setprecision(3)<<i+1<<"\t\t"<<setprecision(3)<<FinishTime[i]<<"\t\t"<<setprecision(3)<<WholeTime[i]<<"\t\t"<<setprecision(3)<<WeightWholeTime[i];  
        cout<<endl;  
    }  
    AverageWWT = WWT / n;  
    AverageWT = WT / n;  
    cout<<"平均周转时间为:        "<<setprecision(3)<<AverageWT<<endl; //保留三位有效数字  
    cout<<"平均带权周转时间为:     "<<setprecision(3)<<AverageWWT;  
    WT = 0;                         //WT和WWT最后要置零,因为我单独把计算周转时间等作为一个函数  
    WWT = 0;                        //如果不置零将导致后续引用该函数的出错  
    cout<<endl;  
}  
  
  
int main()  
{  
    int n;  
    int input;  
    cout<<"请输入进程的数量n:";  
    cin>>n;  
    for(int i = 0 ; i < n ; i++)  
    {  
        cout<<"请输入进程"<<i+1<<"的到达时间和服务时间,并以空格间隔:";  
        cin>>ArrivalTime[i];  
        cin>>ServiceTime[i];  
    }  
    FCFS(n);  
    SJF(n);  
    return 0;  
}  



评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值