首页> 中国专利> 动态库性能分析方法和动态库性能分析系统

动态库性能分析方法和动态库性能分析系统

摘要

提供一种动态库性能分析方法和动态库性能分析系统,包括:将第一断点指令写入动态库函数的开始地址;记录第一事件计数值,所述第一事件计数值是当目标进程执行第一断点指令时的进程性能测量单元PMU计数;将第二断点指令写入动态库函数的返回地址;通过将记录的第一事件计数值与第二事件计数值进行比较来计算在执行动态库函数时在处理器核心中产生的PMU计数值,所述第二事件计数值是当目标进程执行第二断点指令时的进程PMU计数,其中,进程PMU计数是在执行目标进程时在处理器核心中产生的PMU计数值的累加值。

著录项

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-04-24

    授权

    授权

  • 2015-11-25

    实质审查的生效 IPC(主分类):G06F11/34 申请日:20131119

    实质审查的生效

  • 2014-06-04

    公开

    公开

说明书

本申请要求于2012年11月23日提交到韩国知识产权局的第 10-2012-0133854号韩国专利申请的优先权,其中,所述专利申请的公开内 容通过引用全部合并于此。

技术领域

与示例性实施例一致的方法和设备涉及一种动态库性能分析方法和动态 库性能分析系统。

背景技术

性能分析指的是当前执行的程序的执行状态的分析或与操作系统(OS) 内核的通信状态的分析。通过性能分析,可以测量程序的性能信息,并可检 测出潜在影响性能的因素。

发明内容

示例性实施例提供一种动态库性能分析方法、存储所述方法的计算机可 读记录介质和动态库性能分析系统,所述系统可测量在动态库函数单元中性 能测量单元(PMU)事件计数。

示例性实施例也提供一种动态库性能分析方法、使用所述方法的计算机 可读记录介质和动态库性能分析系统,所述系统可测量在分时系统中由于发 生上下文切换在动态库函数单元中性能测量单元(PMU)事件计数。

根据示例性实施例的一方面,提供一种动态库性能分析方法,包括:将 第一断点指令写入动态库函数的开始地址;记录第一事件计数值,所述第一 事件计数值是当目标进程执行第一断点指令时的进程性能测量单元PMU计 数;将第二断点指令写入动态库函数的返回地址;通过将记录的第一事件计 数值与第二事件计数值进行比较来计算在执行动态库函数时在处理器核心中 产生的PMU计数值,所述第二事件计数值是当目标进程执行第二断点指令时 的进程PMU计数,其中,进程PMU计数是在执行目标进程时在处理器核心中 产生的PMU计数值的累加值。

根据示例性实施例的一方面,提供一种动态库性能分析方法,包括:对 目标进程分配任务结构,将在执行目标进程时产生的性能测量单元(PMU)计数 值记录在任务结构中作为进程PMU计数,其中,记录步骤包括:当使用上下 文切换来开始执行目标进程时,初始化处理器核心的PMU计数器的PMU计数 值,并且在目标进程切换到另一进程之前,将处理器核心的PMU计数器的当 前PMU计数值累加地记录在任务结构中作为进程PMU计数。

根据示例性实施例的一方面,提供一种动态库性能分析方法,包括:在 动态库函数的起始地址处写入第一断点指令;当目标进程执行第一断点指令 时产生函数进入事件;在动态库函数的返回地址处写入第二断点指令;当目 标进程执行第二断点指令时产生函数结束事件。

根据示例性实施例的又一方面,提供一种动态库性能分析系统,包括: PMU计数器,被配置为记录作为在处理器核心中发生的事件的累加值的PMU 计数值;任务结构,在任务结构中针对每一个目标进程记录了进程PMU计数, 所述进程PMU计数是在执行目标进程时记录的累加的PMU计数;监视进程, 被配置为在动态库函数的起始地址处写入第一断点指令和在动态库函数的返 回地址处写入第二断点指令,其中,监视进程记录作为当目标进程执行第一 断点指令时的进程PMU计数的第一事件计数值,记录作为当目标进程执行第 二断点指令时的进程PMU计数的第二事件计数值,并通过将第一事件计数值 与第二事件计数值进行比较来计算在执行动态库函数时在处理器核心中产生 的PMU计数。

附图说明

通过参照附图详细地描述示例性实施例,以上和其它方面将变得更清楚, 其中:

图1是示出根据示例性实施例的动态库性能分析方法的示意流程图;

图2到图8示意性地示出监视进程和目标进程的操作;

图9示出在目标进程中的事件发生和在监视进程中事件处理过程的示意 图;

图10是示出进程调度器的进程PMU计数计算过程的示意流程图;

图11和图12示出使用与用于测量进程PMU计数的进程相应的任务结构 的性能分析系统;

图13示出当从目标进程的库函数中调用另一库函数时的进程PMU计数测 量过程。

具体实施方式

现在将参照附图,在下文中更全面地描述示例性实施例。然而,示例性 实施例可以以各种形式被实现并不应被理解为限于在此阐述的示例性实施 例。相反地,提供这些示例性实施例使得本公开将是彻底且完整的,并将全 面地向本领域技术人员传达本公开的范围。贯穿整个说明,相同的标号指示 相同的组件。

使用的单数术语和类似指称应被理解为包含单数和复数两者,除非这里 另有指示或清楚地与上下文相矛盾。术语“包含”、“具有”、“包括”和“含 有”被理解为开放式术语(即,表示“包括但不限于”),除非另有提及。

除非另有定义,本文使用的所有的技术术语和科学术语与本领域普通技 术人员所通常理解的具有相同的意义。应注意,使用的任意和全部示例,或 在本文中提供的示例性术语仅意图更好地示意本公开而并非限制本公开的范 围,除非另有所指。此外,除非另有定义,可能不会过分解释在通用字典中 定义的全部术语。

在下文中,将参照附图描述示例性实施例。

在以下描述中,作为处理器核心的内部组件的性能测量单元(PMU),指 示用于测量在处理器核心中发生的事件的组件。这里,本领域技术人员可理 解在处理器核心中发生的事件表示时钟周期、存储器操作(例如,读取或写 入)、缓存事件(例如,命中、未命中或写回)、执行指令等。

PMU计数器是在PMU内提供的寄存器。PMU计数器对在处理器核心中的发 生的事件进行计数并记录PMU事件计数的累加值。可在软件中编程PMU,并 且PMU计数器可使用特定汇编指令来执行读取和写入操作。

在以下的描述中,从PMU计数器读取的PMU计数被用作硬件PMU计数。

进程调度器是支持分时系统的操作系统(OS)内核的内部组件。进程调 度器通过根据优先级的顺序划分中央处理单元(CPU)可用性来执行多个进程。 在示例性实施例中,将通过针对Linux内核的示例来描述OS内核。

图1是示出根据本发明的实施例的动态库性能分析方法的示意流程图, 而图2到图8示意性地示出监视进程和目标进程的操作。

参照图1,首先,监视进程在库函数的起始地址处设置第一断点(S110)。

在用户进程被执行时,监视进程跟踪用户进程并监视在处理器核心中发 生的事件。监视进程可包括例如,分析器。这里,分析器是用于测量程序的 性能和在开发程序的过程中发现瓶颈的开发工具。

例如,库函数可以是例如,动态库函数但是不限于此。

参照图2,执行监视进程10和目标进程20。目标进程20是作为监视进 程10的监视目标的用户进程并包括用户程序21和链接到用户程序21的动态 库22。

如上所述,监视进程10跟踪用户进程,并且可以访问(读取、写入)目 标进程20的地址空间。在OS(诸如Linux)中,OS通常不能直接访问其它 用户进程的地址空间和寄存器。然而,监视进程10例外地被允许访问其它用 户进程的空间地址和寄存器。

监视进程10在库函数的起始地址(例如,在地址0x20)处设置第一断 点BP_ST。其后,监视进程10可进入等待模式。例如,可通过插入软件断点 指令设置第一断点BP_ST,但不限于此。

在设置第一断点BP_ST中,断点指令可取代库函数的起始地址的原始指 令。

同时,虽然没有清晰地示出,但是监视进程10在库函数的起始地址处设 置第一断点BP_ST之前,动态库22可被载入存储器并与用户程序21链接。

在用户程序21中,为了调用预定动态库函数,用于调用用户程序21的 动态库函数的代码可调用与动态库函数相应的程序链接表(PLT),并且具有 动态库函数被加载到的地址的全局偏移表(GOT)可被PLT引用。这里,记录 在GOT中的动态库函数被加载到的地址可被动态链接器记录。也就是说,GOT 的缺省值可被设置为动态链接器的地址。因此,动态库函数的第一调用执行 动态链接器并将动态库加载到存储器,并且动态库函数的地址可被记录在GOT 中。其后,用于调用用户程序21的动态库函数的指令可在不执行动态链接器 的情况下,通过引用记录在GOT中的动态库函数的地址来使用PLT调用动态 库函数。

这里,PLT是第一次被调用的代码区域,其用于使用户程序21调用预定 的动态库函数。PLT包括对于每一个动态库函数间接调用各种动态库函数的 代码。GOT是由PLT引用用于调用预定动态库函数的数据区域。动态库函数 的地址被存储在GOT的存储空间中。

接下来,再次参照图1,目标进程执行第一断点(S120)。如果目标进程 在库函数的起始地址处执行第一断点,则可产生事件(例如,函数进入事件)。 通过函数进入事件,停止目标进程的执行并从等待模式中释放监视进程。当 目标进程执行断点时,可发生事件并且监视进程可处理所述事件,这将参照 图9更加详细地描述。

参照图3,在用户程序21中执行用于调用库函数的代码(DL_CL)(例如, 地址0x10的代码)。因此,可以通过与库函数相应的PLT,通过引用记录在 GOT中的库函数的地址来调用库函数的起始地址0x20。

可选地,在运行时加载库函数的情况下,可通过使用函数指针直接调用 动态链接器来直接调用库函数的起始地址0x20。最终,从目标进程20调用 库函数,并执行在库函数的起始地址0x20设置的第一断点BP_ST。

接下来,再次参照图1,监视进程获得目标进程的资源使用统计(S130)。 可通过函数进入事件将监控进程从等待模式中释放,并且监控进程可获得目 标进程的资源使用统计。

在OS内核中,资源使用统计可包括关于进程的资源使用统计的数据(例 如,Linux的等待因素中的结构体使用)但不限于此。

在示例性实施例中,进程PMU计数信息可被添加到资源使用统计。由目 标进程的任务结构来管理进程PMU计数信息,而且进程PMU计数信息是在执 行目标进程时产生的针对每一个目标进程的PMU计数的累加值。

这里,进程PMU计数是在执行目标进程时(也就是说,从开始执行由进 程调度器调度到处理器核心的预定用户进程时到另一用户进程被调度到处理 器核心停止执行用户进程时)产生的PMU计数的累加值。通常,相应于各个 处理器核心,记录硬件PMU计数。然而,在示例性实施例中,进程PMU计数 是与每一个进程相应的记录的PMU计数。

参照图4,监视进程10获得目标进程20的第一资源使用统计。这里, 第一资源使用统计指示当随着执行目标进程20的第一断点BP_ST产生函数进 入事件时的目标进程20的资源使用统计。第一资源使用统计包括进程PMU计 数,进程PMU计数是直到目标进程20执行第一断点BP_ST为止在处理器核心 中产生的累加的PMU计数。

通常,监视进程10不能直接访问OS内核。在示例性实施例中,为了将 在OS内核中收集的进程PMU计数传送到监视进程10,如上所述,可以使用 附加地包括进程PMU计数信息的资源使用统计,但不限于此。

接下来,再次参照图1,监视进程在库函数进入模式中记录进程PMU计 数(S140)。监视进程从目标进程的第一资源使用统计中提取进程PMU计数, 并可将提取的进程PMU计数记录为第一PMU计数。

接下来,监视进程在库函数的返回地址处设置第二断点(S150)。在下文 中,监视进程进入等待模式,并可以重新开始目标进程的执行。可以通过将 第二断点的指令(例如,软件断点指令)插入到库函数的返回地址来设置第 二断点,但不限于此。

参照图5,在库函数的返回地址(例如,地址0x11)处设置第二断点BP_RT。 库函数的返回地址可以是在库函数的执行被完成之后记录在其中的目标进程 20的用户程序21的下一执行代码的地址。

接下来,再次参照图1,目标进程执行第二断点(S160)。如果目标进程 执行在库函数的返回地址处设置的第二断点,则可发生事件(例如,函数结 束事件)。目标进程的执行被中断,并且由函数结束事件将监视进程从等待模 式中释放。

参照图6,在用户程序21中,执行库函数的返回地址的执行代码,例如, 地址0x11的代码。当完成库函数的执行并且从目标进程20中返回库函数时, 执行设置在库函数的返回地址处的第二断点BP_RT。

接下来,再次参照图1,监视进程获得目标进程的资源使用统计(S170)。 在获得目标进程的资源使用统计时,由函数结束事件将监视进程从等待模式 中释放。

参照图7,监视进程获得目标进程20的第二资源使用统计。这里,在根 据第二断点BP_RT的执行在发生函数结束事件时获得目标进程20的第二资源 使用统计。第二资源使用统计包括到目标进程20已经执行第二断点BP_RT为 止在处理器核心中产生的PMU计数的累加的进程PMU计数。

接下来,再次参照图1,监视进程在库函数结束模式中计算累加的进程 PMU计数(S180)。监视进程可从目标进程的第二资源使用统计中提取进程PMU 计数并可将提取的进程PMU计数记录为第二PMU计数。

监视进程计算通过将第一PMU计数与第二PMU计数进行比较来计算在执 行动态库函数时产生的累加的PMU计数。

同时,监视进程可累加地存储每一个动态库函数计算的进程PMU计数。 为此,可提供存储空间以用于累加地存储每一个动态库函数的PMU计数。例 如,可以在监视进程的用户存储器空间中提供存储空间,但不限于此。

接下来,从库函数的返回地址移除第二断点(S190)。其后,监视进程进 入等待模式,并且可重新开始目标进程的执行。

参照图8,监视进程10从库函数的返回地址0x11中移除第二断点BP_RT。

常规的库函数性能分析方法可包括例如,在编译或运行时插入的监视代 码的使用或基于性能分析的采样。

然而,在常规的库函数性能分析方法中会出现多种问题。也就是说,在 编译时使用插入的监视代码的方法中,为了执行性能分析会需要重新编译。 此外,当在分时系统中执行上下文切换时,另一进程的运行时间会与性能分 析相关联,从而导致不准确结果。特别地,基于性能分析的采样具有局限在 于基于性能分析的采样会基于统计数据导致不准确、近似的结果。

例如,在Linux环境中使用并基于在执行时插入监视代码的方法的 ltrace,可被用作在执行性能分析时用于跟踪库函数的执行的工具。在ltrace 中,库函数的起始点和结束点插入软件断点,库函数的执行时间被计算为给 定事件与断点一起发生的时间。此外,在ltrace中,假设库函数起始于与库 函数相应的PLT的起始地址,计算库函数目标的执行时间。

特别地,使用ltrace,不能对在目标进程的运行时动态地加载的库函数 进行性能分析。由于通过动态链接器使用函数指针来获得在运行时显式加载 的库函数的地址,并且在没有通过PLT的情况下直接调用该地址,所以使用 在PLT设置的断点不能获得任何事件。此外,性能分析只能在第一次调用库 函数时启动,而当从库函数中调用另一库函数时,不能完成性能分析。此外, 当在分时系统中发生上下文切换时,另一进程的运行时间可被无意地包含在 计算的目标进程的运行时间中。

但是,在根据示例性实施例的动态库分析方法中,在运行时加载动态库 函数之后,在没有将断点插入PLT的起始地址的情况下,断点被设置在动态 库函数的起始地址处,从而更加广泛地支持动态库函数的性能分析。

因此,也可对甚至不调用PLT的库函数进行性能分析。此外,如稍后将 要描述地,甚至从相关的库函数调用另一库函数时,能够对各个库函数进行 性能分析,因而独立地测量并计算调用程序的进程PMU计数和被调用程序的 进程PMU计数。

在下文中,将参照图9描述在目标进程中的事件发生和在监视进程中的 事件处理过程。图9示意性示出在目标进程中的事件发生和在监视进程中的 事件处理过程。

参照图9,首先,监视进程10开始监视目标进程20(S210)。如上所述, 监视进程10可在跟踪目标进程20时,在目标进程20的库函数的起始地址处 设置第一断点。

接下来,监视进程10进入事件等待模式以等待事件的发生(S220)。

接下来,执行目标进程20(S310)。目标进程20可执行由监视进程10 设置的断点。例如,目标进程20可执行在库函数的起始地址处设置的第一断 点。可选地,目标进程20可执行在库函数的返回地址处设置的第二断点。

接下来,检测在目标进程20中的事件的发生(S320)。当目标进程20 执行断点时,在目标进程20中发生事件。例如,当目标进程20执行在库函 数的起始地址设置的第一断点时,可发生函数进入事件。可选地,目标进程 20可执行在库函数的返回地址处设置的第二断点,可发生函数结束事件。

停止目标进程20的执行(S330)。如果发生事件,则结束目标进程20 的执行,并且事件的发生被通知到监视进程10以允许从事件等待模式中释放 监视进程。

接下来,监视进程10可处理事件(S230)。当目标进程20执行断点时, 监视进程10可处理事件。例如,在发生函数进入事件的情况下,当目标进程 20执行在库函数的起始地址处设置的第一断点时,监视进程10可获得目标 进程20的资源使用统计然后从中提取进程PMU计数,由此在库函数的返回地 址处设置第二断点。可选地,在当目标进程20执行在库函数的返回地址处设 置的第二断点时发生函数结束事件的情况下,监视进程10可获得目标进程 20的资源使用统计,以随后从中提取进程PMU计数,接着是移除在库函数的 返回地址处设置的第二断点。

接下来,监视进程10重新开始目标进程的执行(S240)。监视进程10 以上述方式处理事件并再次进入等待模式以从S220重复处理步骤。然后,监 视进程10重新开始目标进程20的执行以允许目标进程20重复地从S310执 行处理步骤。

在下文中,将参照图10描述进程调度器的进程PMU计数计算过程。图 10是进程调度器的进程PMU计数计算过程的示意流程图。

参照图10,在OS内核中执行进程调度器(S410)。如上所述,进程调度 器通过根据优先级的顺序划分CPU可用性来执行多个进程。

接下来,当通过上下文切换开始执行目标进程时,进程调度器初始化PMU 计数器的硬件PMU计数(S420)。更具体地,在上下文切换之前,例如,当监 视进程进入等待模式并且在目标进程被执行之前,可将硬件PMU计数初始化 为0。

接下来,OS内核执行目标进程(S430)。

接下来,为了实现将上下文切换到另一进程,目标进程进入进程调度器 (S440)。

接下来,进程调度器累加地将硬件PMU计数记录在与目标进程相应的任 务结构中(S450)。更具体地,进程调度器读取累加地记录在PMU计数器中的 硬件PMU计数直到完成目标进程的执行并调度另一用户进程为止,例如,直 到停止目标进程的执行并执行监控进程为止。然后,读取的硬件PMU计数被 累加地记录进程PMU计数中,而进程PMU计数被记录在与目标进程相应的任 务结构中。

每当发生上下文切换时,可重复执行图10中所示的进程PMU计数计算过 程。因此,即使发生上下文切换,执行另一用户进程时产生的硬件PMU计数 不被包括在进程PMU计数中。

图11和图12示出使用与用于测量进程PMU计数的进程相应的任务结构 的性能分析系统。

参照图11,性能分析系统包括监视进程10、第一目标进程20a、第二目 标进程20b、OS内核30和处理器核心40。

当产生函数进入事件和函数结束事件时,监视进程10可从资源使用统计 中提取目标进程的进程PMU计数,并基于提取的进程PMU计数,监视进程10 可计算在目标库函数的执行期间产生的进程PMU计数。

第一目标进程20a和第二目标进程20b是将由监视进程10跟踪的用户进 程。在图11中给出了两个目标进程的示例,即,第一目标进程20a和第二目 标进程20b,但是示例性实施例的方面不限于此。

OS内核30包括任务结构31和进程调度器32。任务结构31是从OS内核 分配给每一个进程的数据结构。在图11中给出了包括第一任务结构31a和第 二任务结构31b的任务结构31的示例,但示例性实施例的方面不限于此。

可在任务结构31a和任务结构31b中的每一个中额外地提供累加地记录 进程PMU计数的空间。在调度第一目标进程20a时产生的进程PMU计数可被 记录在第一任务结构31a中,而在调度第二目标进程20b时产生的进程PMU 计数可被记录在第二任务结构31b中。处理器核心40可包括PMU 41和CPU 42。 PMU 41测量在处理器核心40中发生的事件并将PMU计数值记录在PMU计数 器中。可根据由PMU 41支持的PMU计数器的数量来测量在库函数的执行期间 发生的各种事件。在进程调度中,CPU 42根据进程调度器32执行用户进程。

参照图12,性能分析系统包括可作为多处理器核心的处理器核心50。在 图12中给出了处理器核心50包括第一CPU和第二CPU的示例,但不限于此。

多处理器核心50可包括与CPU 52和CPU 54的PMU 51和PMU 53。

根据图10中示出的进程PMU计数计算过程以及图11和图12中示出的使 用与进程相应的任务结构的性能分析系统,在每一个进程的执行期间产生的 进程PMU计数可被保留在OS内核的内部数据结构中。因此,即使在分时系统 中执行上下文切换时,使用由OS内核为每一个进程独立地分配的任务结构, 因此阻止了另一用户进程的硬件PMU计数被无意的包括在目标进程的进程 PMU计数中。

在下文中,将参照图13描述当从目标进程的库函数中调用另一库函数时 的进程PMU计数测量过程。图13示出当从目标进程的库函数中调用另一库函 数时的进程PMU计数测量过程。

参照图13,用户程序21包括执行代码21a和PLT 21b。稍后将会描述的 PLT 21b是用于调用动态库函数的代码区域,并可包括例如qux_plt、baz_plt、 bar_plt、foo_plt等。

链接到用户程序21的动态库22可包括,例如动态库函数(诸如,qux()、 baz()、bar()或foo())。通过监视进程,分别在动态库函数的起始地址处设 置断点BP_ST1、BP_ST2、BP_ST3和BP_ST 4。

如果在执行代码21a中调用动态库函数,例如,foo(),则从PLT 21b 中调用用于调用foo()的代码区域,例如foo_plt。接下来,代码区域foo_plt 通过参照记录在GOT(未示出)中的foo()的地址来调用加载到存储器的动 态库22的函数foo()。

由于在foo()的起始地址处设置第一断点BP_ST4,所以产生函数进入 事件,并且监视进程记录在foo()函数输入模式中的进程PMU计数作为第一 PMU计数值。其后,监视进程在foo()的返回地址处设置第二断点BP_RT4。

接下来,如果执行foo()时调用另一动态库函数,例如,bar(),则 产生函数进入事件,这是因为在bar()的起始地址处设置了第三断点BP_ST3, 并且监视进程将bar()函数进入模式中的进程PMU计数记录作为第二PMU 计数值。其后,监视进程在bar()的返回地址处设置第四断点BP_RT3。

接下来,如果完成bar()的执行并返回bar(),则产生函数结束事件, 这是因为在bar()的返回地址处设置了第四断点BP_RT3,并且监视进程将 bar()函数结束模式中的进程PMU计数记录作为第三PMU计数值。

接下来,如果完成foo()的剩余代码的执行并返回foo(),则产生函数 进入事件,这是因为在foo()的返回地址处设置了第二断点BP_RT4,并且 监视进程将foo()函数结束模式中的进程PMU计数记录作为第四PMU计数 值。

为了计算执行foo()函数时产生的实际进程PMU计数,监视进程获得 通过从第四PMU计数值减去第一PMU计数值得到的PMU计数与通过从第三PMU 计数值减去第二PMU计数值得到的PMU计数之间的差。如上所述,根据示例 性实施例,由于调用程序与被调用程序可被单独地测量并计算,所以可以实 现对各个库函数的性能分析。

关于公开于此的方面中描述的方法或算法的步骤可直接在硬件实现中实 现,在由处理器执行的软件模块中实现或在两者的结合中实现。软件模块可 置于RAM存储器、闪存、ROM存储器、EPROM存储器、EEPROM存储器、寄存 器、硬盘、可拆卸磁盘、CD-ROM或本领域公知的存储介质的任何其它形式。 示例性存储介质可被耦合到处理器,从而使处理器可从存储介质中读取信息 并将信息写入存储介质。在可选方案中,存储介质可被集成到处理器。而且, 在一些方面,处理器和存储介质可置于特定用途集成电路(ASIC)。此外,ASIC 可置于用户终端中。可选地,处理器和存储介质可作为独立组件放置在用户 终端中。

在详细描述的结尾,本领域技术人员将理解,在实质上不脱离本发明的 原理的情况下,可对优选的实施例做出多个变化和修改。因此,在描述性意 义上使用的示例性实施例而不是为了限制的目的。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号