In campo informatico con il termine buffer (o data buffer) ci si riferisce alla regione di un supporto di memoria utilizzata per contenere temporaneamente dei dati mentre questi vengono trasferiti tra un “agente” (sia esso hardware o software) e l'altro del computer. Il buffer entra in gioco nel caso di due componenti hardware che lavorano a velocità differenti (il processore e una qualsiasi periferica, ad esempio) o quando due software con priorità differente (un processo del sistema operativo e un processo di un programma “secondario”, ad esempio) devono mettersi in comunicazione l'uno con l'altro. In casi come questi, il buffering (ovvero l'azione di caricare i dati nella memoria di buffer) permette di accorciare i tempi di esecuzione dell'operazione ed evitare che si perda del tempo prezioso. Proprio per questo, solitamente il buffer è ospitato dalla memoria RAM, che garantisce tempi di risposta e di accesso più veloci rispetto a quelle di un hard disk magnetico. Per evitare di andare “fuori giri”, il buffering è gestito tramite algoritmi FIFO (acronimo di “first in, first out”, traducibile con “primo ad entrare, primo ad uscire”) che permettono di adottare differenti tempistiche di scrittura e lettura dei dati all'interno della memoria.
Buffer hardware e buffer software
Il buffer può essere implementato e gestito sia a livello hardware (prevedendo, all'interno del supporto di memoria, dei circuiti dedicati ad ospitare dei dati di buffering) sia a livello software (è il programma a individuare la porzione di memoria di buffer e gestire il flusso di dati in ingresso e uscita). Anche se nei moderni sistemi informatici è possibile scegliere entrambe le soluzioni, la gestione software è di gran lunga la più utilizzata: oltre a offrire un'implementazione e una gestione più semplice, infatti, garantisce performance migliori rispetto all'implementazione hardware del buffer.
Applicazioni
La memoria di buffer può trovare applicazione nelle operazioni più disparate.
Prima di tutto, è utilizzata nella comunicazione tra componenti informatiche che lavorano a velocità differenti (basta pensare, ad esempio, alla velocità di elaborazione del processore e la velocità di acquisizione delle informazioni di una tastiera o di uno scanner). Il buffering, infatti, impedisce che ci siano dei tempi morti nell'esecuzione di istruzioni e processi da parte del processore a causa della lentezza di qualche periferica di input e output. La stampa di un qualunque documento o la masterizzazione di un CD sono esempi paradigmatici del funzionamento del buffer. Il processore elabora i dati da stampare (o masterizzare) e li appoggia sulla memoria di buffering, potendo così continuare a lavorare su un altro processo senza doversi preoccupare dei tempi di avvio e di lavoro della stampante o del masterizzatore. La periferica, infatti, andrà a pescare i dati direttamente nella memoria di buffer, senza dover disturbare ulteriormente il processore.
Nel networking, invece, il buffering sopperisce alla latenza tipica delle comunicazioni di rete. Nel caso in cui due nodi di una rete devono scambiare una grande quantità di dati, potrebbero essere costretti ad accedere alla memoria di buffer: ciò permette di “trattenere” i dati sino a quando il canale di comunicazione non sarà libero e disponibile per mettere in comunicazione i due dispositivi. Questa tecnica assume un'importanza fondamentale per gli hub di rete: nel caso in cui i dati da gestire e inviare eccedano le capacità della rete l'hub accederà alla memoria di buffer, che si occuperà di smaltire la coda non appena il canale di comunicazione prescelto sarà liberamente utilizzabile. Nel caso dello streaming di dati multimediali, invece, il buffering assolve a compiti differenti: l'applicativo web (ad esempio un client per la riproduzione di filmati) caricherà una parte dei dati prima che la riproduzione abbia inizio. In questo modo, anche se il flusso dei dati dovesse interrompersi per una frazione di secondi, la visione del filmato continuerà senza accusare problemi di alcun genere.