Вход/Регистрация
QNX/UNIX: Анатомия параллелизма
вернуться

Цилюрик Олег Иванович

Шрифт:

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

Каждому потоку, участвующему в процессе диспетчеризации, соответствует экземпляр структуры, определенной в файле

<sys/target_nto.h>
, в котором находятся все фундаментальные для ОС QNX определения:

struct sched_param {

_INT32 sched_priority;

_INT32 sched_curpriority;

union {

_INT32 reserved[8];

struct {

_INT32 __ss_low_priority;

_INT32 __ss_max_repl;

struct timespec __ss_repl_period;

struct timespec __ss_init_budget;

} __ss;

} __ss_un;

};

#define sched_ss_low_priority __ss_un.__ss.__ss_low_priority

#define sched_ss_max_repl __ss_un.__ss.__ss_max_repl

#define sched_ss_repl_period __ss_un.__ss.__ss_repl_period

#define sched_ss_init_budget __ss_un.__ss.__ss_init_budget

Все, что определяется внутри

union __ss_un
, имеет отношение только к спорадической диспетчеризации (спорадическая диспетчеризация была введена значительно позже других, и ей будет уделено достаточно много внимания). Для всех остальных типов диспетчеризации потока это поле заполняется фиктивным полем
reserved
, и именно так в укороченном виде) определялась структура диспетчеризации в версии QNX 6.1.

Сейчас нас интересуют начальные поля этой структуры, не зависящие от типа диспетчеризации потока:

sched_priority
— статический приоритет, который присваивается потоку при его создании и который может быть программно изменен по ходу выполнения потока;

sched_curpriority
— текущий приоритет, с которым выполняется (и согласно которому диспетчеризируется) данный поток в текущий момент времени. Это значение приоритета образуется системой на основе заданного статического приоритета, но оно может динамически изменяться системой, например при отработке дисциплин наследования приоритетов или граничных приоритетов для потока. Программа не имеет средств воздействия на это значение [20] , но может его считывать.

20

Пользователь может изменять это поле, однако это лишено смысла и не влечет за собой никаких последствий, ведь значением текущего приоритета «управляет» ОС, например для осуществления наследования приоритетов. С другой стороны, иногда целесообразно считать значение именно этого поля, чтобы определить значение динамического приоритета потока, установленного, например, в результате того же наследования.

Еще раз подчеркнем достаточно очевидную вещь: дисциплина диспетчеризации определяется относительно потока и на уровне потока (но не процесса). Проследить за дисциплиной диспетчеризации (и убедиться в справедливости утверждения предыдущей фразы) можно командой

pidin
. Вот несколько строк ее вывода, относящиеся к составным частям самой системы:

pid tid name prio STATE Blocked

1 1 6/boot/sys/procnto 0f READY

1 2 6/boot/sys/procnto 10r RUNNING

...

1 5 6/boot/sys/procnto 63r RECEIVE 1

...

1 9 6/boot/sys/procnto 6r NANOSLEEP

...

6 1 roc/boot/devb-eide 10o SIGWAITINFO

В поле

prio
указывается приоритет (текущий; возможно, последнее из унаследованных значений!) каждого потока с установленной для него дисциплиной диспетчеризации:
f
— FIFO,
r
— RR,
o
— OTHER,
s
— SPORADIC.

В системе на сегодняшний день реализованы три [21] дисциплины диспетчеризации: очередь потоков равных приоритетов (FIFO — first in first out; еще в ходу термин «невытесняющая»), карусельная (RR — round-robin) и спорадическая. Рассмотрим фрагмент их определения в файле

<sched.h>
:

21

В документации неоднократно упоминается еще одна дисциплина — «адаптивная» (

SCHED_ADAPTIVE
), и даже детально описывается, «как она работает». Видимо, это можно отнести только к тому, что корректировка обширной документации отстает от развития самой системы. На конференции «QNX-Россия 2003» на вопрос по поводу ADAPTIVE-диспетчеризации представители QSSL отвечали так: «Этот вид диспетчеризации был в QNX 4.xx, а в QNX 6.x вместо него введена более продвинутая техника SPORADIC-диспетчеризации». Тем не менее более продвинутая спорадическая диспетчеризация не позволяет абсолютно точно выразить логику адаптивной.

#if defined(__EXT_QNX)

#define SCHED_NOCHANGE 0

#endif

#define SCHED_FIFO 1

#define SCHED_RR 2

#define SCHED_OTHER 3

#if defined(__EXT_QNX)

#define SCHED_SPORADIC 4 /* Approved 1003.1d D14 */

#define SCHED_ADJTOHEAD 5 /* Move to head of ready queue */

  • Читать дальше
  • 1
  • ...
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: