- •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.
18. Створення потоків в ос qnx-6
Поток – это минимальная диспетчеризуемая программная единица. Он не может обладать другими ресурсами, кроме ресурса процесса который порожден.
К потокам можно применять такие методы синхронизации:
Любой поток может создать новый поток в том же самом процессе по средствам ф-ции 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,…)
19. Копіювання процесів в ос qnx-6
В QNX-6 допускается копирование процесса, если он однопотоковый, для этого следует использовать ф-цию fork(). После выполнения этой ф-ции будет создан идентичный работающему процессу процесс, который будет иметь свой pid. Различить два процесса из программы можно путем анализа значения их идентификатора.
#include<estedio.h>
int main()
{int red value; \\для возвращаемого значения
red value= fork();
ptintf(“it is me / n”);
return0; }
it is me
it is me
Для того чтобы различить два одинаковых процесса надо использовать следующее red value = 0 в новом процессе, а в старом процессе ему будет присвоен pid нового процесса.
If(redval=fork())
{printf(“it is me”);
printf(“I am parent”); }
else {printf(“it is me”);
printf(“I am child”); }}
20. Атрибути потоків в ос qnx-6.
Структура типа данных pthread_attr_t содержит в себе информацию про атрибуты потока, который мы создаем при помощи функции pthread_create.
Данная структура имеет вид:
typedef struct {
int flags;
size_t stacksize;
void * stackaddr;
void (*exitfunc)(void * status);
int policy;
struct sched_param param;
unsigned quardsize;
} pthread_attr_t;
Рассмотрим поля:
flags – определяет хар-ки потока (поток создан по присоединению, или как обособленный)
stacksize, stackaddr, quardsize – параметры стека.
policy, param – параметры диспетчирезации.
Существует 18 фукций для установки атрибутов потока:
- общие
pthread_attr_init() – инициализация атрибутной записи;
pthread_attr_destroy() – разрушение …
- для флагов
Присоединенный поток:
pthread_attr_getdetachstate()
pthread_attr_setdetachstate()
Обособленный поток:
pthread_attr_getinheritsched()
pthread_attr_setinheritsched()
pthread_attr_getscope()
pthread_attr_setscope() – с помощью этой функции мы можем устанавлевать масштаб работы потока(масштаб системы или масштаб процесса, QNX6 поддерживает только масштаб системы)
-для стека
pthread_attr_getstackaddr()
pthread_attr_setstackaddr()
pthread_attr_getguardsize()
pthread_attr_setguardsize()
pthread_attr_getstacksize()
pthread_attr_setstacksize()
-для диспетчирезации
pthread_attr_getschedparam()
pthread_attr_setschedparam()
pthread_attr_getschedpolicy()
pthread_attr_setschedpolicy()
Перед созданием потока мы можем выполнить изменение в структуре атрибутов создаваемого потока. Для этого мы сначала должны выполнить инициализацию структуры атрибутов, а потом создать поток.
Атрибут флаг позволяет изменять характеристики потока, а именно: поток будет обособленный или присоединенный, наследует ли он атрибуты диспетчирезации от родителя или они другие, какой масштаб имеет поток(системы или процесса).
Поток может создаваться как ожидаемый (PTHREAD_CREATE_JOINABLE, и таковым
он создаётся по умолчанию, используется также термин “присоединённый”) или
отсоединённый (PTHREAD_CREATE_DETACHED). Например:
pthread_attr_t attr;
pthread_attr_init( &attr );
pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED );
pthread_create( NULL, &attr, &function, NULL );
Присоединённый поток может позже быть ожидаемый по завершению другим
потоком, выполняющим вызов:
int pthread_join( pthread_t thread, void** value_ptr );
где:
thread – идентификатор TID ожидаемого потока, который заполняется как первый
параметр вызова pthread_create( pthread_t* thread, ... ) при его создании,
или может быть получен позже вызовом pthread_self();
value_ptr - NULL, или указатель на локализацию значения, возвращаемого
потоковой функцией (оператором return или вызовом pthread_exit());
Пожалуй, наиболее часто приходится переопределять именно приоритет, с которым
будет выполняться создаваемый поток. При запуске потока с параметрами по
умолчанию, его приоритет устанавливается равным приоритету порождающего
потока. Значение приоритета создаваемого потока хранится в поле 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 );
