作業排程演算法-先到先服務(FCFS)
阿新 • • 發佈:2018-12-15
關於先到先服務演算法,我這裡只陳述幾個要點:
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; }
執行結果: