Что такое "спин-замки"?
Я всегда задавался вопросом, что это такое: каждый раз, когда я слышу о них, изображения футуристических маховикоподобных устройств танцуют (катятся?) через мой разум...
что это такое?
11 ответов:
когда вы используете обычные блокировки (мьютексы, критические секции и т. д.), операционная система помещает ваш поток в состояние ожидания и заменяет это путем планирования других потоков на одном ядре. Это имеет штраф за производительность, если время ожидания действительно короткое, потому что ваш поток теперь должен ждать preemption чтобы снова получить процессорное время.
кроме того, объекты ядра доступны не в каждом состоянии ядра, например, в обработчике прерываний или при разбиении на страницы не доступен и т. д.
Spinlocks не вызывают вытеснения, но ждут в цикле ("спин"), пока другое ядро не освободит замок. Это предотвращает поток от потери его quantum и продолжайте, как только замок будет освобожден. Простой механизм спин-блоков позволяет ядру использовать его практически в любом состоянии.
вот почему на одноядерной машине spinlock-это просто "отключить прерывания" или "поднять IRQL", который предотвращает планирование потоков полностью.
Spinlocks в конечном счете позволяют ядрам избегать "большой блокировки ядра"s (блокировка, полученная, когда ядро входит в ядро и освобождается на выходе) и имеют гранулярную блокировку над примитивами ядра, что приводит к лучшей мультиобработке на многоядерных машинах, что повышает производительность.
EDIT: возник вопрос: "означает ли это, что я должен использовать spinlocks везде, где это возможно?"и я постараюсь ответить на него:
Как я уже упоминал, спин-замки полезны только в тех местах, где ожидаемое время ожидания короче кванта (читай: миллисекунды), и упреждение не имеет большого смысла (например, объекты ядра недоступны).
Если время ожидания неизвестно, или если вы находитесь в пользовательском режиме блокировки не эффективны. Вы потребляете 100% процессорного времени на ожидающем ядре, проверяя, доступен ли spinlock. Вы не позволяете другим потокам работать на этом ядре до истечения срока действия вашего кванта. Этот сценарий возможен только для коротких пакетов на уровне ядра и маловероятен опция для приложения в пользовательском режиме.
вот вопрос при таком обращении, что:Spinlocks, Насколько Они Полезны?
это очень дерзкий цикл, который продолжается до тех пор, пока не будет выполнено определенное условие:
while(cantGoOn) {};
скажем, ресурс защищен блокировкой, поток, который хочет получить доступ к ресурсу, должен сначала получить блокировку. Если блокировка недоступна, поток может повторно проверить, была ли блокировка освобождена. В течение этого времени поток занят ждет, проверяя блокировку, используя CPU, но не делая никакой полезной работы. Такой замок называется спиновым замком.
Это тип замка, который делает напряженного ожидания
Это считается анти-шаблоном, за исключением очень низкоуровневого программирования драйверов (где может случиться, что вызов "правильной" функции ожидания имеет больше накладных расходов, чем просто блокировка занятости в течение нескольких циклов).
см., например,Spinlocks в ядре Linux.
SpinLocks-это те, в которых поток ждет, пока блокировка будет доступна. Это обычно используется, чтобы избежать накладных расходов на получение объектов ядра, когда есть область получения объекта ядра в течение некоторого небольшого периода времени.
Ex:
While(SpinCount-- && Kernel Object is not free) {} try acquiring Kernel object
вы хотели бы использовать spinlock, когда вы думаете, что дешевле ввести цикл ожидания занятости и объединить ресурс вместо блокировки, когда ресурс заблокирован.
вращение может быть полезно, когда блокировки мелкозернистые и большие по количеству (например, блокировка на узел в связанном списке), а также когда время удержания блокировки всегда очень короткое. В общем, удерживая спин-замок, следует избегать блокировки, вызывая все, что само может блокировать, удерживая более одной спиновой блокировки одновременно, делая динамически отправленные вызовы (интерфейс и виртуалы), делая статически отправленные вызовы в любой код, которым он не владеет, или выделяя память.
также важно отметить, что SpinLock является типом значения по соображениям производительности. Таким образом, нужно быть очень осторожным, чтобы случайно не скопировать экземпляр SpinLock, так как два экземпляра (оригинал и копия) будут полностью независимы друг от друга, что, вероятно, приведет к ошибочное поведение приложения. Если экземпляр SpinLock должен быть передан, он должен быть передан по ссылке, а не по значению.
в двух словах, spinlock использует atomic compare and swap (CAS) или test-and-set, как инструкции для реализации блокировки бесплатно, подождите свободной потокобезопасной идиомы. Такие структуры хорошо масштабируются в многоядерных машинах.
Ну да-точка спиновых блокировок (против традиционных критических секций и т. д.) заключается в том, что они обеспечивают лучшую производительность при некоторых обстоятельствах (многоядерные системы..), потому что они не сразу дают остальную часть кванта потока.
блокировка, тип замка, который не заблокировать могут и не спать-в состоянии. Любой поток, который хочет получить spinlock для любого общего или критического ресурса, будет непрерывно вращаться, тратя цикл обработки ЦП, пока он не получит блокировку для указанного ресурса. Как только spinlock приобретается, он пытается завершить работу в своем кванте, а затем освободить ресурс соответственно. Spinlock является самым приоритетным типом блокировки, просто можно сказать, что это не упреждающий вид блокировки.