在批处理系统中,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);
}
}
版权声明:本文为baidu_38304645原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。