这周我看了《Inside Solid State Device》一书,了解了解SSD作为软件的补充。

固态硬盘区别于将数据以磁形式存储的机械硬盘,使用了一种名为NAND的闪存颗粒,以电信号的形式存储数据。存储介质利用半导体的特性,以高低电平来标记数据的类型。NAND颗粒又以最小存储单元的堆叠形式不同而分为SLC(single-level cell)颗粒、MLC (multi-level cell)颗粒和TLC(triple-level cell)颗粒。单个slc存储单元有0和1两种充电值,(高电平记为“1”,标记为空白,低电平标为“0”,标记为存储)可存储1bit的数据;单个mlc存储单元有四种充电值——00、01、10和11,可存储2bit数据;以此类推,单个tlc存储单元有8种充电值,可存储3bit数据。slc颗粒的结构简单、稳定,具有高速、安全、使用寿命长的特点,(寿命约为100000次完全Program/Erase)而mlc颗粒相比slc颗粒,拥有更高的存储密度,也因为结构的复杂,需要牺牲一定的速度和使用寿命(寿命约10000次完全P/E),tlc则同理,存储密度相比slc有了很大的提升,但速率和使用寿命也大幅下降。(寿命约为500-2000次完全P/E)

2012年开始,民用固态硬盘规模迎来了一次井喷,原因是MLC颗粒的商用开始成熟,解决了传统的SLC颗粒生产成本高的问题,将这种高速安全的存储介质带入民用市场。同样,2015年,解决了使用寿命问题的TLC颗粒凭借成本优势开始逐步取代MLC颗粒。目前,市场在售的大部分固态硬盘都是用TLC颗粒生产而来。

机械硬盘的读写原理是通过机械马达带动机械臂上的磁头对磁碟片进行读取和写入,而这种方式最大的弊端就是寻址要花费至少10ms的时间,从而带来了巨大的延迟,影响了用户的体验。固态硬盘则不存在这样的问题,闪存颗粒的寻址只需要花费约0.1ms。但是固态硬盘也存在天然的缺陷,通过电信号存储数据的方式虽然读写速度快,但是一旦存储颗粒出现问题,数据恢复的几率几乎为0。存储颗粒出现故障的几率随着其读写次数的增多也在不断增加。数据的安全问题似乎是固态硬盘的死穴,特别是随着大量TLC颗粒的固态硬盘的上市,人们越来越关注如何延长固态硬盘的使用寿命(以提高完全读写次数这种方式为主),降低使用时的故障率,保持寿命内的读写速度。目前,固态硬盘中有几种方式来实现这一目的。

首先是磨损均衡(wear leveling)

由于系统在向固态硬盘写入文件时,并不全是完全的顺序写入,大部分时间都是随机写入,文件在系统中体现的逻辑位置和在固态硬盘中的物理位置通过LBA(Logical Block Addressing)表格一一对应,而当固态硬盘的主控发现某些区块的颗粒已经进行了相对多次的擦写,某些区块只进行了相对少次的擦写,会将文件写入相对少次的区块,以平衡各区块间的磨损程度,不致使某些区块提前透支使用寿命,使固态硬盘提前报废。

trim

机械硬盘对删除后重新写入的过程,仅需要磁柱头直接改变碟片上的磁信号,不存在擦除的过程。而固态硬盘对“删除”的理解,则只是在LBA表格中删除对应文件的逻辑位置信息,使系统找不到这个文件从而认为该文件已删除。当该物理区块又有文件写入时,则会先对对应写入的区块进行擦除,然后再写入。若该区块中还包含其他有效的文件,还需要先将该区块中的有效文件复制改写到其他区块中,然后擦除该区块,再进行写入。本来单纯的写入过程却变成了复杂的过程,降低了整体的响应速度。trim就是为解决这一问题而生的。微软在Windows7系统中开始加入对固态硬盘的trim指令。它的作用是,当系统在逻辑层面对文件进行删除时,固态硬盘在物理层面也对对应区块进行擦除,其中的有效文件会提前进行转移改写,保证了使用的速度。

垃圾回收(Garbage Collection)

由于大量的随机写入,固态硬盘中存在着一些小的有效数据,它们分布在不同的区块中,文件大小不足以占用整个区块。固态硬盘的主控会在系统空闲时,将这一部分的文件复制入系统内存中,自动缓存的固态硬盘会复制入自带的缓存中,然后将这一部分文件写入其他的区块,再将原区块擦除,保证原区块的写入性能。这一机制类似于机械硬盘的磁盘碎片整理。

预留空间

因为固态硬盘的垃圾回收机制和改写机制会占用其他空白的区块,所以在一定程度上来说,预留的空白空间越大,对保持固态硬盘的读写速度越有利。

静动数据分离

固态硬盘主控会识别LBA中数据的读写次数,对不经常写入的静态数据(系统文件,软件安装文件)和经常写入的动态数据进行归类分离,在有文件写入时,会主动写入存有动态数据的区块,避免改写静态数据造成性能浪费。

总结

固态硬盘的主控在整个固态硬盘中起到了重要作用,甚至可以说一个主控的优秀与否决定了这个固态硬盘的寿命和性能。竞争激烈的市场上,主控性能的提高也带来了强大的竞争力。在即将到来QLC颗粒上更需要依靠主控严格的纠错和算法的优化,才能保证必要的性能。

《Inside Solid State Device》读书笔记的更多相关文章

  1. csapp读书笔记-并发编程

    这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...

  2. CSAPP 读书笔记 - 2.31练习题

    根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1)  属于第一种情况 sum = x ...

  3. CSAPP读书笔记--第八章 异常控制流

    第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...

  4. CSAPP 并发编程读书笔记

    CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...

  5. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  6. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  7. 《C#本质论》读书笔记(18)多线程处理

    .NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...

  8. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

  9. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  10. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

随机推荐

  1. 关于ajax访问webservice查询数据量稍微大一点,就会返回error500的解决方案

    只需要在web.config的configeration节点中增加如下子节点即可: <system.web.extensions>       <scripting>      ...

  2. mysql添加外键的4种方式

    今天开始复习,在过后的几天里开始在博客上记录一下平时疏忽的知识点,温故而知新 屁话不多--直接上货 创建主表: 班级 CREATE TABLE class(cid INT PRIMARY KEY AU ...

  3. flask——包含,继承,宏

     包含,继承,宏  都是为了提高代码的效率,都是为了防止代码的沉余,浪费资源 宏(macro) 可以把它看做Jinja2中的一个函数,他会返回一个模板或者HTML字符串,为了避免反复的编写同样的模板代 ...

  4. 谈一谈对MySQL InnoDB的认识及数据库事物处理的隔离级别

    介绍: InnoDB引擎是MySQL数据库的一个重要的存储引擎,和其他存储引擎相比,InnoDB引擎的优点是支持兼容ACID的事务(类似于PostgreSQL),以及参数完整性(有外键)等.现在Inn ...

  5. [Leetcode]316.去除重复字母

    题目 贪心方法 用一个两个数组vector<int>cnt,vector<bool>in_right_place: string res:目前符合条件的字符串,到代码结束的时候 ...

  6. Spring WebSocket踩坑指南

    Spring WebSocket踩坑指南 本次公司项目中需要在后台与安卓App间建立一个长连接,这里采用了Spring的WebSocket,协议为Stomp. 关于Stomp协议这里就不多介绍了,网上 ...

  7. Nuget 打包

    https://github.com/NuGetPackageExplorer/NuGetPackageExplorer 下载地址 1 打包的dll 中没有依赖 最简单的情况,保证dll放到lib下, ...

  8. Storm中的定时任务

    1.全局定时器 import java.util.Map; import backtype.storm.Config; import backtype.storm.Constants; import ...

  9. idea自己用得到的命令

    1.注释 Ctrl + / 单行注释 . 取消注释 Ctrl + Shift + / 多行注释 .取消注释 2.查找 Ctrl + N 通过输入类名打开类(标准说法是查找类文件) Ctrl + Shi ...

  10. mybatis中预编译sql与非预编译sql

    预编译sql有缓存作用,非预编译没得 mybaits中带有#传参的有预编译左右,$没得 多用#传参 预编译语句的优势在于归纳为:一次编译.多次运行,省去了解析优化等过程:此外预编译语句能防止sql注入 ...