
- •1. Общая х-ка систем реального времени
- •4._Архітектура ос qnx-6.
- •5. Основні компоненти ос рч та їх загальна характеристика (планувальник задач та диспетчер (ядро), обробники переривань, програма стеження за часом, адміністратор ресурсів).
- •6.Правила диспетчеризації потоків в сучасних ос рч (fifo,rr,тощо). Рівні пріоритетів. Механізми синхронізації.
- •8.Стани задач в ос рч
- •9.Планування та диспетчеризація задач в ос рч. Чинники та алгоритми планування.
- •10. Механізми взаємодії задач в ос рч (повідомлення, схеми обміну повідомленнями).
- •11. Концепция потоков и процессов
- •12. Методи синхронізації потоків.
- •13. Архітектура ос qnx-6.
- •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.
23.Синхронізація потоків за „приєднанням”. (взято из Кертона, изменяй, когда переписываешь)
Присоединение -то самый простой метод синхронизации. Принцип работы заключается в том, что один поток должен ожидать завершения работы другого потока. Поток, который ожидает – вызывает функцию:
pthread_join(pthread_t thread, void ** value_ptr)
Этой функции передаётся идентификатор потока, к которому вы желаете присоединиться и наобязательный аргумент value_ptr, который может быть использован для сохранения возвращаемого присоединяемым потоком значения (можно передать NULL)
Рассмотреть алгоритм выполнения данной синхронизации можно на конкретном примере. Предположим, что имеем графическую программу, выполняющую алгоритм трассировки луча. Каждая строка растра на экране зависит от содержимого основоной базы данных. Ключевым моментом здесь является то, что каждая строка растра не зависит от остальных. Это обстоятельство автоматически приводит к программированию данной задачи как многопоточной.
Const int num_cpu=4; //количество процессов;
int i;
pthread_t ptid[num_cpu];
for(i=0; i<num_cpu, i++)
pthread_create(&ptid[i], NULL, do_one, NULL);
for(i=0; i<num_cpu; i++)
pthread_join(ptid[i],(void) i);
void * do_one (void * a);
{ int b=(int) a;
int i;
for(i=0; i<n; i++) work(i+b*n);
}
Здесь главный поток присоединяет к себе запущенные потоки и ждет их окончание в любом порядке. Данный механизм работает даже в том случае, если потоки завершаются в обратном порядке. Например, последний завершил работу — это не окажет никакого воздействия на main(), который будет по-прежнему ждать завершения первого потока. Потом завершили работу третий и второй потоки. Когда завершится первый поток, цикл for просто «проскочит» уже завершённые потоки и завершиться. В этот момент мы будем знать, что вычислительные потоки синхронизованы, и теперь мы можем выводить результаты на отображение.
24. Синхронізація потоків за «бар'єром».
Этот метод синхронизации означает, что создается объект типа «барьер», преодолеть который можно только при «встрече у барьера» нескольких потоков. При этом потоки не обязаны быть завершенными – они просто ждут и, когда заданное число потоков достигнуто, они разблокируются.
«Барьер» создается с помощью функции:
#include <sync.h>
int barrier_init(barrier_t *barrier, const barrier_attr_t *attr, int count);
Эта функция создает объект типа «барьер» по преданному ей адресу, назначает атрибуты «барьера» и в переменной count – число потоков, которые должны встретиться у «барьера».
Каждый поток, который будет ждать у «барьера», должен вызвать функцию:
int barrier_wait(barrier_t *barrier);
После этого поток блокируется ОС до тех пор, пока не будет достигнуто число блокированных потоков, указанное в count. После того, как это число потоков будет достигнуто, все потоки разблокируются одновременно.
При синхронизации по «барьеру» потоки ожидают, пока их не наберется нужное число.
Пример:
#include <sync.h>
#include <stdio.h>
#include <time.h>
#include <sys\neutrino.h>
barrier_t barrier;
void *thread1(void *a){
time_t now; char buf[27]; time (&now);
printf(“Thread1 started at %s”, ctime_t(&now, buf));
sleep(10); //имитация работы
barrier_wait(&barrier);
time(&now);
printf(“Thread1: barrier passed at %s”, ctime_r(&now, buf));}
void *thread2(void *a){
… sleep(20); …}
main(){
time_t now; time (&now); char buf[27];
printf(“Main started at %s”, ctime_r(&now, buf));
barrier_init(&barrier, NULL, 3);
//запуск 2х потоков:
pthread_create(NULL, NULL,thread1,NULL);
pthread_create(NULL, NULL,thread2,NULL);
barrier_wait(&barrier); //ждем у барьера
time(&now);
printf(“Main passed barrier at %s”, ctime_r(&now, buf));}
В этой проге основной поток создает барьер и инициализирует его значением счетчика, равного числу потоков, включая и себя, которые должны встретиться у барьера прежде, чем они будут разблокированы для дальнейшей работы. Следовательно, необходимо продумать после барьерную работу потока, иначе он завершится.