Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
vovk.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
456 Кб
Скачать
☆

16. Стани потоків в ос qnx-6

Различают 3 основных состояния потоков:

Состояние выполнения RUNNING – поток активно использует ресурсы процессора. В системе SMP будет выполняться множество потоков, в системе с одним процессором – единственный поток

Состояние готовности к выполнению READY – поток может быть поставлен на выполнение немедленно, но не выполняется, потому что в данный момент выполняется другой поток (с таким же или более высоким приоритетом). Если бы два потока были готовы к выполнению, один из них с приоритетом 10, а другой – с приоритетом 5, то поток с приоритетом 10 был бы введен в состояние выполнения, а поток с приоритетом 5 – в состояние готовности.

Третьим состоянием является состояние BLOCKED, т.е. когда поток блокирован. Таких состояний несколько:

STOPPED – поток приостановлен по сигналу SIGSTOP

NANOSLEEP – поток «спит» на опред.период времени

MUTEX – поток ожидает захват мютекса

CONDVAR – поток ожидает соблюдения условий условной переменной

JOIN – поток ожидает завершения другого потока

SEM – поток ожидает захват семафора

SEND – поток ожидает приема своего сообщения сервером

REPLY - поток ожидает от сервера ответ на своё сообщение

RECEIVE – поток ожидает сообщение от клиента

INTR – поток ожидает прерывание

DEAD (ZOMBI) – поток мертв, ядро ожидает освобождения занятых им ресурсов

Обычно из состояния блокировки поток переводится в состояние READY, из READY в RUNNING, а потом либо READY либо блокировка.

17. Запуск процесів та потоків в ос qnx-6.

В QNX-6 допускается несколько процессов, в пределах каждого процесса может быть несколько потоков, 2 потока в разных процессах изолированы друг от друга.

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

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

Запуск процесса можно выполнить из командной строки и из программы. Для запуска из командной строки нужно ввести командную строку для командного интерпритатора ($my.exe) ps-вывод инф-ции о запущенных процессах в системе.

Процесс можно запустить в фоновом режиме, для этого нужно набрать символ &.

Запуск процесса из программы. Для этого можно использовать следующие вызовы: system(), семейство ф-ций exec(), spawn(), ф-ция fork().

System() –запускает копию командного интерпретатора для последующей обработки указанной команды.

System( “ps”)

Exec()- подменяет текущий процесс новым, причем pid не меняется. Эти ф-ции различаются суффиксами I, v,e.

Execl - список аргументов указан в самом вызове и он завершается NULL.

Execv – список аргументов определяется через указатель на вектор аргументов.

Exece – указывает окружение.

Execp – если не указано полное имя пути в программе, то для нее указывается переменная PATH.

execcl(p_wait,”\bin\ps”, “\bin\ps”, NULL );

Char*argv[]={“\bin\ps”, Null}; execcv(p_wait, “\bin\ps”, argv);

execp(p_wait, “p”, “ps”, NUll);

Аналогично ф-ция spawn выполняет запуск нового процесса, но при этом создается новый pid, который соответствует той программе, которая запускается. Эта ф-ция имеет флаги, которые позволяют менять ее поведение: P_WAIT – означает что старый процесс блокирован пока новый не завершится, P_NOWAIT – не будет блокирован, то есть новая программа будет запущена в фоновом режиме, P_OVERLAY – не менять pid процесса, то есть работать как exec.

Любой поток может создать новый поток в том же самом процессе по средствам ф-ции pthread_create, которая имеет следующее описание:

<pthread.h>

int pthread_create(pthread_t*tid, \\ указатель на структуру pthread_t в котором хранится идентификатор потока )

const pthread_attr_t*attr, \\указатель на атрибутную запись

void*(*subroutine) (void*), \\subroutine- имя ф-ции с которой начинается поток void*arg; arg-параметр который передается ф-ции subroutine.

При вызове ф-ции pthread обязательным является только имя ф-ции которое загружает поток.

Pthread_create (NULL, NULL, my_thread, NULL);

Запуск потока my_thread, его тип не будет использоваться в программе.

Void*my_thread (void*a) {\\что-то}

Если необходимо запомнить идентификатор потока

pthread_t tid; pthread_create (& tid,…)

В QNX-6 допускается копирование процесса, если он однопотоковый, для этого следует использовать ф-цию fork(). После выполнения этой ф-ции будет создан идентичный работающему процессу процесс, который будет иметь свой pid. Различить два процесса из программы можно путем анализа значения их идентификатора. Для того чтобы различить два одинаковых процесса надо использовать следующее red value = 0 в новом процессе, а в старом процессе ему будет присвоен pid нового процесса.

If(redval=fork())

{printf(“it is me”);printf(“I am parent”);}

else {printf(“it is me”);

printf(“I am child”);}}

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