Datastrukturer:

2 maj, 2019 – 4 min read

Foto av James Thomas på Unsplash

Har du någonsin öppnat din dator och börjat skriva ditt lösenord bara för att se en stor fördröjning i det du skriver? Denna fördröjning inträffar när datorprocessorn vaknar upp och inser att den måste börja hämta data från miniprocessorn i tangentbordet. Men hur lagras denna information om det bara finns en liten bit utrymme i tangentbordets minne?

Det är här som den cirkulära bufferten kommer in.

Den cirkulära bufferten är en viss typ av kö. Om du inte är bekant med en kö känner du kanske till den som en linje. (Som när du står i kö för att gå på toaletten.) Den här kön är en FIFO-struktur (first in, first out). Det innebär att den första personen som kommer in i kön är den första som går ut. Så vad är annorlunda med en cirkulär kö?

En cirkulär buffert lagrar data i en array med fast storlek. Så när storleken är inställd och bufferten är full kommer det äldsta objektet i bufferten att skjutas ut om mer data läggs till. Genom att lagra två pekare till strukturens framsida och baksida finns det inget behov av att dynamiskt manipulera matrisen.

Och om bufferten är full och du behöver lägga till något nytt, sätter du helt enkelt listobjektet som pekas på av baksidespekaren till det nya objektet och ökar baksidespekaren med ett. Den främre pekar nu på det senast tillagda objektet.

Denna teknik för minnesallokering har fördelar när du arbetar med mycket data i realtid. När fler data läggs till i strukturen kommer de gamla data att tas bort så att inga data någonsin behöver flyttas. Som tidigare nämnts flyttar pekarna bara positionerna.

Nu ska vi återgå till tangentbordet och inmatningen av lösenordet. Alla dina tangenttryckningar hålls i en cirkulär buffert. Så om du skriver tillräckligt snabbt kan du potentiellt förlora en del av den inmatning som tas emot från tangenttryckningarna.

En dåligt ritad cirkelbuffertrestaurang.

För att hjälpa till att föreställa oss den cirkulära bufferten, låt oss bygga en automatiserad restaurang. Denna restaurang har ett enda hämtningsfönster (baksidan av bufferten) där en kund i taget kan hämta sin måltid (uppgifterna). Bakom fönstret finns ett roterande, cirkulärt bord som rymmer 8 måltider (bufferten). Det finns också en lampa som pekar mot bordets framsida (eller buffertens framsida). Varje gång en måltid tas från fönstret roterar bordet medurs en punkt.

När kocken har lagat en måltid färdigt placerar han den en punkt framför den plats som är upplyst. Ljuset lyser då på den nyligen placerade maträtten. Om bufferten är full och en måltid är redo att komma från spisen, dumpas måltiden vid fönstret i papperskorgen. Bordet roterar och den nya måltiden placeras på den tomma platsen.

Användningsfall

En instruktör berättade en gång för mig om ett teknikföretag för förstärkt verklighet som använde en cirkulär buffert för att hålla ramar av de rörelser som användaren matar in. De spelade in användarens hand- och kroppsrörelser och strömmade dem till en bildskärm i realtid. Om en användare gjorde många rörelser på kort tid lagrades rörelserna.

När du spolar tillbaka några minuter av en strömmad film eller tv-sändning har de tidigare bilderna lagrats i en cirkulär buffert så att du snabbt kan få tillgång till dem. Om du spolar tillbaka fler bilder än vad som lagras i bufferten tar det längre tid att ladda om de bilder du söker efter.

Slutsatsen är att om du snabbt behöver få tillgång till strömmande data som redan har observerats eller använts, kan en cirkulär buffert vara en bra lösning!

Lämna ett svar

Din e-postadress kommer inte publiceras.