@ Жиль Я тоже посмотрел на это, но единственное упоминание семафоров на странице - Уоррен, который комментирует: «Если кто-то хочет узнать разницу между спин-блокировкой и, скажем, семафором, это другой вопрос».
Михаил Мрозек
@Michael: хорошо, я думаю, что ответы там касались основного момента, но вы правы, что никто прямо не заявил, что семафоры были одним из других видов блокировок.
Оба управляют ограниченным ресурсом. Сначала я опишу разницу между двоичным семафором (мьютексом) и спин-блокировкой.
Спин-блокировки выполняют занятое ожидание - т.е. он продолжает работать цикл:
while (try_acquire_resource ());
...
release();
Он выполняет очень легкую блокировку / разблокировку, но если поток блокировки будет вытеснен другим, который попытается получить доступ к тому же ресурсу, второй просто попытается получить ресурс, пока он не исчерпает свои кванты ЦП.
if (!try_lock()) {
add_to_waiting_queue ();
wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();
Следовательно, если поток попытается получить заблокированный ресурс, он будет приостановлен, пока не станет доступным для него. Блокировка / разблокировка намного тяжелее, но ожидание «бесплатно» и «честно».
Семафор - это блокировка, которую разрешено использовать несколько раз (известно из инициализации) - например, 3 потокам разрешено одновременно удерживать ресурс, но не более. Это используется, например, в проблеме производителя / потребителя или вообще в очередях:
Хорошее объяснение, я просто хочу подчеркнуть один момент. Семафор против мьютекса является вопросом интерфейса: мьютекс удерживается или нет, в то время как семафор удерживается до N потоков; мьютекс - это особый случай семафоров с N = 1. Спинлок против другого вида блокировки является вопросом реализации: спин-блокировка пытается получить блокировку, тогда как другие ожидают уведомления. В контексте ядра Linux единственная блокировка с реализацией spin имеет интерфейс мьютекса.
Жиль "ТАК ... перестать быть злым"
В контексте ядра Linux единственная блокировка с реализацией spin имеет интерфейс мьютекса. Я не понимаю эту линию. Не могли бы вы расширить это?
Сен
@Sen: Он имел в виду, что спин-блокировка в Linux ведет себя бинарно (заблокирована или нет). Возможно иметь вращающийся замок, ведущий себя как семафор.
Мацей Пехотка
«Но если поток блокировки будет вытеснен другим, который попытается получить доступ к тому же ресурсу, второй просто попытается получить ресурс до тех пор, пока у него не закончатся кванты ЦП». Но проблема все еще остается с Mutex. Что если задача с более высоким приоритетом должна получить доступ к ресурсу ... он просто поставлен в очередь? Может быть, лучше отказаться от разделения ресурсов между задачами с разными приоритетами.
Hibou57
@ Hibou57: Да, он заблокирован, поскольку состояние не согласовано, и использование ресурса будет иметь «забавные» эффекты (скажем, поток с низким приоритетом был в процессе добавления или удаления чего-либо в / из связанного списка). Смысл этого утверждения состоял в том, что если поток заблокирован, он не запланирован, поэтому он не потребляет ресурсы, в то время как поток ожидает на спин-блокировку. Блокировка для систем реального времени (особенно сложных) - это отдельная тема, и у меня нет достаточных знаний, чтобы на нее ответить - однако в этих системах иногда используются приоритетные пожертвования или другие методы.
Мацей Пехотка
2
Спинлоки используются в контексте прерываний, где спящий режим не разрешен. Они опрашивают в тесной петле, ничего не делая, пока ресурс не будет приобретен. В основном используется в ISR и более безопасен и эффективен.
Семафоры могут быть использованы в контексте процесса, где спит нормально.
Вот мой быстрый ответ на вопрос: спин-блокировка и двоичный семафор (который управляет ресурсом, который может использоваться только одной вещью) почти идентичны. Их отличие состоит в том, что спин-блокировки управляют кодом, который запускается, в то время как двоичные семафоры управляют каким-то единичным ресурсом (например, временем процессора, выводом на дисплей).
Однако обычный семафор способен управлять несколькими потоками, обращающимися к ресурсу, который может быть разделен между несколькими, но ограничен (например, память, пропускная способность сети)
Короче говоря, спин-блокировка, вероятно, будет продолжать спрашивать семафор, может ли он использовать ресурс. (Представьте, что ребенку нужно пользоваться ванной и ждать, пока кто-нибудь еще закончит.)
Источники: Введение в системное программирование, операционные системы и википедию
Ответы:
Оба управляют ограниченным ресурсом. Сначала я опишу разницу между двоичным семафором (мьютексом) и спин-блокировкой.
Спин-блокировки выполняют занятое ожидание - т.е. он продолжает работать цикл:
Он выполняет очень легкую блокировку / разблокировку, но если поток блокировки будет вытеснен другим, который попытается получить доступ к тому же ресурсу, второй просто попытается получить ресурс, пока он не исчерпает свои кванты ЦП.
С другой стороны, мьютекс ведет себя как:
Следовательно, если поток попытается получить заблокированный ресурс, он будет приостановлен, пока не станет доступным для него. Блокировка / разблокировка намного тяжелее, но ожидание «бесплатно» и «честно».
Семафор - это блокировка, которую разрешено использовать несколько раз (известно из инициализации) - например, 3 потокам разрешено одновременно удерживать ресурс, но не более. Это используется, например, в проблеме производителя / потребителя или вообще в очередях:
источник
Спинлоки используются в контексте прерываний, где спящий режим не разрешен. Они опрашивают в тесной петле, ничего не делая, пока ресурс не будет приобретен. В основном используется в ISR и более безопасен и эффективен.
Семафоры могут быть использованы в контексте процесса, где спит нормально.
источник
Вот мой быстрый ответ на вопрос: спин-блокировка и двоичный семафор (который управляет ресурсом, который может использоваться только одной вещью) почти идентичны. Их отличие состоит в том, что спин-блокировки управляют кодом, который запускается, в то время как двоичные семафоры управляют каким-то единичным ресурсом (например, временем процессора, выводом на дисплей).
Однако обычный семафор способен управлять несколькими потоками, обращающимися к ресурсу, который может быть разделен между несколькими, но ограничен (например, память, пропускная способность сети)
Короче говоря, спин-блокировка, вероятно, будет продолжать спрашивать семафор, может ли он использовать ресурс. (Представьте, что ребенку нужно пользоваться ванной и ждать, пока кто-нибудь еще закончит.)
Источники: Введение в системное программирование, операционные системы и википедию
источник