# data[].attributes.body
Processi interagenti: situazione in cui i due (o più) processi non possono evolvere in modo completamente autonomo

Devono interagire o volontariamente o involontariamente

La rappresentazione nel grafo delle precedenze dovrà necessariamente avere degli elementi comuni

Classifichiamo le modalità di interazione tra processi in base alla loro conoscenza o meno della presenza degli altri.

Processi totalmente ignari

sono indipendenti e non sono stati progettati per lavorare assieme ma “evolvono” in un ambiente comune

interagiscono tra loro in competizione sulle risorse e si devono quindi sincronizzare.

Questa situazione viene gestita dal sistema operativo che deve essere arbitro della loro evoluzione. Deve effettuare la sincronizzazione all’accesso delle risorse ogni volta che i processi le richiedono.

Processi indirettamente a conoscenza uno dell'altro

i processi sono a conoscenza dell’esistenza degli altri ma non ne conoscono il nome (o il PID )

non possono comunicare direttamente tra loro

devono cooperare per qualche motivo e possono scambiarsi i dati utilizzando risorse comuni, come aree di memoria condivisa.

Il SO deve offrire dei meccanismi di sincronizzazione che rendano possibile la cooperazione

Processi direttamente a conoscenza uno dell'altro

i processi devono cooperare per qualche motivo

comunicano tra loro conoscendo i propri nomi

possono quindi effettuare direttamente lo scambio di informazioni mediante invio di messaggi espliciti

Il SO deve offrire dei meccanismi di sincronizzazione che rendano possibile la cooperazione

# data[].attributes.body
Processi indipendenti: l'evoluzione di un processo non influenza quella dell'altro
Due processi indipendenti devono lavorare su un insieme privato di variabili e ogni variabile che ciascuno di essi modifica non può essere utilizzata da nessun altro processo: l'unico caso in cui due processi indipendenti utilizzano una variabile comune è quello in cui su tale variabile effettuano solo operazioni di lettura.

# data[].attributes.body
(2*6) + (1+4) * (5-2)

# data[].attributes.body
inizio
leggi X
leggi Y
leggi Z
k <- max(X,Y);
k <- max(K,Z);
scrivi k
fine

# data[].attributes.headline
Scomposizione di un processo non sequenziale

# data[].attributes.subject
Scomposizione di un processo non sequenziale

# data[].attributes.body
Processo non sequenziale: consiste nella elaborazione contemporanea di più processi che sono di tipo sequenziale

possono essere studiati, descritti e programmati singolarmente

Scomposizione sequenziale: Un processo non sequenziale può essere scomposto in un insieme di processi sequenziali che possono essere eseguiti contemporaneamente

Le attività che i processi eseguono sono:

attività completamente indipendenti

attività interagenti

# data[].attributes.headline
Processi non sequenziali e grafo di precedenza

# data[].attributes.subject
Processi non sequenziali e grafo di precedenza

# data[].attributes.body
Nei processi sequenziali la sequenza degli eventi che costituisce il processo è totalmente ordinata

Se la rappresentiamo come un grafo orientato questo risulterà totalmente ordinato

L’ordine in cui vengono eseguiti è sempre lo stesso

Grafo delle precedenze: grafo che descrive l’ordine con cui le azioni (o gli eventi) si eseguono del tempo

Nei processi paralleli l’ordinamento non è completo (l’esecutore per alcune istruzioni “è libero” di scegliere quali iniziare prima senza che il risultato sia compromesso)

Nella elaborazione parallela l’esecuzione delle istruzioni segue un ordinamento parziale

Per la descrizione del grafo delle precedenze vengono utilizzati i seguenti simboli con i rispettivi significati:

# data[].attributes.body
Elaborazione sequenziale: esecuzione di un programma sequenziale che genera un processo sequenziale con un ordinamento totale alle azioni che vengono eseguite

Programmazione concorrente: tecniche e strumenti impiegati per descrivere il comportamento di più attività o processi che si intende far eseguire contemporaneamente in un sistema di calcolo (processi paralleli)

Sistema concorrente: intendiamo un sistema software implementato su vari tipi di hardware che porta avanti contemporaneamente tante attività diverse, tra di loro correlate, che possono cooperare ad un obiettivo comune oppure possono competere per utilizzare risorse condivise

# data[].attributes.headline
ELABORAZIONE SEQUENZIALE E CONCORRENTE (Lezione 1)

# data[].attributes.subject
ELABORAZIONE SEQUENZIALE E CONCORRENTE (Lezione 1)

# data[].attributes.body
- il concetto di programmazione concorrente
- a realizzare il grafo delle precedenze
- il concetto di interazione tra processi