- •1. Общая х-ка систем реального времени
- •4._Архітектура ос qnx-6.
- •5. Основні компоненти ос рч та їх загальна характеристика (планувальник задач та диспетчер (ядро), обробники переривань, програма стеження за часом, адміністратор ресурсів).
- •6.Правила диспетчеризації потоків в сучасних ос рч (fifo,rr,тощо). Рівні пріоритетів. Механізми синхронізації.
- •8.Стани задач в ос рч
- •9.Планування та диспетчеризація задач в ос рч. Чинники та алгоритми планування.
- •10. Механізми взаємодії задач в ос рч (повідомлення, схеми обміну повідомленнями).
- •11. Концепция потоков и процессов
- •13. Архітектура ос qnx-6.
- •12. Методи синхронізації потоків.
- •14. Алгоритми планування задач в ос qnx-6
- •15. Дисципліни та правила диспетчеризації потоків в ос qnx-6.
- •16. Стани потоків в ос qnx-6
- •17. Запуск процесів та потоків в ос qnx-6.
- •18. Створення потоків в ос qnx-6
- •19. Копіювання процесів в ос qnx-6
- •20. Атрибути потоків в ос qnx-6.
- •21.Синхронизация потоков по мютексу.
- •22.Синхронизация потоков по семафору.
- •23.Синхронізація потоків за „приєднанням”. (взято из Кертона, изменяй, когда переписываешь)
- •24. Синхронізація потоків за «бар'єром».
- •25. Синхронізація операцій читання-запису.
- •26.Синхронізація потоків за ”чекаючим блокуванням”.
- •27.Алгоритм взаємодії потока-виробника та потока-приймача інформації на основі „чекаючих блокувань”.
- •28.Синхронізація потоків за „умовними змінними”.
- •29.Пули (pool) потоків та їх використання.
- •30. Алгоритм керування числом потоків в пулі потоків.
- •31. Обмін повідомленнями за моделлю "клієнт - сервер".
- •33. Обмін повідомленнями за моделлю "клієнт – сервер - субсервер". Смотри далее.
- •34. Обмін повідомленнями за моделлю "клієнт – сервер - субсервер".
- •35. Механізм обміну повідомленнями між клієнтом та сервером в ос qnx-6.
- •36. Визначення потрібного сервера та жетон клієнта.
- •37. Обмін повідомленнями великого розміру.
- •38. Складені повідомлення та механізм iov.
- •39. Повідомлення за типом “імпульс”. Передача та прийом імпульсу.
- •40. Механізм стеження за часом. Годинники та таймери.
- •41. Механізм стеження за часом. Схеми повідомлення про «тайм-аут».
- •42. Створення та використання таймерів в ос qnx-6.
- •43. Тайм-аути ядра ос qnx-6.
- •44. Обробка переривань в ос qnx-6.
- •45. Розподіл загальної пам'яті між процесами (розповісти про shm_open, mmap, shm_unlink).
- •46. Мікроядро Neutrino та його можливості.
- •47. Розробка консольних проектів срч в середовищі qnx-6.
- •48. Мікроядро Photon та його можливості.
- •49. Розробка проектів срч в середовищі Application Builder.
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”);}}
