Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
946__8367__946__955.doc
Скачиваний:
120
Добавлен:
27.03.2015
Размер:
1.91 Mб
Скачать

Функциональная схема ос. Модули загрузки nlm

В NetWare 2.х VAP-модули (аналоги NLM-модулей) загружаются в ОП только один раз вместе с операционной системой. Начиная с NetWare 3.х, NLM-модули могут загружаться в ОП и выгружаться из неё с консоли файлового сервера в динамическом режиме. NLM-модули - это программы, в которых используется API-интерфейс для связи со службами NetWare. Они разрабатываются, как правило, с помощью компилятора Watcom C.

Компилятор Watcom C генерирует код, использующий преимущества архитектуры процессоров 80386 и 80486. Он использует 32-битовые ближайшие указатели (near pointers) и 4-байтовые целые числа. Использование 32-битовых указателей делает концепцию моделей памяти во многом ненужной. NLM-модули компилируются для непрерывной модели памяти с абсолютной адресацией ("плоской" модели), в которой сегментация памяти гораздо менее важна, чем в других. Одного 32-битового указателя достаточно для адресации всей доступной памяти. Кроме того, компилятор генерирует код, выполняемый в виртуальном режиме.

Все NLM-модули условно можно разделить на две группы: основные (без которых не может функционировать NetWare) и дополнительные (рисунок 2.3).

Как видно из рисунка, в качестве NLM-модулей выступают программы с расширениями *.DSK, *.LAN, *.NAM, *.NLM. При загрузке NLM-модулей в ОП автоматически создаётся нить (задача), связанная с этим модулем. Нить может динамически порождать другие нити. Нити выполняются на сервере независимо друг от друга. Синхронизация между ними осуществляется с помощью семафоров.

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

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

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

  • очередь WorkToDoList (только для версии 4.х),

  • очередь RunList,

  • очередь DelayedWorkToDo,

  • очередь LowPriority.

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

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

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

  1. Нить выполняет функцию SheduleWorkToDo (для версии 4.х). Создаётся новая нить, которая заимствуется из ядра NetWare и помещается в очередь WorkToDoList, имеющую высший приоритет для планирования на ЦП. Старая нить помещается в конец очереди RunList.

  2. Нить приостанавливается, устанавливая семафор (функция WaitOnLocalSemaphore) или ожидая активизации со стороны другой нити (функция SuspendThread). В этом случае нить помещается в конец очереди RunList, но не диспетчируется (не планируется) до наступления требуемого события.

  3. Нить выполняет функцию ThreadSwitch, чтобы переключить контекст (т. е. чтобы активизировать другую нить из очереди). В этом случае нить помещается в конец очереди RunList и диспетчируется, когда до неё доходит очередь.

  4. Нить выполняет функцию BeginThread. Создаётся новая нить, которая помещается в конец очереди RunList. Старая нить продолжает выполняться.

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

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

Нить выполняет функцию ThreadSwitchLowPriority. В этом случае нить помещается в очередь LowPriority, имеющую самый низкий приоритет. Нити в этой очереди выполняются только в том случае, если пуста очередь RunList, и нет нитей, для которых установлен постоянный гандикап. Типичные низкоприоритетные нити - это создание резервной копии или упаковка файла

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]