2020-05-07 17:47:52 +02:00
|
|
|
|
# SCHELETRO:
|
|
|
|
|
|
|
|
|
|
# * Algoritmo 3.5
|
|
|
|
|
# Due processi iterano all'infinito seguendo questo pseudocodice
|
|
|
|
|
|
|
|
|
|
# #+BEGIN_SRC
|
|
|
|
|
# #+END_SRC
|
|
|
|
|
|
|
|
|
|
# ** NuSMV
|
|
|
|
|
# Si e` deciso di modellare l'algoritmo usando per ognuno dei due
|
|
|
|
|
# processi ...
|
|
|
|
|
# | CODE
|
|
|
|
|
# #+include 3.2.b.smv
|
|
|
|
|
|
|
|
|
|
# ** GreatSPN
|
|
|
|
|
# ** TODO CCS
|
|
|
|
|
# ** Risultati
|
|
|
|
|
|
|
|
|
|
Nella tabella mostriamo i risultati ottenuti
|
|
|
|
|
| | NuSMV | GreatSPN |
|
|
|
|
|
|---------------------+-------+----------|
|
|
|
|
|
| Mutua Esclusione | | |
|
|
|
|
|
| Assenza di deadlock | | |
|
|
|
|
|
| No Starvation | | |
|
|
|
|
|
* TODO [1/7]
|
2020-05-06 17:10:03 +02:00
|
|
|
|
- [X] Cosa significa FAIRNESS running alla fine dei .smv
|
|
|
|
|
- [ ] Riformula liveness
|
|
|
|
|
- [ ] chiedi a lei di safety, liveness, fairness
|
2020-05-07 17:47:52 +02:00
|
|
|
|
- [ ] Vedi necessita` di Sync e /
|
|
|
|
|
- [ ] Finisci tutto con algebra dei processi
|
|
|
|
|
- [ ] Reachability graph vs Derivation Graph
|
2020-05-06 17:10:03 +02:00
|
|
|
|
|
|
|
|
|
* TODO Proprieta` del modello
|
2020-05-05 22:00:56 +02:00
|
|
|
|
|
|
|
|
|
Ogni modello successivamente mostrato rispetta le seguenti proprieta`:
|
2020-05-06 17:10:03 +02:00
|
|
|
|
Siano /p/ e /q/ due generici processi,
|
2020-05-05 22:00:56 +02:00
|
|
|
|
1. Mutua esclusione (safety): garantisce che al piu` un solo processo e` nella
|
|
|
|
|
sezione critica ad ogni istante
|
|
|
|
|
| G (¬cₚ∨¬c_{q})
|
|
|
|
|
2. Assenza di deadlock (liveness): ogni qualvolta un processo e` in
|
|
|
|
|
attesa di entrare nella sezione critica, eventualmente verra`
|
|
|
|
|
concesso ad un processo di entrare nella sezione critica
|
|
|
|
|
| G(wₚ → F(cₚ∨c_{q})
|
|
|
|
|
3. Assenza di starvation individuale (strong fairness): ogni qualvolta un processo e` in
|
|
|
|
|
attesa di entrare nella sezione critica, eventualmente gli verra` concesso
|
2020-05-06 17:10:03 +02:00
|
|
|
|
| G(wₚ → Fcₚ)
|
2020-05-05 22:00:56 +02:00
|
|
|
|
Possiamo convertire queste tre formule LTL in formule equivalenti CTL
|
|
|
|
|
anteponendo l'operatore di stato A:
|
|
|
|
|
| AG (¬cₚ∨¬c_{q})
|
|
|
|
|
| AG(wₚ → AF(cₚ∨c_{q})
|
2020-05-06 17:10:03 +02:00
|
|
|
|
| AG(wₚ → AFcₚ)
|
2020-05-05 22:00:56 +02:00
|
|
|
|
Benche` non tutte le formule LTL possono essere convertite in una
|
|
|
|
|
formula CTL equivalente anteponendo ad ogni operatore temporale
|
2020-05-06 17:10:03 +02:00
|
|
|
|
l'operatore di stato A, per queste tre proprieta` possiamo.
|
2020-05-05 22:00:56 +02:00
|
|
|
|
|
2020-05-06 17:10:03 +02:00
|
|
|
|
* Algoritmo 3.2
|
|
|
|
|
Due processi iterano all'infinito seguendo questo pseudocodice
|
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC
|
|
|
|
|
while true:
|
|
|
|
|
non-critical section
|
|
|
|
|
await turn = ID
|
|
|
|
|
critical section
|
|
|
|
|
turn <- (ID%2)+1
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** NuSMV
|
|
|
|
|
Si e` deciso di modellare l'algoritmo usando per ognuno dei due
|
|
|
|
|
processi un'enumerazione di 4 stati ed una variabile turno di tipo intero.
|
|
|
|
|
| state: {begin, wait, critical, done};
|
|
|
|
|
#+include 3.2.b.smv
|
2020-05-07 17:47:52 +02:00
|
|
|
|
** GreatSPN
|
|
|
|
|
Il codice utilizzato per le proprieta` CTL e` il seguente:
|
|
|
|
|
#+BEGIN_SRC
|
|
|
|
|
AG(!(#Critical_P == 1) || !(#Critical_Q == 1)) = true
|
|
|
|
|
AG ((#Wait_P==1 || \#Critical_Q == 1) -> AF (#Critical_P == 1 || \#Critical_Q == 1)) = false
|
|
|
|
|
AG (#Wait_P==1 -> AF (#Critical_P == 1)) = false
|
|
|
|
|
#+END_SRC
|
|
|
|
|
[[./3.2.jpg]]
|
|
|
|
|
** TODO CCS
|
|
|
|
|
** Risultati
|
2020-05-06 17:10:03 +02:00
|
|
|
|
Nella tabella mostriamo i risultati ottenuti
|
|
|
|
|
| | NuSMV | GreatSPN |
|
|
|
|
|
|---------------------+-------+----------|
|
2020-05-07 17:47:52 +02:00
|
|
|
|
| Mutua Esclusione | True | True |
|
|
|
|
|
| Assenza di deadlock | False | False |
|
|
|
|
|
| No Starvation | False | False |
|
2020-05-06 17:10:03 +02:00
|
|
|
|
Il risultato della possibilita` di deadlock non deve
|
|
|
|
|
stupire: la specifica non obbliga un processo a terminare la fase
|
|
|
|
|
begin.
|
|
|
|
|
Ne segue che anche l'assenza di starvation individuale non e`
|
|
|
|
|
garantita.
|
|
|
|
|
NuSMV conferma quanto detto mostrandoci un trace che fa da
|
|
|
|
|
controesempio alla formula CTL:
|
|
|
|
|
#+BEGIN_SRC
|
|
|
|
|
-- specification AG ((p.state = wait | q.state = wait) -> 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 <-
|
|
|
|
|
turn = 1
|
|
|
|
|
p.state = begin
|
|
|
|
|
q.state = begin
|
|
|
|
|
-- Loop starts here
|
|
|
|
|
-> State: 1.2 <-
|
|
|
|
|
q.state = wait
|
|
|
|
|
-> State: 1.3 <-
|
|
|
|
|
#+END_SRC
|
|
|
|
|
Si vede che il processo q rimane nella fase begin e p, dopo essere
|
|
|
|
|
entrato nella regione critica una volta, rimane bloccato in begin.
|
|
|
|
|
Lo stesso trace mostra la possibilita` di starvation del processo.
|
2020-05-07 17:47:52 +02:00
|
|
|
|
La rete modellata con GreatSPN ci conferma quanto visto con NuSMV.
|
|
|
|
|
|
|
|
|
|
Prendiamo in considerazione la seguente formula CTL
|
|
|
|
|
| AG (wₚ -> EF cₚ)
|
|
|
|
|
Sia GreatSPN che NuSMV ci mostrano che il sistema modellato rispetta
|
|
|
|
|
questa proprieta`. Questo significa che un processo in attesa di
|
|
|
|
|
entrare nella sezione critica ha la possibilita` di compiere
|
|
|
|
|
progresso, ma solo nel caso in cui, come si intuisce dal controesempio
|
|
|
|
|
precedente, l'altro processo decida di entrare in attesa a sua volta.
|
|
|
|
|
|
|
|
|
|
* Algoritmo 3.5
|
|
|
|
|
Due processi iterano all'infinito seguendo questo pseudocodice
|
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC
|
|
|
|
|
while true:
|
|
|
|
|
await turn = ID
|
|
|
|
|
turn <- (ID%2)+1
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** NuSMV
|
|
|
|
|
Si e` deciso di modellare l'algoritmo usando per ognuno dei due
|
|
|
|
|
processi un'enumerazione di due stati e un contatore di turni intero
|
|
|
|
|
| state: {await, done};
|
|
|
|
|
#+include 3.5.b.smv
|
|
|
|
|
|
|
|
|
|
** GreatSPN
|
|
|
|
|
Il codice utilizzato per le proprieta` CTL e` il seguente:
|
|
|
|
|
#+BEGIN_SRC
|
|
|
|
|
AG(!(#Await_P == 1) || !(#Await_Q == 1)) = true
|
|
|
|
|
AG ((#Wait_P==1 || \#AWait_Q == 1) -> AF (#Done_P == 1 || \#Done_Q == 1)) = false
|
|
|
|
|
AG (#Await_P==1 -> AF (#Done_P == 1)) = false
|
|
|
|
|
#+END_SRC
|
|
|
|
|
[[./3.5.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 |
|
|
|
|
|
I risultati confermano il fatto che questo algoritmo e` solamente una
|
|
|
|
|
versione semplificata del precedente (/begin/ e /wait/ sono stati fusi
|
|
|
|
|
in await e /done/ rimosso) e pertanto il trace di controesempio
|
|
|
|
|
fornito da NuSMV e da GreatSPN presentano riflettono i risultati di
|
|
|
|
|
questa semplificazione.
|
|
|
|
|
- Possibilita` di deadlock:
|
|
|
|
|
#+BEGIN_SRC
|
|
|
|
|
– specification AG ((p.state = await | q.state = await) -> AF (p.state = done | q.state = done)) is false
|
|
|
|
|
– as demonstrated by the following execution sequence
|
|
|
|
|
Trace Description: CTL Counterexample
|
|
|
|
|
Trace Type: Counterexample
|
|
|
|
|
– Loop starts here
|
|
|
|
|
-> State: 1.1 <-
|
|
|
|
|
turn = 1
|
|
|
|
|
p.state = await
|
|
|
|
|
q.state = await
|
|
|
|
|
-> State: 1.2 <-
|
|
|
|
|
#+END_SRC
|
|
|
|
|
- Possibilita` di starvation: i processi non compiono progresso
|
|
|
|
|
iterando infinite volte su /await/.
|
|
|
|
|
#+BEGIN_SRC
|
|
|
|
|
– specification AG (p.state = await -> AF p.state = done) is false
|
|
|
|
|
– as demonstrated by the following execution sequence
|
|
|
|
|
Trace Description: CTL Counterexample
|
|
|
|
|
Trace Type: Counterexample
|
|
|
|
|
– Loop starts here
|
|
|
|
|
-> State: 2.1 <-
|
|
|
|
|
turn = 1
|
|
|
|
|
p.state = await
|
|
|
|
|
q.state = await
|
|
|
|
|
-> State: 2.2 <-
|
|
|
|
|
#+END_SRC
|
|
|
|
|
#+BEGIN_SRC
|
|
|
|
|
– specification AG (q.state = await -> AF q.state = done) is false
|
|
|
|
|
– as demonstrated by the following execution sequence
|
|
|
|
|
Trace Description: CTL Counterexample
|
|
|
|
|
Trace Type: Counterexample
|
|
|
|
|
– Loop starts here
|
|
|
|
|
-> State: 3.1 <-
|
|
|
|
|
turn = 1
|
|
|
|
|
p.state = await
|
|
|
|
|
q.state = await
|
|
|
|
|
-> State: 3.2 <-
|
|
|
|
|
– specification AG (q.state = await -> EF q.state = done) is true
|
|
|
|
|
#+END_SRC
|
|
|
|
|
- Possibilita` di compiere progresso:
|
|
|
|
|
#+BEGIN_SRC
|
|
|
|
|
specification AG (q.state = await -> EF q.state = done) is true
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
* Algoritmo 3.6
|
|
|
|
|
Due processi iterano all'infinito seguendo questo pseudocodice
|
|
|
|
|
#+BEGIN_SRC
|
|
|
|
|
while true:
|
|
|
|
|
non-critical section
|
|
|
|
|
await wantQ = false
|
|
|
|
|
wantP <- true
|
|
|
|
|
critical section
|
|
|
|
|
wantP <- false
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** NuSMV
|
|
|
|
|
Si e` deciso di modellare l'algoritmo usando per ognuno dei due
|
|
|
|
|
processi ...
|
|
|
|
|
| CODE
|
|
|
|
|
#+include 3.6.smv
|
|
|
|
|
|
|
|
|
|
** GreatSPN
|
|
|
|
|
** TODO CCS
|
|
|
|
|
** Risultati
|