Открыть сервисСервис

FIFO — принцип организации очередей данных

FIFO (от англ. First In, First Out — «первый вошёл, первый вышел») — принцип организации очередей данных, при котором элемент, помещённый в очередь первым, извлекается из неё также первым. Противоположный принцип — LIFO (Last In, First Out, «последний вошёл, последний вышел»), реализуемый стеком. Термин FIFO широко применяется в информатике, электронике, телекоммуникациях и теории очередей.

Основные сведения

FIFO описывает упорядоченную структуру данных, доступ к которой осуществляется с двух концов: запись производится в один конец («хвост»), чтение — из другого («голова»). Такая структура гарантирует сохранение порядка поступления элементов. Операции над очередью FIFO:

Простейшая реализация очереди FIFO на массиве требует сдвига всех элементов при каждом dequeue, что даёт сложность O(n). На связном списке операции enqueue и dequeue выполняются за O(1), однако требуют дополнительной памяти под хранение ссылок. Кольцевой буфер (циклический буфер) позволяет реализовать очередь FIFO на массиве с операциями O(1), используя два индекса — на голову и хвост.

Реализации в программировании

В стандартных библиотеках языков программирования FIFO-очереди реализованы в виде отдельных структур данных:

ЯзыкСтруктураПримечание
C++std::queue, std::dequeКонтейнер адаптер по умолчанию на std::deque
JavaQueue, ArrayDeque, LinkedListИнтерфейс Queue с реализациями
Pythoncollections.dequeДвусторонняя очередь, O(1) на обоих концах
C#Queue<T>Очередь на массиве с циклической адресацией
Goпакет container/listСвязный список, используется как очередь

В однопоточных программах FIFO-очереди применяются для обработки задач в порядке поступления: планировщики задач, очереди печати, буферы ввода-вывода. В многопоточных системах используются потокобезопасные очереди (например, BlockingQueue в Java, queue.Queue в Python), обеспечивающие синхронизацию доступа.

Применение в операционных системах

В операционных системах принцип FIFO лежит в основе планирования процессов. Планировщик с дисциплиной FIFO размещает готовые к выполнению процессы в очередь, и процессор выделяется процессу, находящемуся в очереди дольше остальных. Такой подход называется FCFS (First Come, First Served — «первый пришёл, первый обслужен»). Простота алгоритма сочетается с недостатком, известным как «эффект необслуживаемого процессора» (convoy effect): короткие задачи ожидают завершения длинных, что увеличивает среднее время ожидания.

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

FIFO в электронике и телекоммуникациях

В цифровой электронике FIFO-буферы (FIFO-память) используются для синхронизации потоков данных между устройствами с разной тактовой частотой или разной шириной шины данных. Классический пример — буфер между контроллером USB и периферийным устройством. FIFO-буферы реализуются на специализированных микросхемах (например, сериях 74HC, IDT) или на FPGA с помощью блоков памяти.

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

Ограничения

Прямолинейная реализация FIFO имеет ряд недостатков:

  • отсутствие приоритетов — срочная задача не может быть обработана раньше давней;
  • уязвимость к «затоплению» (flooding) — быстрое поступление элементов приводит к переполнению буфера;
  • в сетевых системах FIFO-очереди подвержены эффекту хвостовой задержки (bufferbloat), когда буферы, заполненные до предела, увеличивают время прохождения пакетов.

Для устранения этих недостатков применяются приоритетные очереди, кольцевые буферы с ограничением размера и алгоритмы управления переполнением (RED, WRED).

См. также

  • Стек (структура данных)
  • Кольцевой буфер
  • Планировщик процессов
  • Теория массового обслуживания

Источники

  • Кнут Д. «Структуры данных и их алгоритмы»
  • Таненбаум Э. «Современные операционные системы»
  • Корененко И. В. «Операционные системы»
  • Стандарты IEEE по архитектуре FIFO-буферов
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru