La crescita simultanea della disponibilità di grandi dati e del numero di utenti simultanei su Internet pone una particolare pressione sulla necessità di eseguire compiti di calcolo “in parallelo”, o simultaneamente. Il calcolo parallelo e distribuito è presente in molte aree tematiche diverse dell’informatica, compresi gli algoritmi, l’architettura dei computer, le reti, i sistemi operativi e l’ingegneria del software. Durante l’inizio del 21° secolo c’è stata una crescita esplosiva nella progettazione di multiprocessori e altre strategie per far funzionare più velocemente applicazioni complesse. Il calcolo parallelo e distribuito si basa su concetti fondamentali dei sistemi, come la concorrenza, l’esclusione reciproca, la coerenza nella manipolazione dello stato/memoria, il message-passing e i modelli di memoria condivisa.
Creare un multiprocessore da un certo numero di CPU singole richiede collegamenti fisici e un meccanismo di comunicazione tra i processori in modo che essi possano operare in parallelo. I multiprocessori strettamente accoppiati condividono la memoria e quindi possono comunicare memorizzando informazioni nella memoria accessibile a tutti i processori. I multiprocessori liberamente accoppiati, comprese le reti di computer, comunicano inviando messaggi l’uno all’altro attraverso i collegamenti fisici. Gli scienziati informatici hanno studiato varie architetture di multiprocessori. Per esempio, le possibili configurazioni in cui centinaia o anche migliaia di processori possono essere collegati insieme sono esaminate per trovare la geometria che supporta il throughput di sistema più efficiente. Una topologia molto studiata è l’ipercubo, in cui ogni processore è collegato direttamente a un certo numero fisso di vicini: due per il quadrato bidimensionale, tre per il cubo tridimensionale, e in modo simile per gli ipercubi più grandi. Gli informatici studiano anche metodi per eseguire calcoli su tali macchine multiprocessore (per esempio, algoritmi per fare un uso ottimale dell’architettura e tecniche per evitare conflitti nella trasmissione dei dati). Il software residente sulla macchina che rende possibile l’uso di una particolare macchina, in particolare il suo sistema operativo, è parte integrante di questa ricerca.
La concorrenza si riferisce all’esecuzione di più di una procedura allo stesso tempo (forse con l’accesso a dati condivisi), sia veramente simultanea (come su un multiprocessore) o in un ordine imprevedibilmente interfogliato. I moderni linguaggi di programmazione come Java includono sia l’incapsulamento che caratteristiche chiamate “thread” che permettono al programmatore di definire la sincronizzazione che avviene tra procedure o compiti concorrenti.
Due importanti problemi nel controllo della concorrenza sono noti come deadlock e condizioni di gara. Il deadlock si verifica quando una risorsa tenuta indefinitamente da un processo è richiesta da due o più processi contemporaneamente. Come risultato, nessuno dei processi che richiedono la risorsa può continuare; sono bloccati, in attesa che la risorsa sia liberata. Un sistema operativo può gestire questa situazione con varie tecniche di prevenzione o di rilevamento e recupero. Una condizione di gara, d’altra parte, si verifica quando due o più processi concorrenti assegnano un valore diverso a una variabile, e il risultato dipende da quale processo assegna la variabile per primo (o ultimo).
Prevenire i deadlock e le condizioni di gara è fondamentalmente importante, poiché assicura l’integrità dell’applicazione sottostante. Una strategia generale di prevenzione è chiamata sincronizzazione dei processi. La sincronizzazione richiede che un processo attenda che un altro completi qualche operazione prima di procedere. Per esempio, un processo (uno scrittore) potrebbe scrivere dati in una certa area della memoria principale, mentre un altro processo (un lettore) potrebbe voler leggere dati da quell’area. Il lettore e lo scrittore devono essere sincronizzati in modo che lo scrittore non sovrascriva i dati esistenti finché il lettore non li abbia elaborati. Allo stesso modo, il lettore non dovrebbe iniziare a leggere finché i dati non sono stati scritti nell’area.
Con l’avvento delle reti, il calcolo distribuito è diventato fattibile. Un calcolo distribuito è un calcolo che viene eseguito da un gruppo di computer collegati che lavorano in modo cooperativo. Tale calcolo di solito richiede un sistema operativo distribuito per gestire le risorse distribuite. Importanti preoccupazioni sono la condivisione del carico di lavoro, che cerca di trarre vantaggio dall’accesso a più computer per completare i lavori più velocemente; la migrazione dei compiti, che supporta la condivisione del carico di lavoro distribuendo in modo efficiente i lavori tra le macchine; e la replica automatica dei compiti, che avviene in siti diversi per una maggiore affidabilità.