您是第 位访客

flashsim 源码分析(二): flashsim 中的面向对象设计

flashsim 模拟器是单线程的,利用 C++ 实现的。采用了面向对象的设计,把闪存的中的硬件和软件设备都抽象成了类。

flashsim 所模拟的闪存的硬件架构如下图所示。

1. flashsim 中硬件的抽象

flashsim 中把闪存中的硬件分别抽象出了 10 个类:

SSD:SSD 类用来创建一个SSD模拟器。

Package: Package 类代表了一组共享总线通道(bus channel)的 die 。package 类在它的构造函数中分配 die 并将它们连接到一个总线通道上。

Die: 由多个 plane 组成。

Plane: Plane 由许多 block 组成,并且提供了一个页大小的寄存器,用来为总线传输缓存页数据。这个寄存器也可以作为 plane 内部合并(meger)操作时的缓冲。合并操作时,相应事件的更新同样要考虑寄存器的延迟。

Block: Block 是由许多页组成的,也是擦除操作的最小单位。

Page: 每个 page 都包含一个状态(free/empty, valid 或 invalid)。擦除过后的 page 的状态应该是 free(即empty),写入数据后的 page 的状态应该是 valid,在合并操作中把数据拷贝到其他位置上的 page 的状态应该是 invalid。

Controller: controller 类从 SSD 中接收事件(event)对象,并根据 FTL 来处理事件。在把事件对象发送到总线(bus)之前,controller 把事件的虚拟数据发送到RAM用以缓存。

RAM: RAM 类用来计算从它那读取或者写入数据的延迟。RAM 缓存虚拟的事件数据,供 controller 发送到总线(bus)。

Bus: bus 类有很多的通道(channel),这些通道均由一个 package 中的所有 die 共享。bus 检查事件对象中的地址,然后把他们发送到相应的通道上去。

Channel: channel 必须调度事件的使用并更新事件的时间值。每个 channel 必须维持一个调度表来跟踪 channel 的使用情况,在满足依赖性之后的下一个可用的空闲时间调度新的事件,调度表的大小可以看作是队列的长度。

2. flashsim 中软件的抽象

Event: 模拟器可以传递 event 类,并更新它的统计数据。

Address: address 类由一些分离的属性组成,包含从 page 到 package 各个层次的地址。

FTL: FTL 类主要实现了 FTL 相关的算法,比如地址映射,磨损均衡垃圾回收等。

Wear Leveler: wear leveler 类主要实现了负载均衡的算法。

Garbage Collector: garbage collector 类主要实现了负载均衡的算法。


flashsim的UML图


Reference

Kim Y, Tauras B, Gupta A, et al. Flashsim: A simulator for nand flash-based solid-state drives[C]//Advances in System Simulation, 2009. SIMUL’09. First International Conference on. IEEE, 2009: 125-131.