Планировщик циклического перебора с использованием связанного списка

Я пытаюсь написать очень простой симулятор ОС, и я застрял в работе алгоритма циклического перебора. В основном то, что я пытаюсь сделать, это создать круговой связанный список, в котором хранятся пакетные значения процесса. Прямо сейчас я получаю исключение нулевого указателя. Прошло некоторое время с тех пор, как я использовал связанный список, поэтому несите мой код:

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 5 4 4 3 2 10 9 8 7 6 5 3 2 1 7 6 5 Исключение в потоке "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());

и теперь это исключение такого элемента.


person Thomas    schedule 20.11.2012    source источник
comment
Можете ли вы показать параметры, которые вы передали в вызове метода?   -  person Konstantinos Margaritis    schedule 21.11.2012


Ответы (3)


У меня нет доступа к eclipse, чтобы проверить это в данный момент, но вы уверены, что не пытаетесь вызвать process.getFirst() после того, как последний элемент будет удален из списка внутри цикла for?

Я бы предложил поставить точку останова перед этой строкой, а затем запустить код в режиме отладки для проверки.

person thedan    schedule 20.11.2012

Это означает то, что он говорит. Первого элемента нет, поэтому список process пуст.

Это должно происходить потому, что обработка квантов в цикле j сделала список пустым.

Если вы добавите код трассировки для вывода всего списка во время каждой итерации, а не только первого элемента, станет совершенно очевидно, что происходит.

Отладка всегда заключается в том, чтобы заставить себя увидеть, что происходит на самом деле, а не разгадывать неясную головоломку. Главный инструмент, который вам нужен, чтобы визуализировать то, что происходит на самом деле (когда ваш мозг подводит вас), — это сама машина. Добавьте код трассировки или станьте экспертом в отладчике. Дисциплина заключается в том, чтобы заставить себя увидеть истину.

person Gene    schedule 20.11.2012

Перед вызовом 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");
}
person Nikhil    schedule 14.01.2016