掌桥专利:专业的专利平台
掌桥专利
首页

用于管理应用系统的方法、设备和计算机程序产品

文献发布时间:2023-06-19 11:19:16


用于管理应用系统的方法、设备和计算机程序产品

技术领域

本公开的各实现方式涉及应用系统(application system)的管理,更具体地,涉及用于针对备份应用系统的备份副本(backup copy)生成索引的方法、设备和计算机程序产品。

背景技术

随着应用系统的发展,目前已经出现了多种类型的应用系统。在应用系统的使用过程中,可以针对应用系统执行备份,以使得当应用系统出现故障和/或其他情况时,可以将应用系统中的数据对象(例如,包括目录和文件,data object)恢复至之前的版本。应用系统的用户和/或管理员可以选择将要备份的数据对象,例如,可以选择应用系统中的文件、目录、或者备份整个应用系统等等,来执行备份。在一次备份中,可以生成备份副本,并且可以将生成的备份副本存储在备份系统中。进一步,可以从备份副本中恢复数据对象。例如,应用系统的用户和/或管理员可以选择从一个备份副本中恢复一个或多个数据对象。

备份副本以预定数据结构来存储被备份的多个数据对象。通常而言,在应用系统中同一目录下的多个文件可以分别被存储至备份副本中的多个备份块(backup block)中,并且多个备份块是相分离的。当需要恢复该目录时,需要从备份副本中查找与该目录下的多个文件相对应的多个备份块。如何管理备份副本以便于在备份副本中找到已经被备份的目录和/或文件的备份块,成为一个研究热点。

发明内容

因而,期望能够开发并实现一种以更为有效的方式来管理备份副本的技术方案。期望该技术方案能够与现有的用于备份应用系统的技术方案相兼容,并且通过改造现有应用系统的各种配置,来以更为有效的方式生成应用系统的备份副本,并且基于生成的备份副本来恢复数据对象。

根据本公开的第一方面,提供了一种用于管理应用系统的方法。应用系统包括一组数据对象,一组数据对象包括父亲数据对象、第一数据对象和第二数据对象,在应用系统的层级结构中,父亲数据对象是第一数据对象和第二数据对象的父亲。在该方法中,获取针对一组数据对象的备份副本。分别确定与父亲数据对象相对应的父亲备份块在备份副本中的父亲地址、与第一数据对象相对应的第一备份块在备份副本中的第一地址,以及与第二数据对象相对应的第二备份块在备份副本中的第二地址。基于父亲地址、第一地址和第二地址,生成父亲索引条目、第一索引条目和第二索引条目。基于父亲索引条目、第一索引条目和第二索引条目,确定用于备份副本的索引,第一索引条目和第二索引条目在索引中是连续的。

根据本公开的第二方面,提供了一种电子设备,包括:至少一个处理器;以及与至少一个处理器耦合的存储器,存储器具有存储于其中的指令,指令在被至少一个处理器执行时使得设备执行用于管理应用系统的动作。应用系统包括一组数据对象,一组数据对象包括父亲数据对象、第一数据对象和第二数据对象,在应用系统的层级结构中,父亲数据对象是第一数据对象和第二数据对象的父亲。该动作包括:获取针对一组数据对象的备份副本;分别确定与父亲数据对象相对应的父亲备份块在备份副本中的父亲地址、与第一数据对象相对应的第一备份块在备份副本中的第一地址,以及与第二数据对象相对应的第二备份块在备份副本中的第二地址;基于父亲地址、第一地址和第二地址,生成父亲索引条目、第一索引条目和第二索引条目;以及基于父亲索引条目、第一索引条目和第二索引条目,确定用于备份副本的索引,第一索引条目和第二索引条目在索引中是连续的。

根据本公开的第三方面,提供了一种计算机程序产品,计算机程序产品被有形地存储在非瞬态计算机可读介质上并且包括机器可执行指令,机器可执行指令用于执行根据本公开的第一方面的方法。

附图说明

结合附图并参考以下详细说明,本公开各实现方式的特征、优点及其他方面将变得更加明显,在此以示例性而非限制性的方式示出了本公开的若干实现方式。在附图中:

图1示意性示出了其中可以实现本公开的示例性实现方式的应用系统中的数据对象以及相应的备份副本的框图;

图2示意性示出了备份副本中的各个备份块的框图;

图3示意性示出了根据本公开的示例性实现方式的用于备份副本的索引的框图;

图4示意性示出了根据本公开的示例性实现方式的用于管理应用系统的方法的流程图;

图5示意性示出了根据本公开的示例性实现方式的用于备份副本的索引的数据结构的框图;

图6示意性示出了根据本公开的示例性实现方式的索引中的索引条目(indexentry)的框图;

图7示意性示出了根据本公开的示例性实现方式的用于备份副本的索引中的各个索引条目之间的关系的框图;

图8A至图8I示意性示出了根据本公开的示例性实现方式的用于生成索引的过程的框图;

图9示意性示出了根据本公开的示例性实现方式的用于读取索引中的索引条目的框图;以及

图10示意性示出了根据本公开的示例性实现的用于管理应用系统的设备的框图。

具体实施方式

下面将参照附图更详细地描述本公开的优选实现。虽然附图中显示了本公开的优选实现,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实现所限制。相反,提供这些实现是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。

在本文中使用的术语“包括”及其变形表示开放性包括,即“包括但不限于”。除非特别申明,术语“或”表示“和/或”。术语“基于”表示“至少部分地基于”。术语“一个示例实现”和“一个实现”表示“至少一个示例实现”。术语“另一实现”表示“至少一个另外的实现”。术语“第一”、“第二”等等可以指代不同的或相同的对象。下文还可能包括其他明确的和隐含的定义。

在不同的应用环境中,已经出现了多种应用系统。例如,个人计算机可以是应用系统的一个示例,并且个人计算机中可以包括文档、图像、音频、视频等多种类型的文件。应用系统还可以包括一个或多个目录,并且目录中可以包括其他目录和/或一个或多个文件。在本公开的上下文中,可以将文件、目录称为数据对象。为了确保个人计算机的可靠性,可以定期地和/或按照用户的指定规则来执行备份。例如,可以备份应用系统中的文件、目录、或者备份整个应用系统等等。又例如,文件服务器可以是应用系统的另一示例,此时文件服务器可以包括来自一个或多个用户的多个文件。用户和/或管理员可以指定针对某个和/或某些文件执行备份,还可以针对整个文件服务器执行备份。

图1示意性示出了其中可以实现本公开的示例性实现方式的应用系统中的数据对象以及相应的备份副本的框图100。图1上部示意性示出了应用系统中的数据对象的层级结构(hierarchy structure)。如图1所示,应用系统可以包括数据对象110(即,根目录),并且根目录可以分别包括两个子目录,即数据对象120和122。数据对象120可以包括数据对象130和132,数据对象130可以包括数据对象140和数据对象142,数据对象132可以包括文件144,数据对象122可以包括文件134。在应用系统中,数据对象120和122之间具有兄弟关系,数据对象130和132之间具有兄弟关系,以及数据对象140和142具有兄弟关系。

在图1中,各个数据对象之间可以具有“父子关系”,例如,数据对象120和数据对象122是数据对象110的孩子,而数据对象110是数据对象120和数据对象122的父亲。数据对象之间还可以具有“兄弟关系”,例如,数据对象120和数据对象122之间具有兄弟关系,并且数据对象130和数据对象132之间具有兄弟关系。

图1下部示意性示出了针对应用系统执行备份操作后形成的备份副本的结构。备份副本可以包括分别对应于多个数据对象的多个备份块。例如,备份块150对应于数据对象110,备份块152对应于数据对象120,备份块154对应于数据对象130,备份块156对应于数据对象140,备份块158对应于数据对象142,备份块160对应于数据对象132,备份块162对应于数据对象144,备份块164对应于数据对象122,并且备份块166对应于数据对象134。

如图1所示的备份副本是基于针对应用系统中的一组数据对象执行深度优先遍历而获得的。按照深度优先的顺序,可以逐步针对应用系统中的每个数据对象生成相应的备份块。继而,可以按照深度优先的顺序来向备份副本中添加生成的多个备份块。

将会理解,由于备份副本是按照深度优先规则生成的,因而在备份副本中的位于同一目录下的多个数据对象的备份块可能会分布在备份副本中的不连续位置。图2示意性示出了备份副本中的各个备份块的框图200。如图2所示,备份块152和备份块164是分别对应于具有兄弟关系的目录“USR”和“VAR”的备份块,这两个备份块在备份副本中位于不连续的位置。又例如,备份块154和备份块160在备份副本中位于不连续的位置,并且备份块156和158位于不连续的位置。

目前已经提出了用于管理应用系统的备份副本的技术方案。例如,可以基于数据库技术来存储对应于一组数据对象的一组备份块,并且可以基于应用系统的层级关系来建立索引。然而,针对数据库的操作涉及复杂的运算并且需要较大的计算资源和时间开销,这导致建立索引的过程涉及较大工作负载。进一步,针对数据库执行访问操作也将涉及较大的计算资源和时间开销,这导致使用索引同样涉及较大工作负载。因而,期望可以以更为有效的方式来管理应用系统的备份副本。

为了解决上述缺陷,本公开的实现方式提供了一种用于管理应用系统的方法。在该方法中,可以为备份副本中所涉及的一组数据对象建立索引,以便以更为高效的方式管理备份副本。一方面,采用连续存储空间来存储索引中的各个索引条目,可以降低生成索引的工作负载,并且可以基于索引来快速地显示备份副本中包括哪些数据对象的备份块,进而便于用户了解备份副本的内容。另一方面,当用户期望基于备份副本来恢复应用系统中的某个/某些数据对象时,可以基于索引来快速地找到与期望被恢复的数据对象相对应的备份块,进而可以基于找到的备份块来恢复数据对象。

图3示意性示出了根据本公开的示例性实现方式的用于备份副本的索引300的框图。如图3所示,索引300例如可以以树状结构表示,该树状结构记录了应用系统中的一组数据对象之间的层级关系。例如,索引条目可以包括数据对象的标识符,用于指示该索引条目是针对哪个数据对象的索引条目。索引条目可以包括指向该数据对象的第一个孩子的引用(reference),并且还可以包括指向下一个兄弟的引用。尽管未示出,索引条目还可以包括指向数据对象在备份副本中的地址的引用。

如图3所示,索引条目310对应于根目录“/”,索引条目320和322分别对应于根目录“/”的两个孩子目录“USR”和目录“VAR”,此时目录“USR”和目录“VAR”具有兄弟关系。索引条目330和332分别对应于目录“USR”的两个孩子目录“BIN”和目录“LIB”,此时目录“BIN”和目录“LIB”具有兄弟关系。图3中的箭头示出了分别各个数据对象之间的“父子”关系和“兄弟”关系。例如,索引条目310和320之间的箭头表示“父子”关系,而索引条目320和322之间的箭头表示“兄弟”关系。

利用本公开的示例性实现方式,通过使用如图3所示的索引300来记录一组数据对象在备份副本中的地址,可以迅速地获取备份副本中的多个数据对象之间的层级关系以及各个数据对象在备份副本中的地址。进一步,基于索引300中的地址,从备份副本中可以迅速找到与某个数据对象相对应的备份块,进而用于恢复操作。在下文中,将参见图4描述有关生成索引的更多细节。

图4示意性示出了根据本公开的示例性实现方式的用于管理应用系统的方法400的流程图。在此的应用系统例如可以是如图1所示的应用系统,该应用系统可以包括一组数据对象110、120、122、130、132、134、140、142、144等。如图1所示,一组数据对象可以包括父亲数据对象110、第一数据对象120和第二数据对象122。在应用系统的层级结构中,父亲数据对象110是第一数据对象120和第二数据对象122的父亲。将会理解,数据对象相对于上层的数据对象可以是孩子,相对于下层的数据对象可以是父亲,相对于同层的数据对象可以是兄弟。如图1所示,数据对象120是数据对象110的孩子,是数据对象130和132的父亲,并且是数据对象122的兄弟。

将会理解,尽管图1示出了包括位于4个层级的一组数据对象,在其他实现方式中,应用系统还可以包括位于更多或者更少的层级和数据对象。针对一组数据对象中的多个数据对象,可以以递归的方式执行方法400。在下文中,将参见图1所示的应用系统以及该应用系统的备份副本来描述有关方法400的更多细节。

在框410处,可以获取针对一组数据对象的备份副本。在此备份副本例如可以是如图1所示的备份副本。将会理解,在此的备份副本可以是预先生成的备份副本。例如,可以按照已有的方法生成备份副本,继而针对该备份副本建立索引。备选地和/或附加地,还可以在生成备份副本中的针对每个数据对象的备份块的同时,生成包括各个数据对象的索引条目的索引。

在框420处,可以确定一组数据对象中的各个数据对象在备份副本中的各个地址。例如,可以分别确定与父亲数据对象相对应的父亲备份块在备份副本中的父亲地址。返回图1,此时父亲数据对象为数据对象110,因而父亲地址可以是与数据对象110相关联的备份块150在备份副本中的地址。进一步,还可以获取与第一数据对象相对应的第一备份块在备份副本中的第一地址,以及与第二数据对象相对应的第二备份块在备份副本中的第二地址。如图1所示,第一数据对象为数据对象120,并且第一地址可以是与数据对象120相对应的备份块152在备份副本中的地址。第二数据对象为数据对象122,并且第二地址可以是与数据对象122相对应的备份块154在备份副本中的地址。

将会理解,尽管在本文中仅以数据对象110、120和122分别作为父亲数据对象、以及该父亲数据对象的两个孩子的示例进行描述,可以遍历应用系统中的每个数据对象,并且以递归方式针对每个父亲数据对象执行类似的操作。

继而,可以分别基于获得的各个备份块在备份副本中的各个地址,来生成针对各个数据对象的索引条目。具体地,在图4的框430处,可以基于父亲地址、第一地址和第二地址,生成父亲索引条目、第一索引条目和第二索引条目。在此的索引条目例如可以类似于如图3所示的各个索引条目。例如,父亲索引条目可以对应于图3中的索引条目310,第一索引条目可以对应于索引条目320,而第二索引条目可以对应于索引条目322。

在框440处,可以基于父亲索引条目、第一索引条目和第二索引条目,确定用于备份副本的索引,并且第一索引条目和第二索引条目在索引中是连续的。将会理解,可以基于多种方式来实现本公开中的索引,只要该索引结构可以描述如图3所示的内容即可。例如,可以采用如图3所示的链表结构来实现索引。根据本公开的示例性实现方式,第一数据对象是父亲数据对象的第一个孩子,第二数据对象是第一数据对象的下一兄弟。例如,目录“USR”是目录“/”的第一个孩子,而目录“VAR”是目录“/”的第二个孩子,即,目录“USR”的兄弟。可以定义索引条目的数据结构,该数据结构可以包括:指向备份块在备份副本中的地址的指针,指向数据对象的第一个孩子的指针,以及指向数据对象的下一兄弟的指针。

根据本公开的示例性实现方式,还可以基于队列方式来实现索引。在下文中,将参见图5描述有关以队列方式存储索引的更多细节。图5示意性示出了根据本公开的示例性实现方式的用于备份副本的索引的数据结构的框图500。如图5所示,索引可以包括头部502和跟随在头部502之后的多个索引条目,并且每个索引条目可以对应于一个数据对象。索引条目可以具有预定的长度,例如,可以定义以16字节表示索引条目。

此时,在生成的索引中,头部502包括第1至15字节,用于根目录“/”(数据对象110)的索引条目510包括第16至31字节,用于目录“USR”(数据对象120)的索引条目512包括第32至47字节,用于目录“VAR”(数据对象122)的索引条目514包括第48至63字节,用于目录“BIN”(数据对象130)的索引条目516包括第64至79字节,用于目录“LIB”(数据对象132)的索引条目518包括第80至95字节,用于目录“CAT”(数据对象140)的索引条目520包括第96至111字节,用于目录“LS”(数据对象142)的索引条目522包括第112至127字节,用于文件“LIBC.A”(数据对象144)的索引条目524包括第128至143字节,用于文件“SPOOL”(数据对象134)的索引条目526包括第144至159字节。

在如图5所示的数据结构中,针对兄弟节点的索引条目在索引中位于连续的位置。换言之,同一父亲数据对象的全部孩子数据对象的索引条目被连续存储。如图5所示,虚拟兄弟数组530包括针对兄弟目录“USR”和目录“VAR”的索引条目,并且索引条目512和514连续存储。虚拟兄弟数组532包括针对兄弟目录“BIN”和目录“LIB”的索引条目,并且索引条目516和518连续存储。虚拟兄弟数组534包括针对兄弟目录“CAT”和目录“LS”的索引条目,并且索引条目520和522连续存储。

利用本公开的示例性实现方式,可以将索引存储在持久性存储设备中(例如,以文件或者其他方式存储在硬盘中)。由于针对兄弟数据对象的备份块的索引条目是连续的,在读取索引时,可以一次将连续的多个索引条目读取至高速缓存中,进而避免频繁地从具有较低访问速度的持久性存储设备中读取索引的情况。在下文中,将参见图6描述有关索引条目的更多细节。

图6示意性示出了根据本公开的示例性实现方式的索引中的索引条目的框图600。如图6所示,索引条目可以包括:索引标记610、第一孩子索引612和对象索引614。索引标记610,可以用于指示当前数据对象在层级结构中是否为最后一个孩子。例如,可以以0或者1来表示索引标记610。第一孩子索引612可以用于指示该当前数据对象的第一个孩子的索引条目在索引中的第一位置。对于索引条目510而言,其第一孩子索引可以指示第一索引条目(即,目录“/”的第一个孩子即目录“USR”的索引条目512)在索引中的第一位置。对象索引614,可以用于指示与当前数据对象相对应的备份块在备份副本中的地址。对于索引条目510而言,对象索引可以指向与目录“/”相对应的备份块150在备份副本中的地址。

将会理解,上文仅以目录“/”作为父亲数据对象、并以目录“USR”和目录“VAR”分别作为父亲数据对象的第一个孩子和第二个孩子为示例描述了有关索引条目的细节,用于其他数据对象的索引条目的内容也是类似的。例如针对目录“USR”的索引条目,索引标记可以被设置为“0”,表示该目录“USR”不是最后一个孩子;第一孩子索引可以指向针对目录“BIN”的索引条目;以及对象索引可以指向与目录“USR”相关联的备份块152在备份副本中的地址。

根据本公开的示例性实现方式,可以首先生成索引的头部502,继而逐步生成每个索引条目,并且将生成的各个索引条目附加至索引。具体地,可以将生成的针对目录“/”的索引条目510附加至头部502,此时头部502和索引条目510位于连续的存储空间。可以将后续的针对目录“/”的孩子的索引条目附加至索引的末端。例如,可以将针对目录“USR”索引条目512附加至父亲索引条目510,并且将针对目录“VAR”生成的索引条目514附加至索引条目512。类似地,可以针对其他数据对象来生成相应的索引条目。

图7示意性示出了根据本公开的示例性实现方式的用于备份副本的索引中的各个索引条目之间的关系的框图700。在图7中,各个索引条目的数据结构如图6中所示。索引条目512的索引标记被设置为“0”,表示目录“USR”不是最后一个孩子(如图7中的虚线箭头所示,该目录“USR”具有兄弟目录“VAR”)。进一步,索引条目512的第一孩子索引被设置为“64”,表示针对目录“USR”的第一个孩子(即,目录“BIN”)的索引条目516在索引中的地址。由于索引条目516被存储在第64至第79字节,因而,索引条目512中的第一孩子索引指向索引条目516的起始地址64。

根据本公开的示例性实现方式,可以在生成备份副本中的各个备份块的过程中来生成索引。在此备份副本可以是基于深度优先规则来生成的。根据本公开的示例性实现方式,可以基于深度优先规则,遍历应用系统中的每个数据对象,并且针对每个数据对象来生成备份块。可以在生成备份块之前、同时或者之后生成针对每个数据对象的索引条目。例如,可以首先申请连续的存储空间来用于容纳索引。可以首先在申请的存储空间内定义索引的头部502。基于深度优先规则,可以到达根目录“/”,可以针对根目录来生成相应的备份块150,并且可以将生成的备份块150添加至备份副本。可以在索引中的头部502之后的位置,定义用于根目录“/”的索引条目510。

继而,基于深度优先规则可以到达根目录“/”的第一个孩子,即目录“USR”。可以针对目录“USR”来生成相应的备份块152,并且可以将生成的备份块152添加至备份副本。在索引中的索引条目510之后的位置,可以定义用于目录“USR”的索引条目512。接着,可以基于深度优先原则来继续处理目录“USR”的孩子,直到已经处理了应用系统中的全部数据对象。

将会理解,尽管上文描述了在生成备份副本期间生成索引的情况。备选地和/或附加地,可以针对已经生成的备份副本创建索引。尽管针对已经生成的备份副本创建索引会涉及遍历数据对象和备份块的额外开销,生成的索引可以加速恢复操作的处理,进而降低恢复操作的时间开销。换言之,通过使用索引可以快速地找到期望被恢复的数据对象,进而提高恢复操作的性能。

将会理解,尽管上文仅示意性示出了父亲数据对象仅包括两个孩子的情况。父亲数据对象还可以包括一个或多个孩子,并且上文描述的方法400还适合于存在一个或多个孩子的情况。当父亲数据对象包括一个孩子的时候,此时第二数据对象将变为空,并且上文描述的方法400仍然有效。当父亲数据对象包括两个以上的更多孩子时,还可以逐一处理父亲节点的其他孩子。此时,第一数据对象和第二数据对象将具有更多的兄弟,并且针对多个兄弟的索引条目将被连续地存储在索引中。

在下文中,将描述父亲数据对象包括三个孩子节点的情况。根据本公开的示例性实现方式,一组数据对象进一步包括第三数据对象。在应用系统的层级结构中,第三数据对象是第二数据对象的下一兄弟。此时,可以确定与第三数据对象相对应的第三备份块在备份副本中的第三地址,基于第三地址生成第三索引条目。继而,可以将第三索引条目附加至第二索引条目。利用本公开的示例性实现方式,针对父亲数据对象的全部孩子的索引条目将被连续地存储在索引中。

将会理解,在按照深度优先规则遍历应用系统中的每个数据对象时,在针对父亲数据对象生成父亲索引条目时,并不知晓针对父亲数据对象的全部孩子的索引条目被存储的地址,因而,父亲索引条目中的“第一孩子索引”最初可以是“未设置(unset)”状态。随着遍历应用系统中的更多数据对象,在到达父亲数据对象的孩子时,可以针对孩子生成索引条目,并且利用生成的索引条目在索引中的地址,来更新父亲索引条目中的内容。

根据本公开的示例性实现方式,可以确定孩子数据对象的索引条目在索引中的位置,并利用确定的位置更新父亲数据对象的索引条目中的“第一孩子索引”。具体地,可以确定第一索引条目在索引中的第一位置。例如,对于如图1所示的应用系统而言,最初生成的针对目录“/”的索引条目510中的第一孩子索引可以被定义为“未设置”状态。继而,可以基于第一位置更新父亲索引条目,以使得更新的父亲索引条目包括第一位置。在确定了目录“/”的孩子(即,目录“USR”)的索引条目的在索引中的位置为第32至63字节之后,可以将索引条目510中的“未设置”修改为所确定的位置,即,“第一孩子索引”可以指向起始位置(第32字节)。

根据本公开的示例性实现方式,在层级结构中,可以按照深度优先规则遍历一组数据对象以获得父亲数据对象。可以利用堆栈来存储父亲数据对象的相关信息,以便记录父亲数据对象在层级结构中的位置。具体地,可以将父亲索引条目压入堆栈,以及将父亲索引条目附加至索引。进一步,可以按照深度优先规则找到父亲数据对象的孩子,并且递归地处理父亲数据对象的全部孩子。例如,可以将其他孩子数据对象相关的索引条目压入堆栈,以及将该索引条目附加至索引。

在下文中,将参见图8A至图8I来描述如何生成索引中的各个索引条目。图8A至图8I示意性示出了根据本公开的示例性实现方式的用于生成索引的过程的框图,并且图8A至图8I示出了按照时间顺序逐步生成多个索引条目的过程。下文表1示意性示出了分别针对备份副本、索引以及堆栈执行的操作。具体地,表1中的第一列示出了步骤的标识符。例如,步骤A对应于图8A所示的操作过程,步骤B对应于图8B所示的操作过程,以此类推。在表1中,第二列示出了针对备份副本的操作,第三列示出了针对索引的操作,第四列示出了针对堆栈的操作。

表1操作步骤

首先,参见图8A描述有关步骤A的操作。如图8A所示,可以向备份副本中添加针对数据对象“/”的备份块150。对于索引而言,可以生成针对数据对象“/”的索引条目510,此时索引条目510中的“第一孩子索引”可以被定义为“未设置”,标识可以被定义为“1”,“对象索引”可以被定义为指向数据对象“/”的备份块150在备份副本中的地址,例如“120”。对于堆栈而言,可以将数据对象“/”的索引压栈以形成堆栈条目810,此时堆栈可以包括堆栈条目810。

参见图8B描述有关步骤B的操作。如图8B所示,可以向备份副本中添加针对数据对象“USR”的备份块152。对于索引而言,可以生成针对数据对象“USR”的索引条目512,并且索引条目512中的“第一孩子索引”可以被定义为“未设置”,标识可以被定义为“0”,并且“对象索引”可以被定义为指向数据对象“USR”的备份块152在备份副本中的地址,例如“156”。可以生成针对数据对象“VAR”的索引条目514。索引条目514中的“第一孩子索引”可以被定义为“未设置”,标识可以被定义为“1”,并且“对象索引”可以被定义为“未设置”。进一步,还可以利用数据对象“VAR”的索引条目在索引中的地址,更新数据对象“/”的索引条目的“第一孩子索引”。此时,索引条目510中的“第一孩子索引”被设置为32,即,数据对象“USR”的索引条目512在索引中的地址为“32”。对于堆栈而言,可以将数据对象“USR”的索引压栈以形成堆栈条目812,此时堆栈可以包括堆栈条目810和812。

参见图8C描述有关步骤C的操作。如图8C所示,可以向备份副本中添加针对数据对象“BIN”的备份块154。对于索引而言,可以生成针对数据对象“BIN”的索引条目516,并且索引条目516中的“第一孩子索引”可以被定义为“未设置”,标识可以被定义为“0”,并且“对象索引”可以被定义为指向数据对象“BIN”的备份块154在备份副本中的地址,例如“192”。可以生成针对数据对象“LIB”的索引条目518,索引条目518中的“第一孩子索引”可以被定义为“未设置”,标识可以被定义为“1”,并且“对象索引”可以被定义为“未设置”。进一步,还可以利用数据对象“BIN”的索引条目在索引中的地址,更新数据对象“USR”的索引条目的“第一孩子索引”。对于堆栈而言,可以将数据对象“BIN”的索引压栈以形成堆栈条目814,此时堆栈可以包括堆栈条目810、812和814。

参见图8D描述有关步骤D的操作。如图8D所示,可以向备份副本中添加针对数据对象“CAT”的备份块156。对于索引而言,可以生成针对数据对象“CAT”的索引条目520,并且索引条目520中的“第一孩子索引”可以被定义为“空”,标识可以被定义为“0”,并且“对象索引”可以被定义为指向数据对象“CAT”的备份块156在备份副本中的地址,例如“228”。可以生成针对数据对象“LS”的索引条目522,索引条目522中的“第一孩子索引”可以被定义为“空”,标识可以被定义为“1”,并且“对象索引”可以被定义为“未设置”。对于堆栈而言,由于数据对象“CAT”没有孩子,因而针对堆栈不执行操作。

参见图8E描述有关步骤E的操作。如图8E所示,可以向备份副本中添加针对数据对象“LS”的备份块158。对于索引而言,可以将针对数据对象“LS”的索引条目522中的“第一孩子索引”设置为“空”,并且将索引条目522中的“对象索引”设置为数据对象“LS”的备份块158在备份副本中的地址,例如“82176”。根据本公开的示例性实现方式,根据确定父亲数据对象的全部孩子已经被处理,将堆栈顶部的索引条目弹出。对于堆栈而言,由于数据对象“LS”已经是最后一个孩子,可以将堆栈顶部的堆栈条目814弹出。此时堆栈可以包括堆栈条目810、812。

参见图8F描述有关步骤F的操作。如图8F所示,可以向备份副本中添加针对数据对象“LIB”的备份块160。对于索引而言,可以将针对数据对象“LIB”的索引条目518中的“对象索引”设置为数据对象“LIB”的备份块160在备份副本中的地址,例如“122518”。对于堆栈而言,可以将数据对象“LIB”的索引压栈以形成堆栈条目816。此时堆栈可以包括堆栈条目810、812、已经816。

参见图8G描述有关步骤G的操作。如图8G所示,可以向备份副本中添加针对数据对象“LIBC.A”的备份块162。对于索引而言,可以生成针对数据对象“LIBC.A”的索引条目524,并且索引条目524中的“第一孩子索引”可以被定义为“空”,标识可以被定义为“1”,并且“对象索引”可以被定义为指向数据对象“LIBC.A”的备份块162在备份副本中的地址,例如“122568”。可以将针对数据对象“LIB”的索引条目518中的“第一孩子索引”设置为数据对象“LIBC.A”的索引条目524在索引中的地址,并且将数据对象“LS”的索引条目522中的“第一孩子索引”设置为“空”。对于堆栈而言,由于数据对象“LIBC.A”和“LIB”两者均为最后一个孩子,可以将堆栈顶部的堆栈条目812和816弹出。此时堆栈可以包括堆栈条目810。

参见图8H描述有关步骤H的操作。如图8H所示,可以向备份副本中添加针对数据对象“VAR”的备份块164。对于索引而言,将数据对象“VAR”的索引条目514中的“对象索引”设置为数据对象“VAR”的备份块164在备份副本中的地址。对于堆栈而言,可以将数据对象“VAR”的索引压栈以形成堆栈条目818,此时堆栈可以包括堆栈条目810和818。

参见图8I描述有关步骤I的操作。如图8I所示,可以向备份副本中添加针对数据对象“SPOOL”的备份块166。对于索引而言,可以生成针对数据对象“SPOOL”的索引条目526,并且索引条目526中的“第一孩子索引”可以被定义为“空”,标识可以被定义为“1”,并且“对象索引”可以被定义为指向数据对象“SPOOL”的备份块166在备份副本中的地址,例如“16777280”。可以将针对数据对象“VAR”的索引条目514中的“第一孩子索引”设置为数据对象“SPOOL”的索引条目526在索引中的地址。对于堆栈而言,由于数据对象“VAR”和“/”两者均为最后一个孩子,可以将堆栈顶部的堆栈条目810和818弹出,并且此时堆栈可以为空。

在上文中,已经参见附图描述了如何生成索引的过程,在已经生成索引之后,还可以利用索引来执行搜索操作。根据本公开的示例性实现方式,可以基于生成的索引来找到期望被恢复的数据对象。假设用户期望恢复恢复应用系统中的第一数据对象,可以从生成的索引中找到与待恢复的第一数据对象相对应的第一备份块。将会理解,在读取索引时并不是一次仅仅读取一个索引条目,而是在读取时应当按照与读取操作相关联的预定页面大小来执行读取。通常而言,预定页面大小是索引条目的大小的数倍甚至更多,因此在一次读取操作中可以读取多个索引条目。在下文中,将参见图9描述有关读取索引的更多细节。

图9示意性示出了根据本公开的示例性实现方式的图9示意性示出了根据本公开的示例性实现方式的用于读取索引中的索引条目的框图900。假设期望恢复数据对象“USR”中的数据,则此时可以在索引中找到与数据对象“USR”相对应的索引条目512。继而,可以基于与读取索引相关联的预定页面大小,从索引中读取包括第一索引条目的页面。假设预定页面大小为索引条目的大小的4倍,则可以一次将4个索引条目读取至高速缓存910中。此时,高速缓存910将包括索引条目512、514、516和518。可以基于索引条目512中指示的备份块在备份副本中的地址,来恢复应用系统中的数据对象“USR”。

将会理解,此时高速缓存910中的索引条目可以被重用,例如,在接收到用于恢复应用系统中的其他数据对象的恢复请求时,可以首先在高速缓存910中查找是否存在与接收到的恢复请求相对应的索引条目。如果确定在高速缓存910中存在目标索引条目,则可以直接从高速缓存中找到相对应的地址并用于恢复。也即,可以基于目标索引条目中的目标地址获取与目标数据对象相对应的目标备份块。利用本公开的示例性实现方式,可以减少针对索引的访问操作,并且尽量利用高速缓存中的具有较快访问速度的索引条目来服务于恢复请求。

根据本公开的示例性实现方式,如果接收到用于从备份副本中恢复数据对象“VAR”的恢复请求,可以在读取的页面(即,高速缓存910)中查找与数据对象“VAR”相对应的目标索引条目。由于数据对象“VAR”是数据对象“USR”的下一兄弟,因而用于数据对象“VAR”的索引条目514紧邻用于数据对象“USR”的索引条目512存储,并且该索引条目已经被加载至高速缓存910中。此时,不必再从索引中执行读取,而是可以直接从具有较高访问速度的高速缓存910中直接获得索引条目514。基于索引条目514中记载的数据对象“VAR”在备份副本中的地址,可以迅速找到与数据对象“VAR”相对应的备份块,并执行后续的恢复操作。

根据本公开的示例性实现方式,如果确定在读取的页面中不存在目标索引条目,则可以基于预定页面大小,从索引中读取包括与目标索引条目的页面。接着,可以基于目标索引条目中的目标地址获取与目标数据对象相对应的目标备份块。如果接收到用于从备份副本中恢复文件“CAT”的恢复请求,可以在读取的页面(即,高速缓存910)中查找与文件“CAT”相对应的目标索引条目。由于用于文件“CAT”的索引条目520与用于数据对象“USR”的索引条目512的距离较远,因而该索引条目520并未被加载至高速缓存910中。此时,需要直接从索引中读取索引条目520。在从索引中读取索引条目520的过程中,被读取的索引条目的数量也为4,因而此时可以将索引条目520、522、524和526加载至高速缓存中。

将会理解,由于高速缓存的大小存在限制,当被加载到高速缓存中的数据高于该限制时,例如可以基于最近最少使用规则或者其他规则,来更新高速缓存中的数据。利用本公开的示例性实现方式,在恢复数据对象的过程中,可以充分利用高速缓存具有较快访问速度的优势,来降低恢复操作的时间开销。

将会理解,相同目录下的数据对象具有兄弟关系并且通常具有相似的属性,因而用户通常期望恢复相同目录下的多个数据对象。利用本公开的示例性实现方式,具有兄弟关系的多个数据对象的索引被连续存储在索引中。因而,在一次读取操作中可以同时将有关多个数据对象的索引条目加载至高速缓存。以此方式,可以提高在执行下次恢复操作时命中高速缓存的可能性,进而进一步提高恢复操作的效率。

在上文中已经参见图2至图9详细描述了根据本公开的方法的示例,在下文中将描述相应的装置的实现。根据本公开的示例性实现,提供了一种用于管理应用系统的装置。应用系统包括一组数据对象,一组数据对象包括父亲数据对象、第一数据对象和第二数据对象,在应用系统的层级结构中,父亲数据对象是第一数据对象和第二数据对象的父亲。该装置包括:获取模块,配置用于获取针对一组数据对象的备份副本;地址模块,配置用于分别确定与父亲数据对象相对应的父亲备份块在备份副本中的父亲地址、与第一数据对象相对应的第一备份块在备份副本中的第一地址,以及与第二数据对象相对应的第二备份块在备份副本中的第二地址;生成模块,配置用于基于父亲地址、第一地址和第二地址,生成父亲索引条目、第一索引条目和第二索引条目;以及确定模块,配置用于基于父亲索引条目、第一索引条目和第二索引条目,确定用于备份副本的索引,第一索引条目和第二索引条目在索引中是连续的。

根据本公开的示例性实现方式,第一数据对象是父亲数据对象的第一个孩子,第二数据对象是第一数据对象的下一兄弟,以及其中确定模块包括:附加模块,配置用于将父亲索引条目附加至索引;将第一索引条目附加至父亲索引条目;以及将第二索引条目附加至第一索引条目。

根据本公开的示例性实现方式,位置确定模块,配置用于确定第一索引条目在索引中的第一位置;以及更新模块,配置用于基于第一位置更新父亲索引条目,以使得更新的父亲索引条目包括第一位置。

根据本公开的示例性实现方式,一组数据对象进一步包括第三数据对象,在应用系统的层级结构中,第三数据对象是第二数据对象的下一兄弟,地址模块进一步配置用于确定与第三数据对象相对应的第三备份块在备份副本中的第三地址;生成模块进一步配置用于基于第三地址生成第三索引条目;以及附加模块进一步配置用于将第三索引条目附加至第二索引条目。

根据本公开的示例性实现方式,父亲索引条目包括:索引标记,用于指示父亲数据对象在层级结构中是否为最后一个孩子;第一孩子索引,用于指示第一索引条目在索引中的第一位置;以及对象索引,用于指示与父亲数据对象相对应的父亲备份块在备份副本中的父亲地址。

根据本公开的示例性实现方式,该装置进一步包括:遍历模块,配置用于在层级结构中,按照深度优先规则遍历一组数据对象以获得父亲数据对象;压栈模块,配置用于将父亲索引条目压入堆栈,以及将父亲索引条目附加至索引;递归处理模块,配置用于递归地处理父亲数据对象的全部孩子。

根据本公开的示例性实现方式,递归处理模块包括:孩子处理模块,配置用于将第一索引条目压入堆栈,以及将第一索引条目附加至索引。

根据本公开的示例性实现方式,该装置进一步包括:弹出模块,配置用于根据确定父亲数据对象的全部孩子已经被处理,将堆栈顶部的索引条目弹出。

根据本公开的示例性实现方式,该装置进一步包括:读取模块,配置用于根据接收到用于从备份副本中恢复第一数据对象的第一恢复请求,基于与读取索引相关联的预定页面大小,从索引中读取包括第一索引条目的页面;以及查找模块,配置用于基于第一索引条目中的第一地址获取第一备份块。

根据本公开的示例性实现方式,该装置进一步包括:高速缓存模块,配置用于根据接收到用于从备份副本中恢复目标数据对象的恢复请求,在读取的页面中查找与目标数据对象相对应的目标索引条目;以及查找模块进一步配置用于根据确定在读取的页面中存在目标索引条目,基于目标索引条目中的目标地址获取与目标数据对象相对应的目标备份块。

根据本公开的示例性实现方式,读取模块进一步配置用于根据确定在读取的页面中不存在目标索引条目,基于预定页面大小,从索引中读取包括与目标索引条目的页面;以及查找模块进一步配置用于基于目标索引条目中的目标地址获取与目标数据对象相对应的目标备份块。

图10示意性示出了根据本公开的示例性实现的用于管理应用系统的设备1000的框图。如图所示,设备1000包括中央处理单元(CPU)1001,其可以根据存储在只读存储器(ROM)1002中的计算机程序指令或者从存储单元1008加载到随机访问存储器(RAM)1003中的计算机程序指令,来执行各种适当的动作和处理。在RAM 1003中,还可存储设备1000操作所需的各种程序和数据。CPU 1001、ROM 1002以及RAM 1003通过总线1004彼此相连。输入/输出(I/O)接口1005也连接至总线1004。

设备1000中的多个部件连接至I/O接口1005,包括:输入单元1006,例如键盘、鼠标等;输出单元1007,例如各种类型的显示器、扬声器等;存储单元1008,例如磁盘、光盘等;以及通信单元1009,例如网卡、调制解调器、无线通信收发机等。通信单元1009允许设备1000通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。

上文所描述的各个过程和处理,例如方法400,可由处理单元1001执行。例如,在一些实现中,方法400可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元1008。在一些实现中,计算机程序的部分或者全部可以经由ROM 1002和/或通信单元1009而被载入和/或安装到设备1000上。当计算机程序被加载到RAM 1003并由CPU 1001执行时,可以执行上文描述的方法400的一个或多个步骤。备选地,在其他实现中,CPU 1001也可以以其他任何适当的方式被配置以实现上述过程/方法。,

根据本公开的示例性实现,提供了一种电子设备包括:至少一个处理器;以及与至少一个处理器耦合的存储器,存储器具有存储于其中的指令,指令在被至少一个处理器执行时使得设备执行用于管理应用系统的动作。应用系统包括一组数据对象,一组数据对象包括父亲数据对象、第一数据对象和第二数据对象,在应用系统的层级结构中,父亲数据对象是第一数据对象和第二数据对象的父亲。该动作包括:获取针对一组数据对象的备份副本;分别确定与父亲数据对象相对应的父亲备份块在备份副本中的父亲地址、与第一数据对象相对应的第一备份块在备份副本中的第一地址,以及与第二数据对象相对应的第二备份块在备份副本中的第二地址;基于父亲地址、第一地址和第二地址,生成父亲索引条目、第一索引条目和第二索引条目;以及基于父亲索引条目、第一索引条目和第二索引条目,确定用于备份副本的索引,第一索引条目和第二索引条目在索引中是连续的。

根据本公开的示例性实现方式,第一数据对象是父亲数据对象的第一个孩子,第二数据对象是第一数据对象的下一兄弟,以及其中确定用于备份副本的索引包括:将父亲索引条目附加至索引;将第一索引条目附加至父亲索引条目;以及将第二索引条目附加至第一索引条目。

根据本公开的示例性实现方式,该动作进一步包括:确定第一索引条目在索引中的第一位置;以及基于第一位置更新父亲索引条目,以使得更新的父亲索引条目包括第一位置。

根据本公开的示例性实现方式,一组数据对象进一步包括第三数据对象,在应用系统的层级结构中,第三数据对象是第二数据对象的下一兄弟,该动作进一步包括:确定与第三数据对象相对应的第三备份块在备份副本中的第三地址;基于第三地址生成第三索引条目;以及将第三索引条目附加至第二索引条目。

根据本公开的示例性实现方式,父亲索引条目包括:索引标记,用于指示父亲数据对象在层级结构中是否为最后一个孩子;第一孩子索引,用于指示第一索引条目在索引中的第一位置;以及对象索引,用于指示与父亲数据对象相对应的父亲备份块在备份副本中的父亲地址。

根据本公开的示例性实现方式,该动作进一步包括:在层级结构中,按照深度优先规则遍历一组数据对象以获得父亲数据对象;将父亲索引条目压入堆栈,以及将父亲索引条目附加至索引;递归地处理父亲数据对象的全部孩子。

根据本公开的示例性实现方式,其中递归地处理父亲数据对象的全部孩子包括:将第一索引条目压入堆栈,以及将第一索引条目附加至索引。

根据本公开的示例性实现方式,该动作进一步包括:根据确定父亲数据对象的全部孩子已经被处理,将堆栈顶部的索引条目弹出。

根据本公开的示例性实现方式,该动作进一步包括:根据接收到用于从备份副本中恢复第一数据对象的第一恢复请求,基于与读取索引相关联的预定页面大小,从索引中读取包括第一索引条目的页面;以及基于第一索引条目中的第一地址获取第一备份块。

根据本公开的示例性实现方式,该动作进一步包括:根据接收到用于从备份副本中恢复目标数据对象的恢复请求,在读取的页面中查找与目标数据对象相对应的目标索引条目;根据确定在读取的页面中存在目标索引条目,基于目标索引条目中的目标地址获取与目标数据对象相对应的目标备份块。

根据本公开的示例性实现方式,该动作进一步包括:根据确定在读取的页面中不存在目标索引条目,基于预定页面大小,从索引中读取包括与目标索引条目的页面;以及基于目标索引条目中的目标地址获取与目标数据对象相对应的目标备份块。

根据本公开的示例性实现,提供了一种计算机程序产品,计算机程序产品被有形地存储在非瞬态计算机可读介质上并且包括机器可执行指令,机器可执行指令用于执行根据本公开的方法。

根据本公开的示例性实现,提供了一种计算机可读介质。计算机可读介质上存储有机器可执行指令,当机器可执行指令在被至少一个处理器执行时,使得至少一个处理器实现根据本公开方法。

本公开可以是方法、设备、系统和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于执行本公开的各个方面的计算机可读程序指令。

计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式压缩盘只读存储器(CD-ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。

这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。

用于执行本公开操作的计算机程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,编程语言包括面向对象的编程语言—诸如Smalltalk、C++等,以及常规的过程式编程语言—诸如“C”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实现中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA),该电子电路可以执行计算机可读程序指令,从而实现本公开的各个方面。

这里参照根据本公开实现的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本公开的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。

这些计算机可读程序指令可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理单元,从而生产出一种机器,使得这些指令在通过计算机或其他可编程数据处理装置的处理单元执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。

也可以把计算机可读程序指令加载到计算机、其他可编程数据处理装置、或其他设备上,使得在计算机、其他可编程数据处理装置或其他设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其他可编程数据处理装置、或其他设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。

附图中的流程图和框图显示了根据本公开的多个实现的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

以上已经描述了本公开的各实现,上述说明是示例性的,并非穷尽性的,并且也不限于所公开的各实现。在不偏离所说明的各实现的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实现的原理、实际应用或对市场中的技术的改进,或者使本技术领域的其他普通技术人员能理解本文公开的各实现。

相关技术
  • 用于管理应用系统的方法、设备和计算机程序产品
  • 用于管理应用系统的方法、设备和计算机程序产品
技术分类

06120112880999