Jakie są podstawowe różnice między blokadami spinowymi a semaforami w akcji?
Jakie są podstawowe różnice między blokadami spinowymi a semaforami w akcji?
Odpowiedzi:
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)
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.
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