C++模擬處理機HRRN排程演算法
阿新 • • 發佈:2018-12-05
本實驗隨機輸入的程序個數、程序名稱、程序提交到系統的時間、程序執行所需時間。通過模擬程式。顯示以下資訊:
1)處理機對程序的排程過程。
2)計算這N個程序的平均週轉時間。
三、HRRN(最高響應比排程演算法)原理
最高響應比排程:在每次排程作業時,先計算後備隊中每個作業的響應比,然後挑選響應比高者投入執行。
響應比R定義:
R=(w+S)/S
(R:響應比,W=等待時間,S=執行時間)
響應比R= 週轉時間 / 執行時間
=(執行時間 + 等待時間)/ 執行時間
= 1 +(等待時間 / 執行時間)
四、示例
如:輸入
程序個數:5
程序名稱 到達系統時間 所需服務時間
A 0 3
B 2 6
C 4 4
D 6 5
E 8 2
顯示執行結果:
程序名稱 到達系統時間 所需服務時間 開始時間 結束時間
A 0 3 0 3
B 2 6 3 9
C 4 4 9 13
E 8 2 13 15
D 6 5 15 20
5個程序的平均週轉時間:(3+7+9+7+14)/5=8
#include <bits/stdc++.h>
using namespace std;
struct Process
{
char name;
int start_time;
int surves_time;
int turnover_time;
int end_time;
double priority;
} P[1000];
bool cmp1(const Process &p1, const Process &p2)
{
if(p1.start_time==p2.start_time)
return p1.surves_time<p2.surves_time;
return p1.start_time<p2.start_time;
}
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(Process *p, int n)
{
int i, j, k, finish;
double sum=0.0;
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;
}
cout<<"程序名稱\t"<<"到達系統時間\t"<<"所需服務時間\t"<<"開始時間\t"<<"結束時間\t"<<endl;
for(int i=0; i<n; i++)
{
if(!i)
cout<<p[i].name<<"\t\t"<<p[i].start_time<<"\t\t"<<p[i].surves_time<<"\t\t"<<p[i].start_time<<"\t\t"<<p[i].end_time<<endl;
else
cout<<p[i].name<<"\t\t"<<p[i].start_time<<"\t\t"<<p[i].surves_time<<"\t\t"<<p[i-1].end_time<<"\t\t"<<p[i].end_time<<endl;
sum+=p[i].turnover_time;
}
cout<<"平均週轉時間: "<<sum/n*1.0<<endl;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0; i<n; i++)
cin>>P[i].name>>P[i].start_time>>P[i].surves_time;
HRRN(P,n);
}
return 0;
}
效果圖: