Диспетчеризация процессов (нитей)

Операционная система NetWare включает в себя следующие очереди (рисунок 2.4), в которых находятся различные нити, ожидая освобождения центрального процессора (ЦП):

Очереди перечислены в порядке убывания приоритетов обслуживания нитей. Внутри каждой очереди нити диспетчируются в соответствии с дисциплиной FIFO: "первый приш╦л - первый обслужен".

Уже отмечалось, что нить - это или внутренняя задача ОС, или задача, связанная с NLM-модулем. Операционная система идентифицирует и отслеживает каждую нить по е╦ блоку управления процессом PCB (Process Control Block).

Рис. 2.3. Функциональная схема ОС NetWare

Обычно в NetWare нить сама себя переводит в неактивное состояние (ставит в очередь). Это происходит в одном из следующих случаев (рисунок 2.4).

  1. Нить выполняет функцию SheduleWorkToDo (для версии 4.х). Созда╦тся новая нить, которая заимствуется из ядра NetWare и помещается в очередь WorkToDoList, имеющую высший приоритет для планирования на ЦП. Старая нить помещается в конец очереди RunList.
  2. Нить приостанавливается, устанавливая семафор (функция WaitOnLocalSemaphore) или ожидая активизации со стороны другой нити (функция SuspendThread). В этом случае нить помещается в конец очереди RunList, но не диспетчируется (не планируется) до наступления требуемого события.
  3. Нить выполняет функцию ThreadSwitch, чтобы переключить контекст (т. е. чтобы активизировать другую нить из очереди). В этом случае нить помещается в конец очереди RunList и диспетчируется, когда до не╦ доходит очередь.
  4. Нить выполняет функцию BeginThread. Созда╦тся новая нить, которая помещается в конец очереди RunList. Старая нить продолжает выполняться.

Рис. 2.4. Очереди к процессору

  1. Нить выполняет функцию ThreadSwitchWithDelay. Нить помещается в конец очереди DelayedWorkToDo и приостанавливается на 50 переключений контекста (нитей), после чего она помещается в конец очереди RunList. Число переключений контекста (50) можно изменить с помощью функции SetThreadHandicap (при этом говорят, что устанавливается постоянный гандикап). Часто функцию ThreadSwitchWithDelay используют для того, чтобы активизировать задачи из очереди LowPriority, т.к. нити из этой очереди выполняются только в том случае, если пуста очередь RunList. Аналогичные действия выполняются, если встречается функция Delay (задержать нить на определ╦нный интервал времени).
  2. Нить выполняет функцию ThreadSwitchLowPriority. В этом случае нить помещается в очередь LowPriority, имеющую самый низкий приоритет. Нити в этой очереди выполняются только в том случае, если пуста очередь RunList, и нет нитей, для которых установлен постоянный гандикап. Типичные низкоприоритетные нити - это создание резервной копии или упаковка файла.

Предыдущая глава || Оглавление || Следующая глава

Copyright © CIT