1.本发明涉及存储领域,具体涉及一种数据存储方法、系统、设备以及存储介质。
背景技术:
2.目前大数据的存储装置大多将nand flash作为存储介质,而nand flash的特点是只有擦除数据后才能重新写入数据。nand flash的擦除单位为block,写数据和读数据单位为page,但是存储系统中host维护数据的基本单位通常是lba,所以需要有ftl算法来维护。
3.目前ftl算法通常有4k map、page map、block map三种。4k map是指ftl维护算法的基本逻辑单位是4k,将host的lba都转换为以4k为单位的映射。同理page map和block map是指ftl维护算法的基本逻辑单位是nand flash的page和block大小。
4.block map算法适合应用于硬件资源不是很丰富,产品成本比较低的存储产品中,因为block map用的存储映射表需要的空间比较小。目前block map算法中通常只用了一个线程去记录当前的写现场,如果下一条命令是跨lba的时候,由于当前内存中只有一个线程去记录写现场,所以需要结束这个线程,结束线程的方法是rebuild数据,即将所有这个逻辑block内有效的数据搬移到一个物理block中,才能释放线程,但是这样会增加写放大。
技术实现要素:
5.有鉴于此,为了克服上述问题的至少一个方面,本发明实施例提出一种数据存储方法,包括以下步骤:
6.响应于接收到写请求,根据所述写请求中携带的逻辑地址确定对应的逻辑block;
7.判断所述对应的逻辑block是否有线程维护;
8.响应于所述对应的逻辑block没有所述线程维护,判断当前所有线程的数量是否达到阈值;
9.响应于当前所有线程的数量未达到阈值,创建新的线程;
10.将所述写请求中待写入的数据写入空白的物理block中,并利用所述新的线程记录所述空白的物理block以及所述待写入的数据在所述对应的逻辑block中的位置。
11.在一些实施例中,还包括:
12.响应于所述对应的逻辑block有线程维护,将所述待写入的数据写入新的物理block中,并利用所述线程记录所述新的物理block以及所述待写入的数据在所述对应的逻辑block中的位置。
13.在一些实施例中,还包括:
14.响应于所述对应的逻辑block中所有位置均有对应的数据,将所述线程中记录的所有的物理block中的数据进行合并;
15.将合并后的数据存储到同一个物理block中并记录所述对应的逻辑block与所述同一个物理block的映射关系;
16.释放所述线程。
17.在一些实施例中,将所述线程中记录的所有的物理block中的数据进行合并,进一步包括:
18.响应于所述线程记录的若干个物理block中的数据在所述对应的逻辑block中位置相同,将若干个物理block中的最新的物理block存储的数据合并到所述同一个物理block。
19.在一些实施例中,还包括:
20.将所述所有的物理block中的数据清空。
21.在一些实施例中,还包括:
22.响应于当前所有线程的数量达到阈值,选择其中一个线程作为待释放线程;
23.将所述待释放线程中记录的所有的物理block中的数据进行合并;
24.将合并后的数据存储到同一个物理block中并记录所述待释放线程维护的逻辑block与所述同一个物理block的映射关系;
25.释放所述待释放线程。
26.在一些实施例中,将所述待释放线程中记录的所有的物理block中的数据进行合并,进一步包括:
27.响应于所述待释放线程记录的若干个物理block中的数据在所述维护的逻辑block中位置相同,将若干个物理block中的最新的物理block存储的数据合并到所述同一个物理block;
28.确定所述维护的逻辑block中尚未有对应的数据的位置的大小;
29.从其他物理block中获取与所述位置的大小相同的数据合并到所述同一个物理block。
30.基于同一发明构思,根据本发明的另一个方面,本发明的实施例还提供了一种数据存储系统,包括:
31.确定模块,配置为响应于接收到写请求,根据所述写请求中携带的逻辑地址确定对应的逻辑block;
32.第一判断模块,配置为判断所述对应的逻辑block是否有线程维护;
33.第二判断模块,配置为响应于所述对应的逻辑block没有所述线程维护,判断当前所有线程的数量是否达到阈值;
34.创建模块,配置为响应于当前所有线程的数量未达到阈值,创建新的线程;
35.记录模块,将所述写请求中待写入的数据写入空白的物理block中,并利用所述新的线程记录所述空白的物理block以及所述待写入的数据在所述对应的逻辑block中的位置。
36.基于同一发明构思,根据本发明的另一个方面,本发明的实施例还提供了一种计算机设备,包括:
37.至少一个处理器;以及
38.存储器,所述存储器存储有可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时执行如上所述的任一种数据存储方法的步骤。
39.基于同一发明构思,根据本发明的另一个方面,本发明的实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理
器执行时执行如上所述的任一种数据存储方法的步骤。
40.本发明具有以下有益技术效果之一:本发明提出的方案在接收到写请求后,首先根据写请求中携带的lba(逻辑地址)确定对应的逻辑block,若该逻辑block没有线程在维护,同时当前线程的总数量则没有超过阈值,则创建一个新的线程,利用新的线程维护该逻辑block,这样不需要rebuild当前线程,从而减小写放大。
附图说明
41.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的实施例。
42.图1为本发明的实施例提供的数据存储方法的流程示意图;
43.图2为本发明的实施例提供的数据存储系统的结构示意图;
44.图3为本发明的实施例提供的计算机设备的结构示意图;
45.图4为本发明的实施例提供的计算机可读存储介质的结构示意图。
具体实施方式
46.为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明实施例进一步详细说明。
47.需要说明的是,本发明实施例中所有使用“第一”和“第二”的表述均是为了区分两个相同名称非相同的实体或者非相同的参量,可见“第一”“第二”仅为了表述的方便,不应理解为对本发明实施例的限定,后续实施例对此不再一一说明。
48.在本发明的实施例中,block:nandflash的最小擦除单位。page:nandflash的最小写入和读取单位。ftl算法:由于host发送的是lba,nandflash只有page和block这些概念,所以需要ftl算法中间层来转换。跨lba区域顺序写:host写数据时先按顺序写一段lba,然后跳转一段lba顺序写另外一段lba。op block:物理nand flash的容量通常比上报给host的逻辑容量要大,物理nandflash的实际容量去掉host容量部分剩余的物理block,称之为op block。写放大:写放大是指写入nand flash的数据量与host数据的写入量的比值。
49.根据本发明的一个方面,本发明的实施例提出一种数据存储方法,如图1所示,其可以包括步骤:
50.s1,响应于接收到写请求,根据所述写请求中携带的逻辑地址确定对应的逻辑block;
51.s2,判断所述对应的逻辑block是否有线程维护;
52.s3,响应于所述对应的逻辑block没有所述线程维护,判断当前所有线程的数量是否达到阈值;
53.s4,响应于当前所有线程的数量未达到阈值,创建新的线程;
54.s5,将所述写请求中待写入的数据写入空白的物理block中,并利用所述新的线程记录所述空白的物理block以及所述待写入的数据在所述对应的逻辑block中的位置。
55.本发明提出的方案在接收到写请求后,首先根据写请求中携带的lba(逻辑地址)
确定对应的逻辑block,若该逻辑block没有线程在维护,同时当前线程的总数量则没有超过阈值,则创建一个新的线程,利用新的线程维护该逻辑block,这样不需要rebuild当前线程从而减小写放大。
56.在一些实施例中,步骤s1中,响应于接收到写请求,根据所述写请求中携带的逻辑地址确定对应的逻辑block,具体的,每一个逻辑block均有对应的逻辑地址且每一个逻辑block的大小相同,这样,当接收到写请求后,可以根据写请求中携带的逻辑地址确定对应的逻辑block。若写请求中携带的逻辑地址是跨逻辑block,后续需要根据确定出的多个逻辑block进行相同的处理流程。也即当确定出逻辑block后,则需要对每一个逻辑block执行步骤s2
‑
s5。
57.在一些实施例中,步骤s2中,判断所述对应的逻辑block是否有线程维护,具体的,一个线程可以维护一个逻辑block,利用线程可以记录该逻辑block中已经被占用的位置,以及逻辑block对应的物理block。
58.例如,一个逻辑block的大小为1m,并且其0.9m到1m的位置对应有数据,并且该数据实际存储在物理block1中,这时即可通过线程记录该逻辑block的第0.9m到1m的位置已经存在对应的数据,并且该数据存储在物理block1中。
59.在一些实施例中,步骤s3中,响应于所述对应的逻辑block没有所述线程维护,判断当前所有线程的数量是否达到阈值,具体的,由于每个线程需要耗费一定的内存资源去记录一些维护信息,同时还会占用一定的物理block,所以最大线程个数也不能太大,因为每个线程都会占用一定的op block,所以具体可以最大设置几个线程可以根据内存大小等其他情况来决定。
60.在一些实施例中,还包括:
61.响应于所述对应的逻辑block有线程维护,将所述待写入的数据写入新的物理block中,并利用所述线程记录所述新的物理block以及所述待写入的数据在所述对应的逻辑block中的位置。
62.具体的,若根据写请求中携带的逻辑地址确定的逻辑block判断有对应的线程在维护,则可以将写请求对应的数据写入新的物理block中,并利用线程记录所述新的物理block以及所述待写入的数据在所述对应的逻辑block中的位置。
63.在一些实施例中,还包括:
64.响应于所述对应的逻辑block中所有位置均有对应的数据,将所述线程中记录的所有的物理block中的数据进行合并;
65.将合并后的数据存储到同一个物理block中并记录所述对应的逻辑block与所述同一个物理block的映射关系;
66.释放所述线程。
67.在一些实施例中,将所述线程中记录的所有的物理block中的数据进行合并,进一步包括:
68.响应于所述线程记录的若干个物理block中的数据在所述对应的逻辑block中位置相同,将若干个物理block中的最新的物理block存储的数据合并到所述同一个物理block。
69.在一些实施例中,还包括:
70.将所述所有的物理block中的数据清空。
71.具体的,当根据线程记录的逻辑block的每一个位置均有对应的数据,则需要将该逻辑block对应的所有的物理block进行合并处理。
72.在进行合并处理时,若逻辑block相同的位置对应若干个物理block,即若干个物理block中均存储有该位置的数据,则需要根据线程记录的该位置最新存储的数据作为需要合并的数据,然后获取其他位置的数据后合并到一个物理block上,最后记录相应的映射关系并释放线程。
73.例如,若线程记录的一个逻辑block上的0
‑
0.9m的位置上对应的数据存储在物理block d上,而0.9m到1m的位置上分别在物理block a、物理block b、物理block c上均有对应的数据,且物理block b上的数据为0.9m到1m的位置对应的最新数据。则将物理block b上的数据以及物理block d上的数据合并到同一个物理block e上,然后清空block a、物理block b、物理block c、物理block d上的数据,并释放线程。
74.需要说明的是,逻辑block的大小和物理block的大小相同,并且若逻辑block的上每一个位置上均有对应的数据时,则无需线程进行维护,只需要建立该逻辑block与存储有所有数据的物理block的映射关系即可。并且如果写请求中携带的逻辑地址确定的逻辑block是之前已经将所有位置均有对应数据的逻辑block,并且该逻辑block没有线程维护,仍为该逻辑block创建一个线程进行维护。
75.在一些实施例中,还包括:
76.响应于当前所有线程的数量达到阈值,选择其中一个线程作为待释放线程;
77.将所述待释放线程中记录的所有的物理block中的数据进行合并;
78.将合并后的数据存储到同一个物理block中并记录所述待释放线程维护的逻辑block与所述同一个物理block的映射关系;
79.释放所述待释放线程。
80.在一些实施例中,将所述待释放线程中记录的所有的物理block中的数据进行合并,进一步包括:
81.响应于所述待释放线程记录的若干个物理block中的数据在所述维护的逻辑block中位置相同,将若干个物理block中的最新的物理block存储的数据合并到所述同一个物理block;
82.确定所述维护的逻辑block中尚未有对应的数据的位置的大小;
83.从其他物理block中获取与所述位置的大小相同的数据合并到所述同一个物理block。
84.具体的,若当前所有的线程均在进行维护相应的逻辑block,则需要选择其中一个线程释放掉,并且为了减少搬移的数据,需要选择一个搬移数据量最小的线程释放。在释放线程前,需要将该线程维护的逻辑block对应的所有物理block中的数据进行合并。同样的,若存在若干个物理block中的数据在所述维护的逻辑block中位置相同,选择最新的物理block存储的数据进行合并,并且从其他物理block中获取与逻辑block中尚未有对应的数据的位置的大小相同数据作为该位置对应的数据合并到同一个物理block中。
85.例如,若线程记录的一个逻辑block上的0
‑
0.8m的位置上对应的数据存储在物理block d上,0.8m
‑
0.9m的位置没有数据,而0.9m到1m的位置上分别在物理block a、物理
block b、物理block c上均有对应的数据,且物理block b上的数据为0.9m到1m的位置对应的最新数据。则将物理block b上的数据以及物理block d上的数据合并到同一个物理block e上,然后从物理block a或物理block c上获取0.1m大小的数据作为0.8m
‑
0.9m的位置的对应数据,合并到物理block e上。并且物理block b上的数据同样的为物理block e上0
‑
0.8m位置的数据,从物理block a或物理block c上获取0.1m大小的数据为物理block e上0.8
‑
0.9m位置的数据,物理block b上的数据为物理block e上0.9m
‑
1m位置的数据。然后清空block a、物理block b、物理block c、物理block d上的数据,并释放线程。
86.本发明提出的方案在接收到写请求后,首先根据写请求中携带的lba(逻辑地址)确定对应的逻辑block,若该逻辑block没有线程在维护,同时当前线程的总数量则没有超过阈值,则创建一个新的线程,利用新的线程维护该逻辑block,这样不需要rebuild当前线程从而减小写放大。
87.基于同一发明构思,根据本发明的另一个方面,本发明的实施例还提供了一种数据存储系统400,如图2所示,包括:
88.确定模块401,配置为响应于接收到写请求,根据所述写请求中携带的逻辑地址确定对应的逻辑block;
89.第一判断模块402,配置为判断所述对应的逻辑block是否有线程维护;
90.第二判断模块403,配置为响应于所述对应的逻辑block没有所述线程维护,判断当前所有线程的数量是否达到阈值;
91.创建模块404,配置为响应于当前所有线程的数量未达到阈值,创建新的线程;
92.记录模块405,将所述写请求中待写入的数据写入空白的物理block中,并利用所述新的线程记录所述空白的物理block以及所述待写入的数据在所述对应的逻辑block中的位置。
93.在一些实施例中,还包括第一响应模块,配置为:
94.响应于所述对应的逻辑block有线程维护,将所述待写入的数据写入新的物理block中,并利用所述线程记录所述新的物理block以及所述待写入的数据在所述对应的逻辑block中的位置。
95.在一些实施例中,还包括第二响应模块,配置为:
96.响应于所述对应的逻辑block中所有位置均有对应的数据,将所述线程中记录的所有的物理block中的数据进行合并;
97.将合并后的数据存储到同一个物理block中并记录所述对应的逻辑block与所述同一个物理block的映射关系;
98.释放所述线程。
99.在一些实施例中,第二响应模块还配置为:
100.响应于所述线程记录的若干个物理block中的数据在所述对应的逻辑block中位置相同,将若干个物理block中的最新的物理block存储的数据合并到所述同一个物理block。
101.在一些实施例中,第二响应模块还配置为:
102.将所述所有的物理block中的数据清空。
103.在一些实施例中,还包括第三响应模块,配置为:
104.响应于当前所有线程的数量达到阈值,选择其中一个线程作为待释放线程;
105.将所述待释放线程中记录的所有的物理block中的数据进行合并;
106.将合并后的数据存储到同一个物理block中并记录所述待释放线程维护的逻辑block与所述同一个物理block的映射关系;
107.释放所述待释放线程。
108.在一些实施例中,第三响应模块还配置为:
109.响应于所述待释放线程记录的若干个物理block中的数据在所述维护的逻辑block中位置相同,将若干个物理block中的最新的物理block存储的数据合并到所述同一个物理block;
110.确定所述维护的逻辑block中尚未有对应的数据的位置的大小;
111.从其他物理block中获取与所述位置的大小相同的数据合并到所述同一个物理block。
112.本发明提出的方案在接收到写请求后,首先根据写请求中携带的lba(逻辑地址)确定对应的逻辑block,若该逻辑block没有线程在维护,同时当前线程的总数量则没有超过阈值,则创建一个新的线程,利用新的线程维护该逻辑block,这样不需要rebuild当前线程,从而减小写放大。
113.基于同一发明构思,根据本发明的另一个方面,如图3所示,本发明的实施例还提供了一种计算机设备501,包括:
114.至少一个处理器520;以及
115.存储器510,存储器510存储有可在处理器上运行的计算机程序511,处理器520执行程序时执行以下步骤:
116.s1,响应于接收到写请求,根据所述写请求中携带的逻辑地址确定对应的逻辑block;
117.s2,判断所述对应的逻辑block是否有线程维护;
118.s3,响应于所述对应的逻辑block没有所述线程维护,判断当前所有线程的数量是否达到阈值;
119.s4,响应于当前所有线程的数量未达到阈值,创建新的线程;
120.s5,将所述写请求中待写入的数据写入空白的物理block中,并利用所述新的线程记录所述空白的物理block以及所述待写入的数据在所述对应的逻辑block中的位置。
121.在一些实施例中,还包括:
122.响应于所述对应的逻辑block有线程维护,将所述待写入的数据写入新的物理block中,并利用所述线程记录所述新的物理block以及所述待写入的数据在所述对应的逻辑block中的位置。
123.在一些实施例中,还包括:
124.响应于所述对应的逻辑block中所有位置均有对应的数据,将所述线程中记录的所有的物理block中的数据进行合并;
125.将合并后的数据存储到同一个物理block中并记录所述对应的逻辑block与所述同一个物理block的映射关系;
126.释放所述线程。
127.在一些实施例中,将所述线程中记录的所有的物理block中的数据进行合并,进一步包括:
128.响应于所述线程记录的若干个物理block中的数据在所述对应的逻辑block中位置相同,将若干个物理block中的最新的物理block存储的数据合并到所述同一个物理block。
129.在一些实施例中,还包括:
130.将所述所有的物理block中的数据清空。
131.在一些实施例中,还包括:
132.响应于当前所有线程的数量达到阈值,选择其中一个线程作为待释放线程;
133.将所述待释放线程中记录的所有的物理block中的数据进行合并;
134.将合并后的数据存储到同一个物理block中并记录所述待释放线程维护的逻辑block与所述同一个物理block的映射关系;
135.释放所述待释放线程。
136.在一些实施例中,将所述待释放线程中记录的所有的物理block中的数据进行合并,进一步包括:
137.响应于所述待释放线程记录的若干个物理block中的数据在所述维护的逻辑block中位置相同,将若干个物理block中的最新的物理block存储的数据合并到所述同一个物理block;
138.确定所述维护的逻辑block中尚未有对应的数据的位置的大小;
139.从其他物理block中获取与所述位置的大小相同的数据合并到所述同一个物理block。
140.本发明提出的方案在接收到写请求后,首先根据写请求中携带的lba(逻辑地址)确定对应的逻辑block,若该逻辑block没有线程在维护,同时当前线程的总数量则没有超过阈值,则创建一个新的线程,利用新的线程维护该逻辑block,这样不需要rebuild当前线程,从而减小写放大。
141.基于同一发明构思,根据本发明的另一个方面,如图4所示,本发明的实施例还提供了一种计算机可读存储介质601,计算机可读存储介质601存储有计算机程序指令610,计算机程序指令610被处理器执行时执行以下步骤:
142.s1,响应于接收到写请求,根据所述写请求中携带的逻辑地址确定对应的逻辑block;
143.s2,判断所述对应的逻辑block是否有线程维护;
144.s3,响应于所述对应的逻辑block没有所述线程维护,判断当前所有线程的数量是否达到阈值;
145.s4,响应于当前所有线程的数量未达到阈值,创建新的线程;
146.s5,将所述写请求中待写入的数据写入空白的物理block中,并利用所述新的线程记录所述空白的物理block以及所述待写入的数据在所述对应的逻辑block中的位置。
147.在一些实施例中,还包括:
148.响应于所述对应的逻辑block有线程维护,将所述待写入的数据写入新的物理block中,并利用所述线程记录所述新的物理block以及所述待写入的数据在所述对应的逻
辑block中的位置。
149.在一些实施例中,还包括:
150.响应于所述对应的逻辑block中所有位置均有对应的数据,将所述线程中记录的所有的物理block中的数据进行合并;
151.将合并后的数据存储到同一个物理block中并记录所述对应的逻辑block与所述同一个物理block的映射关系;
152.释放所述线程。
153.在一些实施例中,将所述线程中记录的所有的物理block中的数据进行合并,进一步包括:
154.响应于所述线程记录的若干个物理block中的数据在所述对应的逻辑block中位置相同,将若干个物理block中的最新的物理block存储的数据合并到所述同一个物理block。
155.在一些实施例中,还包括:
156.将所述所有的物理block中的数据清空。
157.在一些实施例中,还包括:
158.响应于当前所有线程的数量达到阈值,选择其中一个线程作为待释放线程;
159.将所述待释放线程中记录的所有的物理block中的数据进行合并;
160.将合并后的数据存储到同一个物理block中并记录所述待释放线程维护的逻辑block与所述同一个物理block的映射关系;
161.释放所述待释放线程。
162.在一些实施例中,将所述待释放线程中记录的所有的物理block中的数据进行合并,进一步包括:
163.响应于所述待释放线程记录的若干个物理block中的数据在所述维护的逻辑block中位置相同,将若干个物理block中的最新的物理block存储的数据合并到所述同一个物理block;
164.确定所述维护的逻辑block中尚未有对应的数据的位置的大小;
165.从其他物理block中获取与所述位置的大小相同的数据合并到所述同一个物理block。
166.本发明提出的方案在接收到写请求后,首先根据写请求中携带的lba(逻辑地址)确定对应的逻辑block,若该逻辑block没有线程在维护,同时当前线程的总数量则没有超过阈值,则创建一个新的线程,利用新的线程维护该逻辑block,这样不需要rebuild当前线程,从而减小写放大。
167.最后需要说明的是,本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,可以通过计算机程序来指令相关硬件来完成,程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。
168.此外,应该明白的是,本文的计算机可读存储介质(例如,存储器)可以是易失性存储器或非易失性存储器,或者可以包括易失性存储器和非易失性存储器两者。
169.本领域技术人员还将明白的是,结合这里的公开所描述的各种示例性逻辑块、模块、电路和算法步骤可以被实现为电子硬件、计算机软件或两者的组合。为了清楚地说明硬
件和软件的这种可互换性,已经就各种示意性组件、方块、模块、电路和步骤的功能对其进行了一般性的描述。这种功能是被实现为软件还是被实现为硬件取决于具体应用以及施加给整个系统的设计约束。本领域技术人员可以针对每种具体应用以各种方式来实现的功能,但是这种实现决定不应被解释为导致脱离本发明实施例公开的范围。
170.以上是本发明公开的示例性实施例,但是应当注意,在不背离权利要求限定的本发明实施例公开的范围的前提下,可以进行多种改变和修改。根据这里描述的公开实施例的方法权利要求的功能、步骤和/或动作不需以任何特定顺序执行。此外,尽管本发明实施例公开的元素可以以个体形式描述或要求,但除非明确限制为单数,也可以理解为多个。
171.应当理解的是,在本文中使用的,除非上下文清楚地支持例外情况,单数形式“一个”旨在也包括复数形式。还应当理解的是,在本文中使用的“和/或”是指包括一个或者一个以上相关联地列出的项目的任意和所有可能组合。
172.上述本发明实施例公开实施例序号仅仅为了描述,不代表实施例的优劣。
173.本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
174.所属领域的普通技术人员应当理解:以上任何实施例的讨论仅为示例性的,并非旨在暗示本发明实施例公开的范围(包括权利要求)被限于这些例子;在本发明实施例的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,并存在如上的本发明实施例的不同方面的许多其它变化,为了简明它们没有在细节中提供。因此,凡在本发明实施例的精神和原则之内,所做的任何省略、修改、等同替换、改进等,均应包含在本发明实施例的保护范围之内。
再多了解一些
本文用于企业家、创业者技术爱好者查询,结果仅供参考。