FIFO
FIFO (акроним от англ. First In, First Out — «первым пришёл — первым ушёл») — это метод организации и манипулирования данными, при котором первый поступивший элемент обрабатывается или обслуживается в первую очередь. FIFO является базовым принципом построения очередей (queue) — одной из фундаментальных структур данных в информатике и теории массового обслуживания. В более широком смысле термин применяется в бухгалтерском учёте для обозначения метода списания товарно-материальных ценностей, а также в логистике и управлении запасами.
История и происхождение
Принцип «первым пришёл — первым обслужен» является одним из древнейших организационных правил человеческого общества. В неформальном виде он существовал задолго до появления термина: в очередях за товарами, в порядке приёма пациентов, в работе конвейерных линий. Формализация FIFO как алгоритма произошла в середине XX века с развитием теории очередей (А. К. Эрланг, 1909—1917) и компьютерных наук. В 1940—1950-х годах, при создании первых электронных вычислительных машин (например, EDVAC и UNIVAC), возникла необходимость в структурах данных для временного хранения последовательно поступающих команд и данных. Именно тогда очередь FIFO стала стандартной абстракцией.
В бухгалтерском учёте метод FIFO был впервые кодифицирован в США в 1930-х годах как один из допустимых способов оценки запасов, а впоследствии закреплён в международных стандартах финансовой отчётности (МСФО) и российских ПБУ.
FIFO в информатике
Определение и структура
В программировании FIFO — это абстрактный тип данных (АТД) «очередь», поддерживающий две основные операции:
- enqueue (или push) — добавление элемента в конец очереди;
- dequeue (или pop) — удаление элемента из начала очереди.
Дополнительно часто реализуются операции peek (просмотр первого элемента без удаления) и isEmpty (проверка пустоты очереди). В отличие от стека (LIFO), где последний добавленный элемент удаляется первым, в очереди FIFO порядок выхода строго соответствует порядку входа.
Реализации
Очередь FIFO может быть реализована несколькими способами:
- На основе массива (кольцевой буфер): используется фиксированный массив с двумя указателями (head и tail). При заполнении массива указатель tail «заворачивается» в начало, что позволяет эффективно использовать память. Недостаток — ограниченный размер.
- На основе связного списка: каждый элемент хранит ссылку на следующий. Добавление и удаление выполняются за O(1), но требуется дополнительная память под указатели.
- На основе двух стеков: классический трюк для языков, где нет встроенной очереди (например, в функциональных языках). Один стек служит для добавления, другой — для удаления, с перекладыванием элементов при опустошении второго.
Примеры использования
- Планирование процессов в операционных системах: алгоритм FCFS (First-Come, First-Served) — простейший планировщик, где процессы выполняются в порядке поступления.
- Буферизация данных: в сетевых протоколах (например, TCP/IP) пакеты помещаются в очередь FIFO для передачи по каналу.
- Обработка событий: в графических интерфейсах события мыши и клавиатуры ставятся в очередь и обрабатываются последовательно.
- Асинхронное программирование: очереди сообщений (message queues) в микросервисной архитектуре (RabbitMQ, Apache Kafka) работают по принципу FIFO, хотя часто допускают приоритетное исключение.
Ограничения
FIFO не учитывает приоритеты задач. Если в системе есть срочные и несрочные процессы, строгий FIFO может привести к тому, что важная задача будет ждать завершения длительной, но неважной. Для решения этой проблемы применяются очереди с приоритетами (priority queue) или многоуровневые очереди обратной связи (MLFQ).
FIFO в бухгалтерском учёте
Метод FIFO (ФИФО) — способ оценки себестоимости материально-производственных запасов (МПЗ) при их выбытии (продаже, передаче в производство). Согласно этому методу, запасы, поступившие первыми, списываются первыми. Оценка остатка на конец периода производится по стоимости последних по времени приобретений.
Принцип расчёта
Предположим, компания купила три партии товара:
- 10 единиц по 100 руб.;
- 20 единиц по 110 руб.;
- 15 единиц по 120 руб.
При продаже 25 единиц по методу FIFO сначала спишутся 10 единиц из первой партии (по 100 руб.) и 15 единиц из второй (по 110 руб.). Себестоимость продажи составит: 10×100 + 15×110 = 2650 руб. Остаток: 5 единиц из второй партии (по 110 руб.) и 15 единиц из третьей (по 120 руб.) — итого 20 единиц на сумму 2350 руб.
Преимущества и недостатки
- Преимущества: в условиях инфляции FIFO даёт более низкую себестоимость и, следовательно, более высокую прибыль по сравнению с методом LIFO (Last In, First Out), который в России запрещён с 2008 года. Оценка остатков близка к текущим рыночным ценам.
- Недостатки: при росте цен компания платит больше налога на прибыль, так как прибыль оказывается завышенной. Кроме того, метод требует ведения партионного учёта, что усложняет учёт при большом ассортименте.
В российском бухгалтерском учёте метод FIFO применяется в соответствии с ПБУ 5/01 «Учёт материально-производственных запасов» и ФСБУ 5/2019. В международной практике (МСФО (IAS) 2) FIFO является одним из двух разрешённых методов (наряду со средневзвешенной стоимостью).
FIFO в логистике и управлении запасами
В складской логистике принцип FIFO означает, что товары, поступившие на склад раньше, должны отгружаться раньше. Это особенно важно для скоропортящихся продуктов (продукты питания, лекарства, химикаты с ограниченным сроком годности). Для реализации FIFO на складе применяются специальные системы хранения:
- Проходные стеллажи (drive-through): загрузка с одной стороны, выгрузка с другой.
- Стеллажи гравитационного типа (flow rack): паллеты скатываются по наклонным рельсам от зоны приёмки к зоне отгрузки.
- Автоматизированные системы с адресным хранением и WMS (Warehouse Management System), которая программно управляет очередностью отгрузки.
Несоблюдение FIFO приводит к порче товаров, образованию неликвидов и финансовым потерям. В розничной торговле принцип FIFO часто реализуется через маркировку товаров датами и размещение новых партий «за» старыми (правило «первым пришёл — первым ушёл» на полке).
FIFO в электронике и телекоммуникациях
В цифровой схемотехнике FIFO — это специализированная микросхема или блок (hardware FIFO), реализующий очередь на аппаратном уровне. Такие устройства используются для согласования скорости передачи данных между двумя системами (буферизация). Например, в UART-контроллерах FIFO глубиной 16 байт позволяет процессору обрабатывать данные блоками, а не каждый байт по отдельности, снижая нагрузку на прерывания.
В сетях передачи данных FIFO применяется в коммутаторах и маршрутизаторах для временного хранения пакетов. Однако в современных сетях часто используются более сложные алгоритмы (например, WFQ — Weighted Fair Queuing), чтобы избежать проблем с задержками для чувствительного трафика (VoIP, видеоконференции).
Критика и альтернативы
Основной недостаток FIFO — отсутствие приоритизации. В операционных системах это решается введением приоритетов (приоритетная очередь) или алгоритмов, учитывающих время ожидания (например, Round Robin). В бухгалтерском учёте критика FIFO связана с тем, что в период высокой инфляции он завышает прибыль, что может вводить в заблуждение инвесторов. Альтернативой является метод средневзвешенной стоимости, который сглаживает колебания цен.
В логистике для товаров с длительным сроком хранения или без срока годности (например, металл, строительные материалы) FIFO может быть необязательным, и применяется метод LIFO или FEFO (First Expiry, First Out — «первым истекает срок — первым уходит»).
Интересные факты
- В некоторых операционных системах (например, ранних версиях UNIX) планировщик процессов использовал простой FIFO, что приводило к «зависанию» системы при длительном выполнении одного процесса.
- В математике очередь FIFO является примером дисциплины обслуживания, при которой среднее время ожидания в стационарном режиме для системы M/M/1 вычисляется по формуле Поллачека — Хинчина.
- В психологии и социологии принцип FIFO иногда критикуют как несправедливый: например, в здравоохранении пациенты с более тяжёлыми состояниями должны обслуживаться вне очереди (триаж), а не по времени прихода.
Источники
- Таненбаум Э., Бос Х. «Современные операционные системы». — 4-е изд. — СПб.: Питер, 2015.
- Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. «Алгоритмы: построение и анализ». — 3-е изд. — М.: Вильямс, 2013.
- Положение по бухгалтерскому учёту «Учёт материально-производственных запасов» (ПБУ 5/01), утверждённое Приказом Минфина РФ от 09.06.2001 № 44н.
- Международный стандарт финансовой отчётности (IAS) 2 «Запасы».
- Гнеденко Б. В., Коваленко И. Н. «Введение в теорию массового обслуживания». — М.: Наука, 1987.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →