Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект Лекций ПСРВ.doc
Скачиваний:
81
Добавлен:
12.02.2016
Размер:
2.73 Mб
Скачать

5.3. Диспетчеризация потоков

QNX — многозадачная ОС. Это значит, что в системе может существовать достаточно много процессов (и потоков). Причем несколько из них могут одновременно оказаться в состоянии готовности к исполнению. Для диспетчеризации микроядро использует приоритет, назначенный каждому потоку. Всего в QNX Neutrino версии 6,3 имеется 256 уровней приоритета (в Neutrino версий до 6.2.1 было 64 уровня приоритета). Самый низкий приоритет— 0, самый высокий— 255. Нулевой приоритет имеет специальный поток Администратора процессов под названием idle (что в переводе с английского означает "ленивец"), на русском техническом жаргоне его называют "холодильником". Этот поток всегда находится в состоянии готовности к исполнению READY. He вздумайте задать своему потоку нулевой приоритет — он никогда не получит процессор!

Диспетчеризация выполняется микроядром в трех случаях:

  • исполняющийся на процессоре поток перешел в блокированное состояние;

  • поток с более высоким, чем у исполняющегося потока, приоритетом перешел в состояние готовности, т. е. происходит вытеснение потока (это свойство ОС называют вытесняющей многозадачностью);

  • исполняющийся поток сам передает право исполнения на процессоре другому потоку (вызывает функцию sched_yield{)).

Если несколько готовых к исполнению потоков имеют равные приоритеты, то повлиять на их взаимоотношения можно с помощью такого параметра потока, как дисциплина диспетчеризации (Scheduling Policy). Neutrino позволяет задавать для каждого потока одну из следующих дисциплин диспетчеризации:

  • FIFO (First In First Out— "первый вошел— первый вышел"). Если потоку назначена дисциплина диспетчеризации FIFO, то другой поток с таким же приоритетом получит управление, только если исполняющийся поток за блокируется или сам уступит право исполнения;

  • "карусельная" (Round Robin) диспетчеризация — поток исполняется в течение кванта времени и передает управление следующему потоку с таким же приоритетом. В QNX 6.3 квант времени (timeslice) по умолчанию равен 4 мс (для процессоров с частотой выше 40 МГц);

  • спорадическая диспетчеризация — предназначена для установления лимита использования потоком процессора в течение определенного периода времени. Этот механизм заменил имевшуюся в прежних версиях QNX адаптивную диспетчеризацию и введен в порядке эксперимента — пользуйтесь им осторожно.

В дополнение к дисциплинам диспетчеризации Neutrino поддерживает механизм клиент-управляемых приоритетов. Идея его заключается в том, что приоритет потока-сервера устанавливается равным максимальному из приоритетов потоков-клиентов, заблокированных в ожидании освобождения этого потока-сервера. Действительно, было бы не очень здорово, если бы поток с приоритетом 100 ждал, пока закончит работу поток с приоритетом 20 и поток-сервер, наконец, получит управление, чтобы закончить обработку предыдущего запроса от потока с приоритетом, например, 5.

Существует такое понятие, как масштаб диспетчеризации. POSIX определяет два масштаба — процесса и системы. При диспетчеризации в масштабе процесса ресурсы процессора делятся между процессами, а уже внутри процесса "разыгрываются" между потоками. Предположим, есть 2 процесса — А и Б, А с одним потоком, а Б с пятью потоками, все шесть потоков готовы к исполнению. При диспетчеризации в масштабе процесса процессорное время было бы поровну поделено между процессами, а далее выделенное процессу время делилось бы между потоками процесса. То есть поток процесса А по .лучил бы 50% процессорного времени, а каждый поток процесса Б — 10% процессорного времени. При диспетчеризации в масштабе системы каждый поток получит 1/6 часть процессорного времени. В QNX Neutrino реализован и единственно возможен только масштаб системы.