实现 下面是用Java程序比较FCFS,SJF和PSA算法效率的示例代码:FCFS思路 对于FCFS算法,我们可以定义一个Process类来表示一个进程,其中包含进程名称、到达时间和执行时间三个属性。然后我们可以定义一个FCFS类,其中包含一个ArrayList来存储所有的进程,并实现调度算法的逻辑。源码 publicclassFCFS{privateArrayListProcessprocessLpublicFCFS(ArrayListProcessprocessList){this。processListprocessL}publicvoidschedule(){按照进程的到达时间升序排序Collections。sort(processList,(p1,p2)p1。arrivalTimep2。arrivalTime);intcurrentTime0;intwaitingTime0;intturnaroundTime0;for(Processp:processList){if(currentTimep。arrivalTime){currentTimep。arrivalT}waitingTimecurrentTimep。arrivalTturnaroundTimecurrentTimep。arrivalTimep。executionTcurrentTimep。executionT}doubleaverageWaitingTime(double)waitingTimeprocessList。size();doubleaverageTurnaroundTime(double)turnaroundTimeprocessList。size();System。out。println(平均等待时间:averageWaitingTime);System。out。println(平均周转时间:averageTurnaroundTime);}} 解释 在FCFS算法的示例代码中,我们定义了一个Process类来表示一个进程,包含进程名称、到达时间和执行时间三个属性。然后我们定义了一个FCFS类,其中包含一个ArrayList来存储所有的进程,并实现调度算法的逻辑。 调度算法的逻辑如下:首先,将进程列表按照到达时间升序排序。然后,遍历每一个进程如果当前时刻小于进程的到达时间,则将当前时刻更新为进程的到达时间。然后,计算等待时间和周转时间:等待时间当前时刻进程的到达时间周转时间当前时刻进程的到达时间进程的执行时间最后,将当前时刻更新为当前时刻进程的执行时间。 在遍历完所有的进程之后,我们可以计算平均等待时间和平均周转时间,以此来评估FCFS算法的性能。 最后,调用FCFS类的schedule方法来执行调度算法即可。SJF思路 对于FCFS算法,我们可以定义一个Process类来表示一个进程,其中包含进程名称、到达时间和执行时间三个属性。然后我们可以定义一个FCFS类,其中包含一个ArrayList来存储所有的进程,并实现调度算法的逻辑。源码publicclassSJF{privateArrayListProcessprocessLpublicSJF(ArrayListProcessprocessList){this。processListprocessL}publicvoidschedule(){intcurrentTime0;intwaitingTime0;intturnaroundTime0;while(!processList。isEmpty()){找到当前时刻最先到达的,执行时间最短的进程ProcesspprocessList。stream()。filter(processprocess。arrivalTimecurrentTime)。min((p1,p2)p1。executionTimep2。executionTime)。get();waitingTimecurrentTimep。arrivalTturnaroundTimecurrentTimep。arrivalTimep。executionTcurrentTimep。executionTprocessList。remove(p);}doubleaverageWaitingTime(double)waitingTimeprocessList。size();doubleaverageTurnaroundTime(double)turnaroundTimeprocessList。size();System。out。println(平均等待时间:averageWaitingTime);System。out。println(平均周转时间:averageTurnaroundTime);}}解释 在SJF算法的示例代码中,我们定义了一个Process类来表示一个进程,包含进程名称、到达时间和执行时间三个属性。然后我们定义了一个SJF类,其中包含一个ArrayList来存储所有的进程,并实现调度算法的逻辑。 调度算法的逻辑如下:使用streamAPI的filter和min方法来找到当前时刻最先到达的,执行时间最短的进程。然后,计算等待时间和周转时间:等待时间当前时刻进程的到达时间周转时间当前时刻进程的到达时间进程的执行时间最后,将当前时刻更新为当前时刻进程的执行时间。 在遍历完所有的进程之后,我们可以计算平均等待时间和平均周转时间,以此来评估SJF算法的性能。 最后,调用SJF类的schedule方法来执行调度算法即可。PSA思路 对于PSA算法,我们需要在Process类中增加一个优先级的属性,并在调度算法的逻辑上进行相应的修改。 如果进程在等待CPU时间的时间越长,就将它的优先级设为越高。这样,当进程获得CPU时间的机会时,就能够优先执行。这种算法能够有效地应对突发性的高优先级作业。首先,为每个进程设定一个初始优先级。然后,每当进程等待CPU时间超过一定的阈值,就将进程的优先级提高。当进程获得CPU时间时,按照优先级的高低进行调度。 需要注意的是,当进程执行完成后,需要将进程的优先级恢复为初始值。源码publicclassPSA{privateArrayListProcessprocessLpublicPSA(ArrayListProcessprocessList){this。processListprocessL}publicvoidschedule(){intcurrentTime0;intwaitingTime0;intturnaroundTime0;while(!processList。isEmpty()){找到当前时刻最先到达的,优先级最高的进程ProcesspprocessList。stream()。filter(processprocess。arrivalTimecurrentTime)。max((p1,p2)p1。priorityp2。priority)。get();waitingTimecurrentTimep。arrivalTturnaroundTimecurrentTimep。arrivalTimep。executionTcurrentTimep。executionTprocessList。remove(p);}doubleaverageWaitingTime(double)waitingTimeprocessList。size();doubleaverageTurnaroundTime(double)turnaroundTimeprocessList。size();System。out。println(平均等待时间:averageWaitingTime);System。out。println(平均周转时间:averageTurnaroundTime);}}解释 首先,在示例代码中,我们定义了一个Process类来表示一个进程,包含进程名称、到达时间、执行时间和剩余执行时间四个属性。然后我们定义了一个PSA类,其中包含一个ArrayList来存储所有的进程,并实现调度算法的逻辑。 调度算法的逻辑如下:首先,将进程列表按照到达时间升序排序。然后,循环执行以下步骤,直到进程列表为空:从进程列表中取出第一个进程,并将其从列表中移除。如果当前时刻小于进程的到达时间,则将当前时刻更新为进程的到达时间。如果进程的剩余执行时间大于时间片,则执行时间片的长度;否则,执行进程剩余的所有时间。计算等待时间和周转时间:等待时间当前时刻进程的到达时间周转时间当前时刻进程的到达时间进程的执行时间如果进程的剩余执行时间为0,则将进程从进程列表中移除;否则,将进程插入进程列表的末尾。将当前时刻更新为当前时刻执行的时间。 在遍历完所有的进程之后,我们可以计算平均等待时间和平均周转时间,以此来评估PSA算法的性能。 最后,调用PSA类的schedule方法来执行调度算法即可。三种方法效率比较 都以相同的开始时间、进行时间、以及优先级进行比较 arr〔0〕{0,20,2}; arr〔1〕{5,15,1}; arr〔2〕{10,5,4}; arr〔3〕{15,10,3}; 优先级是为了比较PSA的两种抢占效率(抢占式、非抢占式)。FCFS SJF PSA抢占式 非抢占式 总结: FCFS算法是一种简单的调度算法,它按照进程的到达时间顺序依次执行进程,不考虑进程的执行时间。由于不能有效地应对短作业,因此FCFS算法的效率并不高。 SJF算法是一种较高效的调度算法,它优先执行执行时间较短的进程,能够有效地应对短作业。但是,SJF算法不能有效地应对突发性的高优先级作业。 PSA算法是一种动态调度算法,它根据进程的等待时间动态调整进程的优先级,能够有效地应对突发性的高优先级作业。但是,PSA算法的实现较为复杂,因此其运行效率略低于SJF算法。 总的来说,SJF算法的效率略高于PSA算法,而FCFS算法的效率较低。不同的调度算法适用于不同的场景,应根据实际需要选择合适的调度算法。