Что именно такое “спин-блокировки”?

StackOverflow https://stackoverflow.com/questions/1957398

  •  21-09-2019
  •  | 
  •  

Вопрос

Мне всегда было интересно, что это такое:каждый раз, когда я слышу о них, образы футуристических устройств, похожих на маховики, танцуют (вращаются?) в моем сознании...

Что это такое?

Это было полезно?

Решение

Когда вы используете обычные блокировки (мьютексы, критические разделы и т.д.), операционная система переводит ваш поток в состояние ожидания и вытесняет это путем планирования других потоков на том же ядре.Это приводит к снижению производительности, если время ожидания действительно короткое, потому что теперь вашему потоку приходится ждать выгрузки, чтобы снова получить процессорное время.

Кроме того, объекты ядра доступны не в каждом состоянии ядра, например, в обработчике прерываний или когда подкачка по страницам недоступна и т.д.

Блокировки вращения не вызывают вытеснения, но ожидают в цикле ("spin"), пока другое ядро не снимет блокировку.Это предотвращает потерю потоком своего квантовый и продолжайте, как только блокировка будет снята.Простой механизм спин-блокировок позволяет ядру использовать его практически в любом состоянии.

Вот почему на одноядерной машине блокировка вращения - это просто "отключить прерывания" или "поднять IRQL", что полностью предотвращает планирование потоков.

В конечном счете, спин-блокировки позволяют ядрам избегать "Больших блокировок ядра" (блокировок, возникающих при входе ядра в ядро и освобождаемых при выходе) и имеют детальную блокировку примитивов ядра, что приводит к улучшению многоядерной обработки на многоядерных машинах и, следовательно, к повышению производительности.

Редактировать:Возник вопрос:"Означает ли это, что я должен использовать spinlocks везде, где это возможно?" и я попытаюсь ответить на этот вопрос:

Как я уже упоминал, спин-блокировки полезны только в тех местах, где ожидаемое время ожидания короче кванта (читать:миллисекунды) и упреждение не имеет особого смысла (напримеробъекты ядра недоступны).

Если время ожидания неизвестно или вы находитесь в пользовательском режиме, блокировки неэффективны.Вы потребляете 100% процессорного времени на ожидающем ядре, проверяя, доступна ли блокировка вращения.Вы запрещаете запуск других потоков на этом ядре до истечения срока действия вашего quantum.Этот сценарий возможен только для коротких пакетов на уровне ядра и вряд ли является вариантом для приложения в пользовательском режиме.

Вот вопрос в SO, касающийся этого: Спинлоки, насколько они полезны?

Другие советы

Допустим, ресурс защищен блокировкой, поток, который хочет получить доступ к ресурсу, должен сначала получить блокировку.Если блокировка недоступна, поток может повторно проверить, была ли блокировка освобождена.В течение этого времени поток busy ожидает, проверяя блокировку, используя процессор, но не выполняя никакой полезной работы.Такая блокировка называется блокировкой вращения.

Это во многом цикл, который продолжается до тех пор, пока не будет выполнено определенное условие:

while(cantGoOn) {};
 while(something != TRUE ){};
 // it happend
 move_on();

Это тип замка, который делает занят ожиданием

Это считается антишаблоном, за исключением программирования драйверов очень низкого уровня (где может случиться так, что вызов "правильной" функции ожидания имеет больше накладных расходов, чем просто блокировка занятости в течение нескольких циклов).

Смотрите, например Спин - блокировки в ядре Linux.

Спин-блокировки - это те, в которых поток ожидает, пока блокировка не станет доступной.Обычно это используется, чтобы избежать накладных расходов на получение объектов ядра, когда существует возможность получения объекта ядра в течение некоторого небольшого периода времени.

Бывший:

While(SpinCount-- && Kernel Object is not free)
{}

try acquiring Kernel object

Вы хотели бы использовать блокировку вращения, когда считаете, что дешевле войти в цикл ожидания занятости и объединить ресурс вместо блокировки, когда ресурс заблокирован.

Вращение может быть полезным, когда блокировки являются мелкозернистыми и их большое количество (например, по блокировке на узел в связанном списке), а также когда время удержания блокировки всегда чрезвычайно мало.В общем, удерживая спин-блокировку, следует избегать блокировки, вызова всего, что само по себе может блокировать, одновременного удержания более одной спин-блокировки, выполнения динамически отправляемых вызовов (интерфейс и виртуалы), статически отправляемых вызовов в любой код, которым вы не владеете, или выделения памяти.

Также важно отметить, что SpinLock - это тип значения по соображениям производительности.Таким образом, нужно быть очень осторожным, чтобы случайно не скопировать экземпляр SpinLock, поскольку в этом случае два экземпляра (оригинал и копия) были бы полностью независимы друг от друга, что, вероятно, привело бы к ошибочному поведению приложения.Если необходимо передать экземпляр SpinLock, он должен передаваться по ссылке, а не по значению.

В двух словах, spinlock использует атомарные инструкции compare and swap (CAS) или test-and-set like для реализации потокобезопасной идиомы lock free, wait free.Такие структуры хорошо масштабируются в многоядерных машинах.

Это цикл, который вращается до тех пор, пока не будет выполнено условие.

Ну, да - преимущество спин-блокировок (по сравнению с традиционными критическими секциями и т.д.) В том, что они обеспечивают лучшую производительность при некоторых обстоятельствах (многоядерные системы ..), потому что они не сразу выдают оставшуюся часть кванта потока.

Spinlock - это тип блокировки, который не блокируется и не переходит в спящий режим.Любой поток, который хочет получить блокировку вращения для любого общего или критического ресурса, будет непрерывно вращаться, тратя впустую цикл обработки процессора, пока не получит блокировку для указанного ресурса.Как только spinlock приобретен, он пытается завершить работу в своем объеме, а затем соответственно освободить ресурс.Spinlock - это самый высокоприоритетный тип блокировки, проще говоря, это не упреждающий вид блокировки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top