Datastrukturer:

2. maj, 2019 – 4 min read

Foto af James Thomas på Unsplash

Har du nogensinde åbnet din computer og begyndt at skrive dit kodeord, bare for at se en stor forsinkelse i det, du skriver? Denne forsinkelse sker, når computerens processor vågner op og indser, at den skal begynde at hente data fra miniprocessoren i tastaturet. Men hvordan lagres disse oplysninger, hvis der kun er en lillebitte smule plads i tastaturets hukommelse?

Det er her, den cirkulære buffer kommer ind i billedet.

Den cirkulære buffer er en bestemt type kø. Hvis du nu ikke er bekendt med en kø, kender du den måske som en linje. (Som når du står i kø for at gå på toilettet.) Denne kø er en FIFO-struktur (first in, first out). Det betyder, at den første person, der kommer ind i køen, også er den første, der kommer ud. Hvad er så anderledes ved en cirkulær kø?

En cirkulær buffer gemmer data i et array af fast størrelse. Så når størrelsen er fastsat, og bufferen er fuld, vil det ældste element i bufferen blive skubbet ud, hvis der tilføjes flere data. Ved at lagre to pointere til strukturens for- og bagside er der ikke behov for dynamisk at manipulere arrayet.

Hvis bufferen er fuld, og du skal tilføje noget nyt, skal du blot indstille det listeelement, som den bageste pointer peger på, til det nye element og øge den bageste pointer med én. Front-pointeren vil nu pege på det senest tilføjede element.

Denne teknik til hukommelsesallokering har fordele, når du arbejder med mange data i realtid. Efterhånden som der tilføjes flere data til strukturen, fjernes de gamle data, så ingen data nogensinde skal flyttes. Som nævnt tidligere skifter pointerne blot positioner.

Nu skal vi tilbage til tastaturet og indtastningen af kodeordet. Alle dine tastetryk holdes i en cirkulær buffer. Så hvis du skrev hurtigt nok, ville du potentielt miste noget af det input, du modtog fra tastetrykkene.

En dårligt tegnet cirkulær bufferrestaurant.

For at hjælpe med at forestille os den cirkulære buffer, lad os bygge en automatiseret restaurant. Denne restaurant har et enkelt afhentningsvindue (bagerst i bufferen), hvor én kunde ad gangen kan afhente sit måltid (data). Bag vinduet er der et roterende, cirkulært bord, som rummer 8 måltider (bufferen). Der er også en lampe, som peger på forsiden af bordet (eller forsiden af bufferen). Hver gang et måltid tages fra vinduet, roterer bordet et sted med uret.

Når kokken er færdig med at tilberede et måltid, placerer han det et sted foran det sted, der er oplyst. Lyset skinner derefter på den nyligt placerede ret. Hvis bufferen er fuld, og et måltid er klar til at komme af komfuret, bliver måltidet ved vinduet smidt i skraldespanden. Bordet vil rotere, og det nye måltid vil blive placeret på den tomme plads.

Anvendelsestilfælde

En instruktør fortalte mig engang om et Augmented Reality-teknologifirma, der brugte en cirkulær buffer til at holde frames af de bevægelser, som brugeren indtastede. De optog bevægelsen af brugerens hånd- og kropsbevægelser og streamede den til en skærm i realtid. Hvis en bruger indtastede mange bevægelser i løbet af kort tid, blev bevægelserne lagret.

Når du spoler et par minutter tilbage i en streamingfilm eller et tv-program, er de tidligere frames blevet lagret i en cirkulær buffer, så de hurtigt kan tilgås. Hvis du spoler flere billeder tilbage, end der er gemt i bufferen, vil det tage længere tid at genindlæse de billeder, du søger efter.

Sammenfattende kan en cirkulær buffer være en god løsning, hvis du har brug for hurtig adgang til streamingdata, der allerede er blevet observeret eller brugt!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.