La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Il Sistema Operativo Programmazione Concorrente

Presentazioni simili


Presentazione sul tema: "Il Sistema Operativo Programmazione Concorrente"— Transcript della presentazione:

1 Il Sistema Operativo Programmazione Concorrente
Tipologie di Reti e di Mezzi trasmissivi - Giorgio Porcu Il Sistema Operativo Programmazione Concorrente BOZZA: 19/03/2016 Giorgio Porcu

2 Sommario Linguaggi concorrenti Le istruzioni fork e join
Linguaggio sequenziale Linguaggio concorrente Pseudolinguaggio concorrente Le istruzioni fork e join Fork e Join Grafo di Precedenza  Pseudocodice concorrente Esempi Semplificazione delle precedenze

3 Linguaggi concorrenti

4 Linguaggio sequenziale
Linguaggio di programmazione che supporta nativamente la sola esecuzione sequenziale delle istruzioni. Gran parte dei linguaggi strutturati, come il C, appartiene a questa categoria. Utilizzando un linguaggio sequenziale il programmatore non può dichiarare porzioni di codice eseguibili in parallelo.

5 Linguaggio concorrente
Linguaggio di programmazione che supporta nativamente l’esecuzione concorrente delle istruzioni. Ne è un esempio il linguaggio Java, che la supporta a livello utente con opportuni costrutti per i thread. Utilizzando un linguaggio concorrente il programmatore dichiara porzioni di codice parallelizzabili. L’effettiva esecuzione parallela dipende comunque dalle caratteristiche HW e SW (politiche di Scheduling del SO) dell’elaboratore.

6 Programmazione concorrente
Attività finalizzata alla creazione di algoritmi che supportino attività concorrenti. Utilizza: I Grafi di precedenza per descrivere quali porzioni di codice siano parallelizzabili Un linguaggio concorrente per definire esplicitamente, con opportuni costrutti/istruzioni, porzioni di codice parallelizzabili

7 Pseudolinguaggio concorrente
Poiché i linguaggi concorrenti sono di difficile utilizzo, ci serviremo a scopo didattico dello pseudocodice di uno pseudolinguaggio concorrente: Simile al linguaggio C Che utilizzi opportune istruzioni per dichiarare inizio e fine delle attività parallelizzabili. In realtà tale linguaggio non esiste, ma potrebbe essere simulato con il C su piattaforma Linux grazie alle funzioni fork(), exit() e wait()

8 Pseudocodifica concorrente
La pseudocodifica del linguaggio concorrente si baserà su una struttura tipo come la seguente: inizio A; // esegui blocco istruzioni A B; // esegui blocco istruzioni B Ris = Prova(); // richiama funzione Prova() fine Prova() // definisci funzione Prova() { C; // esegui blocco istruzioni C }

9 Le istruzioni fork e join

10 Fork e Join Fork e Join Istruzioni per codificare l’esecuzione parallela. Sono state teorizzate negli anni ‘60 e sono applicate in vari modi nei linguaggi concorrenti. Nel nostro pseudolinguaggio concorrente immagineremo siano presenti come funzioni di sistema: fork() int fork(nomefunzione) join() void join(variabile|intero)

11 fork (1/2) Fork Istruzione che esprime l’inizio di un esecuzione parallela. Corrisponde alla biforcazione nel Grafo di precedenza (o pluriforcazione). E’ espressa in pseudocodice come segue: A; // blocco A P1=fork(NodoC); B; // blocco B NodoC() { C; // blocco C } B A C fork

12 Integrazione del blocco C con fork
Per esprimere correttamente la fork occorre: Fissare nel Grafo una sequenza standard di istruzioni Integrare i restanti blocchi di istruzioni con una fork A; P1=fork(NodoC); B; NodoC() { C; } Sequenza standard B A C fork Integrazione del blocco C con fork

13 join (1/2) Join Istruzione che esprime la fine di un esecuzione parallela. Corrisponde alla riunione in un unico flusso delle istruzioni nel Grafo di precedenza. In pseudocodice: B; C; join(P2); D; La join è seguita dal nome della variabile cui è assegnato il valore di ritorno della precedente fork (in questo caso P2) B D C join

14 join (2/2) L’istruzione join può essere espressa in due modi: B D C
Seguita dal nome della variabile usato nella fork, come nel precedente esempio Seguita da un numero intero indicante quanti blocchi di istruzioni si riuniscono in quel punto B; B; C; C; join(P2); join(2); D; D; B D C join Numero intero Nome della variabile

15 Grafo di Precedenza  Pseudocodice
Una tipica modalità di costruzione di un algoritmo concorrente consiste in: Analizzare un Grafo di precedenza contenente esecuzione parallela di istruzioni Trasformarlo in un algoritmo in pseudocodice che utilizzi le istruzioni fork() e join()

16 Realizzare Pseudocodice con fork/join
Realizzare Pseudocodice con fork e join Per realizzare lo Pseudocodice concorrente occorre analizzare il Grafo di precedenza e: Utilizzare una fork per ogni pluriforcazione e una join per ogni riunione di blocchi di codice. Può essere utile segnare con una linea sul grafo la presenza delle istruzioni Ricordarsi che ogni join è preceduta da una fork Tener presente che all’inizio e alla fine dell’algoritmo tutte le istruzioni sono sequenziali

17 Pseudocodice: Esempio 1
Consideriamo il seguente Grafo di precedenza e trasformiamolo in pseudocodice: inizio A; // blocco A P1=fork(NodoC); B; // blocco B join(P1); D; fine NodoC() { C; // blocco C } B A C D fork join

18 Semplificazione delle precedenze
Prima di realizzare il pseudocodice parallelo è opportuno analizzare attentamente il Grafo: in alcune situazioni è possibile semplificarlo. La semplificazione consiste nell’eliminare le precedenze implicite nei triangoli tra nodi, come nel caso seguente: B B A A C C

19 Semplificazione delle precedenze
In questo caso il nodo A ha precedenza diretta su C, ma anche il percorso AB ha precedenza su C. Poiché valgono le regole generali: Tutti i nodi del Grafo dovranno essere elaborati (rappresentano codice) Tutte le precedenze del Grafo vanno rispettate C dovrà comunque attendere l’esecuzione di B: elimino dunque il passaggio diretto AC B B A A C C


Scaricare ppt "Il Sistema Operativo Programmazione Concorrente"

Presentazioni simili


Annunci Google