- •Алгоритмы
- •План
- •Литература
- •Необходимость
- •Пример: файл данных
- •Критические участки
- •Взаимоисключающий
- •Атомарные операции
- •Пример: вставка в
- •Синхронизация в системах с общей памятью
- •Атомарные операции с общей памятью
- •Блокировки
- •Захват и освобождение блокировок
- •Обеспечение атомарности с помощью блокировки
- •Предотвращение состояний конкуренции
- •Взаимоблокировка
- •Самоблокировка
- •Предотвращение
- •Еще раз о состоянии конкуренции
- •Спин-блокировки
- •Спин блокировка с атомарными операциями
- •Блокировки без атомарных операций
- •Свойства
- •Доказательство
- •Доказательство отсутствия бесконечного ожидания
- •Алгоритмы для N процессоров
- •Блокировка в состоянии конфликта
- •Эффективность блокировок
- •Спин-блокировки для реальных систем
- •Блокировки чтения-записи
- •Пример использования блокировки чтения-записи
- •Пример реализации rw блокировки
- •Отказ обслуживания записи при обслуживании чтения
- •Блокировки чтения-записи с приоритетом на запись
- •Использование секвентных блокировок
- •Реализация seqlock
- •Недостатки spinlock
- •Семафоры
- •Операции с семафорами
- •Mutex
- •Пример:
- •Счетный семафор
- •Реализация семафоров
- •Пример реализации семафора
- •Семафоры чтения записи
- •Особенности семафоров
- •Условные переменные
- •Пример использование
- •Мониторы
- •Барьер
- •Блокировки в системах с распределенной памятью
- •Пример реализации барьера
- •Вопросы?
Mutex
Mutex – семафор с начальным значение 1
Используется для взаимоисключающего доступа
Пример:
//Общий связанный список
List l;
Поток записи
Semaphore mutex(1); down(mutex);
// mutex=0 insert(list);
up(mutex);
Поток чтения
down(mutex);
read(list);
up(mutex);
Счетный семафор
Семафор со значением большим 1 может использоваться в качестве атомарного счетчика
Semaphore a(1);
Поток 1 Поток 2
Up(a); read(a);
Реализация семафоров
Блокировка с помощью очереди
Счетчик семафора
Очередь процессов, которые захватывают семафор
Очередь защищается спин-блокировкой
Как только семафор становится меньшим нуля, процессы при захвате добавляются в очередь
При отпускании семафора процессы извлекаются из очереди
Пример реализации семафора
Spinlock l; |
//процесс из очереди |
Int count; |
proc |
Queue q; |
|
//текущий процесс |
Up() { |
current |
lock(l); |
|
proc=queue.relese(); |
down(){ |
count++; |
lock(l) |
unlock(); |
if(count>0) { |
start(proc); |
count--; |
} |
unlock(l); |
|
} else { |
|
queue.insert(current); |
|
unlock(l); |
|
stop(current) |
|
} |
|
} |
|
Семафоры чтения записи
По аналогии со спин блокировками чтения записи
Особенности семафоров
Семафоры обычно реализуются операционными системами
По сравнению со спин-блокировкой семафор – «тяжелая» операция, требующая много времени
Условные переменные
Условная переменная – вид блокировки, которая позволяет информировать процессы о наступлении некоторого события
Пример – срабатывание будильника
Пример использование
Event e;
Потоки, ожидающие на события
e.wait();
//ожидаем, пока событие не наступит
Потоки, сигнализирующие о событиях
e.signal();
// все ожидающие потоки возвращаются к выполнению
Мониторы
Монитор – объект
Данные+методы безопасного доступа к этим данным
Обеспечивает обязательную блокировку в отличие от всех предыдущих способов
Counter{ int c;
semaphore s; public:
int operator ++(){…} int operator --(){…}
}