采用用户空间存储驱动器内的多个排队结构来提高速度的制作方法

文档序号:16972442发布日期:2019-02-26 18:41阅读:157来源:国知局
采用用户空间存储驱动器内的多个排队结构来提高速度的制作方法

本公开的实施例总体涉及数据存储领域,具体涉及采用用户空间存储驱动器内的多个排队结构来提高速度。



背景技术:

数据存储系统是硬件和软件的布置,其通常包括耦合到非易失性数据存储设备(诸如磁盘驱动器、电子闪速驱动器和/或光学驱动器)的阵列的一个或多个存储处理器。存储处理器服务托管从主机接收到的输入/输出(i/o)操作。接收到的i/o操作指定将被写入、读取、创建或删除的存储对象(例如,逻辑磁盘或“lun”)。存储处理器运行软件,该软件管理进入的i/o操作并且执行各种数据处理任务以组织和保护从主机接收到并且被存储在非易失性数据存储设备上的主机数据。

一些数据存储系统采用存储栈将i/o操作从一个格式处理和转换到另一格式来提高速度和通用性。一旦i/o操作被转换为针对存储驱动器上的存储装置的物理区段的一组底层i/o操作,则这些底层i/o操作可以根据各种策略被排队和执行以确保公平和提高效率。



技术实现要素:

遗憾的是,当大量的底层i/o操作在短时间段内针对物理驱动器时,利用数个并行处理核心的常规数据存储系统可能经历性能限制。这主要归因于数个处理核心之间的队列上的锁竞争。当使用能够处理数个并发i/o操作的现代基于闪存的驱动器时,该竞争可能变得更显著,因为那些设备能够每秒处理数十万i/o操作(或更多),其可以容易地压垮具有锁竞争问题的单个队列。

因此,减小归因于锁定的性能退化将是期望的。该结果可以通过数据存储系统采用数个队列以减少锁竞争来完成。还将期望的是,在用户空间容器内的用户空间驱动器内执行该排队以允许在驱动器栈的故障的情况下向新用户空间容器的可移植性和快速的故障转移。这可以通过利用用户空间容器内的用户空间调度驱动器内的两个级别的数个队列执行排队来完成。用户空间调度驱动器可以出队到用户空间管理驱动器中,用户空间管理驱动器通过内核辅助驱动器的方式与基于内核的硬件驱动器通信。

在一个实施例中,执行一种处理针对具有多个处理核心(在下文中“核心”)的计算设备的存储设备的存储请求的方法。该方法包括:(a)通过在计算设备的用户空间内操作的第一存储驱动器将由计算设备的第一核心所发起的存储请求发送到第一用户空间队列,第一用户空间队列专用于来自第一核心的存储请求;(b)通过在用户空间内操作的第二存储驱动器将由计算设备的第二核心所发起的存储请求发送到第二用户空间队列,第二用户空间队列专用于来自第二核心的存储请求,第二核心与第一核心不同,并且第二用户空间队列与第一用户空间队列不同;(c)通过在用户空间内操作的第一存储驱动器将存储请求从第一用户空间队列和第二用户空间队列发送到一组用户空间分派队列,第一用户空间队列和第二用户空间队列不属于一组用户空间分派队列;(d)通过在用户空间内操作的第一存储驱动器将存储请求从一组用户空间分派驱动器发送到在计算设备的用户空间内操作的第二存储驱动器,第二存储驱动器与第一存储驱动器不同;以及(e)通过内核辅助功能的方式通过在用户空间内操作的第二存储驱动器将从第一存储驱动器接收到的存储请求发送到存储设备的硬件设备驱动器以用于由存储设备执行,存储设备的硬件设备驱动器在计算设备的内核内操作。还提供了用于执行类似方法的装置、系统和计算机程序产品。

前述发明内容出于说明性目的被呈现以辅助读者容易地理解本文所呈现的示例特征。然而,前述发明内容不旨在阐述所要求的元件或以任何方式限制其实施例。

附图说明

前述和其他特征和优点从如在附图中所图示的本发明的特定实施例的以下描述将是明显的,其中相同附图标记贯穿不同的视图指代相同或类似部分。

图1是描绘用于结合各种实施例使用的示例系统和装置的框图。

图2是描绘各种实施例的示例方法的流程图。

具体实施方式

实施例涉及用于提高多核数据存储系统中的性能同时允许在驱动器栈的故障的情况下的可移植性和快速的故障转移的技术。这可以通过数据存储系统采用数个队列以减少锁竞争来完成。利用分别在用户空间容器内的用户空间调度驱动器内的两个级别的数个队列来执行排队。用户空间调度驱动器可以出队到用户空间管理驱动器中,用户空间驱动器通过内核辅助驱动器的方式与基于内核的硬件驱动器通信。

图1描绘了包括充当数据存储系统(dss)的计算设备32的示例环境30。dss计算设备32可以是任何种类的计算设备,诸如例如个人计算机、工作站、服务器计算机、企业服务器、dss机架服务器、膝上型计算机、平板计算机、智能电话、移动计算机等。通常地,计算设备30是dss机架服务器。

dss计算设备32包括网络接口电路34、处理电路36、存储器40、存储接口电路42和持久数据存储驱动器44(被描绘为存储设备44a、可选的存储设备44b……)。dss计算设备32还可以包括如本领域中已知的其他组件,包括互连电路。

网络接口电路34可以包括一个或多个以太网卡、蜂窝调制解调器、光纤通道(fc)适配器、无线保真(wi-fi)无线网络适配器和/或用于连接到网络的其他设备(未描绘)。网络接口电路34允许dss计算设备32与能够将数据存储命令发送到dss计算设备用于实行的一个或多个主机设备(未描绘)通信。

处理电路36可以是被配置为执行操作的任何种类的处理器或处理器集,诸如例如微处理器、多核微处理器、数字信号处理器、片上系统、电子电路的集合、类似种类的控制器或以上的任何组合。处理电路36包括多个处理核心38(被描绘为核心38(1)、38(2)、38(3)……)。每个核心38可以是不同的物理核心或其可以是虚拟核心(例如,由于超线程)。因此,例如,如果dss计算设备32包括两个微处理器,每个微处理器具有启用超线程的四个物理核心,那么dss计算设备32将具有总计十六个核心38。在一些实施例中,dss计算设备32可以被构建为分别被安装在分离的板上的一组两个或更多个存储处理器(sp,未描绘的),每个sp具有其自身的网络接口电路34、处理电路36、存储器40和存储接口电路42,但是在他们之间共享存储设备44。在这样的实施例中,高速sp间总线可以连接sp。出于冗余和性能原因,可以存在被安装在dss30中的多于一个sp。在这些实施例中,出于本公开的目的,可以独立地考虑每个sp。

持久存储驱动器44可以包括任何种类的持久存储设备,诸如例如硬盘驱动器、固态存储设备(ssd)、闪速驱动器等。在典型的实施例中,存储设备44(例如,存储驱动器44a)中的一个或多个存储设备是ssd或闪速驱动器,其具有允许多于一个存储操作同时地由该存储设备44a执行的多个通道46(被描绘为通道46a-i、46a-ii……)。

存储接口电路42控制并且提供对持久存储驱动器44的访问。存储接口电路42可以包括例如scsi、sas、ata、sata、fc、m.2和/或其他类似控制器和端口。

存储器40可以是任何种类的数字系统存储器,诸如例如随机存取存储器(ram)。存储器40存储操作中的操作系统(os)内核50(例如,linux、unix、windows、macos或类似操作系统内核)。存储器40还包括可以在其内存储非内核os应用(未描绘)以及用户应用(未描绘)和数据(未描绘)的用户空间部分48。

如本领域中已知的,仅在内核50内运行的内核50和应用具有对dss计算系统32的硬件的直接访问。在用户空间48内运行的任何应用可以仅借助于对内核50的系统调用访问硬件。尽管如果被实现在内核50内(例如,作为硬件驱动器,诸如存储硬件驱动器66和辅助驱动器64)函数可以更快地执行,但是内核50变得越复杂,则内核50越可能崩溃,其可能要求整个dss32(或sp)重新启动,其可以引起大量的停机时间。因此,实现用户空间48内的复杂功能(诸如复杂存储驱动器栈)以避免使内核50崩溃是期望的。还将期望的是,在其自身的用户空间容器52内完全地实现存储驱动器栈,使得在崩溃的情况下,仅用户空间容器52需要被重新启动,而在用户空间48内运行的其他应用可以继续操作,其允许在崩溃的情况下甚至进一步减小的停机时间。用户空间容器52的用户还允许sp之间的容易的可移植性。用户空间48内的实现还允许内核50的容易的升级,而不必在升级之前重新编译和测试新os升级。

如所描绘的,使用用户空间驱动器54、56、58、60和62来实现用于dss计算设备32上的存储操作的存储栈。上文件系统驱动器54被配置为从主机接收基于文件的存储请求74,每个基于文件的存储请求74针对文件系统(未描绘),其最终由来自dss计算设备32的存储设备44中的一个或多个存储设备的存储所支持。上文件系统驱动器54将那些请求74转译为基于块的存储请求76,基于块的存储请求76针对文件系统驻留在其上的卷或逻辑盘(未描绘)的存储的特定块。上文件系统驱动器54将那些基于块的存储请求76发送到映射驱动器56。

在一些实施例中,映射驱动器56使用下层文件系统(未描绘)的容器文件(未描绘)来实现逻辑卷。因此,在这些实施例中,映射驱动器56将基于块的请求76转译为针对容器文件的基于文件的请求78。映射驱动器56还实现由从一个或多个存储设备44所汲取的存储区段(未描绘)组成的第二虚拟卷(未描绘)上的下层文件系统。在一些实施例中,映射驱动器56还引入归因于去重的地址转译、raid和其他服务。因此,映射驱动器56将基于文件的请求78转译回对特定存储驱动器44的基于块的请求80,其将存储栈向下发送到多核高速缓存58。

多核高速缓存58是驱动器栈的层,其为了针对由并行操作的数个核心38执行而优化的快速性能而利用存储器40(其可以包括一些持久或电池备用存储器(未描绘))的专用部分(未描绘)来存储与基于块的存储请求有关的数据。通常地,一旦基于块的存储请求80被放置在多核高速缓存58内(并且或者被放置在持久存储器中或者被镜像到另一sp上的备份副本),则其可以对栈确认,允许主机如同原始存储请求74已经被完全执行那样继续,即使数据尚未被冲刷到存储设备44上的最终后备存储库。在该背景中,核心38工作以将被高速缓存的数据冲刷到存储设备44。

每个核心38被配置为通过将分别针对特定存储驱动器44的特定地址范围的一个或多个底层数据存储命令82发送到作为调度驱动器60的存储栈的下一层来执行该冲刷。对于任何给定存储驱动器44a,调度驱动器60(其还可以被称为物理包驱动器)调度针对该存储驱动器44a的命令82的执行,这在存在来自数个不同的核心38的、针对相同存储驱动器82的许多同时命令82时是重要的。

每个核心38将其相应的存储命令82(被描绘为相应地与核心38(1)、38(2)、38(3)相对应的存储命令82(1)、82(2)、82(3))发送到特定每核心队列68(被描绘为每核心用户空间队列68a(1)、68a(2)、68a(3)……)。每个每核心队列68专用于来自针对特定存储设备44y的特定核心38(x)的存储命令82。对于每个特定存储设备44y,可以存在多达与在处理电路36内存在的核心38一样多的每核心队列68。在一些实施例中,可能的是,处理电路36的某些核心38可以不被配置为发送存储命令82以冲刷多核高速缓存58(例如,某些核心38可以专用于其他任务)。在这些实施例中,用于每个特定存储设备44y的每核心队列68的数目可以相反被限于可用于发送存储命令82的核心38的数目。因此,例如,如果处理电路36包括四个核心38,但是那些核心中的仅三个核心38(1)、38(2)、38(3)可用于发送存储命令82,则将存在用于存储设备44a的三个每核心用户空间队列68a(1)、68a(2)、68a(3)。

在接收到每个存储命令82时,调度驱动器60将其放置到适当的每核心用户空间队列68中(在每个队列的头部处)。在一些实施例中,调度驱动器60可以对每个每核心用户空间队列68内的各种存储命令82执行各种重排和/或合并操作。在一些实施例中,调度驱动器60可以通过在每核心用户空间队列68之间转移各种存储命令82来执行负载平衡操作。

调度驱动器60将存储命令82从针对特定存储设备44a的每个每核心用户空间队列68a的尾部出队到与该特定存储设备44a相关联的一组这样的分派队列70a(被描绘为分派队列70a-i、70a-ii……)中的适当的用户空间分派队列70。如果存在与用于该特定存储设备44a的分派队列70a相同数目的用于特定存储设备44a的每核心用户空间队列68a,那么每个每核心用户空间队列68a直接地出队到专用分派队列70a的头部。因此,例如,如果仅存在两个每核心用户空间队列68a(1)、68a(2),那么每核心用户空间队列68a(1)将从其尾部出队到分派队列70a-i的头部,并且每核心用户空间队列68a(2)将从其尾部出队到分派队列70a-ii的头部。如所描绘的,由于存在三个每核心用户空间队列68a(1)、68a(2)、68a(3)但是仅有两个分派队列70a-i、70a-ii,因而每核心用户空间队列68a(1)通过将存储命令84发送到分派队列70a-i的头部来从其尾部出队,而每核心用户空间队列68a(2)、68a(3)通过相应地将存储命令86a、86b发送到分派队列70a-ii的头部来从其相应的尾部交替出队。

调度驱动器60通常抑制对分派队列70执行重排、合并和负载平衡操作。

调度驱动器60将针对特定存储设备44a的相应通道46a的存储命令88从用于该特定存储设备44a的每个分派队列70a的尾部出队。因此,例如,如所描绘的,调度驱动器60将针对存储驱动器44a的通道46a-i的存储命令88-i从分派队列70a-i的尾部出队,并且将针对存储驱动器44a的通道46a-ii的存储命令88-ii从分派队列70a-ii的尾部出队。应当理解,在一些实施例中,取代针对特定通道46的出队,调度驱动器60可以简单地以循环的方式从针对特定存储驱动器44a的分派队列70a出队,这依赖于该特定存储驱动器44a的内置队列(未描绘)以对其各种通道46a并行执行操作。

应当理解,调度驱动器60不将存储命令88直接地出队到通道46a(或者直接地到存储设备44a),因为用户空间驱动器(诸如调度驱动器60)不能与硬件直接通信。另外,存在由中介管理驱动器62执行的附加管理任务,诸如链接初始化、链接服务、phy管理和i/o支持。由于管理驱动器62还在用户空间48内运行,因而其能够通过内核辅助驱动器64与在内核50中运行的存储硬件驱动器66通信。参见例如在2017年4月4日发布的美国专利号9,612,756,其全部内容和教导由该参考文献通过引用并入本文。因此,管理驱动器62将存储命令88-i、88-ii作为相应的存储命令90-i、90-ii转发到用于存储驱动器44a的存储硬件驱动器66a。在用户空间48内的管理驱动器62与内核50内的存储硬件驱动器66a之间的某些通信被禁止(或不可能)的意义上,辅助驱动器64被用于跨越用户空间48与内核50之间的障碍来转发这样的通信。最终,存储硬件驱动器66a将存储命令90-i、90-ii作为相应的存储命令92-i、92-ii转发到存储驱动器44a或其相应的通道46a-i、46a-ii。

在一些实施例中,存储器40还可以包括持久存储部分(未描绘)。存储器40的持久存储部分可以由一个或多个持久存储设备(诸如例如,盘)组成。存储器40的持久存储部分或持久存储驱动器44被配置为即使当dss计算设备32被断电时也存储程序和数据。os、应用和驱动器54、56、58、60、62、64、66通常被存储在存储器40的该持久存储部分中或在持久存储驱动器44上,使得在系统重新启动时,它们可以从存储器40的该持久存储部分或持久存储驱动器44被加载到存储器40的系统部分中。当以非暂态形式被存储在存储器40的易失性部分中或者在持久存储驱动器44上或者在存储器40的持久部分中时,这些应用和驱动器54、56、58、60、62、64、66形成计算机程序产品。因此,运行这些应用和驱动器54、56、58、60、62、64、66中的一个或多个的处理电路36形成被构建并且被布置为执行本文所描述的各种过程的专用电路。

图2图示了由存储栈的各种驱动器54、56、58、60、62、64、66和/或内核50所执行的示例方法100。应当理解,每当软件片段(例如,驱动器54、56、58、60、62、64、66、内核50等)被描述为执行方法、过程、步骤或功能时,实际上意味着该软件片段正在其上运行的计算设备(例如,dss计算设备32)当在其处理电路36上执行该软件片段时执行方法、过程、步骤或功能。应当理解,在一些实施例中可以省略方法100的步骤或子步骤中的一个或多个。类似地,在一些实施例中,一个或多个步骤或子步骤可以被组合在一起或以不同的顺序被执行。通过dss计算设备32执行方法100。

可以并行执行步骤110和步骤120(并且在其中执行步骤130的实施例中,还有步骤130)。并行执行意味着这些步骤110、120(和130)的执行的顺序是不重要的;它们可以以重叠的方式被同时执行,或者其中的任一个可以在其他步骤之前或之后被执行。

在步骤110中,在用户空间48内(并且,在一些实施例中,更特别地在专用用户空间容器52内)操作的调度驱动器60将由第一核心38(1)发起(朝向特定存储驱动器44a)的存储请求(例如,存储命令82(1))发送到第一用户空间每核心队列68a(1),第一用户空间每核心队列68a(1)专用于来自第一核心38(1)的、针对特定存储驱动器44a的存储请求82(1)。

在步骤120中,在用户空间48内(并且,在一些实施例中,更特别地在专用用户空间容器52内)操作的调度驱动器60将由第二核心38(2)发起(朝向特定存储驱动器44a)的存储请求(例如,存储命令82(2))发送到第二用户空间每核心队列68a(2),第二用户空间每核心队列68a(2)专用于来自第二核心38(2)的、针对特定存储驱动器44a的存储请求82(2)。

在可选的步骤130中(其可以在仅具有两个核心38(1)、38(2)或仅具有允许处理来自多核高速缓存58的冲刷的两个核心38(1)、38(2)的系统中省略),在用户空间48内(并且,在一些实施例中,更特别地在专用用户空间容器52内)操作的调度驱动器60将由第三核心38(3)发起(朝向特定存储驱动器44a)的存储请求(例如,存储命令82(3))发送到第三用户空间每核心队列68a(3),第三用户空间每核心队列68a(3)专用于来自第三核心38(3)的、针对特定存储驱动器44a的存储请求82(3)。

在一些实施例中,调度驱动器60可以执行步骤140,其中各种每核心队列68的内容可以出于效率原因被修改。通常地,针对与是ssd或基于闪存(或者以其他方式具有用于随机寻找的最小延时)的存储驱动器44a相关联的任何每核心队列68a而言,步骤140被省略。步骤140可以包括子步骤142、144、146中的一个或多个子步骤。

在子步骤142中,调度驱动器60对被存储在每核心队列68a(x)内的存储命令82(x)进行重排。例如,如果存在针对存储驱动器44a的、物理上彼此紧密接近的区段的两个不同的存储命令82(x)-i和82(x)-ii,则调度驱动器60可以对队列68a(x)进行重排,使得那两个存储命令82(x)-i、82(x)-ii被连续地执行而不具有针对远区段中介的另一存储命令82(x)-iii。

在子步骤144中,调度驱动器60对被存储在每核心队列68a(x)内的存储命令82(x)进行合并。例如,如果存在二者都是针对存储驱动器44a的连续区段的写命令的两个不同的存储命令82(x)-i和82(x)-ii,则调度驱动器60可以将这两个存储命令82(x)-i、82(x)-ii合并为单个存储命令82(x)-iv,其向合并的更大区段写入。

在子步骤146中,调度驱动器60在每核心队列68a之间进行负载平衡。例如,如果每核心队列68a(1)在其中具有1000个未决的存储请求82(1)并且每核心队列68a(2)在其中仅具有17个未决的存储请求82(2),则调度驱动器60可以将未决的存储请求82(1)中的一些未决的存储请求从每核心队列68a(1)传送到每核心队列68a(2)。

在步骤150中,在用户空间48内(并且,在一些实施例中,更特别地在专用用户空间容器52内)操作的调度驱动器60将存储请求(例如,存储命令84、86a、86b)从用户空间每核心队列68a发送到用于存储驱动器44a的一组用户空间分派队列70a。

在一个实施例中,如果仅存在用于存储驱动器44a的单个用户空间分派队列70a-i,则调度驱动器60将存储命令84、86a、86b从所有用户空间每核心请求68a出队到用于存储驱动器44a的单个用户空间分派队列70a-i。

备选地,如果存在至少两个用户空间分派队列70a-i、70a-ii,那么执行子步骤156和子步骤157(并且可能地还有158)。

在子步骤156中,调度驱动器60将存储命令86从至少一个用户空间每核心队列68a(1)出队到用于存储驱动器44a的用户空间分派队列70a-i,而在子步骤157中,调度驱动器60将存储命令86a从不同的用户空间每用户队列68a(2)出队到用于存储驱动器44a的不同的用户空间分派队列70a-ii。如果存在比用于存储驱动器44a的用户空间分派队列70a更多的用户空间每核心队列68a,那么在子步骤158中,调度驱动器60将存储命令86b从第三用户空间每核心队列68a(3)出队到与在子步骤157中相同的用户空间分派队列70a-ii。

在步骤160中,在用户空间48内(并且,在一些实施例中,更特别地在专用用户空间容器52内)操作的调度驱动器60将存储请求(例如,存储命令88)从一组用户空间分派队列70a发送到在用户空间48内操作的另一驱动器(即,管理驱动器62)。在一些实施例中,存储命令88从特定分派队列70a被发送到管理驱动器内的对应的分派队列(未描绘)。在其他实施例中,在可选的子步骤165中,调度驱动器60根据公平策略以交替的方式将存储命令88从各个用户空间分派队列70a分派到管理驱动器62(在其中仅具有单个队列(未描绘))。

在步骤170中,在用户空间48内操作的另一驱动器(即,管理驱动器62)通过内核辅助驱动器64的方式将从调度驱动器60接收到的存储请求88作为存储请求90发送到内核50内的存储硬件驱动器66a。然后,存储硬件驱动器66a能够将这些存储请求90传递到存储驱动器44a上作为存储请求92以用于由存储驱动器44a执行。在一些实施例中,存储硬件驱动器66a将特定存储请求92-i传递到第一通道46a-i并且将其他存储请求92-ii传递到第二通道46a-ii。在其他实施例中,存储驱动器44a内的本地队列(未描绘)将存储请求92分布在各通道46a之间以用于当其变得可用时执行。

因此,已经呈现用于提高多核数据存储系统32中的性能同时允许在驱动器栈的故障的情况下的可移植性和快速的故障转移的技术。这可以通过数据存储系统32采用数个队列68、70以减少锁竞争来完成。利用分别在用户空间容器52内的用户空间调度驱动器60内的两个级别的数个队列68、70执行排队。用户空间调度驱动器60可以出队到用户空间管理驱动器62中,用户空间管理驱动器62通过内核辅助驱动器64的方式与基于内核的硬件驱动器66通信。

如贯穿本文档所使用的,词语“包括(comprising)”、“包括(including)”、“包含(containing)”和“具有(having)”旨在以开放式方式阐述一些东西的某些项、步骤、元件或方面。而且,如本文所使用的并且除非相反做出特定声明,否则词语“集合(set)”意味着一些东西中的一个或多个。不管短语“……的集合(setof)”是否跟随有单数或复数对象并且不管其是否与单数或复数动词共轭,情况都是这样。而且,尽管序数表达(诸如“第一”、“第二”、“第三”等等)可以在本文中用作形容词,但是这样的序数表达被用于标识目的,并且除非特别指示,否则不旨在暗示任何排序或顺序。因此,例如,“第二”事件可以在“第一事件”之前或之后发生或即使第一事件甚至没有发生。另外,尽管在本文中将特定元件、特征或动作标识为“第一”,但是这样的元件、特征、或动作不应当被解释为要求还必须存在“第二”或其他这样的元件、特征或动作。相反,“第一”项可以是仅一个。尽管本文公开了某些实施例,但是应理解到,这些仅通过示例的方式被提供并且本发明不限于这些特定实施例。

尽管已经特别地示出并且描述各种实施例,但是本领域的技术人员将理解到,在不脱离随附的权利要求的精神和范围的情况下,可以在其中做出形式和细节上的各种改变。

例如,尽管各种实施例已经被描述为方法,但是还包括体现这些方法的软件。因此,一个实施例包括利用指令编程的有形非暂态计算机可读存储介质(诸如例如,硬盘、软盘、光盘、闪速存储器等),其当由计算机或一组计算机执行时使得各种实施例中所描述的方法中的一个或多个方法被执行。另一实施例包括被编程为执行各种实施例中所描述的方法中的一个或多个方法的计算机。

而且,应当理解,已经描述的所有实施例可以彼此被组合在所有可能组合中,除了已经明确地排除这样的组合的范围外。

最后,即使技术、方法、装置或其他概念特别地标记为“常规的”,申请人也不承认这样的技术、方法、装置或其他概念实际上是35u.s.c.§102或35u.s.c.§103下的现有技术,这样的确定是取决于此时并非其全部为申请人所熟知的许多因素的法律确定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1