Тест и тест-установка - Википедия - Test and test-and-set
В Информатика, то испытать и установить ЦПУ инструкция используется для реализации взаимное исключение в мультипроцессор среды. Хотя правильный замок может быть реализовано с помощью теста и установки, это может привести к борьба за ресурсы в занятой блокировке (вызванной блокировкой шины и недействительностью кеша, когда операция тестирования и установки требует доступа к памяти атомарно ).
Для снижения накладных расходов используется более сложный протокол блокировки испытание и испытание и установка используется. Основная идея - уменьшить обратная запись что может создать борьба за ресурсы когда двум отдельным потокам нужна одинаковая блокировка. Если п потоки конкурируют за блокировку, они будут пытаться получить ее, как только она будет выпущена, если только с помощью испытать и установить, заставляя каждый поток аннулировать флаг блокировки, то есть он должен распространяться через кеш оставшихся процессоров. п раз, прежде чем какой-либо поток сможет безопасно прочитать его. Добавив чек-доход шаге, только первый поток выполнения, который заметит, что блокировка свободна, попытается получить ее, исключив обратную запись.
логический заблокировано: = ложь // переменная разделяемой блокировкипроцедура EnterCritical () { делать { пока (заблокировано == истина) yield (); // блокировка выглядит занятой, поэтому уступаем планировщику } пока TestAndSet (заблокировано) // фактическая атомная блокировка}процедура TestAndSet (блокировка) {логическое начальное = блокировка; lock = true; вернуть начальный; }
Протокол выхода:
процедура ExitCritical () {заблокировано: = ложь}
Протокол ввода использует обычное чтение памяти для вращения, ожидая освобождения блокировки. Test-and-set используется только для попытки получить блокировку, когда нормальное чтение памяти говорит, что это бесплатно. Таким образом, дорогостоящие операции с атомарной памятью происходят реже, чем при простом вращении по принципу «test-and-set».
Если язык программирования использованные опоры оценка короткого замыкания, протокол входа может быть реализован как:
процедура EnterCritical () { пока (заблокировано == истина или TestAndSet (заблокировано) == истина) пропускать // вращаемся до блокировки }
Предостережение
Хотя это оптимизация полезно в системное программирование этого следует избегать на высоком уровне параллельное программирование если все ограничения не ясны и поняты. Один из примеров неправильного использования - похожий идиома называется двойная проверка блокировки, который небезопасно без особых мер предосторожности и может быть антипаттерн.[1]
Смотрите также
- Параллельный процессор
- Параллельное программирование
- Взаимное исключение
- Тест и установка
- Получить и добавить
Рекомендации
- ^ Дэвид Бэкон и др. Декларация «Двойная проверка блокировки нарушена».
- Грегори Р. Эндрюс, Основы многопоточного, параллельного и распределенного программированияС. 100–101. Аддисон-Уэсли, 2000. ISBN 0-201-35752-6.