CN107924291B - 存储*** - Google Patents
存储*** Download PDFInfo
- Publication number
- CN107924291B CN107924291B CN201680050453.2A CN201680050453A CN107924291B CN 107924291 B CN107924291 B CN 107924291B CN 201680050453 A CN201680050453 A CN 201680050453A CN 107924291 B CN107924291 B CN 107924291B
- Authority
- CN
- China
- Prior art keywords
- flash memory
- data
- address
- virtual
- information
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0638—Organizing or formatting or addressing of data
- G06F3/064—Management of blocks
- G06F3/0641—De-duplication techniques
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/0608—Saving storage space on storage systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/061—Improving I/O performance
- G06F3/0613—Improving I/O performance in relation to throughput
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/0614—Improving the reliability of storage systems
- G06F3/0619—Improving the reliability of storage systems in relation to data integrity, e.g. data losses, bit errors
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0668—Interfaces specially adapted for storage systems adopting a particular infrastructure
- G06F3/0671—In-line storage system
- G06F3/0683—Plurality of storage devices
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/08—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers from or to individual record carriers, e.g. punched card, memory card, integrated circuit [IC] card or smart card
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0238—Memory management in non-volatile memory, e.g. resistive RAM or ferroelectric memory
- G06F12/0246—Memory management in non-volatile memory, e.g. resistive RAM or ferroelectric memory in block erasable memory, e.g. flash memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0668—Interfaces specially adapted for storage systems adopting a particular infrastructure
- G06F3/0671—In-line storage system
- G06F3/0673—Single storage device
- G06F3/0679—Non-volatile semiconductor memory device, e.g. flash memory, one time programmable memory [OTP]
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Human Computer Interaction (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Microelectronics & Electronic Packaging (AREA)
- Computer Security & Cryptography (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明的一个实施方式的存储***包括多个闪存组件和在主机与闪存组件之间控制读写处理的存储控制器。该存储***在多个闪存组件中的第1闪存组件的第1地址上写入了与第2闪存组件的第2地址上写入的数据相同的数据时,将第2地址与第1地址关联地存储在第1闪存组件中来进行重复去除。在第1闪存组件以与第1地址关联的方式存储了第2地址的状态时,当从存储控制器接收到对第1地址的读取请求时,将第2地址回送到存储控制器。接收到第2地址的存储控制器通过对第2闪存组件发出读取请求来从第2闪存组件取得读取对象数据。
Description
技术领域
本发明涉及存储***中的重复去除技术。
背景技术
以闪存为存储介质的存储设备由于与HDD等相比在速度上具有绝对性的优势,因此随着单位比特成本的降低,近年来迅速开始普及。另一方面,目前的存储***通过装载多个HDD等存储设备来实现高可靠性和高性能。因此,对于以闪存为存储介质的存储设备,通常也是在存储***内装载有多个,由存储控制器来对以闪存为存储介质的存储设备进行控制。另外,在以闪存为存储介质的存储设备中,有的设备具有与HDD兼容的尺寸外形(formfactor)和接口。其被称作SDD。此外,还存在与HDD不兼容的设备。本发明以这两者为对象,下文将其称作闪存组件(flash package)。
闪存的单位比特成本比磁盘昂贵,因此在削减存储数据的容量以增大表面上的可用容量方面有很高的需求。在存储***中,作为削减数据存储容量的技术之一,存在重复去除技术。该技术利用存储控制器检查存储***中是否存储有多个相同内容的数据。在相同内容的数据(重复数据)存在多个的情况下,仅将其中的1个保留在存储***中,删除其余的数据。由此能够削减存储在存储装置中的数据量。
例如,专利文献1公开了一种装载有多个闪存模块的存储装置中的重复去除技术。专利文献1公开的存储装置装载有多个被称作闪存模块的存储设备。并且,专利文献1公开的存储装置将数据按被称作条带单元(stripe unit)的数据单位进行分割,将分割后的数据分散地存储在多个闪存模块中。在进行重复去除处理时,存储控制器对于大小为条带单元以上的数据,在跨多个闪存模块的范围进行重复去除。并且,闪存模块以闪存模块内的数据为对象,进行大小为条带单元以下的数据的重复去除。在专利文献1公开的技术中,由于在跨多个存储设备的范围内进行重复去除,所以与进行仅以存储设备的数据为对象的重复去除处理的情况相比,数据量削减的效果增大。
另一方面,近年来,容量虚拟化功能在存储***中得到了普及。容量虚拟化功能指的是向主机方提供比存储***所具有的存储设备的物理容量更大的虚拟容量的功能,通常由存储***内的存储控制器具有该功能。该功能利用了这样的特性,即,在用户实际使用存储***时,与用户所定义的用户卷(user volume,用户看到的存储装置)的容量相比,实际上存储在用户卷中的数据的量总是不会达到用户卷的容量。
即,在不使用容量虚拟化功能的情况下,用户在定义卷时,需要确保与卷的容量相等的物理存储区域。若使用了容量虚拟化功能,则在定义卷的时刻,用户并不需要准备与卷的容量相应的物理存储区域。而是在实际发生了向卷内的数据写入时,才开始对卷分配存储区域。由此,能够削减事先应当准备的存储设备的容量,并且用户不需要严格地定义卷容量,只需简单地定义为较为宽裕的值即可,所以易用性也能够提高。
专利文献2公开了一种这样的技术,即,在具有多个闪存组件的存储***中,不仅对存储控制器,对闪存组件也设置了容量虚拟化功能。并且,专利文献2公开的存储***还公开了由闪存组件将数据压缩的技术。通常,数据的压缩率根据数据的内容而不同,因此很难预测压缩后的数据大小。并且,若数据被更新,则压缩率当然也发生变化。为此,专利文献2公开了一种根据压缩率的变化而改变由闪存组件向存储控制器提供的卷的大小(虚拟容量)的技术。
现有技术文献
专利文献
专利文献1:美国专利申请公开第2009/0089483号说明书
专利文献2:美国专利申请公开第2012/0317333号说明书
发明内容
发明要解决的课题
随着存储***的存储数据量的增大,重复去除处理的负载会增大。在专利文献1公开的技术中,以跨多个存储设备的范围内的数据为对象的重复去除处理是由存储控制器进行的。因此,随着存储数据量的增大,存储控制器可能会成为性能上的瓶颈。另一方面,若按存储设备进行重复去除处理,则该重复去除处理中作为对象的数据仅限于存储设备内的数据,重复去除处理的效果无法提高。
本发明要解决的技术问题是,在包括大量闪存组件的大规模存储***中,对整个存储***在减小对性能造成的影响的同时利用重复去除技术削减闪存上的存储数据容量,使得实际上能够存储更多容量的数据。
用于解决课题的方法
本发明的一个实施方式的存储***包括多个闪存组件和在主机与闪存组件之间控制读写处理的存储控制器。该存储***在多个闪存组件中的第1闪存组件的第1地址上写入了与第2闪存组件的第2地址上写入的数据相同的数据时,将第2地址与第1地址关联地存储在第1闪存组件中来进行重复去除。
在第1闪存组件以与第1地址关联的方式存储了第2地址的状态时,当从存储控制器接收到对第1地址的读取请求时,将第2地址回送到存储控制器。接收到第2地址的存储控制器通过对第2闪存组件发出读取请求来从第2闪存组件取得读取对象数据。
发明效果
根据本发明,在连接有大量闪存组件的大容量存储***中,能够执行闪存组件间的数据的重复去除,并且能够在抑制存储控制器的性能退化的同时,削减数据存储量以存储比物理容量大的量的数据。
附图说明
图1是表示包括实施例1或2中的存储***的信息***的结构的图。
图2是表示闪存组件的结构的图。
图3是表示逻辑卷、虚拟页、实际页、闪存组件组的关系的概念图。
图4是表示闪存卷与实际块的关系的概念图。
图5是表示实施例1中的存储***的共享存储器中存储的信息的图。
图6是表示逻辑卷信息的格式的图。
图7是表示实际页信息的格式的图。
图8是表示闪存组件信息的格式的图。
图9是表示闪存组件组信息的格式的图。
图10是表示空闲实际页管理信息队列的结构的图。
图11是表示哈希值存储信息的格式的图。
图12是表示实施例1中的闪存组件的组件存储器内存储的信息的图。
图13是表示组件信息的格式的图。
图14是表示芯片信息的格式的图。
图15是表示实际块信息的格式的图。
图16是表示空闲实际块信息队列的结构的图。
图17是表示虚拟块组信息的格式的图。
图18是表示进行重复去除处理时的虚拟段(segment)的状态的概念图。
图19是表示历史信息的格式的图。
图20是表示哈希索引信息的结构的图。
图21是表示叶子段(leaf segment)的说明图。
图22是表示实施例1中的存储控制器的内存内存储的程序的图。
图23是表示实施例1或2中的读取处理执行部的处理流程的图。
图24是表示写入请求受理部的处理流程的图。
图25是表示后写入(write after)处理执行部的处理流程的图。
图26是表示实施例1中的重复去除计划部的处理流程的图。
图27是第1列表和第2列表的内容的说明图。
图28是表示擦除候选的内容的说明图。
图29是是表示重复候选的内容的说明图。
图30是表示实施例1中的闪存组件的组件存储器中存储的程序的图。
图31是表示数据读取处理执行部的处理流程的图。
图32是表示哈希指定型读取执行部的处理流程的图。
图33是表示数据写入处理执行部的处理流程(1)的图。
图34是表示数据写入处理执行部的处理流程(2)的图。
图35是表示历史信息发送部的处理流程的图。
图36是表示重复去除执行部的处理流程的图。
图37是表示重复去除判断部的处理流程的图。
图38是表示实施例2中的重复去除计划部的处理流程的图。
图39是表示包括实施例3或4中的虚拟存储***的信息***的结构的图。
图40是表示存储***信息的格式的图。
图41是表示实施例3或4中的读取处理执行部的处理流程的图。
图42是表示实施例3或4中的外部组件读取执行部的处理流程的图。
图43是表示实施例3中的重复去除计划部的处理流程的图。
图44是表示实施例4中的哈希值存储信息的格式的图。
图45是表示实施例4中的重复去除计划部的处理流程的图。
具体实施方式
以下使用附图对几个实施例进行说明。在进行实施例的说明之前,对实施例中使用的各种用语进行说明。
“卷”指的是存储***或存储设备等目标设备向主机计算机等启动器提供的存储空间。当启动器发出对卷上的区域写入数据的数据写入请求时,数据被存储到分配至该区域的物理存储区域中。
在以下说明的实施例的存储***中,存储控制器和存储设备(闪存组件)各自安装有容量虚拟化功能。在本说明书中,由存储控制器使用容量虚拟化功能定义并向主机提供的卷被称作“逻辑卷”。而由闪存组件使用容量虚拟化功能定义并向存储控制器提供的卷被称作“闪存卷”。存储控制器所具有的容量虚拟化功能被称作上层容量虚拟化功能,将闪存组件所具有的容量虚拟化功能被称作下层容量虚拟化功能。
逻辑卷(或闪存卷)上的区域在初始状态(卷刚刚被定义后)下并没有被分配物理存储区域。在主机(或存储控制器)发出对逻辑卷(或闪存卷)上的区域写入数据的数据写入请求的时刻,存储控制器(或闪存组件)才动态地决定应当分配至该区域的物理存储区域。
在以下说明的实施例中,对逻辑卷分配物理存储区域时的最小单位被称作“页”。通常,页指的是闪存中的读写处理的最小单位,但在以下说明的实施例中,将闪存中的读写单位称作“段”而不称作页。此外,分配至逻辑卷的存储区域被称作“实际页”,而逻辑卷上的作为实际页的分配对象的区域被称作“虚拟页”。
闪存中的数据的擦除单位被称作“块”。块中包括多个段,因此块的大小是段大小的整数倍。另一方面,以下说明的实施例中的页(实际页)是与块或段不直接相关的概念,页的大小与块(或段)的大小之间并不必须存在相关。不过,在以下实施例中,为了简化说明,以实际页至少为段的整数倍这一关系为例进行说明。
闪存组件使用容量虚拟化功能定义“闪存卷”。在以下说明的实施例中,对闪存卷分配物理存储区域的单位为段。即,与闪存中的读写处理的最小单位相等。分配给闪存卷的物理存储区域被称作“实际段”,实际段所分配至的闪存卷上的区域被称作“虚拟段”。
存储区域的“更新”指的是将存储在存储区域中的数据的内容擦写(覆盖)为新的内容。在某个存储区域被更新之前存储在该存储区域中的数据被称作“更新前数据”或“旧数据”。而新写入该存储区域的数据被称作“更新数据”或“更新后数据”。
本实施例中,“重复去除”指的是在存储***等存储装置内存在多个内容相同的数据的情况下,仅将1个保留在存储装置中而将这之外的数据从存储装置删除的处理。在以下说明的实施例的存储***中,重复去除的单位是段。重复去除的单位指的是在比较2个(以上)数据的异同时的各数据的最小尺寸。即,以下说明的实施例按段来进行数据的比较。在存在多个写入有相同数据的实际段的情况下,仅保留1个实际段。
在以下说明的几个实施例的存储***中,有的由闪存组件实施重复去除处理。在像该闪存组件这样使用容量虚拟化功能的情况下,在(1个或多个)闪存卷上的多个虚拟段写入有相同内容的数据的情况下,共享的实际段被分配给写入有相同内容的数据的各虚拟段。
本实施例中,数据的“特征量”指的是对数据实施规定的运算而得到的值。规定的运算的种类并不一定限定于特定的种类。不过,需要保证在对相同内容的多个数据实施规定的运算的情况下,必然能得到相同的值。作为符合该条件的运算的例子,例如有SHA-256等哈希函数。将使用哈希函数计算出的值称作哈希值。哈希值是特征量的一个例子。哈希值的大小与原始数据的大小相比非常小(例如大小为数百分之一),所以例如在判断多个数据的异同时(例如重复去除处理)使用。
在以下说明的实施例中,在没有特别说明的情况下,特征量的计算使用SHA-256等哈希函数。本实施例中,在对数据A应用哈希函数求得哈希值H的情况下,值H被称作数据A的特征量,或被称作数据的哈希值。反过来,有时将数据A称作“哈希值为H的数据”。
在本实施例中,“冲突”指的是对多个不同的数据分别实施规定的运算而生成特征量时,所生成的各自的特征量相同。在为了进行数据间的比较而使用特征量的情况下,发生冲突是不理想的。上面列举的利用哈希函数SHA-256生成的哈希值具有发生冲突的概率极低这一特征。
(实施例1)
图1表示本实施例的信息***的结构。信息***包括存储***100、主机110和将二者连接的SAN(Storage Area Network,存储区域网)120。主机110是供运行用户应用程序的计算机,经由SAN120在其与存储***100之间读写必要的数据。SAN120例如是遵循FibreChannel(光纤通道)等标准的网络。另外,本发明在主机110与存储***100直接连接的情况下也是有效的。
存储***100包括缓存(cache,高速缓存)210、共享存储器220、闪存组件230、1个以上的存储控制器200和连接这些结构要素的1个以上的连接装置250。另外,在图1中,存储***100内的存储设备全部为闪存组件230,但存储***100也可以包括HDD这样的其它种类的存储设备。并且,本实施例的闪存组件230的容量全部相同。不过,作为其它的实施方式,存储***100中装载的各闪存组件230的容量也可以不同。
存储控制器200包括处理从主机110发出的读写请求的处理器260和内存270。本实施例的存储***100的特征之一为,重复去除处理由闪存组件230执行。通常,在重复去除处理中,在有数据(称作数据A)被新写入存储***100等存储装置的情况下,计算哈希值这样的特征量。在存在特征量与数据A的特征量相同的数据的情况下(假定将该数据称作数据B),以比特单位对数据A与数据B进行比较。根据比较的结果,若数据A与B相同,则不将数据A存储到存储装置中,削减存储容量。之所以使用特征量,是为了缩减进行数据内容的比较的候选数据。在本实施例的存储***100中,特征量的计算由闪存组件230进行。不过,作为其它的实施方式,也可以由存储控制器200进行特征量的计算。
连接装置250是将存储***100内的各结构要素连接的机构。在本实施例中,为了实现高可靠性,各闪存组件230由多个连接装置250连接到多个存储控制器200上。不过,即使在1个闪存组件230仅与1个连接装置250连接的情况下,本发明也是有效的。
缓存210、共享存储器220通常由DRAM等易失性存储器构成,但利用电池等使它们变得非易失。不过,即使缓存210和共享存储器220不是非易失性的,本发明也有效。
缓存210中存储的是存储在闪存组件230的数据中的经常被存储控制器200访问的数据。另外,存储控制器200还将缓存210用作所谓的回写缓存。即,存储控制器200将与写入请求一起从主机110接收的数据写入到缓存210中,并在该时刻对主机110发出已完成写入请求的响应。而从缓存210到闪存组件230的数据写入可以与来自主机110的写入请求非同步实施。不过,作为其它的实施方式也可以使用所谓的直写方式(在写入数据被存储到闪存组件230中的时刻,对主机110发出已完成写入请求的响应)。
共享存储器220存储有缓存210的控制信息、存储***100内的重要的管理信息、存储控制器200间的联络信息、同步信息等。
本实施例的各闪存组件230形成卷(存储空间),将该卷的区域提供给存储控制器200。即,存储控制器200将闪存组件230识别为1台存储设备。并且,在本实施例中,将闪存组件230所形成的卷称作“闪存卷”。
此外,为了实现高可靠性,存储控制器200具有能够恢复闪存组件230的数据的Redundant Arrays of Inexpensive/Independent Disks/Devices(RAID,廉价/独立磁盘/设备冗余阵列)功能。RAID功能定义了由多个(例如4个)闪存组件230构成的组(所谓的RAID组),在RAID组内的1台闪存组件230发生故障的情况下,存储控制器200能够根据RAID组内剩余的闪存组件230中存储的信息,恢复存储在发生了故障的闪存组件230中的数据内容。本实施例将该由多个闪存组件230构成的RAID组称作闪存组件组280。闪存组件组280可以定义多个。此外,即使存储控制器200不具有RAID功能,本发明也是有效的。另外,即使存储***100内包括闪存组件230以外的存储设备,例如HDD(Hard Disk Drive,硬盘驱动器)等存储设备,本发明也是有效的。
图2表示闪存组件230的结构。闪存组件230包括多个使用非易失性半导体存储器作为存储介质的闪存芯片300,以及组件处理器(package processor)310、组件存储器(package memory)320、缓冲器(buffer)330、组件总线340、组件总线传输装置350和哈希电路370。并且,本实施例说明闪存组件230不具有压缩/解压功能的例子。不过,闪存组件230也可以具有压缩/解压功能。
哈希电路370计算从存储控制器200写入到闪存组件230中的数据的哈希值(特征量)。本实施例在计算哈希值时使用冲突概率极小的SHA-256等哈希算法。因此,若根据2个数据生成的哈希值相等,则能够判断为2个数据的内容相等。不过,作为其它的实施方式,也可以使用SHA-256以外的哈希算法。
组件处理器310受理来自存储控制器200的读写请求,执行相应的处理。缓冲器330用于存储在存储控制器200与闪存芯片300之间读写的数据。本实施例中缓冲器330为易失性存储器。其中,当组件处理器310从存储控制器200接收到写入请求和写入数据时,在将接收到的写入数据写入闪存芯片300后,对存储控制器200发出已完成写入处理的通知。不过,即使在缓冲器330为非易失性存储器,在将接收到的写入数据写入到缓冲器330后的阶段就结束从存储控制器200接收到的写入请求的情况下,本发明也是有效的。
组件存储器320用于存储由组件处理器310执行的程序、闪存芯片300的管理信息等。闪存组件230的管理信息是非常重要的信息,因此优选在定期停机时能够将管理信息备份到特定的闪存芯片300中。并且,为了防备突发的故障,优选设置电池,并利用电池使得即使发生故障等,也能够将管理信息备份到特定的闪存芯片300中。
若将关于重复去除的所有信息都存储到组件存储器320中,则组件存储器320的容量需要增大,会导致成本升高。为此,本实施例的闪存组件230将全部信息存储到闪存芯片300中,并将部分信息存储到组件存储器320中。不过,作为其它的实施方式,也可以将全部信息存储到组件存储器320中。
组件总线340是用于在缓冲器330与闪存芯片300之间进行数据传输的总线,存在一根以上。为了提高性能,闪存组件230通常设置有多根组件总线340,但即使在一根的情况下,本发明也是有效的。
组件总线传输装置350按每根组件总线340设置,根据组件处理器310的指示而在缓冲器330与闪存芯片300之间执行数据传输。
哈希电路370与缓冲器330连接,根据组件处理器310的指示,计算从存储控制器200写入的数据的哈希值。
闪存芯片300例如是NAND型闪存等非易失性半导体存储器芯片。如众所周知的那样,闪存以段(通常被称作页,但本说明书中称作段)为数据的读取、写入的单位。而数据擦除是按段的集合即块(本实施例中称作实际块)来进行的。闪存芯片300中存在多个作为实际块的集合体的裸片(die),而实际块中存在多个段。另外,在本实施例中,将存在于实际块中的段称作“实际段”。并且,将闪存卷上的区域中的被分配了实际段的区域称作“虚拟段”。
闪存组件230对各闪存芯片300附加识别编号进行管理。将闪存芯片300的识别符称作芯片ID。并且,对各裸片、各实际块也附加识别编号。将裸片的识别编号称作裸片编号,将实际块的识别符称作块编号。裸片编号在裸片所属的闪存芯片300内是唯一的识别编号,块编号在实际块所属的裸片之中是唯一的识别编号。并且,实际块内的实际段所附加的识别编号被称作相对段编号。实际块内的开头实际段的相对段编号为0,后续的实际段被依次附加1、2……之编号。
接着,对本实施例中的存储***100所管理的信息进行说明,但在这之前先说明逻辑卷、闪存卷的结构。本实施例中,存储控制器200支持上层容量虚拟化功能。不过,即使存储控制器200不具有上层容量虚拟化功能,本发明也是有效的。
通常,在上层容量虚拟化功能中,存储区域的分配单位被称作页。在本实施例中,逻辑卷的空间以虚拟页这一单位分割,而闪存组件组280的存储区域以实际页这一单位分割。
使用图3说明逻辑卷、虚拟页、实际页、闪存组件组280的关系。存储控制器200能够定义1个以上的逻辑卷,将它们提供给主机110等上层装置。而如前文所述,存储控制器200将各逻辑卷的存储空间分割成多个虚拟页(图3中的VP0、VP1、VP2)这样的规定单位的区域进行管理。其中,虚拟页的大小存储在共享存储器220内的虚拟页容量2600(后述)中。另外,在本实施例的存储***100中,所有的虚拟页的容量相同,但也可采用存储***100内存在不同大小的虚拟页的结构。
虚拟页是仅在存储控制器200内部对逻辑卷的存储空间进行管理时使用的概念。主机110在访问逻辑卷的存储区域时,使用LBA(Logical Block Address,逻辑块地址)等地址来确定访问对象。在主机110发出对逻辑卷的访问请求时,存储控制器200将主机110指定的LBA转换为虚拟页编号(附加给各虚拟页的识别编号)和虚拟页内的相对地址(自虚拟页开头起的偏移地址)。该转换能够通过对LBA除以虚拟页大小来实现。假定虚拟页的大小为P(MB),则逻辑卷的开头位置起的P(MB)的区域被作为虚拟页#0(#0表示虚拟页编号)管理,而下一个P(MB)的区域被作为虚拟页#1管理。进而,之后也同样地,P(MB)的区域被分别作为虚拟页#2、#3……管理。
在存储控制器200刚刚定义逻辑卷后,各虚拟页没有被分配物理存储区域。存储控制器200在从主机110接收到对虚拟页的写入请求的时刻,才对该虚拟页分配物理存储区域。将分配给虚拟页的物理存储区域称作实际页。图3表示实际页RP0被分配给虚拟页#0(VP0)的状态。
实际页是使用闪存组件组280的多个闪存卷的存储区域而形成的区域。在图3中,230-1、230-2、230-3、230-4分别表示各闪存组件230的闪存卷。此外,图3中例示的闪存组件组280的RAID类型是RAID4的3D+1P结构(由3台数据驱动器和1台奇偶校验驱动器构成的RAID组)。
存储控制器200对属于闪存组件组280的各闪存组件230的闪存卷(230-1、230-2、230-3、230-4)按被称作条带块的多个固定大小的存储区域分割而进行管理。例如,在图3中,记作0(D)、1(D)、2(D)……或P0、P1……的各区域表示条带块。本实施例说明条带块的大小与闪存卷的虚拟段的大小相等的例子,但作为其它的实施方式,也可以采用条带块的大小与虚拟段不同的结构。
在图3中,条带块之中的记作P0、P1……的条带块是存储利用RAID功能生成的冗余数据(parity,奇偶检验数据)的条带块,将其称作“奇偶检验条带”。而记作0(D)、1(D)、2(D)……的条带块是存储从主机110写入的数据(不是冗余数据的数据)的条带块。将该条带块称作“数据条带(data stripe)”。奇偶检验条带中存储使用多个数据条带生成的冗余数据。
以下,将奇偶检验条带和为了生成存储在该奇偶检验条带中的冗余数据而使用的数据条带的组称作“条带行(stripe line)”。在本实施例的存储***100的情况下,例如有这样的关系,即,奇偶检验条带P0存储的是使用数据条带0(D)、1(D)、2(D)生成的冗余数据(奇偶检验数据),数据条带0(D)、1(D)、2(D)和奇偶检验条带P0属于同一个条带行。
即,属于1个条带行的各条带块位于闪存卷(230-1、230-2、230-3、230-4)上的相同位置(地址)。不过,作为其它的实施方式,也可以采用属于同一个条带行的各条带块位于闪存卷上的不同地址处的结构。在本实施例的存储***100中,如图3所示,实际页(例如RP0、RP1)由1个或多个条带行构成。
在实际页被分配给虚拟页的情况下,仅分配数据条带(0(D)、1(D)等),不分配奇偶检验条带。因此,实际页上的存储写入数据的区域的合计大小与虚拟页的大小相等。即存在这样的关系,(实际页的大小-奇偶检验数据存储区域的大小)=虚拟页大小。图3仅表示了RAID4的结构例,而在例如闪存组件组280的RAID类型为RAID1的情况下,实际页大小为虚拟页大小(虚拟页容量2600)的2倍。
虚拟页内的各区域与实际页内的各区域的关系(映射)如图3所示。即,从实际页的开头条带除去奇偶检验数据后的区域(0(D)、1(D)、2(D))被分配给虚拟页的开头区域。之后也是同样地,实际页的第2个及之后的各条带除去奇偶检验数据后的区域被依次分配给虚拟页的区域(3(D)、4(D)、5(D)……)。
像这样,由于虚拟页内的各区域与实际页内的各区域的映射是规则的映射,所以存储***100根据来自主机110的访问请求中指定的逻辑卷上的访问位置(LBA)求取虚拟页编号和虚拟页内的相对地址(自虚拟页开头起的偏移地址),能够唯一地计算与该访问位置对应的闪存组件230及该闪存组件230内的区域(数据条带)。进而,除了与访问位置对应的数据条带之外,还能够唯一地确定与该数据条带属于同一个条带行的奇偶检验条带。不过,虚拟页内的各区域与实际页内的各区域的映射并不限于此处说明的映射方法。
另外,在容量虚拟化技术中,在定义各逻辑卷时,还能够以各逻辑卷的合计存储容量大于实际存储介质的容量的方式进行定义。因此,虚拟页数通常多于实际页数。本发明实施例的存储装置也能够使虚拟页数多于实际页数。
另外,逻辑卷中的各虚拟页所分配到的实际页并不一定限定于同一闪存组件组280内的实际页。分配给虚拟页#0的实际页与分配给虚拟页#1的实际页也可以分别为不同闪存组件组280内的实际页。不过,本实施例所说明的例子是,应当分配给1个逻辑卷的各虚拟页的实际页全部从相同RAID类型的闪存组件组280分配。
接着说明闪存卷。本实施例中,各闪存组件230具有容量虚拟化功能(下层容量虚拟化功能)并进行重复去除处理。因此,闪存组件230能够对存储控制器200提供表面上具有比实际物理容量(闪存芯片300的合计容量)大的容量的闪存卷。图4表示闪存卷V1与实际块的关系。
闪存组件230将闪存卷V1按与m个实际块的大小相等的区域进行分割、管理。本实施例将该区域称作“虚拟块组”。另外为方便起见,将虚拟块组内的与实际块的大小相等的大小的区域称作“虚拟块”。即,可以说虚拟块组是由m个虚拟块构成的存储区域。
各虚拟块组附加有识别编号,将其称作虚拟块组号。将虚拟块组号为n(n为0以上的整数值)的虚拟块组记作“虚拟块组#n”。该标记方法也用于虚拟块组之外的区域(段、页等)。当实际块(或虚拟块)的大小为B(KB)时,将闪存卷V1的开头起的m×B(KB)的区域作为虚拟块组#0管理,并接着依次将各m×B(KB)的区域作为虚拟块组#1、#2……管理。
本实施例中,闪存组件230在接收到对尚未分配实际块的虚拟块组的写入请求时,才开始分配实际块。并且,本实施例的闪存组件230对1个虚拟块组最大分配(m+1)个实际块。以下说明本实施例以m+1个为实际块的最大分配数的理由。
假定使用了对虚拟块组分配m个实际块的方法的场景。并且,假定数据被写入虚拟块组的全部区域,并且此时数据几乎无法重复去除的情况。该情况下,m个实际块被分配给虚拟块组,实际块几乎没有空闲容量。
此时,假定闪存组件230从存储控制器200接收到将块内的部分数据擦写的请求(普通的写入请求)的情况。由于闪存的块无法擦写,因此闪存组件230必须将该块的全部数据读取到缓冲器330中,在缓冲器330上仅将发生了擦写请求的部分更新,再在将该块擦除一次后,将数据存储到整个块上。若闪存组件230每次接收到写入请求都执行以上动作(块的读取、擦除以及写入),则处理时间会变得过长,难说具有实用性。
为解决该问题,本实施例的闪存组件230对虚拟块组多分配1个实际块,确保空闲区域,从而在空闲区域进行追加写入。在空闲区域变小,不够写入擦写数据的情况下,进行擦除处理。由此,对于多次(例如n次)的写入请求只需执行1次擦除处理即可,所以能够提高性能。另外,擦除处理次数的削减也会延长闪存的寿命。
如前文所述,闪存的访问(读写)单位为“段”。因此,闪存组件230将闪存卷V1的空间按与段的大小相等的区域进行分割、管理。将该区域称作“虚拟段”。图4中,虚拟段#0、虚拟段#1……表示虚拟段。虚拟段也是重复去除处理的单位。
当闪存组件230从存储控制器200接收到对闪存卷V1的访问请求时,首先将访问请求中指定的地址转换为用于确定虚拟段的识别符。闪存组件230所使用的用于确定虚拟段的识别符包括多种(内部虚拟段编号、相对虚拟段编号、虚拟段地址)。
内部虚拟段编号是在闪存组件230内能够唯一确定虚拟段的识别符。位于闪存卷V1开头的虚拟段的内部虚拟段编号规定为0。后续的虚拟段的内部虚拟段编号依次使用1、2……等连续编号。在图4中,各虚拟段附加的编号(#1、#s等)表示内部虚拟段编号。
相对虚拟段编号是在虚拟块组内能够唯一确定虚拟段的识别符。各虚拟块组内开头的虚拟段的相对虚拟段编号规定为0。后续的各虚拟段的相对虚拟段编号依次使用1、2……等连续编号。
虚拟段地址是将内部虚拟段编号与闪存组件的识别符(称作组件ID)连起来而生成的地址。若给出了虚拟段地址,则能够在存储***100内唯一地确定1个虚拟段。
接着说明本实施例中存储***100所管理的信息。图5表示存储在存储***100的共享存储器220中的信息之中的与本实施例相关的信息。共享存储器220至少存储有逻辑卷信息2000、实际页信息2100、空闲实际页管理信息指针2200、闪存组件组信息2300、闪存组件信息2500、虚拟页容量2600和哈希值存储信息2400。哈希值存储信息2400之外的上述信息是用于实现上层容量虚拟化技术所必需的信息。
以下对各信息进行说明。图6是表示逻辑卷信息2000的格式的图。逻辑卷信息2000是按每个逻辑卷存在的信息,是用于管理逻辑卷的属性信息的信息。以下将利用一个逻辑卷信息2000管理属性信息的逻辑卷称作“管理对象逻辑卷”。逻辑卷信息2000包括逻辑卷ID2001、逻辑容量2002、逻辑卷RAID类型2003、实际页指针2004。
逻辑卷ID2001表示管理对象逻辑卷的ID。通常,主机110指定逻辑卷的识别符(例如Logical Unit Number(逻辑单元号LUN)等识别符)、逻辑卷内的地址(LBA)、想要读写的数据的长度,来发出访问请求(读取请求或写入请求)。逻辑卷ID2001用于存储在主机110对逻辑卷发出访问请求时指定的逻辑卷的识别符。
逻辑容量2002是管理对象逻辑卷的容量。逻辑卷RAID类型2003表示管理对象逻辑卷的RAID类型。存储在逻辑卷RAID类型2003中的信息除了包括RAID0、RAID1等RAID类型之外,还包括像RAID5那样对N台容量的数据存储1台容量的冗余数据的情况下的N的具体数值。不过,并不能指定任意的RAID类型,需要是至少一个闪存组件组280所具有的RAID类型。在对管理对象逻辑卷的虚拟页分配实际页时,存储控制器200从闪存组件组280中的RAID类型与逻辑卷RAID类型2003相同的闪存组件组280选择实际页。
实际页指针2004是指向管理对象逻辑卷的虚拟页所分配到的实际页的页管理信息(后述的实际页信息2100)的指针。实际页指针2004的数量为管理对象逻辑卷的虚拟页的数量(将逻辑容量2002除以虚拟页容量2600所得到的数,如果有余数则+1)。若管理对象逻辑卷的虚拟页数为n,则存在n个实际页指针2004(存在实际页指针2004-0~204-(n-1))。
在逻辑卷信息2000内的多个实际页指针2004(2004-0~2004-(n-1))之中,开头起的第k个实际页指针2004-(k-1)存储的是指向虚拟页#(k-1)所分配到的实际页的页管理信息(后述的实际页信息2100)的指针。另外,实际页并不在定义逻辑卷时分配,而是在实际接收到对虚拟页写入数据的请求时,以此为机分配实际页。从而,与尚未进行写入的虚拟页对应的实际页指针2004为无效值(NULL)。
图7表示实际页信息2100的格式。实际页信息2100用于管理关于实际页的信息,按每个实际页存在1个实际页信息2100。实际页信息2100包括组件组2101、实际页地址2102、空闲页指针2103、页数据存储量2104。在以下的实际页信息2100的说明过程中,将利用一个实际页信息2100管理的实际页称作“管理对象实际页”。
组件组2101存储管理对象实际页所属的闪存组件组280的识别符。以下将闪存组件组280的识别符称作“组件组ID”。
实际页地址2102存储管理对象实际页所处的位置(地址)的信息。实际页地址2102所存储的地址是管理对象实际页在所属的闪存组件组280内的相对地址。空闲页指针2103是在管理对象实际页未被分配给虚拟页的情况下使用的信息。本实施例中,将未分配给虚拟页的实际页称作“空闲实际页”或“空闲页”。在管理对象实际页未被分配给虚拟页的情况下,其空闲页指针2103存储其它的空闲页的实际页信息2100。在管理对象实际页已被分配给虚拟页的情况下,空闲页指针2103为空值(NULL)。
页数据存储量2104是已存储在管理对象实际页中的数据量。不过,该信息并不是关于分配到管理对象实际页的闪存组件230(的存储区域)的属性信息,而是关于管理对象实际页所分配的虚拟页的数据的属性信息。从而,当其它的实际页被分配到该虚拟页,而当前的实际页的数据被拷贝到新的实际页上的情况下,需要将页数据存储量2104继承为新的实际页的管理信息。
图8表示闪存组件信息2500的格式。闪存组件信息2500是用于管理闪存组件230的信息,包括闪存组件ID2501、闪存组件虚拟容量2502、块容量2503。闪存组件信息2500按每个闪存组件230存在。以下将利用一个闪存组件信息2500管理的闪存组件230称作管理对象闪存组件。
闪存组件ID2501是管理对象闪存组件的识别符(称作组件ID)。闪存组件虚拟容量2502是管理对象闪存组件所形成的闪存卷的存储区域之中的对存储控制器200提供的区域的大小,本实施例将该大小称作“虚拟容量”。
本发明的特征在于,根据闪存组件230的重复去除率等而相应地调整该闪存组件虚拟容量2502。本实施例由闪存组件230决定该容量,但也可以由存储控制器200决定。当从闪存组件230接收到表示虚拟容量发生了变化的通知时,存储控制器200将该值设定为闪存组件虚拟容量2502。
块容量2503是块的大小。因此,闪存组件虚拟容量2502除以块容量2503得到的值即为该闪存组件230的块数量。
再次使用图4概略说明闪存卷与虚拟容量的关系。本实施例的闪存组件230向存储控制器200提供闪存卷V1中的与虚拟容量(闪存组件虚拟容量2502)相等的大小的区域。原则上可以对存储控制器200提供闪存卷V1上的任意的区域,但本实施例中作为一例如图4所示,说明提供从闪存卷V1的开头起的连续区域(区域A,该区域的大小与虚拟容量相等)的例子。
虚拟容量可以大于闪存组件230所具有的全部闪存芯片300的合计存储容量。在图4中,存储控制器200仅能够访问闪存卷V1上的区域A(大小与虚拟容量相等的区域)。并且如前文所述,虚拟容量可变动。当虚拟容量(即区域A)的大小增加时,可访问的区域将增加。
闪存组件230的虚拟容量的调整例如可通过与专利文献2记载的同样的思路进行。假定对闪存卷V1上的虚拟段中的n个虚拟段进行了数据写入。写入的数据被存储在闪存芯片300的实际段中(也可换而言之,实际段被消耗)。
在几乎不进行重复去除的情况下,将消耗接近n个的数量的实际段。此时,虚拟容量最好与闪存组件230内的实际段的合计为相同程度。不过,若进行重复去除处理,则只会消耗比进行了数据写入的虚拟段少的实际段。例如,有可能只会消耗n/10个实际段。此时,若虚拟容量等于闪存组件230内的实际段的合计,则大量的实际段将不被使用,无法有效利用存储区域。该情况下,若将比实际段的合计多的存储容量(例如实际段的总存储容量的10倍)作为虚拟容量提供给存储控制器200,则能够有效利用闪存组件230内的存储区域(实际段)。
即,若根据进行了数据写入的虚拟段的量与消耗了的实际段的量之比(称作重复去除率)来调整虚拟容量(扩大或缩小),则能够有效利用闪存组件230内的存储区域(实际段)。不过,虚拟容量的调整的具体方法由于与本发明无直接关系,故省略详细说明。
此外,闪存组件230在闪存卷V1的末端确保了被称作“隐藏区域”的区域。隐藏区域是为了存储后述的哈希索引信息3500而设置的。存储控制器200无法访问隐藏区域。不过,闪存组件230中执行的程序(至少是进行哈希索引信息3500的参考和更新的程序)能够访问隐藏区域。
图9表示闪存组件组信息2300的格式。闪存组件组信息2300用于管理关于闪存组件组280的信息。对于1个闪存组件组280,存在1个闪存组件组信息2300。
闪存组件组信息2300包括闪存组件组ID2301、组件组RAID类型2302、实际页数2303、空闲实际页数2304、闪存组件指针2305。以下将利用一个闪存组件组信息2300管理的闪存组件组280称作“管理对象组件组”。
闪存组件组ID2301是管理对象组件组的识别符。组件组RAID类型2302是管理对象组件组的RAID类型。该RAID类型与说明逻辑卷RAID类型2003时陈述的相同。
实际页数2303、空闲实际页数2304分别表示管理对象组件组的全部实际页数和空闲实际页数。
闪存组件指针2305是属于管理对象组件组的闪存组件230的组件ID。闪存组件组信息2300中所含的闪存组件指针2305的数量与属于管理对象组件组的闪存组件230的数量相等。并且,该数量是由组件组RAID类型2302决定的值。
接着说明空闲实际页管理信息指针2200。空闲实际页管理信息指针2200是按每个闪存组件组280设置的信息。图10表示利用空闲实际页管理信息指针2200管理的空闲实际页的集合。将该结构称作空闲实际页管理信息队列2201。并且,将与空闲实际页对应的实际页信息2100称作空闲实际页信息2100。
空闲实际页管理信息指针2200指向空闲实际页管理信息队列2201的开头的空闲实际页信息2100(即,空闲实际页管理信息指针2200存储开头的空闲实际页信息2100的地址)。接着,开头的实际页信息2100中的空闲页指针2103指向下一个空闲实际页信息2100。在图10中,最后的空闲实际页信息2100的空闲页指针2103指向空闲实际页管理信息指针2200,但也可以存储空值。
存储控制器200在接收到对尚未分配实际页的虚拟页的写入请求时,选择RAID类型(组件组RAID类型2302)与该虚拟页所属的逻辑卷的逻辑卷RAID类型2003相同的闪存组件组280中的任一个,并选择该选中的闪存组件组280所具有的空闲实际页,将其分配给虚拟页。例如,可以从空闲实际页数最多的闪存组件组280的空闲实际页管理信息指针2200选择空闲实际页。
接着使用图11说明哈希值存储信息2400的格式。在本实施例的存储***100中,进行重复去除判断时使用的哈希值存储在闪存芯片300中。本实施例的存储***100的特征在于,将哈希值分散地存储在多个闪存组件230中。哈希值在数据每次发生更新时其内容几乎都会变化。并且其容量比数据小。因此,若将哈希值集中存储在特定的区域,则该区域的块擦除次数与数据相比会较大,闪存的擦除次数有很大可能会提前到达极限值。这就是存储***100将哈希值分散地存储到闪存组件230中的理由。
另外,本实施例的存储***100的另一个特征为,在闪存组件230中既存储哈希值也存储数据。由此,对于存储数据的实际段和存储哈希值的实际段双方的擦除次数,由闪存组件230进行(本地的)损耗平均(wear leveling)来实现均衡化。哈希值的更新次数与数据的更新次数在量级上大致相同,所以闪存组件230的全部实际段的更新次数能够与数据的更新次数为大致相同的量级。
哈希值存储信息2400是表示将各哈希值存储在哪个闪存组件230中进行管理的信息。本实施例的存储***100中,将哈希空间(哈希值的可取值的范围;例如在存储***100所使用的哈希函数得到的值可取0~(2h-1)的值的情况下,哈希空间的大小为2h)以比闪存组件230的数量足够大的数(例如为k个)分割,并将关于属于各分割单位的哈希值的信息保存在存储***100内的任一闪存组件230中(之所以以足够大的数分割,是因为关于哈希值的信息的大小可能会很分散,并且该信息的更新频率也很分散;例如,若哈希值的空间为2的32次方,则以比闪存组件230的数量(闪存组件230的数量至多为1000左右)足够大的数分割,例如分割为数万个)。
哈希值存储信息2400具有多个哈希范围2401与闪存组件ID2402的组。在此,将哈希范围2401与闪存组件ID2402的组(set)称作区(extent)2410。图11中记载了区2410-1、2410-2……2410-k。区2410的个数为k个。在哈希空间的大小为2h的情况下,第1个哈希范围2401为0至2h÷k-1,第2个为2h÷k至2×2h÷k-1。第i个为(i-1)×2h÷k至i×2h÷k-1。
闪存组件ID2402存储闪存组件230的组件ID。例如,在某个区2410内的哈希范围2401中存储的哈希值范围为a~b,并且该区2410内的闪存组件ID2402为p的情况下,意味着闪存组件#p中存储着范围a~b的哈希值。在该情况下,将a~b的范围的哈希值称作“闪存组件#p承担的哈希值”。
接着说明闪存组件230所具有的管理信息。闪存组件230将大部分的管理信息存储在组件存储器320内。图12表示组件存储器320中所含的信息。组件存储器320中所含的信息包括组件信息3000、芯片信息3100、虚拟块组信息3200、实际块信息3300、空闲实际块信息指针3600、闪存组件组信息2300、哈希值存储信息2400、历史信息3400、叶子段以外的哈希索引信息3500。
哈希值存储信息2400、闪存组件组信息2300与存储控制器200所具有的哈希值存储信息2400、闪存组件组信息2300几乎相同,故省略其内容的说明。存储***100中所含的全部闪存组件组280的闪存组件组信息2300存储在组件存储器320内。
哈希值存储信息2400、闪存组件组信息2300例如在初始化时从存储控制器200提供给各闪存组件230。而在每次存储控制器200更新哈希值存储信息2400和闪存组件组信息2300时,存储控制器200将更新后的信息提供给各闪存组件230。
在本实施例的存储***100中,之所以各闪存组件230持有与存储控制器200所持有的哈希值存储信息2400同样的信息,是因为在进行重复去除处理时,不仅是存储***100,各闪存组件230也需要识别关于各闪存组件230承担的哈希值的信息。
另外,闪存组件230之所以持有与存储控制器200所管理的闪存组件组信息2300相同的信息,是因为在闪存组件230进行重复去除的判断时,需要识别不应进行重复去除的数据。例如,若对属于相同条带行的数据进行重复去除处理,冗余性将丧失,在闪存组件230发生故障时无法重新生成数据。为此,本实施例的闪存组件230对属于相同条带行的数据不进行重复去除处理。此时,闪存组件230使用闪存组件组信息2300判断多个数据是否属于同一条带行。
图13表示组件信息3000的格式。组件信息3000包括组件ID3001、虚拟组件容量3002、实际组件容量3003、闪存块容量3004、组件空闲块数3005、内部信息存储块数3009、内部信息存储地址3010。
组件ID3001是该闪存组件230的识别符。虚拟组件容量3002是该闪存组件230的虚拟容量。实际组件容量3003是该闪存组件组280的物理存储区域(闪存芯片300的实际块或实际段)的容量。该容量是用于存储来自存储控制器200的写入数据的容量、用于存储重复去除所使用的信息的容量、用于备份组件存储器320的信息的容量和出于进行空间回收(reclaimation)等目的所使用的区域(备用区域)的容量的合计。
闪存块容量3004是作为闪存的擦除单位的块的大小。组件空闲块数3005是该闪存组件230内的空闲块的数量。
内部信息存储块数3009是在电源OFF时或发生故障时用于备份存储在组件存储器320中的组件信息3000、芯片信息3100、虚拟块组信息3200、实际块信息3300、历史信息3400、叶子段以外的哈希索引信息3500、空闲实际块信息指针3600的实际块(将该实际块称作“内部信息存储块”)的块数量。内部信息存储地址3010是内部信息存储块的地址。组件信息3000、芯片信息3100、虚拟块组信息3200、实际块信息3300是很重要的信息,可以存储n份。另外,由于备份的次数并不多,因此可认为实际块的擦除次数等也并不会成为问题。
图14是芯片信息3100的格式。芯片信息3100是用于管理闪存芯片300的属性信息的信息。芯片信息3100是按每个闪存芯片300存在的信息。芯片信息3100包括芯片ID3101、芯片实际块数3102、芯片内空闲实际块数3103、连接总线ID3104。以下将一个芯片信息3100的管理对象的闪存芯片300称作“管理对象芯片”。
芯片ID3101是管理对象芯片的芯片ID。芯片实际块数3102是管理对象芯片所具有的实际块的数量。芯片内空闲实际块数3103表示管理对象芯片内的空闲实际块的数量。其中,空闲实际块指的是未被分配给虚拟块组的实际块。连接总线ID3104是管理对象芯片所连接的组件总线340的识别符。
图15是实际块信息3300的格式。实际块信息3300是按每个实际块存在的信息。实际块信息3300包括实际块识别符3301、空闲实际块指针3302、实际块内空闲容量3304、实际段位图(segment bitmap)3305。在以下说明中,将一个实际块信息3300的管理对象的实际块称作“管理对象实际块”。
实际块识别符3301是管理对象实际块的识别符。本实施例中,为了能够在闪存组件230内唯一地确定实际块,实际块的识别符表示为实际块所属的闪存芯片300的芯片ID、裸片编号、块编号的组合。空闲实际块指针3302在管理对象实际块未被分配给虚拟块组(位于空闲状态)时,指向下一个位于空闲状态的实际块的实际块信息3300。
实际块内空闲容量3304表示管理对象实际块的当前的空闲容量。组件处理器310在从存储控制器200接收到大小为管理对象实际块的实际块内空闲容量3304以下的写入数据时,能够将写入数据存储到管理对象实际块的空闲区域中。在存储了写入数据后,组件处理器310从实际块内空闲容量3304减去已存储的数据的大小。其中,闪存的最小写入单位为段,所以存储的数据的大小为段(实际段)的整数倍。
实际段位图3305在实际块内的实际段数为N个的情况下,是大小为N比特的信息。在实际段位图3305内的第k个比特为1(ON)的情况下,意味着管理对象实际块内的从开头起的第k个实际段处于使用中(被分配给虚拟段),在为0(OFF)的情况下,意味着管理对象实际块内的从开头起的第k个实际段未使用(未分配给虚拟段)。
接着说明空闲实际块信息指针3600。空闲实际块信息指针3600按每个闪存芯片300存在。图16表示利用空闲实际块信息指针3600管理的空闲实际块的集合。将该结构称作空闲实际块信息队列1700。空闲实际块信息指针3600指向空闲实际块信息队列1700内的开头的空闲实际块的实际块信息3300(即,空闲实际块信息指针3600存储的是,存储了开头的空闲实际块的实际块信息3300的、组件存储器320上的地址)。接着,开头的空闲实际块的实际块信息3300中的空闲实际块指针3302指向下一个空闲实际块的实际块信息3300。图16中,空闲实际块信息队列1700的最末尾的空闲实际块的实际块信息3300的空闲实际块指针3302指向空闲实际块信息指针3600,但也可以为空值。
组件处理器310在接收到对尚未分配实际块的虚拟块组内虚拟段的写入请求时,根据与闪存芯片300之中的任一个对应的空闲实际块信息指针3600寻找空闲实际块,将其分配给虚拟块组。例如,可以从空闲实际块数(芯片内空闲实际块数3103)最多的闪存芯片300选择空闲实际块。
图17是虚拟块组信息3200的格式。虚拟块组信息3200是用于管理虚拟块组的信息,是按每个虚拟块组存在的信息。虚拟块组信息3200在组件存储器320内按虚拟块组的地址的顺序排列。组件存储器320内的开头虚拟块组信息3200是虚拟块组#0的管理信息。组件存储器320内的从开头起的第k个虚拟块组信息3200是虚拟块组#(k-1)的管理信息。
虚拟块组信息3200包括虚拟块组识别符3201、实际块信息指针3202、数据存储量3203、新虚拟段指针3205、新哈希值3206、旧虚拟段指针3210、旧哈希值3211、防擦除虚拟段数3207、防擦除地址3208、防擦除哈希值3209。以下将利用虚拟块组信息3200管理的虚拟块组称作“管理对象虚拟块组”。
本实施例对重复去除处理的单位为段的情况的例子进行说明。不过,对于重复去除的单位不是段的情况,本发明也是有效的。本实施例的存储***100按每个进行了更新数据的写入的虚拟段,检查具有与写入该虚拟段的更新数据的哈希值相同哈希值的数据是否已存储在某个闪存组件230中。在这样的数据已存在的情况下,不存储更新数据(将其删除)。由此,具有可削减存储在闪存组件230中的数据量的效果。
虚拟块组识别符3201是管理对象虚拟块组的识别符。实际块信息指针3202是指向分配给管理对象虚拟块组的实际块的实际块信息3300的指针(存储了实际块信息3300的组件存储器320上的地址)。实际块信息指针3202存在m+1个。实际块信息指针3202在未分配实际块时为空值。若分配给该虚拟块组的实际块的数量为p个(m+1以下),则从开头起的p个实际块信息指针3202是有效的(非空值)。
数据存储量3203表示存储在管理对象虚拟块组中的数据量。最大容量为(实际块的容量×(m+1))。在闪存的情况下,当虚拟段的内容得到更新时,更新数据将被存储到与这之前分配给虚拟段的实际段不同的实际段上。因此,同一虚拟段上写入的数据(最新的数据和更新前数据)位于多个位置。为此,数据存储量3203可能会比虚拟块组内虚拟段的合计大小更大。
接着要说明的新虚拟段指针3205、新哈希值3206、防擦除虚拟段数3207、防擦除地址3208、防擦除哈希值3209、旧虚拟段指针3210、旧哈希值3211是按虚拟块组内的每个虚拟段设置的信息。以下有时会将这些信息统称为“虚拟段管理信息”。
新虚拟段指针3205、新哈希值3206、旧虚拟段指针3210、旧哈希值3211各自是在虚拟块组信息3200内的存在数量与虚拟块组内虚拟段数相同的信息。其中,图中有的部分将新虚拟段指针3205的参考标记记作“3205-s”。这表示这是相对虚拟段编号为“s”的虚拟段的新虚拟段指针。该参考标记的标注规则对于新哈希值3206、旧虚拟段指针3210、旧哈希值3211、防擦除虚拟段数3207、防擦除地址3208、防擦除哈希值3209也是同样的。
新虚拟段指针3205表示当前分配给虚拟段的区域的地址。准确地说,新虚拟段指针3205中存储的是,由存储控制器200对虚拟段进行了写入的数据之中的最新的数据(更新后数据)所存储的区域(实际段或虚拟段)的地址信息。新哈希值3206是写入到虚拟段中的最新数据的哈希值。具体而言,是存储在根据新虚拟段指针3205确定的区域中的数据的哈希值。
新虚拟段指针3205、旧虚拟段指针3210和防擦除地址3208存储直接指示实际段的信息或指示虚拟段的信息中的任一个。直接指示实际段的信息是由存储了数据的实际块的识别符(实际块识别符3301)和该实际块内的相对地址(相对段编号)的组合所构成的信息,将该信息称作实际段地址。
例如在图18所示的例子中,写入到闪存组件230-A的虚拟段#x中的最新数据被存储在实际块#0的实际段#1(相对段编号为1的实际段)中。该情况下,虚拟段#x的新虚拟段指针(3205)存储实际块#0的实际块识别符3301和相对段编号(1)的组。在从存储控制器200接收到虚拟段#x的读取请求时,闪存组件230-A通过参考(引用)虚拟段#x的新虚拟段指针(3205),能够确定存储了读取对象数据的实际段(实际块#0内的实际段#1)。
另一方面,指示虚拟段的信息使用的是虚拟段地址。当进行了虚拟段的重复去除处理时,新虚拟段指针3205会存储虚拟段地址。在图18中,假定例如在虚拟段#y中写入有与虚拟段#x中写入的数据相同的数据,并进行了重复去除处理的场景。该情况下,虚拟段#y的新虚拟段指针(3205)将存储闪存组件230-A的虚拟段#x的虚拟段地址。
在本实施例中,在如图18所示的状态那样,(虚拟段#y的)新虚拟段指针3205存储了虚拟段#x的虚拟段地址的情况下,虚拟段#y被表述为“参考虚拟段#x”。而虚拟段#x被表述为“虚拟段#y所参考的虚拟段”。另外,在(虚拟段#y的)旧虚拟段指针3210或防擦除地址3208中存储了虚拟段#x的虚拟段地址的情况下,也表述为“虚拟段#y参考虚拟段#x”。对于实际段也使用同样的表述。例如,在图18中,虚拟段#x的新虚拟段指针3205中存储了实际块#0的实际段#1的实际段地址。该情况下表述为“实际段#1被虚拟段#x参考”。
在本实施例中,规定实际段地址和虚拟段地址的格式,以使得闪存组件230(组件处理器310)能够识别新虚拟段指针3205(或者旧虚拟段指针3210、防擦除地址3208)中存储的信息是实际段地址还是虚拟段地址。例如可以规定为,实际段地址的最高位比特始终为“1”,而虚拟段地址的最高位比特始终为“0”。
当从存储控制器200对位于图18的状态的闪存组件230-B发出虚拟段#y的读取请求时,闪存组件230-B通过参考虚拟段#y的新虚拟段指针(3205),识别出新虚拟段指针(3205)中存储的是虚拟段#x的虚拟段地址。该情况下,闪存组件230-B将读取出的虚拟段地址等回送到存储控制器200。接收到该信息的存储控制器200发出以回送来的虚拟段地址(虚拟段#x)为访问目标的读取请求,由此获得读取对象的数据(即,进行访问的重定向)。其详细内容后述。
旧虚拟段指针3210存储的是,写入到虚拟段中的数据中的更新前数据所存储的区域的地址信息。旧哈希值3211是存储在根据旧虚拟段指针3210确定的区域中的数据的哈希值。在图18中,虚拟段#x的旧虚拟段指针(3210)指向实际块#b的实际段#0。这意味着虚拟段#x的更新前数据存储在实际块#b的实际段#0中。
当虚拟段发生了更新时,过去写入该虚拟段中的数据(更新前数据)原则上应当可以擦除。不过,若进行过重复去除处理,则可能会发生其它虚拟段参考(其它虚拟段的新虚拟段指针3205等指向)该更新前数据的状态(例如,在图18中,闪存组件230-A的虚拟段#x被闪存组件230-B的虚拟段#y参考)。该情况下,由于不能擦除该更新前的数据,因此为了存储(备份)该数据,使用了旧虚拟段指针3210、旧哈希值3211。
而在虚拟段进一步发生更新的情况下,旧虚拟段指针3210、旧哈希值3211中存储的内容也需要备份起来。为此,使用了后述的防擦除地址3208、防擦除哈希值3209。
在本实施例中,以新虚拟段指针3205、新哈希值3206、旧虚拟段指针3210、旧哈希值3211按每个虚拟段存在的例子进行说明,但也可以使每2个以上的虚拟段具有同样的信息。
防擦除地址3208、防擦除哈希值3209用于备份旧虚拟段指针3210、旧哈希值3211的值。需要备份的旧虚拟段指针3210和旧哈希值3211的数量不限于1。因此,防擦除地址3208和防擦除哈希值3209对1个虚拟段设置有1个或多个。
防擦除虚拟段数3207表示不可擦除的虚拟段的数量(即防擦除地址3208与防擦除哈希值3209的组的数量)。在图17所示的虚拟块组信息3200的例子中,虚拟块组内的第(s+1)个虚拟段(相对虚拟段编号为s的虚拟段)的防擦除地址(3208-s1、3208-s2)、防擦除哈希值(3209-s1、3209-s2)各自存在2个。该情况下,防擦除虚拟段数(3207-s)的值为2。
如上所述,新虚拟段指针3205、旧虚拟段指针3210、防擦除地址3208这样的信息按每个虚拟段设置,其结果是,可能会有多个实际段(或虚拟段)分配给1个虚拟段。如上文所述,从存储控制器200写入到虚拟段的数据之中的最新的数据(更新后数据)被存储在由新虚拟段指针3205指向的实际段中。因此,闪存组件230在从存储控制器200接收到读取请求时,原则上如上文所述,读取并回送由新虚拟段指针3205指向的实际段的数据。
不过,在发生了访问的重定向的情况下,有可能需要回送更新前数据(即,存储在由旧虚拟段指针3210、防擦除地址3208指向的实际段中的数据)。其具体方法将在后文中叙述。
以下将写入到虚拟段的数据中的、存储在由虚拟段的新虚拟段指针3205指向的实际段中的数据称作“虚拟段的更新后数据”或“虚拟段的更新数据”。而将存储在由虚拟段的旧虚拟段指针3210或防擦除地址3208指向的实际段中的数据称作“虚拟段的更新前数据”或“虚拟段的旧数据”。
本实施例的存储***100使用哈希函数SHA-256计算要写入虚拟段中的数据的哈希值。SHA-256发生冲突的概率极小。因此,在本实施例的存储***100中,在哈希值相同的数据存在多个的情况下,视为这些数据的内容相同,进行重复去除处理。不过,在除了比较哈希值之外还比较(按比特或字节为单位)各数据的全部内容来进行重复去除判断的情况下,也能够应用本发明。
接着说明图19所示的历史信息3400。在本实施例的存储***100中,重复去除处理与主机110的写入处理是异步执行的。因此,闪存组件230维持表示写入处理的历史的历史信息3400。历史信息3400包括历史信息数3401、写入地址3402、更新前哈希值3403、更新后哈希值3404。
写入地址3402是从存储控制器200进行了写入数据的写入的虚拟段的虚拟段地址。以下也将写入地址3402记作“虚拟段地址3402”。
更新前哈希值3403和更新后哈希值3404表示写入到根据写入地址3402确定的虚拟段中的数据(更新后数据或更新前数据)的哈希值。更新后哈希值3404是表示更新后数据的哈希值的信息。而更新前哈希值3403是表示更新前数据的哈希值的信息。以下将写入地址3402、更新前哈希值3403、更新后哈希值3404的组称作“写入历史”。
历史信息数3401是表示存储在历史信息3400中的写入历史(写入地址3402、更新前哈希值3403、更新后哈希值3404的组)的数量的信息,初始值为0。在每次闪存组件230从存储控制器200接收到写入请求并进行写入处理时,写入历史被追加到历史信息3400中,历史信息数3401的值也加一。写入历史按接收到写入请求的时刻的顺序存储在历史信息3400内。紧跟在历史信息数3401之后存储的写入历史是最早的写入历史。在从存储控制器200接收到历史信息发送请求时,闪存组件230将历史信息3400发送给存储控制器200,并将历史信息3400内的信息全部清空(将历史信息数3401置为0,并且各写入历史也可以擦除)。
接着说明哈希索引信息3500。如上文所述,在本实施例的存储***100中,各闪存组件230承担的哈希值的范围是预先决定的。哈希索引信息3500是用于在被提供了哈希值时确定存储有具有该哈希值的数据的闪存组件230(准确地说是虚拟段地址)的信息。哈希索引信息3500中存储有闪存组件230承担的哈希值和关于具有该哈希值的数据的存储位置的信息。
哈希索引信息3500的结构表示在图20中。该结构基本上与由DBMS(数据库管理***)所管理的索引中使用的B+树等为相同的结构。
叶子段3501相当于B+树等树结构中的叶子节点。本实施例中,将B+树的从根节点到叶子节点的路径上存在的各节点称作层段3509。叶子段3501以外的信息(各层段3509)存储在组件存储器320(和内部信息存储块)中。而叶子段3501存储在闪存芯片300中。
如上文所述,闪存组件230在闪存卷上设置有用于存储叶子段3501的区域(隐藏区域)。进行叶子段3501的参考和更新的程序(后述的重复去除判断部12300等)通过对隐藏区域上的虚拟段发出读取请求或写入请求,来进行叶子段3501的读写。其结果,叶子段3501被写入闪存芯片300(分配给虚拟段的实际段)中。
因此,叶子段3501的大小与虚拟段相同。叶子段3501有时也会仅存储不足虚拟段的大小的量的信息,该情况下,进行叶子段3501的更新的程序通过填充(padding)“0”等无效数据来使叶子段3501的大小与虚拟段相同,进而存储到闪存芯片300中。
叶子段3501上存储有哈希值和具有该哈希值的数据的存储位置的集合。作为该用于表示数据的存储位置的信息,使用虚拟段地址。因此,以下将哈希值为H的数据的存储位置称作“哈希值为H的虚拟段”。
关于存储在叶子段3501中的哈希值的范围的信息,包含在叶子段3501的父节点(层段3509)中。使用图20对存储在叶子段3501中的哈希值的范围进行说明。在图20中,叶子段3501-1和叶子段3501-2与共同的父节点即层段3509-1连接。
层段3509包含1个以上(数量与连接到层段3509上的叶子段3501的数量相同)的叶子地址3507与哈希值的最小值(Min(hash))3508的组。叶子地址3507是指向叶子段3501的指针。指向叶子段3501的指针所使用的值是虚拟段地址(因为叶子段3501被写入虚拟段中)。Min(hash)3508中存储的是,应当存储在由叶子地址3507所指向的叶子段3501中的哈希值的最小值。
在图20的结构例中,在例如Min(hash)3508-1中存储了0,Min(hash)3508-2中存储了k(k为大于0的值)的情况下,在叶子地址3507-1所指向的叶子段3501-1中,存储0到(k-1)的范围的哈希值,在叶子段3501-2中,存储k以上的值的哈希值。因此,通过参考各层段3509的内容(Min(hash)3508),能够确定存储有作为搜索对象的哈希值的叶子段3501。不过,在初始状态下,叶子段3501中没有存储哈希值。在写入数据被存储到闪存组件230中,并计算出写入数据的哈希值之后,哈希值才被存储到叶子段3501中,这方面的细节将在后文叙述。
另外,在作为层段3509(例如图20的层段3509-1)的父节点的层段3509中,也包含1个以上的叶子地址3507与Min(hash)3508的组。该情况的叶子地址3507使用的是下层的层段3509所处的内存(组件存储器320)上的地址。并且,与该叶子地址3507对应的Min(hash)3508中存储的是,存储在下层的层段3509中的多个Min(hash)3508中的最小值。利用该方法进一步形成上层的层段3509,构成为这样的结构,即,在最上层的层段3509即根节点中,能够存储关于哈希值的全空间的信息。
使用图21说明存储在叶子段3501中的信息的细节。叶子段3501中存储有1个以上的注册哈希值3502、注册数据数3503、段数3504、注册地址3505、无效标志3506的组。以下将该组称作条目(entry)3510。
在图21的例子中,表示了存储有3个条目3510的例子。不过,叶子段3501内的条目3510的数量既可以小于3也可以为4以上。另外,注册地址3505和无效标志3506的组有时在条目3510内会存储多个。在图21的例子中,条目3510-1中存储有3个注册地址3505与无效标志3506的组。
以下说明存储在条目3510内的信息。如上文所述,哈希值存储在叶子段3501中。具体而言,哈希值存储在条目3510内的注册哈希值3502中。1个条目3510中存储的哈希值为1个。例如,在某个叶子段3501中存储有n个哈希值的情况下,该叶子段3501中设置了n个条目3510,哈希值存储在各条目3510的注册哈希值3502中。
另外,紧跟在注册哈希值3502之后存储注册数据数3503。注册数据数3503表示哈希值与存储在条目3510内的注册哈希值3502相同的虚拟段(称作重复段)的数量。不过,注册数据数3503不包含不是重复去除处理对象的虚拟段的数量。
注册数据数3503之后存储段数3504、注册地址3505、无效标志3506。注册地址3505是哈希值为存储在条目3510内的注册哈希值3502中的哈希值的虚拟段的虚拟段地址。而无效标志3506是表示其之前的注册地址3505中是否存储了有效的值的信息。在无效标志3506中存储了“1”(ON)时,表示其之前的注册地址3505中未存储有效的值。
段数3504存储的是,存储在条目3510内的注册地址3505与无效标志3506的组的数量。原则上,在刚进行重复去除处理之后,具有同一哈希值的虚拟段在存储***100内仅存在一个即可(即,条目3510内的注册地址3505仅有1个即可)。不过,在本实施例的存储***100中,在同一条带行中存在具有相同哈希值的虚拟段的情况下,基于前述的理由,对这些虚拟段不进行重复去除处理。在与根据第1个注册地址3505确定的虚拟段具有相同的哈希值的虚拟段位于同一条带行上的情况下,闪存组件230将这些虚拟段的虚拟段地址存储在第2个以后的注册地址3505中。该处理的细节将在后文叙述。
如上文所述,注册数据数3503不包含不是重复去除处理对象的虚拟段的数量。注册数据数3503中存储有根据第1个注册地址3505确定的虚拟段和位于与该虚拟段不同的条带行上且与该虚拟段具有相同哈希值的虚拟段(即作为重复去除处理的对象的虚拟段)的合计。在与根据第1个注册地址3505确定的虚拟段具有相同哈希值的虚拟段全部位于同一条带行上的情况下,注册数据数3503为1。
在从存储控制器200对虚拟段写入新的数据,并且哈希索引信息3500中不存在该数据的哈希值的情况下,在叶子段3501中追加用于存储该哈希值的条目3510。不过,若条目3510无法都存储到1个叶子段3501中,则会追加叶子段3501。于是,这之前存储在叶子段3501(或层段3509)中的信息将被重新配置。不过,该操作是与B+树等树结构中的数据***同样的公知的操作,故此处省略说明。
接着,对存储控制器200和闪存组件230使用以上说明的管理信息来执行的处理进行说明。
首先,说明存储控制器200中进行的处理。其中,存储控制器200中进行的处理原则上是通过存储控制器200内的处理器260执行程序来实现的。该程序存储在内存270内。图22表示存储在内存270内的与本实施例相关的程序。
与本实施例相关的程序是读取处理执行部4000、写入请求受理部4100、后写入处理执行部4200、重复去除计划部4300。这些程序是用于实现上层的损耗平均技术、容量虚拟化技术的程序。在以下各处理的说明中,有的部分会以程序(读取处理执行部4000等)为主语来进行处理的说明。不过,这实际上意味的是程序(读取处理执行部4000等)在处理器260中执行来进行处理。
另外,如已经叙述过的那样,在本实施例的存储***100中,闪存组件230执行损耗平均功能和下层容量虚拟化功能。不过,作为其它的实施方式,也可以由存储控制器200执行损耗平均和下层容量虚拟化功能。该情况下,用于实现损耗平均功能和下层容量虚拟化功能的程序在存储控制器200中执行。于是,上层的程序(用于实现上层容量虚拟化功能的程序等)和下层的程序双方都在存储控制器200中执行,程序间的接口虽然不同,但上层的程序所执行的内容基本上没有太大的不同。因而,在本实施例中,以实现下层的损耗平均技术、容量虚拟化技术的是闪存组件230为前提,详细说明读取处理执行部4000、写入请求受理部4100、后写入处理执行部4200、重复去除计划部4300的处理流程。
此外,在本实施例中,以来自主机110的读取请求或写入请求中指定的数据访问范围与闪存的读写单位即虚拟段的边界一致为前提进行说明。当然,在从主机110指定的访问范围与虚拟段的边界不一致的情况下,逻辑卷也是可访问的。例如,在虚拟段的一部分区域被指定为写入范围的情况下,闪存组件230读取整个虚拟段,但仅更新指定的部分区域,再写入整个虚拟段。
图23是读取处理执行部4000的处理流程。读取处理执行部4000在存储控制器200从主机110接收到读取请求时执行。
步骤5000:读取处理执行部4000(处理器260)根据接收到的读取请求中指定的读取对象区域的地址,计算与读取对象区域对应的虚拟页的虚拟页#和虚拟页内的相对地址。
步骤5001:读取处理执行部4000检查作为读取对象的数据是否存储在缓存210中(是否命中)。这是公知的技术。在命中的情况下(步骤5001:是),接着进行步骤5011。在未命中的情况下(步骤5001:否),接着进行步骤5002。
步骤5002:此处,需要将作为读取对象的数据加载到缓存210中。首先,读取处理执行部4000通过参考逻辑卷信息2000的实际页指针2004,来确定分配到读取对象虚拟页的实际页的实际页信息2100。在以下说明中,将分配到读取对象虚拟页的实际页称作“读取对象实际页”。
步骤5003:读取处理执行部4000根据所确定的实际页信息2100的组件组2101、实际页地址2102,计算读取对象实际页所属的闪存组件组280和读取对象实际页(的开头)在闪存组件组280内所处的地址。
步骤5004:读取处理执行部4000根据步骤5001中得到的虚拟页内的相对地址和组件组RAID类型2302,计算存储了读取对象数据的实际页上的位置(具体而言,是实际页内相对地址)。并且,读取处理执行部4000使用计算出的实际页内相对地址、组件组RAID类型2302和闪存组件指针2305,确定存储了读取对象数据的闪存组件230和该闪存组件230内的地址。
步骤5005:读取处理执行部4000对步骤5004中确定的闪存组件230的地址发出读取请求。
步骤5006:读取处理执行部4000等待数据从闪存组件230发送过来。
步骤5007:根据发出读取请求的结果,有时会从闪存组件230返回表示数据已被进行了重复去除的响应。该情况下,响应中包含虚拟段地址和哈希值的组。在步骤5007中,读取处理执行部4000判断是否从闪存组件230返回了表示数据已被进行了重复去除的响应。如果是(步骤5007:是),则读取处理执行部4000接着执行步骤5009。如果不是(步骤5007:否),则从闪存组件230返回的是读取数据。该情况下接着执行步骤5008。
步骤5008:读取处理执行部4000在缓存210中确保用于存储读取对象数据的区域,将从闪存组件230发送来的数据存储到所确保的区域中。之后进行步骤5011。
步骤5009:该步骤在从闪存组件返回了表示数据已被进行了重复去除的响应(包含虚拟段地址和哈希值的组的响应)时执行。包含在响应中的虚拟段地址是表示实际存储了读取对象数据的闪存组件230及其虚拟段的信息。该情况下,读取处理执行部4000对实际存储了数据的闪存组件230(在响应中所含的虚拟段地址中包括组件ID,所以能够由此确定闪存组件230),发出指定了响应中所含的虚拟段地址和哈希值的读取请求(后述的“哈希指定型读取请求”)。
步骤5010:读取处理执行部4000等待数据从闪存组件230发送过来。当从闪存组件230开始了数据传输时,读取处理执行部4000执行步骤5008。
步骤5011:读取处理执行部4000将读取对象数据从缓存210读取出来并发送到主机110,结束处理。
图24是写入请求受理部4100的处理流程。写入请求受理部4100在存储控制器200从主机110接收到写入请求时执行。
步骤6000:写入请求受理部4100(处理器260)根据接收到的写入请求中指定的写入对象区域的地址,计算与写入对象区域对应的虚拟页的虚拟页#和虚拟页内的相对地址。
步骤6001:写入请求受理部4100确定写入请求中指定的逻辑卷的逻辑卷信息2000。写入请求受理部4100通过参考所确定的逻辑卷信息2000内的实际页指针2004,检查步骤6000中确定的虚拟页是否已分配了实际页。在已分配了实际页的情况下,跳过步骤6002,接着执行步骤6003。
步骤6002:写入请求受理部4100对与写入对象区域对应的虚拟页分配实际页。此时,写入请求受理部4100通过参考步骤6001中确定的逻辑卷信息2000的逻辑卷RAID类型2003和各闪存组件组信息2300的组件组RAID类型2303、空闲实际页数2304等,决定要分配哪个闪存组件组280的实际页。之后,写入请求受理部4100参考所决定的闪存组件组280的空闲实际页管理信息指针2200,使得写入对象区域所属的虚拟页的实际页指针2004表示(指向)开头的空闲实际页信息2100。由此,对写入对象区域所属的虚拟页分配了实际页。
并且,空闲实际页管理信息指针2200被变更为指向下一个实际页信息2100(分配给虚拟页的实际页的实际页信息2100中的空闲页指针2103所指向的实际页信息2100),进而,分配给虚拟页的实际页的实际页信息2100中的空闲页指针2103被置为空值。另外,写入请求受理部4100将与该实际页对应的闪存组件组管理信息的空闲实际页数2304的数值减一。本实施例说明的是在接收到写入请求时实施对虚拟页分配实际页的处理的例子,但该分配处理只要在将数据存储到闪存组件230之前执行即可。
步骤6003:写入请求受理部4100从主机110将该写入请求中指定的写入数据存储到缓存210中。其中,在将写入数据存储到缓存210时,写入请求受理部4100附加该写入数据的写入位置信息(闪存组件230的ID和闪存卷上的地址(LBA)等)再进行存储。之后结束处理。
闪存组件组280采用RAID结构,所以需要生成与存储在缓存210上的写入数据对应的冗余数据(应当存储在奇偶检验条带中的冗余数据,其中该奇偶检验条带与存储写入数据的数据条带属于同一条带行)。不过,因为这是公知的方法,故不进行详细的说明。冗余数据的生成例如可以紧接在步骤6003后进行。处理器260在生成了冗余数据后,将冗余数据暂时存储在缓存210中。
另外,如上文所述,根据虚拟页上的地址,除了能唯一地确定要存储数据的数据条带之外,还能唯一地确定应当存储与该数据对应的冗余数据的奇偶检验条带。在将冗余数据存储到缓存210中时,与写入数据同样地,处理器260对冗余数据附加写入位置信息。
写入数据、冗余数据由后写入处理执行部4200写入闪存组件230,但对于闪存组件230来说,二者都是要写入闪存组件230的数据,所以无需对二者进行区分。因此,后写入处理执行部4200在写入写入数据情况下和写入冗余数据的情况下,不会进行不同的处理。
不过,从重复去除处理的观点看来,因为冗余数据是由多个数据的逻辑运算(逻辑异或等)生成的结果,所以与通常的数据相比,能够重复去除的概率(存在别的相同数据的概率)较小。因此,为了削减重复去除的开销,可以不以其为重复去除的对象。该情况下,存储控制器200在写入冗余数据时,对闪存组件230附加表示不要以该数据为重复去除处理的对象的信息。接收到该信息的闪存组件230可以不以冗余数据为重复去除的对象。
图25表示后写入处理执行部4200的处理流程。后写入处理执行部4200是处理器260基于规定的起因而执行的处理。例如,可以定期地执行后写入处理执行部4200。或者,也可以在缓存210上的脏数据量超过了规定量的时刻执行后写入处理执行部4200。
后写入处理执行部4200执行将从主机110接收到的写入数据或冗余数据写入闪存组件230的处理。不过,后写入处理执行部4200将写入数据和冗余数据这两者作为应当写入闪存组件230的数据,以不区分二者的方式进行处理。
步骤7000:后写入处理执行部4200(处理器260)搜索缓存210,决定应当写入闪存组件230的数据。后写入处理执行部4200提取附加在找出的数据上的写入位置信息。其中,此处说明的例子是,后写入处理执行部4200要写入的区域的范围没有跨多个闪存组件230。
步骤7001:后写入处理执行部4200基于写入位置信息对相应的闪存组件230发出写入请求。此时,后写入处理执行部4200在写入冗余数据的情况下,可以发出表示不将该数据(冗余数据)作为重复去除的对象的指示。
步骤7002:后写入处理执行部4200等待写入请求结束。后写入处理执行部4200在从闪存组件230返回了关于该写入请求的结束报告时结束处理。
图26是重复去除计划部4300的处理流程。重复去除计划部4300取得积累在存储***100内的全部闪存组件230中的历史信息3400,对重复去除处理进行计划。本处理按适当的间隔执行。
步骤12000:重复去除计划部4300对存储***100内的各闪存组件230发出历史信息发送请求,等待历史信息3400从各闪存组件230发送过来。接收到历史信息发送请求的闪存组件230将历史信息3400回送到存储控制器(重复去除计划部4300)。闪存组件230进行的处理将在后文叙述。
步骤12001:重复去除计划部4300参考从各闪存组件230发送来的历史信息3400,生成列表1和列表2。关于列表1和列表2,以下一边参考图27一边进行说明。
如上文所述,历史信息3400包括1个以上的写入地址3402、更新前哈希值3403和更新后哈希值3404的组(称作“写入历史”)。如图27所示,列表1是通过从各写入历史中除去更新后哈希值3404而生成的记录的集合。而列表2是通过从各写入历史除去更新前哈希值3403而生成的记录的集合。
对于同一虚拟段可能会发生多次更新(历史信息3400中可能包括多个对同一虚拟段的写入历史)。重复去除计划部4300在同一虚拟段发生过多次更新的情况下(存在多个写入历史的情况),从写入地址3402相等的多个写入历史中提取出最初(最早)的写入历史和最后(最新)的写入历史。接着,重复去除计划部4300将从前者中除去更新后哈希值3404而生成的记录注册到列表1中,并将从后者中除去更新前哈希值3403而生成的记录注册到列表2中。不过,在旧数据的哈希值为空值的情况下,重复去除计划部4300不将该旧哈希值和虚拟段的地址注册到列表1中。
步骤12002:此处,重复去除计划部4300基于哈希值(更新前哈希值3403或更新后哈希值3404)将列表1和列表2内的信息分割成应当对各闪存组件230发送的信息。以下,将分割后的列表1内的信息中的要发送到闪存组件#f的信息称作“列表1-f”,将列表2内的信息中的要发送到闪存组件#f的信息称作“列表2-f”。
信息分割的方式如下。例如,在闪存组件#f承担的哈希值的范围为a~b的情况下,提取列表1中的(更新前)哈希值3403包含在a~b的范围内的记录,并将提取出的记录作为应当发送给闪存组件#f的信息,构成列表1-f。同样地,提取列表2中的(更新后)哈希值3404包含在a~b的范围内的记录,并将提取出的记录作为应当发送给闪存组件#f的信息,构成列表2-f。
步骤12003:重复去除计划部4300对各闪存组件230发出重复去除判断请求。此时,与重复去除判断请求一起,重复去除计划部4300还对闪存组件230发送按每个闪存组件230分割后的列表1和列表2(例如,对闪存组件#f发送列表1-f和列表2-f)。之后,重复去除计划部4300等待来自各闪存组件230的响应。
当闪存组件230(例如闪存组件#f)接收到重复去除判断请求并接收到列表1-f时,对注册在列表1-f中的每个虚拟段地址3402,判断是否要擦除根据虚拟段地址3402确定的虚拟段的旧数据,并将其结果回送到存储控制器200(重复去除计划部4300)。将回送来的结果信息称作“擦除候选”。
图28表示擦除候选的示例。擦除候选是用于对闪存组件230指示将虚拟段的旧数据擦除的信息。在本实施例中,将虚拟段的旧数据擦除,是指使虚拟段的旧虚拟段指针3210(或防擦除地址3208)的值为无效值(NULL)的处理。通过该处理,旧虚拟段指针3210(或防擦除地址3208)所指向的段(例如实际段)成为没有被分配给虚拟段的状态,成为实质上该虚拟段的旧数据已被删除的状态。此外,对于这之前分配给虚拟段的实际段,通过在闪存组件230中实施的垃圾回收处理等进行(包含该实际段的)实际块的擦除,之后用于其它用途。该处理为公知的技术,故省略此处的说明。
擦除候选是由虚拟段地址3601、哈希值3602、擦除标志3603构成的记录的列表。在记录内的擦除标志3603为“1”的情况下,意味着根据该记录内的虚拟段地址3601确定的虚拟段的旧数据可以擦除。在记录内的擦除标志3603为“0”的情况下,意味着根据该记录内的虚拟段地址3601确定的虚拟段的旧数据不可擦除。另外,哈希值3602是根据虚拟段地址3601确定的虚拟段的旧数据的哈希值。
此外,当闪存组件230(例如闪存组件#f)接收到列表2-f(与重复去除判断请求一起接收)时,对注册在列表2-f中的每个虚拟段地址3402,判断根据虚拟段地址3402确定的虚拟段的更新数据是否可进行重复去除处理,并将其结果回送到存储控制器200(重复去除计划部4300)。将回送来的结果信息称作“重复候选”。
在本实施例中,“虚拟段的重复去除”或“虚拟段的更新数据的重复去除”是指如下的处理,即,代替某个虚拟段(称作对象段)的新虚拟段指针3205所指向的实际段,将具有与该实际段相同的数据的虚拟段的虚拟段地址存储在对象段的新虚拟段指针3205中。由此,这之前分配给对象段的(新虚拟段指针3205原本指向的)实际段实质上被删除。
图29表示重复候选的示例。重复候选是用于对闪存组件230指示虚拟段的重复去除处理的信息。重复候选是由虚拟段地址3701、重复标志3702、重复地址3703构成的记录的列表。在记录内的重复标志3702为“1”的情况下,意味着根据该记录内的虚拟段地址3701确定的虚拟段的更新数据可重复去除,根据虚拟段地址3701确定的区域的数据可以删除。并且,在该情况下,重复地址3703存储与根据虚拟段地址3701确定的虚拟段具有相同哈希值的虚拟段的地址(虚拟段地址)。在记录内的重复标志3702为“0”的情况下,意味着根据该记录内的虚拟段地址3701确定的虚拟段的更新数据不可进行重复去除处理。
步骤12004:重复去除计划部4300将从各闪存组件230接收到的擦除候选内的各记录按每个应当发送的闪存组件230分类。此时的分类基于虚拟段地址3601进行。虚拟段地址中包含闪存组件230的识别符(组件ID)。在虚拟段地址3601中包含的组件ID为“f”的情况下,将该记录发送给闪存组件#f。将应当发送给闪存组件#f的记录的列表称作“擦除候选-f”。
步骤12005:重复去除计划部4300将接收到的重复候选内的各记录按每个应当发送的闪存组件230分类。该分类与步骤12004中进行的分类同样地,基于虚拟段地址3701进行。以下,将重复候选内的记录中的应当发送给闪存组件#f的记录的列表称作“重复候选-f”。
步骤12006:重复去除计划部4300对各闪存组件230发出重复去除执行请求。此时,与重复去除执行请求一起,重复去除计划部4300还将经步骤12004和步骤12005分类(生成)的重复候选和擦除候选发送给闪存组件230(例如,对闪存组件#f发送重复候选-f和擦除候选-f),并等待返回回答。
即,此处存储控制器200(重复去除计划部4300)基于虚拟段地址(3601、3701)将从各闪存组件230接收到的重复候选和擦除候选转发给发送目标的闪存组件。换言之,可以说闪存组件230是将生成的重复候选和擦除候选经存储控制器200发送到各闪存组件230。
在发送了重复候选和擦除候选后,闪存组件230将根据擦除标志3603为“1”的记录中包含的虚拟段地址3601所确定的虚拟段的旧数据擦除,并对根据重复标志3702为“1”的记录中包含的虚拟段地址3601所确定的虚拟段执行重复去除处理。该处理的细节将在后文叙述。
步骤12007:在各闪存组件230返回了回答后,重复去除计划部4300结束处理。
接着说明闪存组件230所执行的动作。闪存组件230的动作由组件处理器310执行,其程序存储在组件存储器320内。
图30表示存储在组件存储器320内的与本实施例相关的程序。与本实施例相关的程序是数据读取处理执行部12600、数据写入处理执行部12100、历史信息发送部12200、重复去除判断部12300、重复去除执行部12400、哈希指定型读取执行部12500。以下对各程序的处理流程进行说明。在以下各处理的说明中,有的部分会以程序(数据读取处理执行部12600等)为主语来进行处理的说明。不过,这实际上意味的是通过程序(数据读取处理执行部12600等)在组件处理器310中执行来进行处理。
图31是数据读取处理执行部12600的处理流程。数据读取处理执行部12600在从存储控制器200接收到读取请求时执行。此外,在重复去除判断部12300读取叶子段3501时也会利用本处理。本实施例所示的图31的处理流程表示读取存储在1个虚拟块组中的数据的处理流程。不过,在读取请求要读取跨多个虚拟块组存储的数据的情况下,本发明也是有效的。
另外,本实施例的存储控制器200所发出的读取请求存在2种。第1读取请求指定了读取对象区域(根据地址和数据长度确定的区域)。而第2读取请求除了读取对象区域外还指定了哈希值。以下将第1读取请求称作“通常读取请求”,将第2读取请求称作“哈希指定型读取请求”。图31中说明的处理流程是从存储控制器200接收到通常读取请求时进行的。
步骤13000:数据读取处理执行部12600(组件处理器310)根据接收到的读取请求中指定的读取对象地址,计算读取对象区域所属的虚拟块组和虚拟块组内的要访问的相对地址。在读取对象地址由LBA表示的情况下,数据读取处理执行部12600计算读取对象地址×512÷(m×闪存块容量3004)。该计算所算出的商为虚拟块组号,余数为虚拟块组内相对地址。由此,数据读取处理执行部12600能够确定作为读取对象的虚拟块组(虚拟块组信息3200)。
步骤13001:在该步骤中,数据读取处理执行部12600将步骤13000中求得的虚拟块组内的相对地址转换为相对虚拟段编号,进而使用它来确定访问对象的虚拟段的新虚拟段指针3205。
步骤13002:数据读取处理执行部12600识别存储在新虚拟段指针3205中的地址是否为实际段地址。在得到的地址是实际段地址的情况下(步骤13002:否),数据读取处理执行部12600接着执行步骤13003。在不是的情况下(步骤13002:是)执行步骤13008。
步骤13003:如上文所述,实际段地址包含存储了数据的实际块的识别符和该实际块内的相对地址(相对段编号)的组。数据读取处理执行部12600根据实际段地址中所含的信息,确定访问对象区域所处的闪存芯片300和该闪存芯片300内的位置(地址)。
步骤13004:数据读取处理执行部12600通过参考步骤13003中确定的闪存芯片300的芯片信息3100,识别与该闪存芯片300连接的组件总线340,识别对应的组件总线传输装置350。
步骤13005:数据读取处理执行部12600对步骤13004中识别出的组件总线传输装置350指示将数据从闪存芯片300传输到缓冲器330中。
步骤13006:之后,数据读取处理执行部12600等待传输完成。
步骤13007:数据读取处理执行部12600将已存储在缓冲器330中的从存储控制器200请求的读取数据发送给存储控制器200,结束处理。
步骤13008:在该步骤执行的情况下,步骤13001中确定的新虚拟段指针3205存储的是虚拟段地址。数据读取处理执行部12600将新虚拟段指针3205的内容和新哈希值3206回送到存储控制器200,结束处理。
其中,对存储在新虚拟段指针3205中的虚拟段地址进行检查,其结果,该虚拟段地址也有可能是指向本闪存组件(数据读取处理执行部12600所执行的闪存组件230)内的虚拟段的地址。该情况下,读取对象数据在本闪存组件内。因此,在该情况下,数据读取处理执行部12600也可以不回送新虚拟段指针3205的内容和新哈希值3206,而是取而代之,找出存储在闪存组件230内的数据,将找出的数据回送到存储控制器200。
图32是哈希指定型读取执行部12500的处理流程。该处理在闪存组件230从存储控制器200接收到哈希指定型读取请求(执行了步骤5009时)时进行。如上文所述,哈希指定型读取请求中除了包括访问对象区域的信息(地址)之外还包括哈希值。另外,在以下说明中,将哈希指定型读取请求简记作“读取请求”。
步骤13500:该处理与步骤13000相同。通过该处理,哈希指定型读取执行部12500确定与访问对象区域对应的虚拟块组内的相对虚拟段编号。此处,假定所确定的相对虚拟段编号为“s”的情况进行说明。相对虚拟段编号为“s”的虚拟段记作“虚拟段#s”。
步骤13501:哈希指定型读取执行部12500将接收到的读取请求中指定的哈希值与虚拟段#s的新哈希值3206、旧哈希值3211、防擦除哈希值3209进行对照。在读取请求中指定的哈希值与新哈希值3206一致的情况下,哈希指定型读取执行部12500取得虚拟段#s的新虚拟段指针3205中存储的信息(地址)。
而在读取请求中指定的哈希值与旧哈希值3211一致的情况下,哈希指定型读取执行部12500取得虚拟段#s的旧虚拟段指针3210中存储的信息(地址)。另一方面,在读取请求中指定的哈希值与防擦除哈希值3209一致的情况下,哈希指定型读取执行部12500取得虚拟段#s的防擦除地址3208中存储的信息(地址)。此外,在虚拟段#s中设置有多个防擦除哈希值3209和防擦除地址3208的情况下,哈希指定型读取执行部12500将读取请求中指定的哈希值与各防擦除哈希值3209进行比较对照。
步骤13503:步骤13501中取得的地址是实际段地址。数据读取处理执行部12600根据步骤13501中得到的实际段地址,确定存储有读取对象数据的闪存芯片300的识别符和该闪存芯片300内的地址。这是与步骤13003相同的处理。
步骤13504:进行与步骤13004相同的处理。
步骤13505:进行与步骤13005相同的处理。
步骤13506:进行与步骤13006相同的处理。
步骤13507:进行与步骤13007相同的处理。由此,将数据回送到存储控制器200。
接着,使用图33和图34说明数据写入处理执行部12100的处理流程。数据写入处理执行部12100在闪存组件230从存储控制器200接收到写入请求时执行。此外,本处理流程在重复去除判断部12300进行叶子段的写入时也执行。
另外,本实施例所示的图33和图34的处理流程表示的是写入请求中指定的范围包含在1个虚拟块组内而没有跨多个虚拟块组的情况下的处理。不过,在接收到对跨多个虚拟块组的区域的写入请求的情况下,本发明也是有效的。
步骤14000:数据写入处理执行部12100(组件处理器310)根据接收到的写入请求中作为写入对象的地址,计算写入对象区域所属的虚拟块组和要访问的虚拟块组内相对地址。这与步骤13000中进行的计算是同样的。数据写入处理执行部12100通过将写入对象区域所属的虚拟块组内的相对地址转换为相对虚拟段编号,来确定与写入对象区域对应的虚拟段。以下将该虚拟段称作“写入对象虚拟段”。而且,此处也能够确定写入对象虚拟段的新虚拟段指针3205。
本实施例说明来自存储控制器200的写入请求中指定的写入范围与虚拟段边界一致的例子。当然,在来自存储控制器200的写入请求仅指定虚拟段的一部分的情况下,本发明也是有效的。在闪存虚拟段的一部分区域被指定的情况下,闪存组件230将整个虚拟段读取到缓冲器330等中,在缓冲器330上仅更新被指定的部分区域,再将更新后的1个虚拟段的量的数据写入虚拟段中。
步骤14001:数据写入处理执行部12100从存储控制器200接收该写入请求中指定的写入数据,并将其存储到缓冲器330中。并且,数据写入处理执行部12100使用哈希电路370计算该数据的哈希值。
步骤14002:数据写入处理执行部12100从成为写入对象的虚拟段所属的虚拟块组的虚拟块组信息3200(以下称“对象虚拟块组信息”)之中,获得最初的实际块信息指针3202。并且,数据写入处理执行部12100检查该值是否为空值,即,是否已分配了实际块。若没有分配实际块(步骤14002:否),则数据写入处理执行部12100接着执行步骤14005。在没有分配实际块的情况下(步骤14002:是),接着执行步骤14003。
步骤14003:数据写入处理执行部12100对成为写入对象的虚拟段所属的虚拟块组分配处于空闲状态的实际块。其中,此处分配的实际块是已被擦除、没有数据存储的实际块。
具体而言,数据写入处理执行部12100参考各芯片信息3100的芯片内空闲实际块数3103等,决定作为取得空闲实际块的对象的闪存芯片300。之后,数据写入处理执行部12100参考所决定的闪存芯片300的空闲实际块信息指针3600,得到指向开头的实际块信息3300的指针。接着,数据写入处理执行部12100将得到的指针存储在对象虚拟块组信息的最初的实际块信息指针3202中。由此,对虚拟块组分配了最初的实际块。
另外,空闲实际块信息指针3600被变更为指向下一个实际块信息3300(分配给虚拟块组的实际块的实际块信息3300中的空闲实际块指针3302所指向的实际块信息3300),进而,分配给虚拟块的实际块的实际块信息3300中的空闲实际块指针3302被置为空值。并且,数据写入处理执行部12100将与该实际块对应的芯片信息3100的芯片内空闲实际块数3103的数值减一。而且,数据写入处理执行部12100使与分配的实际块对应的实际块内空闲容量3304为实际块的容量。此处,从分配的实际块的开头写入数据。
步骤14004:数据写入处理执行部12100生成分配到的实际块的开头实际段的实际段地址。具体而言,通过组合实际块的识别符和实际块内的相对地址(此处相对地址为0),能够生成实际段地址。数据写入处理执行部12100将生成的实际段地址设定到写入对象虚拟段的新虚拟段指针3205中。由此,写入对象虚拟段被分配了实际段。另外,数据写入处理执行部12100将步骤14001中计算出的哈希值设定到写入对象虚拟段的新哈希值3206中。并且,数据写入处理执行部12100将写入对象虚拟段的旧虚拟段指针3210和旧哈希值3211置为空值。此外数据写入处理执行部12100将数据存储量3203设置为0。之后,数据写入处理执行部12100执行步骤14010。
步骤14005:数据写入处理执行部12100确定与成为写入对象的实际块对应的实际块信息3300。这是虚拟块组信息3200内的存储有有效值(非NULL值)的实际块信息指针3202中的最末尾的实际块信息指针3202所指向的实际块信息3300。数据写入处理执行部12100根据所确定的实际块信息3300的实际块内空闲容量3304和存储在缓冲器330中的写入数据的长度,检查是否能够将接收到的数据写入到该实际块的空闲区域中。在能够写入的情况下(步骤14005:否),接着执行步骤14008。在不能写入的情况下,数据写入处理执行部12100接着执行步骤14006。
步骤14006:本步骤是在写入数据的长度比作为写入对象的实际块的空闲区域大的情况下执行的步骤。在本步骤中,数据写入处理执行部12100判断虚拟块组是否分配了m+1个实际块(判断虚拟块组信息3200内的m+1个实际块信息指针3202是否全部为非NULL值)。在分配了m+1个实际块的情况下,数据写入处理执行部12100执行步骤14013。
步骤14007:该步骤是对对应的虚拟块组分配处于空闲状态的实际块的步骤,进行与步骤14003同样的处理。
步骤14008:数据写入处理执行部12100检查虚拟块组信息3200内的写入对象虚拟段的旧虚拟段指针3210,如果为空值,则将写入对象虚拟段的新虚拟段指针3205和新哈希值3206分别拷贝到旧虚拟段指针3210和旧哈希值3211中(在旧虚拟段指针3210不为空值的情况下,不将信息拷贝到旧虚拟段指针3210、旧哈希值3211中)。另外,在第一次接收到对该虚拟段的写入请求的情况下,该虚拟段和旧虚拟段指针3210、旧哈希值3211为空值。旧哈希值3211为空值意味着该哈希值是无效的。
步骤14009:数据写入处理执行部12100将分配给该虚拟块组的实际块中的最后的实际块(实际块信息指针3202不为空值的最后的实际块信息指针3202所指向的实际块)决定为写入对象。另外,数据写入处理执行部12100将步骤14001中计算出的哈希值设定到写入对象虚拟段的新哈希值3206中。
步骤14010:数据写入处理执行部12100将写入对象虚拟段的新哈希值3206、旧哈希值3211和写入对象的虚拟段地址追加到历史信息3400中,并将历史信息数3401加1。并且,数据写入处理执行部12100根据数据写入对象实际块的实际块内空闲容量3304,决定本次进行写入的地址(实际段地址;即芯片ID、裸片编号、块编号以及实际块内相对段编号的组合)。数据写入处理执行部12100由于从实际块的开头的实际段依次写入数据,所以只要知道实际块内空闲容量3304和实际块的大小,就能够容易地决定本次应当进行写入的实际块内相对地址(相对段编号)。数据写入处理执行部12100将该地址设定到写入对象虚拟段的新虚拟段指针3205中。并且,数据写入处理执行部12100使实际段位图3305中的与本次成为写入对象的实际段对应的比特为ON。
步骤14011:数据写入处理执行部12100对传输装置设定将缓冲器330内的写入数据写入到写入对象的实际段中的请求,并等待写入完成。
步骤14012:数据写入处理执行部12100从与写入对象的实际块对应的实际块内空闲容量3304中,削减与本次进行了写入的实际段的合计大小相当的值。并且,数据写入处理执行部12100在数据存储量3203上加上作为写入对象的虚拟段的容量。接着,数据写入处理执行部12100向存储控制器200报告处理完成,并结束处理。
步骤14013:此处,进行将目前为止未被分配给虚拟块组的实际块内的有效数据移动到新的空闲实际块中的处理(所谓的垃圾回收(garbage collection)处理)。具体而言,数据写入处理执行部12100从目前为止被分配给虚拟块组的实际块之中,读取出有效的信息,即存储在新虚拟段指针3205、旧虚拟段指针3210、防擦除地址3208所指向的实际段中的数据,将读取出的数据写入新的空闲实际块,并更新虚拟块组信息3200。具体而言,数据写入处理执行部12100将指向写入了数据的实际块的实际块信息3300的指针存储在实际块信息指针3202中,并将写入了数据的实际块(的实际段)的地址设定到新虚拟段指针3205、旧虚拟段指针3210、防擦除地址3208中。并且,对于新写入了数据的实际块的实际块信息3300,还进行实际块内空闲容量3304和实际段位图3305的设定。另外,这里新分配的实际块是根据损耗平均算法(用于使各实际块的擦除次数均衡的算法)而选择的。损耗平均是公知的技术,故此处不进行详细的说明。另外,关于这之前分配给虚拟块组的实际块,将其擦除处理,作为空闲实际块进行管理。之后执行步骤14005。
图35是历史信息发送部12200的处理流程。历史信息发送部12200在从存储控制器200发送来历史信息发送请求时(步骤12000)执行。
步骤15000:历史信息发送部12200将历史信息3400发送给存储控制器200。
步骤15001:历史信息发送部12200将历史信息3400初始化。具体而言,历史信息发送部12200将组件存储器320内的存储了历史信息3400的区域清空为0。之后结束处理。
图36是重复去除执行部12400的处理流程。重复去除执行部12400是在从存储控制器200发送来重复去除执行请求和之前说明过的擦除候选与重复候选时(步骤12006)执行的处理流程(准确地说,经步骤12004、步骤12005分类的擦除候选和重复候选发送到闪存组件230。例如,闪存组件#x接收擦除候选-x和重复候选-x。不过,在以下说明中,将擦除候选-x和重复候选-x分别称作“擦除候选”和“重复候选”)。
步骤16000:重复去除执行部12400将从存储控制器200发送来的擦除候选的记录划分为擦除标志3603为“1”的记录和为“0”的记录。
步骤16001:本步骤进行针对擦除标志3603为“1”的记录的处理。以下说明执行了步骤16000的结果是存在1个擦除标志3603为“1”的记录的情况的例子。其中,在步骤16001的说明中,将根据该记录的虚拟段地址3601确定的虚拟段称作“对象虚拟段”。
重复去除执行部12400根据记录中的虚拟段地址3601,求取对象虚拟段所属的虚拟块组,和对象虚拟段的相对虚拟段编号。以下说明求得的相对虚拟段编号为“s”的情况下的例子。
重复去除执行部12400通过参考所确定的虚拟块组的虚拟块组信息3200,读取对象虚拟段的旧哈希值3211(3211-s)和防擦除哈希值3209(3209-s),将它们与哈希值3602比较。
在哈希值3602与旧哈希值3211-s一致的情况下,重复去除执行部12400判断存储在旧虚拟段指针3210-s中的地址是否为实际段地址。在为实际段地址的情况下,重复去除执行部12400从数据存储量3203中减去虚拟段的大小。
并且,重复去除执行部12400通过参考存储在旧虚拟段指针3210-s中的地址(具体而言,包含在实际段地址中的实际块识别符)和实际块信息指针3202,确定具有存储有旧数据的实际段的实际块的实际块信息3300。重复去除执行部12400使该实际块信息3300的实际段位图3305中的与存储有旧数据的实际段对应的比特为OFF。在存储在旧虚拟段指针3210-s中的地址不是实际段地址的情况下,不进行这些处理。
接着,重复去除执行部12400使旧虚拟段指针3210-s和旧哈希值3211-s为空值。由此,原本分配给虚拟段的存储(备份)旧数据的区域(旧虚拟段指针3210-s所指向的实际段)实质上被删除。
在哈希值3602与防擦除哈希值3209-s一致的情况下,重复去除执行部12400使防擦除哈希值3209-s和防擦除地址3208-s为空值,并将防擦除虚拟段数3207-s减1。由此,原本分配给虚拟段的存储(备份)旧数据的区域(防擦除地址3208-s所指向的实际段)实质上被删除。
此外,重复去除执行部12400从数据存储量3203中减去虚拟段的大小,并使实际段位图3305中的与这之前由防擦除地址3208-s所指向的实际段对应的比特为OFF。这与上面说明的对旧虚拟段指针3210-s进行的处理相同。
进而,重复去除执行部12400将存储在已置为空值的防擦除哈希值3209-s和防擦除地址3208-s后方的防擦除哈希值3209和防擦除地址3208,前移至已置为空值的防擦除哈希值3209和防擦除地址3208。
步骤16002:本步骤进行针对擦除标志3603为“0”的记录的处理。以下与步骤16001同样地,说明擦除标志3603为“0”的记录为1个的情况的例子。其中,将根据该记录的虚拟段地址3601确定的虚拟段称作“对象虚拟段”。
重复去除执行部12400根据记录中的虚拟段地址3601,求取对象虚拟段所属的虚拟块组,和对象虚拟段的相对虚拟段编号。以下说明求得的相对虚拟段编号为“s”的情况下的例子。重复去除执行部12400进行所确定的虚拟块组的虚拟块组信息3200的更新。
具体而言,重复去除执行部12400将防擦除虚拟段数3207-s加1。并且,重复去除执行部12400将旧虚拟段指针3210和旧哈希值3211拷贝到防擦除地址3208、防擦除哈希值3209的区域。重复去除执行部12400使旧虚拟段指针3210、旧哈希值3211为空值。
步骤16003:此处,执行关于重复候选的处理。在重复候选之中包含重复标志3702为“0”的记录的情况下,忽视该记录。在包含重复标志3702为“1”的记录的情况下,针对根据该记录的虚拟段地址3701确定的虚拟段,应当进行重复去除处理。以下说明重复候选内包含1个重复标志3702为“1”的记录的情况下的例子。其中,在以下的例子中,说明根据该记录的虚拟段地址3701确定的虚拟段(称作对象虚拟段)的相对虚拟段编号为“s”的情况下的例子。
重复去除执行部12400更新对象虚拟段所属的虚拟块组的虚拟块组信息3200。具体而言,重复去除执行部12400先将新虚拟段指针3205-s暂时置为空值,再从数据存储量3203中削减虚拟段的大小。并且重复去除执行部12400采用与步骤16001的处理同样的方法,使与新虚拟段指针3205-s所指向的实际段对应的实际段位图3305为OFF。
进而,重复去除执行部12400将新虚拟段指针3205-s设定为重复地址3703的值。由此,新虚拟段指针3205-s指向哈希值相同的虚拟段,成为已进行了对象虚拟段的重复去除处理的状态。另外,哈希值相同的虚拟段既存在位于同一闪存组件230内的情况,也存在位于其它闪存组件230内的情况。
当步骤16003结束时,重复去除执行部12400对存储控制器200通过处理已完成,结束处理。另外,上面说明的是各步骤中作为处理对象的擦除候选的记录(或重复候选的记录)为1个的情况下的例子,在擦除候选的记录(或重复候选的记录)存在多个的情况下,对各记录进行上面说明的处理。
图37是重复去除判断部12300的处理流程。重复去除判断部12300是从存储控制器200发送来重复去除判断请求和上文说明过的列表1和列表2时(步骤12003)执行的处理流程。重复去除判断部12300将接收关于该闪存组件230承担的哈希值的列表(例如,闪存组件#x接收列表1-x、列表2-x)。
步骤17000:本步骤执行与列表1-x相关的处理。重复去除判断部12300从列表1-x中一个一个地读取记录,并基于存储在各记录中的虚拟段地址3402和(更新前)哈希值3403,进行虚拟段的旧数据是否可擦除的判断,生成擦除候选的记录。
以下说明读取列表1-x内的1个记录时进行的处理的例子。其中,以下说明的是读取出的记录的(更新前)哈希值3403为H的情况下的例子。将根据读取出的记录的虚拟段地址3402确定的虚拟段称作“对象段”,将对象段的虚拟段地址(即虚拟段地址3402)称作“对象段地址”。
在(更新前)哈希值3403为H的情况下,重复去除判断部12300检索哈希索引信息3500,确定存储有哈希值H的信息的叶子段3501,将其读取到缓冲器330中。此时,重复去除判断部12300通过调用数据读取处理执行部12600,来进行存储了叶子段3501的虚拟段的读取。
接着,重复去除判断部12300根据读取出的叶子段3501确定注册哈希值3502为H的条目3510。进而,重复去除判断部12300判断该条目3510中是否存在值与对象段地址相等的注册地址3505,根据判断结果而进行不同的处理。
首先说明存在值与对象段地址相等的注册地址3505的情况。该情况可能有这样两种场景,即,所存在的注册地址3505是条目3510内的开头注册地址3505,或不是开头注册地址3505。
在值与对象段地址相等的注册地址3505不是条目3510内的开头注册地址3505的情况下,可以将对象段的旧数据擦除。这是因为,在条目3510内的第2个以后的注册地址3505中存储有未进行重复去除处理的虚拟段的地址(存储有与第1个注册地址3505属于同一条带行的虚拟段的虚拟段地址),所以即使将该虚拟段的旧数据删除也不会发生问题。
因此,作为擦除候选的记录,重复去除判断部12300此时生成虚拟段地址3601中存储了对象段地址,哈希值3602存储了H,擦除标志3603存储了1的记录。并且,重复去除判断部12300使与值与对象段地址相等的注册地址3505对应的无效标志3506为ON。同时,注册地址3505中可以存储NULL。并且,重复去除判断部12300将段数3504减1。
另外,此处进行的条目3510的编辑(段数3504等的更新等)是对读取到缓冲器330上的条目3510的内容进行的。
另一方面,在条目3510的开头注册地址3505的值与对象段地址相等的情况下,存在可以擦除对象段的旧数据的情况和不可擦除的情况。在注册数据数3503为1的情况下,意味着除了根据对象段地址(或开头注册地址3505)确定的虚拟段之外,不存在哈希值为H的虚拟段。因此在该情况下,对象段的旧数据可以擦除。在注册数据数3503为1但段数3504为2以上的值的情况下,存在多个哈希值为H的虚拟段。不过,该情况下,哈希值为H的虚拟段均存在于某个闪存组件组280内的同一条带行上。属于同一条带行的虚拟段不进行重复去除处理,因此可以擦除。另一方面,在注册数据数3503为2以上的情况下,意味着存在参考对象段的虚拟段(进行了重复去除)。该情况下,对象段的旧数据不应擦除。
为此,在注册数据数3503为1的情况下,作为擦除候选的记录,重复去除判断部12300生成虚拟段地址3601中存储了对象段地址,哈希值3602存储了H,擦除标志3603存储了1的记录。并且,重复去除判断部12300从叶子段3501中删除注册哈希值3502为H的条目3510。这是因为,哈希值为H且为重复去除处理对象的虚拟段不再存在。
在注册数据数3503为2以上的情况下,作为擦除候选的记录,重复去除判断部12300生成虚拟段地址3601中存储了对象段地址,哈希值3602存储了H,擦除标志3603存储了0的记录(即,不允许擦除对象段)。并且,此时重复去除判断部12300不进行条目3510的内容变更。
接着说明条目3510内不存在值与对象段地址相等的注册地址3505的情况。该情况下,对象段是参考根据条目3510的开头注册地址3505确定的虚拟段的虚拟段。因为对象段不会反过来被其它虚拟段参考,所以对象段的旧数据可以擦除。因此,作为擦除候选的记录,重复去除判断部12300生成虚拟段地址3601中存储了对象段地址,哈希值3602存储了H,擦除标志3603存储了1的记录。进而,重复去除判断部12300将注册数据数3503减1。此处进行的注册数据数3503的更新也是对读取到缓冲器330上的条目3510的内容进行的。
以上的处理对列表1内的全部记录进行。在对列表1内的全部记录进行了如上所述的处理之后,重复去除判断部12300将在缓冲器330上进行了编辑(更新)后的叶子段3501写入。此时,重复去除判断部12300通过调用图33和图34所示的数据写入处理执行部12100来执行写入。根据数据写入处理执行部12100的说明可知,在进行虚拟段的写入时,写入数据被写入到与分配给虚拟段的实际段不同的实际段(空闲实际段)中。
步骤17001:本步骤执行与列表2相关的处理。重复去除判断部12300从列表2-x中一个一个地读取记录,并基于存储在各记录中的虚拟段地址3402和(更新后)哈希值3404进行重复去除的判断,生成重复候选的记录。以下说明读取列表2-x内的1个记录时进行的处理的例子。与步骤17000的说明同样地,以下说明的是读取出的记录的(更新后)哈希值3404为H的情况下的例子。将根据读取出的记录的虚拟段地址3402确定的虚拟段称作“对象段”,将对象段的虚拟段地址(即虚拟段地址3402)称作“对象段地址”。
在(更新后)哈希值3404为H的情况下,重复去除判断部12300检索哈希索引信息3500,确定可能存储有哈希值H的信息的叶子段3501,将其读取到缓冲器330中。与步骤17000同样地,重复去除判断部12300此时通过调用数据读取处理执行部12600来进行叶子段3501的读取。
接着,重复去除判断部12300判断读取出的叶子段3501内是否存在注册哈希值3502为H的条目3510。在没有找到符合的条目3510的情况下,无法进行重复去除(意味着不存在重复数据)。该情况下,作为重复候选的记录,重复去除判断部12300生成虚拟段地址3701中存储了对象段地址,重复标志3702存储了0、重复地址3703中存储了NULL的记录。并且,重复去除判断部12300在读取到缓冲器330上的叶子段3501内记录哈希值H和虚拟段地址。具体而言,重复去除判断部12300新生成注册哈希值3502中存储了H的条目3510。并且,重复去除判断部12300使注册数据数3503和段数为1,将对象段地址设定在条目3510的开头注册地址3505中,使无效标志3506为OFF。
在存在注册哈希值3502为H的条目3510的情况下,有可能能够进行重复去除。该情况下,重复去除判断部12300比较记录在条目3510内的开头注册地址3505中的虚拟段地址与对象段地址,判断二者是否属于同一条带行。进行该判断时使用闪存组件组信息2300。
具体而言,在记录在注册地址3505中的虚拟段地址和对象段地址各自所含的组件ID均为同一闪存组件组280内的闪存组件230的组件ID,并且记录在注册地址3505中的虚拟段地址和对象段地址各自所含的内部虚拟段编号相等的情况下,能够判断为二者属于同一条带行。
在二者属于同一条带行的情况下,重复去除判断部12300决定不进行对象段的重复去除处理。因此,作为重复候选的记录,重复去除判断部12300生成虚拟段地址3701中存储了对象段地址,重复标志3702中存储了0,重复地址3703中存储了NULL的记录。进而,重复去除判断部12300对读取到缓冲器330上的叶子段3501内的条目3510进行更新。具体而言,重复去除判断部12300将段数3504的值加1,并在条目内追加注册地址3505与无效标志3506的组,将所追加的组内的新的注册地址3505设定为对象段地址,使无效标志3506为OFF。
在二者不属于同一条带行的情况下,对象段可以进行重复去除。作为重复候选的记录,重复去除判断部12300生成虚拟段地址3701中存储了对象段地址,重复标志3702中存储了1,重复地址3703中存储了条目3510内的开头注册地址3505的内容的记录。并且,重复去除判断部12300将条目3510内的注册数据数3503加1。
以上的处理对列表2内的全部记录进行。之后,重复去除判断部12300将在缓冲器330上进行了编辑(更新)后的叶子段3501写入。如步骤17000中说明的那样,重复去除判断部12300通过调用图33和图34所示的数据写入处理执行部12100来执行写入。
步骤17002:重复去除判断部12300将步骤17000、步骤17001中生成的擦除候选和重复候选的列表返回给存储控制器200,之后结束处理。
以上是重复去除判断部12300的处理。另外,上面说明的例子中,在步骤17000完成后,将在缓冲器330上编辑(更新)后的叶子段3501写入(写入实际段),并且在步骤17001完成后,将在缓冲器330上编辑(更新)后的叶子段3501写入。不过,步骤17000和步骤17001中作为处理(参考或更新)对象的叶子段3501中可以包含相同的内容。因此,重复去除判断部12300也可以在步骤17000完成的时刻不将叶子段3501写入实际段,而是在步骤17001中一起写入。
以上结束本实施例的存储***的说明。在本实施例的存储***中,因为能够执行闪存组件间的数据的重复去除,所以重复去除的效率较高。并且,原则上由闪存组件执行重复去除处理,所以具有存储控制器不会存在性能上的瓶颈这一优点。
另外,在本实施例的存储***中,为了进行重复去除处理而在存储控制器与闪存组件之间交互的信息仅为哈希值和对应的数据地址。并且,存储控制器通过在1次的命令中传输多个哈希值和数据地址,能够削减从存储控制器访问闪存组件的次数。
另外,在进行重复去除处理的存储***中,需要如上文所述的实施例的存储***的哈希索引那样,存储数据的哈希值和具有该哈希值的数据所存储的区域的信息(以下称索引)。这些信息会变得膨大,若存储在DRAM等昂贵的存储介质中,则存储设备的单位比特成本将升高。为此,在本实施例的存储***中,将这些信息存储在闪存组件的闪存存储器中。
索引在每次从主机发生数据写入(更新)时都会变更。因此,若将索引集中存储在特定的闪存组件中,则该闪存组件的更新次数会变得膨大,容易成为性能的瓶颈,闪存的寿命也会变短。
在上面说明的实施例的存储***中,将索引分散地存储在多个闪存组件中,分散存储的索引由各闪存组件管理(参考或更新)。因此,关于索引的处理不会集中在一个控制器(或闪存组件)上。并且,写入索引的闪存上的区域(段)也作为损耗平均处理的对象来管理,所以对于写入索引的段和写入数据的段能够以擦除次数不发生偏倚的方式控制。
另外,索引的更新处理所花费的开销较大。在数据发生更新的情况下,通常哈希值也变更为不同的值(从旧哈希值至新哈希值)。因此,当数据更新1次时,索引会发生3次更新,即,1)将新哈希值更新为该数据的哈希值,2)将该数据的地址附加到具有新哈希值的数据的集合中,3)从具有旧哈希值的数据的集合中删除该数据的地址。若在存储控制器中进行该更新,则会发生3次用于读取这些信息的闪存访问,以及3次用于写入这些信息的闪存访问,成为较大的开销。
而在上面说明的实施例的存储***中,在存储控制器与闪存组件之间传输重复去除处理中使用的写入处理历史和写入数据的哈希值时,将多次的写入处理历史和哈希值一起传输。因此,能够减小信息传输的开销。
(实施例2)
接着说明实施例2。实施例2的信息***的硬件结构与实施例1的信息***(图1)相同。在以下说明中,在描述与实施例1的信息***的结构部件相同的部件时,使用实施例1中使用的参考标记。
实施例1的存储***与实施例2的存储***主要有以下的不同点。实施例1的闪存组件具有判断是否能够重复去除的程序(重复去除判断部12300),通过执行重复去除判断部12300,基于从存储控制器200发送来的信息(列表1、列表2)进行是否可重复去除的判断等。而在实施例2的存储***中,存储控制器200具有与实施例1中说明的重复去除判断部12300进行相同的处理的程序(在实施例2中,称其为“重复去除判断部12300’”)。存储控制器200通过执行重复去除判断部12300’来进行是否可重复去除的判断等。反过来,实施例2的闪存组件不具有重复去除判断部12300。
接着说明实施例1的存储***所具有的管理信息与实施例2的存储***所具有的管理信息的不同。实施例2的闪存组件230不同于实施例1的闪存组件,不具有哈希索引信息3500。取而代之,在实施例2的存储***中,由存储控制器200管理哈希索引信息3500,哈希索引信息3500被存储在共享存储器220上。因此,实施例2的闪存组件230没有必要必须在闪存卷上设置隐藏区域。
在实施例2中,存储控制器200所具有的哈希索引信息3500的格式与实施例1中说明的相同。不过,在实施例2的哈希索引信息3500中,在指向叶子段3501的指针即叶子地址3507中,使用的是存储了叶子段3501的共享存储器220上的地址,这一点与实施例1的哈希索引信息不同(实施例1的哈希索引信息中,叶子地址使用的是虚拟段地址)。
实施例2的闪存组件230可以不具有闪存组件组信息2300和哈希值存储信息2400。另一方面,实施例2的存储控制器200与实施例1同样地具有闪存组件组信息2300,但没有必要具有哈希值存储信息2400。
在实施例2的存储***中,由存储控制器200进行哈希索引信息3500的参考/更新。在实施例1的存储***中,由于各闪存组件230具有哈希索引信息3500,所以在存储***内,存在与闪存组件230相同数量的哈希索引信息3500。而在实施例2的存储***中,仅由存储控制器200具有1个哈希索引信息3500即可。另外,在实施例2中,说明哈希索引信息3500存储在共享存储器220中的例子,但也可以代替共享存储器220,将哈希索引信息3500存储在缓存210中。或者,实施例2的存储***也可以构成为,将哈希索引信息3500存储在闪存组件230或HDD等存储设备所具有的存储区域中。
接着说明实施例2的由存储控制器200执行的处理。另外,如上文所述,实施例2的闪存组件与实施例1的闪存组件的不同点仅在于,不具有重复去除判断部12300,不执行重复去除判断部12300。因此,省略实施例2的由闪存组件执行的处理的说明。
实施例2的存储控制器200在其内存270内至少包括读取处理执行部4000、写入请求受理部4100、后写入处理执行部4200、重复去除计划部4300’、重复去除判断部12300’这些程序(省略图示)。读取处理执行部4000、写入请求受理部4100、后写入处理执行部4200均是与实施例1中说明的程序相同的程序。即,从主机110接收到写入请求或读取请求时,实施例2的存储***100中进行的处理与实施例1中说明的处理相同。
重复去除计划部4300’是与实施例1中说明的重复去除计划部4300类似的程序,但存在些许不同点。以下主要说明该不同点。使用图38所示重复去除计划部4300’进行的处理的流程。
步骤12000和步骤12001是与实施例1中说明的处理(图26的步骤12000~步骤12001)相同的处理。因此省略此处的说明。步骤12001结束后,重复去除计划部4300’接着执行步骤12003’。
步骤12003’:该步骤是代替实施例1中说明的步骤12003的处理。在步骤12003’中,重复去除计划部4300’使用步骤12001中生成的列表1、列表2进行可否重复去除的判断。此时,重复去除计划部4300’通过调用重复去除判断部12300’来进行可否重复去除的判断。重复去除判断部12300’通过进行与实施例1中说明的重复去除判断部12300相同的处理,来进行旧数据(更新前数据)可否擦除的判断和更新数据可否重复去除的判断,并输出擦除候选和重复候选(与实施例1中说明的相同)。
在步骤12003’之后,重复去除计划部4300’执行步骤12004~步骤12007。步骤12004~步骤12007是与实施例1中说明的步骤12004~步骤12007相同的处理,故省略此处的说明。
接着说明重复去除判断部12300’的处理的流程。实施例1中说明的重复去除判断部12300与实施例2中的重复去除判断部12300’的主要不同之处为,重复去除判断部12300’在存储控制器200的处理器260上执行。重复去除判断部12300’的处理的流程与实施例1中说明的重复去除判断部12300的处理的流程相同,故此处省略流程图的图示,参考实施例1中使用的图37进行说明。另外,在以下说明中,主要说明重复去除判断部12300’的处理中的与实施例1中说明的重复去除判断部12300的处理不同的点。
重复去除判断部12300’因被重复去除计划部4300’调用而开始处理。此时,重复去除判断部12300’从重复去除计划部4300’接收列表1和列表2。在实施例1中,重复去除计划部4300(基于哈希值)分割列表1和列表2,将分割后的列表1和列表2发送给闪存组件230的重复去除判断部12300。实施例2的重复去除计划部4300不进行列表1和列表2的分割。因此,此时重复去除判断部12300’从重复去除计划部4300’接收未分割的列表1和列表2。
重复去除判断部12300’在接收列表1和列表2之后进行的处理,尤其是图37的步骤17000和步骤17001与实施例1中说明的处理几乎相同。其中,步骤17000和17001中可能会进行哈希索引信息3500的更新,不过,在实施例2中由于哈希索引信息3500存储在共享存储器220上,所以不需要像实施例1的重复去除判断部12300那样,从虚拟段(所分配到的实际段)将叶子段3501的内容读取到缓冲器中,并将在缓冲器上更新后的内容写入到虚拟段上等处理,这一点与实施例1中说明的不同。
执行步骤17000和步骤17001的结果是,生成了擦除候选和重复候选。实施例1的重复去除判断部12300在步骤17001结束后,将擦除候选和重复候选(从闪存组件230)返回给存储控制器200,但实施例2的重复去除判断部12300’将生成的擦除候选和重复候选发送给调用该重复去除判断部12300’的程序(重复去除计划部4300’)。之后重复去除判断部12300’结束处理。
实施例2的存储***通过进行以上的处理,能够与实施例1的存储***同样地进行重复去除处理。
(实施例3)
图39表示实施例3的信息***的硬件结构。实施例3的信息***包括多个实际存储***(100-1、100-2……)、1个以上的主机110和将二者连接的SAN120。各实际存储***(100-1、100-2……)的硬件结构与实施例1或2中说明的存储***100相同,包括1个以上的存储控制器200、缓存210、共享存储器220、闪存组件230、以及连接这些结构要素的1个以上的连接装置250(图39中省略了这些结构要素的图示)。以下在统称各实际存储***(100-1、100-2……)时,记作“实际存储***100”。
在图39中,实际存储***100所具有的结构要素190是用于将实际存储***100连接到SAN120上的通信接口。本实施例将其称作“端口”。各实际存储***100具有1个以上的端口190。端口190用于实际存储***100在其与主机110或其它实际存储***100之间进行数据的发送接收。
实施例3的实际存储***100有时会与实际存储***100彼此进行数据和请求的发送接收,这时,实际存储***100经由端口190进行数据和请求的发送接收。此外,实施例1或实施例2的存储***也具有端口,但实施例1或实施例2省略了端口的说明。
另外,实施例3的信息***具有存储管理服务器180,存储管理服务器180经局域网(LAN)130与各实际存储***100连接。
实施例3的实际存储***100具有与实施例1的存储***100所具有的功能相同的功能。因此,与实施例1中说明的那样,实际存储***100定义1个以上的逻辑卷提供给主机110等。并且,实际存储***100将各逻辑卷的存储空间分割为多个虚拟页进行管理这一点,从闪存组件组280的区域形成实际页,并且将实际页分配给虚拟页这一点,也是与实施例1相同的。
此外,实施例3的实际存储***100除了具有实施例1的存储***100所具有的功能之外,还具有各实际存储***100彼此使用(共享)所具有的存储区域这一功能。因此,在实施例3中,将可彼此使用存储区域的实际存储***100的集合称作“虚拟存储***1000”。
虚拟存储***1000例如可以由信息***的用户(管理员)定义。当管理员决定了属于1个虚拟存储***1000的实际存储***100的组时,使用存储管理服务器180对各实际存储***100通知应当属于1个虚拟存储***1000的实际存储***100的识别编号(例如产品序号等)的组,各实际存储***100接收该信息,从而能够识别属于虚拟存储***1000的各实际存储***100。
在各实际存储***100彼此共享存储区域的结构之一例中,跨多个实际存储***100进行重复去除。以下参考在实施例1中也使用了的图18,对跨多个实际存储***100进行重复去除的结构的例子进行说明。其中,以图18中记载的闪存组件230-A装载于实际存储***100-1中,而实际存储***100-2装载的是闪存组件230-B为前提进行说明。
假定在闪存组件230-B的虚拟段#y中写入了与闪存组件230-A的虚拟段#x中写入的数据相同的数据的场景。该情况下,对闪存组件230-B的虚拟段#y暂时分配闪存组件230-B内的实际段,写入的数据被存储在所分配的实际段中。
在之后进行的重复去除处理中,闪存组件230-B将闪存组件230-A的虚拟段#x的虚拟段地址存储在虚拟段#y的新虚拟段指针(3205)中,从而使得虚拟段#y参考虚拟段#x。于是,这之前分配给虚拟段#y的实际段不再被分配给虚拟段#y(不过,如实施例1中说明的那样,在虚拟存储***1000内存在参考虚拟段#y的其它虚拟段的情况下,将实际段的地址备份到虚拟段#y的防擦除地址3208(或旧虚拟段指针3210)中,维持实际段被分配给虚拟段#y的状态)。
之后,当主机110发出读取对象范围包括虚拟段#y的读取请求时,从具有虚拟段#x的闪存组件230-A读取数据,回送到主机110。该处理将在后文叙述。像这样,实施例3的虚拟存储***1000跨多个实际存储***100进行重复去除,所以与实施例1或2的存储***相比,能够有望提高数据量削减的效果。
另外,作为各实际存储***100彼此共享存储区域的其它例子,可采用各实际存储***100共享实际页的结构。例如,实际存储***100-1可以具有这样的功能,即,将实际存储***100-2所具有的实际页分配给实际存储***100-1所定义的逻辑卷的虚拟页,在从主机110接收到对实际存储***100-1所定义的逻辑卷的虚拟页的写入数据时,将该写入数据存储到实际存储***100-2所具有的实际页中。不过,因为该功能与重复去除处理没有直接的关系,故本说明书省略该功能的说明。在以下说明中也以实际存储***100不具有该功能为前提进行说明。
接着说明实施例3的实际存储***100所具有的管理信息。首先,实际存储***100在共享存储器220上至少保存实施例1中说明过的管理信息(图5所示的管理信息)。除此之外,实际存储***100还在共享存储器220上保存关于虚拟存储***1000内的各实际存储***100的信息(后述的存储***信息2700)。
使用图40说明存储***信息2700的内容。存储***信息2700是虚拟存储***1000内的各实际存储***100所具有的闪存组件230的信息和各实际存储***100所具有的端口的信息的集合。
其中,将虚拟存储***1000内的某1台实际存储***100所具有的闪存组件230的信息与端口的信息的组称作“实际存储***信息2710”。存储***信息2700中包括虚拟存储***1000内的所有实际存储***100的实际存储***信息2710。
一边参考图40一边说明实际存储***信息2710的内容。实际存储***信息2710包括实际存储***ID2711、端口地址2712、闪存组件ID2713。
实际存储***ID2711是实际存储***100的识别编号(例如产品序号等)。端口地址2712是实际存储***100所具有的端口的识别符,例如是N_Port ID或WWN(World WideName,全局名称)等。实施例3的实际存储***100有时会经由SAN120对其它实际存储***100发出数据发送接收请求(后述的外部组件读取请求等请求)。此时,发出指定了作为请求发送对象的实际存储***100所具有的端口的访问请求。端口地址2712用于该用途。另外,在实际存储***100具有多个端口的情况下,可以在实际存储***信息2710内存储多个端口地址2712。
闪存组件ID2713是实际存储***100所具有的闪存组件230的组件ID。通常,实际存储***100上装载有多个闪存组件230。实际存储***信息2710内存储了实际存储***100所具有的全部闪存组件230的组件ID。另外,在实施例3的虚拟存储***1000中,各闪存组件230的组件ID使用在虚拟存储***1000内唯一的识别符。
存储***信息2700是虚拟存储***1000内的全部实际存储***100所具有的信息。并且,虚拟存储***1000内的各实际存储***100所具有的存储***信息2700的内容是相同的。
接着说明实施例3的实际存储***100所具有的哈希值存储信息2400。不过,哈希值存储信息2400的格式与实施例1中说明的相同(图11),故省略此处的图示。
在实施例3的虚拟存储***1000中,与实施例1同样地,由各闪存组件230进行可否重复去除的判断,哈希值存储在闪存组件230中(如实施例1中说明的那样,哈希值存储在哈希索引信息3500内的叶子段3501中)。并且,与实施例1相同地,各闪存组件230承担的哈希值的范围按各闪存组件230不同。在实施例3的虚拟存储***1000所具有的哈希值存储信息2400中,与实施例1中说明的哈希值存储信息2400同样地,存储有关于各闪存组件230承担的哈希值的范围的信息。与实施例1同样地,在实施例3的虚拟存储***1000中,哈希值存储信息2400也存储在各实际存储***100的共享存储器220和各闪存组件230的组件存储器320内。
实施例3的哈希值存储信息2400的格式与实施例1中说明的相同,包括多个哈希范围2401与闪存组件ID2402的组。实施例3的实际存储***100所具有的哈希值存储信息2400与实施例1的存储***100所具有的哈希值存储信息2400的不同点在于,在实施例1的存储***100所具有的哈希值存储信息2400中,仅包含存储***100内的各闪存组件承担的哈希值的信息,而在实施例3的实际存储***100所具有的哈希值存储信息2400中,包含虚拟存储***1000内的各实际存储***100所具有的全部闪存组件230承担的哈希值的信息。
接着说明闪存组件230所具有的管理信息。实施例3的闪存组件230所具有的管理信息的种类与实施例1的闪存组件230所具有的管理信息(图12)相同。并且,就各管理信息的格式而言,实施例1与实施例3也没有不同。
不过,实施例1的闪存组件230所具有的管理信息与实施例3的闪存组件230所具有的管理信息存在以下不同。实施例1的闪存组件230保存存储***100内的全部闪存组件组280的闪存组件组信息2300,而实施例3的闪存组件230保存虚拟存储***1000内的各实际存储***100所管理的全部闪存组件组280的闪存组件组信息2300。
接着,对实施例3的虚拟存储***1000中的存储控制器200和闪存组件230执行的处理进行说明。首先,说明存储控制器200中进行的处理。
实施例3的存储控制器200所执行的程序包括读取处理执行部4000’、写入请求受理部4100、后写入处理执行部4200、重复去除计划部4300”、外部组件读取执行部4400(省略图示)。写入请求受理部4100和后写入处理执行部4200均与实施例1中说明的相同,故省略此处的说明。
读取处理执行部4000’与实施例1中说明的读取处理执行部4000同样地,是在从主机110接收到读取请求时执行的程序。重复去除计划部4300”是进行与实施例1中说明的重复去除计划部4300相同的处理的程序。
外部组件读取执行部4400是实际存储***100从其它实际存储***接收到请求(外部组件读取请求)时执行的程序。以下针对读取处理执行部4000’、重复去除计划部4300”和外部组件读取执行部4400所执行的处理的流程进行说明。
首先,一边参考图41一边说明实施例3的读取处理执行部4000’的处理流程。在实施例3的虚拟存储***1000中,从主机110接收到读取请求的实际存储***100有时会向虚拟存储***1000内的其它实际存储***100发出请求(外部组件读取请求)。在以下说明中,将从主机110接收到读取请求的实际存储***100称作“实际存储***A”,将实际存储***A发出的外部组件读取请求的发送目标的实际存储***100称作“实际存储***B”。
图41中记载的各步骤是由从主机110接收到读取请求的实际存储***100(即实际存储***A)的读取处理执行部4000’执行的处理。因此,在以下说明中,以读取处理执行部4000’为主语说明的部分意味着其是由实际存储***A执行的处理。
读取处理执行部4000’代替实施例1中的读取处理执行部4000进行的步骤5009执行步骤50091~50093。这之外的处理(步骤5000~步骤5007、步骤5008、步骤5010、步骤5011)与实施例1中说明的处理相同。以下主要针对步骤50091~50093进行说明。
在步骤5006中,在从实际存储***A所具有的闪存组件230向实际存储***A的存储控制器200返回了表示数据已被进行了重复去除的响应的情况下(步骤5007:是),读取处理执行部4000’执行步骤50091。如实施例1中说明的那样,在表示数据已被进行了重复去除的响应中,包含虚拟段地址和哈希值的组。
在步骤50091中,读取处理执行部4000’通过参考存储***信息2700,判断表示数据已被进行了重复去除的响应中所含的虚拟段地址是实际存储***A所具有的闪存组件230的虚拟段地址,还是其它实际存储***100所具有的闪存组件230的虚拟段地址。由于虚拟段地址中包含闪存组件230的组件ID,所以读取处理执行部4000’通过判断响应中所含的虚拟段地址内的组件ID包含在存储***信息2700的哪个实际存储***信息2710中,就能够判断该虚拟段地址是哪个实际存储***100所具有的闪存组件230的虚拟段地址。
在响应中所含的虚拟段地址是实际存储***A所具有的闪存组件230的虚拟段地址的情况下(步骤50091:否),读取处理执行部4000’对实际存储***A所具有的闪存组件230发出哈希指定型读取请求(步骤50092)。步骤50092是与实施例1中说明的步骤5009相同的处理。之后,读取处理执行部4000’执行步骤5010、步骤5008、步骤5011,并结束处理。
在响应中所含的虚拟段地址是实际存储***A以外的实际存储***100(例如实际存储***B)所具有的闪存组件230的虚拟段地址的情况下(步骤50091:是),读取处理执行部4000’对实际存储***B请求取得闪存组件230内的数据(步骤50093)。将此处发出的请求称作“外部组件读取请求”。
在步骤50093中,读取处理执行部4000’经由SAN120对实际存储***B发出外部组件读取请求。外部组件读取请求中所含的信息是虚拟段地址、哈希值以及实际存储***100(实际存储***B)的端口地址。
对步骤50093中进行的处理进行详述。在以下说明中,说明表示数据已被进行了重复去除的响应中所含的组件ID(包含在虚拟段地址内)为“p”的情况下的例子。读取处理执行部4000’从存储***信息2700内的实际存储***信息2710中,确定闪存组件ID2713为“p”的实际存储***信息2710。
接着,读取处理执行部4000’取得所确定的实际存储***信息2710中包含的端口地址2712。进而,读取处理执行部4000’使用取得的端口地址2712和表示数据已被进行了重复去除的响应中所含的虚拟段地址和哈希值,生成外部组件读取请求,经由SAN120对实际存储***B发送外部组件读取请求。接收到外部组件读取请求的实际存储***100(实际存储***B)中进行的处理的细节将在后文叙述。
之后,读取处理执行部4000’待机直至从实际存储***B返回响应(包括读取数据的响应)(步骤5010)。当返回了响应时,读取处理执行部4000’执行步骤5008和步骤5011,结束处理。
接着,使用图42说明接收到外部组件读取请求的实际存储***100中进行的处理的流程。接收到外部组件读取请求的实际存储***100开始执行外部组件读取执行部4400。
步骤8001:外部组件读取执行部4400检查外部组件读取请求中指定的读取对象数据是否存储在缓存210中(是否命中)。这是公知的技术。在命中的情况下(步骤8001:是),外部组件读取执行部4400将存储在缓存210中的数据回送到发出请求的实际存储***100(步骤8005),结束处理。在未命中的情况下(步骤5001:否),接着进行步骤8002。
步骤8002:该处理是与实施例1中说明的步骤5009类似的处理。外部组件读取执行部4400使用外部组件读取请求中指定的虚拟段地址和哈希值生成哈希指定型读取请求,对存储有读取对象数据的闪存组件230发送所生成的哈希指定型读取请求。在外部组件读取请求所指定的虚拟段地址中,存储有存储了读取对象数据的闪存组件230的组件ID,所以外部组件读取执行部4400能够根据它来确定请求目标的闪存组件230。
步骤8003:外部组件读取执行部4400等待数据从闪存组件230发送过来。
步骤8004:外部组件读取执行部4400在缓存210中确保用于存储读取对象数据的区域,将从闪存组件230发送来的数据存储到所确保的区域中。
步骤8005:外部组件读取执行部4400将存储在缓存210中的数据回送到发出请求的实际存储***100,结束处理。
接着说明重复去除计划部4300”的处理流程。重复去除计划部4300”是在虚拟存储***1000所含的全部实际存储***100上执行的程序。在实施例3中,在虚拟存储***1000所含的各实际存储***100上,同时开始重复去除计划部4300”的执行。例如,可以由存储管理服务器180定期对虚拟存储***1000内的全部实际存储***100发送指示开始执行重复去除计划部4300”的命令,各实际存储***100根据来自存储管理服务器180的指示,开始重复去除计划部4300”的执行。或者,也可以由特定的1个实际存储***100定期对虚拟存储***1000内的全部实际存储***100发送指示开始执行重复去除计划部4300”的命令。
图43表示在虚拟存储***1000内的特定的1台实际存储***100(以下将其暂称“实际存储***A”)上执行的重复去除计划部4300”的处理流程。步骤12000~步骤12002与实施例1中说明的重复去除计划部4300的处理(图26)相同,故省略说明。
步骤12021:实际存储***A的重复去除计划部4300”将步骤12001~12002中生成并分割后的列表1、列表2中的应当发送给其它实际存储***100的列表发送给其它实际存储***100。在以下说明中,与实施例1相同地,将列表1内的记录中的经步骤12002判断为应当发送给闪存组件#f的记录的集合记作“列表1-f”,同样地,将列表2内的记录中的经步骤12002判断为应当发送给闪存组件#f的记录的集合记作“列表2-f”。
在图43的说明中,说明实际存储***A的重复去除计划部4300”在步骤12021中对闪存组件#f所具有的实际存储***100发送列表1-f和列表2-f的情况下的例子。实际存储***A的重复去除计划部4300”通过参考存储***信息2700,确定闪存组件#f所具有的实际存储***100的端口地址2712,并对所确定的实际存储***100的端口地址2712发送列表1-f和列表2-f。列表1-f和列表2-f经由SAN120发送。不过,作为其它的实施方式,也可以经由LAN130发送列表1-f和列表2-f。
另外,在步骤12002中,实际存储***A的重复去除计划部4300”生成分割后的列表1和列表2,其结果,有可能不存在应当发送给某个实际存储***100(以下将其暂称为“实际存储***C”)的列表1的记录(或列表2的记录)。在这样的情况下,实际存储***A的重复去除计划部4300”在步骤12021中生成1个虚拟段地址3402和(更新前)哈希值3403存储了无效值(NULL)的记录,将该生成的记录发送给实际存储***C。
在不存在应当发送给实际存储***C的列表1的记录(或列表2的记录)时,如果实际存储***A什么都不对实际存储***C发送,则实际存储***C无法判断是不存在应当从实际存储***A发送给实际存储***C的列表1的记录(或列表2的记录),还是因为故障等原因导致从实际存储***A发送的记录没有到达实际存储***C。因此,在不存在应当发送给实际存储***C的列表1的记录(或列表2的记录)的情况下,实际存储***A生成存储了无效值(NULL)的记录发送给实际存储***C。
步骤12022:实际存储***A的重复去除计划部4300”待机直至从虚拟存储***1000内的全部实际存储***100(除了实际存储***A之外)发送来分割后的列表1和列表2。实际存储***A的重复去除计划部4300”在从虚拟存储***1000内的全部实际存储***100接收到分割后的列表1和列表2后,执行步骤12003~12005。步骤12003~12005与实施例1中说明的处理相同,故省略此处的说明。不过,在实施例3中,实际存储***A的重复去除计划部4300”在步骤12003中对各闪存组件230发送分割后的列表1和列表2时,除了实际存储***A生成的列表1和列表2(步骤12001、12002中生成/分割的列表1、列表2)之外,还对闪存组件230发送在步骤12022中从其它实际存储***100接收到的列表1和列表2。
此外,在以下说明中,与实施例1相同地将从各闪存组件230接收的擦除候选中包含的记录中的应当在步骤12003中发送给闪存组件#f的记录的集合称作“擦除候选-f”。同样地,将重复候选内的记录中的应当发送给闪存组件#f的记录的集合称作“重复候选-f”。
步骤12051:实际存储***A的重复去除计划部4300”将经步骤12004~12005分类的擦除候选和重复候选中的应当发送给其它实际存储***100的各候选发送给其它实际存储***100。与步骤12021同样地,实际存储***A的重复去除计划部4300”通过参考存储***信息2700,确定闪存组件#f所具有的实际存储***100的端口地址2712,并对所确定的实际存储***100发送擦除候选-f和重复候选-f。
存在这样的情况,即,不存在应当发送给某实际存储***100(暂称“实际存储***C”)的擦除候选的记录(或重复候选的记录)。该情况下,与步骤12021中说明的方法相同地,重复去除计划部4300”例如生成1个虚拟段地址3601(或虚拟段地址3701)存储了无效值(NULL)的记录,将该存储了无效值的记录发送给实际存储***C。
步骤12052:实际存储***A的重复去除计划部4300”从虚拟存储***1000内的其它实际存储***100接收经分类的擦除候选和重复候选。之后,实际存储***A的重复去除计划部4300”执行步骤12006~12007。步骤12006~12007与实施例1中说明的处理几乎相同。不过,在实施例3中,实际存储***A的重复去除计划部4300”在步骤12006中除了对闪存组件230发送实际存储***A生成的擦除候选和重复候选之外,还对闪存组件230发送从其它实际存储***100接收到的擦除候选和重复候选。这之外的点与实施例1中说明的处理相同。
另外,实施例3的闪存组件230中执行的处理与实施例1中说明的相同,故省略闪存组件230中执行的处理的说明。
以上是实施例3的虚拟存储***1000中执行的处理的说明。实施例3的虚拟存储***1000通过进行如上所述的处理,能够跨多个实际存储***100进行重复去除。
(实施例4)
接着说明实施例4。实施例4的信息***的硬件结构与实施例3的信息***相同,故省略图示。在以下说明中,在描述与实施例3的信息***的结构部件相同的部件时,使用实施例3中使用的参考标记。
实施例4的虚拟存储***与实施例3的虚拟存储***同样地,跨多个实际存储***100进行重复去除。不过,在实施例4的虚拟存储***(或实际存储***)中,实施例3(或实施例1)的闪存组件进行的处理的一部分由存储控制器200进行。
实施例1或3的闪存组件具有判断是否可实施重复去除处理的程序(重复去除判断部12300),基于从存储控制器200发送来的信息(列表1、列表2)进行是否可实施重复去除处理的判断等。另一方面,实施例4的虚拟存储***与实施例2中说明的存储***同样地,由存储控制器200进行是否可实施重复去除处理的判断。因此,存储控制器200具有与实施例2中说明的重复去除判断部12300’类似的程序(在实施例4中,将其称作“重复去除判断部12300””)。反过来,实施例4的闪存组件不具有重复去除判断部12300。
实施例4的闪存组件230与实施例2的闪存组件230同样地,不具有哈希索引信息3500。取而代之,在实施例4的虚拟存储***中,虚拟存储***内的各实际存储***100在其共享存储器220内具有哈希索引信息3500。
实施例4的闪存组件230可以不具有闪存组件组信息2300和哈希值存储信息2400。实施例4的实际存储***100在共享存储器220内具有闪存组件组信息2300。不过,实际存储***100也保存虚拟存储***1000内的其它实际存储***100所具有的闪存组件组280的闪存组件组信息2300。
另外,在实施例4的实际存储***100中,代替实施例1等中叙述的哈希值存储信息2400具有哈希值存储信息2400’。关于哈希值存储信息2400’的格式使用图44进行说明。实施例1等中说明的哈希值存储信息2400存储有关于各闪存组件230承担的哈希值的范围的信息。而哈希值存储信息2400’中,存储有关于各实际存储***100承担的哈希值的范围的信息。
其中,“实际存储***100承担的哈希值”的意思(定义)与“闪存组件承担的哈希值”相同。例如,在实际存储***#p(识别编号为p的实际存储***100)针对哈希值的范围为a~b的虚拟段进行可否重复去除的判断的情况下,表述为“实际存储***#p承担的哈希值的范围为a~b”。
哈希值存储信息2400’具有多个哈希范围2401’与实际存储***ID2402’的组。此处,将哈希范围2401’与实际存储***ID2402’的组称作区2410’。例如,在某个区2410’内的哈希范围2401’中存储的哈希值范围为a~b,并且该区2410’内的实际存储***ID2402’为p的情况下,意味着实际存储***#p承担的哈希值的范围为a~b,意味着在进行后述的可否重复去除的判断时,实际存储***#p针对哈希值的范围为a~b的虚拟段进行可否重复去除的判断。并且,在该情况下,实际存储***#p所生成/管理的哈希索引信息3500中存储的哈希值的范围为a~b。
哈希值存储信息2400’是存储在虚拟存储***1000内的全部实际存储***100的共享存储器220中的信息。并且,各实际存储***100所具有的哈希值存储信息2400’的内容是相同的。
接着说明实施例4的由存储控制器200执行的处理。其中,实施例4的闪存组件与实施例2的闪存组件相同。即,实施例4的闪存组件与实施例1或3的闪存组件的不同点仅在于,不具有重复去除判断部12300,不执行重复去除判断部12300。因此,省略实施例4的由闪存组件执行的处理的说明。
实施例4的存储控制器200在其内存270内至少包括读取处理执行部4000’、写入请求受理部4100、后写入处理执行部4200、重复去除计划部4300”’、外部组件读取执行部4400、重复去除判断部12300’这些程序(省略图示)。
读取处理执行部4000’和外部组件读取执行部4400均与实施例3中说明的相同。而写入请求受理部4100、后写入处理执行部4200与实施例1等中说明的相同。重复去除判断部12300’与实施例2中说明的相同。因此这些省略关于它们的说明。
使用图45说明重复去除计划部4300”’的处理的流程。步骤12000和步骤12001是与图26的步骤12000~步骤12001相同的处理,故省略此处的说明。
步骤12002’:重复去除计划部4300”’通过参考哈希值存储信息2400’,将列表1和列表2内的信息分割成应当对各实际存储***100发送的信息。以下说明使用了哈希值存储信息2400’的信息的分割方法之一例。例如,假定哈希值存储信息2400’中存在实际存储***ID2402’为“f”且哈希范围2401’为a~b的区2410’的情况。该情况下,在列表1的记录中提取(更新前)哈希值3403包含在a~b的范围内的记录,将提取出的记录决定为应当发送给实际存储***#f的信息。列表2内的各记录也采用同样的方法分割。在以下说明中,将列表1内的记录中的经步骤12002’判断为应当发送给实际存储***#f的记录的集合记作“列表1-f”。同样地,将列表2内的记录中的判断为应当发送给实际存储***#f的记录的集合记作“列表2-f”。
步骤12021’:重复去除计划部4300”’将步骤12002’中分割后的列表1、列表2中的应当发送给其它实际存储***100的列表发送给其它实际存储***100。该处理与实施例3中说明的处理(步骤12021)相同。另外,与实施例3同样地,在不存在应当发送给其它实际存储***100的分割后的列表1(或列表2)的情况下,重复去除计划部4300”’生成存储了无效值(NULL)的记录发送给其它实际存储***100。
步骤12022’:重复去除计划部4300”’从其它实际存储***100接收分割后的列表1和列表2。当从虚拟存储***内的全部实际存储***100接收了分割后的列表1和列表2后,重复去除计划部4300”’接着执行步骤12003”。
步骤12003”:该步骤进行的处理是与实施例2中说明的步骤12003’相同的处理。在步骤12003”中,重复去除计划部4300”’使用自身生成的列表1、列表2和从其它实际存储***100接收到的列表1、列表2进行可否重复去除的判断。此时,重复去除计划部4300”’通过调用重复去除判断部12300’来进行可否重复去除的判断。重复去除判断部12300’进行的处理的内容与实施例2中说明的相同,故省略此处的说明。
步骤12004~步骤12005与实施例1中说明的处理(图26的步骤12004~12005)相同,故省略说明。
步骤12051、步骤12052:该处理与实施例3中说明的步骤12051和步骤12052相同,故此处省略说明。
在步骤12052之后,重复去除计划部4300”’执行步骤12006、步骤12007,并结束处理。步骤12006、步骤12007与实施例1等说明的相同,故省略说明。以上是重复去除计划部4300”’的处理的流程。
以上说明本发明的实施例,但它们是用于说明本发明的示例,不表示本发明的范围仅限于这些实施例。即,本发明能够以其它各种方式实施。例如,在上面说明的诸实施例中,说明了闪存组件具有进行重复去除处理等功能的例子,但也可以代替闪存组件在存储***中装载HDD,由HDD进行上述实施例中闪存组件实施的各处理。
另外,在上面说明的诸实施例中,说明了一个闪存组件承担的哈希值仅存储在该闪存组件内(哈希索引信息)的例子。不过,作为其它的实施方式,为了提高可用性,也可以将一个闪存组件上生成的哈希索引信息的拷贝还存储在其它的闪存组件中。例如可以采用这样的方式,即,闪存组件A在每次更新自身所管理的哈希索引信息时,将该更新信息发送给闪存组件B,在闪存组件B中存储闪存组件A所管理的哈希索引信息的拷贝。
另外,上面说明的实施例中,以全部数据为重复去除对象为前提进行了说明。不过,对于RAID的冗余数据这样的能够重复去除的概率较低的数据,因为优选不进行重复去除的判断,所以可以将上面说明的实施例的处理按这样的方式变形。例如,在存储控制器200将冗余数据写入闪存组件230时,在写入请求中附加表示不需要重复去除的信息(以下将其简称作“标志”)。闪存组件230在虚拟块组信息3200中按每个虚拟段准备用于存储表示接收到标志的信息的区域。若闪存组件230在接收写入请求时接收到标志,则将标志记录到虚拟块组信息3200内的虚拟段管理信息中,并在执行步骤14001时可以不计算数据的哈希值。并且,重复去除判断部12300、重复去除执行部12400对于存储有标志的虚拟段可以不进行重复去除的判断等。
附图标记说明
100:存储***
110:主机
120:存储区域网(SAN)
200:存储控制器
210:缓存
220:共享存储器
230:闪存组件
250:连接装置
260:处理器
270:内存
280:闪存组件组
300:闪存芯片
310:组件处理器
320:组件存储器
330:缓冲器
340:组件总线
350:组件总线传输装置
370:哈希电路
2000:逻辑卷信息
2100:实际页信息
2300:闪存组件组信息
2400:哈希值存储信息
2500:闪存组件信息
3000:组件信息
3100:芯片信息
3200:虚拟块组信息
3300:实际块信息
3400:历史信息
3500:哈希索引信息
3600:空闲实际块信息指针
4000:读取处理执行部
4100:写入请求受理部
4200:后写入处理执行部
4300:重复去除计划部
12100:数据写入处理执行部
12200:历史信息发送部
12300:重复去除判断部
12400:重复去除执行部
12500:哈希指定型读取执行部
12600:数据读取处理执行部。
Claims (14)
1.一种存储***,包括多个具有多个非易失性存储介质的闪存组件,和在主机与所述闪存组件之间执行读写处理的存储控制器,其特征在于:
所述存储***构成为,当在多个所述闪存组件中的第1闪存组件的第1地址上写入与在多个所述闪存组件中的第2闪存组件的第2地址上写入的数据相同的数据时,将所述第2地址与所述第1地址关联地存储到所述第1闪存组件中,
所述第1闪存组件在与所述第1地址关联地存储了所述第2地址的情况下,根据从所述存储控制器接收到的对所述第1地址的读取请求,向所述存储控制器回送所述第2地址,
所述存储控制器在从所述第1闪存组件接收到所述第2地址时,对所述第2闪存组件发出读取请求,从所述第2闪存组件接收读取对象数据。
2.如权利要求1所述的存储***,其特征在于:
所述存储控制器从多个所述闪存组件接收由所述闪存组件受理过的写入请求的历史信息,
所述存储***基于所述历史信息,检测在多个所述闪存组件的多个区域上写入了相同的数据的情况。
3.如权利要求2所述的存储***,其特征在于:
所述历史信息包括从所述存储控制器发出过写入请求的所述闪存组件的地址,和所述写入请求中指定的写入数据的特征量,
所述存储***在所述第1闪存组件中生成的所述历史信息中包含的所述特征量与存储在所述第2闪存组件中的数据的特征量相同的情况下,判断为在所述第2闪存组件中写入了与所述第1闪存组件相同的数据。
4.如权利要求3所述的存储***,其特征在于:
所述闪存组件在从所述存储控制器接收到所述写入数据的写入请求时,
计算所述写入数据的特征量,
并生成所述历史信息,其中所述历史信息包括包含在所述写入请求中的所述闪存组件的地址、所述写入数据的特征量和所述写入数据的更新前数据的特征量。
5.如权利要求4所述的存储***,其特征在于:
所述存储***判断具有与所述历史信息中包含的所述更新前数据的特征量相同的特征量的数据存储在多个所述闪存组件中的哪一个中,
在多个所述闪存组件中没有存储具有与所述更新前数据的特征量相同的特征量的数据的情况下,对生成所述历史信息的所述闪存组件发送表示可删除所述更新前数据的信息。
6.如权利要求3所述的存储***,其特征在于:
多个所述闪存组件分别构成为,对预定范围的值的所述特征量和存储有具有所述特征量的数据的所述闪存组件的地址的信息进行管理,
所述闪存组件,在所述闪存组件接收到所述写入请求和所述写入数据时,
计算接收到的所述写入数据的特征量,
生成包含所述写入数据的写入目标地址和所述特征量的所述历史信息并将其发送到所述存储控制器,
接收到所述历史信息的所述存储控制器,从多个所述闪存组件中确定对所述历史信息中包含的特征量进行管理的所述闪存组件,将所述历史信息发送到确定出的所述闪存组件,
接收到所述历史信息的所述闪存组件,判断具有与所述历史信息中包含的所述写入数据的特征量相同的特征量的数据存储在所述闪存组件中的哪一个中,
在判断为所述第2闪存组件在所述第2地址上存储有具有与所述写入数据的特征量相同的特征量的数据的情况下,通过所述存储控制器对所述第1闪存组件发送所述第2地址,
所述第1闪存组件将所述第2地址与所述第1地址关联地存储。
7.如权利要求6所述的存储***,其特征在于:
所述第1闪存组件和所述第2闪存组件属于同一RAID组,
接收到所述历史信息的所述闪存组件,在写入了所述写入数据的所述第1闪存组件的地址与存储有具有与所述写入数据的特征量相同的特征量的数据的所述第2闪存组件的地址相同时,
不对所述第1闪存组件发送所述第2闪存组件内的存储有相同的数据的地址。
8.如权利要求3所述的存储***,其特征在于:
所述存储***包括多个实际存储***,所述实际存储***包括所述存储控制器和与所述存储控制器连接的多个所述闪存组件,
所述第1闪存组件与多个所述实际存储***内的第1存储控制器连接,所述第2闪存组件与多个所述实际存储***内的第2存储控制器连接,
所述第1闪存组件在与所述第1地址关联地存储了所述第2地址的情况下,根据从所述第1存储控制器接收到的对所述第1地址的读取请求,向所述第1存储控制器回送所述第2地址,
所述第1存储控制器在从所述第1闪存组件接收到所述第2地址时,对所述第2存储控制器发出从所述第2闪存组件读取数据的请求,
所述第2存储控制器在从所述第2闪存组件读取了读取对象数据后,将其回送到所述第1存储控制器。
9.如权利要求8所述的存储***,其特征在于:
多个所述存储控制器分别构成为,对预定范围的值的所述特征量和存储有具有所述特征量的数据的所述闪存组件的地址的信息进行管理,
所述第1闪存组件在接收到所述写入请求和所述写入数据时,
计算接收到的所述写入数据的特征量,
生成包含所述写入数据的写入目标地址和所述特征量的所述历史信息并将其发送到所述第1存储控制器,
所述第1存储控制器在对所述历史信息中包含的特征量进行管理的所述存储控制器是所述第2存储控制器的情况下,对所述第2存储控制器发送所述历史信息,
接收到所述历史信息的所述第2存储控制器,判断具有与所述历史信息中包含的所述写入数据的特征量相同的特征量的数据存储在多个所述闪存组件中的哪一个中。
10.如权利要求8所述的存储***,其特征在于:
多个所述闪存组件分别构成为,对预定范围的值的所述特征量和存储有具有所述特征量的数据的所述闪存组件的地址的信息进行管理,
所述第1闪存组件在接收到所述写入请求和所述写入数据时,
计算接收到的所述写入数据的特征量,
生成包含所述写入数据的写入目标地址和所述特征量的所述历史信息并将其发送到所述第1存储控制器,
所述第1存储控制器,在对所述历史信息中包含的特征量进行管理的所述闪存组件与所述第2存储控制器连接的情况下,对所述第2存储控制器发送所述历史信息,
接收到所述历史信息的所述第2存储控制器将所述历史信息发送到对所述历史信息中包含的特征量进行管理的所述闪存组件。
11.一种闪存组件,与对来自主机的数据访问请求进行处理的存储控制器连接,其特征在于:
所述闪存组件构成为,对预定范围的值的特征量和存储有具有所述特征量的数据的所述闪存组件的地址的信息进行管理,
所述闪存组件在从所述存储控制器接收到写入请求和写入数据时,
计算接收到的所述写入数据的特征量,
生成包含所述写入数据的写入目标地址和所述特征量的历史信息并将其发送到所述存储控制器,
所述闪存组件在从所述存储控制器接收到具有包含在由所述闪存组件管理的范围内的所述特征量的所述历史信息时,
基于所述历史信息,判断与所述存储控制器连接的多个所述闪存组件之中是否存在具有与写入到第1闪存组件的写入数据相同的数据的所述闪存组件,
在判断为多个所述闪存组件中的第2闪存组件具有与所述写入数据相同的数据的情况下,通过所述存储控制器对所述第1闪存组件发送所述第2闪存组件内的存储有相同数据的地址。
12.如权利要求11所述的闪存组件,其特征在于:
所述闪存组件对所述存储控制器提供卷,
在从所述存储控制器接收到具有与已写入在所述卷上的地址上的数据相同的数据的所述闪存组件内的地址之后,接收到对所述卷上的地址的读取请求时,
将具有与已写入在所述卷上的地址上的数据相同的数据的所述闪存组件内的地址回送到所述存储控制器。
13.如权利要求11所述的闪存组件,其特征在于:
所述闪存组件在从所述存储控制器接收到所述历史信息时,
在所述历史信息中包含的所述特征量与存储在所述第2闪存组件中的数据的特征量相同的情况下,判断为所述第2闪存组件具有与所述写入数据相同的数据。
14.如权利要求11所述的闪存组件,其特征在于:
所述闪存组件在从所述存储控制器接收到所述写入请求和所述写入数据时,根据所述写入数据计算所述写入数据的特征量,
并生成所述历史信息,其中所述历史信息包括包含在所述写入请求中的所述闪存组件的地址、所述写入数据的特征量和所述写入数据的更新前数据的特征量。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/JP2015/079395 WO2017068617A1 (ja) | 2015-10-19 | 2015-10-19 | ストレージシステム |
JPPCT/JP2015/079395 | 2015-10-19 | ||
PCT/JP2016/077807 WO2017068904A1 (ja) | 2015-10-19 | 2016-09-21 | ストレージシステム |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107924291A CN107924291A (zh) | 2018-04-17 |
CN107924291B true CN107924291B (zh) | 2020-10-09 |
Family
ID=58556823
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201680050453.2A Active CN107924291B (zh) | 2015-10-19 | 2016-09-21 | 存储*** |
Country Status (4)
Country | Link |
---|---|
US (1) | US10503424B2 (zh) |
JP (1) | JP6677740B2 (zh) |
CN (1) | CN107924291B (zh) |
WO (2) | WO2017068617A1 (zh) |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2018181213A (ja) * | 2017-04-20 | 2018-11-15 | 富士通株式会社 | ストレージ制御装置、ストレージ制御方法及びストレージ制御プログラム |
CN107357687A (zh) * | 2017-07-21 | 2017-11-17 | 长沙曙通信息科技有限公司 | 一种容灾备份新型重复数据删除实现方法 |
CN109491598A (zh) * | 2018-10-19 | 2019-03-19 | 浪潮电子信息产业股份有限公司 | 一种逻辑卷的删除方法和装置 |
JP2020086477A (ja) * | 2018-11-15 | 2020-06-04 | 株式会社日立製作所 | 大規模ストレージシステム及び大規模ストレージシステムにおけるデータ配置方法 |
CN109739776B (zh) * | 2018-12-06 | 2023-06-30 | 天津津航计算技术研究所 | 用于NAND Flash主控芯片的Greedy垃圾回收*** |
CN109710541B (zh) * | 2018-12-06 | 2023-06-09 | 天津津航计算技术研究所 | 针对NAND Flash主控芯片Greedy垃圾回收的优化方法 |
KR102231722B1 (ko) * | 2019-03-28 | 2021-03-25 | 네이버클라우드 주식회사 | 취약점 중복판단방법 및 이를 이용하는 진단장치 |
US12014052B2 (en) * | 2021-03-22 | 2024-06-18 | Google Llc | Cooperative storage architecture |
CN114063931B (zh) * | 2021-11-26 | 2023-04-25 | 重庆科创职业学院 | 一种基于大数据的数据存储方法 |
US20230267003A1 (en) * | 2022-02-23 | 2023-08-24 | International Business Machines Corporation | Padding input data for artificial intelligence accelerators |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103064641A (zh) * | 2013-02-05 | 2013-04-24 | 威盛电子股份有限公司 | 非易失性存储装置及其操作方法 |
WO2013095381A1 (en) * | 2011-12-20 | 2013-06-27 | Intel Corporation | Method and system for data de-duplication |
CN103384877A (zh) * | 2011-06-07 | 2013-11-06 | 株式会社日立制作所 | 包括闪存的存储***和存储控制方法 |
CN104503705A (zh) * | 2014-12-22 | 2015-04-08 | 吴剀劼 | 利用闪存设备构建可信存储***的方法及构建的可信存储*** |
CN104598161A (zh) * | 2013-10-31 | 2015-05-06 | 腾讯科技(深圳)有限公司 | 数据读取、写入方法和装置及数据存储结构 |
Family Cites Families (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP5026213B2 (ja) * | 2007-09-28 | 2012-09-12 | 株式会社日立製作所 | ストレージ装置及びデータ重複排除方法 |
US7992037B2 (en) * | 2008-09-11 | 2011-08-02 | Nec Laboratories America, Inc. | Scalable secondary storage systems and methods |
US9256368B2 (en) * | 2010-09-30 | 2016-02-09 | Nec Corporation | System and method for deduplication of distributed data |
KR101826047B1 (ko) * | 2011-09-28 | 2018-02-07 | 삼성전자주식회사 | 저장 장치 및 그 구동 방법 |
JP6021680B2 (ja) | 2013-02-19 | 2016-11-09 | 株式会社日立製作所 | 自律分散重複排除ファイルシステム、記憶装置ユニット及びデータアクセス方法 |
US20140281155A1 (en) | 2013-03-14 | 2014-09-18 | Lsi Corporation | Storage device assisted data de-duplication |
US20150317083A1 (en) * | 2014-05-05 | 2015-11-05 | Virtium Technology, Inc. | Synergetic deduplication |
US10013169B2 (en) * | 2014-12-19 | 2018-07-03 | International Business Machines Corporation | Cooperative data deduplication in a solid state storage array |
US9626121B2 (en) * | 2014-12-19 | 2017-04-18 | International Business Machines Corporation | De-duplication as part of other routinely performed processes |
-
2015
- 2015-10-19 WO PCT/JP2015/079395 patent/WO2017068617A1/ja active Application Filing
-
2016
- 2016-09-21 CN CN201680050453.2A patent/CN107924291B/zh active Active
- 2016-09-21 WO PCT/JP2016/077807 patent/WO2017068904A1/ja active Application Filing
- 2016-09-21 JP JP2017546459A patent/JP6677740B2/ja active Active
- 2016-09-21 US US15/755,454 patent/US10503424B2/en active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103384877A (zh) * | 2011-06-07 | 2013-11-06 | 株式会社日立制作所 | 包括闪存的存储***和存储控制方法 |
WO2013095381A1 (en) * | 2011-12-20 | 2013-06-27 | Intel Corporation | Method and system for data de-duplication |
CN103064641A (zh) * | 2013-02-05 | 2013-04-24 | 威盛电子股份有限公司 | 非易失性存储装置及其操作方法 |
CN104598161A (zh) * | 2013-10-31 | 2015-05-06 | 腾讯科技(深圳)有限公司 | 数据读取、写入方法和装置及数据存储结构 |
CN104503705A (zh) * | 2014-12-22 | 2015-04-08 | 吴剀劼 | 利用闪存设备构建可信存储***的方法及构建的可信存储*** |
Also Published As
Publication number | Publication date |
---|---|
WO2017068617A1 (ja) | 2017-04-27 |
US10503424B2 (en) | 2019-12-10 |
CN107924291A (zh) | 2018-04-17 |
JPWO2017068904A1 (ja) | 2018-07-05 |
WO2017068904A1 (ja) | 2017-04-27 |
JP6677740B2 (ja) | 2020-04-08 |
US20180253252A1 (en) | 2018-09-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107924291B (zh) | 存储*** | |
US9946642B2 (en) | Distributed multimode storage management | |
US11461015B2 (en) | Available storage space in a system with varying data redundancy schemes | |
US20180173632A1 (en) | Storage device and method for controlling storage device | |
US9606914B2 (en) | Apparatus, system, and method for allocating storage | |
US10133511B2 (en) | Optimized segment cleaning technique | |
US10089033B2 (en) | Storage system | |
CN108604165B (zh) | 存储装置 | |
US20130290613A1 (en) | Storage system and storage apparatus | |
CN111007991B (zh) | 基于nvdimm分离读写请求的方法及其计算机 | |
JP2015511037A (ja) | ハイブリッドストレージ集合体の複製 | |
JP6429963B2 (ja) | ストレージ装置及びストレージ装置の制御方法 | |
US20200133836A1 (en) | Data management apparatus, data management method, and data management program | |
US9720608B2 (en) | Storage system | |
WO2016056104A1 (ja) | ストレージ装置、及び、記憶制御方法 | |
CN110895513A (zh) | 一种***垃圾回收方法和固态硬盘中的垃圾回收方法 | |
US20180253253A1 (en) | Storage apparatus | |
US20180307440A1 (en) | Storage control apparatus and storage control method | |
US20190286569A1 (en) | Logical to physical data storage mapping | |
US11079956B2 (en) | Storage system and storage control method | |
WO2018061161A1 (ja) | ストレージ装置およびその制御方法 | |
JP6817340B2 (ja) | 計算機 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |