處理機排程-高響應比優先排程(HRRN)
阿新 • • 發佈:2018-12-12
在批處理系統中,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); } }