A SPIN használata, példák II Dr. Németh L. Zoltán (zlnemeth@inf.u-szeged.hu) SZTE, Informatikai Tanszékcsoport 2008/2009 I. félév 2008.10.18/2 MODELL 9 1
2. példa: Egy osztott algoritmus Pl. legyen ez az Eratoszhenészi szita Eratoszthenész (Küréné, i. e. 276 Alexandria, i. e. 194) hellenisztikus matematikus, földrajztudós, csillagász, filozófus, költő, zenész jól ismert algoritmus (és programozási gyakorlat) prímszámok előállítására http://hu.wikipedia.org/wiki/eratoszthenész_szitája Mivel a PROMELA modellek csak végesek lehetnek meg kell adnunk egy felső korlátot a legnagyobb egész számra aminek a prímségét tesztelni akarjuk Legyen ez MAX. Mivel a SPIN elsősorban nem számítási problémák (hanem protokollok) ellenőrzésére van ne várjuk tőle, hogy hatalmas korlátokkal is megbirkózik. Kezdjük 2008.10.18/2 mondjuk MAX = MODELL 25-tel. 9 2
Párhuzamos megvalósítás az egyik folyamat végezze minden páros szám kihúzását (tesztelését) a második folyamat minden hárommal oszthatóét, stb. a folyamatoknak dinamikusan kell létrehozniuk egymást, így például, miután az 5 számot se az osztható 2-vel?, se az osztható 3-mal folyamat nem szűri ki az osztható 3-mal folyamat létrehozza az osztható 5- tel? folyamatot ez az új folyamat az osztható 3-mal folyamat gyermek folyamata lesz, tőle kapja majd a számokat tesztelésre 2008.10.18/2 MODELL 9 3
Egy folyamat működése minden folyamat egyik paramétere egy prime prímszám, mellyel való oszthatóságot hivatott tesztelni másik paramétere egy csatorna neve: c, amelyen a tesztelendő számokat kapja a szülő folyamatától ha egy szám amit kapott osztható prime-mal, akkor nincs további teendő ha nem osztható, akkor a folyamat tovább küldi a gyermek folyamatának tesztelésre 2008.10.18/2 MODELL 9 4
Egy folyamat működése II ha még nincs gyermek folyamata, akkor létre kell azt hozni, mégpedig a tesztelendő számmal és egy csatornával (ez utóbbi neve a folyamat lokális változója) ilyenkor persze a tesztelendő számról tudjuk, hogy prím, mert minden folyamat szűrőjén átment ezért a létrehozott folyamatnak az első dolga az lesz, hogy a saját prime paraméterét kiírja, mint prímszámot ezen felül kell még egy init folyamat, mely létrehozza az első tesztelő folyamatot prime=2 értékkel és aztán sorra adogatja neki a számokat, 3-tól MAX-ig 2008.10.18/2 MODELL 9 5
Az algoritmus befejezése miután init az összes számot MAX-ig beadta,,osztható 2-vel? -nek elküldi neki az eof üzenetet, hogy fejezze be a működését ezt az üzenetet,,osztható 2-vel? továbbadja gyermek folyamatának,,osztható 3-mal? -nak és így tovább azaz minden folyamat az eof üzenetet továbbküldi (ha van gyereke), majd véget ér mint mindig a folyamatok most is csak keletkezésükkel ellentétes sorrendben tudnak kihalni, de ez nem probléma. 2008.10.18/2 MODELL 9 6
Megvalósítás I. eratosthenes.pml /* The Sieve of Eratosthenes (c. 276-196 BC) Prints all prime numbers up to MAX */ #define MAX 25 mtype = { number, eof }; Az üzenetek típusa: szám vagy vége jelzés chan root = [0] of { mtype, int }; Az első szinkorn (randevú) csatorna a 2. komponens a szám értéke, eof üzenetnél 0 lesz. 2008.10.18/2 MODELL 9 7
init { int n = 2; run sieve(root, n); do Megvalósítás II. :: (n < MAX) -> n++; root!number(n) :: (n >= MAX) -> root!eof(0); break od } A legelső prím a 2. Sorra küldi a gyerek folyatának a számokat. A végén (eof,0) az üzenet. 2008.10.18/2 MODELL 9 8
Megvalósítás III. proctype sieve(chan c; int prime) { chan child = [0] of { mtype, int }; bool haschild; int n; printf("msc: %d is prime\n", prime); do :: c?number(n) -> if :: (n%prime) == 0 -> printf("msc: %d = %d*%d\n", n, prime, n/prime) :: else -> if ::!haschild -> /* new prime */ fi haschild = true; run sieve(child, n); :: else -> child!number(n) fi; lokális változó amin a gyerekével kommunikál Van-e már gyereke vagy ő az utolsó folyamat? Ha n osztható prime-al, akkor nem prímszám. Ha ő az utolsó folyamat, új prímet találtunk. Különben a számot továbbküldjük a gyerekének. 2008.10.18/2 MODELL 9 9
Megvalósítás IV. :: c?eof(0) -> break od; if :: haschild -> child!eof(0) :: else fi } Vége. Ha eof üzenet jött kilépünk a ciklusból. Ha van gyerek folyamatunk, továbbadjuk neki az eof üzenetet. 2008.10.18/2 MODELL 9 10
Egy futás lehetséges eredménye >spin eratosthenes.pml MSC: 2 is prime MSC: 3 is prime MSC: 4 = 2*2 MSC: 5 is prime MSC: 6 = 2*3 MSC: 8 = 2*4 MSC: 7 is prime MSC: 9 = 3*3 MSC: 10 = 2*5 MSC: 12 = 2*6 MSC: 14 = 2*7 MSC: 11 is prime MSC: 15 = 3*5 MSC: 16 = 2*8 MSC: 13 is prime MSC: 18 = 2*9 MSC: 20 = 2*10 MSC: 17 is prime MSC: 22 = 2*11 MSC: 21 = 3*7 MSC: 24 = 2*12 MSC: 19 is prime MSC: 25 = 5*5 MSC: 23 is prime 2008.10.18/2 MODELL 9 11
Szimuláció Maga az algoritmus determinisztikus De a folyamatok ütemezése nem Ezért az üzenetküldések sorrendje és így a pírmek felfedezésének sorrendje is változhat. Végül mind a 10 folyamat befejeződik. Ezek a következők: az init folyamat és a 9 prímszám teszt folyamata MAX= 25-ig: 2, 3, 5, 7, 11, 13, 17, 19, 23 2008.10.18/2 MODELL 9 12
(Spin Version 5.1.6 -- 9 May 2008) + Partial Order Reduction Verifikáció Full statespace search for: never claim - (not selected) assertion violations - (disabled by -A flag) cycle checks - (disabled by -DSAFETY) invalid end states + State-vector 280 byte, depth reached 288, errors: 0 2093 states, stored 478 states, matched 2571 transitions (= stored+matched) 0 atomic steps hash conflicts: 0 (resolved) 2.891 memory usage (Mbyte) Minden rendben. 2008.10.18/2 MODELL 9 13
Az állapotszám csökkenthető az állapotszám robbanás ellen az egyik hatékony eszköz a részbenrendezési redukció (partial order reduction) alkalmazásával csökkenteni tudjuk a megvizsgálandó állapotok számát ezt a technikát segíthetjük ha a csatornák használatára feltételezéseket közlünk (közben a feltételezéseket is ellenőrizni fogjuk) exclusive read: xr csat = csak az adott folyamat olvas a csat nevű csatornából exclusive send: xs csat = csak az adott folyamat küld üzenetet a csat nevű csatornába Esetünkben: a sieve folyamatban: xr c; xs child az init folyamatban xs root igaz feltételezés. 2008.10.18/2 MODELL 9 14
Az állapotszám csökkenthető II. Csak az a gond, hogy ezek a csatorna feltételezések nem alkalmazhatók randevú csatornákra. A,,Check xr/xs Assertion opciót bekapcsolva: chan root (0), sndr proc :init: (0) pan: xs chans cannot be used for rv (at depth 0) pan: wrote pan_in.trail errors: 1 Át kell térnünk ezért 1 üzenetet tároló csatornákra: chan root = [1] of { mtype, int }; chan child = [1] of { mtype, int }; De ez önmagában (csatorna-feltételezések nélkül) több mint tízszeresére, 24548-ra növeli az állapotszámot eratosthenesb.pml ellenőrzése 2008.10.18/2 MODELL 9 15
Az állapotszám csökkenthető III. Mégis, csatorna-feltételezésekkel együtt: (Spin Version 5.1.6 -- 9 May 2008) + Partial Order Reduction eratosthenesc.pml ellenőrzése Full statespace search for: never claim - (not selected) assertion violations - (disabled by -A flag) cycle checks - (disabled by -DSAFETY) invalid end states + State-vector 280 byte, depth reached 288, errors: 0 289 states, stored 0 states, matched 289 transitions (= stored+matched) 0 atomic steps hash conflicts: 0 (resolved) 2.501 memory usage (Mbyte) Ami a csatornafeltételezések meglepő hatékonyságát mutatja. 2008.10.18/2 MODELL 9 16