短作业优先调度,作业越短,优先级越高,先被调度。
输入:作业的数目,作业的到达时间与服务时间.
输出:作业的调用序列与其周转时间与结束时间。
运行结果:
所需数据结构:
//进程
struct Process
{
int id; //进程标记
int start_time; //进入时间
int surves_time; //服务时间
int turnover_time; //周转时间
int end_time; //结束时间
double priority; //权值
};
辅助函数:
//按照服务时间进行排序,如果权值相等,则按照进入时间进行排序
bool cmp2(const Process &p1, const Process &p2)
{
return (p1.surves_time<p2.surves_time) || (p1.surves_time==p2.surves_time && p1.start_time<p2.start_time);
}
实现方法:
void SJF(queue<int> &q, Process *p, int n)
{
int i, j, finish;
finish = 0;
j = 0; //j为当前就绪队列的末尾指针
sort(p, p+n, cmp1);
for(i = 0; i < n; i++)
{
while(j<n && p[j].start_time <= finish) //当有新的进程的进入时间小于当前时间,就加入就绪队列
j++;
sort(p+i, p+j, cmp2); //每次都按照作业长短排序,即服务时间长短。
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);
}
}