Programmazione parallela
Insieme delle tecniche, metodologie e strumenti per il supporto all'esecuzione di sistemi software composti da insiemi di attività svolte simultaneamente, non necessariamente sullo stesso elaboratore.
Elementi
[modifica]Tipicamente si parla si soggetti o processi da sincronizzare, che a livello implementativo prendono il nome di thread una volta in esecuzione. Il thread è un insieme di istruzioni effettivamente attive nell'unità di elaborazione (da non confondere con i processi, coi quali si intende indicare una sezione di codice non ancora in esecuzione), che può essere eseguito parallelamente ad altri. Tramite l'uso dei thread, un programma è in grado di fare più cose contemporaneamente: dal velocizzare la propria esecuzione al realizzare comunicazioni asincrone.
Gli oggetti su cui i soggetti operano sono invece risorse di I/O, variabili condivise o qualsiasi altro elemento necessario alla corretta esecuzione dell'algoritmo; generalmente numericamente inferiori al numero dei soggetti richiedenti.
Sarà il kernel ad offrire i meccanismi necessari a permettere il corretto funzionamento della programmazione multi-thread, attraverso un linguaggio che ne supporti le funzionalità (generalmente delle particolari interrupt).
Sincronizzazione
[modifica]Si rende necessaria ogni qual volta più thread lavorano su più oggetti condivisi. Avendo a disposizione una macchina in grado di eseguire più processi sequenziali contemporaneamente e un linguaggio di programmazione con il quale descrivere algoritmi non sequenziali, è possibile eseguire programmi concorrenti. Con questa tecnica si può gestire agevolmente:
- Cooperazione
- sincronizzazione diretta (esplicita)
- Competizione
- sincronizzazione indiretta (implicita)
- Interferenza
- interazioni tra processi non richieste dalla natura del problema, tipicamente errori di programmazione
Deadlock
[modifica]Situazione di stallo, conosciuta anche come blocco critico, in cui due o più processi attendono reciprocamente una risorsa (oggetto) condiviso