lifo和fifo的优缺点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lifo和fifo的优缺点相关的知识,希望对你有一定的参考价值。

优点:先进先出法在资产负债表上所显示的是最新的存货成本,再利用比较低的过去销货成本(假设有通货膨胀的存在,同时价格亦呈上升状态),便可以将损益表中的净收益给予极大化。

缺点:后进先出法在计算上因为使用的是现时成本所以会将存货(inventory)价值错估。

FIFO:全称First in, First out,先进先出。

LIFO:全称Last in, First out,后进先出。

LIFO和FIFO是存货的两种计量方法,在通货膨胀的情况下,LIFO和FIFO对期末存货的计价和当期成本利润的影响是完全不同的:

LIFO:由于发出的存货是按最新的采购价格(较高)计量的,发出的价格高,库存的价格低,所以期末账面存货价值就相对低了。在通货膨胀的情况下这种方法是最符合谨慎性原则的。

FIFO:由于发出的存货是按最初购买价格计量的,库存的价格是相对最新的,所以期末账面存货价值就相对高估了。

参考技术A 1. LIFO是一种性格测试系统,它可以根据几个维度将人在不同的情况下分为几种类型,从而帮助你了解自己的行为模式并进行调整。总之,后进先出法是一种很好的人格测试工具,而且非常实用
2. FIFO可以连续发一系列数据,但缺点是只有顺序写入数据、顺序读取数据时,其数据地址由内部读写指针自动加1来完成,不能像普通内存一样可以通过地址行来确定读取或写入指定地址。
拓展资料:一.FIFO队列原则
1.FIFO队列不对数据包进行分类。当报文进入接口的速度大于接口发送的速度时,FIFO让报文按照到达接口的报文顺序进入队列。同时,FIFO让数据包按照数据包在队列出口进入队列的顺序进入队列。
2.FIFO队列具有处理简单、开销低的优点。但是FIFO是不区分报文类型的,而是采用best effort的转发方式进行。这将会导致时间敏感的实时应用(如VoIP)的时延得不到一定的保证,关键业务的带宽也得不到保证。
二.使用FIFO
FIFO通常用于不同时钟域之间的数据传输。比如说FIFO的一端是AD数据采集,另一端是计算机的PCI总线。假设AD采集速率为16位100KSPS,每秒的数据量为100K×16bit=1.6Mbps,而PCI总线速度为33MHz。总线宽度为32位,最大传输速率为1056Mbps。FIFO可以作为两个不同时钟域之间的数据缓冲区。此外,FIFO还可以用于不同宽度的数据接口,如单片机8位数据输出,而DSP可以16位数据输入,当单片机与DSP连接时,可以使用FIFO来达到数据匹配的目的。
三.fifo是什么意思
fifo一般指后进先出;后进先出法指的是一种计算存货交付成本的方法,假设说您要储存的存货先发货。如果采用后进先出法,每批交货的成本按最后一批入库的单价计算。如果一批交货的货物数量超过最后一批入库的数量,则按最后一批入库的单价计算。

Zephyr RTOS -- FIFO (LIFO)

本笔记基于 Zephyr 版本 2.6.0-rc2

 

前言

本人正在学习 Zephyr,一个可移植性较强,可以兼容多种开发板及物联网设备的操作系统,如果你感兴趣,可以点此查看我的 学习笔记总述 进行了解!

 

1. Queues

Zephyr 中的 Queue 是一个内核对象,它实现了一个传统的队列,允许线程和 ISR 添加和删除任何大小的数据项。队列类似于 FIFO,是 k_fifok_lifo 的底层实现。有关用法的更多信息,请参见 k_fifo (k_lifo)。

 

2. FIFOs (LIFOs)

2.1 Concepts

可以定义任意数量的 FIFO(LIFO) (仅受可用 RAM 限制)。每个 FIFO(LIFO) 由其内存地址引用。

FIFO(LIFO) 具有以下关键属性:

  • 已添加但尚未删除的数据项的 队列(queue)。该队列被实现为一个简单的链表。

FIFO(LIFO) 数据项必须在字边界上对齐,因为内核保留项的第一个字,用作指向队列中下一个数据项的指针。 因此,包含 N 字节应用程序数据的数据项需要 N+4 (或 N+8)字节的内存。如果使用 k_fifo_alloc_put() (k_lifo_alloc_put()) 添加数据项,则不需要对齐或预留空间,而是从调用线程的资源池中临时分配额外的内存。

一个数据项可以通过线程或 ISR 添加到 FIFO(LIFO) 中。如果存在等待线程,则直接将该项赋给该线程;否则该项目将被添加到 FIFO(LIFO) 的队列中。对可以排队的项目的数量没有限制。

一个数据项可以由一个线程从 FIFO(LIFO) 中删除。如果 FIFO(LIFO) 的队列是空的,那么线程可以选择等待给定的数据项。任意数量的线程可以同时等待一个空的 FIFO(LIFO)。添加数据项时,会将其分配给等待时间最长的最高优先级线程。

Note:
内核允许 ISR 从 FIFO(LIFO) 中移除一个项目,但是如果 FIFO(LIFO) 是空的,ISR 不能尝试等待。

如果需要,多个数据项可以在单个操作中添加到 FIFO 中,如果它们被链接到一个单链表中。如果多个编写者向 FIFO 添加相关数据项集,则此功能可能非常有用,因为它确保每个数据集中的数据项不与其他数据项交叉。向 FIFO 中添加多个数据项也比一次添加一个数据项更有效,并可用于确保任何删除集合中的第一个数据项的人都能够删除其余的数据项,而无需等待。

 

2.2 Implementation

2.2.1 Defining a FIFO (LIFO)

FIFO(LIFO) 是使用 k_fifo (k_lifo) 类型的变量定义的。然后必须通过调用 k_fifo_init() (k_lifo_init()) 来初始化它。

以下代码定义并初始化一个空的 FIFO(LIFO)。

struct k_fifo my_fifo;

k_fifo_init(&my_fifo);

或

struct k_lifo my_lifo;

k_lifo_init(&my_lifo);

或者,可以在编译时通过调用 K_FIFO_DEFINE (K_LIFO_DEFINE) 来定义和初始化一个空的 FIFO(LIFO)。

下面的代码和上面的代码段效果一样。

K_FIFO_DEFINE(my_fifo);

或

K_LIFO_DEFINE(my_lifo);

 

2.2.2 Writing to a FIFO (LIFO)

通过调用 k_fifo_put() (k_lifo_put()) 将数据项添加到 FIFO(LIFO)。

以下代码建立在上述示例的基础上,并使用 FIFO(LIFO) 将数据发送到一个或多个消费者线程。

struct data_item_t {
    void *fifo_reserved;   /* 1st word reserved for use by FIFO */
    ...
};

struct data_item_t tx_data;

void producer_thread(int unused1, int unused2, int unused3)
{
    while (1) {
        /* create data item to send */
        tx_data = ...

        /* send data to consumers */
        k_fifo_put(&my_fifo, &tx_data);

        ...
    }
}
struct data_item_t {
    void *LIFO_reserved;   /* 1st word reserved for use by LIFO */
    ...
};

struct data_item_t tx data;

void producer_thread(int unused1, int unused2, int unused3)
{
    while (1) {
        /* create data item to send */
        tx_data = ...

        /* send data to consumers */
        k_lifo_put(&my_lifo, &tx_data);

        ...
    }
}

此外,可以通过调用 k_fifo_put_list()k_fifo_put_slist() 将数据项的单向链接列表添加到 FIFO。

最后,可以使用 k_fifo_alloc_put() (k_lifo_alloc_put()) 将数据项添加到 FIFO(LIFO)。使用此 API,无需为内核在数据项中使用预留空间,而是会从调用线程的资源池中分配额外的内存,直到读取该数据项为止。

 

2.2.3 Reading from a FIFO (LIFO)

通过调用 k_fifo_get() 从 FIFO(LIFO) (k_lifo_get()) 中删除数据项。

以下代码建立在上述示例的基础上,并使用 FIFO(LIFO) 从生产者线程获取数据项,然后以某种方式对其进行处理。

void consumer_thread(int unused1, int unused2, int unused3)
{
    struct data_item_t  *rx_data;

    while (1) {
        rx_data = k_fifo_get(&my_fifo, K_FOREVER);

        /* process FIFO data item */
        ...
    }
}
void consumer_thread(int unused1, int unused2, int unused3)
{
    struct data_item_t  *rx_data;

    while (1) {
        rx_data = k_lifo_get(&my_lifo, K_FOREVER);

        /* process LIFO data item */
        ...
    }
}

 

2.3 Suggested Uses

使用 FIFO 以 “先进先出” 的方式异步传输任意大小的数据项。

使用 LIFO 以 “后进先出” 的方式异步传输任意大小的数据项。

 

2.4 Configuration Options

相关配置选项:

  • None

 

参考链接

Queues: https://docs.zephyrproject.org/latest/reference/kernel/data_passing/queues.html

FIFO: https://docs.zephyrproject.org/latest/reference/kernel/data_passing/fifos.html

LIFO: https://docs.zephyrproject.org/latest/reference/kernel/data_passing/lifos.html

以上是关于lifo和fifo的优缺点的主要内容,如果未能解决你的问题,请参考以下文章

Zephyr RTOS -- FIFO (LIFO)

Zephyr RTOS -- FIFO (LIFO)

C++ 节点类、链表、LIFO、FIFO

算法---队列

Linux fifo 缓冲采坑

YARN 调度器