对于NAND来说,Read操作是最快的,Program次之,最慢的是Erase。
下面这张图能够给你直观的认识:
对一个LUN来说,命令只能一个一个执行,假设一个Read命令跟在一个Program后面,那么对这个Read命令来说,他的Latency(时延)= tProg+tR。
Suspend命令是干什么用的呢?就是暂停先发的Program(或Erase)命令,让后发的Read先执行,然后再恢复被暂停的Program(或Erase)命令。
这样这个read命令的时延就大大缩短 — tProg+tR—>tR.
想法很好,在实际执行中其实有很多需要考虑的地方,比如:
- 对哪些地址的访问使用这个功能?
- 什么时候suspend,什么时候恢复?
- 固件和HW怎么配合?
- Multi-plane的时候要怎么处理?
- 频繁的Suspend Program(Erase)可能会影响GC
举个例子: Program1->Program2->Program3->Read1->Program4->Program5这个序列。
- 应该把Program1~3都暂停,等Read1完成,再恢复他们吗?
- 如果不是,应该暂停前面几个命令?
- 如果Program1很急,想把Read1加到Program1和Program2之间,能实现吗?
- 如果Host要求Program1~2不能被断开,能实现吗?
看看StarBlaze的方案:
FW这边的命令序列下来以后,全部进入一个叫做Queue Scheduler的模块,这个模块根据设定好的硬件逻辑对进来的命令重新排序再交给NAND Controller执行。
这个Queue Scheduler的深度,跟FW之间如何交互,具体的实施逻辑,StarBlaze没有公布,大家看看效果就好。
平均时延和最大时延都有明显的降低。