Циклічний буфер або кільцевий буфер — це структура даних, яка має фіксований розмір і використовується так ніби кінець буферу і початок замкнені в кільце, тобто при досягненні кінця буфера знов переміщуються в його початок. Така структура дає можливість здійснювати буферизацію потоків даних.
Застосування
Перевагою використання циклічного буфера є те, що при зчитуванні не потрібно переміщувати дані в буфері, тому що вказівник на поточну позицію переміщується сам. При використанні не кільцевих буферів було б необхідно переміщувати дані, коли його елементи стають непотрібними. Іншими словами кільцевий буфер добре застосовувати для реалізації буферу типу FIFO («перший прийшов — першим пішов»).
Циклічний буфер добре підходить для реалізації черг фіксованого розміру. Але якщо розмір черги є змінним, операція розширення кільцевого буфера є не ефективною, оскільки вимагає здійснення процедури переміщення пам'яті. В таких випадках краще використовувати зв'язаний список.
Такий тип буферу часто зустрічається при роботі з апаратним обладнанням та мікроконтролерами. При роботі з даними мультимедіа, обмежений циклічний буфер часто реалізує задачу постачальника-споживача, наприклад, при роботі зі звуковими картами. Карта зчитує для відтворення звуку дані з буфера з постійною швидкістю, в той час як постачальник (наприклад, аудіо-генератор) може перезаписувати старі дані.
Принцип роботи
В початковому стані буфер є пустим і має деяку визначену наперед довжину. Наприклад, так виглядає буфер для 7-ми елементів:
Допустимо, що в середину буфера в якійсь позиції записано значення 1 (конкретна початкова позиція не має значення для циклічного буферу):
Потім допустимо ми додали ще два елементи зі значеннями 2 і 3 — в позиції після значення 1:
Якщо необхідно видалити елементи з буферу, видалятимуться ті, що були записані раніше. Допустимо, що треба видалити два елементи, в такому випадку, значення 1 і 2 будуть видалені, а в буфері залишиться значення 3:
Якщо буфер містить 7 елементів тоді він є повністю заповненим:
Особливість кільцевого буфера полягає в тому, що коли він заповнений і відбувається новий запис даний, будуть перезаписані вже існуючі найстаріші елементи по колу. В такому випадку, два нових елементи — A і B — додаються і перезаписують значення 3 і 4:
Як альтернатива, ще одним із способів обробити ситуацію з заповненням буфера це запобігання перезапису шляхом повернення статусу помилки чи генерації винятку. Перезаписувати дані чи ні залишають на розсуд процедури або програмного додатку, які працюють з буфером.
І нарешті, якщо видалити два елементи то видалені будуть не комірки зі значеннями 3 і 4, а 5 і 6 оскільки A і B перезаписали значення 3 і 4 і буфер матиме наступний вміст:
Примітки
- www.alsa-project.org PCM Ring Buffer
Джерела
- Т. Кормен; Ч. Лейзерсон; Р. Рівест; К. Стайн (2009) [1990]. 10. Елементарні структури даних. Вступ до алгоритмів (вид. 3rd). MIT Press і McGraw-Hill. ISBN .
- CircularBuffer, Portland Pattern Repository
- Boost: Templated Circular Buffer Container
- http://www.dspguide.com/ch28/2.htm
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Ciklichnij bufer abo kilcevij bufer ce struktura danih yaka maye fiksovanij rozmir i vikoristovuyetsya tak nibi kinec buferu i pochatok zamkneni v kilce tobto pri dosyagnenni kincya bufera znov peremishuyutsya v jogo pochatok Taka struktura daye mozhlivist zdijsnyuvati buferizaciyu potokiv danih Ciklichnij buferZastosuvannyaPerevagoyu vikoristannya ciklichnogo bufera ye te sho pri zchituvanni ne potribno peremishuvati dani v buferi tomu sho vkazivnik na potochnu poziciyu peremishuyetsya sam Pri vikoristanni ne kilcevih buferiv bulo b neobhidno peremishuvati dani koli jogo elementi stayut nepotribnimi Inshimi slovami kilcevij bufer dobre zastosovuvati dlya realizaciyi buferu tipu FIFO pershij prijshov pershim pishov Ciklichnij bufer dobre pidhodit dlya realizaciyi cherg fiksovanogo rozmiru Ale yaksho rozmir chergi ye zminnim operaciya rozshirennya kilcevogo bufera ye ne efektivnoyu oskilki vimagaye zdijsnennya proceduri peremishennya pam yati V takih vipadkah krashe vikoristovuvati zv yazanij spisok Takij tip buferu chasto zustrichayetsya pri roboti z aparatnim obladnannyam ta mikrokontrolerami Pri roboti z danimi multimedia obmezhenij ciklichnij bufer chasto realizuye zadachu postachalnika spozhivacha napriklad pri roboti zi zvukovimi kartami Karta zchituye dlya vidtvorennya zvuku dani z bufera z postijnoyu shvidkistyu v toj chas yak postachalnik napriklad audio generator mozhe perezapisuvati stari dani Princip robotiV pochatkovomu stani bufer ye pustim i maye deyaku viznachenu napered dovzhinu Napriklad tak viglyadaye bufer dlya 7 mi elementiv Dopustimo sho v seredinu bufera v yakijs poziciyi zapisano znachennya 1 konkretna pochatkova poziciya ne maye znachennya dlya ciklichnogo buferu Potim dopustimo mi dodali she dva elementi zi znachennyami 2 i 3 v poziciyi pislya znachennya 1 Yaksho neobhidno vidaliti elementi z buferu vidalyatimutsya ti sho buli zapisani ranishe Dopustimo sho treba vidaliti dva elementi v takomu vipadku znachennya 1 i 2 budut vidaleni a v buferi zalishitsya znachennya 3 Yaksho bufer mistit 7 elementiv todi vin ye povnistyu zapovnenim Osoblivist kilcevogo bufera polyagaye v tomu sho koli vin zapovnenij i vidbuvayetsya novij zapis danij budut perezapisani vzhe isnuyuchi najstarishi elementi po kolu V takomu vipadku dva novih elementi A i B dodayutsya i perezapisuyut znachennya 3 i 4 Yak alternativa she odnim iz sposobiv obrobiti situaciyu z zapovnennyam bufera ce zapobigannya perezapisu shlyahom povernennya statusu pomilki chi generaciyi vinyatku Perezapisuvati dani chi ni zalishayut na rozsud proceduri abo programnogo dodatku yaki pracyuyut z buferom I nareshti yaksho vidaliti dva elementi to vidaleni budut ne komirki zi znachennyami 3 i 4 a 5 i 6 oskilki A i B perezapisali znachennya 3 i 4 i bufer matime nastupnij vmist Primitkiwww alsa project org PCM Ring BufferDzherelaT Kormen Ch Lejzerson R Rivest K Stajn 2009 1990 10 Elementarni strukturi danih Vstup do algoritmiv vid 3rd MIT Press i McGraw Hill ISBN 0 262 03384 4 CircularBuffer Portland Pattern Repository Boost Templated Circular Buffer Container http www dspguide com ch28 2 htm