Операционная система NetWare включает в себя следующие очереди (рисунок 2.4), в которых находятся различные нити, ожидая освобождения центрального процессора (ЦП):
- очередь WorkToDoList (только для версии 4.х),
- очередь RunList,
- очередь DelayedWorkToDo,
- очередь LowPriority.
Очереди перечислены в порядке убывания приоритетов обслуживания нитей. Внутри каждой очереди нити диспетчируются в соответствии с дисциплиной FIFO: "первый пришёл - первый обслужен".
Уже отмечалось, что нить - это или внутренняя задача ОС, или задача, связанная с NLM-модулем. Операционная система идентифицирует и отслеживает каждую нить по её блоку управления процессом PCB (Process Control Block).
Рис. 2.3. Функциональная схема ОС NetWare
Обычно в NetWare нить сама себя переводит в неактивное состояние (ставит в очередь). Это происходит в одном из следующих случаев (рисунок 2.4).
- Нить выполняет функцию SheduleWorkToDo (для версии 4.х). Создаётся новая нить, которая заимствуется из ядра NetWare и помещается в очередь WorkToDoList, имеющую высший приоритет для планирования на ЦП. Старая нить помещается в конец очереди RunList.
- Нить приостанавливается, устанавливая семафор (функция WaitOnLocalSemaphore) или ожидая активизации со стороны другой нити (функция SuspendThread). В этом случае нить помещается в конец очереди RunList, но не диспетчируется (не планируется) до наступления требуемого события.
- Нить выполняет функцию ThreadSwitch, чтобы переключить контекст (т. е. чтобы активизировать другую нить из очереди). В этом случае нить помещается в конец очереди RunList и диспетчируется, когда до неё доходит очередь.
- Нить выполняет функцию BeginThread. Создаётся новая нить, которая помещается в конец очереди RunList. Старая нить продолжает выполняться.
Рис. 2.4. Очереди к процессору
- Нить выполняет функцию ThreadSwitchWithDelay. Нить помещается в конец очереди DelayedWorkToDo и приостанавливается на 50 переключений контекста (нитей), после чего она помещается в конец очереди RunList. Число переключений контекста (50) можно изменить с помощью функции SetThreadHandicap (при этом говорят, что устанавливается постоянный гандикап). Часто функцию ThreadSwitchWithDelay используют для того, чтобы активизировать задачи из очереди LowPriority, т.к. нити из этой очереди выполняются только в том случае, если пуста очередь RunList. Аналогичные действия выполняются, если встречается функция Delay (задержать нить на определённый интервал времени).
- Нить выполняет функцию ThreadSwitchLowPriority. В этом случае нить помещается в очередь LowPriority, имеющую самый низкий приоритет. Нити в этой очереди выполняются только в том случае, если пуста очередь RunList, и нет нитей, для которых установлен постоянный гандикап. Типичные низкоприоритетные нити - это создание резервной копии или упаковка файла.
Предыдущая глава || Оглавление || Следующая глава