Spin jest narzędziem do symulacji i formalnej weryfikacji systemów współbieznych i rozproszonych. Językiem wejściowym jest PROMELA. Narzędzie powstało w Bell Labs w roku 1991, gdzie jest rozwijane do chwili obecnej (ostatnia wersja 6.2.3 z października 2012). Siłą Spina są implementacje wielu znanych efektywnych metod analizy systemów współbieżnych. Zasadniczo, narzędzie to zbudowano z myślą o modelowaniu i weryfikacji protokołów komunikacyjnych, natomiast nadaje się ono także wyśmienicie do dydaktyki programowania współbieżnego i rozproszonego. W Spinie nie zaimplementowano natomiast metod weryfikacji symbolicznej, szeroko stosowanych w przemysłowej weryfikacji hardware'u.
W niniejszym scenariuszu będziemy korzystać z następujących przykładowych programów (do pobrania tutaj):
(add-to-list 'load-path "~/.emacs.d/")
(autoload 'promela-mode "promela-mode" "PROMELA mode" nil t)
(setq auto-mode-alist
(append
(list (cons "\\.promela$" 'promela-mode)
(cons "\\.spin$" 'promela-mode)
(cons "\\.pml$" 'promela-mode)
)
auto-mode-alist))
Kolejno obejrzyj następujące pliki od step1-init.pml do step8-chan2.pml. Dla każdego z nich spróbuj przewidzieć efekt uruchomienia, a następnie uruchom poleceniem:
> spin nazwa_plikuWykonaj polecenia i odpowiedz na pytania.
Obejrzyj zawartość pliku increment-par.pml. Jakie wartości końcowe może przyjmować zmienna n? Jaka jest najmniejsza teoretycznie możliwa wartość?
> spin -p -g -w increment-par.pml
> spin -a increment-par.pml (generuje weryfikator pan.c) > gcc -O2 -o pan pan.c > ./panSzczegółowe objaśnienie formatu wyjściowego weryfikatora znajduje się tutaj.
spin -a $1
if [ $? -eq 0 ];
then
rm $1.trail
# safety i reach sa dla optymalizacji czasu; bfs szuka jak najkrótszych kontrprzykładów
gcc -DSAFETY -DREACH -DBFS -o pan pan.c
./pan -E -I
if [ -e $1.trail ];
then
spin -t -p $1
fi
fi
reg = n + 1;
n = reg;
Atomowość można także wymusić w Promeli za pomocą konstrukcji atomic { ... }:
atomic {
reg = n + 1;
n = reg;
}
Inna konstrukcja, która jest bardziej efektywna ale można ją stosować tylko w niektórych przypadkach:
d_step {
reg = n + 1;
n = reg;
}
Parametry wywołań:
Rozwiąż samodzielnie następujące zadanie używając niedeterminizmu.
> spin -a cannibals.pml > gcc -DSAFETY -o pan pan.c > ./pan -E > spin -t -p cannibals.pml
> spin -a -f "<>solution" cannibals.pml > gcc -o pan pan.c > ./pan -a -E > spin -t -p cannibals.pml
Ostatnia modyfikacja: 24/02/2013