# nice -nINC prog
где INC
— численное значение инкремента приоритета относительно умалчиваемого, с которым требуется выполнять приложение, причем положительным инкрементам соответствует понижение приоритета, а отрицательным — повышение;
prog
— имя приложения со всеми последующими его параметрами. Особенностью реализации команды nice в QNX является то, что она позволяет варьировать приоритет запускаемого приложения только в ограниченных пределах: +9 в сторону уменьшения и -19 в сторону увеличения. Это не позволяет таким простым способом запустить, например, приложение с приоритетом 0 фонового потока procnto
(idle-поток) и ограничивает возможность повышения приоритета верхней границей 29 при максимально возможном значении приоритета в системе 63 (все численные значения относятся к редакции QNX 6.2.1; для QNX 6.3 диапазон допустимых значений приоритетов: 0...255). В итоге, чтобы выполнить программу myprog под приоритетом 20, фиксируя при этом время ее выполнения, необходима команда:
# nice -n-10 time myprog
Значение приоритета создаваемого потока хранится в поле param
атрибутной записи (типа sched_param
; подробнее эта структура будет рассмотрена при обсуждении диспетчеризации). Для переустановки значений, входящих в структуру sched_param
, предоставлена функция:
int pthread_attr_setschedparam(pthread_attr_t* attr,
const struct sched_param *param);
где attr
— как и ранее, атрибутная запись потока;
param
— указатель структуры sched_param
, из которой параметры будут перенесены в атрибутную запись потока.
Теперь посмотрим, как запустить на выполнение поток с приоритетом на 2 единицы ниже, чем у его родителя:
int policy;
struct sched_param param;
pthread_getschedparam(pthread_self(), &policy, ¶m);
param sched_priority -= 2;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setschedparam(&attr, ¶m);
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
pthread_create(NULL, &attr, &func, NULL);
Или даже так (хотя это немного грубее):
int policy;
struct sched_param param;
pthread_getschedparam(pthread_self(), &policy, ¶m);
pthread_attr_t attr;
pthread_attr_init(&attr);
attr.param.sched_priority = param.sched_priority - 2;
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
pthread_create(NULL, &attr, &func, NULL);
Примечание
Как и при установке политики диспетчеризации, параметры диспетчеризации потока (и приоритет в их составе) будут установлены, только если параметр типа наследования от родителя установлен в PTHREAD_EXPLICIT_SCHED
посредством вызова pthread_attr_setinheritsched()
.
Заметим здесь вскользь (в дальнейшем нам представится возможность использовать эти знания), что помимо «продуктивных» потоков (компонент системы и пользовательских приложений) в системе всегда существует один «паразитный» поток, запущенный с приоритетом 0 (idle-поток). Он «выбирает» весь остаток процессорного времени в те периоды, когда все имеющиеся в системе продуктивные потоки перейдут в блокированные состояния (ожидания). Подобная практика хорошо известна и реализуется также в большинстве других операционных систем.
Если следовать POSIX-стандарту, то некоторые из атрибутов невозможно переопределить до фактического создания этого стандарта (их можно изменить позже в самом коде потока, но иногда это не совсем правильное решение). Все эти возможности относятся к асинхронному завершению потока; детали функционирования этого механизма рассматриваются позже. К подобного рода атрибутам относятся:
• запретить асинхронное завершение (отмену) потока;
• установить тип завершаемости потока;
• определить, что должно происходить при доставке потоку сигналов.
QNX расширяет возможности POSIX, позволяя по условию OR установить соответствующие биты-флаги в поле flags
атрибутной записи, прежде чем будет произведен вызов, создающий поток. Не существует функций вида pthread_attr_set_*()
, эквивалентных этим установкам. К этим флагам относятся:
• PTHREAD_CANCEL_ENABLE
— запрос на завершение будет обрабатываться в соответствии с типом завершаемости, установленным для потока (значение по умолчанию);
• PTHREAD_CANCEL_DISABLE
— запросы на завершение будут отложены;
• PTHREAD_CANCEL_ASYNCHRONOUS
— если завершение разрешено, отложенные или текущие запросы будут выполнены немедленно;
• PTHREAD_CANCEL_DEFERRED
— если завершение разрешено, запросы на завершение будут отложены до достижения точки завершаемости (значение по умолчанию);
• PTHREAD_MULTISIG_ALLOW
— завершать по сигналу все потоки в процессе (POSIX-умолчание);
Читать дальше
Конец ознакомительного отрывка
Купить книгу