0 安装
git clone https://github.com/MatiasBjorling/flashsim
然后直接make
即可
可能出现的错误:
g++:命令未找到 没安装g++
CentOS 下
yum install gcc-c++
Ubuntu下
sudo apt install g++
boost/multi_index_container.hpp:没有那个文件或目录 没安装libboost依赖
CentOS 下
yum install boost-devel
Ubuntu下
sudo apt-get install libboost
1 测试
输入./test
进行测试
SSD组成
一块SSD由硬件processing unit,bus,Flash chips
软件FTL(flash translation layer)组成
三种基本操作:erase、read和write。其中erase以block为单位,读写以page为单位。page由block组成。 page有三种状态free/erased、valid和invalid。free/erased表示其未被使用。其状态图如图所示
图中的out-of-place update(异位更新)指SSD在更新数据时,并不是写到原page,而是写到另一个空白的page。这是因为SSD不同于传统磁盘,不能直接在已经有数据的位置进行写,而是必须要在空白的位置进行写,根本原因是flash在本质上是一种特殊的EEPROM。out-of-place update的主要目的是耗损平均,wear-leveling。
FTL(Flash Translation Layer)层主要由三个部件组成,地址翻译、垃圾回收(GC)和耗损平均。主要用来做地址翻译,也被叫FTL层。地址翻译组件将磁盘系统的逻辑地址翻译为物理地址,使得SSD可以封装为普通的块存储设备。并且使用out-of-place update操作以隐藏erase操作,使用的Mpping-table存放在SSD内部的RAM中。GC顾名思义,是用来回收out-of-place update之后invalid block。因为SSD的每个block的寿命有限,所以平均利用每块block很重要,即要进行耗损平均。
模拟器
面向对象,事件驱动,c++编写,单线程。每个实际上的硬件都有与之对应的模拟器软件C++类,体现了良好的设计规范。下面简要介绍其组成。
硬件
SSD:SSD类提供了对Disksim的接口。该类创建事件对象——将Disksim 的 ioreq_event封装成事件对象,同时将事件时间流返回给Disksim。
Package:package就是一组共享bus的die。package类中在构造器中分配die,同时将die连入bus并分配和管理地址。
Die:一个die就是一片flash颗粒。包含多个plane。
Plane:plane由block组成,并且提供了一个单页大小的register用以进行总线传输。这个register也被用于页内的合并操作。
Block:block由page组成,是擦除操作的单位。当一块被擦除时,它包含的所有页都被擦除变成erased/free。相关事件对象更新时,会考虑擦除延迟时间。
Page:每个page都包含它的状态并且利用特读写延迟更新事件驱动对象,page状态有free/empty、valid和invalid,它们分别被在擦除操作、成功写入和merge操作之后被更新。
RAM:RAM类计算读写时间,RAM将事件驱动虚拟化提供给controller以送到bus。
Bus:bus类有许多由许多在同一个package的die共享的channel,bus测试事件地址并传递事件对象到合适的channel。Bus使用交叉存储技术
Channel:channels调度事件的使用,并且更新事件的时间值。每个channel都有一个调度表用来跟踪channel的使用,新的事件在下一个空闲时间段被调度。显然,调度表的大小和请求队列长度有关。
软件组件设计
事件:Flashsim的事件与Disksim的ioreq_event相关。每个事件都是使模拟器发生改变的方法和元素的合集。模拟器的对象传递事件对象然后更新事件对象的统计数据。事件就是真实SSD的I/O请求等真实发生的事件的映射。
地址:地址即从package到page每个硬件的地址。
FTL:FTL将逻辑地址翻译为物理地址,将一个多页事件变成一组有序单页事件以便controller执行。FTL负责进行硬件的并行操作以提升性能。
Wear Leveler:耗损平均器,负责进行耗损平均。
Garbage Collector:当写操作所选中的block是invalid状态时,GC就进行垃圾回收。GC将部分使用(未写满)的block合并起来,将原来的block擦除以腾出空间其他的GC算法也可以被模拟。
事件流
要使用SSD模拟器,首先要实例化一个从Disksim接收ioreq_event的SSD对象。SSD对象的详细设计如图:
在die层级数据的流通如图: