我正在努力想象一个简单的循环调度程序,它可以找到到达服务器的固定数量进程的平均等待时间。假设我得到了一个到达时间、突发时间和量子时间(为每个进程服务的固定时间)的数组,按到达时间的升序排序。
public float roundRobin (int n, int[] arrivalTimes, int[] runTimes, int quantumTime) {
Queue<Integer> queue = new LinkedList<>(Arrays.asList(runTimes));
int waitingTime = 0;
while (!queue.isEmpty()) {
int currentProcess = queue.poll();
if (currentProcess > quantumTime) {
int remaining = currentProcess - quantumTime;
waitingTime += remaining;
queue.add(remaining );
}
}
return (float)waitingTime/n;
}
当我尝试使用我在互联网上找到的示例输入运行时,上面的代码没有产生正确的平均等待时间。有人能告诉我我做错了什么,以及我如何正确执行我的结果吗?任何帮助都将不胜感激!
你有正确的想法。最简单的方法是模拟过程,但您缺少一些关键部分,这些部分将阻止您获得正确的解决方案。
我创建了一个类似的循环程序,可以满足您的需求。
//Use a class to keep track of the current processes status.
public class Process{
public int burstTime;
public int arrivalTime;
public int completionTime;
public int remainingRunTime;
//Initialize processes with an arrival time and burst time
public Process( int arrivalTimeValue , int burstTimeValue){
burstTime = burstTimeValue;
arrivalTime = arrivalTimeValue;
completionTime = -1;
remainingRunTime = burstTime;
}
}
static public float roundRobin ( int[] arrivalTimes, int[] burstTimes, int quantumTime) {
//Avoid divide by zero
if(arrivalTimes.length == 0)
return 0;
//processes can be either arriving, running or finished
List<Process> arrivingProcesses = new ArrayList<Process>();
Queue<Process> runningProcesses = new LinkedList<Process>();
List<Process> finishedProcesses = new ArrayList<Process>();
//Create all processes in arriving
for(int i = 0; i < arrivalTimes.length; i++){
arrivingProcesses.add(new Process(arrivalTimes[i], burstTimes[i]));
}
//I assume the arrays already list the processes based on priority.
// If there is another way you want to choose priority then you should sort arrivingProcesses
int currentTime = 0;
//Simulate time until the processes are all finished
while(!(arrivingProcesses.isEmpty() && runningProcesses.isEmpty())){
//First add any arriving processes to the queue
for(int i = arrivingProcesses.size()-1; i>= 0; i--){
if(arrivingProcesses.get(i).arrivalTime <= currentTime){
runningProcesses.add(arrivingProcesses.get(i));
arrivingProcesses.remove(i);
}
}
//Run the first item in the queue
if(!runningProcesses.isEmpty())
runningProcesses.peek().remainingRunTime --;
currentTime++;
//finish process if run time is 0
if(runningProcesses.peek().remainingRunTime == 0){
runningProcesses.peek().completionTime = currentTime;
finishedProcesses.add(runningProcesses.remove());
}
//if the quantum time is reached, put the process in the back
if(currentTime%quantumTime == 0 && !runningProcesses.isEmpty()){
runningProcesses.add(runningProcesses.remove());
}
}
//Calculate total waiting time
float totalWaitTime = 0;
for(Process checkProcess : finishedProcesses){
totalWaitTime += (checkProcess.completionTime - (checkProcess.arrivalTime + checkProcess.burstTime));
}
//return the average
return totalWaitTime / arrivalTimes.length;
}
如果这些都不合理,请告诉我。
int[]
是单个对象,因此您无法通过Array. asList()
将其转换为列表,因为它返回List
public static List<Integer> asList(int[] array) {
List<Integer> result = new ArrayList<>(array.length);
for (int i : array)
result.add(i);
return result;
}
我有一个用户表和一个高尔夫比赛分数表。当用户参加比赛时,他使用表格在结果表中记录分数。我想显示一个结果表,显示用户的完整列表和比赛的分数。表中有八列分数——每门课一列。我正在努力使用php代码来显示结果分数。如果一名球员已经比赛,他的得分将正确显示,但如果表中的下一名球员没有比赛,则他的得分将显示为表中高于他的球员的得分。这将在列表中继续下去,直到获得真正的分数。我试图找到答案,但没有成功。这是我
我们在Hadoop 2.7.2和Centos 7.2上运行Apache Spark 2.0的集群。我们使用Spark DataFrame/DataSet API编写了一些新代码,但在写入并将数据读取到Windows Azure存储Blob(默认HDFS位置)后,注意到连接上的结果不正确。我已经能够使用在群集上运行的以下代码片段复制该问题。 输出 这是正确的。然而,在写入和读取数据之后,我们看到了这
我编写了一个程序,提示用户输入10个等级,并计算等级之和、等级平均值、最高等级、最低等级以及最高和最低等级之间的范围。然后用这个系统打印所有这些东西。出来打印 我的问题是,除了最高的价值,所有的东西都能工作。这是我的密码。 int x=10; int i=1; int和=0; int猜测=100; int max=100; 假设输入的10个数字是10,20,30,40,50,60,70,80,90
问题内容: 我需要在Java中执行一些浮点运算,如下面的代码所示: 这是为了模拟Betfair Spinner小部件作为输出给出的值的范围。 Java中的浮点算术似乎引入了一些意外错误。例如,我得到2.180000000000001而不是2.18。浮点数有什么用,您不相信对它们执行的算术结果吗?我该如何解决这个问题? 问题答案: 如果您需要精确的十进制值,则应使用java.math.BigDeci
我正在尝试制作一个闰年计算器,它还可以告诉你是无意中输入了字符串还是双精度而不是整数。我想让这个程序反复运行“错误。请输入一个不带小数的数字:”直到用户输入一个整数。然而,目前,对于第一个try-catch块,如果我输入了两种错误的输入类型,它会给我以下错误消息: 第二个至少稍微好一点,它不断重复我输入的最后一个整数的结果(年份“是闰年/不是闰年”),但至少它永远重复,不像第一个。 所有我想要的错
问题内容: 所以我在这里写了一些代码。它本来应该是一个猜谜游戏,但是无论我输入什么内容,它始终会在输出中显示“请输入数字…”,这与我输入的内容无关。基本上,如果“猜测”大于5,则他们猜到了数字。如果不是,那么他们还没有猜到这个数字。这就是游戏的前提。有人可以帮助我修复我的代码,因此无论如何它都不会输出相同的内容? 问题答案: 给你字符。因此,当您输入“ 1”时,它会给您其char值49。因此您不能
片段着色器 结果是一个绿色屏幕,里面有一个黑色矩形。但我希望长方形改为蓝色。我的代码有问题吗?
问题内容: 我正在做一个游戏,我需要每3秒更新一次JProgressBar。为此,我使用while循环。问题是我的程序由于while循环而冻结(我在其他问题中读过它,它们没有帮助我解决此问题)。我不知道该怎么解决。这是我的代码: 你能帮我吗? 问题答案: 您应该在自己的线程中运行循环: 顺便说一句:如果您没有在方法中使用“ String [] args”,则没有理由在方法中声明它。