Как настроить proc.c в minix для реализации алгоритма FCFS?

Я хочу настроить код файла minix /usr/src/kernel/proc.c для реализации алгоритма FCFS, но у меня нет никаких идей или подсказок. Мне говорили, что текущий алгоритм работает с каким-то уровнем приоритета и все процессы сначала идут в одну очередь, а потом по какому-то алгоритму процессам назначаются какие-то приоритеты. Но если мне нужно реализовать FCFS, мне придется работать только с одной очередью.

Но как связать эти вещи?


person Tanveer Ahmed    schedule 24.03.2012    source источник
comment
Вы могли бы получить лучший ответ, если бы предоставили ссылку (URL), где люди могут просмотреть источник. Одна из возможностей — рассмотреть возможность выравнивания приоритетов: установить для всего приоритет 1 (или любое другое подходящее значение). Вероятно, тогда будет работать FCFS. Если вы хотите распутать вещи так, чтобы у вас был только один (неприоритетный) список, вам придется понимать режим кода, знать, где создаются списки приоритетов (и затем создавать только один), и, возможно, даже удалить приоритет из списка. интерфейсы. Однако это гораздо более обширная операция над кодом, и, вероятно, не только в этом файле.   -  person Jonathan Leffler    schedule 25.03.2012
comment
Спасибо за эту помощь. Вы упомянули, что я должен установить приоритет равным 1 или любым другим подходящим значением, и в этом случае все очереди имеют одинаковый приоритет... но я обнаружил, что в миниксе на самом деле 16 очередей, работающих с разными приоритетами... но в FCFS все что мне нужно для работы только с одной очередью в которую все процессы приходят на работу, ссылка = eng.upm.edu.my/~kmbs/teaching/OS/html/proc_8c.html , здесь в функции постановки в очередь все процессы помещаются в MIN_USER_Q, это это очередь, с которой мне нужно работать. Но мне нужна дополнительная помощь о приоритетах, можете ли вы помочь, пожалуйста?   -  person Tanveer Ahmed    schedule 25.03.2012


Ответы (1)


Одна из возможностей, вероятно, не очень хорошая, — изменить enqueue() функция:

PUBLIC void enqueue(register struct proc *rp)   
{
    /* Add 'rp' to one of the queues of runnable processes.  This function is 
     * responsible for inserting a process into one of the scheduling queues. 
     * The mechanism is implemented here.   The actual scheduling policy is
     * defined in sched() and pick_proc().
     */
    int q = rp->p_priority;                       /* scheduling queue to use */

Вместо назначения rp->p_priority просто назначьте 0:

   int q = 0;

Таким образом, все процессы помещаются в очередь с одним приоритетом (номер очереди 0), и у вас есть одна система FCFS. Конечно, это предполагает, что enqueue() — единственная функция, добавляющая процессы в очереди. Есть неплохой шанс, что он единственный, но вам нужно знать большую часть ядра Minix, чтобы быть уверенным.

С этой модификацией вы можете выяснить, не слишком ли много места тратится впустую на поддержку нескольких очередей. Если есть, вы можете соответствующим образом настроить объявления очереди. Структура очереди, вероятно, представляет собой просто массив указателей; поэтому доступная экономия места невелика.

Обратите внимание, однако, что вам, вероятно, не нужна только FCFS; приоритетные очереди существуют по уважительным причинам. Например, ваши обработчики прерываний должны обслуживаться быстрее, чем тот монстр, который работает на SETI. Это означает, что должны быть определенные приоритеты.

person Jonathan Leffler    schedule 25.03.2012
comment
Спасибо, Джонатан Леффлер. Я благодарен вам за то, что ваша инструкция помогла мне успешно модифицировать ядро ​​minix (думаю, до сих пор). Но не могли бы вы сказать мне, есть ли какой-либо процесс или функция, с помощью которой я могу проверить, работает ли моя FCFS или есть какие-то логические ошибки или нет (нет ошибки компиляции, я уверен в этом)? буду признателен вам.. - person Tanveer Ahmed; 03.04.2012
comment
Короче не знаю. Но так как код запущен и есть только одна очередь, немного сложно понять, как он может работать иначе, чем FCFS. Может быть, вы можете запустить дюжину процессов с интенсивными вычислениями (которые, следовательно, не делают системных вызовов; инвертировать некоторые матрицы 100x100 или что-то в этом роде) и показать, что ваши интерактивные терминальные процессы задерживаются в ожидании завершения процессов с интенсивными вычислениями. их временной отрезок. Когда компьютеры работали на частоте 25 МГц, увидеть это было намного проще, чем теперь, когда они работают на частоте 2,5 ГГц. - person Jonathan Leffler; 03.04.2012