2014-02-12 5 views
-2

Я пишу программу, которая имитирует планировщик процессора с круговым движением. После timestamp (переменный ввод в командной строке) количества единиц времени планировщик должен переместить этот процесс в нижнюю часть очереди и возобновить со следующего узла.Что использовать вместо модуля?

У меня возникли проблемы с попыткой рассчитать, когда я нахожусь в конце цикла, сначала я попытался с модулем, но я понял, что это плохо. Затем я попытался использовать литеральный расчет, и даже бросил поплавки, но он все еще не работает. Утверждение верно, когда обработанное значение равно 0 и является ложным при всех других значениях работы.

То, что я пробовал:

if ((queue->worked % timestamp) != 0) 
if ((queue->worked - (timestamp * (queue->worked/timestamp))) == 0) 
if ((float) (queue->worked - (float) (timestamp * (float) (queue->worked/timestamp))) == 0) 

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

Ниже приведены некоторые из соответствующего кода:

struct node { 
    double process_id; 
    int arrival_time; 
    int cpu_time; 
    int worked; 
    struct node *nextElement; 
}; 

void round_robin(nodeptr firstNode, int timestamp) { 
    nodeptr queue = firstNode; 

    if ((queue->worked % timestamp) == 0) { 
     queue->worked++; 
     current_time++; 
    } 
    else { 
     tmpptr = queue; 
     queue = queue->nextElement; 
     add_to_bottom(tmpptr, queue); 
    } 
} 

Вот набор образцов. Это строки в текстовом файле, которые считываются основной функцией и хранятся в виде связанного списка узлов.

2001 0 20 
2002 1 10 
2005 2 15 
2007 3 4 

где столбцы представляют собой идентификатор процесса, время прибытия и время, которое будет выполняться процессом для вычисления (в миллисекундах).

Указатель на первый узел (процесс 2001) передается функции, а также целое число, который был передан в качестве аргумента (./main 10)

Функция перебирает список и имитирует раунд графический планировщик.

Шаг за шагом: Так что, если я вход 10 для временной метки (вывод не важно сейчас)

Process 2001 should calculate for 10 milliseconds, then get send to the back of the list. 
Process 2002 will calculate for 10 and finish. 
Process 2005 will calculate for 10 milliseconds, get send to the back. 
Process 2007 will calculate for 4 and be done. 
Process 2001 was went to the back and now runs for 10 more and finishes. 
Process 2005 calculates for the remaining 5 and the program is now done. 

Edit:

Я добавил Printf, что сказал "! Если \ п" в if и том, который сказал «Else! \ n» в else, и он печатает, если один раз (обработан инициализирован 0), а затем еще раз каждый раз, когда этот узел запущен. Он вводит только в значение if для значения нуля, после того как обработанный увеличивается, он больше не вводится и застревает в бесконечном цикле завершения первого процесса.

If! 
Else! 
If! 
Else! 
If! 
Else! 
If! 
Else! 
Else! 
Else! 
Else! 
...until it eventually segfaults after about 900 lines 
+12

* Сначала я попытался с модулем, но я понял, что это плохо. * - Почему это «плохо»? Укажите «не работает». –

+0

@EdS. Команда модуля не работает одинаково на всех языках, в зависимости от определения целого. Все утверждения вычисляются как истинные, когда обработанный атрибут равен 0 и является ложным при всех других значениях работы. – xjsc16x

+0

Почему бы не 'if (queue-> work! = Timestamp) ...'? –

ответ

1

% в С не модуль упругости, но остальное. Не используйте его для подписанных типов, например int, если вы не знаете, что он делает. Возможно, ваши заботы прекратятся, если вы измените своих членов int на unsigned. На unsigned у вас есть гарантия, что a % b всегда относится к ассортименту 0 .. b-1.

Смежные вопросы