C++ 实现 SJF 算法代码优化:处理多个进程同时到达的情况
#include
bool CmpByComeTime(process p1, process p2) // 按到达时间正序排序 { return p1.come_time < p2.come_time; }
bool CmpByRunTime(process p1, process p2) // 按运行时长正序排序 { if(p1.run_time==p2.run_time){ return p1.come_time<p2.come_time; } return p1.run_time<p2.run_time; }
void get_beginAndOver_time() // 计算作业的开始时间与完成时间 { for(int i=0;i<number;i++){ if(i==0){ pc[i].begin_time = pc[i].come_time; } else{ pc[i].begin_time = pc[i-1].over_time; } pc[i].over_time = pc[i].begin_time + pc[i].run_time; } } void get_roundAndAvg_time() // 计算作业的周转时间与带权周转时间 { for (int i = 0; i < number; ++i){ pc[i].round_time = pc[i].over_time - pc[i].come_time; pc[i].avg_time = pc[i].round_time * 1.0 / pc[i].run_time; } }
void printResult() // 打印输出作业的各个时间值
{
cout << '执行顺序:';
for (int i = 0; i < number; ++i)
{
cout << pc[i].pid << ' ';
}
cout << endl;
cout << '作业名' << '\t' << '到达时' << '\t' << '运行时' << '\t'
<< '开始时' << '\t' << '完成时' << '\t' << '周转时' << '\t'
<< '带权周转时' << '\t' << endl;
sort(pc, pc + number, CmpByPid);
double sum_round_time = 0.0;
double avg_sum_round_time = 0.0; // 平均周转时间
double sum_avg_time = 0.0;
double avg_sum_avg_time = 0.0; // 平均带权周转时间
for (int i = 0; i < number; ++i)
{
sum_round_time += pc[i].round_time;
sum_avg_time += pc[i].avg_time;
cout << pc[i].pid << '\t' << pc[i].come_time << '\t'
<< pc[i].run_time << '\t' << pc[i].begin_time << '\t'
<< pc[i].over_time << '\t' << pc[i].round_time << '\t'
<< pc[i].avg_time << endl;
}
avg_sum_round_time = sum_round_time * 1.0 / number;
avg_sum_avg_time = sum_avg_time * 1.0 / number;
cout << '平均周转时间: ' << avg_sum_round_time << endl
<< '平均带权周转时间: ' << avg_sum_avg_time << endl;
}
void SJF() // SJF(short job first):根据作业的运行时间从小到大依次执行 { sort(pc,pc+number,CmpByComeTime); // 按到达时间排序 int cur_time = pc[0].come_time; // 记录当前时间,初始为第一个作业到达时间 int cur_index = 0; // 记录当前作业的下标 int finished = 0; // 记录已完成的作业数量 while(finished<number){ int next_index = cur_index+1; // 记录下一个作业的下标 while(next_index<number && pc[next_index].come_time<=cur_time){ // 找到所有同时到达的作业 next_index++; } sort(pc+cur_index,pc+next_index,CmpByRunTime); // 对同时到达的作业按运行时间排序 pc[cur_index].begin_time = cur_time; // 当前作业开始时间为当前时间 pc[cur_index].over_time = cur_time + pc[cur_index].run_time; // 当前作业结束时间为当前时间加上运行时间 pc[cur_index].round_time = pc[cur_index].over_time - pc[cur_index].come_time; // 计算周转时间 pc[cur_index].avg_time = pc[cur_index].round_time * 1.0 / pc[cur_index].run_time; // 计算带权周转时间 cur_time = pc[cur_index].over_time; // 更新当前时间 cur_index++; // 更新当前作业下标 finished++; // 已完成的作业数量加1 } }
int main() // 入口函数 { cout << '请输入进程个数:'; cin >> number; cout << endl; cout << '请分别输入进程的名称、到达时间、服务时间:' << endl; for (int i = 0; i < number; i++) { cin >> pc[i].pid >> pc[i].come_time >> pc[i].run_time; } cout << endl; SJF(); cout << 'the results of SJF are:' << endl; printResult(); cout << endl; system('pause'); return 0; }
原文地址: https://www.cveoy.top/t/topic/n3oO 著作权归作者所有。请勿转载和采集!