Jaka jest różnica między blokadami spinowymi a semaforami?


15

Jakie są podstawowe różnice między blokadami spinowymi a semaforami w akcji?



@Gilles też na to spojrzałem, ale jedyną wzmianką o semaforach na stronie jest Warren, który komentuje, że „Jeśli ktoś chce poznać różnicę między blokadą spinową a, powiedzmy, semaforem, to inne pytanie”.
Michael Mrozek

@Michael: ok, myślę, że odpowiedzi tam dotyczyły głównej kwestii, ale masz rację, że żaden wyraźnie nie stwierdził, że semafory były jednym z innych rodzajów blokad.
Gilles „SO- przestań być zły”

Wyjaśnienie Linusa Torvaldsa: yarchive.net/comp/linux/semaphores.html
myaut

Duplikat stackoverflow.com/questions/195853/spinlock-versus-semaphore W wątku, o który prosiłem, jest wiele dobrych wyjaśnień.
iankits

Odpowiedzi:


13

Oba zarządzają ograniczonymi zasobami. Najpierw opiszę różnicę między semaforem binarnym (mutex) a blokadą spinową.

Blokady spinowe wykonują zajęte oczekiwanie - tzn. Ciągle działają w pętli:

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

Wykonuje bardzo lekkie blokowanie / odblokowywanie, ale jeśli wątek blokujący zostanie zablokowany przez inne, które będą próbowały uzyskać dostęp do tego samego zasobu, drugi po prostu spróbuje zdobyć zasoby, dopóki nie zabraknie kwant CPU.

Z drugiej strony muteks zachowuje się bardziej jak:

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

Dlatego jeśli wątek będzie próbował uzyskać zablokowany zasób, zostanie zawieszony, dopóki nie będzie dla niego dostępny. Blokowanie / odblokowywanie jest znacznie cięższe, ale czekanie jest „darmowe” i „sprawiedliwe”.

Semafor to blokada, która może być używana wielokrotnie (znana z inicjalizacji) wiele razy - na przykład 3 wątki mogą jednocześnie przechowywać zasób, ale nie więcej. Jest stosowany na przykład w problemach producenta / konsumenta lub ogólnie w kolejkach:

P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)

Dobre wyjaśnienie, chcę tylko podkreślić jedną kwestię. Semafor kontra muteks jest kwestią interfejsu: muteks jest trzymany lub nie, podczas gdy semafor jest utrzymywany przez do N wątków; muteks jest szczególnym przypadkiem semaforów o wartości N = 1. Spinlock kontra inny rodzaj blokady jest kwestią implementacji: blokada próbuje uzyskać blokadę, podczas gdy inne rodzaje czekają na powiadomienie. W kontekście jądra Linux jedyna blokada z implementacją spin ma interfejs mutex.
Gilles „SO- przestań być zły”

W kontekście jądra Linux jedyna blokada z implementacją spin ma interfejs mutex. Nie rozumiem tej linii. Czy możesz to rozwinąć?
Sen

@Sen: Miał na myśli, że blokada spinowa w Linuksie zachowuje się binarnie (jest zablokowana lub nie). Możliwe jest, że spinning lock zachowuje się jak semafor.
Maciej Piechotka,

„Ale jeśli wątek blokujący zostanie zablokowany przez inny, który będzie próbował uzyskać dostęp do tego samego zasobu, drugi po prostu spróbuje pozyskać zasoby, dopóki nie zabraknie kwantów procesora.”: Ale nadal pozostaje problem z Mutex. Co się stanie, jeśli zadanie o wyższym priorytecie musi uzyskać dostęp do zasobu… czy to tylko kolejka? Być może lepiej jest unieważnić dzielenie zasobów między zadaniami o różnych priorytetach.
Hibou57

@ Hibou57: Tak, jest zablokowany, ponieważ stan jest niespójny, a korzystanie z zasobu miałoby „śmieszne” efekty (powiedzmy, że wątek o niskim priorytecie był w trakcie dodawania lub usuwania czegoś do / z połączonej listy). Istotą tego stwierdzenia było to, że jeśli wątek jest zablokowany, nie jest zaplanowany, więc nie zużywa zasobów, podczas gdy wątek oczekuje na spinlock. Blokowanie systemów czasu rzeczywistego (szczególnie trudne) to inny temat i nie mam wystarczającej wiedzy, aby na nie odpowiedzieć - jednak systemy te czasami wdrażają darowizny priorytetowe lub inne techniki.
Maciej Piechotka

2

Blokady są używane w kontekście przerwania, w którym spanie nie jest dozwolone. Sondują w ciasnej pętli, nie robiąc nic innego, dopóki zasoby nie zostaną pozyskane. Najczęściej stosowany w ISR, a także bardziej bezpieczny i wydajny.

Semafory mogą być używane w kontekście procesu, w którym spanie jest w porządku.


1

Oto mój krótki rzut oka na odpowiedź: blokada obrotu i semafor binarny (który zarządza zasobem, z którego może korzystać tylko jedna rzecz) są prawie identyczne. Ich rozróżnienie polega na tym, że blokady blokujące zarządzają uruchamianiem kodu, podczas gdy semafory binarne zarządzają jakimś szczególnym zasobem (np. Czasem procesora, wyświetlaniem)

Zwykły semafor jest jednak w stanie zarządzać kilkoma wątkami uzyskującymi dostęp do zasobu, który można podzielić na kilka, ale jest ograniczony (np. Pamięć, przepustowość sieci)

Krótko mówiąc, spin-lock prawdopodobnie będzie pytał semafor, czy może użyć zasobu. (Wyobraź sobie, że dziecko musi korzystać z łazienki i czeka na kogoś innego).

Źródła: Wprowadzenie do programowania systemów, systemów operacyjnych i wikipedii

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.