Data Structures: Your Quick Intro to Circular Buffers

2 mei, 2019 – 4 min read

Foto door James Thomas op Unsplash

Heeft u ooit uw computer geopend en bent u begonnen met het typen van uw wachtwoord om vervolgens een grote vertraging te zien in wat u aan het typen bent? Deze vertraging treedt op wanneer de computerprocessor wakker wordt en beseft dat hij gegevens moet ophalen bij de miniprocessor in het toetsenbord. Maar hoe wordt deze informatie opgeslagen als er maar een heel klein beetje ruimte is in het geheugen van het toetsenbord?

Dit is waar de circulaire buffer om de hoek komt kijken.

De circulaire buffer is een bepaald type wachtrij. Als je niet bekend bent met een wachtrij, dan ken je het misschien als een rij. (Zoals wanneer je in de rij staat om naar het toilet te gaan.) Deze wachtrij is een FIFO (first in, first out) structuur. Dat betekent dat de eerste die een rij binnenkomt, ook de eerste is die de rij weer verlaat. Wat is er dan anders aan een circulaire wachtrij?

Een circulaire buffer slaat gegevens op in een array met een vaste grootte. Dus als de grootte eenmaal is ingesteld en de buffer vol is, zal het oudste item in de buffer worden weggedrukt als er meer gegevens worden toegevoegd. Door twee aanwijzers op te slaan naar de voor- en achterkant van de structuur, is het niet nodig om de array dynamisch te manipuleren.

Als de buffer echter vol is en u iets nieuws moet toevoegen, zet u eenvoudig het lijst-item waarnaar de achter-aanwijzer wijst op het nieuwe item en verhoogt u de achter-aanwijzer met één. De voorste zal nu wijzen naar het meest recent toegevoegde item.

Deze techniek van geheugentoewijzing heeft voordelen wanneer u werkt met veel gegevens in real time. Als er meer gegevens aan de structuur worden toegevoegd, worden de oude gegevens verwijderd, zodat er nooit gegevens hoeven te worden verschoven. Zoals eerder gezegd, de pointers verschuiven alleen posities.

Nu om terug te komen op uw toetsenbord en wachtwoordinvoer. Al uw toetsaanslagen worden bewaard in een cirkelvormige buffer. Dus als u snel genoeg typt, zou u mogelijk een deel van de invoer van de toetsaanslagen verliezen.

Een slecht getekend cirkelvormig bufferrestaurant.

Om u een idee te geven van de cirkelvormige buffer, laten we een geautomatiseerd restaurant bouwen. Dit restaurant heeft een enkel afhaalraam (de achterkant van de buffer) waar één klant tegelijk zijn maaltijd kan afhalen (de gegevens). Achter het raam staat een draaiende, ronde tafel waarop 8 maaltijden staan (de buffer). Er is ook een lampje dat naar de voorkant van de tafel (of de voorkant van de buffer) wijst. Telkens wanneer een maaltijd uit het raam wordt gehaald, draait de tafel één plaats met de klok mee.

Wanneer de kok klaar is met het koken van een maaltijd, plaatst hij deze één plaats voor de verlichte plaats. Het licht schijnt dan op het nieuw geplaatste gerecht. Als de buffer vol is en een maaltijd klaar staat om van het fornuis te komen, wordt de maaltijd bij het raam in de prullenbak gegooid. De tafel zal draaien, en de nieuwe maaltijd zal op de lege plek worden geplaatst.

Use Cases

Een instructeur vertelde me eens over een augmented reality tech bedrijf dat een cirkelvormige buffer gebruikte om frames van de bewegingen die door de gebruiker werden ingevoerd vast te houden. Ze registreerden de bewegingen van de hand- en lichaamsbewegingen van de gebruiker en streamden die in realtime naar een display. Als een gebruiker in korte tijd veel bewegingen invoerde, zouden de bewegingen worden opgeslagen.

Wanneer u een paar minuten terugspoelt van een streaming film of tv-show, zijn die vorige frames opgeslagen in een cirkelvormige buffer, zodat ze snel toegankelijk zijn. Als u meer frames terugspoelt dan in de buffer zijn opgeslagen, zal het meer tijd kosten om de frames die u zoekt opnieuw te laden.

Concluderend, als u snel toegang moet krijgen tot streaminggegevens die al zijn waargenomen of gebruikt, kan een cirkelvormige buffer een goede oplossing zijn!

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.