首页> 中国专利> 用于控制计算机系统上硬件资源使用情况的方法、系统以及可执行代码段

用于控制计算机系统上硬件资源使用情况的方法、系统以及可执行代码段

摘要

本发明涉及一种利用可插入到应用程序的进程的可执行代码段,控制在操作系统上执行的应用程序对计算机系统硬件资源使用情况的方法,所述操作系统包括至少一个在该计算机系统上执行的应用程序编程接口(API)。方法包括:将API服务重定向到包含在代码段中的对应服务;拦截从处理器到API服务的调用;并且基于进程对API服务的调用的拦截,作用于属于该进程的软件实体。

著录项

  • 公开/公告号CN104364759A

    专利类型发明专利

  • 公开/公告日2015-02-18

    原文格式PDF

  • 申请/专利权人 加泰罗尼亚理工大学;

    申请/专利号CN201380031821.5

  • 申请日2013-04-18

  • 分类号G06F9/455;G06F9/50;

  • 代理机构广州嘉权专利商标事务所有限公司;

  • 代理人谭英强

  • 地址 西班牙巴塞罗那市

  • 入库时间 2023-12-17 04:23:20

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-10-27

    授权

    授权

  • 2015-05-20

    实质审查的生效 IPC(主分类):G06F9/455 申请日:20130418

    实质审查的生效

  • 2015-02-18

    公开

    公开

说明书

技术领域

本发明涉及一种利用可插入到应用程序的进程的可执行代码段,控制在操作系统上执行 的应用程序对计算机系统硬件资源使用情况的方法,所述操作系统包括至少一个在该计算机 系统上执行的应用程序编程接口(API)。

本发明还涉及适于实现该方法的系统和可执行代码段。

背景技术

众所周知,近些年来计算机无论是在软件还是在硬件上的发展从未停止。

在硬件水平上,例如处理器越来越快并且融入了新的发展,而易失性和非易失性内存也 具有越来越大的存储能力。

类似的,在软件水平上,应用程序(例如操作系统、办公或者计算机辅助画图应用程序, 或游戏)变得越来越强大,并且可以实现更多的功能,这些在几年前是意想不到的。

当用户计算机系统硬件资源的性质与同其共同作用的软件的硬件需求失去平衡时,现有 情形的主要缺陷就变得明显。到目前,软件是否以这样快的速度发展,由于程序员意识到他 们可以得到越来越多的硬件资源,或者硬件是否有必要发展,从而满足不同软件执行的日益 增长的需求,尚无定论。如果待使用的软件的硬件需求等于或者高于用户计算机系统的资源 性质,这种操作问题就会清楚而明显。此外,必须清楚,某一软件的硬件需求是考虑所述软 件在计算机系统中单独执行而得出的,但是这种情况很少发生,因为在后台至少完全有可能 有软件在执行,很明显,它们也要消耗系统的硬件资源(例如杀毒、防火墙或者备份软件)。

比较明确的是,软件程序员不习惯去考虑大多数用户计算机系统不具有最先进的硬件资 源,以及每一个新的软件或者每一个已经存在的软件的更新都迫使用户去更新这些硬件资源, 甚至需要购买新的计算机系统,从而至少可以执行该软件并获得适当的软件执行效果。所有 这些最终会给用户带来高昂的经济成本,不仅有获取软件的成本,还包括系统硬件资源更新 的成本。

这些问题也出现在服务器类型(应用程序服务器、数据服务器等)的计算机系统中。如 果没有提前实现硬件更新的话,服务器软件(例如在更新之后)的硬件需求的增加会导致在 那一刻前还在管理所有用户的服务器不能再为所有的用户提供服务。类似地,如果服务器是 应用程序服务器的话,例如它管理的应用程序的数量必须减少,从而可以为同样数量的用户 提供服务。需要重要指出的是,由于服务器类型的计算机的硬件资源具有更高的成本,因此 服务器类型的系统更新硬件资源的成本甚至要比上述情形的更新成本更高。

另一方面,具有给定硬件资源的计算机系统,想要在其上执行更多数量的理论上会执行 的应用程序以及/或者同一应用程序的实例,也会出现这种情况。在这种情况下,硬件资源没 有改变,因此,有必要使应用程序以及/或者同一应用程序上的不同实例的执行减少对它们所 使用的硬件资源的消耗。

当操作系统执行时,上述任何一种情形中的操作系统都不能有效地控制运行应用程序以 及/或者同一应用程序的实例的硬件资源的使用,因此,需要一种实现该目的的工具。

发明内容

因此,本发明的目的在于利用适于插入到属于应用程序的进程中间的可执行代码段,提 供一种控制正在运行的应用程序对硬件资源的使用情况的方法,该方法可以提高执行应用程 序的计算机系统的效率。

该目的通过提供一种利用可以插入到应用程序中的进程的可执行代码段,控制在操作系 统中执行的应用程序对计算机系统硬件资源使用情况的方法实现,所述操作系统包括至少一 个在计算机系统上执行的应用程序编程接口(API),方法包括:

-拦截属于该应用程序的进程对API服务的调用;

-基于拦截进程对API服务的调用,作用于正在执行的进程的软件实体。

因此,利用插入到进程中的可执行代码段,执行中的应用程序和操作系统间的通信(控 制信号和数据通信)被拦截,从而代码段在操作系统的上层执行,并且可以管理或控制属于 该进程的软件实体并且通过其减少对硬件资源的使用。

基本上,插入到属于该应用程序的进程内的可执行代码段提供了,通过在计算机系统上 执行的应用程序控制该计算机系统上的硬件资源的使用情况的信息。显然,由该代码段执行 的控制可以减少硬件资源的应用,但总是保持最低的服务质量。

由于上述原因,降低应用程序对硬件资源的使用可以使这些资源被其他应用程序(或者 同一应用程序的若干实例)使用,从而计算机系统中可以有更多的应用程序同时执行,提高 了操作系统的效率。

类似地,降低应用程序硬件资源的使用可能会使应用程序执行的硬件需求大于计算机系 统所提供的硬件资源应用程序。

需要重要指出的是,表述“服务”、“API”或者“软件实体”分别指代至少一个服务、至 少一个API,以及/或者至少一个软件资源。因此,例如可以将同一API的两个服务重定向到 两个包含在同一代码段的服务中去,或者将第一API的服务重定向到包含在该代码段中的第 一服务以及将第二API的服务重定向到包含在该代码段中的第二服务。同样地,根据重定向 服务,该段代码可能作用于一个或多个软件实体,如执行线程、内存或互斥锁。

以一种方式将可执行代码段插入到进程已经被描述过,如在[“Windows NT System-Call  Hooking”,Mark Russinovich and Bryce Cogswell,Dr.Dobb’s Journal,January 1997]中。

需要重要指出的是,代码段可以插入到进程中,而该进程从休眠状态启动,这可以确保 代码段正确运行。在这种情况下,该方法包括唤醒处于休眠状态的进程的执行的步骤。

另一方面,需要重要指出的一点是,术语“拦截”应该理解为从进程到API服务接口的 呼叫重定向到包含在该代码段中的服务,从而代码段本身可以控制或者执行属于该进程的软 件实体,从而通过该应用程序控制资源的使用。

此外,该方法包括将API服务重定向到包含在代码段的相对应的服务,从而当进程呼叫 API服务时,以透明的方式呼叫包含在代码段的相对应的服务。

根据本发明优选实施例,该API服务可以是函数,并且将API服务重定向到包含在代码 段内的相对应的服务这一步骤包括:

■将包含待重定向的API的函数的动态链接库加载到内存中;

■在包含在装载的动态链接库中的API函数的函数指针表中,将存储待重定向的API 函数的初始内存地址替换为存储包含在代码段中的对应函数的初始内存地址中。

因此每个API的一个或多个函数被重定向到包含在代码段的函数中,从而后者可以通过 作用于软件实体,例如执行线程、内存或互斥锁(也称为锁)等,拦截进程对这些函数的调 用,进而控制对涉及执行的硬件资源的使用。

将API服务重定向到包含在代码段中的对应服务这一步骤优选包括:将存储重定向的API 的函数的初始内存地址存储在第一变量中。因此,如果在应用程序执行过程中有必要,有可 能从可执行代码段自身调用API的函数(即初始函数)。

根据本发明另一优选实施例,该API服务可以是对象方法,并且将API服务重定向到包 含在代码段内的相对应的服务这一步骤包括:

■将包含重定向对象方法的动态链接库装载到内存中;

■验证与待重定向的方法相关的对象是否是第一次创建;

■如果验证结果为是,

●在包含在装载的动态链接库中的对象方法的方法指针表中,将存储待重定向的对 象方法的初始内存地址替换为存储包含在代码段中的对应方法的初始内存地址 中。

同函数一样,同样有可能将一个或多个属于对象的方法重定向到包含在代码段中的一个 或多个方法,从而后者可以拦截进程对这些方法的调用,进而控制对涉及执行的硬件资源的 使用。

如上文所讨论的,既然有可能重定向至少一个API的至少一个服务,就有可能其中一个 服务是函数,而另一个服务是方法,从而上述两个实施例在同一个正在执行的应用程序中可 以互为补充。

将API服务重定向到包含在代码段中的对应服务这一步骤还优选地包括:将存储待重定 向的对象方法的初始内存地址存储在第一变量,从而根据需要,可以从代码段本身调用该方 法(即初始方法)。

根据本发明一实施例,API服务可以是与属于该进程的软件实体相关的服务;该服务意 在创建一个新的执行线程;软件实体可以是执行线程;并且拦截进程对API服务的调用可包 括:

■接收进程对对应服务的调用,该对应服务包含在代码段中,用于生成新的执行线程;

■基于包含在代码段中的对应服务生成新的执行线程;

■保存执行线程的标识符,该标识符由第二变量生成,该变量维持创建的执行线程的 寄存器。

根据本发明另一实施例,API服务可以是与属于该进程的软件实体相关的服务;该服务 意在创建一个新的执行线程;软件实体可以是执行线程;并且拦截进程对API服务的调用可 包括:

■接收进程对对应服务的调用,该对应服务包含在代码段中,用于生成新的执行线程;

■基于存储在第一变量的初始内存地址,调用API服务;

■接收由API的函数产生的新的执行线程的标识符;

■保存执行线程的标识符,该标识符由第二变量生成,该变量维持创建的执行线程的 寄存器。

如果可能重定向不止一个与执行线程类型的软件实体相关的服务,上述描述的两个实施 例都不是二选其一的,而是可以互为补充的。

更具体地,在描述的第一个实施例中,生成新执行线程的服务包含在代码段本身,而在 第二个实施例中,生成新执行线程的服务不包括在代码段中,并且有必要调用应用程序服务 的初始服务,从而成功地产生执行线程。为了达到该目的,必须已经将上述API服务(即初 始服务)的内存地址存储在第一变量中。尽管存在上文描述,不管执行什么实施例,代码段 管理创建的新执行线程的识别符,将其存储在用于维持创建的执行线程的寄存器的变量中。

如果软件实体为执行线程,则基于拦截的进程对API服务的调用,在作用于属于正在执 行的进程的软件实体的步骤包括:

■确定正在执行的应用程序的消耗值(yield value);

■检验应用程序的消耗值是否超出阈值;

■如果超出阈值,基于存储在第二变量中的标识符,将执行线程暂停一预设时间,其 中该变量维持创建的执行线程的寄存器。

既然代码段管理执行线程的标识符,如果代码段(更具体地,包含在代码段内的算法) 检测到应用程序的消耗量(yield)超出了阈值(即,如果应用程序的执行消耗了太多的资源 或者不必要的资源),代码段会基于存储在第二变量的执行线程的标识符,暂停执行直到那一 刻创建的线程的执行,这意味着线程段可以控制由应用程序消耗的硬件资源的使用。

基于对应用程序硬件资源的使用来确定正在执行的应用程序的消耗量的步骤包括:

●构建API服务作为控制点,当进程执行时,会反复调用该API服务;

●确定进程第一次调用和第二次调用该服务的时间间隔;

●基于确定的时间,得到正在执行的应用程序的消耗值。

可以通过FPS(每秒帧数)度量测量第一次调用和第二次调用作为控制点的服务的时间 间隔。

另一方面,任何可以测量维持获得消耗与维持理想消耗所需要的执行时间的差异的算法 都可以用于确定执行线程必须暂停的时间。该算法可以包含在代码段中,尽管也可以使该代 码段调用外部算法。

如果软件实体涉及内存并且API服务为意在预留存储区域的服务,则拦截进程对API服 务的调用这一步骤包括:

■接收进程对对应服务的调用,该对应服务包含在代码段中,用于预留存储区域;

此外,在这种情况下,基于拦截进程对API服务的调用,在作用于属于正在执行的进程 的软件实体的步骤包括:

■预留共享存储区域。

因此,当进程调用用于预留存储空间的API服务时,该调用被拦截(即调用被重定向到 包含在代码段内的对应服务)并且意在被同一应用程序的不同实例共享的存储区域被分配。

下文详细描述了在应用程序执行时,当软件实体为内存时,代码段是如何控制硬件资源 的。

例如如果应用程序执行需要1千兆字节的内存,则该应用程序的第二实例的执行还需要 1千兆字节,即两个实例的执行总共需要消耗2千兆字节的内存。如果将本发明的可执行代 码段对象插入到应用程序的两个实例中,由于为正在执行的不同的实例分配了共享内存区域, 内存消耗会小于2千兆字节。就这一点而言,有必要说明一点,由于在某些存储区域存在的 信息一定不能被应用程序的其他实例修改,大多数情况下应用程序的每个示例不可能共享整 个内存(在本示例中1千兆字节)。因此,在分配内存区域之前,必须识别出因包含有每个实 例的信息特征而不能修改的存储区域。

另一方面,由进程对包含在代码段中的对应服务的调用还有可能涉及从代码段到意在预 留存储区域的初始API的函数的调用,该调用是在存储在上述第一变量的内存地址的基础上 执行的。

另一方面,如果软件实体为锁或者互斥锁,并且如果API服务为意在干预互斥锁的服务, 则拦截进程对API服务的调用这一步骤包括:

■接收进程对对应服务的调用,该对应服务包含在代码段中,用于干预互斥锁;

在这种情况下,基于拦截进程对API服务的调用,在作用于属于正在执行的进程的软件 实体的步骤包括:

■修改分配给互斥锁的名称;

有些应用程序(例如一些游戏)不允许在同一计算机系统上执行多于一个应用程序的实 例。为了达到该目的,它们使用可为应用程序的实例分配标识符的锁或者互斥锁,并且在生 成的所有的新实例接收到相同的标识符的情况下,执行多于一个实例是不可实现的。

鉴于这种情况,并如上文所述,当进程尝试创建与应用程序相关的互斥锁并且调用包含 在该代码段的对应服务时(意在执行该行为的初始API服务的指针先前一定要重定向到包含 在该代码段的服务),该代码段修改分配给该互斥锁的标识符,从而当该应用程序生成第二个 实例,标识符并未互相吻合,从而允许同步执行。

根据本发明另一方面,提供了包含用于执行上述控制计算机系统中硬件资源的方法的指 令的可执行代码段;当一应用程序在包括至少一个在这一计算机系统中执行的应用程序编程 接口(API)的操作系统上运行时,该可执行代码段适于插入到属于该应用程序的进程中。

该可执行代码段可以存储在物理存储媒介上,如可记录媒介、计算机内存或只读内存, 或者可以由载波实现,如电或光载波。

此外,本发明提供了一种在计算机系统上执行应用程序的方法,该方法包括:

-在休眠状态下,初始化与应用程序相关的进程的执行;

-将上述可执行代码段插入到休眠状态下的进程中;

-执行上述的,利用插入到进程的可执行代码段,控制在操作系统上执行的应用程序对计 算机系统硬件资源使用情况的方法,所述操作系统包括至少一个在该计算机系统上执行的应 用程序编程接口(API)。

因此,当用户请求执行计算机系统上的应用程序时,可以根据上述方法执行该应用程序, 目的在于使该代码段控制硬件资源。

根据本发明另一方法,提供了一种控制在操作系统中执行的应用程序对计算机系统硬件 资源使用情况的系统,所述操作系统包括至少一个在计算机系统上执行的应用程序编程接口 (API),适于向该系统插入属于该应用程序的进程,该系统包括:

-用于拦截从进程到API服务的调用的计算机装置;

-基于拦截进程对API服务的调用,用于作用于属于正在执行的进程的软件实体的计算机 装置。

根据另一方面,本发明提供了一种计算机系统,应用程序可以在该计算机系统上执行, 该系统包括内存和处理器,可包括存储在内存中的处理器可执行指令,其中该指令可包括以 下功能:

-在休眠状态下,初始化与应用程序相关的进程的执行;

-将上述可执行代码段插入到休眠状态下的进程中;

-执行上述的,利用插入到进程的可执行代码段,控制在操作系统上执行的应用程序对计 算机系统硬件资源使用情况的方法,所述操作系统包括至少一个在该计算机系统上执行的应 用程序编程接口(API)。

说明书和权利要求书通篇,用语“包括”及其变型不表示排除其他技术特征、补充、条 目或步骤。本领域技术人员可以从部分说明书以及本发明部分实践推断出本发明进一步的目 的、优势以及特征。文中提供的示例和附图仅作描述目的,它们不作为本发明的限制。权利 要求中涉及附图并且位于括号内的附图标记只是为了进一步理解该权利要求,不应该理解为 限制本发明的保护范围。此外,本发明涉及此处描述的特别及优选实施例的所有可能的组合。

附图说明

为了更好地理解上文描述的内容,用于图示描述仅作为非限制性示例的实施例的附图如 下。

附图中:

图1所示为根据现有技术的计算机系统上的应用程序执行层的框图;

图2所示为根据本发明,计算机系统上应用程序的执行层,还包括代表插入到属于该应 用程序的进程的可执行代码段的层的框图,该代码段意在控制计算机系统中应用程序对硬件 资源的使用情况。

具体实施方式

下文将会描述根据本发明的用于控制计算机系统中应用程序对硬件资源的使用情况的方 法和可执行代码段,该应用程序在操作系统中执行,包括至少一个在该计算机系统上执行的 应用程序编程接口(API),该代码段适于插入到与应用程序相关的进程中,该应用程序的进 程起初为休眠状态。

图1所示为根据现有技术,在计算机系统(例如个人计算机、服务器等)上的应用程序 (例如游戏)的执行层的示意图。

在该示意图中,最底层10表示计算机系统的硬件资源,如微处理器(CPU)、内存、图 形处理单元(GPU)、键盘或者鼠标等。

在配置为更高级别的第二层11中设置操作系统,该第二层11具有与最底层10的资源双 向通信和交互所需的驱动(能够发送和/或接收与这些资源有关的信息,比如控制信号14或 数据15)。

在表示操作系统的层11的上方配置的第三层12中,设置有应用程序编程接口(更普遍 地称为API),既包括包含在操作系统中的API,还包括由于安装最底层10的资源驱动而产 生的API。不管使用什么操作系统,这些API通常以动态链表库的形式实现。包含API的层 12和代表操作系统的层11之间的通信也是双向通信,并且都能够交换控制信号14和数据15。

最后,图1还示出了第四层或最高层13,描述执行中的应用程序。在执行过程中,该应 用程序对代表API的层12进行访问,交换控制信号和数据。

因此,根据该配置,例如如果正在执行的应用程序13需要在执行该应用程序的计算机系 统的显示屏上生成窗口,该应用程序必须访问某些用于生成窗口API 12的服务(函数或方法)。 为了能够在屏幕上生成窗口,这些服务需要与操作系统11交换信息(控制信号和数据),该 操作系统具有必需的工具(即驱动)用于与屏幕10通信,从而生成所需的窗口。

这些配置的主要的缺点在于根本没有元件或工具可以高效或有效地管理正在被执行的应 用程序对计算机系统的硬件资源的使用情况。在上述情况下,应用程序使用其执行所需的资 源。

因此,本发明执行一插入到该应用程序相关的进程中的可执行代码段,其中该进程例如 起初为休眠状态,从而它可以在被执行时,控制应用程序所使用的硬件资源。

图2所示为基于图1所示示意图的示意图,但其进一步包括代表可执行代码段的层16, 当插入到与应用程序关联的进程后,该代码段被配置为在应用程序层13和代表API的层12 之间的逻辑层,使得代码段可以拦截应用程序对某些API服务(例如函数和方法)的调用, 从而控制应用程序使用的硬件资源,作用于进程的一个或多个软件实体。

更具体地,代码段执行的方法如下:其中必须基于初始的情况来描述,其中当用户执行 应用程序时,属于应用程序的进程在休眠状态中启动。在该休眠状态过程中,将可执行代码 段插入到进程中。

一旦该段代码插入到进程中,该段代码就会将所有包含具有那些服务(函数或者方法) 的应用程序编程接口(API)的动态链接库加载到内存中,其中该动态链接库为应用程序执行 时所需要的动态链接库。然后,在操作系统根据存储有不同的API服务的初始内存地址,为 装载在内存中的这些服务填充了服务指针表之后,它将指针表中的每个应用程序在执行过程 中可能或者会需要的服务的初始内存地址替换为包括该代码段的对应的服务所在的初始内存 位置。因此,在执行重定向的基础上,代码段可以拦截进程为了执行服务而对这些相关服务 的调用,即由于指针并不指向多个API服务,而是指向包含该代码段的对应的服务,代码段 接收到该进程对不同的API的不同的相关服务的调用。

在上述拦截的基础上,该代码段获得了计算机系统上应用程序对硬件资源的使用情况的 控制能力,即该代码段以一种对于进程而言透明的方式,控制系统中应用程序对硬件资源的 使用情况。

更具体地,当进程尝试通过调用某些API服务访问计算机系统的硬件资源时,该段代码 执行它自身的服务(即执行这些调用的拦截)。在拦截的基础上,根据进程调用的服务类型, 该段代码作用于某个软件实体。

因此,如果被拦截的API服务是意在创建新的执行线程的服务(即代码段作用的软件实 体为执行线程),该拦截步骤包括:

■接收进程对对应服务的调用,该对应服务包含在代码段中,用于生成新的执行线程;

■基于包含在代码段中的对应服务生成新的执行线程;

■保存执行线程的标识符,该标识符在某变量中生成,该变量维持创建的执行线程的 寄存器。

对于已经描述的情况(即,被拦截的API服务是意在创建新的执行线程的服务),拦截进 程对API服务的调用还可能替换性地包括:

■接收进程对对应服务的调用,该对应服务包含在代码段中,用于生成新的执行线程;

■基于存储在变量中的初始内存地址,调用API的函数,该变量用于存储这种信息;

■接收新的由API服务产生的执行线程的标识符;

■保存执行线程的标识符,该标识符在用于维持创建的执行线程的寄存器的变量中生 成。

在任何情况下,如果拦截的API服务为意在创建新的执行线程的服务,作用于软件实体 的步骤可包括:

■确定正在执行的应用程序的消耗值;

■检验应用程序的消耗值是否超出阈值;

■如果超出阈值,基于存储在变量中的标识符,将之前创建的执行线程暂停一预设时 间,其中该变量维持创建的执行线程的寄存器。

因此,既然执行线程的标识符由代码段管理(所述代码段将标识符存储在它管理的变量 中),如果该代码段检测到应用程序的消耗超出了阈值(即,如果应用程序的执行消耗了太多 的资源或者不必要的资源),代码段会基于存储在对应变量的执行线程的标识符,暂停执行直 到那一刻创建的线程的执行,这意味着线程段可以控制应用程序对硬件资源的使用情况。

上文已描述的正在执行的应用程序的消耗值的确定步骤包括:

●构建API服务作为控制点,当进程执行时,会反复调用该API服务。

●确定进程第一次调用和第二次调用该服务的时间间隔;

●基于确定的时间,得到正在执行的应用程序的消耗值。

如果被拦截的API服务为意在预留存储区域的服务,则拦截进程对API服务的调用这一 步骤包括:

■接收进程对对应服务的调用,该对应服务包含在代码段中,用于预留存储区域;

在这种情况下(即被拦截的调用为对意在预留存储区域的服务的调用),在作用于属于正 在执行的进程的软件实体这一步骤包括:

■预留共享存储区域。

因此,当进程调用用于预留内存区域的API服务时,该调用被拦截(即调用被重定向到 包含在该代码段的对应的服务)并且意在被同一应用程序的不同实例共享的内存区域被分配, 即包含在该段代码内的对应服务将由同一应用程序的不同实例共享的内存区域分配给该进 程。

最后,如果被拦截的调用对应于意在干预互斥锁的API服务,则拦截进程对API服务的 调用这一步骤包括:

■接收进程对对应服务的调用,该对应服务包含在代码段中,用于干预互斥锁;

■修改分配给互斥锁的名称;

而基于拦截进程对API服务的调用,在作用于属于正在执行的进程的软件实体的步骤包 括:

■修改分配给互斥锁的名称;

有些应用程序(例如一些游戏)不允许在同一计算机系统上执行多于一个应用程序的实 例。为了达到该目的,它们使用可为应用程序的实例分配标识符的锁或者互斥锁,并且在生 成的所有的新实例接收到相同的标识符的情况下,执行多于一个实例是不可实现的。

鉴于这种情况,并如上文所述,当进程尝试创建与应用程序相关的互斥锁并且调用包含 在该代码段的对应服务时(意在执行该行为的初始API服务的指针先前一定要重定向到包含 在该代码段的服务),该代码段修改分配给该互斥锁的标识符,从而当该应用程序生成第二个 实例,标识符并未互相吻合,从而允许同步执行。

因此,到目前为止的描述清楚地显示了根据代码段拦截到的对不同类型的API服务的调 用,该代码段可以作用于这些类型的服务对应的软件实体,控制应用程序对计算机系统中硬 件资源的使用情况。

下文将描述本发明一优选实施例,其中操作系统可以是Windows系列中的任何一个,例 如Windows 7;计算机系统是应用程序服务器,更具体地为游戏服务器;并且待执行应用程 序为游戏以及/或者同一游戏的不同实例。此外,当执行进程时,用于控制应用程序对硬件资 源的使用情况的代码段所干预的软件实体对应于不同的执行线程,该执行线程直到此时已经 创建。

更具体地,本优选实施例具有以下操作。本游戏服务器的目的在于使服务用户在他们的 移动终端上,如智能手机或平板电脑,玩不同的游戏,或者甚至玩相同的计算机游戏。每个 游戏或者同一游戏的每个实例的执行可以通过流技术从游戏服务器发送到用户移动设备。因 此,所述用户可以从属于用户的移动设备上选择要玩的游戏,通过在用户移动终端屏幕上显 示的图形用户界面上出现的控制元件(例如代表游戏的图标)的触发来请求执行游戏。用户 在控制元件上的触发产生发送到游戏服务器的控制信号,使服务器执行所选的游戏。

假如有大量的用户请求执行游戏(即具有大量被执行的游戏),本发明努力控制每个游戏 的执行,从而使使用的硬件资源尽可能最少,进而最大数量的游戏可以同步执行,并且从而 可以为最大数量的用户提供服务。

因此,当用户从他/她的移动终端请求执行游戏时,在休眠状态中,在游戏服务器中创建 正在执行的应用程序(即游戏)的主进程。为此,使用CreateProcess函数,分配 CREATE_SUSPENDED值到创建模式参数(CreateFlags)。一旦进程在休眠状态中启动,根 据本发明的可执行代码段插入到进程中,其目的在于最优化属于该进程的软件实体。

在重新开始执行进程之前(必须注意进程在休眠状态中启动),插入的代码段重定向被拦 截的API函数。根据该优选实施例,有两类函数被拦截:

■利用函数CreateThread用于寄存执行线程的创建;

■当执行进程时用于构建控制点。因此,使用这些控制点,可以通过与进程相关的函 数,a priori,以相对于该进程透明的方式测量应用程序的消耗,已知它们会在整个 进程的执行过程中被反复调用。因此,例如在图形应用程序中,可通过API  IDXGISwapChain1的方法Present1,将每个屏幕的每个帧的函数构建成控制点,从而 可以通过测量每秒显示的画面的数量(FPS)得到应用程序的消耗。目的在于插入代 码段,确认应用程序什么时候超出预设消耗阈值,从而防止过度使用计算机系统(即 游戏服务器)的硬件资源,并且从而平衡该消耗与其他正在执行的应用程序(即游 戏或者同一游戏的实例)的消耗量。如果应用程序的消耗量超出预设阈值,则与该 进程相关的执行线程可以根据需要暂停一段时间,从而使消耗量不会超出阈值。

在Windows操作系统,这些所述的多个API通常以多个动态链接库(DLL)的形式执行。 因此,该代码段利用函数LoadLibrary,通过库dxgi.dll装载包括要被重定向的函数的库,例 如库kernel32.dll的CreateThread以及API IDXGISwapChain1的Present1。基本上,LoadLibrary 将库加载到内存中,并且以API函数的内存中的初始地址填充索引地址表(IAT),该表是用 于API函数的指针表。必要的指针通过函数RedirectIAT修改,使该指针对应于属于插入到进 程的代码段的函数。同时,表的初始内容(即存储函数的最初内存位置的指针)存储在一变 量中,以备某个时刻需要调用原函数。

另一方面,既然API IDXGISwapChain1是COM类型的接口,有必要修改该接口的指针 表来替换被拦截的方法,例如Present1。用特定的代码对COM类型接口的方法指针表进行修 改。例如,Present1与IDXGISwapChain1接口的方法表的位置4对应,并且不得不对其修改, 使其指向包含在插入的代码段中的函数。同时,位置的原始内容存储在一变量中,以备某个 时刻需要调用原方法。对COM类型接口的指针表的修改只有在该类型的对象第一次创建的 时候实施。当服务重定向结束时,即所有必要的API的所有函数和方法已经被重定向,重新 执行应用程序的进程。

当进程尝试创建新的执行进程,执行函数CreateThread,用于存储将要被创建的新线程 的信息。为了达到该目的,代码段调用初始函数CreateThread,用于执行该函数,并且代码 段自身将新的执行线程的标识符存储在变量中,该变量维持直到此时创建的所有线程的寄存 器。在本优选实施例中,使用初始函数CreateThread,即基于存储在对应变量(存储初始内 存位置的指针的变量,其中每个重定向函数存储在该内存初始位置)内的内存地址,代码段 调用初始API函数,但是在代码段包括创建执行线程的函数时也会出现这种情况,不必要调 用外部函数。在所有这些情况下,代码段管理创建的执行线程的标识符。

另一方面,如上文所述,还有可能在与应用程序相关的进程每次调用作为控制点的函数 时,测量正在执行的应用程序的消耗,例如,在优选实施例中,调用函数Present1。为了达 到该目的,从上次调用这个函数的时间间隔可通过特定的算法测量,从而计算消耗,例如利 用FPS(每秒的帧数)度量。如果包含在插入的代码段的用于测量消耗的算法显示已经超出 预设阈值,则计算必须暂停该执行线程的必要时间。可以通过算法去测量维持实际消耗的必 要执行时间与理想消耗所需时间相比的差异去计算该时间。然后,该代码段使直到此时由进 程(其标识符已经存储在前述对应的变量中)创建的所有的执行线程(即该代码段作用于软 件实体,如执行线程)暂停,暂停时间长度根据计算得到,其中通过函数SuspendThread以 及库kernel32.dll的Sleep进行计算。所计算的时间段一过,执行线程就会再次被譬如库 kernel32.dll的函数ResumeThread启动。在那一刻之后,进程继续正常执行,直到进程下次再 调用控制函数(在本优选实施命名,函数Present1)。

因此,当代码段在涉及作用于执行线程的软件实体时,该代码段控制游戏服务器中应用 程序(更具体地,游戏)在其执行时对可用硬件资源的使用情况。

根据本发明另一优选实施例,该代码段还可作用于另一软件实体,例如内存。在这种情 况下,该代码段必须重定向所有意在管理存储区域预留的API服务(例如函数以及/或者方法) 至包含在代码段自身的服务,从而使包含在代码段内的服务可以分配同一游戏的不同实例的 存储区域。因此,执行中的实例可以共享某些存储区域,从而这些实例的内存的使用情况可 以显著减少。必须考虑到一点,在有些情况下,每个执行的实例都具有不可以共享的独占存 储区域(可包括例如涉及请求执行该实例的用户的数据)。因此,在预留存储区域之前,该代 码段必须确定哪些存储区域可以共享,哪些不可以共享。

对于执行线程类型的软件实体,应用程序所需的存储区域还可以通过代码段调用初始 API函数分配,其中该代码段控制存储区域,该存储区域必须随时分配。

另一方面,该代码段还可以管理另一种类型的软件实体,如锁或互斥锁,从而可以在同 一服务器上执行同一游戏的不止一个实例。程序员通常会在全球计算机游戏(world computer  gaming)中包含有互斥锁,从而防止用户执行同一计算机系统的游戏的不止一个实例。为了 达到该目的,当创建游戏的第一个实例时,互斥锁产生与游戏相关的预设标签(该标签对于 每一个游戏是唯一的),从而当用户尝试执行正在执行的游戏的第二个实例时,该互斥锁确定 存在正在执行的实例(通过标签的存在判断),并且不允许该游戏的第二个实例执行。

为了克服该缺陷,插入属于该游戏的进程的代码段重定向意在管理互斥锁的API服务到 包含在代码段本身内的服务。因此,该代码段可以拦截这些服务,并且修改互斥锁分配给该 服务的预设标签,从而当用户尝试执行游戏的第二个示例时,服务不会检测到任何预设标签 的示例,从而允许其执行。既然代码段已经插入到对应于每个正在执行的实例的进程,分配 到该实例的标签对于每个实例而言均不相同。

尽管已经描述并描绘了本发明的特定实施例,但非常明显的是,本领域技术人员可以进 行变型和修改,或者替换其他技术上等同的细节,都不会超出权利要求保护的范围。

虽然文中参考附图描述的实施例包括计算机系统以及在计算机系统中执行的进程,但本 发明还覆盖计算机程序或者可执行代码段,更具体地,适于将本发明用于实践的在载体媒体 中或上的计算机程序。计算机程序可以是源代码、目标代码或者介于源代码和目标代码之间 的中间代码的形式,如部分编译形式,或者适于实现本发明进程的其他形式。该载体媒体可 以是任何实体或者可以执行该方案的设备。

例如,载体媒体可以包括存储介质,如ROM,例如CD、ROM或者半导体ROM,或者 磁记录介质,例如软盘或硬盘。此外,载体媒体还可以是可传送载体媒体,如可以利用无线 电或其他方式通过电线或光纤进行传输的电或者光信号。

当计算机程序包含在可直接通过电缆或其他机构或装置传播的信号中时,该载体媒体可 以通过所述电缆或其他机构或装置形成。

或者,载体媒体可以为内嵌计算机系统的集成电路,所述集成电路适于执行,或者用于 执行相关进程。

去获取专利,查看全文>

相似文献

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

客服邮箱:kefu@zhangqiaokeyan.com

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

  • 服务号