UniTO/anno3/vpc/consegne/3/analisi.org
Francesco Mecca 081133b389 es 3.6
2020-05-08 12:32:56 +02:00

254 lines
8.7 KiB
Org Mode
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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]
- [X] Cosa significa FAIRNESS running alla fine dei .smv
- [ ] Riformula liveness
- [ ] chiedi a lei di safety, liveness, fairness
- [ ] Vedi necessita` di Sync e /
- [ ] Finisci tutto con algebra dei processi
- [ ] Reachability graph vs Derivation Graph
- [ ] Controlla in 3.6 Starvation: nusmv no, greatspn si`
- [ ] 3.6, dealock: correttezza spiegazione della differenza greatspn nusmv?
- [ ] 3.6, starvation: perche` nusmv con processi non ha starvation?
* TODO Proprieta` del modello
Ogni modello successivamente mostrato rispetta le seguenti proprieta`:
Siano /p/ e /q/ due generici processi,
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
| G(wₚ → Fcₚ)
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})
| AG(wₚ → AFcₚ)
Benche` non tutte le formule LTL possono essere convertite in una
formula CTL equivalente anteponendo ad ogni operatore temporale
l'operatore di stato A, per queste tre proprieta` possiamo.
* 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
** 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 || \#Wait_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
Nella tabella mostriamo i risultati ottenuti
| | NuSMV | GreatSPN |
|---------------------+-------+----------|
| Mutua Esclusione | True | True |
| Assenza di deadlock | False | False |
| No Starvation | False | False |
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.
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 usando 5 stati per ogni processo
| state: {local, await, critical, setTrue, setFalse};
#+include 3.6.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))
#+END_SRC
** TODO CCS
** TODO Risultati
Nella tabella mostriamo i risultati ottenuti
| | NuSMV | GreatSPN |
|---------------------+-------+----------|
| Mutua Esclusione | false | false |
| Assenza di deadlock | true | false |
| No Starvation | true | false |
L'incoerenza del risultato dell'assenza di deadlock e` spiegabile dal
fatto che nel caso di NuSMV non e` possibile che un processo rimanga
nel primo stato (/local/) per un tempo indefinito mentre nel caso di
GreatSPN e` possibile che il processo P vada nello spazio await e il
processo Q decida di rimanere nel loop /local_Q/ all'infinito.
Notiamo che se forziamo i processi a fare del progresso dallo stato
/local/, allora la formula CTL
| G(wₚ → F(cₚc_{q})
risulta rispettata.
Ancora meglio, piuttosto che rimuovere una transizione possibile,
possiamo restringere la verifica dell'assenza di deadlock alla
seguente formula CTL
| AG (wₚ → EF (cₚ || c_{q}))
| AG(#await_P == 1 -> EF(#critical_Q==1 || \#critical_P == 1))
che risulta rispettata.