Тест и тест-установка - Википедия - 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.