Linguaggi a memoria condivisa Lidea è di aggiungere ad un linguaggio imperativo dei costrutti per rappresentare lesecuzione parallela di statements. Supponiamo.

Slides:



Advertisements
Presentazioni simili
Introduzione al linguaggio C++
Advertisements

Sintassi (prima parte)
Linguaggi di programmazione
Esercitazione guidata 1
Semantica di linguaggi di programmazione Ne esistono differenti stili a seconda di paradigma di programmazione uso (validazione, prototyping, verifica.
Type Checking (1° parte)
SOS a piccoli passi Invece di semplificare sempre in configurazioni finali, fattorizziamo in passi più piccoli (da cui il nome). In questo modo la non.
Paradigma Funzionale Paradigma Imperativo: Programma = transizione di stato Paradigma Funzionale: Programma = valutazione di un’espressione La maggior.
Generazione di Codice Intermedio
Paradigma Funzionale Paradigma Imperativo: Programma = transizione di stato Paradigma Funzionale: Programma = valutazione di unespressione La maggior parte.
Algoritmi e Programmazione
1 Semantica Operazionale di un frammento di Java: lo stato.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
Informatica Generale Marzia Buscemi
1 Processi e Thread Meccanismi di IPC, Inter Process Communication (1)
RB-alberi (Red-Black trees)
Sincronizzazione fra processi
Strutture dati elementari
Alberi binari di ricerca
RICONOSCIMENTO DI SEQUENZE DI EVENTI
INFORMATICA Strutture iterative
1 Istruzioni, algoritmi, linguaggi. 2 Algoritmo per il calcolo delle radici reali di unequazione di 2 o grado Data lequazione ax 2 +bx+c=0, quali sono.
Introduzione agli algoritmi. Definizione Sistema di regole e procedure di calcolo ben definite che portano alla soluzione di un problema con un numero.
Semantica Denotazionale
Semantiche dei linguaggi di programmazione
Sistemi basati su conoscenza Conoscenza e ragionamento Prof. M.T. PAZIENZA a.a
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Corso di Laurea in Biotecnologie Informatica (Programmazione)
CORSO DI PROGRAMMAZIONE II
Algoritmi e Strutture Dati
Programmazione Un programma descrive al computer, in estremo dettaglio, la sequenza di passi necessari a svolgere un particolare compito L’attività di.
Introduzione alla programmazione lll
-calcolo Vogliamo studiare le problematiche relative al meccanismo di chiamata di funzione (eg differenze fra binding statico e dinamico) in isolamento.
Semantica denotazionale algebrica di LW Idea intuitiva: i valori che vogliamo denotare sono: gli statements sono funzioni di trasformazioni di stato (interno)
Semantica Operazionale Strutturata
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
nome: sequenza di caratteri usata per denotare un oggetto
Sincronizzazione fra thread
Fondamenti di Informatica Algoritmi
Algoritmi e Programmazione (in C) Stefano Cagnoni e Monica Mordonini
LINGUAGGI DI PROGRAMMAZIONE
Rete Sincrona Una rete sequenziale sincrona, è dotata di un ingresso E, di un segnale di Clock e uno di reset. Ad ogni fronte del Clock, deve essere campionato.
Dall’algoritmo al programma.
CODIFICA Da flow-chart a C++.
Architettura degli Elaboratori II (canale P-Z) Istruzioni di controllo Dott. Franco Liberati.
Sincronizzazione dei processi
Linguaggi e modelli computazionali LS Manni Tiziano
ND-partizione (A) n   A  somma  0 M  1/2 (  a i ) for i  1 to n do S[i]  choice ({true, false}) if S[i] then somma  somma + a i if somma > M then.
Cammini minimi da un sorgente
Ripetizione La vera potenza dei programmi per computer risiede nella capacità di ripetere lo stesso calcolo o sequenza di istruzioni più volte, ogni volta.
Introduzione a Javascript
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
1 Tipi di Dato §descrittori, tipi, controllo e inferenza dei tipi §specifica (semantica) e implementazione di tipi di dato l implementazioni “sequenziali”
Tecnologie Informatiche ed Elettroniche per le Produzioni Animali
1 Fabio Scotti – Università degli Studi di Milano Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( )
Lez. 11 (13/14)Elementi di Programmazione1 Lezione 11 Esercizi.
13 ottobre Decisioni F. Bombi 13 ottobre 2002.
1 Interpretazione astratta: un approccio sistematico all’analisi statica.
Nucleo di Java: Struttura e Semantica Espressioni Assegnamento Controllo di sequenza Dichiarazioni.
Semantica dinamica Vogliamo definire una funzione che associ ad ogni termine corretto del mio linguaggio di programmazione un valore. Questa associazione.
Elementi di semantica denotazionale ed operazionale
Algoritmi e Programmazione (in C) Stefano Cagnoni e Monica Mordonini
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 6 – Invariante.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
Corso di Laurea in Informatica Architettura degli elaboratori a.a ISA e Asm: esempi e suggerimenti.
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Transcript della presentazione:

Linguaggi a memoria condivisa Lidea è di aggiungere ad un linguaggio imperativo dei costrutti per rappresentare lesecuzione parallela di statements. Supponiamo di aggiungere a LW la produzione: Stat::={Stat || Stat} Lidea (modello più semplice possibile) è di permettere lesecuzione di un passo del pezzo di sinistra o di quello di destra, indifferentemente (semantica di interleaving), quindi il modo più conveniente di descrivere la semantica è SOS a piccoli passi ({st 1 || st 2 }, s) r ({st 1 || st 2 }, s) (st 1, s) r (st 1, s) ({st 1 || st 2 }, s) r ({st 1 || st 2 }, s) (st 2, s) r (st 2, s) ({st 1 || st 2 }, s) r (st 2, s) (st 1, s) r (, s) ({st 1 || st 2 }, s) r (st 1, s) (st 2, s) r (, s)

Non determinismo Consideriamo il frammento {x=7; y=x*x;||x=1;} Supponiamo di essere in un ambiente e stato corretti per lesecuzione di questo frammento (cioè in cui x e y sono variabili di tipo intero). Usando le regole possiamo costruire le seguenti due catene di esecuzione (riscrittura a piccoli passi, per esercizio costruire gli alberi di ogni passo) ({x=7; y=x*x;||x=1;},s) r ({y=x*x;||x=1},s[7/r(x)]) r (y= x*x;, s[1/r(x)]) r (, s[1/r(x), 1/r(y)]) ({x=7; y=x*x;||x=1;},s) r (x=7; y=x*x;,s[1/r(x)]) r (y= x*x;, s[7/r(x)]) r (, s[7/r(x), 49/r(y)]) Questo Ribadisce il fatto che in presenza di parallelismo non si può evitare il non determinismo Fa capire la necessità di introdurre costrutti per permettere di fermare il mondo durante lesecuzione di pezzi di codice (ad esempio per evitare che variabili inizializzate per essere usate in espressioni successive vengano modificate prima di poter essere usate)

PARWHILE Linguaggio per parallelismo basato su memoria condivisa (Omicki- Cries) PARallelWHILE. Lo adattiamo a LW (=LinguaggioWhile). Partiamo da un sottoinsieme minimale di LW (non vogliamo tirarci dietro problemi di scoping, visibilità e tipaggio) e aggiungiamo i costrutti per il parallelismo Stat::=Id = NExp; | while (BExp) {Stats} | if (BExp) {Stats} else {Stats} | skip | ?(Id) | !(NExp) Stats::=Stat | Stat Stats. NExp::=Id | Exp + Exp | … BExp::=NExp Rel NExp | BExp BConn BExp | not BExp. Rel::== |.BConn::=and | or | imp. Ci sono solo variabili intere, tutte sono dichiarate (e inizializzate a 0), così non ci sono problemi di correttezza statica. {PStats}| PStats::=nil | Stats || PStats. Esecuzione parallela come visto prima | Stats Esecuzione atomica, cioè ininterrompibile di una sequenza | await BExp; Meccanismo per la collaborazione: permette di attendere che altri processi terminino la loro attività

SOS Small Steps più tutte le regole per le operazioni base (che sono lasciate per esercizio) Regole mutuate da LW ( con gli ovvi adattamenti, eg r è una qualsiasi funzione totale ed iniettiva da L Id (LW) in Loc ) (st sts, s) r (st sts, s) (st, s) r (st, s) (st sts, s) r (sts, s) (st, s) r (, s) concatenazione di statements (x=e;,s) r (x=e;,s) (e,s) r (e,s) (x=v;,(i,o,m)) r (,(i,o,s,m[v/r(x)])) assegnazione (while (e) {sts}, s) r (if (e) {sts while (e) {sts}} else {skip;},s) while (?x;,(v i,o,m)) r (,(i,o,m[v/r(x))) read (skip;, s) r (, s) skip (!e;,s) r (!e;,s) (e,s) r (e,s) (!v;,(i,o,m)) r (,(i,v o,m)) write (if (true) {sts} else {sts}, s) r (sts, s) (if (e) {sts} else {sts}, s) r (if (e) {sts} else {sts}, s) (e, s) r (e, s) (if (false) {sts} else {sts}, s) r (sts, s) if then else

Formalizzazione che rispetta la struttura della grammatica Regole per Interleaving ({sts || psts}, s) r ({sts || psts}, s) (sts, s) r (sts, s) può muovere il primo processo ({sts || psts}, s) r ({sts || psts}, s) ({psts}, s) r ({psts}, s) può muovere uno degli altri processi ({sts || psts}, s) r ({psts}, s) (sts, s) r (, s) se si esaurisce il primo lo elimino ({nil}, s) r (, s) quando ho elaborato tutto ho finito ({x=1;||y=2;||z=3;||nil},(i,o,m)) r ({y=2;||z=3;||nil},(i,o,m)) r ({z=3;||nil},(i,o,m)) r (z=3;,(i,o,m)) r (,(i,o,m[3/r(z)])) ({nil},(i,o,m[3/r(z)])) ({y=2;||nil},(i,o,m[3/r(z)])) ({x=1;||y=2;||nil},(i,o,m[3/r(z)])) ({sts 1 ||…||sts i-1 ||sts i ||sts i+1 ||…||sts n ||nil}, s) r ({sts 1 ||…||sts i-1 ||sts i ||sts i+1 ||…||sts n ||nil}, s) ({sts i }, s) r ({sts i }, s) Idea intuitiva e centrale

Regole per Sincronizzazione (await b;, s) r (if (b){skip;} else {await b}, s) Sincronizzazione: Finché b è falsa non faccio niente, ovvero se b è vera passo al prossimo comando Primo tentativo di regola (ispirandosi al while) Problema: In questo modo se b è falsa non è vero che non faccio niente, faccio delle riscritture che alla fine mi porteranno al punto di partenza. Secondo tentativo: Riscrivo la guardia (await b;, s) r (await b;, s) (b, s) r (b,s) Se arrivo a vero ho finito (await true;, s) r (, s) Se arrivo a falso, non ho più nessuna regola per andare avanti. Se cè un altro percorso di valutazione che porta a vero, lo troverò (non determinismo) in un altro albero. Altrimenti non riuscirò a costruire un albero di valutazione

Esecuzione atomica Non possiamo seguire il solito stile (ogni piccolo passo di una sottoespressione induce un piccolo passo dellespressione complessiva), perché lo spirito di questo costrutto è proprio di trasformare una sequenza di piccoli passi di esecuzione portata fino a compimento in un singolo piccolo passo dellespressione Regole per Esecuzione Atomica ({ x=7; y=x*x; ||x=1||nil},(i,o,m)) r ( x=7; y=x*x;,(i,o,m)) r (x=7; y=x*x;,(i,o,m)) * r (, (x=7 ;y=x*x;,(i,o,m)) r ( y=x*x;,(i,o,m[7/r(x)])) (i,o,m[7/r(x),49/r(y)])) (,(i,o,m[7/r(x),49/r(y)])) ({x=1;||nil},(i,o,m [7/r(x),49/r(y)])) ( sts ; s) r ( ; s) (sts, s) * r (, s) (y=x*x;,s) * r (,s) (y=x*x;,s) r (y=7*x;,s)(y=7*x;,s) * r (,s) (y=7*x;,s) r (y=7*7;,s) (y=7*7;,s) * r (,s) (y=7*7;,s) r (y=49;,s) s = (i,o,m[7/r(x)]) s= (i,o,m[7/r(x),49/r(y)]) (y=49;,s) * r (,s) (y=49;,s) r (,s) (x*x,s) r (7*x,s) (7*x,s) r (7*7,s) (7*7,s) r (49,s)

Semantica di un programma PARWHILE Cerchiamo di capire quale semantica può risultare dalle nostre regole. esecuzioni non terminanti (riscrittura infinita), ad esempio generati dal while (come nel caso non parallelo) esecuzioni con risultato deadlock globale (la configurazione non è della forma (,s) ma non cè nessuna regola che si applichi: x=0;{await x>0;||nil} esecuzioni terminanti (riscrittura finita che termina in una configurazione della forma (,s)), (quelli che funzionano nel caso non parallelo o) {x=0;|| await x>0;x=x-1|| x=1;|| nil} Non determinismo: dallo stesso termine possono partire tutte e 3 i tipi di riscrittura

Semantica Composizionale??? Da quanto visto, la semantica di un comando dovrebbe essere non più una funzione da stato in stato ma un insieme di tali funzioni. Allora che senso ha la composizionalità? In che senso [st sts] = composizione di [st] e [sts] ??? La composizione non è banale (anzi è così complicata da non aiutare la comprensione) In altre parole, in questo caso abbiamo rinunciato ad un requisito che avevamo imposto fin dallinizio. Luso del metodo formale permette di capire esattamente in che senso programmi concorrenti sono intrinsecamente più complicati di programmi sequenziali.