1. 程式人生 > >處理機排程-高響應比優先排程(HRRN)

處理機排程-高響應比優先排程(HRRN)

在批處理系統中,FCFS演算法所考慮的只是作業的等待時間,而忽視了作業的執行時間。而SJF演算法正好與之相反,只考慮作業的執行時間,而忽視了作業的等待時間。

高響應比優先排程演算法則是即考慮了作業的等待時間,又考慮作業執行時間。我們為每一個作業引入一個動態優先順序,優先順序隨著時間的長而增加,使得長作業的優先順序在等待期間不斷的增加,等到足夠時間後,必然有機會獲得處理機。
優先順序 = (等待時間 + 要求服務時間) / 要求服務時間。

輸入:作業的數目、到達時間與服務時間.

輸出:作業的呼叫序列、週轉時間與結束時間。

需要的資料結構:

//程序
struct Process
{
    int id;                         //程序標記
    int start_time;                 //進入時間
    int surves_time;                //服務時間
    int turnover_time;              //週轉時間
    int end_time;                        //結束時間
    double priority;                //權值
};

輔助函式:

//按照權值進行排序,如果權值相等,則按照進入時間進行排序
bool cmp3(const Process &p1, const Process &p2)
{
    return (p1.priority > p2.priority) || (p1.priority==p2.priority && p1.start_time<p2.start_time);
}

實現方法:

void HRRN(queue<int> &q, Process *p, int n)
{
    int i, j, k, finish;

    finish = 0;
    j = 0;
    sort(p, p+n, cmp1);
    for(i = 0; i < n; i++)
    {
        while(j<n && p[j].start_time <= finish)
            j++;
        //對就緒佇列中的每一個程序計算優先順序
        for(k = i; k < j; k++)                                               
            p[k].priority = (finish-p[k].start_time+p[k].surves_time) / p[k].surves_time;
        sort(p+i, p+j, cmp3);

        if(p[i].start_time > finish)
            p[i].end_time = p[i].start_time + p[i].surves_time;
        else
            p[i].end_time = finish + p[i].surves_time;
        p[i].turnover_time = p[i].end_time - p[i].start_time;
        finish = p[i].end_time;
        q.push(p[i].id);
    }
}