Un buffer circolare, detto anche buffer ciclico o buffer ad anello, è una struttura dati che usa un unico buffer di dimensione fissa come se fosse collegato da un'estremità all'altra.
Un buffer circolare all'inizio è vuoto e ha una lunghezza predefinita. Ad esempio, questo è un buffer di 7 elementi:
[ ][ ][ ][ ][ ][ ][ ]
Supponi che venga scritto il valore 1 al centro del buffer (la posizione iniziale esatta non ha importanza in un buffer circolare):
[ ][ ][ ][1][ ][ ][ ]
Poi supponi che vengano aggiunti altri due elementi, 2 e 3, che vengono accodati dopo il valore 1:
[ ][ ][ ][1][2][3][ ]
Se poi vengono rimossi due elementi dal buffer, vengono rimossi i valori più vecchi presenti nel buffer. I due elementi rimossi, in questo caso, sono 1 e 2, lasciando nel buffer solo il valore 3:
[ ][ ][ ][ ][ ][3][ ]
Se il buffer ha 7 elementi, allora è completamente pieno:
[5][6][7][8][9][3][4]
Quando il buffer è pieno, viene generato un errore che avvisa il client che ulteriori scritture sono bloccate finché non si libera uno slot.
Quando il buffer è pieno, il client può scegliere di sovrascrivere i dati più vecchi con una scrittura forzata. In questo caso, vengono aggiunti altri due elementi, A e B, che sovrascrivono i valori 3 e 4:
[5][6][7][8][9][A][B]
3 e 4 sono stati sostituiti da A e B, rendendo ora 5 il dato più vecchio nel buffer. Infine, se vengono rimossi due elementi, quelli restituiti sarebbero 5 e 6, ottenendo il buffer:
[ ][ ][7][8][9][A][B]
Poiché c'è spazio disponibile, se il client usa di nuovo la sovrascrittura per memorizzare C e D, verrà usato lo spazio in cui erano stati memorizzati 5 e 6, non la posizione di 7 e 8. 7 è ancora l'elemento più vecchio e il buffer è di nuovo pieno.
[C][D][7][8][9][A][B]
Per i casi di errore durante le operazioni, consulta la gerarchia delle classi di errore (class side) per scoprire come segnalare un'eccezione con il messaggio specificato.
Iscriviti a Exercism per imparare e padroneggiare Pharo con 50 esercizi e il mentoring di persone reali, tutto gratis.
In questo video daremo un'occhiata ai buffer circolari: cosa sono, dove vengono usati e le diverse implementazioni, tra cui code, array statici e dinamici, strutture dati immutabili e una divertente implementazione basata su agenti.