Подтвердить что ты не робот

Что такое "спин-замки"?

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

Каковы они?

4b9b3361

Ответ 1

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

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

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

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

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

РЕДАКТИРОВАТЬ: возник вопрос: "Значит ли это, что я должен использовать спин-блокировки везде, где это возможно?" и я постараюсь ответить на него:

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

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

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

Ответ 2

Говорите, что ресурс защищен блокировкой, поток, который хочет получить доступ к ресурсу, должен сначала получить блокировку. Если блокировка недоступна, поток может неоднократно проверять, освобожден ли замок. За это время ожидание потока ожидает, проверяет блокировку, использует CPU, но не делает никакой полезной работы. Такой замок называется блокировкой спина.

Ответ 3

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

while(cantGoOn) {};

Ответ 4

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

Ответ 5

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

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

Смотрите, например, Spinlocks в ядре Linux.

Ответ 6

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

Пример:

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

try acquiring Kernel object

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

Ответ 11

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