Powszechną definicją bez blokady jest to, że co najmniej jeden proces robi postęp. 1
Jeśli mam prostą strukturę danych, taką jak kolejka, chronioną przez blokadę, wtedy jeden proces może zawsze robić postęp, ponieważ jeden proces może uzyskać blokadę, zrobić to, co chce i zwolnić.
Czy spełnia zatem definicję bez blokady?
1 Patrz np. M. Herlihy, V. Luchangco i M. Moir. Synchronizacja bez przeszkód: przykładowo podwójne kolejki. W Distributed Computing, 2003. „Jest bez blokady, jeśli zapewnia tylko, że jakiś wątek zawsze robi postępy”.
multithreading
Joe Pension
źródło
źródło
Odpowiedzi:
To nie jest definicja bez blokady.
Jeśli możesz zagwarantować postęp, to nie masz żadnych zakleszczeń , a jeśli ostatecznie spełnisz każde żądanie, nie masz głodu , ale nie masz blokady.
Wątpię, czy twój prosty przykład tak naprawdę to zapewnia. Potrzebujesz hierarchii blokad i tak dalej, aby faktycznie zagwarantować postęp w przypadku wielu blokad.
źródło
Studiowałem The Art of Multiprocessor Programming 1, a ich tekst jest niejasny, podobnie jak książka, do której się odwołujesz. Oto kilka cytatów z TAMPP:
Cytat 1 (Definicja bez blokady)
Cytat 2 (Definicja nieblokowania)
Cytat 3 (twierdzenie, że bez blokady nie blokuje się)
Problem polega na tym, że twierdzenie z cytatu 3 nie wynika oczywiście z definicji z cytatu 1. Jak już wspomniano, zsynchronizowana kolejka wydaje się spełniać cytat 1: nieskończenie często jakaś metoda z powodzeniem uzyskuje blokadę i kończy.
Zwróć uwagę na dość niejasne zdanie w cytacie 3: „niezależnie od tego, jak system planuje wątki”. Nie jest to poprzedzone żadnym formalnym opisem „systemu szeregowania wątków”, więc pozostaje nam zrekonstruować jego właściwości w oparciu o nasze wstępne założenia, co powinny oznaczać definicje :
W takim systemie metoda blokowania nie może być wolna od blokady: jeśli wątek przytrzymujący blokadę nigdy nie zostanie ponownie zaplanowany do wykonania, nie będzie innego wątku, który mógłby ukończyć wywołanie metody w skończonej liczbie kroków, ale będzie niektóre wątki wykonujące kroki metody. W przypadku bardziej realistycznego systemu, który gwarantuje, że w końcu da się czas procesora każdemu wątkowi, definicja musi wyraźnie zawierać właściwość nieblokującą:
Poprawiona definicja bez blokady
1 Maurice Herlihy, Nir Shavit, The Art of Multiprocessor Programming, Elsevier 2008, ss. 58–60
źródło
Terminologia nie zawsze jest spójna, ale myślę, że ważne jest, aby zadać następujące pytania dotyczące proponowanego algorytmu lub systemu:
Znaczące znaczenie algorytmów niezablokowanych nie polega na tym, że są one szybsze niż algorytmy niezablokowane, ale raczej na tym, że nie mają skłonności do umierania, jeśli wątek zostanie rozwiązany [zauważ, że taka gwarancja wymaga jedynie że algorytmy nie są blokujące, ale wszystkie algorytmy bez blokady są]. Algorytm bez blokady może korzystać z blokad, ale tylko wtedy, gdy próby uzyskania blokady obejmują limity czasu wraz z algorytmami zapewniającymi, że ktoś będzie mógł robić postępy (na przykład algorytm może wykorzystywać
CompareExchange
pętlę jako podstawową metoda arbitrażu, ale używaj blokad, aby arbitrażować dostęp, gdy wydaje się, że rywalizacja wydaje się wysoka; jeśli blokada wydaje się być utrzymywana zbyt długo, inne wątki mogą zdecydować o rezygnacji z używania tej blokady i zamiast tego stworzyć nową.CompareExchange
, porzucenie blokady przez klientów nie zagroziłoby spójności systemu, choć może to oznaczać, że kod, który trzymał starą blokadę, nie wykona żadnej pracy, dopóki nie zrezygnuje ze starej blokady i nie znajdzie się w kolejce do nowej.źródło
Musisz spojrzeć na „definicję”, którą zacytowałeś w kontekście :
Używasz zamków do wzajemnego wykluczenia, dlatego nie jest to technika bez zamka, o której mówią.
źródło
Może być, ale zależy to od algorytmu.
Uwaga per se .
Jeśli krok „rób, co chce” nie wiąże się z nabywaniem innych blokad i gwarantuje się, że zakończy się w skończonym czasie, to ta konkretna część algorytmu będzie pozbawiona impasu.
Jeśli jednak te warunki wstępne nie zostaną spełnione, istnieje co najmniej możliwość impasu ...
źródło
Podany przykład nie jest pozbawiony blokady z następującego powodu.
Obsługa jednego wątku uzyskuje blokadę, a program operacyjny systemu operacyjnego zawiesił wątek na nieskończony samotny okres, a następnie cały wątek nie może zrobić postępu, ponieważ nie można uzyskać blokady uzyskanej przez zawieszony wątek.
Ogólnie rzecz biorąc, algorytmy wykorzystujące blokady nie są wolne od blokady.
Należy pamiętać, że brak blokady i brak blokady to dwie różne koncepcje. brak blokady oznacza, że nie ma możliwości blokady, ale może istnieć blokada aktywacji, która może uniemożliwić postęp całego systemu. Swoboda blokowania jest silniejsza, ponieważ oznacza, że niektóre wątki w systemie zawsze robią postępy ze skończoną liczbą kroków.
źródło