并发IO命令的无锁处理方法与流程

文档序号:16626889发布日期:2019-01-16 06:11阅读:213来源:国知局
并发IO命令的无锁处理方法与流程
本申请涉及固态存储设备,具体涉及在存储设备中对多个io命令的并发资源访问中消除对锁的使用。
背景技术
:图1是现有技术的固态存储设备的框图,如图1所示,存储设备102同主机相耦合,用于为主机提供存储能力。主机同存储设备102之间可通过多种方式相耦合,耦合方式包括但不限于通过例如sata、ide、usb、pcie、nvme(nvmexpress)、sas、以太网、光纤通道、无线通信网络等连接主机与存储设备102。主机可以是能够通过上述方式同存储设备相通信的信息处理设备,例如,个人计算机、平板电脑、服务器、便携式计算机、网络交换机、路由器、蜂窝电话、个人数字助理等。存储设备102包括接口103、控制部件104、一个或多个nvm(非易失存储器,non-volatilememory)芯片105以及可选地固件存储器110。接口103可适配于通过例如sata、ide、usb、pcie、nvme、sas、以太网、光纤通道等方式与主机交换数据。控制部件104用于控制在接口103、nvm芯片105以及固件存储器110之间的数据传输,还用于存储管理、主机逻辑地址到闪存物理地址映射、擦除均衡、坏块管理等。可通过软件、硬件、固件或其组合的多种方式实现控制部件104。控制部件104可以是fpga(field-programmablegatearray,现场可编程门阵列)、asic(applicationspecificintegratedcircuit,应用专用集成电路)或者其组合的形式。控制部件104也可以包括处理器或者控制器。控制部件104在运行时从固件存储器110加载固件。固件存储器110可以是nor闪存、rom、eeprom,也可以是nvm芯片105的部分。nand闪存、相变存储器、feram、mram等是常见的nvm。存储器目标(target)是nand闪存封装内的共享芯片使能(ce,chipenable)信号的一个或多个逻辑单元(lun,logicunit)。nand闪存封装内可包括一个或多个管芯(die)。典型地,逻辑单元对应于单一的管芯。逻辑单元可包括多个平面(plane)。逻辑单元内的多个平面可以并行存取,而nand闪存芯片内的多个逻辑单元可以彼此独立地执行命令和报告状态。在可从http://www.micron.com/~/media/documents/products/other%20documents/onfi3_0gold.ashx获得的“opennandflashinterfacespecification(revision3.0)”中,提供了关于目标(target)、逻辑单元、lun、平面(plane)的含义,其为现有技术的一部分。存储介质上通常按页来存储和读取数据。而按块来擦除数据。块包含多个页。块包含多个页。存储介质上的页(称为物理页)具有固定的尺寸,例如17664字节。物理页也可以具有其他的尺寸。物理页中可以包括多个数据段,数据段具有指定的尺寸,例如4096或4416字节。在固态存储设备中,利用ftl(flashtranslationlayer,闪存转换层)来维护从逻辑地址到物理地址的映射信息。逻辑地址构成了操作系统等上层软件所感知到的固态存储设备的存储空间。物理地址是用于访问固态存储设备的物理存储单元的地址。在现有技术中还可利用中间地址形态实施地址映射。例如将逻辑地址映射为中间地址,进而将中间地址进一步映射为物理地址。存储了从逻辑地址到物理地址的映射信息的表结构被称为ftl表。ftl表是固态存储设备中的重要元数据。通常ftl表的数据项记录了固态存储设备中以数据页为单位的地址映射关系。ftl表包括多个ftl表条目(或称表项)。在一个实施例中,每个ftl表条目中记录了一个逻辑页地址与一个物理页的对应关系。在另一个例子中,每个ftl表条目中记录了连续的多个逻辑页地址与连续的多个物理页的对应关系。在又一个实施例中,每个ftl表条目中记录了逻辑块地址与物理块地址的对应关系。在依然又一个实施例中,ftl表中记录逻辑块地址与物理块地址的映射关系,和/或逻辑页地址与物理页地址的映射关系。来自主机的io命令包括例如读命令与写命令。在处理来自主机的读命令时,固态存储设备利用读命令中携带的逻辑地址从ftl表中获得对应的物理地址,并依据物理地址向nvm芯片发出读请求,并接收nvm芯片响应于读请求输出的数据。在处理来自主机的写命令时,固态存储设备为写命令分配物理地址,在ftl表中记录写命令的逻辑地址与分配的物理地址的对应关系,并依据分配的物理地址向nvm芯片发出写请求。在nvme规范(http://nvmexpress.org/wp-content/uploads/nvm_express_1_2_1_gold_20160603.pdf)中定义了原子操作(atomicoperation)。原子操作包括原子写命令。为执行原子写命令,固态存储设备确保在原子写命令中指示的数据,要么都写入到固态存储设备中,要么都未写入到固态存储设备中,而不会有其他自行结果。当同时存在向相同或部分相同的地址写入数据的两个或更多原子写命令同时存在时,这些原子写命令的执行结果是如同这些原子写命令串行执行的。例如,参看表1,原子写命令a向逻辑地址(lba)0-3写入数据,原子写命令b向逻辑地址(lba)1-4写入数据(表1中用“a”指示由原子写命令a写入的数据,而由“b”指示由原子写命令b写入的数据)。表1的第2行与第3行示出了命令a与命令b的正确执行结果。参看表1,一种可能的结果(如表1第2行所示)是lba0-lba3是写命令a所写入的数据,而lba4是写命令b所写入的数据,换句话说,写命令b先生效,原子性地更新了lba1-lba4,接下来写命令a生效,又原子性地更新了lba0-lba3。另一种可能的结果(如表1第3行所示)是lba0是写命令a所写入的数据,而lba1-lba4是写命令b所写入的数据,换句话说,写命令a先生效,原子性地更新了lba0-lba3,接下来写命令b生效,又原子性地更新了lba1-lba4。除了上面提到的两种结果,其他任何结果都不符合nvme规范对原子写命令的要求。表1lba0lba1lba2lba3lba4lba5lba6有效结果aaaab有效结果abbbb无效结果aabbb技术实现要素:在固态存储设备中,同时处理多个io命令,几乎每个io命令都需要访问ftl表。使用锁机制为io命令访问的ftl表项时消除访问冲突能够满足对io命令的原子性要求。然而,访问锁增加了对存储器带宽与cpu计算能力的占用,且不利于提升固态存储设备的处理能力与性能-功耗比。根据本申请的实施例,能够实现多个io命令的并发处理,满足原子性要求,消除了锁的使用,提升了固态存储设备的处理性能。根据本申请的第一方面,提供了根据本申请第一方面的第一并发io命令的无锁处理方法,包括:接收第一io命令;判断第一io命令同排序集合中的任何io命令是否冲突;响应于第一io命令同排序集合中的任何io命令都不冲突,将第一io命令插入到排序集合中,处理第一io命令;响应于第一io命令被处理完成,将第一io命令从排序集合中取出。根据本申请的第一方面的第一并发io命令的无锁处理方法,提供了根据本申请第一方面的第二并发io命令的无锁处理方法,还包括:响应于第一io命令同排序集合中的任何io命令冲突,将第一io命令置于等待集合中。根据本申请的第一方面的第二并发io命令的无锁处理方法,提供了根据本申请第一方面的第三并发io命令的无锁处理方法,还包括:从等待集合中获取第一io命令,响应于第一io命令同排序集合中的任何io命令冲突消失,将第一io命令插入到排序集合中,以及处理第一io命令。根据本申请的第一方面的第一至第三并发io命令的无锁处理方法之一,提供了根据本申请第一方面的第四并发io命令的无锁处理方法,排序集合中的元素是io命令。根据本申请的第一方面的第一至第四并发io命令的无锁处理方法之一,提供了根据本申请第一方面的第五并发io命令的无锁处理方法,排序集合中的io命令是处理中的io命令。根据本申请的第一方面的第一至第五并发io命令的无锁处理方法之一,提供了根据本申请第一方面的第六并发io命令的无锁处理方法,排序集合中的io命令按照io命令访问的逻辑地址排序。根据本申请的第一方面的第一至第六并发io命令的无锁处理方法之一,提供了根据本申请第一方面的第七并发io命令的无锁处理方法,排序集合按照io命令访问的逻辑地址的起始地址或结束地址排序。根据本申请的第一方面的第一至第七并发io命令的无锁处理方法之一,提供了根据本申请第一方面的第八并发io命令的无锁处理方法,排序集合中的io命令访问的逻辑地址的范围大小相同或者不同。根据本申请的第一方面的第一至第八并发io命令的无锁处理方法之一,提供了根据本申请第一方面的第九并发io命令的无锁处理方法,排序集合为队列、链表、跳跃表、二叉树中的一种或多种。根据本申请的第一方面的第一至第九并发io命令的无锁处理方法之一,提供了根据本申请第一方面的第十并发io命令的无锁处理方法,排序集合存储在soc的片上存储器中。根据本申请的第一方面的第一至第十并发io命令的无锁处理方法之一,提供了根据本申请第一方面的第十一并发io命令的无锁处理方法,排序集合的各个io命令的逻辑地址范围不存在交叠。根据本申请的第一方面的第一至第十一并发io命令的无锁处理方法之一,提供了根据本申请第一方面的第十二并发io命令的无锁处理方法,若第一io命令同排序集合中的任何io命令的逻辑地址范围存在交叠,则第一io命令同排序集合中的io命令存在冲突。根据本申请的第一方面的第一至第十二并发io命令的无锁处理方法之一,提供了根据本申请第一方面的第十三并发io命令的无锁处理方法,响应于第一io命令同排序集合中的第二io命令冲突,将第一io命令置于同第二io命令相关联的等待子集中。根据本申请的第一方面的第十三并发io命令的无锁处理方法,提供了根据本申请第一方面的第十四并发io命令的无锁处理方法,第二io命令被处理完成并从排序集合中移除,从同第二io命令相关联的等待子集中获取第三io命令,并尝试将第三io命令加入排序集合。根据本申请的第一方面的第十四并发io命令的无锁处理方法,提供了根据本申请第一方面的第十五并发io命令的无锁处理方法,若第三io命令同排序集合中的任何io命令都不冲突,将第三io命令插入排序集合。根据本申请的第一方面的第十四并发io命令的无锁处理方法,提供了根据本申请第一方面的第十六并发io命令的无锁处理方法,若第三io命令同排序集合中的第四io命令冲突,将第三io命令放入同第四io命令相关联的等待子集中。根据本申请的第一方面的第一至第十六并发io命令的无锁处理方法之一,提供了根据本申请第一方面的第十七并发io命令的无锁处理方法,若第一io命令是读命令,直接对第一io命令进行处理,而不将第一io命令添加到排序集合。根据本申请的第一方面的第一至第十七并发io命令的无锁处理方法之一,提供了根据本申请第一方面的第十八并发io命令的无锁处理方法,若第一io命令是写命令,若第一io命令同排序集合中的任何io命令都不冲突,才将第一io命令添加到排序集合,并对第一io命令进行处理。根据本申请的第一方面的第一至第十八并发io命令的无锁处理方法之一,提供了根据本申请第一方面的第十九并发io命令的无锁处理方法,若第一io命令是写命令,若第一io命令同排序集合中的第三io命令冲突,将第一io命令置于等待集合中。根据本申请的第一方面的第十九并发io命令的无锁处理方法,提供了根据本申请第一方面的第二十并发io命令的无锁处理方法,将第一io命令置于同第三io命令相关联的等待子集中。根据本申请的第一方面的第一至第二十并发io命令的无锁处理方法之一,提供了根据本申请第一方面的第二十一并发io命令的无锁处理方法,排序集合中的io命令被并发处理。根据本申请的第一方面的第一至第二十一并发io命令的无锁处理方法之一,提供了根据本申请第一方面的第二十二并发io命令的无锁处理方法,接收的io命令为由访问存储设备的命令拆分得到的子命令。根据本申请的第一方面的第一至第二十二并发io命令的无锁处理方法之一,提供了根据本申请第一方面的第二十三并发io命令的无锁处理方法,处理第一io命令包括依据第一io命令访问的逻辑地址访问ftl表获取对应的物理地址,访问所述物理地址以响应第一io命令。根据本申请的第一方面的第二十三并发io命令的无锁处理方法,提供了根据本申请第一方面的第二十四并发io命令的无锁处理方法,访问ftl表时,无须对ftl表或ftl表的表项加锁。根据本申请的第一方面的第二十三或第二十四并发io命令的无锁处理方法,提供了根据本申请第一方面的第二十五并发io命令的无锁处理方法,还包括:若当前写入位置落后于第一物理地址,暂停对第一读请求的处理,直到当前写入位置超前于第一物理地址。根据本申请的第一方面的第二十三或第二十四并发io命令的无锁处理方法,提供了根据本申请第一方面的第二十六并发io命令的无锁处理的方法,还包括:若包含所述物理地址的物理块或大块处于已写入状态,以及若当前写入位置超前于所述物理地址,从所述物理地址读取数据以响应所述第一io命令。根据本申请的第一方面的第二十六并发io命令的无锁处理方法,提供了根据本申请第一方面的第二十七并发io命令的无锁处理方法,还包括:若当前写入位置落后于第一物理地址,暂停对第一io命令的处理,直到当前写入位置超前于第一物理地址。根据本申请的第一方面的第二十三或第二十四并发io命令的无锁处理方法,提供了根据本申请第一方面的第二十八并发io命令的无锁处理方法,还包括:若从所述物理地址读取数据的结果指示所述物理地址所在的物理页处于擦除状态,以及包含所述物理地址的物理块或大块处于已写入状态,若当前写入位置落后于所述物理地址,暂停对所述第一io命令的处理,直到当前写入位置超前于所述物理地址。根据本申请的第一方面的第二十八并发io命令的无锁处理方法,提供了根据本申请第一方面的第二十九并发io命令的无锁处理方法,还包括:若从所述物理地址读取数据的结果指示所述物理地址所在的物理页处于擦除状态,以及包含所述物理地址的物理块或大块处于被擦除状态,依据第一io命令访问的逻辑地址访问ftl表以获取第二物理地址;以及从第二物理地址读取数据。根据本申请的第二方面,提供了根据本申请第二方面的第一并发io命令无锁处理系统,包括:接收模块,用于接收第一io命令;判断模块,用于判断第一io命令同排序集合中的任何io命令是否冲突;处理模块,用于响应于第一io命令同排序集合中的任何io命令都不冲突,将第一io命令插入到排序集合中,处理第一io命令;取出模块,用于响应于第一io命令被处理完成,将第一io命令从排序集合中取出。根据本申请的第三方面,提供了根据本申请第三方面的第一固态存储设备,包括控制部件、nvm芯片和存储器,控制部件分别耦合到nvm芯片和存储器,所述控制部件执行根据本申请的第一方面的第一至第二十九并发io命令的无锁处理的方法之一。根据本申请的第四方面,提供了根据本申请的第四方面的第一存储了程序的存储介质,响应于所述程序被载入处理器运行,所述程序使所述处理器执行根据本申请的第一方面的第一至第二十九并发io命令的无锁处理的方法之一。根据本申请的第五方面,提供了根据本申请第五方面的第一并发io命令的无锁处理方法,包括:响应于接收第一写命令,判断第一写命令同排序集合中的任何写命令是否冲突;响应于第一写命令同排序集合中的任何写命令都不冲突,将第一写命令插入到排序集合中,处理第一写命令;若所述第一写命令访问的逻辑地址所属的逻辑地址块同处理中的读命令访问的逻辑地址所属的逻辑地址块相同或相交叠,使所述读命令元数据中的更新计数递增;响应于第一写命令被处理完成,将第一写命令从排序集合中取出。根据本申请的第五方面的第一并发io命令的无锁处理方法,提供了根据本申请第五方面的第二并发io命令的无锁处理方法,还包括:响应于第一写命令同排序集合中的任一写命令冲突,将第一写命令置于等待集合中。根据本申请的第五方面的第一或第二并发io命令的无锁处理方法,提供了根据本申请第五方面的第三并发io命令的无锁处理方法,还包括:响应于接收第一读命令,若第一读命令同排序集合中的任何写命令都不冲突,处理第一读命令。根据本申请的第五方面的第一至第三并发io命令的无锁处理方法之一,提供了根据本申请第五方面的第四并发io命令的无锁处理方法,还包括:若第一读命令同排序集合中的任一写命令冲突,将第一读命令置于等待集合中。根据本申请的第五方面的第二或第四并发io命令的无锁处理方法,提供了根据本申请第五方面的第五并发io命令的无锁处理方法,所述等待集合关联于导致冲突的第二写命令。根据本申请的第五方面的第一至第五并发io命令的无锁处理方法之一,提供了根据本申请第五方面的第六并发io命令的无锁处理方法,还包括:响应于等待集合中的第一io命令同排序集合中的任何写命令冲突消失,处理第一io命令,直到第一io命令处理完成。根据本申请的第五方面的第五并发io命令的无锁处理方法,提供了根据本申请第五方面的第七并发io命令的无锁处理方法,还包括:响应于所述第二写命令被处理完成,将第二写命令从排序集合中取出,处理所述等待集合中的io命令,直到所述等待集合中的io命令处理完成。根据本申请的第五方面的第一至第七并发io命令的无锁处理方法之一,提供了根据本申请第五方面的第八并发io命令的无锁处理方法,还包括:响应于从nvm芯片获取了所述处理中的读命令中的第二读命令所访问的数据,若所述第二读命令的元数据中记录的所述第二读命令访问的逻辑地址所属的逻辑地址块的更新计数大于阈值,重新处理所述第二读命令。根据本申请的第五方面的第八并发io命令的无锁处理方法,提供了根据本申请第五方面的第九并发io命令的无锁处理方法,响应于重新处理所述第二读命令,若所述第二读命令同排序集合中的任一写命令存在冲突,将所述第二读命令置于第二等待集合中,所述第二等待集合关联于导致冲突的第三写命令。根据本申请的第五方面的第八或第九并发io命令的无锁处理方法,提供了根据本申请第五方面的第十并发io命令的无锁处理方法,若所述第二读命令同排序集合中的任何写命令都不存在冲突,从ftl表中获取对应于所述第二读命令的逻辑地址的第二物理地址,依据第二物理地址访问nvm芯片。根据本申请的第五方面的第八或第九并发io命令的无锁处理方法,提供了根据本申请第五方面的第十一并发io命令的无锁处理方法,响应于重新处理所述第二读命令,若所述第二读命令同排序集合中的任何写命令都不存在冲突,从ftl表中获取对应于所述第二读命令的逻辑地址的第二物理地址,若第二物理地址同所述第二读命令的元数据中记录的物理地址不同,依据第二物理地址访问nvm芯片。根据本申请的第五方面的第十一并发io命令的无锁处理方法,提供了根据本申请第五方面的第十二并发io命令的无锁处理方法,若第二物理地址同所述第二读命令的元数据中记录的物理地址相同,将从nvm芯片获取的第二读命令所访问的数据提供给主机。根据本申请的第五方面的第十一并发io命令的无锁处理方法,提供了根据本申请第五方面的第十三并发io命令的无锁处理方法,还包括:在所述第二读命令的元数据中记录所述第二物理地址。根据本申请的第五方面的第八至第十三并发io命令的无锁处理方法之一,提供了根据本申请第五方面的第十四并发io命令的无锁处理方法,还包括:若所述第二读命令的元数据中记录的所述第二读命令访问的逻辑地址所属的逻辑地址块的更新计数不大于阈值,将从nvm芯片获取的第二读命令所访问的数据提供给主机。根据本申请的第五方面的第一至第十四并发io命令的无锁处理方法之一,提供了根据本申请第五方面的第十五并发io命令的无锁处理方法,排序集合中的写命令按照写命令访问的逻辑地址排序。根据本申请的第五方面的第一至第十五并发io命令的无锁处理方法之一,提供了根据本申请第五方面的第十六并发io命令的无锁处理方法,排序集合的各个写命令的逻辑地址范围不存在交叠。根据本申请的第五方面的第一至第十六并发io命令的无锁处理方法之一,提供了根据本申请第五方面的第十七并发io命令的无锁处理方法,若io命令同排序集合中的任一写命令的逻辑地址范围存在交叠,则io命令同排序集合中的写命令存在冲突。根据本申请的第五方面的第一至第十七并发io命令的无锁处理方法之一,提供了根据本申请第五方面的第十八并发io命令的无锁处理方法,访问ftl表时,无须对ftl表或ftl表的表项加锁。根据本申请的第六方面,提供了根据本申请第六方面的第一并发io命令无锁处理系统,包括:冲突识别模块,用于响应于接收第一写命令,判断第一写命令同排序集合中的任何写命令是否冲突;排序集合插入模块,用于响应于第一写命令同排序集合中的任何写命令都不冲突,将第一写命令插入到排序集合中,处理第一写命令;更新计数模块,用于若所述第一写命令访问的逻辑地址所属的逻辑地址块同处理中的读命令访问的逻辑地址所属的逻辑地址块相同或相交叠,使所述读命令元数据中的更新计数递增;排序集合删除模块,用于响应于第一写命令被处理完成,将第一写命令从排序集合中取出。根据本申请的第七方面,提供了根据本申请第七方面的第一固态存储设备,包括控制部件、nvm芯片和存储器,控制部件分别耦合到nvm芯片和存储器,所述控制部件执行根据本申请的第五方面的第一至第十八之一的并发io命令的无锁处理方法。根据本申请的第八方面,提供了根据本申请的第八方面的第一存储了程序的存储介质,响应于所述程序被载入处理器运行,所述程序使所述处理器执行根据本申请的第五方面的第一至第十八之一的并发io命令的无锁处理方法。附图说明为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域技术人员来讲,还可以根据这些附图获得其他的附图。图1是现有技术的固态存储设备的框图;图2是根据本申请实施例的图1的控制部件的内部组成的框图;图3是根据本申请实施例的排序集合中的io命令处理完成后的流程图;图4是根据本申请实施例的处理io命令的流程图;图5是根据本申请实施例的并发处理io命令的示意图;图6是根据本申请实施例的物理块状态表;图7是根据本申请实施例的大块的示意图;图8是根据本申请实施例的写位置表;以及图9是根据本申请依然又一实施例中处理读命令的扩展流程图。具体实施方式下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。实施例一图2是根据本申请实施例的图1的控制部件的内部组成的框图。如图2所示,控制部件104包括主机接口210、分配器230、用于处理io命令的多个cpu(例如,cpu240与cpu250)、用于访问nvm芯片105的介质接口220。主机接口210用于同主机交换命令与数据。在一个例子中,主机与存储设备通过nvme/pcie协议通信,主机接口210处理pcie协议数据包,提取出nvme协议命令,并向主机返回nvme协议命令的处理结果。分配器230耦合到主机接口210,接收主机发送给存储设备的io命令,并将io命令分配给用于处理io命令的多个cpu之一。分配器230可由cpu或专用硬件实现。控制部件104还耦合到外部存储器(例如,dram)110。存储器110的部分空间被用于存储ftl表(例如,ftl表260与ftl表270)。可选地,将固态存储设备提供的完整逻辑地址空间分成多个部分,每个部分由ftl表之一(ftl表260或ftl表270)管理。可选地,ftl表与处理io命令的cpu一一对应。例如,ftl表260仅由cpu40访问,而ftl表270仅由cpu250访问。分配器230根据io命令访问的逻辑地址,将io命令发送给管理包含io命令所访问的逻辑地址的ftl表的cpu。依然可选地,cpu240与cpu250的任何一个都可访问完整的ftl表。可以理解的,可提供一个或更多数量的cpu处理io命令。对于写命令,在cpu的指示下,要写入的数据被通过主机接口210从主机传输到nvm芯片105。cpu为写命令分配用于nvm芯片105的物理地址,将写命令的逻辑地址与分配的物理地址构成ftl表项并记录在ftl表中。对于读命令,在cpu的指示下,依据读命令的逻辑地址访问ftl表获取同逻辑地址对应的物理地址,并依据物理地址从nvm芯片105读取数据,并将数据通过主机接口210传输给主机。cpu对每个io命令的处理需占据一定时间并使用固态存储设备的部分资源(例如,存储数据和/或记录io命令上下文的缓存)。对io命令的处理的部分环节(例如,访问ftl表,访问nvm芯片,同主机传输数据等)采用异步方式执行。在异步处理io命令期间,cpu处理其他io命令,从而即使单一的cpu,也并发地处理多个io命令。将固态存储设备中已经开始处理而尚未处理完成的io命令,称为处理中的io命令。以及需要避免多个处理中的io命令访问相同的逻辑地址引起的冲突。在根据本申请的实施例中,消除了用于ftl表项的锁,而是提供排序集合来管理多个并发的io命令。表2展示了排序集合的例子。排序集合中的元素是io命令,在表2中,在“io命令”列,用io命令的标识符(c0、c5、c9或c2)来代表io命令。排序集合中的元素(io命令)按io命令访问的逻辑地址排序。在表2的例子中,按io命令访问的逻辑地址的起始地址或结束地址排序。每个io命令访问的逻辑地址的范围大小可相同或不同。排序集合中记录的io命令是处理中的io命令。响应于从分配器收到io命令,cpu将io命令添加到排序集合中。可由队列、链表、跳跃表(skiplist)、二叉树等多种数据结构实现排序集合,排序集合尺寸较小(例如,集合元素最大数量为固态存储设备同时执行的io命令数),被存储在cpu240或cpu250的本地存储器中。cpu240与cpu250维护各自的排序集合。为将io命令插入排序集合,为io命令在排序集合中寻找恰当的位置,以保证排序集合中的元素是排序的。排序集合的各个io命令的逻辑地址不能交叠(换句话说,任意两个io命令访问的逻辑地址范围不存在任何重叠的部分)。若待插入io命令同排序集合中的io命令的逻辑地址范围发生交叠,认为出现冲突。在出现冲突时,待插入的io命令不能被添加到排序集合中。而是,将存在冲突的io命令置于等待io命令子集中。例如,参看表2,由c0指示的io命令访问逻辑地址范围100-200,而由c1指示的io命令访问逻辑地址范围120-130。由于io命令c1同排序集合中的io命令c0存在冲突,将io命令c1置于同io命令c0相关联的等待io命令子集中。作为又一个例子,io命令c3访问逻辑地址范围180-183,同io命令c0相冲突,将io命令c3也置于同io命令c0相关联的等待io命令子集中。在根据本申请的实施例中,仅对排序集合中的io命令进行处理,对等待io命令子集中的io命令不进行处理。因而为处理io命令,需先将io命令添加到排序集合中。由于排序集合中的各个io命令访问的逻辑地址范围彼此不交叠,保证了处理排序集合中的io命令时,访问的ftl表项都是不同的ftl表项,从而ftl表项不会成为并发处理的多个io命令的临界资源,从而消除了冲突。而因访问的逻辑地址范围交叠而会引起冲突的io命令都被添加到等待io命令子集中。在冲突消除后再进行处理。表2图3是根据本申请实施例的排序集合中的io命令处理完成后的流程图。如图3所示,响应于io命令被处理完成(310),cpu将被处理完成的io命令从排序集合中取出(320)。以及可选地,调整排序集合,使其中元素依然保持排序。进一步地,cpu判断同被从排序集合中删除的io命令相关联的等待io命令子集是否非空(330)。若不存在同被从排序集合中取出的io命令关联的等待io命令子集,cpu等待接收新的io命令(340)。若存在同被从排序集合中取出的io命令关联的等待io命令子集(例如{c1,c3}),在一个例子中,将等待io命令子集中的每个io命令,尝试加入排序集合(350)。例如,若等待io命令子集中的io命令c1同排序集合中的任何io命令都不冲突,将io命令c1插入排序集合,并保证排序集合中的所有元素有序。若等待io命令子集中的io命令c3同排序集合中的任何io命令之一冲突,将io命令c3再次放入同排序集合中引起冲突的io命令相关联的等待io命令子集中。在另一个例子中,作为对步骤350的替代,若等待io命令子集非空,按io命令进入等待io命令子集的先后顺序处理等待io命令子集中的每个io命令,直到等待io命令子集中的所有命令都被处理完成。在此期间,若分配器分配了新的io命令,且io命令访问的逻辑地址同正在处理的等待io命令子集中的io命令的逻辑地址冲突,将新的io命令也按顺序添加到等待io命令子集合中,而不添加到排序集合。或者,在等待io命令子集中的所有命令都被处理完成期间,暂时不接收分配器分配的新的io命令。图4是根据本申请实施例的处理io命令的流程图,如图4所示,分配器收到io命令后(410),将io命令分配给用于处理io命令的多个cpu(cpu240或cpu250)之一(也参看图2)。cpu判断收到的io命令为读命令或者写命令(420)。对于读命令(记为读命令r1),cpu判断读命令与排序集合中的元素是否冲突(430)。若读命令r1同排序集合中的任何io命令都不冲突(逻辑地址范围不交叠),对读命令r1进行处理(包括访问ftl表获取物理地址,从物理地址读取数据,并将读取的数据提供给主机等)(440),而不将读命令r1添加到排序集合。进一步地,若读命令r1同排序集合中的写命令(例如c9)冲突,将读命令r1置于同写命令c9相关联的等待io命令子集中(450),以及暂时不处理读命令r1。在图4的实施例中,排序集合中不存在读命令,因而读命令r1也不会同排序集合中的读命令冲突。在可选的实施方式中,即使排序集合中存在读命令,在步骤430,若读命令r1同排序集合中的读命令(例如c2)冲突,将读命令r1进行处理,而不将读命令r1添加到排序集合。对于步骤420识别出的写命令(记为写命令w1),cpu判断写命令与排序集合中的元素是否冲突(460)。若写命令w1同排序集合中的任何io命令都不冲突,将写命令w1添加到排序集合(470),并对写命令w1进行处理(480)。若写命令w1同排序集合中的任何写命令(例如写命令c9)冲突,则将写命令w1置于同写命令c9相关联的等待io命令子集中(490)。可以理解地,等待io命令子集中可包括一个或多个等待执行的(相同或不同类型(读和/或写)的)io命令。在根据本申请的实施例中,通过使用排序集合,为io命令设置了屏障。所有进入排序集合的io命令,相当于通过了屏障,可以被并发处理,而无须引起资源冲突。而被置入等待io命令子集的io命令相当于被屏障阻挡,不会被同其他处理中的io命令并发处理,从而避免了资源冲突。并且,保证了io命令处理的原子性。满足了nvme规范的中对掉电原子性(awupf,atomicwriteunitpowerfail)与一般原子性(awun,atomicwriteunitnormal)的要求。以及,有关排序集合的操作都是cpu操作本地存储器的低延迟操作,不会引用长等待时间,从而消除了访问ftl表项的锁所引起的需要长等待时间的外部存储器访问操作。在由图4所示的实施例中,排序集合中仅记录写命令,而不记录读命令。减少了排序集合中的元素数量,降低了排序集合对存储空间的需求,也降低了从排序集合中查找元素的计算量,还加快了读命令的处理速度,降低了读命令处理延迟。作为又一种实施方式,在步骤440,也将读命令添加到排序集合中。以及相应地,在步骤460,若写命令w1同排序集合中的读命令c2冲突,则将写命令w1置于同读命令c2相关联的等待io命令子集中。在图4的实施例中,在步骤410,分配器依据io命令访问的逻辑地址,选择管理包含该逻辑地址的ftl表部分的cpu(例如,cpu240,参看图2),将io命令发送给cpu240。cpu240为ftl表260维护排序集合。而cpu250为ftl表270维护另一个排序集合。在可选的实施例中,在dram110中存储单一的完整ftl表,cpu240与cpu250各自维护属于自己的排序集合(例如,排序集合s1与排序集合s2)。例如,排序集合s1中的元素访问的奇数的逻辑地址,而排序集合s2中的元素访问偶数的逻辑地址。可选地,以其他方式划分两个排序集合,例如,排序集合s1中的元素的逻辑地址大于排序集合s2中的元素的逻辑地址。在步骤410,分配器依据io命令访问的逻辑地址,选择cpu管理包含该逻辑地址的排序集合的cpu。图5是根据本申请实施例的并发处理io命令的示意图。如图5所示,响应于io命令c0、c5、c9与c2(也参看表2)被添加到排序集合,也开始对这些io命令的处理。io命令被添加到io命令的时间可不同,处理开始的时间也不同。图5中,箭头所指示的时间轴所延伸的方向为时间流逝方向,而箭头所指示的逻辑地址空间轴方向为逻辑地址递增方向。图5中,io命令c0、c5、c9与c2的逻辑地址互不交叠,因而这些io命令被并发处理。而同这些io命令存在冲突的io命令c1与c3被置于等待io命令子集中,而未被处理。根据本申请的实施例识别可并发处理的io命令,提升了io命令处理的并发性,增强了固态存储设备的性能,并且无须使用锁,而降低了对外部存储器的访问次数,降低了对外部存储器带宽的占用。实施例二在根据本申请的又一实施例中,分配器230将io命令拆分为一个或多个子命令。示例性地,在一些情况下,写命令访问的逻辑地址范围(例如,0-127)大于单一ftl表项的逻辑地址范围(例如,4),在此情况下,将写命令拆分为多个子命令,每个子命令所访问的逻辑地址范围不超过一个ftl表项的逻辑地址范围。例如,写命令访问0-7kb的逻辑地址范围,为写命令拆分为两个子写命令,第一个子写命令访问0-3kb逻辑地址范围,第二个子写命令访问4-7kb逻辑地址范围。作为另一个例子,写命令访问2-9kb的逻辑地址范围,将写命令拆分为三个子写命令,第一个子写命令用于访问2-3kb逻辑地址范围,而第二个子写命令用于访问4-7kb逻辑地址范围,第三个子写命令用于访问8-9kb逻辑地址范围。类似地,也将读命令拆分为子读命令。将子写命令与子读命令统称为子命令。分配器将子命令依据其访问的逻辑地址发送给cpu之一。cpu将接收的子命令尝试添加到排序集合,并对添加到排序集合的子命令进行处理。排序集合的元素是子命令。排序集合中的任意两个元素访问的逻辑地址范围不相交叠。若待添加到排序集合的子命令同排序集合中的任何元素的逻辑地址范围存在交叠,将该待添加到排序集合的子命令置于等待命令子集。等待命令子集同引发冲突的排序集合中的子命令相关联。cpu对添加到排序集合的子命令进行处理,包括访问ftl表,访问nvm芯片,同主机传输数据等。响应于子命令被处理完成,将被处理完成的子命令从排序集合中取出。以及可选地,调整排序集合,使其中元素依然保持排序。进一步地,若存在同被从排序集合中取出的子命令关联的等待命令子集,将等待命令子集中的每个子命令,尝试加入排序集合。可以理解地,例如,若子命令同排序集合中的任何子命令都不冲突,将子命令插入排序集合,并保证排序集合中的所有元素有序。若子命令同排序集合中的任何子命令冲突,将子命令再次放入同排序集合中引起冲突的子命令相关联的等待命令子集中。在根据本申请的进一步的实施例中,对于子读命令(记为子读命令sr1),若子读命令sr1同排序集合中的任何子命令都不冲突(逻辑地址范围不交叠),对子读命令sr1进行处理,而不将子读命令sr1添加到排序集合。进一步地,若子读命令sr1同排序集合中的子写命令(例如sw9)冲突,将子读命令sr1置于同子写命令sw9相关联的等待命令子集中。在此实施方式中,排序集合中不存在读命令或子读命令。进一步地,对于子写命令(记为子写命令sw1),若子写命令sw1同排序集合中的任何子命令都不冲突,将子写命令sw1添加到排序集合,并对子写命令sw1进行处理。若子写命令sw1同排序集合中的子写命令sw9冲突,则将子写命令sw1置于同子写命令sw9相关联的等待命令子集中。可选地,根据本申请实施例的处理io命令的流程由多个cpu、控制器协同处理。固态存储设备中,并发处理多个io命令。在一些情况下,从读命令或子读命令从ftl表中获取物理地址后,该物理地址因对其他写命令或擦除命令的处理而被改写,导致从该物理地址获得错误的数据。在申请号为201610509669.2的中国专利申请中,提供了在处理读命令时检查被擦除块以及所读取的物理地址是否被写入数据的方案。将其全文通过引用并入本发明。根据本申请的又一实施例,固态存储设备的控制部件还维护物理块状态表。图6是根据本申请实施例的物理块状态表。参看图6,物理块状态表610,物理块状态表610包括多个条目(例如,612与614),每个条目对应固态存储设备中的一个物理块,并记录同表条目对应的物理块是处于擦除状态,还是处于已经被写入数据的状态(简称为“已写入”状态)。在一个例子中,当物理块被擦除时,更新物理块状态表610,以标识物理块处于被擦除状态。而当物理块被第一次写入时,更新物理块状态表610,以标识物理块处于已写入状态。通过介质接口220(也参看图2)向nvm芯片发出读命令前,用从ftl表项260或ftl表270获取的物理地址得到该物理地址所在的物理块,并在物理块状态表610中查询该物理块的状态。若该物理块处于已写入状态,则通过闪存接口向nvm芯片发出读命令;若该物理块处于被擦除状态,则指示重放读命令。作为举例,重放读命令的含义在于,将该读命令视作新收到的读命令,并重新处理。例如,由分配器230为该读命令重新分配cpu,或者由cpu240或cpu250之一重新对该读命令进行处理。由于重放读命令需要时间,在重新获取ftl表项时,其内容以很大概率已被更新,新获取的ftl表项将提供更新后的物理地址,而更新后的物理地址中存储有效数据。在极少数情况下,作为举例,重新获取ftl表项时,ftl表项的更新依然未完成,重新获取的ftl表项依然是旧的处于被擦除状态的物理地址。在此情况下,再次重放读命令,以重新获取ftl表项。图7是根据本申请实施例的大块的示意图。即图7示出了大块的示意图。大块包括来自多个逻辑单元(称为逻辑单元组)的每个的物理块。可选的,每个逻辑单元为大块提供一个物理块。作为举例,在每16个逻辑单元(lun)上构造大块。每个大块包括16个物理块,来自16个逻辑单元(lun)的每一个。在图7的例子中,大块0包括来自16个逻辑单元(lun)的每个的物理块0,大块1包括来自每个逻辑单元(lun)的物理块1。也可以有多种其他方式来构造大块。作为一种可选的方式,在大块中构造页条带,每个逻辑单元(lun)内相同物理地址的物理页构成了“页条带”。图7中,物理页0-0、物理页0-1……与物理页0-x构成了页条带0,其中物理页0-0、物理页0-1……物理页0-14用于存储用户数据,而物理页0-15用于存储根据条带内的所有用户数据计算得到的校验数据。类似地,图7中,物理页2-0、物理页2-1……与物理页2-x构成了页条带2。可选地,用于存储校验数据的物理页可以位于页条带中的任意位置。在根据本申请的又一实施例中,还维护大块状态表。大块状态表的每个条目记录大块是处于擦除状态,还是处于已经被写入数据的状态(简称“已写入”状态)。在一个例子中,当大块被擦除时,更新块大块状态表的条目,以标识大块处于被擦除状态。而当大块被第一次写入数据时,更新大块状态表,以标识大块处于已写入状态。通过介质接口220(也参看图2)向nvm芯片发出读命令前,用从ftl表项260或ftl表270获取的物理地址得到该物理地址所在的大块,并在大块状态表中查询该大块的状态。若该大块处于已写入状态,则通过闪存接口向nvm芯片发出读命令;若该大块处于被擦除状态,则指示重放读命令。根据本申请的依然又一实施例,通过介质接口220(也参看图2)向nvm芯片发出读命令前,不检查读命令所访问的物理地址是否处于被擦除状态。而是检查读命令的执行结果,以获知读命令访问的物理地址是否处于被擦除状态。在一个例子中,nvm芯片在读取数据的结果中提供这样的指示,来标识所读取的物理页是否处于被擦除状态。在另一个例子中,控制部件的闪存接口依据从nvm芯片读出的数据判断所读出的数据是否来自处于被擦除状态的物理页。若读取数据结果指示读命令的物理地址对应的物理页处于被擦除状态,重放该读命令。若读取数据结果指示读命令的物理地址对应的物理页非处于被擦除状态,则所读取的数据有效,以读取的数据作为对读命令的响应。由于读命令对应的物理地址所在的物理块或块条带处于被擦除状态的机率很低,在大多数情况下,检查物理地址是否处于被擦除状态的操作将引入额外的延迟。在本实施例中,在获得读命令要访问的物理地址后,不检查物理地址所在的物理块或块条带是否处于被擦除状态,而直接从物理地址读出数据,并依赖于读取数据结果提供的指示来判断所读取的物理页是否处于被擦除状态。从而仅在所读取的物理页处于被擦除状态时,进行额外的处理,降低了读命令的平均处理延迟。图8是根据本申请实施例的写位置表。写位置表820中记录了当前被写入块或大块中当前要被写入的位置。当前要写入的位置可以是物理块中的页(由页地址或页号指示),也可以是大块中的页条带中要被写入的位置。在根据本发明的实施例中,在响应写命令时,控制部件顺序地为写命令分配要写入的物理地址。例如,当前写位置是nvm芯片的第100块的第100页,在为写命令分配物理地址时,将第100块的第100页的物理地址分配给写命令,并将分配的物理地址记录在ftl表的表项中,以及使当前写位置递增(变为第100块的第101页)。而再次响应写命令时,为写命令分配新的当前写位置(第100块的第101页)的物理地址。可选地,控制部件在同一时刻仅向一个或少量的物理块或大块写入数据,因而,写位置表820中仅需提供一个或少量表项,而不会占据大量存储空间。在另一个例子中,当前写位置指示页条带中当前要被写入的逻辑单元(lun),例如第100块条带的第100页条带的第3个逻辑单元。在为写命令分配物理地址时,将第100块条带的第100页条带的第3个逻辑单元所对应的页的物理地址分配给写命令,并将分配的物理地址记录在ftl表的表项中,以及使当前写位置递增(变为第100块条带的第100页条带的第4个逻辑单元)。而再次响应写命令时,为写命令分配新的当前写位置(第100块条带的第100页条带的第4个逻辑单元)的物理地址。控制部件还维护物理块或大块处于被擦除或已写入的状态(也参看图6)。控制部件通过闪存接口向nvm芯片发出读命令前,用从ftl表项获取的物理地址得到该物理地址所在的物理块或大块。查询该物理块或大块的状态。若该物理块处于被擦除状态,则重放读命令。若该物理块或大块处于已写入状态,则进一步比较物理块或大块的当前写入位置是否超前于从ftl表项获取的物理地址。从写位置表(参见图8)中获取物理块或大块的当前写入位置,并与从ftl表项中获取的物理地址进行比较。若当前写入位置超前于物理地址,表明该物理地址已经被写入数据,从而向该物理地址发出读命令并读出数据。若当前写入位置不超前或落后于该物理地址,表明该物理地址尚未被写入数据,此时无法从该物理地址读出正确的数据,因而重放该读命令,或者暂停对该读命令的处理,等待当前写入位置超前于该物理地址。在当前写入位置超前于该物理地址后,再从该物理地址读出数据。根据本申请的又一实施例,在从ftl表获得读命令对应的物理地址后,不首先检查该物理地址所在的物理块或块条带是否处于擦除状态。因为该物理地址所在的物理块或块条带处于擦除状态的机率很低,在大多数情况下,检查是否处于擦除状态的操作将引入额外的延迟。而是,直接从该物理地址读出数据,并依赖于读取数据结果提供的指示来判断所读取的物理页是否处于擦除状态。从而仅在所读取的物理页处于擦除状态时,进行额外的处理,降低了读命令的平均处理延迟。若读取数据结果指示该物理地址对应的物理页处于擦除状态,依据该物理地址获取对应的物理块或大块,获取对应的物理块或大块的状态。若该物理地址所在的物理块或大块处于已写入状态,则进一步判断判断当前写入位置是否超前于该物理地址。若当前写入位置超前于该物理地址,表明该物理地址已经被写入数据,从而向该物理地址发出读命令并读出数据。若当前写入位置不超前或落后于该物理地址,表明该物理地址尚未被写入数据,此时无法从该物理地址读出正确的数据,因而暂停对该读命令的处理,等待当前写入位置超前于该物理地址。在当前写入位置超前于该物理地址后,再从该物理地址读出数据。若该物理地址所在的物理块或大块处于被擦除状态,则再次访问ftl表并获取更新后的物理地址。以及接下来,判断更新后的物理地址与当前写入位置的关系并进行后续处理。上面的实施例中,基于对读命令访问的物理地址的检查,处理读取被擦除页的情况。在根据本申请的依然又一实施例中,基于逻辑地址处理读取被擦除页的情况。参看图4的步骤440,响应于处理读命令,例如,cpu240或cpu250为每个在处理中的读命令维护元数据。元数据包括读命令所在的逻辑地址块的更新计数。作为举例,更新计数的初始值是0。同读命令对应的逻辑地址块是包含读命令所访问的逻辑地址的连续的逻辑地址范围。作为举例,每个逻辑地址块包括数百-数千个ftl表的条目所指示的逻辑地址。作为又一个例子,每个逻辑地址块包括的逻辑地址范围大小同物理块的物理地址范围相同,或者每个逻辑地址块包括的逻辑地址范围大小是物理块的物理地址范围的倍数。每个逻辑地址块可具有相同的逻辑地址范围,并且按逻辑地址相邻地排列。继续参看图4,在步骤470或步骤480,响应于对写命令进行处理,还检查写命令访问的逻辑地址对应的逻辑地址块,是否同处理中的读命令对应的逻辑地址块相同。若写命令访问的逻辑地址的逻辑地址块,同处理中的读命令(记为r1)对应的逻辑地址块相同,将读命令r1的元数据中的逻辑地址块的更新计数递增,以指示该逻辑地址块所指示的逻辑地址范围中有正在处理的写命令。若写命令访问的逻辑地址的逻辑地址块,同处理中的多个读命令(记为r2、r3)对应的逻辑地址块相同,将读命令r2与读命令r3的元数据中的逻辑地址块的更新计数分别递增,以指示同读命令r2与读命令r3对应的逻辑地址块所指示的逻辑地址范围中有正在处理的写命令。正在处理的写命令,可能导致指示同逻辑地址块对应的逻辑地址的ftl表条目的物理地址被更新。进而导致访问相同ftl表条目的读命令访问到更新前的物理地址。进一步地,更新前的物理地址有一定几率被擦除,并导致读命令访问到被擦除的物理地址。作为又一个例子,在步骤440,处理中的读命令的元数据记录读命令所访问的逻辑地址的更新计数。而在步骤470或步骤480,响应于写命令访问的逻辑地址同处理中的读命令所访问的逻辑地址相同或相交叠,将读命令的更新计数递增。可选地,在在步骤470或步骤480,响应于写命令对应的逻辑地址块同处理中的读命令对应的逻辑地址块的逻辑地址范围相同或相交叠,将读命令的更新计数递增。图9是根据本申请依然又一实施例中处理读命令的扩展流程图。响应于从nvm芯片获取了读命令所访问的数据(910),识别读命令所对应的逻辑地址块是否被更新(920)。作为举例,若读命令对应的逻辑地址块所指示的逻辑地址范围中,有任一逻辑地址对应的ftl表条目被更新,则认为该读命令对应的逻辑地址块被更新。作为又一个例子,依据读命令的元数据的更新计数大于初始值(例如0),认为读命令的逻辑地址对应的ftl表条目被更新。若步骤920识别读命令对应的逻辑地址块未被更新,则获取的读命令所访问的数据有效,向主机提供所读取的数据(930)。若步骤920识别读命令对应的逻辑地址块在读命令处理期间已被更新,则读命令所访问的数据可能是无效的,对读命令重新处理。为重新处理读命令,检查读命令与排序集合中的元素是否存在冲突(940)。若读命令与排序集合中的元素不存在冲突,再次对读命令进行处理,再次访问ftl表获取物理地址,从物理地址再次读取数据,并将读取的数据提供给主机。作为一个例子,在步骤440,还在读命令的元数据中还记录从ftl表获取的物理地址,而在步骤960,还识别从ftl表中再次获取的物理地址同元数据中记录的物理地址是否一致。若从ftl表中再次获取的物理地址同元数据中记录的物理地址不同,则再次从物理地址读取数据,并将读取的数据提供给主机。若从ftl表中再次获取的物理地址同元数据中记录的物理地址相同,则无须再次物理地址读取数据,而将步骤910中获取的数据提供给主机。作为又一个例子,在步骤440,无须在读命令的元数据中记录从ftl表获取的物理地址。以及在步骤960,从ftl表获取物理地址,但无须识别物理地址在读命令被处理期间是否被更新。并再次从物理地址读取数据,并将读取的数据提供给主机。若读命令与排序集合中的元素存在冲突,将读命令添加到等待io命令子集(也参看图4的步骤450)。响应于读命令处理完成(930),还释放读命令的元数据。对读命令之一(例如r2)的元数据的释放,不影响其他读命令(例如r3)的元数据。即使读命令r2与读命令r3对应的逻辑地址块相同或相交叠。尽管已描述了本申请的优选实施例,但本领域技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。显然,本领域技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1