Do czego służy Test-and-Set?

Po przeczytaniu wpisu test-and-Set w Wikipedii, pozostaje mi jeszcze pytanie "do czego miałby służyć Test-and-Set?"

Zdaję sobie sprawę, że można go użyć do implementacji Mutex (jak opisano w Wikipedii), ale jakie inne zastosowania ma?

Author: Gilles, 2008-09-23

5 answers

Używasz go zawsze, gdy chcesz zapisać dane do pamięci po wykonaniu jakiejś pracy i upewnij się, że inny wątek nie nadpisał miejsca docelowego od początku. Wiele algorytmów lock/mutex-free przyjmuje taką formę.

 8
Author: moonshadow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:24:59

Dobrym przykładem jest " increment."

Say two threads execute a = a + 1. Say a zaczyna się od wartości 100. Jeśli oba wątki działają w tym samym czasie (wielordzeniowe), oba ładują a jako 100, zwiększają do 101 i przechowują je z powrotem w a. Źle!

Z test-and-set, mówisz " Set a na 101, ale tylko wtedy, gdy ma obecnie wartość 100."W tym przypadku jeden wątek zda ten test, ale drugi nie. W przypadku awarii, thread może ponownie spróbować całej instrukcji, tym razem ładując a jako 101. Sukces.

Jest to na ogół szybsze niż użycie mutexu, ponieważ:

  1. przez większość czasu nie ma warunków rasowych, więc aktualizacja odbywa się bez konieczności zdobywania jakiegoś mutexu.
  2. nawet podczas kolizji, jeden wątek nie jest w ogóle blokowany, a drugi wątek jest szybszy, aby po prostu zakręcić i spróbować ponownie, niż zawiesić się w kolejce dla jakiegoś mutexu.
 15
Author: Jason Cohen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-23 13:30:33

Wyobraź sobie, że piszesz wniosek bankowy, a twój wniosek miał prośbę o wypłatę 10 funtów (tak, jestem Anglikiem ;)) z konta. Musisz więc odczytać bieżące saldo konta do zmiennej lokalnej, odjąć wypłatę, a następnie zapisać saldo z powrotem do pamięci.

Co jednak zrobić, jeśli między odczytaniem wartości a zapisaniem nastąpi kolejne, równoczesne żądanie? Istnieje możliwość, że wynik tego żądania zostanie całkowicie nadpisany przez pierwszy, a saldo konta będzie nieprawidłowe.

Test-and-set pomaga nam rozwiązać ten problem, sprawdzając, czy wartość nadpisywania jest taka, jaka powinna być. W takim przypadku możesz sprawdzić, czy saldo było oryginalną wartością, którą przeczytałeś. Ponieważ jest atomowa, jest niezakłócona, więc nikt nie może wyciągnąć spod ciebie dywanu między czytaniem a zapisywaniem.

Innym sposobem na naprawienie tego samego problemu jest usunięcie blokady na miejscu pamięci. Niestety, zamki są niezwykle trudne do uzyskania, trudne do rozumowania, mają problemy ze skalowalnością i zachowują się źle w obliczu awarii, więc nie są idealnym (ale zdecydowanie praktycznym) rozwiązaniem. Podejście Test-and-set stanowi podstawę niektórych pamięci transakcyjnych oprogramowania, które optymistycznie pozwalają na jednoczesną realizację każdej transakcji, kosztem cofnięcia ich wszystkich w przypadku konfliktu.

 5
Author: HenryR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-23 13:43:29

Zasadniczo, jego użycie jest dokładnie dla muteksów, biorąc pod uwagę ogromne znaczenie atomiczności. To wszystko.

Test-and-set to operacja, która może być wykonywana z dwiema innymi instrukcjami, bezatomową i szybszą (atomicity ponosi koszty sprzętu w systemach wieloprocesorowych), więc zazwyczaj nie używasz jej z innych powodów.

 1
Author: tzot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-23 13:26:48

Jest używany, gdy musisz uzyskać wspólną wartość, zrobić coś z nią i zmienić wartość, zakładając, że inny wątek jeszcze jej nie zmienił.

Jeśli chodzi o praktyczne zastosowania, ostatni raz widziałem to w implementacjach równoległych kolejek (kolejek, które mogą być popchnięte/popped przez wiele wątków bez potrzeby semaforów lub muteksów).

Dlaczego używasz TestAndSet zamiast mutex? Ponieważ generalnie wymaga mniej kosztów ogólnych niż mutex. Gdzie mutex wymaga systemu operacyjnego interwencja, TestAndSet może być zaimplementowany jako pojedyncza Instrukcja atomowa NA CPU. Podczas pracy w środowiskach równoległych ze setkami wątków pojedynczy mutex w krytycznej części kodu może spowodować poważne wąskie gardła.

 0
Author: dongola7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-23 13:33:51