[0057] 也就是说,如果满足上述预设条件,则按照数据状态中包含的预设比特值的数量来确定数据状态序列,然后直接跳转到S130中继续执行即可。如果不满足上述预设条件,则需要按照下文中的S120确定数据状态序列。
[0058] 可理解的是,如果两个数据状态中包含的预设比特值的数量是相等的,此时两个数据状态的先后顺序可以随机。
[0059] 可理解的是,在满足预设条件时,按照数据状态中包含的预设比特值的数量来确定数据状态序列的方式可以称之为直接映射法。这种方式可以省去步骤S120中的统计步骤,因此可以减少计算量。
[0060] 同时,在实际中造成比特误码率高的往往是存储状态的误判概率最高的存储状态,即最差的存储状态。因此尽量减少最差的存储状态存储的数据组的数量,使得最优的存储状态存储尽可能多的数据组,这样可以大大降低比特误码率。因此在上述直接映射法中,如果在待处理数据中比特1的数量远大于0时,将包含1最多的数据状态排列在最前面,将包含0最多的数据状态排列在最后面,这样当将数据状态序列和存储状态序列进行一一映射时,包含1最多的数据状态和最优的存储状态对应,包含0最多的数据状态和最差的存储状态对应,这样在数据存储时,由于比特1的数量较多,比特0的数量较少,可以使得数量较少的数据组被存储到较差的存储状态中,数量较多的数据组被存储到较优的存储状态中,进而减少比特误码率。
[0061] S120、统计所述多个数据组中每一个数据状态的数量,并将各个数据状态按照数量的第一顺序方向进行排序,得到数据状态序列;
[0062] 例如,数据单元类型为TLC,则一共有8个数据状态。数据单元类型为QLC,则一共有16个数据状态。可见,不同的数据单元类型具有不同数量的数据状态。
[0063] 其中,第一顺序方向可以为从大到小,也可以为从小到大。下文中提到的第二顺序方向和第一顺序方向相反,因此当第一顺序方向为从大到小时,第二顺序方向为从小到大。当第一顺序方向为从小到大时,第二顺序方向为从大到小。
[0064] 例如,数据单元类型为TLC,这8种数据状态分别为:110、111、011、101、001、100、101、000。针对各个数据组,统计这8种数据状态的数量,然后按照数量从多到少进行排序,得到上述数据状态序列。例如,将8种数据状态按照数量从多到少的顺序排序后,可以得到的数据状态序列为:{110,111,011,101,001,100,010,000}。
[0065] 在具体实施时,S120中所述统计所述多个数据组中每一个数据状态的数量,可以包括:
[0066] S121、从所述多个数据组中抽样选取预设数量的数据组;
[0067] S122、统计所述预设数量的数据组中每一个数据状态的数量;
[0068] S123、将所所述预设数量的数据组中每一个数据状态的数量作为所述多个数据组中该数据状态的数量。
[0069] 例如,一共有10000个数据组,仅选取其中1000个数据组。针对这1000个数据组,统计各个数据状态各自的数量,以此来代表10000个数据组中各个数据状态各自的数量。
[0070] 可理解的是,在步骤S120中可以对全量数据统计每一个数据状态的数量,也可以采用抽样的方式统计一部分数据中每一个数据状态的数量,然后用这一部分数据中每一个数据状态的数量来代表全量数据中每一个数据状态的数量。
[0071] S130、将存储颗粒的各个存储状态按照误判概率的第二顺序方向进行排序,得到存储状态序列;其中,所述存储状态的数量和所述数据状态的数量相等,所述第一顺序方向和所述第二顺序方向相反;
[0072] 其中,针对数据单元类型为TLC的存储颗粒,存储状态也包括8种,例如参见图1中示出的P0 P7。~
[0073] 其中,误判概率可以通过离线的方式进行测试标定得到,然后存储在存储器中。
[0074] 在该步骤中,将各个存储状态按照误判概率的高低进行排序,误判概率越低,存储状态越靠前。例如,排序后得到的存储状态序列为:{ P2, P3, P4, P5, P6, P0, P1, P7 }。
[0075] S140、将所述数据状态序列中的每一个数据状态和所述存储状态序列中对应位置的存储状态进行一一映射,得到第一状态映射表;
[0076] 例如,数据状态序列为:{110,111,011,101,001,100,010,000},存储状态序列为:{ P2, P3, P4, P5, P6, P0, P1, P7 },将两个序列映射之后得到的第一状态映射表为:
{110:P2, 111:P3, 011:P4, 101:P5, 001:P6, 100:P0, 010:P1, 000:P7}。
[0077] S150、获取所述存储颗粒采用的格雷码映射表;其中,所述格雷码映射表中包括各个存储状态和各个格雷码之间的映射关系;
[0078] 例如,参见图1中的格雷码映射表为:{P7:110, P0 :111,P1:011,P3: 101,P2:001,P4:100,P6:010,P5:000}。
[0079] S160、根据所述第一状态映射表和所述格雷码映射表,生成第二状态映射表;其中,所述第二状态映射表中包括各个数据状态和各个格雷码之间的映射关系。
[0080] 例如,第一状态映射表为:{110:P2, 111:P3, 011:P4, 101:P5, 001:P6, 100:P0, 010:P1, 000:P7},格雷码映射表为:{P7:110, P0 :111,P1:011,P3: 101,P2:001,P4:
100,P6:010,P5:000},第二状态映射表可以参见下表1:
[0081] 表
[0082]数据状态 110 111 011 101 001 100 010 000
存储比特 001 101 100 000 010 111 011 110
[0083] 通过以上描述,可以针对待处理数据生成对应的第二状态映射表,进而将第二状态映射表应用在数据读写场景或者数据巡检场景中。
[0084] (一)针对数据读写场景
[0085] 例如,在存储控制器接收到主机发送来的写入请求时,上文中的待处理数据为待写入数据,此时存储控制器会执行步骤S110 S160,得到第二状态映射表。此时,存储控制器~便可以按照第二状态映射表对所述待写入数据对应的各个数据组进行数据存储。
[0086] 在具体实施时,方法可以具体包括:
[0087] 在接收到写入请求时, 执行步骤S110 S160,得到待写入数据对应的第二状态映~射表;
[0088] 将所述待写入数据对应的所述多个数据组按照所述第二状态映射表进行转码,将转码后的数据进行编码,并在编码后存储至所述存储颗粒。
[0089] 其中,转码是指将待写入数据的每一个数据组转成格雷码,然后对得到的格雷码进行编码,例如ECC编码,得到编码数据,进而将编码数据存储在存储颗粒中,实现数据的写入操作。
[0090] 参见图3,下面针对待写入数据的大致写入过程进行举例描述:
[0091] (1.1)在接收到写入请求时,按照数据单元类型将待写入数据进行分组,得到多个数据组;其中,每一个数据组中包含的比特数和所述数据单元类型相匹配;
[0092] (1.2)统计所述多个数据组中每一个数据状态的数量,并将各个数据状态按照数量从大到小的顺序进行排序,得到数据状态序列;
[0093] (1.3)将存储颗粒的各个存储状态按照误判概率从小到大的顺序,得到存储状态序列;其中,所述存储状态的数量和所述数据状态的数量相等;
[0094] (1.4)将所述数据状态序列中的每一个数据状态和所述存储状态序列中对应位置的存储状态进行一一映射,得到第一状态映射表;
[0095] (1.5)获取所述存储颗粒采用的格雷码映射表;其中,所述格雷码映射表中包括各个存储状态和各个格雷码之间的映射关系;
[0096] (1.6)根据所述第一状态映射表和所述格雷码映射表,生成第二状态映射表;其中,所述第二状态映射表中包括各个数据状态和各个格雷码之间的映射关系;
[0097] (1.7)将所述待写入数据对应的所述多个数据组按照所述第二状态映射表进行转码,将转码后的数据进行编码,并在编码后存储至所述存储颗粒。
[0098] 以上步骤(1.1) (1.7)尤其适用于针对该待写入数据的初次写入过程。在初次写~入完成后,上述数据状态序列、存储状态序列、第一状态映射表、第二状态映射表等会进行存储。如果针对该待写入数据不是第一次写入,可以直接获取该待写入数据的初始数据状态序列、初始存储状态序列等,判断当前存储颗粒的存储状态序列相对于初始存储状态序列是否发生变化。如果发生变化,则利用当前的存储状态序列和初始数据状态序列生成第一状态映射表、第二状态映射表等。如果没有发生变化,则直接采用初始的第二状态映射表。
[0099] 在将数据进行写入操作之后,可以进行读取,在读取时同样需要基于上述第二状态映射表进行反向转码。具体的,本方法还可以包括:
[0100] 在接收到读取请求时,进行数据的读取操作,所述读取操作包括:从所述存储颗粒中读取数据;将所读取数据进行解码,得到解码后的数据组;根据所述第二状态映射表,将所述解码后的数据组进行反向转码,得到反向转码后的数据组。
[0101] 也就是说,在接收到读取请求时,具体的读取操作包括:首先从存储颗粒中读取数据,将读取的数据进行解码,例如,ECC解码,得到解码后的数据,然后将解码后的数据进行反向转码。所谓的反向转码是指将格雷码转换为数据状态,这样就可以得到反向转码后的数据,即得到在写入操作时进行转码之前的数据,至此才完成数据的读取操作。
[0102] 在实际中,参见图4,在进行写入操作时,在执行S110之前,还可以对待写入数据进行加扰处理、非对称编码等,所谓的加扰是一种数字信号的加工处理方法,将扰码和待写入数据相乘,得到新的待写入数据,实现在时间上、频率上的打散。非对称编码也是一种编码方式,可以进一步加大数据分布的差异性。
[0103] 同样的,参见图4,如果在写入时进行了加扰、非对称编码处理,在数据读取时,在反向转码之后,也要进行非对称解码、解扰处理,才能得到想要的数据。
[0104] 也就是说,在步骤(1.1)之前,对所述多个数据组进行加扰处理和/或非对称编码处理。而针对读取操作,在将所述解码后的数据组进行反向转码之后,所述方法还包括:对所述转码前的数据组进行非对称解码处理和/或解扰处理。可见,写入操作和读取操作是相对应的。
[0105] (二)针对数据巡检场景
[0106] 在实际中,随着数据存储时间的延长,会发生掉电的现象,例如,存储状态P7会掉到存储状态P6,进而会造成数据错误,后续可能发生解码错误的问题。为了避免或者减少这种情况的发生,采用了一种数据巡检的手段。所谓的数据巡检是指数据在存储颗粒中的驻留时间达到某种时长后,存储控制器就会将数据读取出来,进行纠错,纠错后得到正确的数据,之后将正确的数据再存储到存储颗粒中。这样可以减少数据发生错误的概率。
[0107] 如果在数据的首次写入操作时是基于第二状态映射表执行的,那么在每一个巡检周期内也要基于上述第二状态映射表进行数据巡检。具体的数据巡检过程可以包括b1 b3:~
[0108] b1、在每一个数据巡检周期中,从所述存储颗粒中进行数据读取操作,得到待巡检数据;对所述待巡检数据进行纠错处理以及确定各个存储状态的误判概率;
[0109] 在该步骤中,从存储颗粒中进行数据读取操作,该读取操作和上文中的读取操作一致,因此读取之后,可以得到反向转码后的数据,即转码之前的数据,这里称之为待巡检数据。
[0110] 在得到待巡检数据后,可以将待巡检数据输入到ECC解码器中,ECC解码器便可以输出纠错后的待巡检数据以及各个存储状态的误判概率。误判概率也可以采用存储状态的出错比特率进行表示,因此ECC解码器在进行纠错时得知每个存储状态出错的比特数量,进而计算得到每个存储状态的误判概率。
[0111] b2、针对纠错处理后的待巡检数据,执行步骤S110 S160,得到本次巡检周期对应~的第二状态映射表;
[0112] 也就是说,针对纠错处理后的待巡检数据,确定对应的数据状态序列和存储状态序列,将数据状态序列和存储状态序列进行映射得到第一状态映射表,获取格雷码映射表,根据第一状态映射表和格雷码映射表生成第二状态映射表。
[0113] 可理解的是,如果针对待巡检数据预先存储了对应的数据状态序列,就可以直接获取该数据状态序列。如果没有预先存储数据状态序列,可以按照S110 S120确定数据状态~序列。
[0114] 也就是说,在执行S110 160的过程时,尤其是在S110之前,判断针对所述待巡检数~据是否存在预先存储的数据状态序列;
[0115] 若存在,则获取针对所述待巡检数据预先存储的数据状态序列,并跳转到步骤“将各个存储状态按照误判概率的第二顺序方向进行排序”;
[0116] 若不存在,则执行“按照数据单元类型将待处理数据进行分组”。
[0117] 即,如果存在预先存储的数据状态序列,则直接获取该数据状态序列,进而跳转到S130的步骤,不必再执行S110和S120。而如果不存在,则开始执行S110。
[0118] b3、按照本次巡检周期对应的第二状态映射表,对纠错处理后的待巡检数据进行转码,将转码后的数据进行编码,并在编码后存储至所述存储颗粒。
[0119] 在得到本次巡检周期的第二状态映射表之后,依据第二状态映射表将纠错之后的待巡检数据转换为格雷码,进而对格雷码进行编码,编码之后进行存储即可。
[0120] 至此,完成一个数据巡检周期的数据巡检过程。
[0121] 在实际中,在上述过程中发现本次巡检周期中的存储状态序列和初始的存储状态序列相同,此时可以依据原本的第二状态映射表将纠错后的待巡检数据进行数据存储,不必再执行生成第一状态映射表、获取格雷码映射表、生成第二状态映射表的步骤。
[0122] 可理解的是,存储颗粒的存储状态序列可能会因为某种原因发生变化,如果发生了变化,则需要生成新的第二状态映射表,如果没有发生变化可以依据原本的第二状态映射表。
[0123] 另外,本发明实施例中可以采用ECC解码器统计各个存储状态的误判概率,而由于ECC统计误判概率是比较耗时的,因此可以采用如下替代方法来确定各个存储状态的误判概率:
[0124] 根据巡检周期的时长、上一个巡检周期内的读取次数和待存储单元的PE次数中的至少一项,确定对应的误判概率表格,并获取所述对应的误判概率表格中各个存储状态的误判概率;其中,每一个误判概率表格中包含各个存储状态各自对应的误判概率。
[0125] 例如,在实际场景中,巡检周期时长分为3档、读取次数分为5档、PE次数分为5档,每一档的巡检周期时长、读取次数、PE次数对应一个误判概率表格,一共会有75个误判概率表格。在需要统计误判概率时,可以根据巡检周期的时长所在的档位、上一个巡检周期内的读取次数所在的档位、待存储单元的PE次数所在的档位,确定对应的误判概率表格。这种方式的计算量比较小,可以缩短用时。
[0126] 可理解的是,本发明实施例中上述确定误判概率的方法不限于在数据巡检场景中,也可以应用在其它场景中。即,上述确定误判概率的方法可以应用在状态映射处理方法适用的任一场景中。
[0127] 参见图5,下面对每一个巡检周期内的巡检过程进行举例说明:
[0128] (2.1)从存储颗粒中进行数据读取操作,得到待巡检数据;
[0129] (2.2)将待巡检数据输入到ECC解码器中,得到纠错后的待巡检数据和各个存储状态的误判概率;
[0130] (2.3)按照各个存储状态的误判概率从小到大的顺序,将各个存储状态排序,得到存储状态序列,经过判断得知该存储状态序列和初始的存储状态序列不同;
[0131] (2.4)获取针对所述待巡检数据预先存储的数据状态序列;
[0132] (2.5)将所述数据状态序列中的每一个数据状态和所述存储状态序列中对应位置的存储状态进行一一映射,得到第一状态映射表;
[0133] (2.6)获取所述存储颗粒采用的格雷码映射表;
[0134] (2.7)根据所述第一状态映射表和所述格雷码映射表,生成第二状态映射表;
[0135] (2.8)按照所述第二状态映射表对纠错处理后的待巡检数据进行转码,将转码后的数据进行编码,并在编码后存储至所述存储颗粒。
[0136] 举例来说,参见图6,为各个存储状态的误判概率,基于图6生成存储状态序列,进而形成第二状态映射表。基于该第二状态映射表进行数据读写和数据巡检时产生的比特误码率,相对于现有技术中仅通过格雷码映射表进行数据读取和数据巡检时产生的比特误码率有不同程度的下降。例如,针对图7中12种不同类型的数据(xml数据、x‑ray数据等)进行读写或巡检,发现比特误码率都会下降。
[0137] 在本发明实施例中的存储颗粒是指实际存储数据的地方,通常以颗粒芯片、Die(即逻辑单元)、Block(即块)、WordLine(即字线)、page(即页)的方式依次索引。存储颗粒按照每个存储单元可存储的比特数量分为SLC(1bit)、MLC (2bits), TLC (3bits)等。PE次数为存储单元的擦写次数。
[0138] 本发明实施例提供的方法,首先按照数据单元类型将待处理数据进行分组,得到多个数据组,统计所述多个数据组中每一个数据状态的数量,将各个数据状态按照数量的第一顺序方向进行排序,得到数据状态序列;将存储颗粒的各个存储状态按照误判概率的第二顺序方向进行排序,得到存储状态序列;将所述数据状态序列中的每一个数据状态和所述存储状态序列中对应位置的存储状态进行一一映射,得到第一状态映射表。然后获取所述存储颗粒采用的格雷码映射表,再根据所述第一状态映射表和所述格雷码映射表,生成第二状态映射表。可知在第一状态映射表中,误判概率最低的存储状态和数量最多的数据状态对应,误判概率最高的存储状态和数量最少的数据状态对应,这样可以使得数量较多的数据状态对应的格雷码存储在误判概率较低的存储状态中,数量较少的数据状态对应的格雷码存储在误判概率较高的存储状态中,这样相对于现有技术中固定映射的方式可以降低数据整体的比特误码率,进而可以减轻解码器的纠错负荷,缩短数据读取的延迟等。
[0139] 第二方面,本发明实施例提供一种状态映射处理装置。
[0140] 参见图8,该装置包括:
[0141] 第一分组模块,用于按照数据单元类型将待处理数据进行分组,得到多个数据组;其中,每一个数据组中包含的比特数和所述数据单元类型相匹配;
[0142] 第一排列模块,用于统计所述多个数据组中每一个数据状态的数量,并将各个数据状态按照数量的第一顺序方向进行排序,得到数据状态序列;
[0143] 第二排列模块,用于将存储颗粒的各个存储状态按照误判概率的第二顺序方向进行排序,得到存储状态序列;其中,所述存储状态的数量和所述数据状态的数量相等,所述第一顺序方向和所述第二顺序方向相反;
[0144] 第一映射模块,用于将所述数据状态序列中的每一个数据状态和所述存储状态序列中对应位置的存储状态进行一一映射,得到第一状态映射表;
[0145] 第一获取模块,用于获取所述存储颗粒采用的格雷码映射表;其中,所述格雷码映射表中包括各个存储状态和各个格雷码之间的映射关系;
[0146] 第二映射模块,用于根据所述第一状态映射表和所述格雷码映射表,生成第二状态映射表;其中,所述第二状态映射表中包括各个数据状态和各个格雷码之间的映射关系。
[0147] 第三方面,本发明实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现第一方面提供的方法的步骤。
[0148] 具体地,可以提供配有存储介质的系统或者装置,在该存储介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该系统或者装置的计算机(或CPU或MPU)读出并执行存储在存储介质中的程序代码。
[0149] 在这种情况下,从存储介质读取的程序代码本身可实现上述实施例中任何一项实施例的功能,因此程序代码和存储程序代码的存储介质构成了本发明的一部分。
[0150] 此外,应该清楚的是,不仅可以通过执行计算机所读出的程序代码,而且可以通过基于程序代码的指令使计算机上操作的操作系统等来完成部分或者全部的实际操作,从而实现上述实施例中任意一项实施例的功能。
[0151] 此外,可以理解的是,将由存储介质读出的程序代码写到插入计算机内的扩展板中所设置的存储器中或者写到与计算机相连接的扩展模块中设置的存储器中,随后基于程序代码的指令使安装在扩展板或者扩展模块上的CPU等来执行部分和全部实际操作,从而实现上述实施例中任一实施例的功能。
[0152] 可理解的是,本发明实施例提供的计算机可读介质中有关内容的解释、具体实施方式、有益效果、举例等内容可以参见第一方面提供的方法中的相应部分,此处不再赘述。
[0153] 第四方面,本发明实施例提供一种SSD设备,SSD设备包括存储控制器,所述存储控制器包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现第一方面提供的方法的步骤。
[0154] 可理解的是,本发明实施例提供的SSD设备中有关内容的解释、具体实施方式、有益效果、举例等内容可以参见第一方面提供的方法中的相应部分,此处不再赘述。
[0155] 本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0156] 本领域技术人员应该可以意识到,在上述一个或多个示例中,本发明所描述的功能可以用硬件、软件、挂件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。
[0157] 以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在本发明的保护范围之内。