В чем разница между спин-блокировками и семафорами?

15

Каковы основные различия между спин-блокировками и семафорами в действии?

Renjith G
источник
Возможный дубликат Что такое спинлок в Linux?
Жиль "ТАК - перестать быть злым"
@ Жиль Я тоже посмотрел на это, но единственное упоминание семафоров на странице - Уоррен, который комментирует: «Если кто-то хочет узнать разницу между спин-блокировкой и, скажем, семафором, это другой вопрос».
Михаил Мрозек
@Michael: хорошо, я думаю, что ответы там касались основного момента, но вы правы, что никто прямо не заявил, что семафоры были одним из других видов блокировок.
Жиль "ТАК - перестать быть злым"
Объяснение Линуса Торвальдса: yarchive.net/comp/linux/semaphores.html
myaut
Дубликат stackoverflow.com/questions/195853/spinlock-versus-semaphore Многие хорошие объяснения присутствуют в теме, которую я спросил.
Янкит

Ответы:

13

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

Спин-блокировки выполняют занятое ожидание - т.е. он продолжает работать цикл:

while (try_acquire_resource ());
...
release();

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

С другой стороны, мьютекс ведет себя как:

if (!try_lock()) {
    add_to_waiting_queue ();
    wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();   

Следовательно, если поток попытается получить заблокированный ресурс, он будет приостановлен, пока не станет доступным для него. Блокировка / разблокировка намного тяжелее, но ожидание «бесплатно» и «честно».

Семафор - это блокировка, которую разрешено использовать несколько раз (известно из инициализации) - например, 3 потокам разрешено одновременно удерживать ресурс, но не более. Это используется, например, в проблеме производителя / потребителя или вообще в очередях:

P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)
Мацей Печотка
источник
Хорошее объяснение, я просто хочу подчеркнуть один момент. Семафор против мьютекса является вопросом интерфейса: мьютекс удерживается или нет, в то время как семафор удерживается до N потоков; мьютекс - это особый случай семафоров с N = 1. Спинлок против другого вида блокировки является вопросом реализации: спин-блокировка пытается получить блокировку, тогда как другие ожидают уведомления. В контексте ядра Linux единственная блокировка с реализацией spin имеет интерфейс мьютекса.
Жиль "ТАК ... перестать быть злым"
В контексте ядра Linux единственная блокировка с реализацией spin имеет интерфейс мьютекса. Я не понимаю эту линию. Не могли бы вы расширить это?
Сен
@Sen: Он имел в виду, что спин-блокировка в Linux ведет себя бинарно (заблокирована или нет). Возможно иметь вращающийся замок, ведущий себя как семафор.
Мацей Пехотка
«Но если поток блокировки будет вытеснен другим, который попытается получить доступ к тому же ресурсу, второй просто попытается получить ресурс до тех пор, пока у него не закончатся кванты ЦП». Но проблема все еще остается с Mutex. Что если задача с более высоким приоритетом должна получить доступ к ресурсу ... он просто поставлен в очередь? Может быть, лучше отказаться от разделения ресурсов между задачами с разными приоритетами.
Hibou57
@ Hibou57: Да, он заблокирован, поскольку состояние не согласовано, и использование ресурса будет иметь «забавные» эффекты (скажем, поток с низким приоритетом был в процессе добавления или удаления чего-либо в / из связанного списка). Смысл этого утверждения состоял в том, что если поток заблокирован, он не запланирован, поэтому он не потребляет ресурсы, в то время как поток ожидает на спин-блокировку. Блокировка для систем реального времени (особенно сложных) - это отдельная тема, и у меня нет достаточных знаний, чтобы на нее ответить - однако в этих системах иногда используются приоритетные пожертвования или другие методы.
Мацей Пехотка
2

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

Семафоры могут быть использованы в контексте процесса, где спит нормально.

Капил
источник
1

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

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

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

Источники: Введение в системное программирование, операционные системы и википедию

valbaca
источник