Круговой буфер

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

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

.

Содержание

  • 1 Обзор
  • 2 Использование
  • 3 Механика кругового буфера
  • 4 Оптимизация
  • 5 Элемент фиксированной длины и непрерывный блочный кольцевой буфер
  • 6 Ссылки
  • 7 Внешние ссылки

Обзор

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

Циклический буфер сначала пуст и имеет установить длину. На диаграмме ниже представлен 7-элементный буфер:

Круговой буфер - empty.svg

Предположим, что 1 записано в центре кругового буфера (точное начальное положение не имеет значения в круговом буфере:

Круговой буфер - XX1XXXX.svg

Затем предположим, что добавлены еще два элемента в круговой буфер - 2 и 3 - которые помещаются после 1:

Круговой буфер - XX123XX.svg

Если два элемента удаляются, два самых старых значения внутри кругового буфера будут удалены. Круглые буферы используют логику FIFO (First In, First Out). В примере 1 и 2 первыми вошли в круговой буфер, они были удалены первыми, оставив 3 внутри буфера.

Круговой буфер - XXXX3XX.svg

Если буфер имеет 7 элементов, то он полностью заполнен:

Круговой буфер - 6789345.svg

A Свойство кольцевого буфера заключается в том, что когда он заполнен и выполняется последующая запись, он начинает перезаписывать самые старые данные. В текущем примере добавляются еще два элемента - A и B, и они перезаписывают 3 и 4:

Круговой буфер - 6789AB5.svg

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

Наконец, если теперь удалить два элемента, то будет возвращено не 3 и 4, а 5 и 6, потому что A и B перезаписали 3 и 4, давая буфер с:

Круговой буфер - X789ABX.svg

Использует

Полезное свойство кольцевого буфера заключается в том, что ему не нужно перемешивать элементы, когда один из них израсходован. (Если бы использовался некруговой буфер, тогда было бы необходимо сдвинуть все элементы, когда один из них израсходован.) Другими словами, кольцевой буфер хорошо подходит как FIFO (First In, First Out), в то время как стандартный некруговой буфер хорошо подходит в качестве буфера LIFO (Last In, First Out).

Циклическая буферизация - хорошая стратегия реализации для очереди с фиксированным максимальным размером. Если для очереди будет принят максимальный размер, идеальной реализацией будет кольцевой буфер; все операции с очередью - постоянное время. Однако расширение кольцевого буфера требует сдвига памяти, что является сравнительно дорогостоящим. Для произвольно расширяющихся очередей может быть предпочтительнее использовать метод связанного списка.

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

Механизм циклического буфера

Кольцевой буфер может быть реализован с использованием четырех указателей или двух указателей и двух целых чисел:

  • начало буфера в памяти
  • конец буфера в памяти или емкость буфера
  • начало допустимых данных (индекс или указатель)
  • конец допустимых данных (индекс или указатель) или количество данных в текущий момент в буфере (целое число)

На этом изображении показан частично заполненный буфер:

Круговой буфер - XX123XX с указателями.svg

На этом изображении показан полный буфер с четырьмя перезаписанными элементами (номера от 1 до 4):

Круговой буфер - 6789AB5 с указателями.svg

Когда элемент перезаписывается, начальный указатель увеличивается до следующего элемента.

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

Когда буфер вместо этого предназначен для отслеживания количества вставленных элементов n, проверка на пустоту означает проверку n = 0, а проверка на полноту означает проверку того, равно ли n емкости.

Увеличение и уменьшение указатели адресов кольцевых буферов выполняются программно с использованием следующих формул модуля:

increment_address_one = (address + 1)% Length
Decment_address_one = (address + Length - 1)% Length

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

Оптимизация

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

Элемент с фиксированной длиной и кольцевой буфер непрерывного блока

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

В некоторых реализациях кольцевого буфера используются элементы фиксированной длины, превышающие 8-битные байты - 16-битные целые числа для звуковых буферов, 53-байтовые ячейки ATM для телекоммуникационных буферов и т. Д. Каждый элемент является смежным и имеет правильное выравнивание данных , поэтому программное обеспечение для чтения и записи этих значений может быть быстрее, чем программное обеспечение, которое обрабатывает несмежные и невыровненные значения.

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

Bip Buffer (двудольный буфер) очень похож на кольцевой буфер, за исключением того, что он всегда возвращает непрерывные блоки, которые могут быть переменной длины. Это предлагает почти все преимущества эффективности кольцевого буфера, сохраняя при этом возможность использования буфера в API, которые принимают только смежные блоки.

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

Ссылки

Внешние ссылки

Последняя правка сделана 2021-05-15 08:25:38
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте