- •Лекция 7. Синхронизация параллельных процессов. Параллельная обработка
- •Проблемы критических участков. Взаимоисключения
- •Синхронизация в qnx
- •Синхронизация параллельных процессов на низком уровне Блокировка памяти
- •Алгоритм Деккера (Dekker’s Algorithm)
- •Аппаратная реализация взаимоисключения: команда “проверка и установка” (testandset)
- •Аппаратная реализация синхронизации
- •Инструкция "обменять содержимое переменных"
- •Семафоры
- •Синхронизация блокирования/возобновления процессов при помощи семафоров
- •Реализация взаимодействия в паре “производитель-потребитель” при помощи семафоров
- •Мониторы
- •Команды Wait () и Signal ().
- •Монитор, реализующий двоичный семафор.
- •Решение задачи передачи данных одного процесса другому при помощи монитора (случай кольцевого буфера)
- •Решение задачи передачи данных одного процесса другому при помощи монитора (случай информационной базы)
- •Службы синхронизации
- •Блокировки взаимного исключения (мьютексы)
- •Наследование приоритетов
- •Условные переменные
- •Барьеры
- •Ждущие блокировки
- •Блокировки по чтению/записи
- •Семафоры
- •Синхронизация с помощью алгоритма планирования
- •Синхронизация с помощью механизма обмена сообщениями
- •Синхронизация с помощью атомарных операций
- •Реализация служб синхронизации
Реализация служб синхронизации
Приведены различные вызовы микроядра и соответствующие POSIX-вызовы более высокого уровня.
Вызов микроядра
|
POSIX-вызов
|
Описание
|
SyncTypeCreate() |
pthread_mutex_init(), pthread_cond_init(), sem_init() |
Создать объект для мьютекса, условной переменной или семафора |
SyncDestroy() |
pthread_mutex_destroy(), pthread_cond_destroy(), sem_destroy() |
Уничтожить объект синхронизации |
SyncCondvarWait() |
pthread_cond_wait(), pthread_cond_timedwait() |
Блокировать поток на условной переменной |
SyncCondvarSignal() |
pthread_cond_broadcast(), pthread_cond_signal() |
Пробудить потоки, блокированные на условной переменной |
SyncMutexLock() |
pthread_mutex_lock(). pthread_mitex_trylock() |
Захватить мьютекс |
SyncMutexUnlock() |
pthread_mitex_unlock() |
Освободить мьютекс |
SyncSemPost() |
sem_post() |
Увеличить значение счетчика на семафоре |
SyncSemWait() |
sem_wait(), sem_trywait() |
Уменьшить значение счетчика на семафоре |
