Skip to main content

FIFO:First Input First Output

有一个游泳池,宽5米,长10米。每秒排水1平方米,在排水的同时进行注水,每秒注水3平方米,问这个游泳池多久注满水?

这个问题大家不陌生吧,小学经典的一元一次方程。

我们可以观察到

  1. 游泳池在排水的过程中可以同时注水,这个像不像内存的读写?
  2. 排水和注水的大小不同,这个像不像读写的效率?
  3. 当游泳池排完水后,是否能够继续排水?内存空的时候还能读到东西吗?
  4. 游泳池注注完水后,还能不能继续注水?内存满的时候还能写入吗?

FIFO的两个规则

  • 永远不要写入完整的FIFO(溢出)
  • 永远不要从空的FIFO中读取(下溢)

FIFO的一些重要参数

读写控制:读写控制的使能

满信号:FIFO里面的信号数量达到了最大深度值

空信号:FIFO里面的信号全部被读出

读写指针:总是指向下一个地址

深度:FIFO所能容纳的最大信号数量

宽度:FIFO中每一位容纳的数据大小。

FIFO的设计

FIFO设计的难点在于怎样判断FIFO的空/满状态。为了保证数据正确的写入或读出,而不发生益处或读空的状态出现,必须保证FIFO在满的情况下,不能进行写操作。在空的状态下不能进行读操作。怎样判断FIFO的满/空就成了FIFO设计的核心问题。

PS: 题外话

在写泳池例子时我发散一下。

这是一道非常经典的数据题,不过从小我就有一个疑惑,真的有人一边对泳池放水一边泳池加水么?我以我二十多年的阅历来说,还没有见到过,那么可以直接下定义说这道题脱离生活实际么?

我们来看一下生活中的现象: 下暴雨时,水库会大量进水,为了调节水位,会进行泄洪,这不就是一边放水一边加水么。

在比如节假日一些热门地点,都会对人流进行管控,防止人流密集,基本上的出入口要么只进不出,要么只出不进,还会根据当前存在的人数,进行动态的调节入口的人流量。这种也是一种一边放水一边加水的过程。

再比如说物流、停车场等等,你能想到的基本上都有先入先出的影子在。

而泳池这道题,可以看成是这类现象的抽离出的公共的科学模型,遇到类似的问题就可以根据这个模型进行处理。

而在编程的世界中,也是存在很多类似的现象,数据库中数据的新增删除,任务的调度等等。

还是那句话,我们要学习解决问题的思路,而不是某一个的解法。