Каковы основные различия между спин-блокировками и семафорами в действии?
Каковы основные различия между спин-блокировками и семафорами в действии?
Ответы:
Оба управляют ограниченным ресурсом. Сначала я опишу разницу между двоичным семафором (мьютексом) и спин-блокировкой.
Спин-блокировки выполняют занятое ожидание - т.е. он продолжает работать цикл:
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)
Спинлоки используются в контексте прерываний, где спящий режим не разрешен. Они опрашивают в тесной петле, ничего не делая, пока ресурс не будет приобретен. В основном используется в ISR и более безопасен и эффективен.
Семафоры могут быть использованы в контексте процесса, где спит нормально.
Вот мой быстрый ответ на вопрос: спин-блокировка и двоичный семафор (который управляет ресурсом, который может использоваться только одной вещью) почти идентичны. Их отличие состоит в том, что спин-блокировки управляют кодом, который запускается, в то время как двоичные семафоры управляют каким-то единичным ресурсом (например, временем процессора, выводом на дисплей).
Однако обычный семафор способен управлять несколькими потоками, обращающимися к ресурсу, который может быть разделен между несколькими, но ограничен (например, память, пропускная способность сети)
Короче говоря, спин-блокировка, вероятно, будет продолжать спрашивать семафор, может ли он использовать ресурс. (Представьте, что ребенку нужно пользоваться ванной и ждать, пока кто-нибудь еще закончит.)
Источники: Введение в системное программирование, операционные системы и википедию