当前位置:看书小说 > 都市小说 > APP里的碎片 > 第三卷第8章 闪”出知识的火花父子间的闪存技术大探讨

第三卷第8章 闪”出知识的火花父子间的闪存技术大探讨

<< 上一章 返回目录 下一章 >>
    早上还下雨,中午也下,老天爷像是开了闸的水龙头,没完没了地往大地上洒水。好在从傍晚时分开始,雨终于停了,像是个顽皮的孩子玩累了,回家休息了。谭板栗这个当爷爷的,终于找到了一个空闲,可以出去溜达溜达,透透气。

    嘎嘎嘎,小胖粒那小家伙,穿着件黄色的衣服,坐在铁盆子里,活像个金黄的小鸭子。小落灰一边问着“吃着没有我的双胞胎妹妹”,一边往盆子里撒爆米花,爆米花像雪花一样纷纷扬扬地落下,小胖粒乐得咯咯直笑。

    落灰坐在桌子前,和谭灰晨聊起了天。他问道:“爸爸,什么是变量呀?”

    谭灰晨摆弄着康乃馨边想着,他开始用他那富有想象力的语言说道:“孩子啊你想象一下,我们的程序世界就像是一个繁忙的城市,而变量就是这个城市中的居民。每个居民(变量)都有自己的名字(变量名),并且他们可以拥有不同类型的‘财产’,财产就是数据类型,比如整数、浮点数、字符串等的比喻。这样,当我们要与某个居民(变量)交互时,我们只需要呼唤他们的名字(变量名),然后就可以进行各种操作,比如查看他们的财产(读取变量的值)或者给他们分配新的财产(给变量赋值)。”

    “而闪存数据呢,就像是这个城市中的一栋大厦。大厦里存放着各种重要的文件和资料(操作系统、应用程序、配置文件等),即使城市停电了,大厦里的文件和资料也不会消失,因为它们被保存在了非易失性的存储设备中。与ram(随机访问存储器)这种短暂的‘记忆’相比,闪存数据就像是有着长久记忆的‘大脑’。”

    “字符串,它就像是城市中的一条繁华的街道,街道两旁是各种各样的店铺和招牌(字符)。这些店铺和招牌共同构成了街道的独特风景(文本信息)。在程序中,我们可以轻松地操作这条街道,比如将两条街道连接起来(字符串连接),或者截取街道的一部分(字符串截取),甚至更换街道上的某个招牌(字符串替换)。字符串在程序世界中无处不在,无论是编辑文章、搜索信息还是管理数据库,都离不开它的帮助。”

    落灰的眼前是一个闪闪发光的闪存设备,心中充满了好奇他问道:“爸爸,你能详细说说,闪存内部究竟是由哪些神奇的组件组成的呢?”

    谭灰晨说道:“儿啊,你边发挥自己的想象力,构建一个生动的场景。在脑海中,想象闪存内部就像一个繁忙的城市,主控芯片就像城市的交通指挥官,负责合理地调配数据在各个闪存颗粒之间的流动。而nand闪存颗粒则像是城市的居民楼,每个居民楼都有不同的存储能力,从slc型的一室一厅,到mlc型的两室一厅,再到tlc和qlc型的多室豪宅。

    他继续说儿子啊你想想,在这个城市中,还有缓存单元、纠错算法、耗损平衡算法、坏块映射算法、读写缓存算法、垃圾回收算法和加密算法等各种角色。他们共同协作,确保城市的正常运行和数据的安全存储。”

    就在谭落灰边沉浸在自己的想象中时,谭灰晨他笑着问道:“落灰,你对闪存内部组件和数据存储原理感兴趣吗?”

    谭落灰边立刻点头,回答道:“是的,爸爸。我一直很好奇,闪存内部到底是由哪些组件组成的?它们是如何协作来实现数据存储的呢?”

    谭灰晨耐心的拿着棉布给康乃馨擦花瓣边大声地解释道:“闪存内部主要由主控芯片、nand闪存颗粒和缓存单元等组成。还有这个主控芯片负责数据的整体中转和调配,他确保数据能够正确地在各个闪存颗粒之间流动。再说说这个nand闪存颗粒则是数据存储的核心,根据存储原理的不同,它们可以分为slc、mlc、tlc和qlc等类型。每种类型的闪存颗粒具有不同的存储能力。”

    谭灰晨继续说道:“为了保证数据的正确性和安全性,闪存中还运用了许多算法和技术。比如纠错算法可以检测和纠正数据传输或存储过程中可能出现的错误;耗损平衡算法可以管理闪存颗粒的使用,延长其使用寿命;坏块映射算法可以识别和映射出闪存中的坏块,避免在这些坏块上进行数据写入。此外,还有读写缓存算法、垃圾回收算法和加密算法等,它们共同协作,确保闪存设备的正常运行和数据的安全存储。”

    听完父亲的解释,谭落灰边豁然开朗,对闪存的工作原理和内部组件有了更加深入的了解。他感慨道:“原来闪存内部如此复杂,却又如此精妙。真是令人惊叹!”

    落灰边吃着爆米花边说到:“我听说闪存的数据存储原理主要基于悬浮门技术,每个门可以存储1比特的数据。这个悬浮门技术到底是个啥玩意儿?它是怎么让数据保持不变的?还有啊,制作闪存除了要考虑物理结构和存储原理,还需要用到哪些复杂的算法和技术呢?”

    谭灰晨听完说道:“儿子啊,你对闪存技术好奇,真是难得一见的好问题!悬浮门技术,简单来说,就是在闪存存储器中,利用mosfet(金属-氧化物-半导体场效应晶体管)的特性,把数据存储在被称为“悬浮门”的结构里。每个悬浮门就能存储1比特的数据。

    当我们在这些悬浮门上施加电压时,看到如果电压超过了某个阈值vth,这时你就可以想着这个个位是0;反之,就是1。通过这样控制电压的方式,我们就能实现数据的写入和擦除。而数据的保持能力,就像是装进瓶子里的水,只要不去动它,水位就会保持不变,直到我们再次进行操作。

    闪存,除了物理结构和存储原理,我们确实需要用到一系列复杂的算法和技术。这些技术包括错误纠正编码、磨损平衡算法等,它们都是为了确保数据的正确存储、管理和保护。

    slc、mlc、tlc、qlc这些不同类型的nand闪存颗粒,它们在数据存储和性能上确实有所不同。简单来说,slc的成本最高,但读写速度最快,使用寿命也最长;而qlc的成本最低,但读写速度最慢,使用寿命也最短。这是因为它们的存储密度不同,每个存储单元能存储的数据量也不同。”

    落灰听完疑惑的问道:“爸爸,这些不同类型的nand闪存,它们能用多久容量怎么样呢?”

    灰晨拿起一把塑料勺子往康乃馨瓶子加了些白色塑料他边数着加到花瓶里的复合白色塑料粒边说道:“它们的使用寿命先看看slc的使用寿命最长,其次是mlc、tlc,qlc的使用寿命最短。这主要是因为slc的擦写次数远高于其他类型,理论上可以达到10万次,而随着存储密度的增加,每个存储单元的擦写次数减少,从而降低了使用寿命。说道这时谭灰晨往瓶子里加又加进去一颗塑料粒并念到:“叮 33颗”。

    落灰在一旁喝了半杯大麦茶,继续听他爸讲着。

    谭灰晨继续说道:&34;落灰它们的容量呢,好爸爸好想想,要是就这么几个比较呢qlc提供了最大的存储容量,其次是tlc、mlc,slc的容量最小。这是由于qlc每个存储单元可以存储更多的数据,因此在相同体积或面积下可以提供更大的存储容量,叮34颗。

    还有一个问题就是关于slc的价格最高,其次是mlc、tlc,qlc的价格最低。这与生产成本和存储容量的关系密切相关。由于slc提供了最高的性能和最长的使用寿命,但成本也最高;而qlc虽然提供了最大的存储容量和最低的成本,但由于其较低的可靠性和较短的寿命,其总成本可能并不低叮35。

    slc提供了最高的性能、可靠性和使用寿命,但成本最高;mlc在性能和成本之间提供了一个平衡点;tlc提供了更高的存储容量和较低的成本,但在性能和寿命方面不如slc和mlc;qlc则在提供最大存储容量的同时,具有最低的成本,但其性能、可靠性和使用寿命是四种类型中最差的。”

    落灰边吃爆米花边问道:“爸爸那如何实现高效的读写缓存算法以提高闪存的访问速度呢?”

    灰晨摸了摸自己的头发笑着大声说:“实现高效的读写缓存算法以提高闪存的访问速度,可以通过选择合适的缓存,根据系统的具体需求和数据访问模式,选择最合适的缓存策略。例如,对于频繁访问的数据,可以采用最近最少使用(lru)算法叮44颗了,而对于访问频率较低但访问时间较长的数据,则可以考虑使用最少使用计数(lfu)算法叮45颗了。此外,还可以考虑结合多种缓存策略,如结合lru和lfu算法,以适应不同的数据访问模式。”

    落灰大声的问道说:“爸爸你别只顾着加这些白色颗粒你再说还有其它的吗?”

    谭灰晨笑着大声说:“儿子啊,你想听爸爸就跟你说说,还有这个,优化数据结构和算法他呢是通过优化数据结构和算法来提高缓存的访问效率。例如,使用高效的哈希表实现快速查找数据,使用双向链表实现快速插入和删除操作,从而降低缓存的时间复杂度叮46颗。同时,考虑到分布式存储系统的特点,可以通过热点检测技术来提高缓存池中数据的命中率叮 叮47,48颗。

    动态调整缓存策略:根据实际的访问情况动态调整缓存策略。例如,通过监控数据的访问频率和访问时间,动态地调整缓存中的数据项,以保持缓存的有效性和高效性。这种方法可以帮助系统更好地适应变化的数据访问模式。

    在混合存储系统中,通过在内存和磁盘之间添加ssd作为扩展缓存层,可以大幅提升缓冲区访问性能,缓解磁盘i/o压力,缩短系统恢复时间叮49颗。这种多级缓存管理方法可以有效地提高闪存的访问速度,儿子啊,这个是利用多级缓存管理方法你听明白吗?”

    落灰说:“爸爸,这个不是很明白,那还有其它的吗?”

    谭灰晨说:“有的那就是针对不同类型的数据进行区分处理,对只读数据和只写数据进行区分处理,加快只读数据的读取速度和只写数据的写入速度,从而提升对闪存设备的整体访问效率,叮50颗。

    这些方法的综合应用你都试试,可以有效地实现高效的读写缓存算法,以提高闪存的访问速度。”

    落灰好奇的问道:“爸爸你说的真好,那什么是坏块映射算法?”

    谭灰晨边看自己的康乃馨边大声说道:“内存(特别是闪存,如sd卡、usb闪存驱动器或固态硬盘)可能会因为各种原因而出现坏块,包括物理损伤、制造缺陷、过度使用或老化。坏块的存在会影响数据的完整性和存储设备的性能。因此,存储设备需要有一种机制来识别和处理这些坏块,这就是坏块映射算法(bad block mapping algorithm)的作用。”

    落灰拿着爆米花好奇的问道:“爸爸那这个坏块映射算法是如何识别和处理闪存中的坏块的?”

    谭灰晨看了看窗外下着的雨,转过身对他儿子灰晨说:“坏块映射算法通过多种方法识别和处理闪存中的坏块。首先,软件负责映射坏块,并由好的存储块取而代之。这一过程利用工厂对这些区块的标记,通过扫描块可以确定区块的好坏。坏块标记被固定在空闲区的第一个位置(列地址2048)。如果在0或1页的列地址2048上的数据不是&34;ff&34;(非空),那么该块要标记为坏,并映射出系统。

    谭落灰好奇的问道:“爸爸这里的数字是什么意思?”

    谭灰晨继续往里加着白色颗粒边说道:“这里提到的“列地址2048”指的是在闪存中的一个特定位置。通常,在闪存中,数据是以块和列的形式组织的。在这个情况下,地址2048指的是某一列的开始位置,这一列被用来标记哪些区块是坏的。

    如果在0或1页的列地址2048上的数据不是&39;ff&39;(非空),那么该块要标记为坏,并映射出系统” 这意味着软件会检查地址2048上的数据。如果数据不是“ff”(通常,“ff”可能表示这个位置没有被使用或这个区块是好的),那么软件会假设这个区块是坏的,并在系统中进行标记,以确保它不再被用来存储数据。

    列地址2048在这里扮演了一个关键角色,它是一个固定的参考点,软件通过这个参考点来识别和标记坏块,从而确保数据的完整性和可靠性。”

    小落灰边吃着爆米花边说:“好的爸爸那你继续说说动态坏块管理算法是什么吧?”

    谭灰晨还在往瓶子里加入白色颗粒边加他边给落灰解释他大声的说道:“动态坏块管理算法的设计思想是在对以zone为单位进行逻辑—物理块地址空间映射时,将nand flash存储空间划分为数据区、交换块区、替换块区和坏块区。儿子啊这种算法与传统的地址映射最大的不同在于增加了交换块区与替换块区叮54颗。

    当出现坏块时,可以通过重映射的方式选择别处健康的闪存块替换坏块,以维持完好的超级块。这种方法实质上是做坏块管理,包括略过策略和重映射策略叮57。如果闪存转换层(ftl)寻址到坏块之一,坏块管理软件会将块标记为坏块,并使用略过策略或重映射策略来分配新块。略过策略是指根据创建的坏块表,当目标地址对应于坏块地址时,数据会存储在下一个好的块中叮58颗。

    还有一种基于fpga的nand flash坏块管理方案,运用坏块替换策略,将所有块分为数据块区和好块保留区。通过在fpga片内ram建立基于位索引的坏块位标记表bbt(bad block table)和块保留映射表rtt(reserved translate table)实现坏块的识别和替换叮59颗。

    坏块映射算法通过识别坏块并采取相应的处理措施,如重映射、略过策略等,来确保数据的安全存储和系统的稳定运行。”

    说完谭灰晨问道:“爷爷出门的时候带伞了吗?”

    落灰说:“爷爷,带了伞,还回来拿了拐杖,爸爸那什么是加密算法在保护闪存数据安全方面的最新进展是什么?”

    谭灰晨拿起花瓶往厨房走了过去,落灰在后面跟着他仔细听着。

    谭灰晨大声的说:“加密算法在保护闪存数据安全方面的最新进展主要体现在低延迟加密功能的安全接口:新一代的ddr、lpddr、gddr和hbm内存接口采用了aes-xts(xts-aes)加密算法,这是一种基于标准的对称算法,用于保护内存数据的机密性。这表明在硬件层面上,加密技术正变得更加高效和先进叮60颗。

    有秩序的人用的是aes 256位加密技术:datalocker的加密usb闪存盘和硬盘配备了军用级aes 256位加密技术,这种高强度的加密技术可以将数据转化为几乎不可破解的形式,从而提供更高级别的数据保护叮62颗。

    一些安全软件支持文件、磁盘、云存储等多场景的加密方式,并采用国密等多重加密算法,以保障加解密的安全性和效率叮66颗,这是多重加密机制,落灰你能听懂吗?”

    落灰说:“爸爸,没有听懂,但是想听你说,你在这洗花瓶,我全部给妈妈的电池充充电就回来。”

    落灰给电池插上线充电就又走到灰晨的身后说道:“爸爸你再往下说说,我听着呢?”

    谭灰晨说:“还有,硬件加密算法,硬件加密算法,也称为固件加密或硬件级加密,是一种在物理硬件层面上实现的数据安全保护技术。它通过将加密算法直接集成到计算机系统、移动设备或其他硬件中,为数据提供了额外的安全层。

    这些进展显示了加密技术在提高闪存数据安全性方面的不断进步,包括在硬件层面的集成、使用更高级别的加密标准以及开发新的加密机制来应对日益增长的数据安全挑战。

    谭灰晨笑着书:“爸爸仔细跟你说说当我们谈论数据存储,特别是闪存中的数据存储时,我们实际上是在讨论一个非常复杂的系统。在这个系统中,每一个小小的数据片段——比如一个字符或数字——都被精心地存放在特定的位置。为了让你更好地理解,我们可以将闪存内部比作一个巨大的城市,而字符串就是这个城市中的繁华街道。

    灰晨边吃着玉米爆米花边问道:“爸爸您能详细说说什么是闪存内部组件与数据存储原理详解?”

    闪存芯片是数据存储的核心。它通常由数百万到数十亿个微小的存储单元组成,每个单元都可以存储一个二进制信息——0或1。你可以将这些存储单元想象成城市中的房屋或店铺,而二进制信息就是居住在这些房屋或店铺里的“居民”。

    落灰你知道吗?在硬盘驱动器中,数据不是随意散落的,而是按照特定的结构组织起来的。这种结构被称为“磁道”和“扇区”。磁道是从磁盘中心向外散开的一系列同心圆,而扇区则是这些磁道上的小段。在闪存中,虽然概念稍有不同,但数据的组织方式也是类似的,对了你妹妹胖粒呢?”

    谭落灰焦急的说:“妹妹,她拿着去年中秋节的铁盒在阳台,敲着呢!爸爸我还想问问在计算机存储中,二进制信息0和1是如何通过电荷状态来表示的?”

    谭灰晨边拿着抹布和花瓶往客厅走去,嘴里边说着:“每个存储单元都可以存储一个二进制信息,即0或1。在电子层面,这个0或1是由电荷的状态来表示的。简单来说,电荷的存在与否(或者说电荷的多少)决定了这个存储单元是存储0还是1。

    还有0的存储,当存储单元中没有电荷或电荷量很少时,我们称之为0,还有1的存储:当存储单元中有足够的电荷时,我们称之为1。

    这些数据是以微小的电信号形式存在的,而我们的电脑和其他设备能够读取和解释这些电信号,从而还原出我们存储在闪存中的原始数据。

    字符串就像是城市中的一条繁华的街道。每个字符(比如“落”、“灰”等)都是街道两旁的店铺或招牌。这些字符共同构成了文本信息,就像街道上的店铺和招牌共同构成了城市的独特风景。

    在闪存中,字符串的每一个字符都会被存储在一个或多个存储单元中。如果是一个多字节的字符(比如utf-8编码下的中文字符),那么它需要占用多个存储单元。”

    谭落灰帮着爸爸拿着康乃馨边问道:“爸爸这个数据的操作都是有哪些内容,什么是电子层面呢爸爸,?

    谭灰晨边擦着桌子边说道:“数据的操作包括字符串连接、字符串截取和字符串替换。在电子层面,字符串连接通常意味着在存储单元中连续写入数据,就像是将两条街道连接起来,形成一个更长的街道。字符串截取则意味着读取存储单元中的一部分数据,就像是从街道上截取一段,只保留其中的一部分。而字符串替换则涉及到读取、修改和重新写入存储单元中的数据,就像是将街道上的某个招牌更换为另一个招牌。”

    谭灰晨听完笑了笑疑惑的问道:&34;爸爸那个什么是变量的作用域和生命周期爸爸你呢说说啥是局部变量和全局变量的差异吗?”

    谭灰晨擦完桌子就到厨房洗抹布了小落灰跟在他屁股后面仔细的听着:“变量的作用域和生命周期是变量定义和使用时非常重要的两个概念。理解这两个概念对于编写高效、可维护的代码至关重要。”谭灰晨边洗抹布边大声的说生怕一旁的小落灰听不到。

    谭灰晨继续大声的说:“scope作用域定义了变量在程序中的可见性和可访问性。它决定了在哪里可以引用或使用该变量。根据变量的定义位置,作用域可以分为局部作用域local scope,局部变量在函数或代码块内部定义,并且只在其被声明的函数或代码块中有效。当函数执行完毕后,其内部的局部变量就会被销毁。

    全局作用域global scope,全局变量在函数之外定义,可以在整个程序中访问。这意味着在程序的任何位置都可以引用或修改全局变量。

    块作用域block scope,在某些编程语言中(如c99或之后的c版本),可以在代码块(如`{}`内部)定义具有块作用域的变量。这些变量仅在该代码块内部可见。

    还有生命周期lifetime,生命周期描述了变量从创建到销毁的过程。变量在其生命周期内存在,并且可以在这个期间被访问和修改。根据变量的作用域,其生命周期也会有所不同:

    这个局部变量儿子啊!局部变量的生命周期从它们被声明的那一刻开始,直到包含它们的函数或代码块执行完毕。一旦函数或代码块结束,局部变量就会被销毁,其占用的内存会被释放。

    你听过这个全局变量全局吗?他呢是变量的生命周期是整个程序的执行期间。从程序开始运行到程序结束,全局变量都存在。这意味着全局变量在整个程序中都可以被访问和修改。

    爸爸给你一个例子看看,说完谭灰晨带着他的儿子谭落灰坐到电脑前,只见显示屏上显示着:

    ```c

    include <stdioh>

    int globalvar = 100; // 全局变量

    void myfunction() {

    int localvar = 200; // 局部变量

    printf(&34;inside function: global var = d, local var = d\n&34;, globalvar, localvar);

    }

    int main() {

    printf(&34;outside function: global var = d\n&34;, globalvar);

    myfunction();

    printf(&34;outside function: global var = d\n&34;, globalvar);

    // 试图访问 localvar 会导致编译错误,因为它只在 myfunction 函数内部可见

    // printf(&34;outside function: local var = d\n&34;, localvar);

    return 0;

    }

    ```

    儿子啊爸爸给你说的这个示例中,`globalvar` 是一个全局变量,可以在程序的任何地方访问。而 `localvar` 是一个局部变量,只能在 `myfunction` 函数内部访问。当 `myfunction` 函数执行完毕后,`localvar` 就会被销毁,其生命周期结束。而 `globalvar` 则在整个程序执行期间都存在,听了这么多落灰你知道变量是啥了吗?

    谭灰晨说完,落灰眨了眨眼睛,似乎有些明白了。他又问:“那什么是‘strlen’呢?”

    谭灰晨笑着继续解释:“‘strlen’啊,它就像是一个负责测量的人。在程序中,当我们想知道那条繁华的街道(字符串)有多长时,就可以请‘strlen’来帮忙。它会认真地数一遍街道上的每一家店铺和招牌(字符),然后告诉我们这条街道到底有多长(即字符的数量)。通过‘strlen’,我们就可以轻松地知道字符串的长度,这在很多情况下都是非常有用的。”

    “strlen”,它是一个在程序设计中常用的函数,用于测量字符串这条街道的长度(即字符的数量)。通过strlen,我们可以知道一个字符串包含了多少个字符,这对于很多字符串操作都是非常有用的。

    谭灰晨的解释有些复杂,落灰听得晕晕乎乎,他想着这还有好些问题要问爸爸呢!该从何处问起。而谭板栗在外面溜达了一圈,回到家中,听到父子俩的对话,也不禁露出了会心的微笑,在他耳边传来了小胖粒在阳台冬冬瞧着铁盒的声音。
<< 上一章 返回目录 下一章 >>
添加书签