处理兄弟调用的制作方法

文档序号:18456655发布日期:2019-08-17 01:38阅读:282来源:国知局
一个或多个方面总体涉及计算环境内的处理,尤其涉及与兄弟调用相关联的处理。
背景技术
::兄弟调用(siblingcalls,也称sibcalls)是在调用例程的结尾执行的对诸如函数(function)或子例程的例程的调用。当调用者进行兄弟调用时,调用者不期望被调用的例程返回到该调用者。调用例程和被调用例程可以是相同的例程。发生这种情况时,可以将该调用称为尾调用(tailcall)。这里使用的术语“兄弟调用”及其派生用语,包括尾部调用及其派生用语。检测和实现兄弟调用提供了改进代码性能的机会。然而,当今的许多环境中,兄弟调用的有效性受到仅限于对本地被调用者(callees)进行兄弟调用的限制。当兄弟调用者(sibcaller)(即,调用其兄弟例程的函数)已经被本地调用时,原始调用可能尚未生成用于执行从外部函数的返回的足够信息。由于不知道将是用本地调用还是外部调用来调用该兄弟调用者,编译器可能不会生成对任何外部符号的兄弟调用。技术实现要素:通过提供用于便利计算环境内的处理的计算机程序产品,克服了现有技术的缺点并提供了额外的优点。该计算机程序产品包括存储介质,该存储介质可由处理电路读取并存储用于由处理电路执行以执行方法的指令。该方法包括,例如,确定例程是否可能调用一个或多个外部兄弟例程;并根据确定该例程可能调用一个或多个外部例程而将该例程标记为外部兄弟调用者。通过将该例程标记为外部兄弟调用者,可以执行各种优化,从而改善计算环境内的性能。在一个实施例中,所述标记(marking)包括向该例程添加一个伪指令。该伪指令向在计算环境的处理器上执行的链接器(linker)指示该例程可能调用一个或多个外部兄弟例程。作为一个示例,基于该伪指令,在符号数据结构中设置标记,指示该例程可能调用一个或多个外部兄弟例程。作为另一示例,基于伪指令,提供与该例程相关联的重定位条目(relocationentry)以指示该例程可能调用一个或多个外部兄弟例程。在另一个实施例中,所述标记包括将一标志(marker)添加到该例程的符号数据结构,该标志指示该例程可能调用一个或多个外部兄弟例程。在又一个实施例中,所述标记包括提供与该例程相关联的重定位条目,以指示该例程可能调用一个或多个外部兄弟例程。在一个方面,该方法还包括通过在计算环境的处理器上执行的链接器确定该例程被标记为外部兄弟调用者;并且基于确定该例程被标记为外部兄弟调用者,基于由返回到该例程的调用者的例程调用的兄弟例程来提供要使用的上下文。作为示例,该上下文包括用于将指示符恢复指向一个全局偏移表(globaloffsettable)的指示符的信息。在实施例中,该例程在一个模块中并由该一个模块中的调用例程调用,或者该例程在一个模块中并由另一个模块中的调用例程调用。作为一个示例,所述确定和所述标记由编译器执行。本文还描述并要求保护与一个或多个方面有关的方法和系统。此外,在此还描述并且可以要求保护与一个或多个方面有关的服务。通过本文描述的技术实现了额外的特征和优点。在此详细描述了其他实施例和方面,这些实施例和方面被认为是所要求保护的方面的一部分。附图说明在说明书结尾处的权利要求中特别指出并清楚地要求作为实施例保护一个或多个方面。通过以下结合附图的详细描述,一个或多个方面的前述和其它目的、特征和优点是显而易见的,其中:图1a描绘了根据本发明的一个方面的父例程调用子例程的一个示例,该子例程然后调用兄弟例程。图1b描绘了根据本发明的一个方面的多个兄弟例程的使用;图2a描绘了父例程调用本地子例程的一个实施例;图2b描绘了本地子例程调用外部兄弟例程的一个实施例;图3a描绘了根据本发明的一个方面的将子例程标记为兄弟调用者的一个实施例;图3b描绘了根据本发明的一个方面使用的符号表的一个示例;图3c描绘了根据本发明的一个方面,基于子例程被标记为兄弟调用者而恢复的上下文信息的一个示例;图4a描绘了根据本发明的一个方面的与兄弟调用者相关联的处理的一个实施例;图4b描绘了根据本发明的一个方面的与潜在外部兄弟调用者相关联的处理的一个实施例;图5描绘了根据本发明的一个方面,用于基于是否正在调用兄弟调用者来选择要存储的信息的处理的一个实施例;图6描绘了根据本发明的一个方面的与调用兄弟调用者相关联的处理的一个实施例;图7a描绘了根据本发明的一个方面的调用外部兄弟例程的外部子例程的一个示例;图7b描绘了根据本发明的一个方面的与调用外部兄弟例程相关联的处理的一个实施例;图8描绘了根据本发明一个方面提供对父例程以为它正在调用一个本地子例程但却是在调用外部外部子例程或本地子例程调用了外部兄弟例程的的情况的校正的一个实施例。图9a-9b描绘了根据本发明的一个方面的便利计算环境中的处理的一个实施例;图10描绘了结合和使用本发明的一个或多个方面的计算环境的一个实施例;图11a描绘了结合和使用本发明的一个或多个方面的计算环境的另一个实施例;图11b描绘了图11a的存储器的一个实施例;图12描绘了云计算节点的一个实施例;图13描绘了云计算环境的一个实施例;图14描绘了抽象模型层的一个示例。具体实施方式根据本发明的一个或多个方面,提供了一种便于使用兄弟调用的能力。例如,提供优化以有效地使用兄弟调用以及增强与其相关联的处理。兄弟调用比其他函数调用的效率高。以下述子(child)例程为例:child(){returnsib(a+1);{在一个示例中,在不使用兄弟调用的情况下,进行以下处理:child:(分配堆栈帧)ldr3,r2,a@gotaddir3,r3,1blsibnop(释放堆栈帧)blr例如按照power架构,其中ld是加载(load),addi是立即添加(addimmediate),bl是分支链接(branchlink),nop是空操作(nooperation),blr是分支到链接寄存器(branchtolinkregister)。然而,在一个实施例中,如果使用兄弟调用,则处理如下:child:ldr3,r2,a@gotaddir3,r3,1bsib因此,通过使用兄弟调用,子例程不需要分配或释放用于保存要被函数child()使用、以便——在对函数sib()的子例程调用已经返回后——返回其调用者的返回信息的堆栈帧(stackframe),在链接器将对sib()的调用解析为对应于相对于函数child()的模块而言是外部的函数的情况下,也不需要执行作为潜在全局偏移表(got)恢复指令的占位符(placeholder)的nop。函数child()使用分支指令b将控制转移到sib(),函数sib()直接返回到child()的调用者。因此,代码更简单,更有效。参考图1a-1b描述关于兄弟调用的进一步细节。如图1a所示,父(parent)例程100调用子例程102。该子例程然后调用兄弟例程104。子例程102被称为兄弟调用者,而兄弟例程104被称为兄弟被调用者(sibcallee)。兄弟例程104直接返回到父例程100,而不是返回到子例程102,子例程102然后会返回到父例程100。如图1b所示,兄弟被调用者104可以进一步调用兄弟例程106,后者然后直接返回到父例程100。在这种情况下,兄弟例程104也是兄弟调用者,兄弟例程106则是兄弟被调用者。在调用函数中,可以使用应用程序二进制接口(abi),其确定函数是如何被调用的。abi可以使用链接器管理的全局偏移表(got),该表提供对变量的访问。特别地,编译器从源代码生成目标代码,而不知道代码/数据的最终地址或位移(displacement)。具体地,编译器生成将访问变量值的变量地址引用数据结构(例如,全局偏移表或目录(toc))的目标代码,而不知道数据结构的最终大小或各种数据部分的偏移/地址。此信息的占位符保留在目标代码中并由链接器更新。对于具有链接器管理的got(或类似结构)的abi,兄弟调用当前限于编译器确定的本地调用。参考图2a描述本地调用的示例。父例程200调用与该父例程在同一模块内的子例程202。已知子例程是本地例程,因此没有got更新;也就是说,不存在对上下文信息的更新—上下文信息包括例如返回信息,诸如对got的指示符(例如,got指针)和/或其他信息。由于子例程是本地的,在返回到父例程时,上下文不需要更新,因此,父例程200包括一个nop指令210,而不是一个要恢复上下文的指令。由于上下文得不到恢复,如果本地子例程调用外部兄弟例程,则上下文将是不正确的。例如,如图2b所示,子例程202可以调用兄弟例程220,其与子例程202以及父例程200处于不同的模块中,因此是外部兄弟例程。链接器通过例如过程链接表(plt)存根(stub)将子例程202连接到外部兄弟例程220。plt存根提供一个到外部函数220的蹦床。外部函数220执行并使用got来引用其自己的全局变量。它还更新上下文信息,例如got。当它用分支到链接寄存器(blr)指令222返回时,它返回到父例程中的nop210。但是,got尚未恢复,因为对函数child()的调用是作为模块-本地调用生成的,因此无需恢复got指针(对应于执行在其中发生的模块的示例函数上下文)。因此,父例程下一次使用got时,错误地将got用于模块2的而不是模块1。因此,兄弟调用当前局限于编译器确定的本地调用。该问题的出现,是因为对链接器隐藏了对外部函数(或甚至潜在的外部函数)的调用。链接器看到本地调用,省略了对上下文信息—例如got指针—的恢复。因此,根据本发明的一个方面,将诸如子函数(childfunction)202的子(child)例程标记为可能调用兄弟例程的例程。在一个实施例中,仅标记可能正在调用外部兄弟例程的兄弟调用者。所述标记—如图3a所示—例如可以包括在该子例程中放置一个伪指令(即,不被处理器执行但向链接器提供指示的指令),称为兄弟调用者300。例如,兄弟调用者伪指令300向链接器提供该例程是或可能是兄弟调用者的指示。例如,基于伪指令300,汇编器或其他二进制对象转换器标记例如符号数据结构(例如,表)或提供该例程的重定位(reloc)条目,以指示该例程是兄弟调用者或可能是兄弟调用者。作为示例,可以使用不同的伪指令、标记和/或重定位来区分调用兄弟例程和调用外部兄弟例程。许多变化都是可能的。在如图3b中所示的一个特定示例中,生成符号表330并将其存储在应用程序的目标代码332中(例如,存储在存储器中,磁盘上,等等)。符号表包括多个字段,例如符号名称336,类型340,范围342;根据本发明的一个方面,还包括标记字段338指示该函数是否是个兄弟调用者。如果该函数是个兄弟调用者或者可能是个兄弟调用者—如伪指令300所指示的那样,则将标记字段338设置为例如1;否则将其设置为例如0。在另一示例中,基于伪指令300,按照应用二进制接口(abi)创建一个重定位条目(例如,.reloc),并且将其与该函数相关联,以指示该函数是或可能是个兄弟调用者。可以按照elf(可执行和可链接格式)或类似的目标文件定义来生成重定位条目(.reloc)。在进一步的示例中,可以在别处—诸如在.localentry(本地条目)、符号表或.reloc重定位条目中—设置一个指示;或者可以提供函数和/或其相关联的函数符号的另一标记。作为示例,可以在符号表中设置该标记,或者可以在不使用伪指令的情况下生成重定位条目。许多变化都是可能的。根据一个或多个实施例,中间代码—诸如文本汇编语言表示—的标志指示,转而可以被转换为一个符号表条目中的标志(例如,使用与按照elfabi的示例elf(可执行和可链接格式)格式结合使用的符号表条目中的st_other字段或另一个字段的至少一个比特)、二进制重定位指示符或用于把函数或其函数符号标记为对应于目标文件格式的兄弟调用者的另一个对象表示。在又一个实施例中,该目标文件格式可以由代码生成工具(例如编译器)直接生成。在又一实施例中,可以将重定位(reloc)条目添加到一个函数,以指示它是兄弟。通常,函数调用是用几个函数调用重定位之一指示的。因此,重定位可以被用于与函数调用不同的兄弟调用。这种重定位的存在本身可以是函数调用兄弟例程的指示符。扫描该函数以确定是否存在任何兄弟调用。为了更快地确定,在符号表中放置指示符或在函数开始处放置特殊的“标志重定位”,比查看函数以确定是否存在这样的重定位,处理起来可能更容易/更快捷。当被标记的兄弟调用者由链接器链接,并且该兄弟调用者的调用者是本地调用者时,链接器基于调用兄弟调用者的调用者,生成存储足够上下文的调用序列。例如,存储got指针的当前值并插入诸如got指针恢复代码的上下文恢复代码,以便可以执行一个外部兄弟调用。例如,返回图3a,基于兄弟调用者伪指令300,链接器获得该函数可以调用非本地兄弟例程的指示(例如,被通知,确定等),因此,即使对于本地调用,链接器也插入例如got指针恢复代码310而不是nop210。在此示例中,r2是got寄存器,ld指加载(load)。参见图3c,基于链接器获得该指示和链接器提供该恢复代码,当子例程202调用兄弟例程220并且sib220经由blr222返回到父例程200时,上下文信息—例如got—被恢复310,所以父例程200下次引用got时,它引用的是正确的got。例如,在一个实施例中,如果子例程202是一个外部兄弟例程的潜在兄弟调用者,则上下文(例如,got指针)被存储,这样,上下文信息可以在从sib例程220返回时被恢复。作为一个示例,上下文可以存储在存根(stub)中,例如缩略的过程链接表(plt)存根或其他存储上下文信息的存根中。在另一实施例中,放置在(例如,在bl子指令之上的)父例程中以提供用于外部调用的got存储指令的占位符的占位符指令(例如,nop指令)被替换为got存储指令。其他示例可用于存储上下文信息。如果父例程和子例程在相同模块或不同模块中,则可以使用上述技术。也就是说,子例程可以是父例程的本地例程,也可以是父例程的外部例程,其中通过例如plt存根来访问子例程。这适用于外部的情况(其中,被调用函数的兄弟调用者指示对于链接器来说可能是不可见的),这是因为,无论兄弟调用者子函数中是否存在兄弟调用者伪指令300(根据定义,它不可用,因为它是正被链接的当前模块的外部的),静态链接器都插入got保存/恢复序列,因为子例程是外部的。参考图4a-4b描述关于标记兄弟调用者的进一步细节。首先,参考图4a,编译器分析代码,寻找潜在的兄弟调用者,步骤400。例如,编译器分析代码,寻找其中调用者不执行对被调用函数的结果的进一步处理的函数调用。如果确定某例程是潜在的兄弟调用者,查询402,则将该例程标记为兄弟调用者,步骤404。例如,编译器插入兄弟调用者伪指令,标记一个符号表和/或添加一个重定位条目。然而,如果某例程未被确定为兄弟调用者(或潜在的兄弟调用者),则不执行这样的标记,步骤406。在另一方面,确定并标记可能正在调用可能的外部兄弟的兄弟调用者(例如,而不是所有兄弟调用者)。例如,如图4b所示,编译器分析代码,以寻找可能是外部的兄弟调用者;即,可能潜在地调用可能是外部的兄弟被调用者的兄弟调用者,步骤420。在这种情况下,编译器分析代码,查找其中调用者不执行对被调用函数的结果的进一步处理的函数调用。此外,它还确定是否已知该兄弟调用是本地兄弟调用(例如,基于编程构造)。如果已知它是本地兄弟调用,那么它不会被标记为可能会调用潜在的外部兄弟的潜在的外部兄弟调用者。但是,如果不知道该调用是本地兄弟调用,则将该兄弟调用者标记为可能调用可能的外部兄弟。在另一方面,确定并标记可能正在调用潜在外部兄弟的兄弟调用者(例如,而不是所有兄弟调用者)。例如,如图4b所示,编译器分析代码,以寻找可能是外部的兄弟调用者;即,可能潜在地调用潜在外部的兄弟被调用者的兄弟调用者,步骤420。在这种情况下,编译器分析代码,查找其中调用者不执行对被调用函数的结果的进一步处理的函数调用。此外,它还确定是否已知兄弟调用是本地兄弟调用(例如,基于编程构造)。如果已知它是本地兄弟调用,那么它不会被标记为可能会调用潜在的外部兄弟的潜在的外部兄弟调用者。但是,如果不知道该调用是本地兄弟调用,则将该兄弟调用者标记为可能调用潜在的外部兄弟。在一个实施例中,编译器结合兄弟调用者重定位信息提供关于兄弟被调用者的信息。在另一实施例中,链接器分析编译器生成的代码以确定兄弟被调用者。在一个实施例中,编译器发出额外的提示,例如,通过指示每个函数的长度或范围,或者,如果某函数已经以不连续的方式被编译,则指示多个范围,以帮助链接器分析兄弟调用者函数。如果确定可能正在调用外部兄弟例程的兄弟调用者,查询422,则将该兄弟调用者标记为潜在外部兄弟调用者,步骤424。在一个实施例中,编译器插入兄弟调用者伪指令(或特定于潜在外部兄弟调用者的另一个兄弟调用者伪指令),标记一个符号表和/或添加一个重定位条目。在又一个实施例中,链接器分析兄弟调用点的代码。然而,如果还没有找到这样的潜在外部兄弟调用者,则不执行这样的标记,步骤426。在另一方面,参考图5,当链接器链接一组对象并确定可以执行一个本地调用时,链接器执行测试以确定被调用的函数是否对应于可能正在调用外部兄弟的兄弟调用者,查询500。在一个实施例中,这对应于确定被调用函数是否已被标记为兄弟调用者,如图4b所述。在另一个实施例中,测试是某兄弟调用者是否正被调用,而不考虑该兄弟调用者是否可能潜在地要调用外部兄弟被调用者。在一个示例中,这对应于确定被调用函数是否已根据例如图4a的技术被标记为兄弟调用者。在又一个实施例中,这对应于确定被调用函数是否已根据例如图4a的技术被标记为兄弟调用者,并且还包括——例如基于目标代码和相关重定位之一,或者以某文件格式为某兄弟调用者指定的兄弟调用者的列表——对任何兄弟被调用者是否可能对应于某外部兄弟被调用者的基于链接器的分析。如果某兄弟调用者正被调用——该兄弟调用者可能潜在地调用某外部兄弟被调用者(或者,在另一个实施例中,无论是调用外部兄弟被调用者还是本地兄弟被调用者的兄弟调用者),则链接器生成外部调用序列,其存储和恢复足够的上下文信息,以便兄弟调用者可以调用外部兄弟例程(例如,存储got或toc信息),步骤502。然而,如果某兄弟调用者不在被调用——该兄弟调用者可能潜在地调用某外部兄弟被调用者(或者,在另一个实施例中,无论是调用外部兄弟被调用者还是本地兄弟被调用者的兄弟调用者),则链接器生成缩略的外部调用序列,步骤504。就是说,生成更有效率的调用,其不存储和恢复足够的上下文信息以便该兄弟调用者可以调用外部兄弟例程。为效率起见省略了代码。在执行期间,在一个实施例中,所生成的代码执行对该兄弟调用者(其被如此地标记)的调用并且存储上下文信息以便能够执行从外部模块的返回。该兄弟调用者然后被调用。该兄弟调用者对其外部兄弟—该兄弟被调用者—执行外部兄弟调用。当该兄弟调用者被本地调用时,该兄弟被调用者使用由调用者存储到该兄弟调用者的全局返回信息执行外部函数返回。从该兄弟被调用者返回后,该上下文信息(例如got指针)被恢复。在另一方面,确定兄弟被调用者是否实际上是外部的并且基于此采取行动。参考图6,在一个实施例中,链接器确定是否正在调用可能潜在地调用外部兄弟被调用者的兄弟调用者(或者,在另一个实施例中,不管是潜在地调用外部兄弟被调用者还是本地兄弟被调用者的兄弟调用者),查询600。如果正在调用可能潜在地调用外部兄弟被调用者的兄弟调用者(或者,不管是潜在地调用外部兄弟被调用者还是本地兄弟被调用者的兄弟调用者),链接器根据链接结果确定兄弟调用目的地,步骤602。确定是否该兄弟调用者在其任何路径中实际调用外部兄弟,步骤604。如果调用外部兄弟,则存储足够的上下文信息,以便该兄弟调用者可以调用外部兄弟(例如,got信息),步骤606。但是,如果该兄弟调用者不调用外部兄弟,询问604,或者可能潜在地调用外部兄弟被调用者的兄弟调用者(或者无论是潜在潜在地调用外部兄弟被调用者还是本地兄弟被调用者)不被调用,查询600,则生成更有效的调用,步骤608。就是说,省略诸如上下文信息的保存/恢复之类的信息。在一个实施例中,如果第一兄弟调用者的任何兄弟被调用者被标记为兄弟被调用者,则将该兄弟被调用者作为外部兄弟对待。在另一个实施例中,如果第一兄弟调用者的任何兄弟被调用者被标记为兄弟调用者并且第一兄弟调用者的兄弟调用不是尾部调用(即,第一兄弟调用者的兄弟被调用者不是第一兄弟调用者调用自己),将该兄弟被调用者作为外部兄弟对待。作为进一步的实施例,关于外部模块调用计算兄弟调用者的传递闭包(transitiveclosure)(即,以确定由兄弟调用者调用的任何兄弟被调用者是正在调用外部模块,还是正在调用可能正在调用外部兄弟的兄弟调用者,等等),如果在被调用兄弟的传递闭包中找到任何外部兄弟调用者,则通过保存足够的信息以从这样的最终外部兄弟返回的调用来调用该兄弟调用者。在一个实施例中,优化分析、配置文件、程序员提示或简档定向反馈可以指示为某些函数—而非其它—执行一个或多个兄弟调用者优化。例如,当兄弟调用者很少调用兄弟例程时,优化可能不是有利的,程序员、反馈组件或分析组件之一可以决定抑制对特定兄弟调用者的优化。在一个示例中,这个自适应步骤抑制兄弟调用者的调用点并执行正常的函数调用而非兄弟调用,使得兄弟调用者不被标记。其他例子也是可能的。在另一个实施例中,优化分析、配置文件、程序员提示或简档定向反馈可以指示为兄弟调用者的一些被调用兄弟例程—而非其它—执行一个或多个兄弟调用者优化。例如,如果一个兄弟调用者通常被调用并且是本地的,而另一个很少被调用并且是外部的,当兄弟调用者很少调用兄弟例程时,在该调用点的优化可能不是有利的,程序员、反馈组件或分析组件之一可以决定抑制对特定兄弟调用者的优化。在一个示例中,这个自适应步骤抑制可能是对siblerler的兄弟例程的一个调用点,并且在决定存储上下文信息以允许外部返回时从要被考虑的兄弟被调用者的列表中排除该符号。本发明的另一方面针对子例程在其父例程外部的情况。在一个示例中,在其父例程外部的子例程不调用外部兄弟,因为这样的调用可能破坏上下文信息(例如,got指针)。例如,参考图7a,如果父例程200在一个模块700(例如,模块3)中并且经由例如plt存根706(或函数调用)调用另一模块702(例如,模块1)中的子例程202,则plt存根706存储对应于模块3的上下文信息(例如,got指针)。然后,如果子例程202经由例如plt存根710(或函数调用)调用在另一模块704(例如,模块2)中的兄弟例程220,则plt存根710存储覆盖对应于模块3的第一上下文信息的其他上下文信息。然而,在从模块2中的兄弟例程220返回到模块3中的父例程200(例如,blr222)时,所期望的,是对应于模块3的第一上下文信息。在plt存根的一个实施例中,使用以下代码序列将控制从模块1转移到模块2,同时使用标准双倍存指令存储对应于模块2的got指针:stdr2,24(r1)addisr12,r2,func@plt@toc@haldr12,func@plt@toc@l(r12)mtctrr12bctr其中std是双倍存(storedouble),addis是立即添加(addimmediate),toc是目录(tableofcontents),ld是加载(load),mtctr是转移到计数寄存器(movetocountregister),bctr是分支计数器寄存器(branchcounterregister)。在另一实施例中,std指令被放置在先前由编译器分配的占位符位置中,并且plt存根仅执行控制转移:addisr12,r2,func@plt@toc@haldr12,func@plt@toc@l(r12)mtctrr12bctr然而,按照本发明的一个方面,第二上下文信息的保存(save)被抑制。例如,链接器或编译器创建一个plt存根而不为兄弟调用保存上下文信息(例如没有got指针保存;例如没有std指令)。作为示例,可以用一个重定位来将兄弟调用的存在指示为兄弟调用者作出的特定调用而非正常调用,由此抑制要被放入plt存根中或计划的占位符中的std。这样,兄弟调用的plt存根可以对应于以下序列,既没有作为plt存根的std指令,也没有放置在编译器为接收这样一个got存储指令而创建的占位符中的std:addisr12,r2,sib@plt@toc@haldr12,sib@plt@toc@l(r12)mtctrr12bctr在另一实施例中,当生成代码时,为了避免创建要求更新链接器以理解新定义的兄弟调用重定位的新重定位命令(relocs),编译器生成例如指向与兄弟调用一起的虚拟位置的tocsave重定位,并且链接器填充不被执行的未使用位置,有效地抑制got保存。参考图7b描述与涉及外部兄弟例程的处理有关的进一步细节。一开始,判断(例如,通过链接器或编译器)某子例程(或其他兄弟例程)是否正在调用外部兄弟例程,而不是非兄弟外部函数调用,查询720。通过下述方式可以识别外部兄弟调用,例如:对兄弟调用使用新的重定位命令,指示它是兄弟调用而不是非兄弟函数调用;或者判断是否有没有返回到外部符号的分支。如果使用兄弟调用来调用外部兄弟例程,则根据本发明的一个方面,不保存包括got指示符(例如,got指针)的上下文信息(这在本文中称为不保存got),以便在从兄弟被调用者返回时,可以恢复对兄弟调用者的调用者的原始上下文,步骤722。然而,如果正在执行外部函数调用(而不是兄弟调用),则保存上下文信息,包括指向got的指示符(例如,got指针)(这在本文中称为保存got),以便以后可以恢复上下文信息。除了上述之外,在代码中,可以将调用定义为本地调用,并且因此,编译器可以将nop指令抑制为来自外部调用的got恢复指令的占位符。然而,如果指示子例程(childs)调用外部兄弟,则按照现有技术,是不能恢复上下文的,因为没有为接收上下文恢复指令的位置提供占位符nop指令。因此,根据本发明的一个方面,不是直接分支到可以调用外部兄弟例程的子(child)兄弟调用者,而是可以将子例程分支从分支链接编辑到子例程到分支到存根函数,其包括到子例程的分支链接,以及上下文信息(例如,got信息)的存储和恢复指令。特别地,如图8中所示,父例程200调用子例程202,后者已知是本地例程。因此,父例程200不包括nop指令。然而,子例程202调用外部兄弟220。因此,根据本发明的一个方面,分支链接(bl)语句800被替换为分支到存根指令802,其分支到存根810。在该存根中,上下文信息被保存812,以后在从兄弟例程220返回820时被恢复814。这里详细描述的是可以执行以有效地处理兄弟调用的多个优化。本发明的一个或多个方面与计算机技术密不可分,并便利计算机内的处理,从而提高整体性能。参考图9a-9b描述便利计算环境中的处理的一个特定实施例。该实施例包括标记调用或潜在地调用外部兄弟被调用者的兄弟调用者例程,以便优化与其相关联的处理。首先参见图9a,确定某例程是否潜在地调用一个或多个外部兄弟例程(900)。作为示例,该例程在一个模块中并由该一个模块中的调用例程调用,或者,该例程在一个模块中并由另一个模块中的调用例程调用(901)。基于确定该例程潜在地调用一个或多个外部兄弟例程,将该例程标记为外部兄弟调用者(902)。在一个示例中,所述确定和所述标记由编译器执行(903)。其他实施例和示例也是可能的,并且被认为落在要求保护的发明的范围内。在一个实施例中,所述标记包括向该例程添加一个伪指令(904)。该伪指令向在计算环境的处理器上执行的链接器指示该例程可能调用一个或多个外部兄弟例程(906)。基于该伪指令,在一个示例中,在一个符号数据结构中设置一个标志,指示例程可能调用一个或多个外部兄弟例程(908)。在另一示例中,基于该伪指令,提供一个与该例程相关联的重定位条目,以指示该例程可能调用一个或多个外部兄弟例程(910)。参见图9b,在另一个实施例中(例如,其中可以不使用伪指令),所述标记包括将一个标志添加到例程的符号数据结构(912)。该标志(例如,被设置为1)指示该例程可能调用一个或多个外部兄弟例程(914)。在又一实施例中(例如,其中可以不使用伪指令),所述标记包括提供一个与该例程相关联的重定位条目,以指示该例程可能调用一个或多个外部兄弟例程(916)。在另一方面,在计算环境的处理器上执行的链接器确定该例程被标记为外部兄弟调用者(920),并基于确定该例程被标记为外部兄弟调用者而提供基于被该例程调用的外部兄弟例程返回该例程的调用者而要被使用的上下文(922)。在一个示例中,上下文包括用于恢复指向全局偏移表的指示符的信息(924)。如本文所述,根据本发明的一个或多个方面,由例如编译器标记兄弟调用者。在一个实施例中,标记可能正在调用外部兄弟例程(例如,不同模块中的兄弟例程)的兄弟调用者,而不标记可能正在调用本地兄弟例程(例如,在与兄弟调用者相同的模块内)的兄弟调用者。在一个实施例中,当被标记的兄弟调用者由链接器链接,且该兄弟调用者的调用者是本地调用者(例如,调用者和兄弟调用者在同一模块中)时,链接器生成的调用序列存储足够的信息,以便该兄弟调用者可以执行外部兄弟调用。在另一实施例中,当被标记的兄弟调用者由链接器链接,该兄弟调用者的调用者是本地调用者,并且该兄弟调用者被标记为外部兄弟调用者时,链接器生成存储足够信息以便可以进行外部兄弟调用的调用序列。在一个实施例中,识别一个兄弟调用者(例如,识别为正被调用的函数,其可能用兄弟调用序列来调用兄弟例程),使得例如链接器可以插入用以保存完整上下文的代码(例如,用于存储/恢复got指针的代码),以防该兄弟调用者可能想要转移到外部兄弟。编译器执行所述标记,并且,在一个实施例中,只有可能潜在地调用外部兄弟例程的兄弟调用者才被编译器标记。通过不标记不调用外部兄弟例程而是调用本地兄弟例程的兄弟调用者,可以避免额外的开销。作为示例,用指示符来进行标记。例如,指示符是根据应用程序二进制接口的重定位类型,例如elfabi。作为另一示例,指示符是该函数的符号表条目中的标志(flag)。在一个示例中,(例如,由汇编器或其他二进制对象转换器)基于编译器放置在兄弟调用者中的伪指令来设置该指示符。基于所选择的实施例,该伪指令被放置在所有兄弟调用者中或者被确定为可能调用外部兄弟例程的兄弟调用者中。作为一个示例,编译器发出具有该指示符的文件,链接器读取该文件。在一个实施例中,链接器读取函数的指示符,并基于该指示符被设置(例如,设置为1)—表示兄弟调用者可能调用兄弟例程或外部兄弟例程—取决于实施例,基于调用可能正在调用外部兄弟例程的兄弟调用者而保存完整上下文(例如,got指针的存储/恢复代码)。然而,如果该兄弟调用者正在调用本地兄弟例程,则基于确定该兄弟调用者仅用兄弟调用来调用本地兄弟调用者,则在对该兄弟调用者的调用点处抑制对上下文的保存。如所指出的那样,兄弟调用者由例如编译器标记。在一个特定实施例中,可能正在调用外部兄弟例程的兄弟调用者是如此标记的。在一个示例中,编译器提供关于潜在的兄弟被调用者的信息——例如通过连同兄弟调用者重定位一起提供兄弟被调用者的列表。在另一个示例中,链接器分析编译器生成的代码以确定兄弟被调用者。在一个实施例中,编译器发出附加的提示以帮助链接器分析兄弟调用者例程(例如,通过指示每个例程的长度或范围,或者—如果例程已经以不连续的方式被编译—指示多个范围)。在一个实施例中,当被标记的兄弟调用者被链接器链接,并且该兄弟调用者的调用者是本地调用者,并且该兄弟调用者被标记为可能外部的兄弟调用者时,链接器执行一个分析步骤,以确定任何被调用的兄弟例程实际上是外部兄弟例程。如果不存在外部兄弟例程(例如,兄弟例程已经例如由静态链接器在本地解析),则执行对该兄弟调用者的本地调用。如果该兄弟调用者调用的至少一个兄弟例程是外部的,则在调用本地兄弟调用者之前存储用以执行外部例程返回的足够信息。在一个实施例中,链接器生成存储足够信息的调用序列,以便可以执行外部兄弟调用。在一个实施例中,编译器可以为兄弟调用者创建可以作为兄弟例程调用的例程的列表,并在目标文件中提供该列表。例如,将该列表与是兄弟调用者的函数相关联,或者作为例程开始处的重定位(或重定位序列)。链接器以下述方式使用这个信息:如果所有兄弟被调用者都是本地的,那么,当该兄弟调用者被作为函数调用时,可以被用一个保存“本地调用”上下文的序列来调用(例如,没有got指针的存储/恢复);否则,以完整的上下文保存调用(例如,具有got指针的存储/恢复),因为它可能将控制权移交给一个外部例程,该外部例程将返回并恢复该外部例程的上下文。在另一个实施例中,可以提供一个指示符,该指示符与可能被作为兄弟例程调用的例程的列表相关联,该列表的例程被指示为是兄弟调用者的例程所调用。将该列表与一个是兄弟调用者的例程相关联,或者作为例程开始处的重定位(或重定位序列)。在又一实施例中,编译器可以将每个对兄弟例程的调用标记为兄弟调用。在又一实施例中,编译器标记作为兄弟调用者的一部分的指令。如所指示的那样,在一个示例中,提供一个指示符以将一个兄弟调用标记为兄弟调用而不是典型的函数调用(例如,使用符号表中的重定位或标志)。在另一实施例中,提供一个标记以标记例程的范围(例如,哪些指令属于什么例程)。在一个方面,链接器读取正在进行的兄弟调用的标志,这些标志指示哪些指令属于什么例程以便确定对应于特定例程的兄弟调用。作为示例,链接器为潜在的外部兄弟调用者构建兄弟被调用者列表,并且基于该列表来对它们中的任何一个是否是外部的作出判定。如果兄弟被调用者是本地的,则这个兄弟调用者在被调用时。可以被用保存本地调用上下文的序列来调用。否则,如上所述,以完整的(外部调用)上下文保存调用。在一个实施例中,当要进行外部兄弟调用时,不存储上下文信息,因为存储该上下文信息将覆盖先前(例如,在外部兄弟调用者被该兄弟调用者的外部调用者调用时)存储的上下文信息。因此,根据一个或多个方面,抑制对该上下文信息的保存。在一个实施例中,这通过(由编译器或链接器)创建一个不包括上下文信息(例如,got指针)的存储/恢复的plt存根来进行。例如,通过专门为兄弟调用定义的重定位,通过诊断不带向外部符号返回的分支,或者通过另一种手段,来识别外部兄弟调用者(即,或者可能调用外部兄弟例程的兄弟调用者)。在一个实施例中,如果编译器生成链接器不理解的代码,则编译器抑制要保存的上下文信息的生成。在一个实施例中,编译器结合一个兄弟调用,插入指向一个虚拟位置的特别定义的重定位,然后,链接器用不被执行的地址填充该位置,从而有效地抑制上下文保存。在另一实施例中,对于寄存器间接兄弟调用,编译器发出没有上下文保存的调用序列。本发明的各方面提供链接器/编译器管理的、结合外部兄弟调用者上下文保存。在一个实施例中,提供了一种程序,其适于在程序使用编译器和链接器管理的got时生成执行外部兄弟调用的应用程序。尽管上面提供了许多实施例和示例,用于优化兄弟调用的使用,从而便利计算环境中的处理并且改善性能,其他实施例和示例也是可能的,并且考虑了本发明的各方面。参考图10描述结合和使用本发明的一个或多个方面的计算环境的一个实施例。计算环境1000包括例如具有一个或多个处理器核的处理器1002(例如,中央处理单元(cpu)),每个处理器核可以被称为电路1004。处理器1002可以包括一个或者更多寄存器1006,每个寄存器是可用作cpu或其他数字处理器的一部分的少量存储器。数据可以从存储器1010加载到寄存器1006中,用于由电路1004进行算术操作。作为示例,将寄存器1006分别标记为寄存器1(r1)到寄存器n(rn)。存储器1010可以包括具有用于执行各种操作的程序逻辑的一个或多个软件应用程序1014,并且可以包括操作系统1020。操作系统1020可以包括链接器1030(例如,静态链接器)和编译器1040。存储器1010还可以包括一个或多个共享库(例如,本地模块)1050,和/或一个或多个共享库(例如,外部模块)1060。在一个实施例中,处理器1002基于国际商业机器公司提供的power架构(powerarchitecture)。power架构的一个实施例在“powerisatmversion2.07b”(国际商业机器公司2015年4月9日)中描述,其全部内容通过引用合并于此。在一个示例中,处理器执行也是由国际商业机器公司提供的操作系统,例如aix。powerarchitecture和aix是位于美国纽约州阿芒克的国际商业机器公司的注册商标。本文中使用的其他名称可能是国际商业机器公司或其他公司的注册商标、商标或产品名称。在另一个示例中,处理器1002基于国际商业机器公司提供的z/架构(z/architecture),并且是诸如z系统服务器(systemzserver)服务器的服务器的一部分;z系统服务器实现z/架构,也由国际商业机器公司提供。z/架构的一个实施例在标题为“z/architectureprinciplesofoperation”(ibm出版号sa22-7832-10,第十一版,2015年3月)的ibm出版物中描述,其全部内容通过引用合并于此。在一个示例中,处理器执行也由国际商业机器公司提供诸如z/os的操作系统。ibm、z/os和z/architecture是国际商业机器公司的注册商标。在又一实施例中,处理器1002基于因特尔(intel)公司提供的intel架构。intel是美国加州圣克拉拉(santaclara)的因特尔公司的注册商标。此外,处理器1002可以基于其他架构。本文中提及的架构、服务器、系统和/或操作系统仅作为示例提供。参考图11a描述了合并和使用一个或多个方面的计算环境的另一个实施例。在该示例中,计算环境1100包括例如本机中央处理单元1102、存储器1104,以及经由例如一个或多个总线1108和/或其他连接彼此耦合的一个或多个输入/输出设备和/或接口1106。作为示例,计算环境1100可以包括powerpc处理器、zseries服务器或由位于美国纽约阿芒克的国际商业机器公司提供的pseries服务器;(hewlettpackardco.)提供的配备intelitaniumii处理器的hpsuperdome,由位于美国加州paloalto的hp公司;和/或基于国际商业机器公司、hp公司,因特尔公司、甲骨文公司或其他公司提供的架构的其他机器。本机中央处理单元1102包括一个或多个本机寄存器1110,诸如在该环境内的处理期间使用的一个或多个通用寄存器和/或一个或多个专用寄存器。这些寄存器包括表示任何特定时间点的环境状态的信息。此外,本机中央处理单元1102执行存储在存储器1104中的指令和代码。在一个特定示例中,中央处理单元执行存储在存储器1104中的仿真器代码1112。该代码使得在一个架构中配置的处理环境能够模拟另一种架构。例如,仿真器代码1112允许基于power架构之外的架构的机器(例如zseries服务器、pseries服务器、hpsuperdome服务器或其他)模拟power架构并执行基于power架构开发的软件和指令。在另一示例中,仿真器代码1112允许基于除z/architecture之外的架构的机器(例如powerpc处理器,pseries服务器,hpsuperdome服务器或其他)模拟z/architecture并执行基于z/architecture开发的软件和指令。其他架构也可以被模拟。参考图11b描述与仿真器代码1112有关的进一步细节。存储在存储器1104中的客户指令1150包括为在不同于本机cpu1102的架构中执行而开发(例如,与机器指令相关的)的软件指令。例如,客户指令1150可能是被设计为在powerpc处理器或z/架构处理器1002上执行的,然而却在被本机cpu1102上模拟,本机cpu1102可以是例如intelitaniumii处理器。在一个示例中,仿真器代码1112包括指令获取例程1152,用以从存储器1104获得一个或多个客户指令1150,并且可选地为所获得的指令提供本地缓冲。仿真器代码1112还包括指令转换例程1154,用于确定已获得的客户指令的类型,并将客户指令转换成一个或多个相应的本机指令1156。该转换包括例如识别要由客户指令执行的功能以及选择执行该功能的本机指令。此外,仿真器代码1112包括仿真控制例程1160,用以使本机指令被执行。仿真控制例程1160可以使本机cpu1102执行模拟一个或多个先前获得的客户指令的本机指令的例程,并且在这种执行结束时,将控制返回到指令获取例程以模拟获得下一个客户指令或一组客人指示。本机指令1156的执行可以包括将数据从存储器1104加载到寄存器中;将数据从寄存器存储回存储器;或执行由转换程序确定某种类型的算术或逻辑运算。每个例程例如以软件实现,其存储在存储器中并由本机中央处理单元1102执行。在其他示例中,一个或多个例程或操作以固件、硬件、软件或其某种组合实现。可以使用本机cpu的寄存器1110或通过使用存储器1104中的位置来模拟仿真处理器的寄存器。在实施例中,客户指令1150、本机指令1156和仿真器代码1112可以驻留在相同的存储器中或者可以在不同的存储器设备之间分配。如本文所使用的固件包括例如处理器的微代码(microcode)、毫代码(millicode)和/或宏代码(macrocode)。例如,固件包括用于实现更高级机器代码的硬件级指令和/或数据结构。在一个实施例中,固件包括例如通常作为微代码交付的专有代码,其包括特定于底层硬件的可信软件或微代码,并控制对系统硬件的操作系统访问。在一个示例中,客户指令1150被获取、转换和执行。该指令是一种架构(例如,power架构或z/架构)的,被从存储器中取出,转换并表示为另一种架构(例如,z/architecture、power架构、intel架构)的本机指令序列1156。然后执行这些本机指令。一个或多个方面可以涉及云计算。首先应当理解,尽管本公开包括关于云计算的详细描述,但其中记载的技术方案的实现却不限于云计算环境,而是能够结合现在已知或以后开发的任何其它类型的计算环境而实现。云计算是一种服务交付模式,用于对共享的可配置计算资源池进行方便、按需的网络访问。可配置计算资源是能够以最小的管理成本或与服务提供者进行最少的交互就能快速部署和释放的资源,例如可以是网络、网络带宽、服务器、处理、内存、存储、应用、虚拟机和服务。这种云模式可以包括至少五个特征、至少三个服务模型和至少四个部署模型。特征包括:按需自助式服务:云的消费者在无需与服务提供者进行人为交互的情况下能够单方面自动地按需部署诸如服务器时间和网络存储等的计算能力。广泛的网络接入:计算能力可以通过标准机制在网络上获取,这种标准机制促进了通过不同种类的瘦客户机平台或厚客户机平台(例如移动电话、膝上型电脑、个人数字助理pda)对云的使用。资源池:提供者的计算资源被归入资源池并通过多租户(multi-tenant)模式服务于多重消费者,其中按需将不同的实体资源和虚拟资源动态地分配和再分配。一般情况下,消费者不能控制或甚至并不知晓所提供的资源的确切位置,但可以在较高抽象程度上指定位置(例如国家、州或数据中心),因此具有位置无关性。迅速弹性:能够迅速、有弹性地(有时是自动地)部署计算能力,以实现快速扩展,并且能迅速释放来快速缩小。在消费者看来,用于部署的可用计算能力往往显得是无限的,并能在任意时候都能获取任意数量的计算能力。可测量的服务:云系统通过利用适于服务类型(例如存储、处理、带宽和活跃用户帐号)的某种抽象程度的计量能力,自动地控制和优化资源效用。可以监测、控制和报告资源使用情况,为服务提供者和消费者双方提供透明度。服务模型如下:软件即服务(saas):向消费者提供的能力是使用提供者在云基础架构上运行的应用。可以通过诸如网络浏览器的瘦客户机接口(例如基于网络的电子邮件)从各种客户机设备访问应用。除了有限的特定于用户的应用配置设置外,消费者既不管理也不控制包括网络、服务器、操作系统、存储、乃至单个应用能力等的底层云基础架构。平台即服务(paas):向消费者提供的能力是在云基础架构上部署消费者创建或获得的应用,这些应用利用提供者支持的程序设计语言和工具创建。消费者既不管理也不控制包括网络、服务器、操作系统或存储的底层云基础架构,但对其部署的应用具有控制权,对应用托管环境配置可能也具有控制权。基础架构即服务(iaas):向消费者提供的能力是消费者能够在其中部署并运行包括操作系统和应用的任意软件的处理、存储、网络和其他基础计算资源。消费者既不管理也不控制底层的云基础架构,但是对操作系统、存储和其部署的应用具有控制权,对选择的网络组件(例如主机防火墙)可能具有有限的控制权。部署模型如下:私有云:云基础架构单独为某个组织运行。云基础架构可以由该组织或第三方管理并且可以存在于该组织内部或外部。共同体云:云基础架构被若干组织共享并支持有共同利害关系(例如任务使命、安全要求、政策和合规考虑)的特定共同体。共同体云可以由共同体内的多个组织或第三方管理并且可以存在于该共同体内部或外部。公共云:云基础架构向公众或大型产业群提供并由出售云服务的组织拥有。混合云:云基础架构由两个或更多部署模型的云(私有云、共同体云或公共云)组成,这些云依然是独特的实体,但是通过使数据和应用能够移植的标准化技术或私有技术(例如用于云之间的负载平衡的云突发流量分担技术)绑定在一起。云计算环境是面向服务的,特点集中在无状态性、低耦合性、模块性和语意的互操作性。云计算的核心是包含互连节点网络的基础架构。现在参考图12,其中显示了云计算节点的一个例子。图1显示的云计算节点10仅仅是适合的云计算节点的一个示例,不应对本发明实施例的功能和使用范围带来任何限制。总之,云计算节点10能够被用来实现和/或执行以上所述的任何功能。云计算节点10具有计算机系统/服务器12,其可与众多其它通用或专用计算系统环境或配置一起操作。众所周知,适于与计算机系统/服务器12一起操作的计算系统、环境和/或配置的例子包括但不限于:个人计算机系统、服务器计算机系统、瘦客户机、厚客户机、手持或膝上设备、基于微处理器的系统、机顶盒、可编程消费电子产品、网络个人电脑、小型计算机系统﹑大型计算机系统和包括上述任意系统的分布式云计算技术环境,等等。计算机系统/服务器12可以在由计算机系统执行的计算机系统可执行指令(诸如程序模块)的一般语境下描述。通常,程序模块可以包括执行特定的任务或者实现特定的抽象数据类型的例程、程序、目标程序、组件、逻辑、数据结构等。计算机系统/服务器12可以在通过通信网络链接的远程处理设备执行任务的分布式云计算环境中实施。在分布式云计算环境中,程序模块可以位于包括存储设备的本地或远程计算系统存储介质上。如图12所示,云计算节点10中的计算机系统/服务器12以通用计算设备的形式表现。计算机系统/服务器12的组件可以包括但不限于:一个或者多个处理器或者处理单元16,系统存储器28,连接不同系统组件(包括系统存储器28和处理单元16)的总线18。总线18表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些架构包括但不限于工业标准架构(isa)总线,微通道架构(mac)总线,增强型isa总线、视频电子标准协会(vesa)局域总线以及外围组件互连(pci)总线。计算机系统/服务器12典型地包括多种计算机系统可读介质。这些介质可以是能够被计算机系统/服务器12访问的任意可获得的介质,包括易失性和非易失性介质,可移动的和不可移动的介质。系统存储器28可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(ram)30和/或高速缓存存储器32。计算机系统/服务器12可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34可以用于读写不可移动的、非易失性磁介质(图1未显示,通常称为“硬盘驱动器”)。尽管图1中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如cd-rom,dvd-rom或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储器28可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本发明各实施例的功能。具有一组(至少一个)程序模块42的程序/实用工具40,可以存储在存储器28中,这样的程序模块42包括但不限于操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42通常执行本发明所描述的实施例中的功能和/或方法。计算机系统/服务器12也可以与一个或多个外部设备14(例如键盘、指向设备、显示器24等)通信,还可与一个或者多个使得用户能与该计算机系统/服务器12交互的设备通信,和/或与使得该计算机系统/服务器12能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(i/o)接口22进行。并且,计算机系统/服务器12还可以通过网络适配器20与一个或者多个网络(例如局域网(lan),广域网(wan)和/或公共网络,例如因特网)通信。如图所示,网络适配器20通过总线18与计算机系统/服务器12的其它模块通信。应当明白,尽管图中未示出,其它硬件和/或软件模块可以与计算机系统/服务器12一起操作,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、raid系统、磁带驱动器以及数据备份存储系统等。现在参考图13,其中显示了示例性的云计算环境50。如图所示,云计算环境50包括云计算消费者使用的本地计算设备可以与其相通信的一个或者多个云计算节点10,本地计算设备例如可以是个人数字助理(pda)或移动电话54a,台式电脑54b、笔记本电脑54c和/或汽车计算机系统54n。云计算节点10之间可以相互通信。可以在包括但不限于如上所述的私有云、共同体云、公共云或混合云或者它们的组合的一个或者多个网络中将云计算节点10进行物理或虚拟分组(图中未显示)。这样,云的消费者无需在本地计算设备上维护资源就能请求云计算环境50提供的基础架构即服务(iaas)、平台即服务(paas)和/或软件即服务(saas)。应当理解,图13显示的各类计算设备54a-n仅仅是示意性的,云计算节点10以及云计算环境50可以与任意类型网络上和/或网络可寻址连接的任意类型的计算设备(例如使用网络浏览器)通信。现在参考图14,其中显示了云计算环境50(图13)提供的一组功能抽象层。首先应当理解,图14所示的组件、层以及功能都仅仅是示意性的,本发明的实施例不限于此。如图14所示,提供下列层和对应功能:硬件和软件层60包括硬件和软件组件。硬件组件的例子包括:主机61;基于risc(精简指令集计算机)架构的服务器62;服务器63;刀片服务器64;存储设备65;网络和网络组件66。软件组件的例子包括:网络应用服务器软件67以及数据库软件68。虚拟层70提供一个抽象层,该层可以提供下列虚拟实体的例子:虚拟服务器71、虚拟存储72、虚拟网络73(包括虚拟私有网络)、虚拟应用和操作系统74,以及虚拟客户端75。在一个示例中,管理层80可以提供下述功能:资源供应功能81:提供用于在云计算环境中执行任务的计算资源和其它资源的动态获取;计量和定价功能82:在云计算环境内对资源的使用进行成本跟踪,并为此提供帐单和发票。在一个例子中,该资源可以包括应用软件许可。安全功能:为云的消费者和任务提供身份认证,为数据和其它资源提供保护。用户门户功能83:为消费者和系统管理员提供对云计算环境的访问。服务水平管理功能84:提供云计算资源的分配和管理,以满足必需的服务水平。服务水平协议(sla)计划和履行功能85:为根据sla预测的对云计算资源未来需求提供预先安排和供应。工作负载层90提供云计算环境可能实现的功能的示例。在该层中,可提供的工作负载或功能的示例包括:地图绘制与导航91;软件开发及生命周期管理92;虚拟教室的教学提供93;数据分析处理94;交易处理95;以及兄弟例程处理96。在任何可能的技术细节结合层面,本发明可以是系统、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本发明的各个方面的计算机可读程序指令。计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、静态随机存取存储器(sram)、便携式压缩盘只读存储器(cd-rom)、数字多功能盘(dvd)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。用于执行本发明操作的计算机程序指令可以是汇编指令、指令集架构(isa)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、集成电路配置数据或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如smalltalk、c++等,以及过程式编程语言—诸如“c”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(lan)或广域网(wan)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(fpga)或可编程逻辑阵列(pla),该电子电路可以执行计算机可读程序指令,从而实现本发明的各个方面。这里参照根据本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本发明的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。附图中的流程图和框图显示了根据本发明的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。除了上述之外,一个或多个方面可以由提供客户环境管理的服务提供商供应、提供、部署、管理、服务,等等。例如,服务提供商可以创建、维护、支持为一个或多个客户执行一个或多个方面的计算机代码和/或计算机基础设施。作为回报,服务提供商例如可以根据订阅和/或费用协议从客户接收付费。附加地或替代地,服务提供商可以从向一个或多个第三方的广告内容销售中接收付费。在一个方面,可以部署应用程序以执行一个或多个实施例。作为一个示例,应用程序的部署包括提供可操作以执行一个或多个实施例的计算机基础结构。作为另一方面,可以部署计算基础设施,包括将计算机可读代码集成到计算系统中,其中与计算系统结合的代码能够执行一个或多个实施例。作为又一方面,可以提供一种用于集成计算基础设施的过程,包括将计算机可读代码集成到计算机系统中。该计算机系统包括计算机可读介质,其中该计算机介质包括一个或多个实施例。与计算机系统结合的代码能够执行一个或多个实施例。尽管上面描述了各种实施例,但这些实施例仅是示例。例如,其他架构的计算环境可用于合并和使用一个或多个实施例。此外,可以使用不同的指令、指令格式、指令字段和/或指令值。许多变化都是可能的。此外,其他类型的计算环境可以受益并被使用。作为示例,可以使用适用于存储和/或执行程序代码的、包括通过系统总线直接或间接耦合到存储器元件的至少两个处理器的数据处理系统。存储器元件包括例如在程序代码的实际执行期间使用的本地存储器、大容量存储器和高速缓冲存储器,其提供至少一些程序代码的临时存储,以便减少在执行期间必须从大容量存储器检索代码的次数。输入/输出或i/o设备(包括但不限于键盘、显示器、指示设备、dasd、磁带、cd、dvd、拇指驱动器和其他存储介质等)可以直接地或通过中间i/o控制器耦合到系统。网络适配器也可以耦合到系统,以使数据处理系统能够通过中间私有或公共网络耦合到其他数据处理系统或远程打印机或存储设备。调制解调器、电缆调制解调器和以太网卡只是可用的网络适配器类型中的一小部分。这里使用的术语仅用于描述特定实施例的目的,而不是限制性的。如这里所使用的,单数形式“一”,“一个”和“该”旨在也包括复数形式,除非上下文另有明确说明。将进一步理解,当在本说明书中使用时,术语“包括”和/或“包含”指定所述特征、整数、步骤、操作、元件和/或组件的存在,但不排除存在或者添加一个或多个其他特征、整数、步骤、操作、元素、组件和/或其组合。后附权利要求中的所有装置或步骤加功能元件的对应结构、材料、动作和等同物(如果有的话)旨在包括用于结合其它具体权利要求中要求保护的元件执行功能的任何结构、材料或动作。已经出于例示和描述的目的给出了一个或多个实施例的说明,但是该说明并不旨在穷举,也不是要将发明限制于所公开的形式。许多修改和变化对于本领域普通技术人员来说是显而易见的。选择和描述实施例是为了最好地解释各个方面和实际应用,并且使本领域普通技术人员能够理解具有适合于预期的特定用途的各种修改的各种实施例。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1