Введение

Состояние, возникающее при чтении из пустого буфера.

В вычислительной технике, недостаток данных в буфере (buffer underrun) или опустошение буфера (buffer underflow) – это состояние, возникающее, когда буфер, используемый для обмена данными между двумя устройствами или процессами, заполняется данными с меньшей скоростью, чем скорость их чтения из него. Этот термин отличается от переполнения буфера (buffer overflow) – состояния, при котором часть памяти выделена под буфер фиксированного размера, но в него записывается больше данных, чем он может вместить. Это требует, чтобы программа или устройство, читающее из буфера, приостанавливало обработку до тех пор, пока буфер не будет заполнен. Это может приводить к нежелательным и иногда серьезным последствиям, поскольку данные в буфере обычно не предназначены для прерывистого доступа. В контексте параллельного программирования, недостаток данных в буфере можно рассматривать как форму нехватки ресурсов. Термины buffer underrun и buffer underflow также используются для обозначения ошибки записи за границы буфера (buffer underwrite) – состояния, аналогичного переполнению буфера, но при котором программа обманом заставляет себя записывать данные до начала буфера, перезаписывая потенциально хранящиеся там данные, например, биты разрешений.

Общие причины и решения

Недостаток данных в буфере часто является следствием временных проблем со связью, для которой используется буферизация: это может быть связь между двумя процессами, конкурирующими за процессорное время, или физическое соединение, где устройства конкурируют за полосу пропускания. Самый простой способ защиты от таких проблем – увеличить размер буфера. Если входящий поток данных необходимо считывать со скоростью 1 бит в секунду, буфер размером 10 бит позволит соединению быть заблокированным до 10 секунд до сбоя, в то время как буфер в 60 бит позволит блокировке до минуты. Однако это требует больше памяти для процесса или устройства, что может быть затратно. Предполагается, что буфер изначально заполнен – что может потребовать значительной паузы перед началом процесса чтения – и что он останется заполненным, если соединение не заблокировано. Если данные поступают в среднем не быстрее, чем требуются, любые блокировки соединения будут накапливаться; "потеря" одного бита каждую минуту на гипотетическом соединении с буфером в 60 бит приведет к недостатку данных в буфере, если соединение останется активным в течение часа. В приложениях реального времени большой размер буфера также увеличивает задержку между вводом и выводом, что нежелательно в приложениях с низкой задержкой, таких как видеоконференции.

Проблемы с записью CD и DVD

Недостаток данных в буфере может вызвать серьезные проблемы при записи CD/DVD, поскольку после начала записи её нельзя остановить и безупречно возобновить; таким образом, пауза, необходимая при недостатке данных, может привести к повреждению данных на диске. Поскольку буфер обычно заполняется из относительно медленного источника, такого как жесткий диск или другой CD/DVD, высокая загрузка процессора или памяти другими параллельными задачами может легко исчерпать емкость небольшого буфера. Поэтому различные производители CD/DVD-приводов реализовали технологию защиты от недостатка данных в буфере (Buffer Underrun Protection) под разными торговыми марками, такими как Plextor BurnProof, Nero UltraBuffer, Yamaha SafeBurn, JustLink и Seamless Link. Эта технология позволяет лазеру останавливать запись на любое время и возобновлять её, когда буфер снова заполнится. Интервал между последовательными записями крайне мал. Другой способ защиты от этой проблемы при использовании перезаписываемых носителей (CD-RW, DVD-RW, DVD-RAM) – использование файловой системы UDF, которая организует данные в небольшие "пакеты", адресуемые единой обновляемой таблицей адресов, что позволяет записывать их короткими сериями.

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

Если буфер фреймбуфера графического контроллера не обновляется, изображение на экране компьютера будет зависать, пока буфер не получит новые данные. Многие видеоплееры (например, MPlayer) имеют функцию пропуска кадров при перегрузке системы, намеренно допуская недополнение буфера для поддержания темпа воспроизведения. Буфер в аудиоконтроллере представляет собой кольцевой буфер. В случае недополнения буфера, если аудиоконтроллер не остановлен, он либо будет повторять звук, содержащийся в буфере, либо выдавать тишину, в зависимости от реализации. Этот эффект обычно называют "пулеметной очередью" или эффектом прерывистого звучания, как у Max Headroom. Это происходит, если операционная система зависает во время воспроизведения звука. Программа обработки ошибок (например, синий экран смерти) в конечном итоге может остановить аудиоконтроллер. Намеренное воспроизведение этого звукового сбоя при создании музыки или звукового искусства, будь то ручное склеивание аудио или повторный запуск сэмплов, или использование плагинов, называется Stutter Edit.