This commit is contained in:
Francesco Mecca 2020-05-08 19:23:51 +02:00
parent 2f48ab2347
commit 0347f90e15
23 changed files with 1161 additions and 4 deletions

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View file

@ -0,0 +1,14 @@
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1

View file

@ -0,0 +1,2 @@
% MEASURE0
AG(#await_P == 1 -> EF(#critical_Q==1 || #critical_P == 1))

View file

@ -0,0 +1,3 @@
|256
%
|

View file

@ -0,0 +1,2 @@
0
0

View file

@ -0,0 +1,105 @@
|0|
|
f 0 14 0 12 0 0 0
local_P 1 3.0 1.3333333333333333 3.294583333333333 1.2789583333333334 0
await_P 0 3.0 4.333333333333333 3.185208333333333 4.112291666666667 0
SetTrue_P 0 3.0 2.6666666666666665 3.1904166666666662 2.6122916666666667 0
critical_P 0 3.0 5.5 3.388333333333333 5.612291666666667 0
setFalse_P 0 3.0 7.0 3.1904166666666662 7.028958333333333 0
wantP_FALSE 1 4.5 7.0 4.049791666666667 7.195625 0
wantP_TRUE 0 4.5 6.0 4.820625 5.862291666666667 0
wantQ_FALSE 1 6.333333333333333 2.6666666666666665 6.127916666666667 2.9456249999999997 0
wantQ_TRUE 0 7.5 2.6666666666666665 6.732083333333333 2.278958333333333 0
setFalse_Q 0 8.666666666666666 2.5 8.851875 2.6956249999999997 0
critical_Q 0 8.666666666666666 4.0 8.96125 4.195625 0
setTrue_Q 0 8.666666666666666 6.666666666666667 9.028958333333334 6.695625 0
await_Q 0 8.666666666666666 5.166666666666667 8.43 5.362291666666667 0
local_Q 1 8.666666666666666 7.833333333333333 9.034166666666666 7.445625 0
T0 1.0 0 0 1 0 3.0 2.0 2.9791666666666665 1.8072916666666667 3.0833333333333335 2.0677083333333335 0
1 1 0 0
1
1 3 0 0
0
T8 1.0 0 0 2 0 3.0 7.833333333333333 2.9791666666666665 7.640625 3.0833333333333335 7.901041666666667 0
1 5 1 0
3.0 7.583333333333333
1 7 0 0
2
1 1 2 0
1.0833333333333333 7.833333333333333
1.0833333333333333 1.3333333333333333
1 6 1 0
5.5 7.833333333333333
0
T3 1.0 0 0 1 0 3.0 6.166666666666667 2.9791666666666665 5.973958333333333 3.0833333333333335 6.234375 0
1 4 0 0
1
1 5 0 0
0
T1 1.0 0 0 2 0 3.0 5.0 2.9791666666666665 4.807291666666667 3.0833333333333335 5.067708333333333 0
1 2 0 0
1 8 1 0
5.166666666666667 4.166666666666667
2
1 8 1 0
5.25 4.25
1 4 0 0
0
T2 1.0 0 0 2 0 3.0 3.3333333333333335 2.9791666666666665 3.140625 3.0833333333333335 3.4010416666666665 0
1 3 0 0
-1 6 1 0
4.166666666666667 3.3333333333333335
2
-1 7 1 0
4.333333333333333 3.6666666666666665
1 2 0 0
0
T00 1.0 0 0 1 0 1.6666666666666667 1.0 1.6197916666666667 0.8072916666666666 1.75 1.0677083333333333 0
1 1 1 0
2.4166666666666665 0.9166666666666666
1
1 1 0 0
0
T4 1.0 0 0 1 1 9.5 8.333333333333334 9.479166666666666 8.140625 9.583333333333334 8.401041666666666 0
1 14 0 0
1
1 14 1 0
9.0 8.25
0
T5 1.0 0 0 2 0 8.666666666666666 1.5 8.645833333333334 1.3072916666666667 8.75 1.5677083333333333 0
1 10 0 0
1 9 0 0
2
1 14 2 0
10.333333333333334 1.5
10.333333333333334 7.833333333333333
1 8 1 0
6.333333333333333 1.5
0
T6 1.0 0 0 1 0 8.666666666666666 7.166666666666667 8.645833333333334 6.973958333333333 8.75 7.234375 0
1 14 0 0
1
1 12 0 0
0
T7 1.0 0 0 2 0 8.666666666666666 4.666666666666667 8.645833333333334 4.473958333333333 8.75 4.734375 0
1 13 0 0
1 6 0 0
2
1 6 1 0
6.583333333333333 6.0
1 11 0 0
0
T9 1.0 0 0 2 0 8.666666666666666 6.166666666666667 8.645833333333334 5.973958333333333 8.75 6.234375 0
1 12 0 0
-1 8 1 0
7.166666666666667 6.166666666666667
2
-1 9 1 0
6.75 6.75
1 13 0 0
0
T10 1.0 0 0 1 0 8.666666666666666 3.1666666666666665 8.619791666666666 2.9739583333333335 8.75 3.234375 0
1 11 0 0
1
1 10 0 0
0

View file

@ -0,0 +1,8 @@
6
5 1 1 1 2 1 3 1 4 1 5
4 -1 2 -1 4 -1 5 1 7
4 1 2 1 4 1 5 1 6
5 1 10 1 11 1 12 1 13 1 14
4 1 9 -1 10 -1 11 -1 13
4 1 8 1 10 1 11 1 13
0

View file

@ -0,0 +1,10 @@
8
5 1 10 1 11 1 12 1 13 1 14
3 1 9 1 12 1 14
4 1 8 1 10 1 11 1 13
2 1 8 1 9
5 1 1 1 2 1 3 1 4 1 5
3 1 1 1 3 1 7
4 1 2 1 4 1 5 1 6
2 1 6 1 7
0

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

View file

@ -0,0 +1,49 @@
MODULE main
VAR
wantP: boolean;
wantQ: boolean;
p: proc(wantP, wantQ);
q: proc(wantQ, wantP);
ASSIGN
init(wantP) := FALSE;
init(wantQ) := FALSE;
next(wantP) := case
p.state = setTrue: TRUE;
p.state = setFalse: FALSE;
TRUE: wantP;
esac;
next(wantQ) := case
q.state = setTrue: TRUE;
q.state = setFalse: FALSE;
TRUE: wantQ;
esac;
CTLSPEC -- no mutual exclusion
AG (p.state != critical | q.state != critical)
CTLSPEC -- no deadlock
AG ((p.state = await | q.state = await) -> AF (p.state = critical | q.state = critical))
CTLSPEC -- no individual starvation
AG (p.state = await -> AF p.state = critical)
CTLSPEC
AG (q.state = await -> AF q.state = critical)
CTLSPEC -- prova: path senza starvation
AG (q.state = await -> EF q.state = critical)
MODULE proc(mine, other)
VAR
state: {local, await, critical, setTrue, setFalse};
ASSIGN
init(state) := local;
next(state) := case
state = local: {local, setTrue};
state = await & other = FALSE: critical;
state = await: await;
state = setTrue: await;
state = critical: setFalse;
state = setFalse: local;
esac;

View file

@ -0,0 +1,16 @@
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1

View file

@ -0,0 +1,2 @@
% MEASURE0
AG (#setTrue_Q==1 -> AF (#critical_Q == 1))

View file

@ -0,0 +1,3 @@
|256
%
|

View file

@ -0,0 +1,2 @@
0
0

View file

@ -0,0 +1,166 @@
|0|
|
f 0 16 0 16 0 0 0
local_P 1 3.3333333333333335 1.6666666666666667 3.6279166666666662 1.6122916666666667 0
setTrue_P 0 3.3333333333333335 3.0 3.5341666666666662 2.9456249999999997 0
critical_P 0 3.3333333333333335 6.5 3.7216666666666662 6.612291666666667 0
setFalse_P 0 3.3333333333333335 7.666666666666667 3.5237499999999997 7.695625 0
wantP_FALSE 1 7.833333333333333 7.666666666666667 7.383125 7.862291666666667 0
wantP_TRUE 0 4.666666666666667 7.5 5.070625 7.445625 0
While 0 3.3333333333333335 4.5 3.169583333333333 4.695625 0
P0 0 4.0 5.333333333333333 3.9560416666666662 5.528958333333333 0
wantQ_FALSE 1 7.5 2.8333333333333335 7.044583333333333 3.028958333333333 0
wantQ_TRUE 0 7.833333333333333 4.833333333333333 7.39875 5.028958333333333 0
local_Q 1 10.833333333333334 1.5 11.1175 1.445625 0
setTrue_Q 0 10.833333333333334 2.8333333333333335 11.278958333333334 2.778958333333333 0
critical_Q 0 10.833333333333334 6.333333333333333 11.21125 6.445625 0
setFalse_Q 0 10.833333333333334 7.5 11.018541666666666 7.528958333333333 0
While_ 0 10.833333333333334 4.333333333333333 10.888333333333334 4.612291666666667 0
P1 0 8.833333333333334 6.333333333333333 8.789375 6.528958333333333 0
T0 1.0 0 0 1 0 3.3333333333333335 2.3333333333333335 3.3125 2.140625 3.4166666666666665 2.4010416666666665 0
1 1 0 0
1
1 2 0 0
0
reset_transition 1.0 0 0 2 0 3.3333333333333335 8.166666666666666 2.8802083333333335 8.557291666666666 3.4166666666666665 8.234375 0
1 4 1 0
3.3333333333333335 7.916666666666667
1 6 0 0
2
-1 1 2 0
0.75 8.166666666666666
0.75 1.6666666666666667
1 5 1 0
5.833333333333333 8.166666666666666
0
T3 1.0 0 0 1 0 3.3333333333333335 7.0 3.3125 6.807291666666667 3.4166666666666665 7.067708333333333 0
1 3 0 0
1
1 4 0 0
0
T2 1.0 0 0 2 0 3.3333333333333335 3.8333333333333335 3.3125 3.640625 3.4166666666666665 3.9010416666666665 0
1 2 0 0
-1 5 1 0
4.5 3.6666666666666665
2
-1 6 1 0
2.3333333333333335 4.0
1 7 0 0
0
T00 1.0 0 0 1 0 2.0 1.3333333333333333 1.953125 1.140625 2.0833333333333335 1.4010416666666667 0
1 1 1 0
2.75 1.25
1
1 1 0 0
0
T1 1.0 0 0 2 2 1.0 5.166666666666667 0.9791666666666666 4.973958333333333 1.0833333333333333 5.234375 0
1 7 0 0
-1 9 1 0
2.5 2.9166666666666665
2
1 3 2 0
1.5 6.333333333333333
1.9166666666666667 6.583333333333333
-1 9 1 0
0.5833333333333334 5.583333333333333
0
T4 1.0 0 0 3 3 5.0 5.0 4.979166666666667 4.807291666666667 5.083333333333333 5.067708333333333 0
1 7 0 0
-1 6 1 0
8.416666666666666 3.5833333333333335
-1 10 2 0
4.416666666666667 3.5833333333333335
5.916666666666667 3.25
3
1 8 0 0
-1 5 2 0
6.416666666666667 5.666666666666667
8.333333333333334 7.416666666666667
-1 10 2 0
3.25 6.583333333333333
4.666666666666667 6.333333333333333
0
T5 1.0 0 0 2 1 3.3333333333333335 5.666666666666667 3.3125 5.473958333333333 3.4166666666666665 5.734375 0
1 8 0 0
-1 5 1 0
4.083333333333333 6.25
2
1 7 0 0
-1 6 3 0
0.5 6.083333333333333
0.3333333333333333 9.25
7.75 9.083333333333334
0
T15 1.0 0 0 1 0 10.833333333333334 2.1666666666666665 10.786458333333334 1.9739583333333333 10.916666666666666 2.234375 0
1 11 0 0
1
1 12 0 0
0
reset_Transition 1.0 0 0 1 0 10.833333333333334 8.0 10.359375 8.390625 10.916666666666666 8.067708333333334 0
1 14 1 0
10.833333333333334 7.75
1
-1 11 2 0
7.5 8.0
7.5 1.5
0
T9 1.0 0 0 1 0 10.833333333333334 6.833333333333333 10.8125 6.640625 10.916666666666666 6.901041666666667 0
1 13 0 0
1
1 14 0 0
0
T12 1.0 0 0 2 0 10.833333333333334 3.6666666666666665 10.786458333333334 3.4739583333333335 10.916666666666666 3.734375 0
1 12 0 0
-1 9 0 0
2
1 15 0 0
-1 10 4 0
13.666666666666666 3.6666666666666665
14.0 8.333333333333334
9.75 8.583333333333334
9.583333333333334 8.5
0
T100 1.0 0 0 1 0 9.5 1.1666666666666667 9.427083333333334 0.9739583333333334 9.583333333333334 1.234375 0
1 11 1 0
10.25 1.0833333333333333
1
1 11 0 0
0
T11 1.0 0 0 2 1 10.833333333333334 5.5 10.786458333333334 5.307291666666667 10.916666666666666 5.567708333333333 0
1 16 1 0
10.833333333333334 5.916666666666667
-1 9 2 0
10.2587890625 5.50703125
10.083333333333334 6.25
2
1 15 0 0
-1 10 2 0
12.416666666666666 5.916666666666667
9.25 6.833333333333333
0
T6 1.0 0 0 3 2 9.333333333333334 5.0 7.979166666666667 1.390625 9.416666666666666 5.067708333333333 0
1 15 0 0
-1 6 1 0
9.25 4.083333333333333
1 10 0 0
3
1 16 0 0
-1 6 2 0
10.0 5.0
10.0 7.333333333333333
1 9 0 0
0
T7 1.0 0 0 2 1 13.166666666666666 5.166666666666667 13.145833333333334 4.973958333333333 13.25 5.234375 0
1 15 0 0
-1 5 2 0
13.166666666666666 3.25
6.333333333333333 4.0
2
1 13 1 0
13.166666666666666 6.333333333333333
-1 5 4 0
13.5 5.166666666666667
13.416666666666666 9.0
11.0 9.166666666666666
7.25 9.083333333333334
0

View file

@ -0,0 +1,7 @@
5
2 1 9 1 10
6 1 11 1 12 1 13 1 14 1 15 1 16
4 -1 3 -1 4 1 6 -1 7
4 1 3 1 4 1 5 1 7
6 1 1 1 2 1 3 1 4 1 7 1 8
0

View file

@ -0,0 +1,8 @@
6
6 1 1 1 2 1 3 1 4 1 7 1 8
4 1 1 1 2 1 6 1 8
4 1 3 1 4 1 5 1 7
2 1 5 1 6
6 1 11 1 12 1 13 1 14 1 15 1 16
2 1 9 1 10
0

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View file

@ -0,0 +1,46 @@
MODULE main
VAR
wantP: boolean;
wantQ: boolean;
p: process proc(wantP, wantQ); -- PROCESS: http://nusmv.fbk.eu/NuSMV/userman/v21/nusmv_3.html#SEC27
q: process proc(wantQ, wantP);
ASSIGN
init(wantP) := FALSE;
init(wantQ) := FALSE;
CTLSPEC -- no mutual exclusion
AG (p.state != critical | q.state != critical)
CTLSPEC -- no deadlock
AG ((p.state = setTrue | q.state = setTrue) -> AF (p.state = critical | q.state = critical))
CTLSPEC -- no individual starvation
AG (p.state = setTrue -> AF p.state = critical)
CTLSPEC
AG (q.state = setTrue -> AF q.state = critical)
MODULE proc(mine, other)
VAR
state: {local, critical, setTrue, setFalse, resetTrue, resetFalse};
ASSIGN
init(state) := local;
next(state) := case
state = local: {local, setTrue};
state = setTrue & other = TRUE: resetFalse;
state = setTrue & other = FALSE: critical;
state = resetFalse: resetTrue;
state = resetTrue & other = TRUE: resetFalse;
state = resetTrue & other = FALSE: critical;
state = critical: setFalse;
state = setFalse: local;
esac;
next(mine) := case
state = setTrue: TRUE;
state = setFalse: FALSE;
state = resetTrue: TRUE;
state = resetFalse: FALSE;
TRUE: mine;
esac;
FAIRNESS
running

View file

@ -15,7 +15,6 @@
# ** GreatSPN # ** GreatSPN
# ** TODO CCS # ** TODO CCS
# ** Risultati # ** Risultati
Nella tabella mostriamo i risultati ottenuti Nella tabella mostriamo i risultati ottenuti
| | NuSMV | GreatSPN | | | NuSMV | GreatSPN |
|---------------------+-------+----------| |---------------------+-------+----------|
@ -32,7 +31,8 @@ Nella tabella mostriamo i risultati ottenuti
- [ ] Controlla in 3.6 Starvation: nusmv no, greatspn si` - [ ] Controlla in 3.6 Starvation: nusmv no, greatspn si`
- [ ] 3.6, dealock: correttezza spiegazione della differenza greatspn nusmv? - [ ] 3.6, dealock: correttezza spiegazione della differenza greatspn nusmv?
- [ ] 3.6, starvation: perche` nusmv con processi non ha starvation? - [ ] 3.6, starvation: perche` nusmv con processi non ha starvation?
- [ ] 3.6, perche` Amparore ha detto che deadlock: AG(EF(#critical_P == 1)) ?? - [ ] 3.6, Amparore ha detto che deadlock: AG(EF(#critical_P == 1)) ??
- [ ] 3.6, inserisci controesempi dove necessario
NOTA: nel caso di Ampararore, la formula: NOTA: nel caso di Ampararore, la formula:
| da qualsiasi stato e` sempre possibile arrivare a critical_P == 1 | da qualsiasi stato e` sempre possibile arrivare a critical_P == 1
@ -231,6 +231,7 @@ AG(!(#critical_P == 1) || !(#critical_Q == 1))
AG ((#await_P==1 || \#await_Q == 1) -> AF (#critical_P == 1 || \#critical_Q == 1)) AG ((#await_P==1 || \#await_Q == 1) -> AF (#critical_P == 1 || \#critical_Q == 1))
AG (#await_P==1 -> AF (#critical_P == 1)) AG (#await_P==1 -> AF (#critical_P == 1))
#+END_SRC #+END_SRC
[[./3.6.jpg]]
** TODO CCS ** TODO CCS
** TODO Risultati ** TODO Risultati
@ -256,3 +257,364 @@ seguente formula CTL
| AG (wₚ → EF (cₚ || c_{q})) | AG (wₚ → EF (cₚ || c_{q}))
| AG(#await_P == 1 -> EF(#critical_Q==1 || \#critical_P == 1)) | AG(#await_P == 1 -> EF(#critical_Q==1 || \#critical_P == 1))
che risulta rispettata. che risulta rispettata.
* Algoritmo 3.8
Due processi iterano all'infinito seguendo questo pseudocodice
#+BEGIN_SRC
while true:
non-critical section
wantP <- true
await wantQ = false
critical section
wantP <- false
#+END_SRC
** NuSMV
Si e` deciso di modellare l'algoritmo allo stesso modo del precedente.
#+include 3.8.b.smv
** GreatSPN
Il codice utilizzato per le proprieta` CTL e` il seguente:
#+BEGIN_SRC
AG(!(#critical_P == 1) || !(#critical_Q == 1))
AG ((#await_P==1 || \#await_Q == 1) -> AF (#critical_P == 1 || \#critical_Q == 1))
AG (#await_P==1 -> AF (#critical_P == 1))
AG (#await_Q==1 -> AF (#critical_Q == 1))
#+END_SRC
Inoltre, per confermare alcune ipotesi, si e` testata anche la
seguente formula CTL:
| AG(#await_P == 1 -> EF(#critical_Q==1 || \#critical_P == 1))
che conferma la presenza di deadlock causata dalle due variabili booleane.
[[./3.8.jpg]]
** TODO CCS
** Risultati
Nella tabella mostriamo i risultati ottenuti
| | NuSMV | GreatSPN |
|---------------------+-------+----------|
| Mutua Esclusione | True | True |
| Assenza di deadlock | False | False |
| No Starvation | False | False |
Questo algoritmo rispetto al precedente garantisce la mutua
esclusione, ma non ci permette di evitare il deadlock (e di
conseguenza neanche la starvation individuale).
Di seguito riportiamo la traccia di NuSMV che mostra che il deadlock
avviene quando i progetti eseguono /setTrue/ nello stesso momento.
#+BEGIN_SRC
-- specification AG ((p.state = await | q.state = await) -> AF (p.state = critical | q.state = critical)) is false
-- as demonstrated by the following execution sequence
Trace Description: CTL Counterexample
Trace Type: Counterexample
-> State: 1.1 <-
wantP = FALSE
wantQ = FALSE
p.state = local
q.state = local
-> State: 1.2 <-
p.state = setTrue
q.state = setTrue
-- Loop starts here
-> State: 1.3 <-
wantP = TRUE
wantQ = TRUE
p.state = await
q.state = await
-> State: 1.4 <-
#+END_SRC
Mostriamo invece il controesempio generato da GreatSPN che ci mostra
una condizione di starvation individuale, dove, come in precedenza, il
processo Q rimane in /local_Q/.
#+BEGIN_SRC
Generated counter-example:
==================================== Trace ====================================
Initial state is: local_P(1), wantP_FALSE(1), wantQ_FALSE(1), local_Q(1)
Initial state satisfies: E F (not ((not (await_P = 1)) or (not E G (not (critical_P = 1))))).
1: local_P(1), wantP_FALSE(1), wantQ_FALSE(1), local_Q(1)
State 1. satisfies: ((not (await_P = 1)) or (not E G (not (critical_P = 1)))).
1.1: local_P(1), wantP_FALSE(1), wantQ_FALSE(1), local_Q(1)
State 1.1. does not satisfy: (await_P = 1).
2: SetTrue_P(1), wantP_FALSE(1), wantQ_FALSE(1), local_Q(1)
State 2. satisfies: ((not (await_P = 1)) or (not E G (not (critical_P = 1)))).
2.1: SetTrue_P(1), wantP_FALSE(1), wantQ_FALSE(1), local_Q(1)
State 2.1. does not satisfy: (await_P = 1).
3: wantP_TRUE(1), await_P(1), wantQ_FALSE(1), local_Q(1)
State 3. does not satisfy: ((not (await_P = 1)) or (not E G (not (critical_P = 1)))).
3.1: wantP_TRUE(1), await_P(1), wantQ_FALSE(1), local_Q(1)
State 3.1.L. satisfies: (await_P = 1).
State 3.1.R. satisfies: E G (not (critical_P = 1)). Start of loop.
3.1.R.1: wantP_TRUE(1), await_P(1), wantQ_FALSE(1), local_Q(1)
State 3.1.R.1. does not satisfy: (critical_P = 1).
3.1.R.2: loop back to state 3.1.R.1.
#+END_SRC
* Algoritmo 3.9
Due processi iterano all'infinito seguendo questo pseudocodice
#+BEGIN_SRC
while true:
non-critical section
wantP <- true
while wantQ
wantP <- false
wantP <- true
critical section
wantP <- false
#+END_SRC
(l'altro processo segue uno pseudocodice simmetrico)
** NuSMV
Si e` deciso di modellare l'algoritmo usando per ognuno dei due
processi utilizzando l'espressione /process/ per simulare di NuSMV e
per ciascun process una variabile /state/ di tipo enumerazione
| state: {local, critical, setTrue, setFalse, resetTrue, resetFalse};
Benche` non fosse necessario distinguere il set della variabile
booleana /wantP/, si e` preferito farlo in quanto l'enumerazione di
tutti gli stati possibili, come evidenziato dal codice che segue, non
risulta complesso.
#+include 3.9.smv
** GreatSPN
Il codice utilizzato per le proprieta` CTL e` il seguente:
#+BEGIN_SRC
AG(!(#critical_P == 1) || !(#critical_Q == 1))
AG ((#setTrue_P==1 || \#setTrue_Q == 1) -> AF (#critical_P == 1 || \#critical_Q == 1))
AG (#setTrue_P==1 -> AF (#critical_P == 1))
AG (#setTrue_Q==1 -> AF (#critical_Q == 1))
#+END_SRC
Inoltre, per confermare alcune ipotesi, si e` testata anche la
seguente formula CTL:
| AG(#setTrue_P == 1 -> EF(#critical_Q==1 || \#critical_P == 1))
che conferma la presenza di deadlock causata dalle due variabili
booleane.
[[./3.9.jpg]]
** TODO CCS
** Risultati
Nella tabella mostriamo i risultati ottenuti
| | NuSMV | GreatSPN |
|---------------------+-------+----------|
| Mutua Esclusione | true | true |
| Assenza di deadlock | false | false |
| No Starvation | false | false |
Il deadlock si verifica quando i entrambe le variabili booleane sono
uguali a /true/.
Ad esempio, se si esegue in locksetop il loop con la
condizione booleana sulla variabile dell'altro processo, si verifica
la condizione di deadlock.
Viene riportato il trace di NuSMV che conferma questa ipotesi.
GreatSPN fallisce per mancanza di RAM sulla macchina usata ma e`
facile riprodurre il deadlock manualmente.
#+BEGIN_SRC
-- specification AG ((p.state = setTrue | q.state = setTrue) -> AF (p.state = critical | q.state = critical)) is false
-- as demonstrated by the following execution sequence
Trace Description: CTL Counterexample
Trace Type: Counterexample
-> State: 1.1 <-
wantP = FALSE
wantQ = FALSE
p.state = local
q.state = local
-> Input: 1.2 <-
_process_selector_ = p
running = FALSE
q.running = FALSE
p.running = TRUE
-> State: 1.2 <-
p.state = setTrue
-> Input: 1.3 <-
-> State: 1.3 <-
wantP = TRUE
p.state = critical
-> Input: 1.4 <-
-> State: 1.4 <-
p.state = setFalse
-> Input: 1.5 <-
_process_selector_ = q
q.running = TRUE
p.running = FALSE
-> State: 1.5 <-
q.state = setTrue
-> Input: 1.6 <-
-> State: 1.6 <-
wantQ = TRUE
q.state = resetFalse
-> Input: 1.7 <-
_process_selector_ = p
q.running = FALSE
p.running = TRUE
-> State: 1.7 <-
wantP = FALSE
p.state = local
-> Input: 1.8 <-
-> State: 1.8 <-
p.state = setTrue
-> Input: 1.9 <-
-- Loop starts here
-> State: 1.9 <-
wantP = TRUE
p.state = resetFalse
-> Input: 1.10 <-
_process_selector_ = q
q.running = TRUE
p.running = FALSE
-> State: 1.10 <-
wantQ = FALSE
q.state = resetTrue
-> Input: 1.11 <-
-- Loop starts here
-> State: 1.11 <-
wantQ = TRUE
q.state = resetFalse
-> Input: 1.12 <-
_process_selector_ = p
q.running = FALSE
p.running = TRUE
-> State: 1.12 <-
wantP = FALSE
p.state = resetTrue
-> Input: 1.13 <-
-- Loop starts here
-> State: 1.13 <-
wantP = TRUE
p.state = resetFalse
-> Input: 1.14 <-
_process_selector_ = q
q.running = TRUE
p.running = FALSE
-> State: 1.14 <-
wantQ = FALSE
q.state = resetTrue
-> Input: 1.15 <-
-- Loop starts here
-> State: 1.15 <-
wantQ = TRUE
q.state = resetFalse
-> Input: 1.16 <-
_process_selector_ = p
q.running = FALSE
p.running = TRUE
-> State: 1.16 <-
wantP = FALSE
p.state = resetTrue
-> Input: 1.17 <-
-> State: 1.17 <-
wantP = TRUE
p.state = resetFalse
#+END_SRC
Di seguito il trace che conferma la presenza di starvation
individuale, sia in GreatSPN che NuSMV.
#+BEGIN_SRC
Generated counter-example:
==================================== Trace ====================================
Initial state is: local_Q(1), wantQ_FALSE(1), wantP_FALSE(1), local_P(1)
Initial state satisfies: E F (not ((not (setTrue_Q = 1)) or (not E G (not (critical_Q = 1))))).
1: local_Q(1), wantQ_FALSE(1), wantP_FALSE(1), local_P(1)
State 1. satisfies: ((not (setTrue_Q = 1)) or (not E G (not (critical_Q = 1)))).
1.1: local_Q(1), wantQ_FALSE(1), wantP_FALSE(1), local_P(1)
State 1.1. does not satisfy: (setTrue_Q = 1).
2: setTrue_Q(1), wantQ_FALSE(1), wantP_FALSE(1), local_P(1)
State 2. does not satisfy: ((not (setTrue_Q = 1)) or (not E G (not (critical_Q = 1)))).
2.1: setTrue_Q(1), wantQ_FALSE(1), wantP_FALSE(1), local_P(1)
State 2.1.L. satisfies: (setTrue_Q = 1).
State 2.1.R. satisfies: E G (not (critical_Q = 1)). Start of loop.
2.1.R.1: setTrue_Q(1), wantQ_FALSE(1), wantP_FALSE(1), local_P(1)
State 2.1.R.1. does not satisfy: (critical_Q = 1).
2.1.R.2: loop back to state 2.1.R.1.
#+END_SRC
#+BEGIN_SRC
-- specification AG (q.state = setTrue -> AF q.state = critical) is false
-- as demonstrated by the following execution sequence
Trace Description: CTL Counterexample
Trace Type: Counterexample
-> State: 3.1 <-
wantP = FALSE
wantQ = FALSE
p.state = local
q.state = local
-> Input: 3.2 <-
_process_selector_ = q
running = FALSE
q.running = TRUE
p.running = FALSE
-> State: 3.2 <-
q.state = setTrue
-> Input: 3.3 <-
_process_selector_ = p
q.running = FALSE
p.running = TRUE
-> State: 3.3 <-
p.state = setTrue
-> Input: 3.4 <-
-> State: 3.4 <-
wantP = TRUE
p.state = critical
-> Input: 3.5 <-
_process_selector_ = q
q.running = TRUE
p.running = FALSE
-> State: 3.5 <-
wantQ = TRUE
q.state = resetFalse
-> Input: 3.6 <-
_process_selector_ = p
q.running = FALSE
p.running = TRUE
-- Loop starts here
-> State: 3.6 <-
p.state = setFalse
-> Input: 3.7 <-
_process_selector_ = main
running = TRUE
p.running = FALSE
-- Loop starts here
-> State: 3.7 <-
-> Input: 3.8 <-
_process_selector_ = q
running = FALSE
q.running = TRUE
-> State: 3.8 <-
wantQ = FALSE
q.state = resetTrue
-> Input: 3.9 <-
_process_selector_ = p
q.running = FALSE
p.running = TRUE
-> State: 3.9 <-
wantP = FALSE
p.state = local
-> Input: 3.10 <-
-> State: 3.10 <-
p.state = setTrue
-> Input: 3.11 <-
-> State: 3.11 <-
wantP = TRUE
p.state = critical
-> Input: 3.12 <-
_process_selector_ = q
q.running = TRUE
p.running = FALSE
-> State: 3.12 <-
wantQ = TRUE
q.state = resetFalse
-> Input: 3.13 <-
_process_selector_ = p
q.running = FALSE
p.running = TRUE
-> State: 3.13 <-
p.state = setFalse
#+END_SRC