Блокировка является путем к двум или больше задачам (процессы, потоки) для синхронизации. А именно, когда для обеих задач нужен неустойчивый доступ к ресурсу, который может только использоваться одной задачей за один раз, это - путь к задачам расположить не использовать ресурс одновременно. Для доступа к ресурсу задача должна выполнить следующие шаги:
take the lock
use the resource
release the lock
Взятие блокировки не возможно, если другая задача уже взяла его. (Думайте о блокировке как о физическом маркерном объекте. Или объект находится в секции, или у кого-то есть он в их руке. Только человек, держащий объект, может получить доступ к ресурсу.) Так “берут блокировку”, действительно означает, “ожидают, пока ни у кого больше нет блокировки, затем возьмите ее”.
С высокоуровневой точки зрения существует два главных способа реализовать блокировки: спин-блокировки и условия. Со спин-блокировками, предпринимая меры блокировки, просто “вращающиеся” (т.е. делающие ничто в цикле) ни до кого еще, имеет блокировку. С условиями, если задача пытается взять блокировку, но заблокирована, потому что другая задача содержит ее, вновь прибывший вводит очередь ожидания; операция выпуска предупреждает любую ожидающую задачу, что блокировка теперь доступна.
(Этих объяснений недостаточно, чтобы позволить Вам реализовать блокировку, потому что я ничего не сказал об атомарности. Но атомарность не важна здесь.)
Спин-блокировки очевидно расточительны: ожидающая задача продолжает проверять, взята ли блокировка. Итак, почему и когда это используется? Спин-блокировки являются часто очень дешевыми для получения в случае, где блокировка не сохранена. Это делает это привлекательным, когда шанс для блокировки, которая будет сохранена, является маленьким. Кроме того, спин-блокировки только жизнеспособны, если получение блокировки, как ожидают, не займет много времени. Таким образом, спин-блокировки имеют тенденцию использоваться в ситуациях, где они останутся сохраненными в течение очень короткого времени, так, чтобы большинство попыток, как ожидали, успешно выполнится на первой попытке и тех, которым нужно ожидание, не долго ждут.
Существует хорошее объяснение спин-блокировок и другие механизмы параллелизма ядра Linux в Драйверах устройств Linux, главе 5.
our friends from google
. спасибо всем – Bastian Ebeling 28.02.2011, 13:50