Подтвердить что ты не робот

Каковы применения кругового буфера?

Каковы некоторые из способов использования циклического буфера?

В чем преимущества использования циклического буфера?

является ли это альтернативой двойному связанному списку?

4b9b3361

Ответ 1

Я использовал его для журнала в памяти с ограниченным размером. Например, приложение будет записывать записи журнала при обработке запросов пользователей. Всякий раз, когда происходит исключение (которое было бы разрушительным для обработки), записи журнала в настоящее время в памяти будут сбрасываться вместе с ним.

Преимущество кругового буфера заключается в том, что вам не требуется бесконечное количество памяти, поскольку более старые записи автоматически переопределяются. "Challange" - это то, что вам нужно найти подходящий размер для вашего использования. В приведенном выше примере было бы очень неудачно, если запись журнала с самой важной информацией об исключении была бы уже переопределена.

В некоторых системах/приложениях есть инструменты, позволяющие вам извлекать текущее содержимое буфера по требованию, а не только когда он будет автоматически извлекаться (если когда-либо).

Я верю ETW и CLR журнал напряжений, среди многих других системных ядер или высокопроизводительных трасс/протоколирования реализованы таким образом.

Концепция использования таких буферов для трассировки/регистрации в памяти на самом деле довольно распространена (не говоря уже о том, что это единственное использование - конечно же, нет), поскольку она быстрее, чем записи в файл/базу данных, которые вы возможно, никогда не будет интересоваться, если не возникнет ошибка. И в связи с этим примечание сохраняет пространство жесткого диска.

Ответ 2

Циклические буферы хороши для последовательных потоков данных во встроенных системах. Микроконтроллеры часто имеют UART для обработки последовательного байта, их нужно хранить в порядке и обрабатывать позже (байты часто поступают быстрее, чем их можно обрабатывать).

Буфер эффективно расщепляет требуемый хронометражский ответ (когда байты входят в микросекундах) к некритическому отклику на все сообщение (например, отображая сообщение, которое входило в миллисекундах), например:

1) После получения байта UART может генерировать прерывание, на которое программное обеспечение реагирует, быстро принимая полученный байт и выталкивая его в конец буфера.

2) Программные программы фонового программного обеспечения могут затем регулярно проверять, есть ли у него что-нибудь в этом буфере, и при необходимости очистить его.

Поскольку размер кругового буфера может быть определен как предварительная компиляция, размер тогда ограничен. Это помогает повысить эффективность использования пространства и устраняет повреждение памяти при компромиссе с тем, сколько байтов может быть получено до того, как данные начнут теряться.

Ответ 3

Я знаю, что это обман, но у википедии есть очень хорошее объяснение.

http://en.wikipedia.org/wiki/Circular_buffer

Круговой буфер, циклический буфер или кольцевой буфер представляет собой структуру данных, которая использует один буфер фиксированного размера, как если бы он был подключен от конца к концу. Эта структура легко поддается буферизации потоков данных

Пример, который мог бы использовать перезапись кругового буфера с мультимедиа. Если буфер используется как ограниченный буфер в проблема производителя-потребителя, то это вероятно, желательный для производителя (например, звуковой генератор), чтобы перезаписывать старые данные, если потребитель (например, звуковая карта) не может на мгновение. Другой пример представляет собой цифровой волноводный синтез метод, который использует циклические буферы для эффективно имитировать звук вибрационные струны или духовые инструменты.

Что касается сравнения с списками с двойной связью, я полагаю, что это действительно зависит от того, что вы используете в списке... Реализация буферных буферов кажется более сложной, пожалуйста (снова) ссылайтесь на страницу вики; это объясняет реализацию, соображения и т.д., а также показывает пример кода.

Спасибо, Нейл

Ответ 4

Круговой буфер является хорошим механизмом для эффективного поддержания скользящего/перемещающегося списка значений/элементов упорядоченным способом. Одним из примеров может служить сохранение скользящего среднего из последних N элементов. Предположим, вы хотите отслеживать среднюю стоимость последних 100 операций вычисления некоторой стоимости. Для этого вам нужно будет удалить самую старую стоимость и добавить самую новую стоимость.

Без кругового буфера дорогостоящий механизм для этого (стиль C) должен состоять из массива из 100 элементов. Каждый раз, когда вычисляется новая стоимость, вы можете переместить 99 элементов вниз и поместить новый в последнюю позицию. Это, очевидно, дорого. Используя идею циклического буфера, вы просто отслеживаете "конец" буфера (позиция 0-99). Это означало бы положение самой старой (или самой новой... какой бы вы ни выбрали) стоимости. После прочтения старого значения (для обновления среднего значения) вы заменяете его самым новым значением и увеличиваете положение буфера (если оно равно 99, вы возвращаете его на 0... таким образом, круглая часть).

Сравнение его с двусвязным списком действительно не имеет смысла. Круговой буфер, безусловно, может быть реализован с двусвязным списком (или даже с одиночным списком). Но сравнивать их немного похоже на сравнение яблок и апельсинов, так сказать.

Ответ 5

Я использовал его как простой способ реализации циклического планирования. В основном у меня было множество различных объектов, которые могут создавать ценность, которую потребитель мог бы обработать. Я застрял всех продюсеров на ринге и спросил каждого по очереди.

Ответ 6

Я использовал кольцевой буфер в многопоточном коде. В принципе, если все слоты заполнены, продюсер должен ждать. Потребители просто обрабатывают элементы в слотах, которые являются "полными".

Вот поток, который я начал на нем. Он имеет несколько хороших советов по реализации.

Доступ к переменной с несколькими потоками .NET