pthread_attr_setguardsize(); pthread_attr_setstackaddr(); pthread_attr_setstacksize()

Большинство функций сгруппированы по парам «get» — «set», т. е. в каждой паре есть функция как получения параметров (get), так и их установки (set) – за исключением функций pthread_attr_init() и pthread_attr_destroy().

Лекция 5. Приоритеты дисциплина диспечеризации потоков в ОС РВ QNX 6
 

Для того, чтобы поток был поставлен ядром на выполнение, он должен находится в состоянии готовности. Если в этом состоянии находятся сразу несколько потоков, то выбор потока, который будет поставлен на исполнение, определяется двумя факторами:приоритетом и дисциплиной диспетчеризации.

Если эти потоки имеют различные приоритеты, то ядро отдает процессор потоку с высшим приоритетом. Приоритеты в QNX/ Neutrino пронумерованы от единицы (самый низкий) и далее, с единичным дискретом (до 63 в QNX 6.2 до 255 в QNX 6.3). Нулевой приоритет использовать нельзя — он зарезервирован для «холостого» (idle) потока.

Минимальное или максимальное значение приоритета в системе можно узнать с помощью функций sched_get_priority_min() и sched_get_priority_max(), описаных в <sched.h>.

Если другой поток с более высоким приоритетом вдруг становится готов к выполнению, ядро немедленно переключит контекст на поток с более высоким приоритетом. Это называется вытеснением – поток с высшим приоритетом вытесняет поток с низшим приоритетом.Ситуацию, когда поток с высшим приоритетом заканчивает свою работу, и ядро переключает контекст обратно на поток с низшим приоритетом, который выполнялся ранее, называют возобновлением – ядро возобновляет работу предыдущего потока.

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

Ядро QNX6.2 поддерживает две дисциплины диспетчеризации: карусельную, она же RR (Round Robin), и FIFO (First In — First Out). Ядро QNX6.3 дополнительно поддерживает спорадическую диспетчеризацию (SPORADIC).

При диспетчеризации FIFO процессор предоставляется потоку на столько времени, сколько ему необходимо. Это означает, что если один поток занят длительными вычислениями, и никакой другой поток с более высоким приоритетом не готов к выполнению, то этот поток потенциально может выполняться вечно ивсе потоки с тем же и более низкими приоритетами будут заблокированы.

Если работающий поток завершает свою работу или добровольно уступает процессор, ядро анализирует состояние других потоков того же самого приоритета. Если из них не имеется готовых к выполнению, то ядро анализирует потоки с более низким приоритетом, готовые к выполнению.

Выражение «добровольно уступить процессор» может означать одну из двух возможных ситуаций. Если поток переходит в режим ожидания, например, блокируется на семафоре, тогда может выполняться поток с более низким приоритетом (как описано выше). Существует также специальная функция sched_yield(), по которой процессор передается только другому потоку с тем же самым приоритетом. Если поток вызывает функцию sched_yield(), но никакой другой поток с таким же самым приоритетом не готов к выполнению, первоначальный поток продолжает работу.

Дисциплина RR (карусельная диспетчеризация) аналогична дисциплине диспетчеризации FIFO, за исключением того, что поток будет работать только в течение предопределенного кванта времени (который фиксирован и не может быть изменен). Величину кванта времени можно узнать, используя функцию sched_rr_get_interval().

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

Дисциплина спорадической диспетчеризации (SPORADIC) предназначена для потоков, обрабатывающих события, срок поступления которых не может наступать ранее некоторого времени после их предыдущего поступления.

При спорадической дисциплине потоку задается несколько параметров:

- Нормальный приоритет или приоритет переднего плана (N) – приоритет потока, при котором планируется основная, критичная к времени, обработка события;

- Нижний или фоновый приоритет (L) – приоритет потока, при котором планируется некритичная к времени обработка события;

- Начальный бюджет потока (С) – количество времени, которое поток может выполняться с нормальным приоритетом (N), перед тем, как получить пониженный приоритет (L).

- Период пополнения (T) – период времени, в течении которого поток может расходовать свой бюджет выполнения.

- Максимальное число текущих пополнений – ограничение на количество последовательных пополнений ненулевого текущего бюджета выполнения.

Алгоритм спорадического планирования устанавливает начальный бюджет выполнения потока (С) с нормальным приоритетом (N), который расходуется потоком и пополняется с периодичностью, определенной периодом пополнения.

После полного расходования бюджет выполнения и до его пополнения поток выполняется с фоновым приоритетом (L).

Сводка правил диспетчеризации (для одиночного процессора) и в порядке важности имеет следующий вид:

• только один поток может выполняться в данный момент времени;

• всегда должен выполняться поток с наивысшим приоритетом, который не блокирован;

• поток должен работать до тех пор, пока он не блокируется или не завершается;

• поток, который диспетчеризуется по дисциплине карусельного типа (RR), должен работать в течение выделенного ему кванта времени, после чего ядро обязано его перепланировать (при необходимости).

Список литературы

1. Кертен Р. Введение в QNX Neutrino 2 – СПб.: Петрополис.2001–478с.

2. Операционная система реального времени QNX Neutrino 3. Системная архитектура / пер. с англ. Ю. Асотов // СПб.: БХВ-Петербург, 2005. – 336с.

3. Зыль С.Н. QNX Momenticx: основы применения – СПб.: БХВ-Петербург, 2005. – 256с.

4. Практика работы с QNX / Алексеев Д., Видревич Е., Волков А. и др. // М.:КомБук, 2004. – 432с.

5. Дегтярев Е.К. Введение в UNIX. – М.: МП «Память», 1971. – 96с.

6. Стивенс У. UNIX: взаимодействие процессов – СПб: Питер, 2002. – 576с.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: