使用链表的循环调度程序

时间:2012-11-20 22:54:16

标签: java scheduling round-robin

我正在尝试编写一个非常简单的操作系统模拟器,但我仍然无法使用循环算法。基本上我要做的是创建一个循环链表,用于存储进程的突发值。现在我得到一个空指针异常。我已经使用了一个链表,所以我已经有一段时间了,所以请耐心等待我的代码:

public static void RR3(int numProcess, int[] cpuBurst, int[] arrivalTime){
    int quantum = 3,time = 0, temp;
    int completionTime = 0;
    LinkedList <Integer>process = new LinkedList();
    for (int i = 0; i < numProcess; i++) {
        process.add(i, cpuBurst[i]);
    }

    while (process.isEmpty() != true){

        for (int j  = 0; j < quantum; j++) {
            System.out.println(process.getFirst());
            if(process.peek() == 0 ){
                completionTime = completionTime + time;
                process.remove();
            }
            else{
                temp = process.pop();
                process.push(temp - 1);                   
                time++;                  
            }
        }
        process.addLast(process.getFirst()); 
        process.removeFirst();
    }

    double act = (double) completionTime/numProcess;
    System.out.println("-----------------RR3-----------------");
    System.out.println("             Act = " + act + "ms");  
}

我使用链接列表吗?任何帮助表示赞赏。 编辑: 我输入System.out.println(process.getFirst());在第一个for循环之后得到某种堆栈跟踪,这是我的输出:

  

6   五   4   4   3   2   10   9   8   7   6   五   3   2   1   7   6   五   线程“main”java.util.NoSuchElementException中的异常   4   3   2   1   4   3   1       在java.util.LinkedList.getFirst(LinkedList.java:242)   2   1       在OsSimulator.RR3(OsSimulator.java:61)       在OsSimulator.main(OsSimulator.java:79)   Java结果:1

我输入的爆发时间是6,4,10,7所以它看起来像是在正确的轨道上,但我得到了这条线的错误

process.addLast(process.getFirst());

现在它没有这样的元素异常。

3 个答案:

答案 0 :(得分:0)

这意味着它所说的。没有第一个元素,因此process列表为空。

必须发生这种情况,因为在j循环中处理量子会使列表为空。

如果添加跟踪代码以在每次迭代期间打印出整个列表而不仅仅是第一个元素,那么发生的事情就会非常明显。

调试总是让自己看到真正发生的事情,而不是猜测不透明的谜题。你必须想象出真正发生的事情(当你的大脑失败时)的主要工具是机器本身。添加跟踪代码或成为调试器的专家。纪律是强迫自己去看真相。

答案 1 :(得分:0)

我目前无法访问eclipse进行检查,但是您确定在从for循环中的列表中删除最后一个元素之后,您是否确实没有尝试调用process.getFirst()? / p>

我建议在该行之前放置一个断点,然后在调试模式下运行代码进行验证。

答案 2 :(得分:0)

在调用process.getFirst()之前确保List不为空

public static void RR3(int numProcess, int[] cpuBurst, int[] arrivalTime) {
    int quantum = 3, time = 0, temp;
    int completionTime = 0;
    LinkedList<Integer> process = new LinkedList<Integer>();
    for (int i = 0; i < numProcess; i++) {
        process.add(i, cpuBurst[i]);
    }

    while (process.isEmpty() != true) {


        for (int j = 0; j < quantum; j++) {

            if(process.size()==0)
              break;

            System.out.println("Process: "+process.getFirst());
            if (process.peek() == 0) {
                completionTime = completionTime + time;
                process.remove();
            } else {
                temp = process.pop();
                process.push(temp - 1);
                time++;
            }
        }
        if(process.size()==0)
              break;
        process.addLast(process.getFirst());
        process.removeFirst();
    }

    double act = (double) completionTime / numProcess;
    System.out.println("-----------------RR3-----------------");
    System.out.println("             Act = " + act + "ms");
}