背景技术
固态硬盘(Solid State Drives,SSD),是采用固态电子存储芯片阵列而制成的硬盘,固态硬盘包括控制单元和存储单元(FLASH存储芯片或DRAM存储芯片)。
目前,固态硬盘一般划分有系统区、用户区和预留区,优化写性能一般通过根据使用情况缩减用户空间,增加预留空间,虽保证了写性能不变,但用户可使用容量变减小;或者,通过增加NAND FLASH颗粒的数量,加大预留空间,使写放大系数在整个生命周期内都保持不变,写性能可以维持不变。但是由于NAND FLASH数量的增加固态硬盘的功耗增加,导致成本大幅提升。
基于此,现有技术亟待改进。
申请内容
本申请实施例旨在提供一种闪存空间动态分配方法及固态硬盘,其解决了现有固态硬盘存在的增加预留空间导致功耗增加,成本高的技术问题,实现在不增加预留空间的同时,维持固态硬盘整个生命周期的写性能不变。
为解决上述技术问题,本申请实施例提供以下技术方案:
第一方面,本申请实施例提供一种闪存空间动态分配方法,应用于固态硬盘,所述固态硬盘包括闪存介质,所述闪存介质包括第一区域、一级预留空间以及二级预留空间,所述方法包括:
确定第一区域的容量大小;
确定二级预留空间的容量大小;
根据所述第一区域的容量大小以及二级预留空间的容量大小,确定一级预留空间的容量大小;
当所述第一区域出现坏块时,从所述一级预留空间分配好块来替换所述第一区域中的坏块,并从所述二级预留空间中分配好块来替换所述一级预留空间中的坏块,以使一级预留空间的容量大小不变。
在一些实施例中,所述第一区域包括系统区和用户区,所述确定第一区域的容量大小,包括:
确定系统区的容量大小,以及,确定用户区的容量大小。
在一些实施例中,所述确定系统区的容量大小,包括:
计算系统元数据所需的容量大小;
将系统元数据所需的容量大小确定为系统区的容量大小。
所述确定用户区的容量大小,包括:
获取所述固态硬盘的标称容量;
将所述固态硬盘的标称容量确定为用户区的容量大小。
在一些实施例中,所述确定二级预留空间的容量大小,包括:
确定编程失败次数与擦除失败次数之和的最大值;
根据所述最大值以及一个物理块的容量大小,确定二级预留空间的容量大小。
在一些实施例中,所述确定编程失败次数与擦除失败次数之和的最大值,包括:
确定第一编程失败次数与第一擦除失败次数之和;
确定第二编程失败次数与第二擦除失败次数之和;
确定第三编程失败次数与第三擦除失败次数之和;
确定第一编程失败次数与第一擦除失败次数之和、第二编程失败次数与第二擦除失败次数之和、第三编程失败次数与第三擦除失败次数之和中的最大值,将其作为编程失败次数与擦除失败次数之和的最大值。
在一些实施例中,所述确定第一编程失败次数与第一擦除失败次数之和,包括:
获取预设数量的批次的闪存颗粒;
对每一批次的闪存颗粒进行擦除和编程操作,并持续到标称的擦除次数,以统计擦除失败和编程失败的总数,将擦除失败和编程失败的总数确定为第一编程失败次数与第一擦除失败次数之和。
在一些实施例中,所述确定第二编程失败次数与第二擦除失败次数之和,包括:
获取生产厂家提供的闪存介质的整个生命周期内的编程失败次数与擦除失败次数的总数,将闪存介质的整个生命周期内的编程失败次数与擦除失败次数的总数确定为第二编程失败次数与第二擦除失败次数之和。
在一些实施例中,所述确定第三编程失败次数与第三擦除失败次数之和,包括:
统计闪存介质在实际使用过程中出现的编程失败个数和擦除失败个数,将编程失败个数和擦除失败个数的和作为第三编程失败次数与第三擦除失败次数之和。
在一些实施例中,所述根据所述第一区域的容量大小以及二级预留空间的容量大小,确定一级预留空间的容量大小,包括:
获取所述闪存介质的总容量大小;
根据所述闪存介质的总容量大小,结合所述第一区域的容量大小以及二级预留空间的容量大小,确定一级预留空间的容量大小。
在一些实施例中,所述方法还包括:
在固态硬盘的运行过程中,获取一级预留空间的物理块的最大擦除次数,以及,获取二级预留空间的物理块的最小擦除次数;
计算一级预留空间的物理块的最大擦除次数与二级预留空间的物理块的最小擦除次数的差值;
当所述差值大于预设门限阈值时,将二级预留空间中的最小擦除次数对应的物理块替换一级预留空间中的最大擦除次数对应的物理块。
第二方面,本申请实施例提供一种固态硬盘,包括:
闪存介质,用于存储闪存数据;
主控制器,用于执行如第一方面所述的闪存空间动态分配方法。
第三方面,本申请实施例还提供了一种非易失性计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使固态硬盘能够执行如第一方面所述的闪存空间动态分配方法。
本申请实施例的有益效果是:区别于现有技术的情况下,本申请实施例提供的一种闪存空间动态分配方法,应用于固态硬盘,所述固态硬盘包括闪存介质,所述闪存介质包括第一区域、一级预留空间以及二级预留空间,所述方法包括:确定第一区域的容量大小;确定二级预留空间的容量大小;根据所述第一区域的容量大小以及二级预留空间的容量大小,确定一级预留空间的容量大小;当所述第一区域出现坏块时,从所述一级预留空间分配好块来替换所述第一区域中的坏块,并从所述二级预留空间中分配好块来替换所述一级预留空间中的坏块。通过设置一级预留空间来替换第一区域中的坏块,并设置二级预留空间补充一级预留空间,使得一级预留空间和二级预留空间进行动态分配,以使一级预留空间的容量大小不变,本申请能够维持固态硬盘整个生命周期的写性能不变。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
此外,下面所描述的本申请各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
典型的固态硬盘(Solid State Drives,SSD)通常包括固态硬盘控制器(主控制器)、闪存阵列、缓存单元以及其他外围单元。
其中,固态硬盘控制器用于作为控制运算单元,管理SSD内部系统;闪存阵列(NANDFlash),作为存储单元,用于存储数据,包括用户数据和系统数据,闪存阵列一般呈现多个通道(Channel,简写CH),一个通道独立连接一组NAND Flash,例如CH0/CH1……CHx。其中闪存(NAND Flash),其特性是写入之前,必须进行擦除,且每个闪存擦除次数有限;缓存单元,用于缓存映射表,所述缓存单元一般为动态随机存取存储器(Dynamic Random AccessMemory,DRAM)。其他外围单元可以包括传感器、寄存器等部件。
其中,闪存阵列(NAND Flash)的数据存储原理为:对于写入颗粒的数据值,每个数据值对应一个电荷量,颗粒通过存储电荷量的方式来保存数据。在数据读出时,颗粒将对应的电荷量和内部的参考电压作比较来区分出不同的数据。因此内部参考电压会影响读出的数据值。
固态硬盘中一般使用闪存阵列(NAND Flash)(包括SLC,MLC,TLC等其他新型介质)颗粒存储数据,包括系统空间、用户空间和预留空间。系统空间存放固态硬盘的固件、日志、表项、配置等重要数据,用户空间存放用户写入的数据,预留空间没有存放数据。一般固态硬盘的预留的空间,用来替换固态硬盘其他区域出现的坏块,系统区或者用户区域将坏块上的数据搬移到预留空间中的好块上,保证固态硬盘的系统数据和用户数据能正常写入并正常工作。
闪存阵列(NAND Flash)有固定擦写次数,随着使用不断对其进行擦写操作,有些页出现读失败,有些块出现编程失败和超时,有些块出现擦失败和超时,固件会统一把出现读写擦错误的不稳定的块加入到坏块表,不再使用,并从预留空间中的好块分配给用户区继续使用。随着系统区或用户区的不断出现坏块,预留空间的块替换掉系统区或用户区的坏块,这样预留空间的好块不断减少。随着系统区或用户区不断出现坏块,预留空间将好块替换系统区或用户区的坏块,这样预留空间的好块数量不断减少,造成写放大系数(WAF=1+1/(2*OP)-Ψ)逐渐增大。意味着垃圾回收的效率变低,搬移相同的数据量需要更大的带宽。
闪存阵列(NAND Flash)的写入速度乘以并发度和控制器处理写任务的最大带宽二者中取小的为最大写入带宽,而最大写入带宽等于垃圾回收写的带宽、主机写带宽以及其他后台任务写的带宽之和。生命过程中后台任务的写带宽可以看做恒定的,垃圾回收的写带宽增大,用户写的带宽降低。
固态硬盘的写性能即单位时间内从主机到固态硬盘的传输的比特数量决定的,读性能即单位时间内从固态硬盘到主机传输的比特数量决定的。而总的比特数量由传输的时延决定的,主要时延有主机提交到驱动时间Ts,主机到固态硬盘前端链路(PCI e、SATA、SAS等接口)传输时间Tt,固态硬盘控制器前端处理写命令时间Tc,控制器返回写命令完成的时间Tf。
在固态硬盘的生命周期中,主机的硬件和软件配置不变,即Ts不变,主机接口不变,即Tt不变,固态硬盘的控制器处理频率不变,即Tc不变,唯一有变化的是控制器返回写命令完成时间,即Tf变化。要维持生命周期内写性能恒定,就必须保持Tf不变。
其中,控制器返回写命令的时间Tf可以等于处理垃圾回收时间Tg、处理后台写任务时间Tb和主机写数据时间Th的总和,可以看出WAF=1+1/(2*OP)-Ψ,预留空间影响着写放大系数,写放大系数越大,垃圾回收写入数据量就越大时间越长Tg,生命过程中后台任务的写数量量可以看做恒定的,用户写的数据量如果不变Th。
如果需要维持Tf不变,需要维持写垃圾回收的处理速度,则需要维持写放大系数不变。
目前,固态硬盘一般划分有系统区、用户区和预留区,优化写性能一般通过根据使用情况缩减用户空间,增加预留空间,虽保证了写性能不变,但用户可使用容量变减小;或者,通过增加NAND FLASH颗粒的数量,加大预留空间,使写放大系数在整个生命周期内都保持不变,写性能可以维持不变。但是由于NAND FLASH数量的增加固态硬盘的功耗增加,导致成本大幅提升。
有鉴于此,本申请实施例提供一种闪存空间动态分配方法及固态硬盘,实现在不增加预留空间的同时,维持固态硬盘整个生命周期的写性能不变。
下面结合说明书附图阐述本申请的技术方案。
请参阅图1,图1是本申请实施例提供的一种固态硬盘的结构示意图;
如图1所示,所述固态硬盘100包括闪存介质110以及与所述闪存介质110连接的固态硬盘控制器120。其中,所述固态硬盘100通过有线或无线的方式与所述主机200通信连接,用以实现数据交互。
闪存介质110,作为所述固态硬盘100的存储介质,也称作闪存、Flash、Flash存储器或Flash颗粒,属于存储器件的一种,是一种非易失性存储器,在没有电流供应的条件下也能够长久地保存数据,其存储特性相当于硬盘,使得闪存介质110得以成为各类便携型数字设备的存储介质的基础。
其中,闪存介质110可以为Nand FLASH,Nand FLASH以单晶体管作为二进制信号的存储单元,其结构与普通的半导体晶体管非常相似,区别在于Nand FLASH的单晶体管加入了浮动栅和控制栅,浮动栅用于贮存电子,表面被一层硅氧化物绝缘体所包覆,并通过电容与控制栅相耦合,当负电子在控制栅的作用下被注入到浮动栅中,Nand FLASH的单晶体的存储状态就由“1”变成了“0”,而当负电子从浮动栅中移走后,存储状态就由“0”变成了“1”,包覆在浮动栅表面的绝缘体用于将浮动栅中的负电子困住,实现数据存储。即Nand FLASH的存储单元为浮动栅晶体管,使用浮动栅晶体管以电荷的形式存储数据。存储电荷的多少与浮动栅晶体管所被施加的电压的大小有关。
一个Nand FLASH包括至少一个Chip芯片,每一个Chip芯片由若干个Block物理块组成,每一个Block物理块包括若干个Page页。其中,Block物理块是Nand FLASH执行擦除操作的最小单位,Page页为Nand FLASH执行读写操作的最小单位,一个Nand FLASH的容量等于其Block物理块的数量*一个Block物理块包含的Page页的数量*一个Page页的容量。具体的,闪存介质10按照存储单元的电压的不同层次,可分为SLC、MLC、TLC以及QLC。
固态硬盘控制器120,包括数据转换器121、处理器122、缓存器123、闪存控制器124以及接口125。
数据转换器121,分别与处理器122和闪存控制器124连接,所述数据转换器121用于将二进制数据转换为十六进制数据,以及将十六进制数据转换为二进制数据。具体地,当所述闪存控制器124向所述闪存介质110写入数据时,通过所述数据转换器121将待写入的二进制数据转换为十六进制数据,然后再写入闪存介质110。当所述闪存控制器124从所述闪存介质110读取数据时,通过所述数据转换器121将闪存介质110中存储的十六进制数据转换为二进制数据,然后从二进制数据页寄存器中读取转换后的数据。其中,所述数据转换器121可以包括二进制数据寄存器和十六进制数据寄存器。所述二进制数据寄存器可以用于保存由十六进制转换为二进制后的数据,所述十六进制数据寄存器可以用于保存由二进制转换为十六进制后的数据。
处理器122,分别与数据转换器121、缓存器123、闪存控制器124以及接口125连接,其中,处理器122与数据转换器121、缓存器123、闪存控制器124以及接口125可以通过总线或者其他方式连接,所述处理器用于运行存储在缓存器123中的非易失性软件程序、指令以及模块,从而实现本申请任一方法实施例。
缓存器123,主要用于缓存主机200发送的读/写指令以及根据主机200发送的读/写指令从闪存介质110获取的读数据或者写数据。缓存器123作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块。缓存器123可以包括存储程序区,存储程序区可存储操作系统、至少一个功能所需要的应用程序。此外,缓存器123可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,缓存器123可选包括相对于处理器124远程设置的存储器。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。所述缓存器123可以为静态随机存取存储器(StaticRandom Access Memory,SRAM)或者耦合内存(Tightly Coupled Memory,TCM)或者双倍速率同步动态随机存储器(Double DataRate Synchronous Dynamic Random AccessMemory,DDR SRAM)。
闪存控制器124,与闪存介质110、数据转换器121、处理器122以及缓存器123连接,用于访问后端的闪存介质110,管理闪存介质110的各种参数和数据I/O;或者,用于提供访问的接口和协议,实现对应的SAS/SATA target协议端或者NVMe协议端,获取主机200发出的I/O指令并解码和生成内部私有数据结果等待执行;或者,用于负责FTL(Flashtranslation layer,闪存转换层)的核心处理。
接口125,连接主机200以及数据转换器121、处理器122以及缓存器123,用于接收主机200发送的数据,或者,接收所述处理器122发送的数据,实现主机200与处理器122之间的数据传输,所述接口125可以为SATA-2接口、SATA-3接口、SAS接口、MSATA接口、PCI-E接口、NGFF接口、CFast接口、SFF-8639接口和M.2NVME/SATA协议。
请再参阅图2,图2是本申请实施例提供的一种闪存阵列的分布示意图;
如图2所示,该固态硬盘的闪存阵列(SSDNANDFLASH)包括第一区域和预留区,其中,所述第一区域包括系统区和用户区,所述预留区包括一级预留空间和二级预留空间。
其中,所述系统区用于存储系统日志、固件、坏块表和映射表等元数据;所述用户区用于存储用户数据。
在本申请实施例中,所述一级预留空间的容量大小大于所述二级预留空间的容量大小,使得一级预留空间能够将好块分配给第一区域中的系统区或用户区。
具体的,请参阅图3,图3是本申请实施例提供的一种闪存空间动态分配方法的流程图;
其中,该闪存空间动态分配方法,应用于如上所述的固态硬盘,所述固态硬盘包括闪存介质,其特征在于,所述闪存介质包括第一区域、一级预留空间以及二级预留空间;
如图3所示,所述方法包括:
步骤S10:确定第一区域的容量大小;
其中,所述第一区域包括系统区和用户区,所述所述确定第一区域的容量大小,包括:
确定系统区的容量大小,以及,确定用户区的容量大小。
具体的,请再参阅图4,图4是图3中的步骤S10的细化流程图;
如图4所示,该步骤S10:确定第一区域的容量大小,包括:
步骤S11:确定系统区的容量大小;
具体的,所述确定系统区的容量大小,包括:计算系统元数据所需的容量大小,将系统元数据所需的容量大小确定为系统区的容量大小。其中,所述系统元数据包括系统日志、固件、坏块表和映射表。
步骤S12:确定用户区的容量大小;
具体的,所述确定用户区的容量大小,包括:获取所述固态硬盘的标称容量,将所述固态硬盘的标称容量确定为用户区的容量大小。
在本申请实施例中,通过确定系统区的容量大小,进一步确定用户区的容量大小,能够保证系统元数据优先进行容量分配,有利于保证固态硬盘的系统稳定性。
步骤S20:确定二级预留空间的容量大小;
其中,所述二级预留空间用于补充好块到一级预留空间。
具体的,请再参阅图5,图5是图3中的步骤S20的细化流程图;
如图5所示,该步骤S20:确定二级预留空间的容量大小,包括:
步骤S21:确定编程失败次数与擦除失败次数之和的最大值;
具体的,请再参阅图6,图6是图5中的步骤S21的细化流程图;
如图6所示,该步骤S21:确定编程失败次数与擦除失败次数之和的最大值,包括:
步骤S211:确定第一编程失败次数与第一擦除失败次数之和;
具体的,所述确定第一编程失败次数与第一擦除失败次数之和,包括:
获取预设数量的批次的闪存颗粒;
对每一批次的闪存颗粒进行擦除和编程操作,并持续到标称的擦除次数,以统计擦除失败和编程失败的总数,将擦除失败和编程失败的总数确定为第一编程失败次数与第一擦除失败次数之和。
其中,所述预设数量可以根据具体需要进行设置,假设所述预设数量为N,其中,N≥3且N为正整数,例如:预设数量为3,通过选取3个批次的NAND FLASH颗粒,对每一批次的内存颗粒进行不断的擦除和编程操作,持续到NAND FLASH标称的擦除次数,分别统计擦除失败和编程失败的个数,计算擦除失败和编程失败的总数,将总数确定为第一编程失败次数与第一擦除失败次数之和。
可以理解的是,由于每一批次的擦除失败和编程失败的总数不尽相同,因此,将所述第一编程失败次数与第一擦除失败次数之和确定为擦除失败和编程失败的最大总数,即取最大总数对应的批次的擦除失败和编程失败的总数作为第一编程失败次数与第一擦除失败次数之和。
可以理解的是,由于持续到NANDFLASH标称的擦除次数需要一定时间,因此确定第一编程失败次数与第一擦除失败次数之和需要进行预先处理,其处理时间,即持续时间=(一个块的擦除操作时间Te+软件下发命令的时间)*块的总数*标称次数。
步骤S212:确定第二编程失败次数与第二擦除失败次数之和;
具体的,所述确定第二编程失败次数与第二擦除失败次数之和,包括:
获取生产厂家提供的闪存介质的整个生命周期内的编程失败次数与擦除失败次数的总数,将闪存介质的整个生命周期内的编程失败次数与擦除失败次数的总数确定为第二编程失败次数与第二擦除失败次数之和。
例如:根据NAND FLASH生产厂家提供的报告,确定其NAND FLASH整个生命周期内的擦除失败的个数和编程失败的个数,将NAND FLASH在整个生命周期内的编程失败次数与擦除失败次数的总数确定为第二编程失败次数与第二擦除失败次数之和。
步骤S213:确定第三编程失败次数与第三擦除失败次数之和;
具体的,所述确定第三编程失败次数与第三擦除失败次数之和,包括:
统计闪存介质在实际使用过程中出现的编程失败个数和擦除失败个数,将编程失败个数和擦除失败个数的和作为第三编程失败次数与第三擦除失败次数之和。
步骤S214:确定第一编程失败次数与第一擦除失败次数之和、第二编程失败次数与第二擦除失败次数之和、第三编程失败次数与第三擦除失败次数之和中的最大值,将其作为编程失败次数与擦除失败次数之和的最大值。
具体的,将第一编程失败次数与第一擦除失败次数之和、第二编程失败次数与第二擦除失败次数之和、第三编程失败次数与第三擦除失败次数之和中的最大值作为编程失败次数与擦除失败次数之和的最大值,能够最大限度地保证二级预留空间的容量大小,使得二级预留空间有足够的物理块对一级预留空间中的物理块进行替换,并且不至于造成二级预留空间的容量过大,导致不必要的容量浪费,从而更好地提高固态硬盘的性能。
步骤S22:根据所述最大值以及一个物理块的容量大小,确定二级预留空间的容量大小。
具体的,二级预留空间的容量大小=最大值*一个物理块的容量大小。
步骤S30:根据所述第一区域的容量大小以及二级预留空间的容量大小,确定一级预留空间的容量大小;
具体的,请再参阅图7,图7是图3中的步骤S30的细化流程图;
如图7所示,该步骤S30:根据所述第一区域的容量大小以及二级预留空间的容量大小,确定一级预留空间的容量大小,包括:
步骤S31:获取所述闪存介质的总容量大小;
具体的,所述闪存介质的总容量大小,即固态硬盘的容量。
步骤S32:根据所述闪存介质的总容量大小,结合所述第一区域的容量大小以及二级预留空间的容量大小,确定一级预留空间的容量大小。
具体的,一级预留空间的容量大小=闪存介质的总容量大小-第一区域的容量大小-二级预留空间的容量大小,即,一级预留空间的容量大小=闪存介质的总容量大小-系统区的容量大小-用户区的容量大小-二级预留空间的容量大小。
例如:标称容量为960GB的固态硬盘,每个物理页Page=16384字节,每个物理块有768个物理页Page,每个Die有2956个物理块Block,每颗NANDFLASH有4个Die,一共有8颗NAND FLASH,总容量为1108GiB,系统区的容量大小为57GiB,系统区包括固件容量*备份数量、逻辑到物理的映射表及其他系统表项和日志容量等,用户区的容量大小为960*1000*1000*1000字节=894GiB,如生命过程中最多产生坏块1024个坏块,则二级预留空间的容量大小为1024*16384B*768=12GiB,则一级预留空间=1108-57-897-12=147GiB,其中,1GiB=1024*1024*1024B,1GB=1000*1000*1000B。
步骤S40:当所述第一区域出现坏块时,从所述一级预留空间分配好块来替换所述第一区域中的坏块,并从所述二级预留空间中分配好块来替换所述一级预留空间中的坏块,以使所述一级预留空间的容量大小不变;
具体的,当所述第一区域中的系统区和/或用户区出现坏块时,从所述一级预留空间分配好块来替换所述系统区和/或用户区中的坏块,由于第一区域中的坏块被替换至一级预留空间,为了保证一级预留空间的容量不变,即好块的容量不变,因此,需要从所述二级预留空间中分配好块替换所述一级预留空间中的坏块。
可以理解的是,当系统区和/或用户区每出现一个坏块,均从所述一级预留空间分配一个好块进行替换,以使所述一级预留空间的容量大小不变,从而能够维持固态硬盘整个生命周期的写性能不变。
请再参阅图8,图8是本申请实施例提供的一种物理块替换的流程图;
如图8所示,该物理块替换的流程,包括:
步骤S801:在固态硬盘的运行过程中,获取一级预留空间的物理块的最大擦除次数,以及,获取二级预留空间的物理块的最小擦除次数;
步骤S802:计算一级预留空间的物理块的最大擦除次数与二级预留空间的物理块的最小擦除次数的差值;
步骤S803:当所述差值大于预设门限阈值时,将二级预留空间中的最小擦除次数对应的物理块替换一级预留空间中的最大擦除次数对应的物理块。
请再参阅图9,图9是本申请实施例提供的一种空间分配的整体流程图;
如图9所示,该空间分配的整体流程,包括:
步骤S901:运行过程;
具体的,在固态硬盘的运行过程中,相当于在固态硬盘的生命周期内。
步骤S902:第一区域是否出现坏块;
具体的,判断第一区域是否出现坏块,其中,所述第一区域包括系统区和用户区,相当于判断所述系统区和/或用户区是否出现坏块,若是,则进入步骤S903:从一级预留空间分配好块来替换第一区域中的坏块;若否,则进入步骤S905:写放大不变,垃圾回收写入量不变;
步骤S903:从一级预留空间分配好块来替换第一区域中的坏块;
具体的,将所述第一区域中的坏块替换为一级预留空间中的好块,相当于将第一区域中的坏块与一级预留空间中的好块进行交换;
步骤S904:从二级预留空间中分配好块来替换一级预留空间中的坏块;
可以理解的是,步骤S903中相当于将第一区域中的坏块与一级预留空间中的好块进行交换,为了使得写放大系数不变以及垃圾回收写入量不变,需要对一级预留空间中的坏块进行替换,本申请通过设置二级预留空间来替换一级预留空间中的坏块,以使在固态硬盘的整个生命周期中一级预留空间的容量大小不变,有利于维持写放大系数不变以及垃圾回收写入量不变。
步骤S905:写放大不变,垃圾回收写入量不变;
具体的,写放大系数不变以及垃圾回收写入量不变。
步骤S906:计算一级预留空间的物理块的最大擦除次数与二级预留空间的物理块的最小擦除次数的差值;
具体的,固态硬盘的固件内部维护一张所有物理块的磨损均衡表,所述磨损均衡表用于专门记录每个物理块的擦除次数和平均擦除次数,通过查询该磨损均衡表可以得到一级预留空间中擦除次数最大的物理块和二级预留空间中擦除次数最小的物理块,并根据一级预留空间的物理块的最大擦除次数与二级预留空间的物理块的最小擦除次数,计算两者的差值,即计算一级预留空间的物理块的最大擦除次数与二级预留空间的物理块的最小擦除次数的差值;
步骤S907:差值是否大于预设门限阈值;
具体的,判断一级预留空间的物理块的最大擦除次数与二级预留空间的物理块的最小擦除次数的差值是否大于预设门限阈值,其中,所述预设门限阈值用于确定是否启动磨损均衡任务,其作为磨损均衡任务的启动门限,其中,所述预设门限阈值可以根据具体需要进行设置,例如:设置所述预设门限阈值为200,则若一级预留空间的物理块的最大擦除次数和二级预留空间的物理块的最小擦除数相差达到200时,则将这2个物理块进行交换,始终维持一级和二级预留空间中的块擦除次数在200的门限内。
步骤S908:将二级预留空间中的最小擦除次数对应的物理块替换一级预留空间中的最大擦除次数对应的物理块;
具体的,当一级预留空间的物理块的最大擦除次数与二级预留空间的物理块的最小擦除次数的差值大于预设门限阈值时,达到磨损均衡任务的启动门限,此时将将二级预留空间中的最小擦除次数对应的物理块替换一级预留空间中的最大擦除次数对应的物理块;
在本申请实施例中,所述第一区域和一级预留空间中的物理块进行磨损均衡任务,而二级预留空间中的物理块不进行磨损均衡任务。
可以理解的是,由于写任务选块优先选择擦除次数小的块,这样可以保持用户区和一级预留空间的块的擦除次数均衡。但二级预留空间中的物理块没有进行磨损均衡操作,其擦除次数很小,一旦把擦除次数很小的块换到一级预留空间中,原来块的最大擦除次数减去该块的擦除次数大于磨损均衡的启动门限,容易使得磨损均衡任务频繁启动,造成不必要的性能开销。因此,本申请通过设置预设门限阈值作为磨损均衡任务的启动门限,通过计算一级预留空间的物理块的最大擦除次数与二级预留空间的物理块的最小擦除次数的差值,与预设门限阈值进行比较,从而确定是否进行一级预留空间和二级预留空间中的物理块的替换,避免磨损均衡任务降低固态硬盘的写性能。
步骤S909:后台任务写入量不变;
具体的,若一级预留空间的物理块的最大擦除次数与二级预留空间的物理块的最小擦除次数的差值不大于预设门限阈值,则磨损均衡任务不启动,此时后台任务写入量保持不变。
步骤S910:生命周期内,写性能一致;
具体的,当后台任务写入量不变时,固态硬盘的生命周期内,写性能维持一致。
在本申请实施例中,通过提供一种闪存空间动态分配方法,应用于固态硬盘,所述固态硬盘包括闪存介质,所述闪存介质包括第一区域、一级预留空间以及二级预留空间,所述方法包括:确定第一区域的容量大小;确定二级预留空间的容量大小;根据所述第一区域的容量大小以及二级预留空间的容量大小,确定一级预留空间的容量大小;当所述第一区域出现坏块时,从所述一级预留空间分配好块来替换所述第一区域中的坏块,并从所述二级预留空间中分配好块来替换所述一级预留空间中的坏块。通过设置一级预留空间来替换第一区域中的坏块,并设置二级预留空间补充一级预留空间,使得一级预留空间和二级预留空间进行动态分配,以使所述一级预留空间的容量大小不变,本申请能够维持固态硬盘整个生命周期的写性能不变。
本申请实施例还提供了一种非易失性计算机存储介质,所述计算机存储介质存储有计算机可执行指令,该计算机可执行指令被一个或多个处理器执行,可使得上述一个或多个处理器可执行上述任意方法实施例中的闪存空间动态分配方法,例如,执行上述任意方法实施例中的闪存空间动态分配方法,例如,执行以上描述的闪存空间动态分配方法的各个步骤。
以上所描述的装置或设备实施例仅仅是示意性的,其中所述作为分离部件说明的单元模块可以是或者也可以不是物理上分开的,作为模块单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络模块单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用直至得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本申请的技术方案,而非对其限制;在本申请的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,步骤可以以任意顺序实现,并存在如上所述的本申请的不同方面的许多其它变化,为了简明,它们没有在细节中提供;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的范围。