我刚刚在我的大学开始学习编程,到目前为止我们正在与Java作斗争。我们的任务是模拟不同的处理器算法,如fcfs,sjf等。我尝试了很多方法,你看到的方法可能是最不优化的。我知道,这段代码可能不是最好的,也可能算法本身,但我想知道它是否按预期工作,我发现了一个问题,我无法理解一点太长了,我不能睡觉,直到我发现它有什么问题。
在下面的代码中,你会发现一个带有注释行的#top循环"为什么这个循环无法使用"用大写字母写的。我不知道为什么它永远不会停止(我运行了一些打印测试,我知道这是永远存在的循环)而且它真的让我感到紧张(很可能是因为解决方案现在非常简单)。
一些解释:我创建了一个进程列表,然后我执行了一些方法。过程描述为:执行时间(execTime);时间,它需要等待开始执行(waitTime);在什么时候准备执行(inTime)(但可能正在等待其他进程完成执行)和id。我通过减少它的execTime来执行进程直到它达到0,然后我删除了进程并为#34;新的第一个"执行相同的操作。这个减少的部分就是当程序进入无限时。
芒果
import java.util.ArrayList;
import java.util.List;
public class Processor {
List<Process> listOP = new ArrayList<Process>();
int processorTime = 0;
int totalWaitTime = 0;
int numberOfProcesses = 0;
public Processor(){
for(int i=0; i<100; i++){
listOP.add(new Process(i));
if(i>0)
listOP.get(i).inTime += listOP.get(i-1).inTime + (int)((Math.random() + 0.1)*10);
System.out.println("Proces " + (listOP.get(i).id + 1) + " czas wejścia " + listOP.get(i).inTime);
}
}
public double fcfs(){
numberOfProcesses = listOP.size();
while(listOP.size() != 0){
if(listOP.get(0).inTime > processorTime){
for(int i=0; i<listOP.size(); i++){
listOP.get(i).waitTime = 0;
}
}
totalWaitTime += listOP.get(0).waitTime;
while(listOP.get(0).execTime != 0){//**WHY IS THIS LOOP INFINITE**
for(int i=1; i<listOP.size(); i++){
if(processorTime == listOP.get(i).inTime)
listOP.get(i).waitTime++;
}
listOP.get(0).execTime--;
processorTime++;
}
processorTime++;
listOP.remove(0);
}
System.out.println(totalWaitTime);
System.out.println(numberOfProcesses);
System.out.println(processorTime);
System.out.println("Średni czas tego ciągu procesów: " + totalWaitTime/numberOfProcesses);
return totalWaitTime/numberOfProcesses;
}
}