Comunicazione
TheBlackHole
Created on May 19, 2023
More creations to inspire you
TALK ABOUT DYS WITH TEACHER
Presentation
ESSENTIAL OILS PRESENTATION
Presentation
ANCIENT EGYPT FOR KIDS PRESENTATION
Presentation
CIRQUE DU SOLEIL
Presentation
YURI GAGARIN IN DENMARK
Presentation
EIDIKO JEWELRY
Presentation
PRODUCT MANAGEMENT IN MOVIES & TV SHOWS
Presentation
Transcript
Mattia Catania
PRESENTATIONE
Concorrenza
ElaborazioneConcorrente
Elaborazione concorrente
Per elaborazione concorrente intendiamo invece le tecniche e strumenti che descrivono il comportamento di processi paralleli, ovvero più processi che vengono eseguiti contemporaneamente. In realtà, ció avviene solo nel caso di architetture multiprocessori.
Elaborazione sequenziale
Per elaborazione sequenziale si intende l’esecuzione di un programma sequenziale le cui istruzioni vengano eseguite una dopo l’altra in un determinato ordine, quindi un’operazione deve essere completata prima che inizi una successiva operazione.
Introduzione
Esecuzione parallela
Per eseguire un processo non sequenziale c’è la necessità di utilizzare:
- un elaboratore non sequenziale;
- un linguaggio di programmazione non sequenziale.
fork-join:Istruzione fork
Le istruzioni fork-join servono a descrivere l’esecuzione parallela tramite la scomposizione di due processi e la riunione in un unico processo: L’istruzione fork corrisponde alla biforcazione di un nodo in due rami, quindi la creazione di un processo figlio che inizia l’esecuzione in parallelo con il processo padre;
fork-join:Istruzione join
L’istruzione join viene eseguita quando il processo figlio termina la sua esecuzione e si sincronizza con il processo padre.
cobegin-coend
Le istruzioni cobegin-coend permettono di indicare un punto in cui più processi iniziano contemporaneamente l’esecuzione (cobegin) e il punto in cui terminano, unendosi al processo principale (coend). I costrutti cobegin-coend sono più semplici da utilizzare e il codice ottenuto è più strutturato e comprensibile
I processi concorrenti interagiscono tra di loro condividendo risorse comuni. Possiamo individuare due modelli di interazione concorrente:
- Modello a memoria comune;
- Modello a scambio di messaggi.
Comunicazione tra processi
Modello a memoria condivisa
Il modello a memoria comune viene utilizzato nelle architetture che usano un’ unica memoria comune a tutti i processi, come nel caso delle macchine monoprocessori con processi multitasking, inoltre, il sistema operativo associa ad ogni risorsa un gestore di risorse.
Modello a scambio di messaggi
Nel caso di un ambiente locale in cui ogni processo ha accesso solo alle risorse allocate nella propria memoria locale, i processi utilizzano lo scambio di messaggi come strumento di comunicazione e sincronizzazione. Questo modello rappresenta un sistema in cui ogni processore ha una memoria privata e opera in un ambiente locale che non è accessibile ad altri processi.
Sincrono e asincrono
Il modello a scambio di messaggi può essere classificato in vari modi:
- nel caso di comunicazione asincrona la comunicazione da parte del processo mittente avviene senza che questo rimanga in attesa di una risposta;
- nel caso di comunicazione sincrona lo scambio di informazioni può avvenire solo se mittente e destinatario sono pronti a “parlarsi”.
Simmetrica e asimmetrica
Possiamo inoltre distinguere la comunicazione asimmetrica e simmetrica:
- asimmetrica nel caso in cui il mittente nomina il destinatario ma il destinatario non nomina il mittente;
- simmetrica quando entrambi si nominano in modo esplicito.
Modello client-server
Lerisorse del sistema sono accessibili da un singolo processo che prende il nome di processo servitore (o server), e quando un processo deve utilizzarla (processo cliente) non può accedervi direttamente ma deve chiedere al processo server di effettuare lui stesso le operazioni desiderate sulla risorsa e di comunicargli successivamente l’esito delle elaborazioni.
Nella programmazione concorrente possiamo riscontrare maggiori difficoltà rispetto alla programmazione sequenziale, essa infatti ci introduce la possibilità di commettere errori dipendenti dal tempo.Effettuare il testing di un programma concorrente è diverso rispetto ad uno sequenziale.
Sincronizzazione tra processi
Elaborazione concorrente
Nei programmi concorrenti possono verificarsi errori legati ai tempi di esecuzione e schedulazione nella CPU i quali non possono essere determinati ed eliminati tramite il testing, ma devono invece essere evitati tramite una programmazione accurata.
Elaborazione sequenziale
Dal programma sequenziale riceviamo diversi risultati ma solo in funzione di dati di input diversi, usando casi di prova, il programmatore può verificare i comportamenti del programma mettendo a confronto gli output con i risultati previsti.
Introduzione
Errori dipendenti dal tempo
Gli errori dipendenti dal tempo sono causati da un’errata sincronizzazione dei processi, essi costituiscono una categoria di errori che possono verificarsi in corrispondenza a determinate velocità relative dei processi e non si riproducono.
Errori dipendenti dal tempo
Le caratteristiche degli errori dipendenti dal tempo sono:
- irriproducibili;
- indeterminati;
- latenti;
- difficili da verificare e testare.
Condizioni di Bernstein
La procedura P elencata nell' immagine ha come dominio A, X, B dato che sono le tre variabili che utilizza, e come rango X, Y; le variabili che modifica. Due istruzioni, dette Ia e Ib possono essere eseguite concorrentemente se
- range(istruzione A) ∩ range(istruzione B) = Ø
- range(istruzione A) ∩ domain(istruzione B) = Ø
- domain(istruzione A) ∩ range(istruzione B) = Ø
Mutua esclusione
Se consideriamo due processi in competizione per l’uso esclusivo di una risorsa comune, non possiamo prevedere il momento preciso nel quale uno dei processi utilizzerà la risorsa, ma dobbiamo garantire che quando ne entra in possesso lo faccia in maniera esclusiva.
Mutua esclusione
Si ha mutua esclusione quando non più di un processo alla volta può accedere a una risorsa comune.La regola di mutua esclusione impone che le operazioni con le quali i processi accedono alle variabili comuni non si sovrappongano nel tempo: inoltre nessun vincolo è imposto sull’ordine con il quale le operazioni sulle variabili vengono eseguite.
Sezione critica
La sequenza di istruzioni con la quale un processo accede e modifica un insieme di variabili condivise prende il nome di sezione critica.Nel modello a memoria condivisa le risorse comuni condivise saranno le variabili globali che verranno utilizzate dai diversi processi per scambiarsi informazioni.
Starvation e deadlock
Un’errata sincronizzazione può portare al fallimento delle elaborazioni, genera situazioni di incoerenza dei dati, e può portare a situazioni di blocco dei processi:starvation (o blocco individuale);deadlock (o blocco multiplo);
I semafori possono essere utilizzati per gestire la mutua esclusione, garantendo che solo un processo o thread alla volta possa accedere alla risorsa condivisa. Inoltre, i semafori possono essere utilizzati per la sincronizzazione tra i processi o thread, permettendo di controllare l’ordine di esecuzione delle operazioni.
Semafori
Semafori a basso livello
Il primo meccanismo che analizziamo è quello che associa a ogni risorsa una variabile x o flag; Il flag fa la funzione di semaforo:
- x = 1 semaforo verde, è possibile accedere alla risorsa;
- x = 0 semaforo rosso, la risorsa è occupata ed è necessario aspettare che si liberi.
Funzione lock
La funzione che permette di allocare una risorsa prende il nome di lock(). Possiamo indicare la sua sintassi nel seguente formato: lock(x), dove x è il semaforo associato alla risorsa che desideriamo utilizzare.
Funzione unlock
La funzione che permette di rilasciare una risorsa prende il nome di unlock().Possiamo indicare la sua sintassi nel seguente formato: unlock(x); dove x è il semaforo associato alla risorsa che desideriamo utilizzare.
Semaforo di Dijkstra
Dijkstra ha proposto due funzioni che permettono la soluzione di qualsiasi problema di interazione fra processi, che sono:
- La funzione P(S), che riceve in ingresso un numero intero S (semaforo), che viene utilizzata peraccedere alla risorsa;
- la funzione V(S), che riceve anch’essa in ingresso un numero intero S, che viene utilizzata per rilasciare la risorsa.