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

先来先服务算法(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;  
}  



  • 4
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: 先来先服务FCFS)进程调度算法是一种简单的调度算法,按照进程到达的先后顺序进行调度。即先到达的进程先执行,后到达的进程后执行。这种算法的优点是简单易懂,缺点是可能会出现长作业等待时间过长的情况。 作业优先SJF)进程调度算法是一种根据进程执行时间长来进行调度的算法。即执行时间的进程先执行,执行时间长的进程后执行。这种算法的优点是可以减少长作业等待时间,缺点是可能会出现作业饥饿的情况。 ### 回答2: 进程调度算法是计算机操作系统中非常重要的一部分,FCFS先来先服务)和SJF作业优先)是其中比较常见的两种算法。下面将分别对两种算法进行介绍及比较。 FCFS算法先来先服务,即按照进入就绪队列的顺序,先进入队列的进程先被执行。该算法的优点是简单易懂,不需要对进程的属性进行过多的分析。但是,该算法存在一个致命的弊端:无法处理作业和长作业混杂的情况,因为如果遇到一个长作业作业就会被迫等待很长时间,导致系统的响应速度变慢。 SJF算法作业优先,即在就绪队列中,选择最作业先执行。该算法的优点是可以尽可能地提高系统的响应速度,保证作业更快地完成。但是该算法也存在一些缺点:由于进程的执行时间不确定,因此难以做出一个准确的预测,如果预测错误,可能会出现长时间的等待,导致系统效率降低。 两种算法的比较:FCFS算法最大的优点是简单易懂,没有太多的计算复杂度,但是对于作业和长作业混杂的情况,无法满足系统性能的要求。而SJF算法虽然能够提高系统的响应速度,并且对于作业友好,但也存在预测困难的问题,也会产生等待的情况。因此,需要根据具体的情况选择适合的算法,如果作业的执行时间能够事先预测,SJF算法是一个很好的选择,否则则可以选择FCFS算法。但是在实际应用中,为了更好地提高系统的性能,一般会采用优先级调度算法,根据进程的属性进行优先级的排序,以此来保证更加合理的进程调度顺序。同时,还可以采用时间片轮转的方法,将长作业进行切割,让多个进程共享CPU,提高系统的处理能力。 ### 回答3: 先来先服务FCFS)是一种最简单的调度算法,也被称为先到先服务或先进先出。该算法的基本原理是按照进程到达的顺序进行调度,即先到来的进程先执行,后到达的进程后执行。FCFS算法适用于进程执行时间相同时,优先级相同的情况。由于该算法的简单性,一般只有在任务队列中的进程个数固定且任务时间相等时才使用。但是,FCFS算法的显著缺陷是无法解决作业等待作业的问题,因此在实际应用中,FCFS算法很少使用。 作业优先SJF)是一种比FCFS算法更为高效的调度算法,也被称为最作业优先。该算法的基本原理是按照进程需要执行的时间的长来进行调度,即先优先选择需要执行时间较的进程,而不是按照它们到达的顺序来进行调度。SJF算法适用于任务队列中的进程的时间不一致的情况。该算法具有高响应度、高效率和低等待时间的优点,能够降低平均等待时间。但是,该算法也存在着一定的问题,如容易出现饥饿现象(即在系统运行的过程中,某些进程始终无法被调度执行)。因此,通常可以将作业优先算法与其他调度算法一起使用,以避免饥饿现象的出现。 总之,先来先服务作业优先都是进程调度算法中常见的两种,它们各有优缺点,需要根据具体的情况选择合适的算法来保证系统的效率和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值