设置了四个作业进行实验
根据计算,根据先到先服务算法,得出作业的调度流程图
运行程序,得出程序运行结果
通过对比可以发现,程序运行正确,并且程序还可以输出,每一秒运行的状态,参数包括正在运行的进程名,开始运行时间,及当前就绪队列中的进程名
流程图
源程序#includeusing namespace std; const int N = 20; int h[N], hh, tt = -1;//用数组模拟队列,就绪队列, 存放的是进程的下标 struct Process { string name;//进程名 int arriveTime;//到达时间 int runTime;//运行时间 bool st = false;//是否已经运行完毕, false为没运行完 int startTime = 0x3f3f3f3f;//开始运行时间 int endTime = 0x3f3f3f3f;//结束运行时间 int priority;//截至时间 }process[N];//N个进程 void init() { //初始化四个进程 process[1].arriveTime = 0, process[1].runTime = 4, process[1].name = "process 1", process[1].priority = 4; process[2].arriveTime = 2, process[2].runTime = 2, process[2].name = "process 2", process[2].priority = 6; process[3].arriveTime = 1, process[3].runTime = 3, process[3].name = "process 3", process[3].priority = 9; process[4].arriveTime = 4, process[4].runTime = 1, process[4].name = "process 4", process[4].priority = 10; } void arriveCheck(int syTime)//每秒钟都check一下有没有新进程来 { for(int i = 1; i <= 4; i ++) if(!process[i].st && process[i].arriveTime <= syTime)//当进程到达,进入就绪队列 { h[++ tt] = i; process[i].st = true;//标记已经到达 } } void print(int i, int t)//打印每秒的输出 { cout << "当前时间是 " << i << " 正在运行的进程是 " << process[t].name << " 开始运行时间为 " << process[t].startTime << endl; if(tt >= hh) { cout << "当前就绪队列中的进程为 "; for(int j = hh; j <= tt; j ++) cout << process[h[j]].name << ' '; cout << endl << endl; } else cout << "当前就绪队列为空" << endl << endl; } void printResult()//打印最终结果 { cout << "最早截至时间调度算法已经全部运行完毕" << endl; cout << "进程名 " << "到达时间 " << "开始运行时间 " << "结束运行时间 " << "周转时间 " << endl; double sum = 0;//计算平均周转时间 for(int i = 1; i <= 4; i ++) { int t = process[i].endTime - process[i].arriveTime;//周转时间 sum += t; cout << process[i].name << " " << process[i].arriveTime << " " << process[i].startTime << " " << process[i].endTime << " " << t << endl; } cout << "平均周转时间为 " << sum / 4 << endl; } int main() { init(); int syTime = 0;//系统时间 int t = 0;//当前正在运行的进程 int n = 4;//总进程数 while(n) { arriveCheck(syTime); if(!t)//初始化,第一个进入的进程 { t = h[hh ++]; process[t].startTime = syTime;//开始运行时间 process[t].st = true; } print(syTime, t);//显示信息 if(process[t].runTime <= 0)//当前进程做完,调入就绪序列的下一个 { process[t].endTime = syTime;//上个进程结束运行时间 if(tt > hh)//就绪队列中有两个以上的作业,排序后,调用截至时间最近的那个 { int i = hh;//截至时间最近的作业的下标 for(int j = hh + 1; j <= tt; j ++)//找到截至时间最近的进程的下标 if(process[h[i]].priority > process[h[j]].priority) i = j; t = h[i];//当前进程在process中的下标 if(i == tt) tt --;//利用覆盖法,把该进程从就绪队列中删除,因为它已经在做了 else { for(int j = i + 1; j <= tt; j ++) h[j - 1] = h[j]; tt --; } } else t = h[hh ++]; process[t].startTime = syTime;//该进程开始运行时间 n --; } syTime ++; process[t].runTime --; } printResult(); return 0; }



