FSP - dichiarazione di costanti e di intervalli in.1.1 L’uso di indici serve per modellare calcoli in.1.0 in.0.1 in.0.0 0 out.0 const N = 1 intervallo T = 0..N intervallo R = 0..2*N 1 2 3 out.1 out.2 SUM = (in[a:T][b:T]->TOTAL[a+b]), TOTAL[s:R] = (out[s]->SUM). Concurrency: concurrent execution 1 ©Magee/Kramer SOMMA CON RETI DI PETRI Leggo 0,0 Stampo 0 Leggo 0,1 Leggo 1,0 Stampo 1 Leggo 1,1 Stampo 2 Se l’ordine di lettura viene considerato nella definizione degli stati la coppia (1,0) è diversa dalla coppia (0,1): Leggo 0,0 Concurrency: concurrent execution Stampo 0 Leggo 0,1 Stampo 1 Leggo 1,0 Leggo 1,1 Stampo 1 Stampo 2 2 ©Magee/Kramer Capitolo 3 Processi concorrenti Concurrency: concurrent execution 3 ©Magee/Kramer Esecuzione concorrente Concetti: processi - esecuzione concorrente e alternanza (interleaving). Interazione di processi. Modelli: composizione parellela di processi asincroni - interleaving interazione - azioni condivise labeling di processi, relabeling di azioni e hiding structure diagrams Pratica: programmi Java con Multithread Concurrency: concurrent execution 4 ©Magee/Kramer Definizioni Concorrenza computazioni logicamente simultanee. Non implica multipli processori Richiede esecuzione “alternata” su un singolo processore Parallelismo A B C Tempo Processore condiviso da tre processi computazioni fisicamente simultanee. Richiede multipli processori Sia la concorrenza sia il parallelismo richiedono un accesso controllato a risorse condivise. Nel libro di testo i termini parallelo e concorrente sono utilizzati come sinonimi. Un azione è concorrente a un’azione b se il loro ordine di Concurrency: concurrentaexecution esecuzione è indifferente 5 ©Magee/Kramer Modellare la concorrenza Si riesce a modellare la velocità di esecuzione? Velocità arbitraria (il tempo NON è modellato) Come si modella la concorrenza? Ordine relativo delle azioni di processi differenti è arbitrario (alternanza dei processi MA conservazione della sequenza di azioni in ogni processo) Qual’è il risultato? Modello generale indipendente dallo scheduling (modello di esecuzione asincrona) Concurrency: concurrent execution 6 ©Magee/Kramer Composizione parallela - alternanza di azioni Se P e Q sono processi allora (P||Q) rappresenta l’esecuzione concorrente di P e Q. L’operatore || è denominato operatore di composizione parallela. ITCH = (scratch->STOP). CONVERSE = (think->talk->STOP). ||CONVERSE_ITCH = (ITCH || CONVERSE). thinktalkscratch thinkscratchtalk scratchthinktalk Concurrency: concurrent execution Possibili sequenze di azioni risultanti da un’alternanza dei processi. 7 ©Magee/Kramer Composizione parallela - alternanza di azioni Modello LTS scratch think ITCH talk CONVERSE 0 1 0 2 stati 1 2 3 stati scratch scratch think talk Descrizione del “comportamento” scratch CONVERSE_ITCH 0 (0,0) 1 (0,1) 2 (0,2) from ITCHconcurrent executionfrom CONVERSE Concurrency: 3 (1,2) 4 talk 5 (1,1) think (1,0) 2 3 stati 8 ©Magee/Kramer Composizione parallela - alternanza di azioni Modello Reti SA fork think think talk CONVERSE scratch ITCH scratch talk join CONVERSE-ITCH ? Concurrency: concurrent execution 9 ©Magee/Kramer Composizione parallela - proprietà algebriche Commutativa: Associativa: Concurrency: concurrent execution (P||Q) = (Q||P) (P||(Q||R)) = ((P||Q)||R) = (P||Q||R). 10 ©Magee/Kramer Modellare l’interazione - azioni condivise Se due processi che devono essere composti hanno delle azioni in comune, queste azioni sono dette condivise. Per mezzo di azioni condivise si modella l’interazione tra processi. Mentre le azioni non condivise possono essere alternate in modo arbitrario, un’azione condivisa deve essere eseguita nello stesso istante da tutti i processi che vi partecipano MAKER = (make->ready->MAKER). USER = (ready->use->USER). ||MAKER_USER = (MAKER || USER). Concurrency: concurrent execution MAKER si sincronizza con USER quando ready. 11 ©Magee/Kramer Modelli make LTS 0 use make ready 1 2 3 use use used make make RETI SA ready MAKER Concurrency: concurrent execution ready use USER Ready use 12 ©Magee/Kramer MAKER-USER labeling di processi a:P pone il prefisso a ad ogni etichetta di azione dell’alfabeto del processo P. Due istanze di un processo “switch”: SWITCH = (on->off->SWITCH). ||DOPPIO_SWITCH = (a:SWITCH || b:SWITCH). a.on b.on a:SWITCH b:SWITCH 0 1 a.off 0 1 b.off Un array di istanze del processo switch : ||SWITCHES(N=3) = (forall[i:1..N] s[i]:SWITCH). ||SWITCHES(N=3) = (s[i:1..N]:SWITCH). Concurrency: concurrent execution 13 ©Magee/Kramer process labeling by a set of prefix labels {a1,..,ax}::P sostituisce ogni etichetta n di azione nell’alfabeto di P con le etichette a1.n,…,ax.n. Inoltre, ogni transizione (n->X) nella definizione di P è sostituita dalle transizioni ({a1.n,…,ax.n} ->X). Il prefisso di processi è utile per modellare risorse condivise: RISORSA = (riserva->rilascia->RISORSA). UTENTE = (riserva->usa->rilascia->UTENTE). ||CONDIVISIONE DI RISORSE = (a:UTENTE || b:UTENTE || {a,b}::RISORSA). Concurrency: concurrent execution 14 ©Magee/Kramer Prefissi di processi per risorse condivise a.acquire a:riserva a:UTENTE a:USER 0 a.use a:usa b:riserva b.acquire b:UTENTE b:USER 1 2 0 a.release a:rilascia b:usa b.use 1 2 b:rilascia b.release b.acquire a:riserva b:riserva a.acquire {a,b}::RESOURCE RISORSA 0 1 a:riserva a.acquire b:riserva b.acquire b:usa b.use a:rilascia a.release b:rilascia b.release a:usa a.use CONDIVISIONE DI RESOURCE_SHARE RISORSE 0 1 2 3 4 b:rilascia b.release Concurrency: concurrent execution 15 a:rilascia a.release ©Magee/Kramer Prefissi di processi per risorse condivise disponibile riserva riserva non disponibile usa rilascia disponibile rilascia riserva riserva usa rilascia Concurrency: concurrent execution non disponibile usa rilascia 16 ©Magee/Kramer relabeling di azioni Le funzioni di relabeling sono applicate ai processi per rinominare le azioni. La forma generale di una funzione di relabeling è la seguente: /{newlabel_1/oldlabel_1,… newlabel_n/oldlabel_n}. Queste funzioni assicurano che processi composti possano essere sincronizzati su azioni particolari CLIENT = (call->wait->continue->CLIENT). SERVER = (request->service->reply->SERVER). Concurrency: concurrent execution 17 ©Magee/Kramer relabeling di azioni ||CLIENT_SERVER = (CLIENT || SERVER) /{call/request, reply/wait}. call reply SERVER CLIENT 0 1 call 0 2 1 call 0 2 reply continue CLIENT_SERVER service service 1 reply 2 3 continue Concurrency: concurrent execution 18 ©Magee/Kramer relabeling di azioni request call wait service continue reply call service reply Concurrency: concurrent execution continue 19 ©Magee/Kramer relabeling di azioni - etichette prefisso Una formulazione alternativa del sistema client server è descritta sotto per mezzo di etichette qualificate o prefisso : SERVERv2 = (accept.request ->service->accept.reply->SERVERv2). CLIENTv2 = (call.request ->call.reply->continue->CLIENTv2). ||CLIENT_SERVERv2 = (CLIENTv2 || SERVERv2) /{call/accept}. Concurrency: concurrent execution 20 ©Magee/Kramer hiding di azioni - astrazione per ridurre la complessità Applicato a un processo P, l’operatore di hiding \{a1..ax} rimuove i nomi di azioni a1..ax dall’alfabeto di P e rende queste azioni celate "silenti". Le azioni silenti sono etichettate tau. Azioni silenti in processi distinti NON sono condivise. Talvolta è più appropriato specificare l’insieme di azioni che devono essere mostrate .... (operatore complementare) Applicato a un processo P, l’operatore di interfaccia @{a1..ax} nasconde tutte le azioni nell’alfabeto di P che NON appaiono nell’insieme a1..ax. Concurrency: concurrent execution 21 ©Magee/Kramer Hiding di azioni Le seguenti definizioni sono equivalenti: UTENTE = (riserva->usa->rilascia->UTENTE) \{usa}. UTENTE = (riserva->usa->rilascia->UTENTE) @{riserva,rilascia}. acquire riserva tau usa 0 1 2 La minimizzazione rimuove azioni tau nascoste per produrre un LTS con comportamento osservabile equivalente. riserva acquire release rilascia 0 1 rilascia release Concurrency: concurrent execution 22 ©Magee/Kramer structure diagrams P Processo P con alfabeto {a,b}. a b P a c x m c x b d x Composizione Parallela (P||Q) / {m/a,m/b,c/d} Q S x P a Concurrency: concurrent execution Q y Composite process ||S = (P||Q) @ {x,y} 23 ©Magee/Kramer