1. 程式人生 > >作業排程演算法-先到先服務(FCFS)

作業排程演算法-先到先服務(FCFS)

關於先到先服務演算法,我這裡只陳述幾個要點:

1.為什麼縮寫是FCFS?

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

2.FCFS演算法中優先順序的評定標準?

優先順序根據等待時間來確定,等待時間越長,優先順序越高,越優先執行。

3.為什麼說等待時間越長FCFS演算法排程作業的優先順序越高?

這個問題開始挺糾結我的,不曉得大家有沒有糾結過,給大家做一個比喻,當前一個飯店處於爆滿狀態(處理機排程作業此時處於忙碌狀態),而此時還有好多顧客去吃飯(有好多新的作業進入排程佇列),先到的顧客肯定比後到的顧客已經等待的時間要長,因此一旦有位子自然先到的顧客先入座,就是這樣。

下面給出FCFS演算法的執行模擬:

#include <bits/stdc++.h>

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;
}

執行結果: