Почему спин-блокировки не работают в однопроцессорных (одноядерных) системах? - PullRequest
7 голосов
/ 07 февраля 2012

Я знаю, что спин-блокировки работают с вращением, существуют разные пути ядра, и ядра являются преимущественными, так почему же спин-блокировки не работают в однопроцессорных системах?(например, в Linux)

Ответы [ 5 ]

27 голосов
/ 07 февраля 2012

Если я понимаю ваш вопрос, вы спрашиваете, почему спин-блокировки являются плохой идеей на одноядерных машинах.

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

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

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

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

2 голосов
/ 11 июля 2014

Существуют разные версии спин-блокировки:

spin_lock_irqsave(&xxx_lock, flags);
... critical section here ..
spin_unlock_irqrestore(&xxx_lock, flags);

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

spin_lock(&lock);
...
spin_unlock(&lock);

В однопроцессорных системах вызов spin_lock_irqsave(&xxx_lock, flags); имеет тот же эффект, что и отключение прерываний, что обеспечит необходимую защиту от одновременного прерывания без ненужной защиты SMP. Однако в многопроцессорных системах это охватывает проблемы как прерывания, так и одновременного выполнения SMP.

2 голосов
/ 10 февраля 2012

Характер спин-блокировки заключается в том, что он не отменяет планирование процесса - вместо этого он вращается до тех пор, пока процесс не получит блокировку.

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

1 голос
/ 29 февраля 2012

Спин-блокировки по своей природе предназначены для использования в многопроцессорных системах, хотя однопроцессорная рабочая станция, на которой работает вытесняющее ядро, ведет себя как SMP в плане параллелизма.Если бы непревзойденная однопроцессорная система когда-либо вращалась на замке, она вращалась бы вечно;никакой другой поток не сможет получить процессор, чтобы снять блокировку.По этой причине операции спин-блокировки в однопроцессорных системах без включенного вытеснения оптимизированы, чтобы ничего не делать, за исключением тех, которые изменяют статус маскирования IRQ.Из-за вытеснения, даже если вы никогда не ожидаете, что ваш код будет работать в системе SMP, вам все равно нужно будет реализовать правильную блокировку.

Ссылка: Драйверы устройств Linux ByДжонатан Корбет, Алессандро Рубини, Грег Кроа-Хартма

0 голосов
/ 17 февраля 2017

Найдите следующие два абзаца в Операционная система Три простых компонента , которые могут оказаться полезными:

Для спин-блокировок, в случае с одним ЦП, снижение производительности может быть довольно больно; представьте себе случай, когда нить, удерживающая замок упреждено в критической секции. Планировщик может затем запустить каждый другой поток (представьте, что есть N - 1 других), каждый из которых пытается получить блокировку. В этом случае каждый из этих потоков будет вращаться в течение отрезка времени, прежде чем отказаться от процессора, трата процессорных циклов.

Однако на нескольких процессорах работают спин-блокировки достаточно хорошо (если число потоков примерно равно числу ЦП). Мышление выглядит следующим образом: представьте себе поток А на ЦП 1 и Поток B на ЦП 2, оба борются за блокировку. Если поток А (ЦП 1) захватывает блокировку, а затем нить B пытается, B будет вращаться (на ЦП 2). Тем не менее, по-видимому, критический раздел является коротким, и поэтому вскоре блокировка становится доступной и приобретается потоком B. ожидание блокировки другого процессора не тратит много времени этот случай и, следовательно, может быть эффективным

...