一种基于SIMD提高JVM性能的方法与流程

文档序号:32418475发布日期:2022-12-02 22:36阅读:373来源:国知局
一种基于SIMD提高JVM性能的方法与流程
一种基于simd提高jvm性能的方法
技术领域
1.本发明具体涉及java虚拟机技术领域,具体是一种基于simd提高jvm性能的方法。


背景技术:

2.计算机程序需要编译成指令才能让cpu识别并执行运算。所以,cpu指令处理数据的能力是衡量cpu性能的重要指标。为了提高cpu指令处理数据的能力,半导体厂商在cpu中推出了一些可以同时并行处理多个数据的指令——simd指令。
3.simd的全称是single instruction multiple data,中文名“单指令多数据”,顾名思义,一条指令处理多个数据;以加法指令为例,单指令单数据(sisd)的cpu对加法指令译码后,执行部件先访问内存,取得第一个操作数;之后再一次访问内存,取得第二个操作数;随后才能进行求和运算。而在simd型的cpu中,指令译码后几个执行部件同时访问内存,一次性获得所有操作数进行运算,这个特点使simd特别适合于多媒体应用等数据密集型运算。
4.jvm是java virtual machine(java虚拟机)的缩写,jvm是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入java语言虚拟机后,java语言在不同平台上运行时不需要重新编译。java语言使用java虚拟机屏蔽了与具体平台相关的信息,使得java语言编译程序只需生成在java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
5.现有技术中在进行java虚拟机运行时,针对循环代码往往循环大量次数之后才把这段代码执行完成,每次循环都是做简单又重复的工作,浪费cpu的处理能力,导致了java虚拟机的运行效率低下。


技术实现要素:

6.本发明的目的在于提供一种基于simd提高jvm性能的方法,以解决上述背景技术中提出的现有技术中在进行java虚拟机运行时,针对循环代码往往循环大量次数之后才把这段代码执行完成,每次循环都是做简单又重复的工作,浪费cpu的处理能力,导致了java虚拟机的运行效率低下的问题。
7.为实现上述目的,本发明提供如下技术方案:
8.一种基于simd提高jvm性能的方法,包括以下步骤:
9.s10、获取java代码中的循环逻辑指令,处理编译后的循环逻辑指令,得到simd指令集;
10.s20、解析java指令中的循环逻辑运算操作,得到汇编指令;
11.s30、将汇编指令通过simd指令集发送给cpu;
12.s40、获取cpu通过simd运算后返回的计算结果。
13.jvm(java虚拟机)是一种二进制字节码的运行环境,负责装载字节码到其内部,解释/编译成对应平台(unix、windows等)的机器指令执行,java虚拟机包括jvm运行时数据区
和解析jvm运行时数据区,所述解析jvm运行时数据区包括方法区、java堆、程序计数器和java虚拟机栈,其中:
14.方法区:方法区是所有线程共享的内存区域,它用于存储已被java虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据;方法区又称非堆,当方法区无法满足内存分配需求时,抛出outofmemoryerror异常;
15.java堆:java堆是java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例;
16.程序计数器:程序计数器是一块较小的内存空间,它可以看作是:保存当前线程所正在执行的字节码指令的地址(行号);由于java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器,各个线程之间计数器互不影响,独立存储,称之为“线程私有”的内存;程序计数器内存区域是虚拟机中唯一没有规定outofmemoryerror情况的区域。
17.java虚拟机栈:java虚拟机是线程私有的,它的生命周期和线程相同,java虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(stack frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
18.作为本发明进一步的方案:步骤s10中,处理编译后的循环逻辑指令的方法,包括以下步骤:
19.s11、jvm逐条编译java代码,产生与java代码对应的编译结果,将所述编译结果发送给cpu,所述编译结果包括编译后的循环逻辑指令;
20.s12、基于编译后的循环逻辑指令修改jvm原有使用单指令集的处理逻辑,得到simd指令集。
21.作为本发明再进一步的方案:单指令流多数据流(英语:single instruction multiple data,缩写:simd)是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据向量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术,simd指令集为mmx(multi-media extension,多媒体扩展)指令集,mmx指令集是intel设计的一种simd多媒体指令集、sse指令集(streaming simd extensions)、se2(streaming simd extensions 2)指令集和sse3(streaming simd extensions 3)指令集中的一种。
22.作为本发明再进一步的方案:在本发明实施例步骤s12中,基于编译后的循环逻辑指令修改jvm原有使用单指令集的处理逻辑的方法为,通过并行运算逻辑替换单指令集的处理逻辑。
23.作为本发明再进一步的方案:所述并行运算逻辑包括以下步骤:
24.s121、获取第一存储区域的第一操作数和第二存储区域的第二操作数;
25.s122、以相同的划分方式对第一操作数和第二操作数的字节数进行划分,得到至少两份数据,每份数据具有相应的位置;
26.s123、将第一操作数和第二操作数对应位置的数据进行运算,得到运算结果。
27.作为本发明再进一步的方案:步骤s122中,所述划分方式为:基于操作数的字节数n,将该操作数均分为n份数据,每份数据具有的字节数:
[0028][0029]
作为本发明再进一步的方案:所述循环逻辑指令包括循环加法运算、循环减法运算、循环乘法运算和循环除法运算。
[0030]
作为本发明再进一步的方案:步骤s30中,cpu的simd指令集用于同时将所有的数据一次性装载到cpu中,只需要执行一次操作。
[0031]
作为本发明再进一步的方案:步骤s40中,cpu通过simd运算的方法包括以下步骤:
[0032]
s41、获取第一simd大小的整数a和第二simd大小的整数b;
[0033]
s42、对第一simd大小的整数a和第二simd大小的整数b的相对应元素进行元素级simd进行逻辑运算,以生成simd大小的整数结果r和进位位;以及
[0034]
响应于a的整数大小大于b的整数大小,鉴于不具有相对应的b的元素或多个元素的a的一个或多个元素,更新r和进位位。
[0035]
作为本发明再进一步的方案:步骤s42中,第一simd大小的整数a和第二simd大小的整数b均具有整数大小。
[0036]
本发明还公开了一种基于simd提高jvm性能的系统,所述系统包括指令获取单元、存储单元和cpu,所述cpu与指令获取单元、存储单元连接,其中:
[0037]
指令获取单元,所述指令获取单元用于获取操作数、java代码和java指令;
[0038]
存储单元,所述存储单元用于装载并运行java虚拟机,所述java虚拟机用于基于java代码生成simd指令集;
[0039]
cpu,用于基于java指令和simd指令集对操作数进行计算,得到计算结果。
[0040]
与现有技术相比,本发明的有益效果是:本发明将常用的数据循环逻辑运算操作解析成simd指令集,基于simd指令集以执行一次操作的方式将所有的数据一次性装载到cpu中,从而提高了数据运算效率,避免cpu重复执行简单的工作,节约了cpu的处理性能,提高了java虚拟机的运行效率。
附图说明
[0041]
图1为基于simd提高jvm性能的方法的流程图。
[0042]
图2为基于simd提高jvm性能的方法中步骤s10的流程图。
[0043]
图3为基于simd提高jvm性能的方法中步骤s12的流程图。
[0044]
图4为基于simd提高jvm性能的方法中simd进行计算时的示意图。
[0045]
图5为基于simd提高jvm性能的系统的结构框图。
具体实施方式
[0046]
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0047]
jvm是java virtual machine(java虚拟机)的缩写,jvm是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实
现的。引入java语言虚拟机后,java语言在不同平台上运行时不需要重新编译。java语言使用java虚拟机屏蔽了与具体平台相关的信息,使得java语言编译程序只需生成在java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
[0048]
现有技术中在进行java虚拟机运行时,针对循环代码往往循环大量次数之后才把这段代码执行完成,每次循环都是做简单又重复的工作,浪费cpu的处理能力,导致了java虚拟机的运行效率低下,下面结合实施例具体说明:
[0049]
实施例1
[0050]
请参阅图1-3,本发明实施例中,一种基于simd提高jvm性能的方法,包括以下步骤:
[0051]
s10、获取java代码中的循环逻辑指令,处理编译后的循环逻辑指令,得到simd指令集;
[0052]
在本发明实施例步骤s10中,处理编译后的循环逻辑指令的方法,包括以下步骤:
[0053]
s11、jvm逐条编译java代码,产生与java代码对应的编译结果,将所述编译结果发送给cpu,所述编译结果包括编译后的循环逻辑指令;
[0054]
s12、基于编译后的循环逻辑指令修改jvm原有使用单指令集的处理逻辑,得到simd指令集;
[0055]
需要说明的是,jvm(java虚拟机)是一种二进制字节码的运行环境,负责装载字节码到其内部,解释/编译成对应平台(unix、windows等)的机器指令执行,每一条java指令,java虚拟机规范中都有其详细定义,例如如何取操作数,如何处理操作数等;
[0056]
进一步的,java虚拟机包括jvm运行时数据区和解析jvm运行时数据区,所述解析jvm运行时数据区包括方法区、java堆、程序计数器和java虚拟机栈,其中:
[0057]
方法区:方法区是所有线程共享的内存区域,它用于存储已被java虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据;方法区又称非堆,当方法区无法满足内存分配需求时,抛出outofmemoryerror异常;
[0058]
java堆:java堆是java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例;在java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配;java堆是垃圾收集器管理的主要区域,因此也被成为“gc堆”;从内存回收角度来看java堆可分为:新生代和老生代;从内存分配的角度看,线程共享的java堆中可能划分出多个线程私有的分配缓冲区;
[0059]
java堆无论怎么划分,都与存放内容无关,无论哪个区域,存储的都是对象实例,进一步的划分都是为了更好的回收内存,或者更快的分配内存。
[0060]
根据java虚拟机规范的规定,java堆可以处于物理上不连续的内存空间中。当前主流的虚拟机都是可扩展的,如果堆中没有内存可以完成实例分配,并且堆也无法再扩展时,将会抛出outofmemoryerror异常;
[0061]
程序计数器:程序计数器是一块较小的内存空间,它可以看作是:保存当前线程所正在执行的字节码指令的地址(行号);由于java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器,各个线程之间计数器互不影响,独立存储,称之为“线程私有”的内存;程序计数器内存区域是虚拟机中
唯一没有规定outofmemoryerror情况的区域。
[0062]
java虚拟机栈:java虚拟机是线程私有的,它的生命周期和线程相同,java虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(stack frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
[0063]
另外,单指令流多数据流(英语:single instruction multiple data,缩写:simd)是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据向量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术,simd指令集为mmx(multi-media extension,多媒体扩展)指令集,mmx指令集是intel设计的一种simd多媒体指令集、sse指令集(streaming simd extensions)、se2(streaming simd extensions 2)指令集和sse3(streaming simd extensions 3)指令集中的一种。
[0064]
还有,在本发明实施例步骤s12中,基于编译后的循环逻辑指令修改jvm原有使用单指令集的处理逻辑的方法为,通过并行运算逻辑替换单指令集的处理逻辑,其中,并行运算逻辑包括以下步骤:
[0065]
s121、获取第一存储区域的第一操作数和第二存储区域的第二操作数;
[0066]
s122、以相同的划分方式对第一操作数和第二操作数的字节数进行划分,得到至少两份数据,每份数据具有相应的位置;
[0067]
s123、将第一操作数和第二操作数对应位置的数据进行运算,得到运算结果;
[0068]
需要说明的是,步骤s122中,所述划分方式为:基于操作数的字节数n,将该操作数均分为n份数据,每份数据具有的字节数:
[0069]
例如将16位操作数均分位4份数据,每份数据具有的字节数为4。
[0070]
在本发明实施例中,所述循环逻辑指令包括循环加法运算、循环减法运算、循环乘法运算和循环除法运算。
[0071]
请参阅图4,所述的simd实际上是利用向量化计算(vectorization、vectorized operation或array programming),将多次for循环计算变成一次计算,这种将多次for循环计算变成一次计算完全仰仗于cpu的simd指令集,simd指令可以在一条cpu指令上处理2、4、8或者更多份的数据,在intel处理器上,这种处理技术称之为sse以及后来的avx;在arm处理器上,这种处理技术称之为neon。
[0072]
因此,向量化计算就是将一个loop——处理一个array的时候每次处理1个数据共处理n次,转化为vectorization——处理一个array的时候每次同时处理8个数据共处理n/8次。
[0073]
s20、解析java指令中的循环逻辑运算操作,得到汇编指令;
[0074]
s30、将汇编指令通过simd指令集发送给cpu;
[0075]
在本发明实施例步骤s30中,cpu的simd指令集可以同时将所有的数据一次性装载到cpu中,只需要执行一次操作;
[0076]
s40、获取cpu通过simd运算后返回的计算结果;
[0077]
进一步的,在本发明实施例步骤s40中,cpu通过simd运算的方法包括以下步骤:
[0078]
s41、获取第一simd大小的整数a和第二simd大小的整数b;
[0079]
s42、对第一simd大小的整数a和第二simd大小的整数b的相对应元素进行元素级
simd进行逻辑运算,以生成simd大小的整数结果r和进位位;以及
[0080]
响应于a的整数大小大于b的整数大小,鉴于不具有相对应的b的元素或多个元素的a的一个或多个元素,更新r和进位位;
[0081]
在本实施例步骤s42中,第一simd大小的整数a和第二simd大小的整数b均具有整数大小。
[0082]
实施例2
[0083]
请参阅图1-3,本发明实施例中,一种基于simd提高jvm性能的方法,包括以下步骤:
[0084]
s10、获取java代码中的循环逻辑指令,处理编译后的循环逻辑指令,得到simd指令集;
[0085]
在本发明实施例步骤s10中,处理编译后的循环逻辑指令的方法,包括以下步骤:
[0086]
s11、jvm逐条编译java代码,产生与java代码对应的编译结果,将所述编译结果发送给cpu,所述编译结果包括编译后的循环逻辑指令;
[0087]
s12、基于编译后的循环逻辑指令修改jvm原有使用单指令集的处理逻辑,得到simd指令集;
[0088]
需要说明的是,jvm是一种二进制字节码的运行环境,负责装载字节码到其内部,解释/编译成对应平台(unix、windows等)的机器指令执行,每一条java指令,java虚拟机规范中都有其详细定义,例如如何取操作数,如何处理操作数等;
[0089]
进一步的,java虚拟机包括jvm运行时数据区和解析jvm运行时数据区,所述解析jvm运行时数据区包括方法区、java堆、程序计数器和java虚拟机栈,其中:
[0090]
方法区:方法区是所有线程共享的内存区域,它用于存储已被java虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据;方法区又称非堆,当方法区无法满足内存分配需求时,抛出outofmemoryerror异常;
[0091]
java堆:java堆是java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例;在java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配;java堆是垃圾收集器管理的主要区域,因此也被成为“gc堆”;从内存回收角度来看java堆可分为:新生代和老生代;从内存分配的角度看,线程共享的java堆中可能划分出多个线程私有的分配缓冲区;
[0092]
java堆无论怎么划分,都与存放内容无关,无论哪个区域,存储的都是对象实例,进一步的划分都是为了更好的回收内存,或者更快的分配内存。
[0093]
根据java虚拟机规范的规定,java堆可以处于物理上不连续的内存空间中。当前主流的虚拟机都是可扩展的,如果堆中没有内存可以完成实例分配,并且堆也无法再扩展时,将会抛出outofmemoryerror异常;
[0094]
程序计数器:程序计数器是一块较小的内存空间,它可以看作是:保存当前线程所正在执行的字节码指令的地址(行号);由于java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器,各个线程之间计数器互不影响,独立存储,称之为“线程私有”的内存;程序计数器内存区域是虚拟机中唯一没有规定outofmemoryerror情况的区域。
[0095]
java虚拟机栈:java虚拟机是线程私有的,它的生命周期和线程相同,java虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(stack frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
[0096]
另外,单指令流多数据流(英语:single instruction multiple data,缩写:simd)是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据向量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术,simd指令集为mmx(multi-media extension,多媒体扩展)指令集,mmx指令集是intel设计的一种simd多媒体指令集、sse指令集(streaming simd extensions)、se2(streaming simd extensions 2)指令集和sse3(streaming simd extensions 3)指令集中的一种。
[0097]
还有,在本发明实施例步骤s12中,基于编译后的循环逻辑指令修改jvm原有使用单指令集的处理逻辑的方法为,通过并行运算逻辑替换单指令集的处理逻辑,其中,并行运算逻辑包括以下步骤:
[0098]
s121、获取第一存储区域的第一操作数和第二存储区域的第二操作数;
[0099]
s122、以相同的划分方式对第一操作数和第二操作数的字节数进行划分,得到至少两份数据,每份数据具有相应的位置;
[0100]
s123、将第一操作数和第二操作数对应位置的数据进行运算,得到运算结果;
[0101]
需要说明的是,步骤s122中,所述划分方式为:基于操作数的字节数n,将该操作数均分为n份数据,每份数据具有的字节数:
[0102]
例如将16位操作数均分位4份数据,每份数据具有的字节数为4。
[0103]
在本发明实施例中,所述循环逻辑指令包括循环加法运算、循环减法运算、循环乘法运算和循环除法运算。
[0104]
请参阅图4,所述的simd实际上是利用向量化计算(vectorization、vectorized operation或array programming),将多次for循环计算变成一次计算,这种将多次for循环计算变成一次计算完全仰仗于cpu的simd指令集,simd指令可以在一条cpu指令上处理2、4、8或者更多份的数据,在intel处理器上,这种处理技术称之为sse以及后来的avx;在arm处理器上,这种处理技术称之为neon。
[0105]
因此,向量化计算就是将一个loop——处理一个array的时候每次处理1个数据共处理n次,转化为vectorization——处理一个array的时候每次同时处理8个数据共处理n/8次。
[0106]
s20、解析java指令中的循环逻辑运算操作,得到汇编指令;
[0107]
s30、将汇编指令通过simd指令集发送给cpu;
[0108]
在本发明实施例步骤s30中,cpu的simd指令集可以同时将所有的数据一次性装载到cpu中,只需要执行一次操作;
[0109]
s40、获取cpu通过simd运算后返回的计算结果;
[0110]
进一步的,在本发明实施例步骤s40中,cpu通过simd运算的方法包括以下步骤:
[0111]
s41、获取第一simd大小的整数a和第二simd大小的整数b;
[0112]
s42、对第一simd大小的整数a和第二simd大小的整数b的相对应元素进行元素级simd进行逻辑运算,以生成simd大小的整数结果r和进位位;以及
[0113]
响应于a的整数大小大于b的整数大小,鉴于不具有相对应的b的元素或多个元素的a的一个或多个元素,更新r和进位位;
[0114]
在本实施例步骤s42中,第一simd大小的整数a和第二simd大小的整数b均具有整数大小。
[0115]
请参阅图5,本发明还公开了一种基于simd提高jvm性能的系统,所述系统包括指令获取单元、存储单元和cpu,所述cpu与指令获取单元、存储单元连接,其中:
[0116]
指令获取单元100,所述指令获取单元用于获取操作数、java代码和java指令;
[0117]
存储单元200,所述存储单元用于装载并运行java虚拟机,所述java虚拟机用于基于java代码生成simd指令集;
[0118]
cpu300,用于基于java指令和simd指令集对操作数进行计算,得到计算结果;
[0119]
在本发明实施例中,java虚拟机基于java代码生成simd指令集的方法,包括以下步骤:
[0120]
s11、jvm逐条编译java代码,产生与java代码对应的编译结果,将所述编译结果发送给cpu,所述编译结果包括编译后的循环逻辑指令;
[0121]
s12、基于编译后的循环逻辑指令修改jvm原有使用单指令集的处理逻辑,得到simd指令集。
[0122]
在本发明实施例中,基于java指令和simd指令集对操作数进行计算的方法,其步骤包括:
[0123]
s41、获取第一simd大小的整数a和第二simd大小的整数b;
[0124]
s42、对第一simd大小的整数a和第二simd大小的整数b的相对应元素进行元素级simd进行逻辑运算,以生成simd大小的整数结果r和进位位;以及
[0125]
响应于a的整数大小大于b的整数大小,鉴于不具有相对应的b的元素或多个元素的a的一个或多个元素,更新r和进位位。
[0126]
此外,一些实施例可包括具有用于在计算机上执行本说明书中记载的方法的程序的存储介质,其上存储有至少一条指令、至少一段程序、代码集或指令集,该至少一条指令、至少一段程序、代码集或指令集被处理器加载并执行时实现上述各方法实施例中的步骤,计算机可读记录介质的示例包括为了存储并执行程序命令而专门构成的硬件装置:诸如硬盘、软盘及磁带的磁介质、诸如cd-rom、dvd的光记录介质、诸如软盘的磁光介质及rom、ram、闪存等。程序命令的示例可包括:由编译器编写的机器语言代码以及使用解释器等而由计算机来执行的高级语言代。
[0127]
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过至少一条指令、至少一段程序、代码集或指令集来指令相关的硬件来完成,的至少一条指令、至少一段程序、代码集或指令集可存储于一非易失性计算机可读取存储介质中,该至少一条指令、至少一段程序、代码集或指令集在执行时,可包括如上述各方法的实施例的流程。其中,本技术所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。
[0128]
综上所述,本发明将常用的数据循环逻辑运算操作解析成simd指令集,基于simd指令集以执行一次操作的方式将所有的数据一次性装载到cpu中,从而提高了数据运算效率,避免cpu重复执行简单的工作,节约了cpu的处理性能,提高了java虚拟机的运行效率。
[0129]
对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。
[0130]
此外,应当理解,虽然本说明书按照实施方式加以描述,但并非每个实施方式仅包含一个独立的技术方案,说明书的这种叙述方式仅仅是为清楚起见,本领域技术人员应当将说明书作为一个整体,各实施例中的技术方案也可以经适当组合,形成本领域技术人员可以理解的其他实施方式。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1