# Introduzione alla programmazione concorrente

Partiamo anzitutto con il distinguere i due concetti fondamentali di processo e sistema concorrente
* Un processo è un programma in esecuzione,
* Un sistema concorrente è programma che coordina due o più processi che interagiscono tra loro.
In particolare la condivisione di risorse e la coordinazione di più programmi avrà un aspetto decisivo nello sviluppo del corso.
Ciò che si prefigge questo corso è la creazione di modelli concorrenti e la loro implementazione con accenni alla fase di testing.

## Modellazione

Un modello è una rappresentazione astratta della realtà, in particolare nei sistemi concorrenti è una descrizione del sistema che parte dai singoli processi, detti attori del sistema concorrente, per arrivare a rappresentare il comportamento finale dato dalla composizione dei singoli processi.
Un esempio di modello concorrente è ad esempio una pasticceria, proviamo ad analizzarlo. Supponiamo di avere
* Cuoco -> RiceveOridineCameriere,PreparaDolce,ConsegnaDolceCameriere
* Cameriere -> RiceviOrdineDaCliente,PortaOrdine,ConsegnaDolce,
* Cliente -> Ordina,Mangia,Paga
Queste tre figure possono essere viste come i nostri processi che, in maniera concorrente condividono risorse,come ad esempio l’ordinazione, ed eseguono operazioni. La struttura però è molto sensibile,se infatti il cameriere riceve un nuovo ordine prima di aver consegnato il primo dolce il sistema si blocca! Notiamo che esistono dunque dei possibili problemi nello sviluppo e nella gestione dei sistemi concorrenti. Ci sono varie rappresentazioni del comportamento del sistema concorrente. Alcune delle rappresentazioni sono
* Reti di petri
* Processi a stati finiti
* Algebra dei processi
noi analizzeremo i sistemi concorrenti tramite i processi a stati finiti.

## Processi a stati finiti

La rappresentazione tramite processi a stati finiti sfrutta gli automi a stati finiti per rappresentare il comportamento di ogni singolo processo. Un automa di un processo rappresenta tutte le operazioni, dette azioni, con una certa sequenza, che il singolo processo può compiere. Un automa è rappresentato da
* Stati che rappresentano l'azione che sta effettuando il processo
* Archi che sono i passaggi da un'azione all'altra. Tramite gli archi si determina la sequenzialità delle azioni di un processo
Il comportamento del sistema concorrente è dato dall'unione dei singoli automi dei processi. Più sono il numero di azioni dei processi, più sono le azioni del processo concorrente e più è elaborato da comprendere il comportamento complessivo.

## Errori

Gli errori che si possono avere in un sistema concorrente, sono appunto dovuti al fatto che un processo fa un'operazione non lecita in quel momento. I tipi di errore sono
* Deadlock quando più processi sono in stallo e attendono che un processo faccia un'operazione per uscire dallo stallo
* Livelook quando più processi cambiano continuamente stato d'esecuzione, senza mai progredire nell'esecuzione
* Starvation quando un processo è pronto (stato di ready to run) ma non viene mai prelevato, dall'algoritmo di scheduling dei processi, per la sua esecuzione
* Data Race quando almeno due processo accedono ad una variabile globale del sistema, ed uno accede in scritture. Questo errore è caratteristico dei sistemi concorrenti, perché se accade ciò il processo che accede in lettura non sa determinare il contenuto esatto della variabile globale del sistema. Può accadere solo se è presente un'operazione di scrittura, in quanto richiede tre fasi (lettura, operazione, scrittura). Per maggiori approfondimenti si vada a vedere il corso di Architettura degli elaboratori.
Questi errori non sono visibili in fase di testing dell'applicazione concorrente, in quanto possono riscontrarsi dopo un tempo indeterminato, anche anni, che l'applicazione è in esecuzione. E' un esempio Nasa Rover Ames K9 che ha un difetto di concorrenza che causa il deadlock del sistema.