上次戏说(2)–鸿门宴说的页映射和块映射两种方式,混合映射简单提了几句,本来想偷个懒就这么带过去 (没怎么花时间去了解)。
睿智的群友们有朝阳区群众一般雪亮的眼睛,立马就发现这一犯罪事实,并立即向阿呆进行了举报。
阿呆非常重视,立即要求我做积极的自我批评和深刻检讨,并向群友们郑重承诺,一定在今年之内把混合映射讲一讲。
作为SSDFans的新员工,心里说着不,嘴巴却很诚实 – 立马向领导承诺保证完成任务。
时间总是过得很快,一晃一个多月了我都还没开始动笔。好在蛋蛋每次都能赋予我无限的灵感,那是一次在南京大排档的腐败活动,他一边吃着东西,一边回忆他当年泛舟秦淮河畔的事迹。别人都在喝茶看景,他一路拼命找陈圆圆,董小宛,李香君等人的香闺,然后自己脑补自己若是当年晚明王孙贵族,定当如何如何… (冬瓜哥和唐杰两位”脑出”高手,是不是也有类似的习惯?)
不知不觉一顿饭吃好了,他还在晚明没回来,在我们焦急得等着他买单的时候,他开始追思柳如是和钱谦益: 当时钱谦益做学问的时候,最喜欢柳如是陪着他身边,钱谦益作为当时的东林党党魁,家里藏书之多你懂的,每次他需要什么资料,都是柳如是帮他去找,哪本书在哪,一找一个准。
做学问做到这样子的夫唱妇随,柳如之于钱谦益,就如映射表之于SSD。
顺着这个才子佳人的思路往下走,联想到了另外一对更牛逼的:李清照和赵明诚 。在那个没有电的年月,这二位每天吃完晚饭后的休闲活动是这个样子的:
- 先泡上一壶茶
- 再端出一摞书
- 我说一段话
- 你答这段话在哪一本书的哪一章节哪一页
- 答对了,我敬你一杯茶
- 答错了,你敬我一杯茶
何等逍遥自在,何等的niubility — 他们俩在知识点映射的水平上已经从夫唱妇随升级到了琴瑟和鸣。
FTL映射机制也是朝着这个方向进化的,从页映射、块映射的单一模式到混合映射。
混合映射中最普遍的是日志块映射:在数据块映射表(Data block mapping table)的基础上多了一张日志块映射表(Log-block page mapping table)。
数据块映射表不用解释了 (粒度:块)
日志块映射表(粒度:页)长的复杂一点
数据写入流程:
- 数据块Block 3000,4个page已经写满,分别写入数据a, b ,c ,d
-
通过查询数据块映射表,对应的逻辑块是1
- host要修改逻辑块1的数据,将b, d改为b’, d’
- 通过查询日志块映射表,对应的日志块是Block 1000,此时4个logical page offset对应的Physical Page offset都还是null
-
将b’, d’ 分别写入 Block 1000的page 0, 1,此时日志块Block 1000 内容如下:
-
Block 1000里的logical page offset要跟Block 3000保持一致,此时日志块映射表内容如下
- 此时host继续修改逻辑块1的数据,将b’, d’改为b”, d”
-
因为Block 1000还有空间,继续写入,此时日志块Block 1000 内容如下:
-
此时日志块映射表内容如下:
-
这个时候日志块Block 1000 跟数据库3000一样也满了,同时两边都有没用的数据
-
这个时候,发动GC,找一个空的Block 9000把有效数据 a, b”, c, d”写入,同时把Block 3000, Block 1000擦除
-
修改数据块映射表
数据读取既需要读取日志块映射表,又需要读取数据块映射表。
如果Host需要读取逻辑块7的数据,需要同时读取Block 2000 (Log)和Block 8000 (data)
以上为了方便理解放了很多图,比较有技术感觉(冬瓜哥用语)的童鞋,看完蛋蛋追思的部分可以直接goto下面这张图。
补充:
-
最早的日志块策略,每次向日志块写入数据的时候必须与原数据块物理偏移相同。
前面写入数据的例子5~8步骤,如何采用老的策略,就需要两个日志块来存放新写入的数据
这种策略块利用率低,对同一逻辑地址连续进行更新时浪费十分严重。
- 正文中的例子应该是BAST映射策略,每个数据块只与一个日志块相关联。在这个基础上继续优化算法,又衍生出FAST和超级块两种映射策略 — 容我再慢慢理解一下