Elaboratore
Nonostante i continui progressi tecnologici abbiano prodotto e. elettronici sempre più sofisticati, veloci, potenti e adattabili a nuove applicazioni, la domanda di risorse di calcolo e la disponibilità di enormi quantità di dati sembrano essere cresciute ancora più rapidamente delle tecnologie, ponendo nuovi limiti alla capacità di calcolo delle moderne piattaforme di elaborazione. Questo aspetto è ampiamente evidenziato nelle tendenze evolutive dei moderni sistemi di elaborazione. Infatti, oltre a proseguire nel cammino già intrapreso da tempo verso una miniaturizzazione più spinta e una progettazione specifica per singole applicazioni (come personal digital assistant, telefonia cellulare, videogiochi, fotografia digitale, meccatronica e domotica), si sono resi disponibili sofisticati e innovativi sistemi di calcolo basati su architetture parallele o distribuite, che, sfruttando a pieno le tecnologie sviluppate per le reti di comunicazione e per Internet, si sono rivelati capaci di risolvere problemi sempre più complessi e in grado di operare su enormi quantità di dati.
Dalla fine degli anni Novanta del 20° sec., infatti, si è assistito al progressivo affermarsi del concetto che l'e. vero e proprio sia effettivamente costituito sempre più da un insieme di nodi di elaborazione connessi in rete, piuttosto che da un singolo dispositivo. Di conseguenza, per ovviare alle limitazioni inerenti alle architetture di elaborazione a processore singolo, si è assistito alla diffusione di nuove soluzioni architetturali basate su più nodi di elaborazione tra di loro opportunamente interconnessi, come gli e. ad alte prestazioni, i cluster di calcolatori, le griglie computazionali (grid) e le architetture P2P (Peer-to-Peer).
Elaboratori ad alte prestazioni
Gli e. ad alte prestazioni sono costituiti da calcolatori potenti, in grado di effettuare calcoli matematici particolarmente complessi e di gestire efficientemente grandi quantità di dati. Tali architetture vengono tipicamente impiegate in applicazioni scientifiche, relative alla modellazione e alla risoluzione di problemi che si presentano in varie discipline (come le scienze meteorologiche, biologiche, biomediche, astrofisiche, fisiche e geologiche), o in applicazioni industriali (come l'ingegneria spaziale, il progetto di semiconduttori, la generazione e la gestione di mappe satellitari, le predizioni e le simulazioni finanziare, la gestione di grandi quantità di dati). Per dare un'idea delle prestazioni che si possono ottenere con architetture di questo tipo, basti considerare che uno dei calcolatori più potenti prodotto nell'anno 2004, il BlueGene/L dell'IBM, ha una potenza di calcolo pari a 70,72 teraflops, vale a dire che è in grado di eseguire oltre settantamila miliardi di operazioni in virgola mobile al secondo.
L'architettura tipica di una moderna piattaforma ad alte prestazioni è costituita da decine di migliaia di nodi di elaborazione (processori), in grado di lavorare simultaneamente in parallelo. Le architetture più diffuse per i sistemi ad alte prestazioni comprendono i sistemi a memoria condivisa (noti anche come sistemi SMP, Shared Memory Processors), e i sistemi a memoria distribuita (noti anche come sistemi MPP, Massively Parallel Processors, ossia processori a elevato livello di parallelismo). I sistemi SMP e MPP differiscono principalmente per l'organizzazione del loro sistema di memoria.
I sistemi SMP sono caratterizzati da processori a basso costo, non dotati di una propria memoria, ma in grado di accedere a una memoria comune condivisa con gli altri processori. I vantaggi dei sistemi SMP sono relativi alla loro facilità di uso e di programmazione da parte degli utenti finali, cui la natura multiprocessore dell'architettura può rimanere del tutto sconosciuta. D'altro canto, un potenziale svantaggio dei sistemi SMP è costituito dal fatto che non presentano caratteristiche pronunciate di scalabilità, dal momento che la presenza della memoria condivisa non garantisce che la loro potenza di calcolo aumenti proporzionalmente all'aumentare dei nodi di elaborazione. I sistemi MPP sono invece costituiti da processori dotati di una propria memoria, in molti casi del tutto identici ai microprocessori che si trovano all'interno di PC e di workstation o stazioni di lavoro, e connessi tra di loro da reti di interconnessione opportunamente progettate per tale scopo. Rispetto ai sistemi a memoria condivisa, le architetture MPP presentano un più elevato grado di scalabilità: il fatto che in tali architetture la memoria non sia centralizzata ma distribuita all'interno di ogni nodo di elaborazione, rende infatti più semplice interconnettere un elevato numero di processori. Tuttavia, al fine di ottenere i benefici di un'architettura MPP, l'utente deve avere una profonda consapevolezza della natura multiprocessore dell'architettura globale, e ciò rende un sistema MPP indubbiamente più difficile da utilizzare e da programmare da parte degli utenti finali.
Cluster di calcolatori
A differenza degli e. ad alte prestazioni, i cluster di calcolatori non si basano su architetture specializzate o su processori dedicati, ma sono invece composti da un insieme di piccoli e. (PC o stazioni di lavoro), disponibili commercialmente, semplicemente collegati tramite una rete locale (LAN, Local Area Network). In questo modo, i cluster di calcolatori sono in grado di offrire una potenza di calcolo vicina a quella degli e. ad alte prestazioni, ma a costi che risultano sensibilmente inferiori. Un cluster viene configurato in modo tale da apparire all'esterno come un unico sistema, ossia come una singola risorsa di calcolo, e questa è forse la principale difficoltà nella progettazione e nella gestione delle applicazioni di comunicazione tra i singoli nodi del cluster, che non devono introdurre un ulteriore degrado delle prestazioni complessive. Rispetto a soluzioni basate sugli e. ad alte prestazioni, i cluster di calcolatori presentano migliori caratteristiche di scalabilità, in quanto le prestazioni totali del sistema aumentano più rapidamente con l'aumentare del numero dei nodi presenti nel cluster, anche se ovviamente cluster di calcolatori difficilmente riescono a ottenere prestazioni superiori a quelle dei sistemi ad alte prestazioni.
Griglie computazionali (grid computing)
In ambito scientifico e ingegneristico, la risoluzione di problemi particolarmente complessi richiede spesso il ricorso ad applicazioni molto esigenti in termini di risorse (tempo di CPU, Central Processing Unit, spazio su disco, ampiezza di banda). In molti casi, le organizzazioni che utilizzano tali applicazioni si trovano nella difficile situazione di non avere né le risorse né la disponibilità finanziaria necessarie per acquistarle. In alcune situazioni, pur potendo contare su disponibilità finanziarie, un'organizzazione potrebbe anche ritenere non conveniente l'acquisizione di tali risorse a causa della forte svalutazione dovuta alla rapida obsolescenza delle tecnologie o a causa degli alti costi delle competenze necessarie alla gestione di sofisticate risorse tecnologiche. Una possibile soluzione a questi problemi è quella di garantire la condivisione controllata e parziale di risorse tra un insieme di diverse organizzazioni, creando in pratica una nuova organizzazione virtuale: una tale organizzazione virtuale deve riuscire a garantire la condivisione di un parco complessivo di risorse di ampie dimensioni, ma in modo tale che ogni singola organizzazione mantenga sempre il controllo e la gestione delle proprie risorse, definendo in maniera chiara e univoca quali ritiene opportuno mettere a disposizione, a chi è concesso accedervi e in quali modalità. Le griglie computazionali sono nate proprio nella seconda metà degli anni Novanta del 20° sec. con l'obiettivo di creare un'infrastruttura tecnologica per la condivisione controllata delle risorse di calcolo in un'organizzazione virtuale.
Va ricordato che le tradizionali tecnologie per il calcolo distribuito non soddisfano in pieno tutti i requisiti delle organizzazioni virtuali. Per es., le tecnologie Internet consentono la comunicazione e lo scambio di informazioni tra sistemi di elaborazione, ma non forniscono un approccio integrato all'uso coordinato di risorse distribuite. Il modello di riferimento delle griglie computazionali, da cui deriva il loro nome, è quello delle reti elettriche di potenza, che sono in grado di rendere disponibile l'energia elettrica proprio là dove questa è necessaria: dopo la rivoluzione introdotta dalla scoperta dell'elettricità, furono proprio le centrali elettriche e lo sviluppo di tecnologie per la trasmissione e la distribuzione di elettricità che riuscirono a standardizzare, diffondere e rendere economico l'accesso all'energia elettrica. La filosofia delle griglie computazionali è molto simile: una volta disponibile una opportuna infrastruttura tecnologica, prodotta dalle continue rivoluzioni tecnologiche, una griglia computazionale consente all'utente di accedere alle risorse di un e. virtuale, potente, affidabile e adattabile alle sue esigenze. Un tale e. virtuale, in realtà, sarà costituito da molte risorse di calcolo distinte, distribuite in diverse locazioni geografiche, che non saranno visibili all'utente finale, esattamente come avviene per gli utenti di energia elettrica, che non sembrano avere alcuna necessità di sapere come e dove viene generata l'elettricità che loro consumano. Potremmo quindi definire una griglia computazionale come un'infrastruttura hardware e software in grado di fornire accesso a elevate capacità di calcolo, in modo affidabile, consistente, pervasivo, sicuro ed economico. L'affidabilità del servizio è fondamentale: all'utente finale deve essere infatti garantito un alto livello delle prestazioni da parte dei diversi nodi dell'infrastruttura a griglia. L'accesso deve inoltre essere consistente, nel senso che deve essere offerto tramite servizi standard, accessibili via interfacce standard, e sicuri per difendersi da accessi non autorizzati a dati e risorse che sono riservati.
Pur costituendo anch'esse un'architettura parallela e distribuita, a differenza degli e. ad alte prestazioni e dei cluster di calcolatori, le griglie computazionali consentono, in maniera totalmente dinamica, la condivisione, la selezione e l'aggregazione di risorse di calcolo autonome e distribuite in diverse località geografiche. La selezione dinamica delle risorse di calcolo in una griglia computazionale può avvenire in base a vari criteri, tra i quali si ricordano la disponibilità, le prestazioni, la capacità, il costo e la qualità del servizio offerta dalla singola risorsa. Un'altra importante differenza con i cluster di calcolatori risiede nel diverso modo in cui vengono gestite le risorse di calcolo. Nei cluster di calcolatori, infatti, l'allocazione delle risorse viene gestita in maniera completamente centralizzata da un'unica applicazione, che ha lo scopo di far apparire all'esterno il cluster come un unico sistema. Nelle griglie computazionali, invece, ogni nodo della griglia è responsabile di presentare e offrire all'esterno i propri servizi e le proprie risorse di calcolo.
Tra le principali applicazioni che hanno tratto e traggono beneficio delle architetture grid si citano sia alcune applicazioni scientifiche, come il supercalcolo distribuito, il calcolo a larga banda, il calcolo on-demand e il calcolo data intensive, sia alcune applicazioni commerciali di tipo enterprise, come, per es., sistemi di gestione (HP utility data center) e videogiochi. Le applicazioni di supercalcolo distribuito sono relative soprattutto a simulazioni accurate di sistemi complessi o di fenomeni fisici, che richiedono risoluzioni spaziali o temporali molto elevate. Aree di applicazione scientifica del supercalcolo distribuito includono la cosmologia, la meteorologia, la chimica e la fisica computazionale, e la biologia molecolare. In applicazioni di calcolo a larga banda il principale obiettivo è invece quello di sfruttare il potere di calcolo disponibile in sistemi di elaborazione sottoutilizzati (con processori idle). Utilizzando tecnologie grid, si riesce a rendere disponibili cicli macchina inutilizzati di e. distribuiti in diverse locazioni geografiche allo scopo di risolvere problemi notevolmente complessi: questo approccio è stato utilizzato, per es., dalla AMD (Advanced Micro Design) per la progettazione dei processori K6 e K7. Nelle applicazioni di calcolo on-demand si riesce invece a rendere disponibili, una tantum, risorse di calcolo che, per il loro utilizzo saltuario, non sarebbe né pratico né economicamente conveniente avere a disposizione localmente. Diversamente dal supercalcolo distribuito, le principali motivazioni del calcolo on-demand sono dettate dall'esigenza di ottenere un buon rapporto costo/prestazioni, piuttosto che dalla necessità di avere prestazioni elevate. Nelle applicazioni di calcolo data-intensive, l'attenzione è principalmente rivolta all'elaborazione di grandi quantità di dati distribuiti geograficamente: applicazioni che necessitano di questa tipologia di calcolo sono, per es., quelle relative all'astronomia, alla meteorologia, alla fisica delle alte energie e, infine, all'acquisizione e alla gestione di immagini satellitari.
Architetture P2P (Peer-to-Peer computing)
Queste architetture costituiscono in un certo senso la più naturale evoluzione delle architetture basate su cluster di calcolatori: anziché sfruttare le capacità di calcolo di un limitato numero di nodi di elaborazione collegati in una rete locale, esse sfruttano, infatti, tutte le possibilità offerte dai sistemi connessi su insiemi di reti geografiche, come, per es., Internet. Tali architetture hanno avuto una vasta diffusione soprattutto grazie all'enorme successo riscosso da applicazioni rivolte principalmente alla condivisione di file con contenuti multimediali. Anche se architetture P2P sono state oggetto di molte discussioni controverse, e alcune di esse hanno anche affrontato controversie legali per violazione dei diritti di autore, bisogna precisare che architetture P2P erano già state utilizzate da molti anni in diversi contesti, e appare già possibile anticipare che l'evoluzione tecnologica futura del paradigma P2P, e una sua possibile integrazione con altre architetture di elaborazione, sarà sicuramente alla base di nuovi sviluppi e di nuove applicazioni architetturali.
Anche se in un certo senso le architetture P2P condividono lo stesso obiettivo finale delle architetture grid, ossia consentire la condivisione di un elevato numero di risorse di calcolo distribuite, le due architetture si basano su contesti profondamente diversi. Nelle architetture grid, le risorse condivise sono permanenti e di alto livello, dato che sono messe a disposizione da gruppi che partecipano a un'organizzazione virtuale piuttosto che da singoli utenti finali. L'accesso a tali risorse è controllato per mezzo di servizi centralizzati o gerarchici, sulla base di precise regole definite dalle organizzazioni locali. Aspetti fondamentali per la sicurezza come l'autorizzazione, l'autenticazione e, quindi, l'identità dell'utente sono di fondamentale importanza per il controllo degli accessi alle risorse in ambiente grid. In ambito P2P, al contrario, le risorse condivise non sono permanenti e sono rese disponibili dall'utente finale con un controllo degli accessi spesso limitato (se non addirittura nullo). Le architetture P2P, infatti, in generale non contemplano forme di autenticazione e l'accesso alle risorse avviene spesso con modalità anonime. La natura dinamica delle architetture P2P e la variabilità delle risorse rese disponibili, soprattutto per quanto riguarda la banda di comunicazione, rendono i sistemi P2P più semplici da utilizzare ma meno affidabili dal punto di vista della continuità del servizio. Diversamente da altre architetture di elaborazione, come, per es., i cluster di calcolatori o le griglie computazionali, la filosofia alla base di una rete P2P è quella di garantire un rapporto alla pari tra tutti i nodi di elaborazione (nodi peer) partecipanti alla comunicazione: infatti, tutti i nodi peer hanno esattamente le stesse funzionalità e svolgono tutti i ruoli richiesti al fine di garantire i servizi messi a disposizione dall'architettura. In altri termini, ogni nodo peer mette a disposizione i propri servizi e allo stesso tempo usufruisce dei servizi offerti dagli altri nodi peer, consentendo di distribuire i costi (risorse di calcolo, spazio su disco, banda di comunicazione) tra tutti i nodi dell'architettura P2P. Questa filosofia è profondamente diversa dalle tradizionali architetture client-server, nelle quali esiste invece una separazione netta di ruoli tra il server, che mette a disposizione i suoi servizi, e i client che sono semplicemente i fruitori di tali servizi. Per tale ragione, le architetture P2P trovano la loro naturale applicazione in comunità aperte, dove i nodi peer possono aggregarsi liberamente per mettere a disposizione dati e risorse in proporzione alle proprie capacità.
Per illustrare il funzionamento delle principali architetture P2P, si descriveranno brevemente le modalità attraverso cui alcune architetture P2P, come Napster, Gnutella, KaZaa, sono in grado di assicurare la condivisione dei file. È importante precisare che la condivisone di file non è l'unica applicazione possibile di architetture P2P, le quali vengono attualmente utilizzate anche per applicazioni molto diverse, che includono i sistemi di web caching, sistemi di multicast per larga banda, e sistemi per la gestione di fonia su IP, Internet Protocol (VoIP, Voice over IP).
Nell'architettura di Napster, i file vengono immagazzinati localmente sui computer dei singoli utenti (nodi peer) e sono scambiati tramite connessioni dirette tra i nodi peer tramite protocolli simili al protocollo utilizzato sul web (HTTP, HyperText Transfer Protocol).
Tutti i nodi peer in Napster sono completamente simmetrici, e quindi in grado di svolgere sia le funzioni di client sia quelle di server: come client, possono richiedere un file e iniziarne la ricerca, mentre come server possono consentire il download di richieste di file da parte di altri client. L'architettura di Napster non è in realtà completamente P2P ma è ibrida, in quanto si basa su un servizio di directory centralizzato che consente l'allocazione e l'indicizzazione dei file: un cluster di server centrali ha il compito di gestire l'indice dei file condivisi dai peer attivi. Un nodo peer deve registrarsi presso questo indice centrale prima di ottenere un elenco dei file resi disponibili dagli altri peer. Quando un peer deve effettuare una richiesta, si collega a uno dei server dell'indice centrale, che gli restituisce un elenco dei peer che sono disponibili a condividere il file oggetto della richiesta. A questo punto, il peer che ha avviato la richiesta può iniziare lo scambio del file direttamente con il peer che possiede tale file e che è disponibile a metterlo in condivisione. Una delle principali limitazioni tecnologiche di Napster è proprio quella relativa al servizio d'indicizzazione centralizzata, che, oltre a costituire un punto di criticità e di vulnerabilità dell'intero sistema (single point of failure), rappresenta una limitazione intrinseca alla sua scalabilità, rendendo una tale architettura applicabile ragionevolmente soltanto a un numero non eccessivo di nodi di elaborazione.
Differentemente dai sistemi basati su Napster, i sistemi basati su Gnutella costituiscono un'architettura P2P pura, essendo decentralizzati sia in termini di indicizzazione sia di ricerca dei file. Gnutella, infatti, non possiede alcun sistema di indicizzazione centralizzato, ma è invece basato su una rete non strutturata di nodi peer, in cui ogni peer può avere un numero di connessioni con un insieme di altri peer conosciuti. Le connessioni, basate sul protocollo TCP (Transfer Control Protocol), sono utilizzate per scambiare messaggi tra nodi peer. Ogni nodo peer non solo funziona come client per generare richieste, e come nodo server per rispondere alle richieste di altri nodi peer, ma è anche in grado di instradare le comunicazioni tra coppie di altri nodi peer. Per partecipare all'architettura P2P, un nodo mantiene un insieme selezionato di indirizzi di altri nodi peer da contattare per iniziare la connessione. Tali nodi peer accettano le richieste di collegamento e informano il nuovo nodo entrante degli altri nodi peer correntemente disponibili nell'architettura. Dato che ogni nodo può entrare e uscire frequentemente, e a sua totale discrezione, dall'architettura P2P, esso controlla continuamente i propri collegamenti allo scopo di tenere aperte a ogni istante almeno un certo numero di connessioni, in base alla propria disponibilità di risorse. Per iniziare una richiesta, un nodo spedisce un messaggio a tutti i peer a cui è connesso. Se uno dei peer contattati possiede il file richiesto, spedisce un messaggio opportuno al peer richiedente, che può quindi iniziare il trasferimento del file tramite il protocollo HTTP. In ogni caso, ogni peer contattato provvede a inviare la richiesta del nodo origine ai nodi a cui il peer è a sua volta collegato, e per limitare il traffico ogni messaggio può essere spedito soltanto un numero limitato di volte. Gnutella rappresenta quindi un'architettura completamente P2P, dato che tratta tutti i nodi peer esattamente nella stessa maniera, indipendentemente dalla loro capacità di calcolo, di banda o da altre proprietà (come, per es., la loro affidabilità e disponibilità), anche se i nodi peer possono ovviamente avere caratteristiche estremamente eterogenee tra di loro. Tale eterogeneità è peraltro in grado di influenzare pesantemente la scalabilità, l'affidabilità della comunicazione, le prestazioni e la latenza del sistema: a riprova di questo, si può osservare che il modello architetturale di Gnutella andò in crisi proprio perché non riuscì a sostenere tutto il traffico generato dalla chiusura di Napster per violazione dei diritti di autore.
L'eterogeneità tra nodi peer è alla base dell'organizzazione a due livelli del protocollo FastTrack dell'architettura KaZaa. FastTrack è sostanzialmente basato su Gnutella, ma per migliorarne la scalabilità ne estende le funzionalità introducendo il concetto di supernodo: nell'architettura KaZaa esiste infatti un limitato numero di nodi (supernodi), più potenti degli altri, che sono deputati a gestire il traffico e l'instradamento in favore dei nodi più deboli a loro collegati. I supernodi sono scelti dinamicamente dai nodi peer, e inviano richieste a tutti gli altri nodi peer per localizzare i contenuti. Un nodo peer regolare si connette a uno o più supernodi per iniziare le sue richieste, comportandosi come un client per questi supernodi. Per garantire il collegamento iniziale, KaZaa codifica una lista di indirizzi IP di supernodi: un nodo peer tenta di contattare questi supernodi e, appena ne trova uno disponibile, gli richiede la lista dei supernodi correntemente attivi che saranno utilizzati per eventuali tentativi di connessione futura. Quando deve trovare un file, un nodo peer spedisce una richiesta al supernodo a cui è connesso: se tale supernodo possiede il file, lo comunica direttamente al peer in cui la richiesta ha avuto origine; altrimenti il supernodo comunica con gli altri supernodi per soddisfare la richiesta. Una volta identificato un nodo che contiene il file richiesto, il peer originale si connette direttamente al peer destinazione per scaricare il file tramite il protocollo HTTP.
bibliografia
I. Foster, C. Kesselman, The grid: blueprint for a new computing infrastructure, San Francisco 1999; I. Foster, C. Kesselman, S. Tuecke, The anatomy of the grid: enabling scalable virtual organization, in The international journal of high performance computing applications, 2001, 15, 3, pp. 200-02; H. Balakrishnan, M.F. Kaashoek, D. Karger et al., Looking up data in P2P systems, in Communications of the ACM, 2003, 46, 2, pp. 43-48.