Fifo lifo что это в программировании
Принципы FIFO, FEFO, LIFO, FPFO, BBD и чем их различие
В зависимости от требований и конкурентной среды, применяются виды обработки товара, которые будут оптимальны, удобны и эффективны. Как мы настроим бизнес-процессы, в том числе в логистике, будет зависеть наша оперативность и точность. Принцип FiFo, что это такое? Чем отличается от FeFo, LiFo и других видов обработки товара или информации?
Сегодня просто и доступно разберем все эти вопросы. Исходя из этого Вам будет гораздо проще подобрать оптимальный вариант. Итак, начнем.
Принцип FeFo — что это такое в логистике
Аббревиатура FEFO — first expire, first out. Дословно с Английского, — что первым заканчивается, то первым и выходит. Классический принцип FeFo применяют для товара, который имеет ограниченный срок годности. То есть, товар, имеющий наименьший срок годности отгружается, продается в первую очередь. Под принцип FeFO попадают продукты питания или иные товары с небольшим сроком годности.
Мы наблюдаем в супермаркетах, что на полки, ближе всего к покупателю, выставляют товар, сроки годности по которым, имеют меньший срок, чем товары, которые располагаются в глубине полок. Как понимаем, если срок годности не вышел, здесь нет криминала. Менеджеры и мерчендайзеры продовольственных магазинов грамотно используют принцип FeFo.
Этот же принцип FeFo может являться основным на продовольственных складах или складах медицинского назначения, где этот метод также может быть уместен по ряду товаров.
На складе, визуально за такими товарами не уследить. Здесь нужна хорошая автоматизированная система учета.
Еще при приемке на склад, кладовщик заводит в WMS ( складскую программу) не только общие характеристики товара, но и обязательно, данные со сроками годности. При задаче на отгрузку, WMS склада, по заданному алгоритму, подтягивает те товары, которые по срокам годности имеют приоритет.
Исходя из этого, топология склада должна строиться таким образом, что бы доступ к товарам был свободным. Часто используется стеллажное хранение. Или, если это позволяет условия хранения товара, возможен вариант с наклонными ячейками, набивными стеллажами, где закладка товара идет с одной и более высокой стороны, а его выемка, с другой стороны.
наклонный стеллаж хранения и подбора товара
Принцип FiFo — что это такое в логистике
FiFo — first-in-first-out. Дословно с Английского, что первым зашло, то первым вышло. Здесь уже определяется не по срокам годности, а по срокам прибытия. Что первым пришло, то и первым должно уйти, отрузиться. Принцип FiFo, тот же принцип живой очереди. Какой клиент пришел первым, тот первым должен быть обслужен.
Принцип FiFo является основным методом обработки товара, как сборного груза, у транспортно-логистических компаний. Таким компаниям важно, что бы их клиенты получали товары в разных концах страны в заявленные ими сроки.
Например, идет сборка разных грузов клиентов с одной точки для доставки по разным направлениям. Процессы склада должны быть пространственно и на уровне складской программы настроены так, что бы товары клиентов не терялись в плане приоритетов отгрузки. Все, что для перемещения в точку «А» пришло сегодня, должно быть отгружено в одно время.
Но никак груз пришедший через 10 минут или завтра, не должен попасть в документ отгрузки раньше предыдущего груза.
При быстрой оборачиваемости товара или условий доставки требующей быстрой обработки, используют метод напольного хранения. Пришедший груз, тут же перемещают в противоположный участок склада, с ворот приемки, к воротам отгрузки, в зону накопления.
зона накопления на складе
Если товар не требует быстрой отгрузки, то уместно хранить на стеллажах с системой адресного хранения, где также к товару будут привязаны сроки поступления на склад.
Принцип LiFo — что это такое в логистике
LiFo — last-in-first-out. С Английского, что пришло последним, — отгружено первым. Принцип LiFo прямо противоположен принципу FiFo.
Принцип LiFo иногда называют бюрократическим методом, поскольку те документы, что легли сверху, первыми и рассматриваются. На самом деле, в логистике принцип LiFo широко используются, когда груз почти не ограничен сроками годности, и не связан приоритетами отгрузок по FiFo. Например, это могут быть какие-то заготовки, блоки из камня.
укладка заготовок по методу Lifo
Также склад может иметь только одни ворота на вход и отгрузку, или ограничен в пространстве. В этом случае, что вошло на склад последним, отгружается первым.
Принцип Lifo в бухгалтерии
В бухгалтерии также используется принцип Lifo. Например:
Согласно методу LiFo, статьи запаса закупленными последними, будут проданы первыми. Соответственно, статьи, остающиеся в запасе в конце периода, были раньше всего приобретены или произведены.
Списание в производство материалов по последней цене их приобретения, позволяет устранить инфляционное занижение расчетной себестоимости готовой продукции. Тем самым, избежать преждевременной уплаты части налога на прибыль.
Метод FpFo
FpFo — First Product First Out. Что означает, — первым произведено, первым и выходит. FpFo используют на производственных предприятиях. Произведенный товар имеет партии, и должен быть отгружен с учетом самой ранней партии производства.
Можно задать вопрос, в чем тогда разница между FiFo и FpFo. Вроде принцип один и тот же. По сути да, но сделано разделение между продуктом, который родился в стенах производства (FpFo) и тем продуктом, который, в готовом виде зашел в стены производства, склада, магазина (FiFo).
Метод BBD
BBD — Best Before Day. Первым исходит рекомендуемый срок, первым и выходит, подлежит отгрузке.
Такая продукция ротируется в соответствие с минимально остаточным рекомендуемыми сроками. Для понимания, хорошим примером будет винная продукция, где используется рекомендуемая дата употребления продукта. Как мы понимаем, такая продукция вовсе не несет рисков для здоровья, а имеет свою специфику приготовления и использования.
Аналогичным примером может послужить, приготовление сыров. Некоторые его сорта, также имеют специфику с рекомендуемой датой его полной готовности и употребления.
Принцип FiFo, FeFo, LiFo. Резюме.
В самом начале, мы говорили о том, что при построении модели бизнеса, бизнес-процессов компании, нам нужно иметь ясное понимание, каким методом будет обрабатываться товар, груз, информация. Нам необходимо взглянуть достаточно широко, ведь нам нужно еще отталкиваться от требований рынка, конкуренции, наших клиентов.
И например, принцип FiFo на складе может стать не единственным видом обработки. На этом же складе может потребоваться два или три вида обработки, что существенно усложнит его работу. Сможет ли выполнять один склад? Я работал на складе, где использовалось сразу 3 принципа обработки товара. Здесь должно все работать, как единый, слаженный механизм.
После выбранной модели или моделей, необходима топология склада с учетом максимальной нагрузки на каждый участок и пропускной нагрузки на ворота склада. Из своего опыта расчетов по топологии склада, скажу, что это очень важная работа, поскольку для бизнеса сразу определяет оптимальную и максимальную нагрузку на склад.
Крайне важно заранее понимать самое узкое место склада.
Могу рекомендовать книгу Гэвин Ричардса — «Управление современным складом». Обычно, я стараюсь дать ссылку на бесплатный материал, но здесь ничего не нашел. Поэтому, только ссылка на покупку этой книги в интернете. https://book24.ru/product/upravlenie-sovremennym-skladom-1650401/
Надеюсь, статья, принцип FiFo, FeFo, LiFo, была полезной. Мы разобрали основную классику; принцип FiFo — что это такое в логистике, принцип FeFo — что это такое в логистике и принцип LiFo — что это такое в логистике. Пишите в комментариях, задавайте вопросы. Будьте здоровы и счастливы!
Управление запасами: LIFO vs FIFO
Какой метод лучше подходит для вашего склада?
От того, как построен учет склада, какой применяется метод учета, в конечном счете, очень многое зависит.
FIFO и LIFO хорошо известны из бухгалтерии, когда речь идет о расчете себестоимости и стоимости остатков. Но они имеют отношение и к управлению складом.
Давайте разберемся, чем они отличаются и какой метод лучше.
Это кажется очевидным для склада, но только на первый взгляд. Согласно этому принципу, первая партия, пришедшая на ваш склад, должна первой выйти, то есть должна быть отправлена в магазины или клиентам.
Этот метод, наоборот, означает, что первой со склада должна уйти та партия, которая пришла последней. Новые товары, при отгрузке, имеют приоритет над более ранними поступлениями.
Преимущества FIFO
Преимущества LIFO
Для чего может понадобиться стратегия «Последним вошел, первым вышел» не так очевидно. Основные преимущества этого метода связаны с бухгалтерским учетом, но о нем, все же, стоит поговорить, особенно, если вы сами производите свои товары.
Использование LIFO позволяет сопоставить ваши текущие затраты с текущими доходами. Это очень важно тогда, когда растут затраты на производство и, следовательно, себестоимость. Если в такой ситуации использовать FIFO, то есть продавать то, что произведено ранее, то вы будете переоценивать свою прибыль, поскольку будете работать с устаревшей информацией о затратах, а не с текущей. Таким образом, используя LIFO у вас будет более качественная и надежная информация о ваших доходах.
А еще вы будете менее подвержены падениям рыночной цены на ваши товары, потому что сможете продавать продукцию, произведенную ранее. Тем самым, вы будете меньше списывать убытков. Это тоже нравится акционерам.
Если говорить о LIFO в управлении складом, то это единственно применимый метод для однородных и сыпучих товаров: уголь, песок, щебень, кирпич. Когда партия приходит на склад, она ложится поверх того, что есть, и будет отгружена первой. Этот метод применим, если у вас маленький склад и нет сроков годности или устаревания товаров. Для чего организовывать ротацию товара и создавать себе дополнительные сложности?
И победителем стал.
На самом деле, здесь нет правильного ответа. Все зависит от вашего товара. Для товаров со сроками годности, устаревающих или для товаров, имеющих жизненный цикл, нужно выбирать FIFO, иначе вы будете терять деньги.
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
FIFO (First In First Out)
FIFO (англ. First In First Out ) является аббревиатурой для «первый пришел, первый ушел», способа организации и управления буфером данных, где сначала обрабатывается самая старая (первая) запись, или ‘голова’ очереди. Она аналогична обработке очереди (первым пришел, первым обслужен (ПППО)): где люди покидают очередь в том порядке, в котором они прибывают.
Противоположностью FIFO является LIFO (Last In First Out), «последним пришел, первым ушел», где самая молодая запись или «вершина стека» обрабатывается в первую очередь. [1]
Очередь с приоритетами не является ни FIFO, ни LIFO, но может принять подобное поведение временно или по умолчанию.
Теория массового обслуживания охватывает эти методы для обработки структур данных, а также взаимодействия между строгими FIFO очередями.
Содержание
Информатика
Структура данных
В зависимости от прикладной программы, буфер FIFO может быть реализован в виде аппаратного регистра сдвига, или с использованием различных структур памяти, обычно циклическим буфером или одним из видов списков.
Реализация
Следующий код показывает реализацию связанного списка FIFO на языке C++. На практике, существует целый ряд реализаций списка, в том числе популярных макросов Unix-систем C sys/queue.h или шаблона стандартной библиотеки C++ std :: list, устраняя необходимость в реализации структуры данных с нуля.
Первоочередность головы или хвоста очереди
Концы очереди FIFO часто называют головой и хвостом. К сожалению, существует спор относительно этих терминов:
Программирование работы диска
Дисковые контроллеры могут использовать очередь FIFO в качестве алгоритма планирования работы диска для определения порядка обслуживания запросов ввода/вывода.
Коммуникации и сети
Сетевые мосты, коммутаторы и маршрутизаторы, используемые в компьютерных сетях используют FIFO для хранения пакетов данных на пути к их следующему месту назначения. Как правило, по меньшей мере, одна структура FIFO используется за сетевое соединение. Некоторые устройства имеют несколько FIFO для одновременного и независимого массового обслуживания различных типов информации.
Электроника
FIFO широко используются в электронных схемах для буферизации и управления потоком между аппаратным и программным обеспечением. В своей аппаратной форме, в первую очередь FIFO состоит из набора операций чтения и записи указателей, систем хранения данных и логики управления. Хранение может быть статическим оперативным запоминающим устройством (ОЗУ), триггерами или любой другой подходящей формой хранения. Для FIFO нетривиального размера обычно используется двухпортовый SRAM, где один порт предназначен для записи, а другой для чтения.
Синхронный FIFO это такой FIFO, где один и тот же тактовый сигнал используется как для чтения, так и для записи. Асинхронный FIFO использует различные тактовые сигналы для чтения и записи. Асинхронные FIFO вводят проблемы метастабильности. Общая реализация асинхронного FIFO использует код Грея (или любой блок кода расстояния) для чтения и записи указателей для обеспечения надежной генерации флага. Еще одно примечание, касающееся генерации флага, в том, что надо обязательно использовать арифметические операции над указателями, чтобы создать флаги для реализации асинхронного FIFO. С другой стороны, можно использовать либо подход, который называется «дырявое ведро», или арифметические операции над указателями для создания флагов в реализациях синхронных FIFO.
Примеры флагов состояния FIFO включают в себя: полный, пустой, почти полный, почти пустой, и т.д.
Очередь FIFO полна/пуста
Аппаратный FIFO используется для целей синхронизации. Он часто реализуется в виде круговой очереди, и, таким образом, имеет два указателя:
Операции чтения и записи адреса изначально находятся на первой позиции памяти и очередь FIFO пуста.
Очередь FIFO пуста
Когда регистр адреса чтения достигает регистра адреса записи, FIFO вызывает сигнал «Пуст».
Очередь FIFO полна
Когда регистр адреса записи достигает регистра адреса чтения, то FIFO запускает сигнал «Полон».
Очереди сообщений в бэкенд-архитектуре: как построить надежную систему
Очереди сообщений — устоявшаяся технология, которую разработчики применяют уже много лет. Разберемся, как она работает.
Почему понадобились очереди сообщений
Серверные сообщения обычно устроены просто и однотипно: сервер получает запрос, обрабатывает его и сразу же возвращает клиенту. Схема хорошо работает до тех пор, пока обработка запроса занимает немного времени, например доли секунды.
Но бывает, что вернуть ответ клиентскому приложению сразу невозможно. Например, когда сервер обрабатывает видео — это может занять минуты и даже часы. На время обработки большого объема данных вычислительные ресурсы сервера загружены и его способность обрабатывать входящие запросы падает.
Что такое обмен серверными сообщениями и как он устроен
Допустим, серверное приложение получило тяжелый запрос. Оно передает его другим приложениям дальше по цепочке, а само продолжает общение с клиентом.
Для передачи сообщения другим приложениям используют специальный инструмент — очереди сообщений. Эта технология решает любые инфраструктурные вопросы:
Когда в вашем бэкенд-приложении задействованы очереди, обработка видео выглядит так:
Схема асинхронного обмена сообщениями между приложениями. Источник
FIFO и LIFO (ФИФО и ЛИФО) — что это такое
Сервисы обмена сообщениями между серверами делятся на два типа:
Сервисы для организации очередей сообщений
Популярные сервисы для организации очередей сообщений — RabbitMQ, Apache Kafka и Redis. Давайте посмотрим, чем они различаются.
RabbitMQ
Сервер организации очередей сообщений, написанный на языке программирования Erlang. Это распределенный и горизонтально масштабируемый брокер сообщений. Он позволяет разным программам взаимодействовать с помощью протокола AMQP, а через дополнительные модули — и с помощью некоторых других протоколов: MQTT, HTTP и так далее.
RabbitMQ — это инструмент, который силен в маршрутизации сообщений. Система поддерживает несколько видов распределения сообщений в сети, их комбинация позволяет создавать очень хитрые правила доставки сообщений.
Apache Kafka
Apache Kafka — продукт, который реализует систему распределенного журнала событий. Kafka славится своей скоростью работы и масштабируемостью. Из-за способности передавать терабайты данных эту систему очередей сообщений любят разработчики, работающие с Big Data. Например, ее используют в Airbnb, Adidas, Cisco и PayPal.
Redis
Redis создавалась как система хранения данных в оперативной памяти. Изначальное предназначение — ускорение доступа к востребованной информации и построение систем кеширования.
Но разработчики добавили в код возможность построения простых очередей и стеков. В итоге Redis применяют в качестве сервера очередей сообщений в проектах, где нужно быстро и дешево проверить инженерные гипотезы по работе с очередями.
Как работает FIFO
FIFO это один из ключевых элементов цифровой техники. Это память типа «первым вошёл-первым ушёл» (first input – first output). Меня как разработчика ПЛИС FIFO окружают повсюду. Собственно я только и делаю что беру данные из одного FIFO и перекладываю в другое. Но как оно работает? В современных САПР конечно уже есть готовые элементы, у Altera есть замечательные мегафункции. У Xilinx есть Core Generator. Но что делать если что-то не устраивает в стандартных решениях? Ответ один – разобраться и написать самому.
В интернете существует большое количество статей про FIFO, и когда то мне попалась очень хорошая и толковая статья. К сожалению, сейчас я её не нашёл. Далее – мой личный опыт по созданию и применению компонента FIFO. Готовый элемент находится на Github в проекте fpga_components. Свой компонент потребовался по нескольким причинам:
Одно из главных применений FIFO это перевод данных с одной тактовой частоты на другую. Этим определяется такая схема. При одной тактовой частоте на запись и чтение автоматы можно упростить.
Давайте рассмотрим внешние порты компонента FIFO:
Флаги FIFO передаются типом bl_fifo_flag; Определение типа:
Обратите внимание, используется отрицательная логика. Узнали? Да, я ещё из тех динозавров кто работал с TTL на сериях 155, 533, 1533 и отдельными микросхемами FIFO. Так что эти флаги мне привычны, они были сделаны много лет назад и до сих пор используются.
Флаг ef – сигнализирует что FIFO пустое. Если ef=1, то из FIFO можно прочитать одно слово.
Флаг pae – сигнализирует, что FIFO почти пустое. На сколько почти определяет параметр FIFO_PAE. Если pae=1, то из FIFO можно прочитать не более чем FIFO_PAE слов.
Флаг hf – сигнализирует что FIFO заполнено наполовину.
Флаг paf – сигнализирует, что FIFO почти полное. На сколько почти определяет параметр FIFO_PAF. Если paf=1, то в FIFO можно записать не более чем FIFO_PAF слов
Флаг ff – FIFO полное. Если ff=0, то в FIFO записывать нельзя.
Флаг ovr – переполнение. Если ovr=1, то это значит что произошла запись в полное FIFO
Флаг und – underflow. Если und=1, то это значит что произошло чтение из пустого FIFO.
Вполне очевидно, что при записи в FIFO мы должны записать слово в двухпортовую память и увеличить счётчик записи. Или сначала увеличить, а потом записать. А при операции чтения надо зафиксировать данные на выходе и увеличить счётчик чтения. А вот дальше требуется решить следующие вопросы:
Надо ясно понимать, что узел перетактирования (в проекте это компонент ctrl_retack_counter_m12) передаёт данные с задержкой на несколько тактов. Поэтому состояния FIFO также изменяются с задержкой. Например, если FIFO пустое и него записано одно слово, то флаг ef=1 появится с некоторой задержкой. Это же относится к выходам количества слов в FIFO. Например, если в пустое FIFO будет записано 16 слов, то в процессе записи выход cnt_wr будет принимать значения 0,1,2,3, … 16 (это если не производится чтение из FIFO), а вот выход cnt_rd будет принимать значения например такие: 0, 5, 8, 12, 16. Точный порядок будет зависеть от соотношения частот и не может быть предсказан. Это принципиальное свойство FIFO которое работает на разных частотах. Хотя в зависимости от схемы синхронизации могут быть различные нюансы.
Определение пустого и полного FIFO производится на анализе счётчиков адресов. Причём у меня есть два адреса для записи (текущий и следующий) и два адреса для чтения, также текущий и следующий. В компоненте cl_fifo_control_m12 это сигналы w_adr, w_next_adr и r_adr, r_next_adr; Соотношение адресов в различных состояниях представлено на рисунках ниже.
В исходном состоянии w_adr=0, r_adr=0, w_next_adr=1, r_next_adr=1. Если w_adr=r_adr, то FIFO пустое.
При записи слово данных записывается по адресу w_adr и адрес записи увеличивается.
Через несколько таков значение w_adr будет передано в w_adr_to_rd (перейдёт в тактовый домен clk_rd) и по факту не совпадения r_adr и w_adr_to_rd будет установлен флаг ef=1, т.е. из FIFO можно будет считать слово данных. Однако одно слово это мало, для получения высокой скорости передачи надо работать с блоком данных. И здесь требуется использовать флаг PAE. Когда в FIFO будет записано FIFO_PAE слов, будет установлен флаг pae=1 и можно будет прочитать сразу блок данных. Это основной режим работы с DMA каналом.
Если скорость записи больше чем скорость чтения, то адрес записи догонит адрес чтения:
В этом случае w_next_adr будет равен r_adr, а точнее r_adr_to_wr (мы можем сравнивать только значения на своём тактовом домене). Это означает, что FIFO полное и записывать дальше нельзя, что бы не испортить уже записанные данные. Надо отметить, что для подключения АЦП это обычная ситуация. У нас такой режим называется однократный сбор через FIFO. В этом режиме АЦП записывает данные на большой скорости в FIFO, а медленный процессор эти данные считывает. При этом мы знаем, что действительными будет только блок данных который соответствует размеру FIFO. Обычно на этот размер как раз и программируется канал DMA. После чтения данных FIFO сбрасывается и всё повторяется снова. Вот в этом режиме принципиально важно, что бы запись в полное FIFO не портила предыдущие данные.
Если требуется записывать данные блоками, то надо использовать флаг PAF. Если paf=1, то в FIFO можно записать FIFO_PAF слов.
Значения флагов PAE и PAF надо выбирать из требований DMA контроллера к которому подключено FIFO. Например, для PCI Express у нас используется блок данных размером 4 кБ. Это 256 слов по 128 разрядов. Размер флага PAE я устанавливаю в 272. Т.е. чуть больше чем 256. Это я делаю намеренно, что бы не допускать опустошения FIFO. Ну не доверяю я схемам формирования флагов.
А как производится определение количества слов в FIFO? Всё достаточно просто – из адреса записи надо вычесть адрес чтения. Адрес кратен степени 2, поэтому вычитание будет идти по модулю 2^N; Поскольку у нас есть две пары адресов, то у нас получится и два значения количества слов в одном FIFO (может это как то связано с квантовой механикой?).
Значения флагов PAE и HF (по чтению) формируются из r_cnt. Значения PAF и HF(по записи) формируются из w_cnt.
Основной причиной, по которой пришлось разрабатывать свой компонент FIFO, является потребность в реализации циклического режима для работы на ЦАП. В этом режиме производится запись блока данных, он может быть любого размера, разумеется не превышая размера FIFO. А затем начинается чтение, причём после выдачи последнего записанного слова сразу происходит переход на первое слово. Это позволяет подключить медленный процессор к быстрому ЦАП. Компонент FIFO имеет два входа для циклического режима. rt_mode=1 означает, что после выдачи последнего записанного слова надо перейти на нулевой адрес.
А вот вход rt нужен немного для другого. Наличие rt=1 позволяет перевести FIFO на нулевой адрес в произвольный момент времени. Иногда это у нас тоже используется.
В проекте fpga_components представлены два FIFO:
Это конструкция будет синтезирована в двухпортовую память. Идея красивая и в результате доработки cl_fifo_x64_v7 получилось FIFO cl_fifo_m12.
Недостаточно написать FIFO, надо ещё проверить его работу. Для проверки используется подход принятый при разработке PROTEQ, о котором можно прочитать в моей предыдущей статье.
Существует компонент tb_00 который имеет настраиваемые параметры.
Он позволяет проверить прохождение потока данных через FIFO при различных соотношениях тактовых частот и уровнях срабатывания флагов PAE и PAF. Также существуют компоненты тестовых случаев:
Конечно, для каждого теста сохраняется и свой отчёт.
При необходимости тесты будут дополняться. Хочу обратить внимание, что для вывода текста в консоль я использую пакет PCK_FIO. Он резко упрощает вывод текста.
Например, вывод результатов выглядит так:
В итоге я считаю что получился элегантный компонент, достаточно удобный для практической работы.