Jak mogę zweryfikować algorytmy bez blokady?

Teoretycznie powinno być możliwe co najmniej wymuszenie weryfikacji algorytmu bez blokady (jest tylko tyle kombinacji przecinających się wywołań funkcji). Czy istnieją jakieś narzędzia lub formalnych procesów rozumowania dostępnych rzeczywiście udowodnić, że algorytm bez blokady jest poprawny (najlepiej powinno być również w stanie sprawdzić warunki wyścigu i problem ABA, jak również)?

Uwaga: jeśli znasz sposób na udowodnienie tylko jednego punktu (np. udowodnij tylko, że jest bezpieczny przed problemem ABA) lub problem, o którym nie wspomniałem, a następnie opublikuj rozwiązanie i tak. W najgorszym przypadku każda metoda może być wykonana po kolei, aby w pełni ją zweryfikować.

Author: Grant Peters, 2010-01-15

5 answers

Zdecydowanie powinieneś wypróbować Spin Model checker .

Piszesz model podobny do programu w prostym języku C o nazwie Promela, który wewnętrznie przekłada się na maszynę stanową. Model może zawierać wiele równoległych procesów.

To, co robi Spin, to sprawdzanie każdego możliwego przeplatania instrukcji z każdego procesu dla niezależnie od warunków, które chcesz przetestować - zazwyczaj brak warunków rasy, wolność od impasów itp. Większość z tych testów może być łatwo napisana za pomocą assert() instrukcji. Jeśli istnieje jakakolwiek możliwa Sekwencja wykonania, która narusza twierdzenie, sekwencja jest drukowana, w przeciwnym razie otrzymasz "wszystko jasne".

(w rzeczywistości używa znacznie wymyślniejszego i szybszego algorytmu, aby to osiągnąć, ale taki jest efekt. Domyślnie sprawdzane są wszystkie dostępne Stany programu.)

To jest niesamowity program, który zdobył nagrodę ACM System Software Award 2001]} (inni laureaci to Unix, Postscript, Apache, TeX). Zacząłem go używać bardzo szybko i w ciągu kilku dni udało mi się zaimplementować modele funkcji MPI MPI_Isend() i MPI_Irecv() w Promeli. Spin znalazł kilka trudnych warunków wyścigowych w jednym segmencie równoległego kodu zamieniłem na Promela do testów.

 20
Author: j_random_hacker,
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
2010-01-15 14:05:19

Spin jest rzeczywiście doskonały, ale rozważmy również Relacy Race Detector autorstwa Dmitrija V ' Żukowa. Jest przeznaczony do weryfikacji algorytmów współbieżnych, w tym nieblokujących (wait-/lock-free) algorytmów. Jest open source i licencjonowany.

Relacy zapewnia podstawowe funkcje synchronizacji POSIX i Windows (muteksy, zmienne warunkowe, semafory, krytyczne sekcje, zdarzenia win32, Interlocked*, itp.), więc Twoja aktualna implementacja C++ może zostać przekazana do Relacy w celu weryfikacji. Nie. potrzeba opracowania osobnego modelu algorytmu, jak w przypadku Promeli i spinu.

Relacy dostarcza C++0x std::atomic (explicit memory ordering for the win! możesz więc użyć pre-procesora #defines, aby wybrać pomiędzy implementacją Relacy A własną implementacją atomową (TBB::atomic, boost:: atomic , etc).

Planowanie jest sterowalne: dostępne są losowe, związane z kontekstem i pełne wyszukiwanie (wszystkie możliwe interleavingi).

Oto przykład relacji program. Kilka rzeczy do zapamiętania:

  • $ jest makrem relacyjnym, które rejestruje informacje o wykonaniu.
  • rl::var<T> oznacza zmienne" normalne " (nieatomowe), które również należy rozważyć jako część weryfikacji.

Kod:

#include <relacy/relacy_std.hpp>

// template parameter '2' is number of threads
struct race_test : rl::test_suite<race_test, 2>
{
    std::atomic<int> a;
    rl::var<int> x;

    // executed in single thread before main thread function
    void before()
    {
        a($) = 0;
        x($) = 0;
    }

    // main thread function
    void thread(unsigned thread_index)
    {
        if (0 == thread_index)
        {
            x($) = 1;
            a($).store(1, rl::memory_order_relaxed);
        }
        else
        {
            if (1 == a($).load(rl::memory_order_relaxed))
                x($) = 2;
        }
    }

    // executed in single thread after main thread function
    void after()
    {
    }

    // executed in single thread after every 'visible' action in main threads
    // disallowed to modify any state
    void invariant()
    {
    }
};

int main()
{
    rl::simulate<race_test>();
}

Skompiluj z normalnym kompilatorem (Relacy jest tylko nagłówkiem) i uruchom plik wykonywalny:

struct race_test
DATA RACE
iteration: 8

execution history:
[0] 0:  atomic store, value=0, (prev value=0), order=seq_cst, in race_test::before, test.cpp(14)
[1] 0:  store, value=0, in race_test::before, test.cpp(15)
[2] 0:  store, value=1, in race_test::thread, test.cpp(23)
[3] 0:  atomic store, value=1, (prev value=0), order=relaxed, in race_test::thread, test.cpp(24)
[4] 1:  atomic load, value=1, order=relaxed, in race_test::thread, test.cpp(28)
[5] 1:  store, value=0, in race_test::thread, test.cpp(29)
[6] 1: data race detected, in race_test::thread, test.cpp(29)

thread 0:
[0] 0:  atomic store, value=0, (prev value=0), order=seq_cst, in race_test::before, test.cpp(14)
[1] 0:  store, value=0, in race_test::before, test.cpp(15)
[2] 0:  store, value=1, in race_test::thread, test.cpp(23)
[3] 0:  atomic store, value=1, (prev value=0), order=relaxed, in race_test::thread, test.cpp(24)

thread 1:
[4] 1:  atomic load, value=1, order=relaxed, in race_test::thread, test.cpp(28)
[5] 1:  store, value=0, in race_test::thread, test.cpp(29)
[6] 1: data race detected, in race_test::thread, test.cpp(29)

Najnowsze wersje Relacy zapewniają również modele pamięci Java i CLI, jeśli lubisz tego typu rzeczy.

 7
Author: sstock,
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
2010-02-02 11:35:41

Wykrywanie rasy danych jest trudnym problemem NP [Netzer & Miller 1990]

Słyszałem o tools Lockset, i DJit+ (oni uczą go w kursie CDP). Spróbuj przeczytać slajdy i googlować, do czego się odnoszą. Zawiera kilka ciekawych informacji.

 4
Author: Anna,
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
2010-01-15 13:54:12

Nie wiem, jakiej platformy lub języka używasz - ale na platformie.Net istnieje projekt badawczy Microsoftu o nazwie Chess, który wygląda bardzo obiecująco, pomagając tym z nas, którzy robią wielowątkowe komponenty - w tym bez blokady.

Nie używałem go zbyt wiele, umysł.

To działa (prymitywne Wyjaśnienie) poprzez jawne przeplatanie wątków w najściślejsze możliwe sposoby, aby faktycznie zmusić swoje błędy do dziczy. Analizuje również kod, aby znaleźć wspólne błędy i złe wzorce-podobne do analizy kodu.

W przeszłości zbudowałem również specjalne wersje danego kodu (poprzez bloki # if itp.), które dodają dodatkowe informacje o śledzeniu stanu; liczniki, wersje itp., które mogę następnie zanurzyć w teście jednostkowym.

Problem polega na tym, że pisanie kodu zajmuje dużo więcej czasu i nie zawsze można dodawać tego typu rzeczy bez zmiany struktury kodu, który już tam jest.

 4
Author: Andras Zoltan,
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
2010-01-15 13:56:44

Jeśli chcesz naprawdę zweryfikować kod bez blokady (w przeciwieństwie do wyczerpującego testowania małej instancji), możesz użyć VCC ( http://vcc.codeplex.com ), dedukcyjny weryfikator dla współbieżnego kodu C, który został użyty do weryfikacji ciekawych algorytmów bez blokady (np. listy bez blokady i Hashtable z możliwością zmiany rozmiaru za pomocą wskaźników zagrożeń, optymistyczne przetwarzanie transakcji wielowersowych, wirtualizacja MMU, różne prymitywy synchronizacji itp.). Ma modułową weryfikację i został użyty weryfikacja nietrywialnych fragmentów kodu przemysłowego(do ok. 20KLOC).

Zauważ jednak, że VCC jest weryfikatorem, a nie narzędziem do polowania na błędy; będziesz musiał zrobić znaczną adnotację na swoim kodzie, aby go zweryfikować, a krzywa uczenia się może być nieco stroma. Zauważ również, że zakłada spójność sekwencyjną(jak większość narzędzi).

BTW, peer review nie jest dobrym sposobem na weryfikację algorytmu współbieżnego (a nawet sekwencyjnego). Jest długa historia sławnych ludzi publikujących algorytmy współbieżne w ważnych czasopismach, tylko po to, aby błędy zostały odkryte po latach.

 3
Author: user2949652,
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
2013-11-05 09:42:40