作业调度算法-先到先服务(FCFS)

关于先到先服务算法,我这里只陈述几个要点:

 

1.为什么缩写是FCFS?

first-come first-served,先到先服务。

 

2.FCFS算法中优先级的评定标准?

优先级根据等待时间来确定,等待时间越长,优先级越高,越优先执行。

 

3.为什么说等待时间越长FCFS算法调度作业的优先级越高?

这个问题开始挺纠结我的,不晓得大家有没有纠结过,给大家做一个比喻,当前一个饭店处于爆满状态(处理机调度作业此时处于忙碌状态),而此时还有好多顾客去吃饭(有好多新的作业进入调度队列),先到的顾客肯定比后到的顾客已经等待的时间要长,因此一旦有位子自然先到的顾客先入座,就是这样。

 

下面给出FCFS算法的执行模拟:

#include 

using namespace std;
#define     max(x, y)      x >= y ? x : y
#define     min(x, y)      x <= y ? x : y

#define     INF     0x3f3f3f3f


const int maxn = 105;//作业调度的最大数量

/*作业控制块的数据结构*/
typedef struct job_control_block
{

    int priority;    //作业优先级
    int runtime;     //作业预计运行时间
    int Count;       //作业执行计数器
    int waitime;     //等待时间

} JCB;


int font, rear;      //调度队列指针
JCB *Queue[maxn];    //作业调度队列
int number;          //队列中的作业数
long Time;           //模拟时钟


/*添加辅助延时函数*/
void Delay()
{
    for (int i = 0; i < 100000; i++)
        for (int j = 0;j < 10000; j++) ;
}


/*各参数初始化*/
void init()
{
    font = rear = 0;
    number = 0;
    Time = 0;
}


/*作业运行器*/
void RunningJob(JCB *job)
{
    job->Count = 0;   //作业计数器归零

    while (job->Count <= job->runtime) job->Count++;    //执行作业

    delete job;      //释放该作业
}

/*建立作业*/
void MakeJob(int num, JCB *job)
{
    for (int i = 0; i < num; i++) {

        job = new JCB;
        job->runtime = 10000 + rand() % 10001;          //随机化作业的运行时间(10000——20000)
        job->priority = number;
        Queue[rear] = job;
        rear = (rear + 1) % maxn;
        number++;
    }
}

/*作业调度函数*/
void RunJob()
{
    while (number > 0) {

        cout << "Job is running..." << endl;
        while (Queue[font]->Count <= Queue[font]->runtime) Queue[font]->Count++;
        Delay();            //延时等待(为了使作业运行显式化)
        cout <<"Job is finished!" << endl;

        delete Queue[font];

        font = (font + 1) % maxn;

        number--;
    }
}

int main()
{
    init();

    while (Time < LONG_MAX) {

        JCB *job = NULL;

        int num = rand() % 5;      //随机产生作业数量(0——4个)

        cout << "Creat Jobs number = " << num << endl;

        MakeJob(num, job);         //随机创建num个进程并加入作业调度队列

        RunJob();                  //按照FCFS的执行思路调度作业

        Time++;
    }
    return 0;
}

 

执行结果:

作业调度算法-先到先服务(FCFS)_第1张图片

你可能感兴趣的:(操作系统)