使用系统调用拦截的计算任务输出的存储和重新使用的制作方法

未命名 09-27 阅读:78 评论:0

使用系统调用拦截的计算任务输出的存储和重新使用
发明领域
1.本发明总体上涉及计算系统,并且特别地涉及用于存储和重新使用计算任务的输出的方法和系统。
2.发明背景
3.各种类型的计算任务进行结果的缓存以供后续重新使用。例如,matev的一篇题为“fast distributed compilation and testing of large c++projects”的文章(第24届高能与核物理计算国际会议(24
th international conference on computing in high energy and nuclear physics),2019年11月)描述了一种分布式编译服务器,该服务器执行预处理并缓存编译结果,以便更快地重建。kirillov在“faster builds with the new caching shader preprocessor(experimental)”(unity blog,2020年5月)中描述了另一个示例预处理和缓存方案。
4.发明概述
5.本文描述的本发明的实施例提供了一种包括存储器和一个或更多个处理器的装置。该一个或更多个处理器被配置成:接收用于执行的第一计算任务,并且在该第一计算任务的执行期间(i)监视由第一计算任务发出的操作系统(os)调用,(ii)基于所监视的os调用来识别由第一计算任务产生的一个或更多个输出,以及(iii)将第一计算任务的一个或更多个输出存储在存储器中。一个或更多个处理器还被配置成接收用于执行的第二计算任务,并且在确定第二计算任务将产生与第一计算任务的存储的输出相同的至少一个输出时,重新使用第一计算任务的存储的输出作为第二计算任务的输出。
6.在一些实施例中,一个或更多个处理器被配置成通过以下操作确定第二计算任务的至少一个输出将与第一计算任务的存储的输出相同:基于在第一计算任务的执行期间监视的os调用,识别由第一计算任务获取的一个或更多个输入;以及确定(i)该一个或更多个输入的当前版本与由第一计算任务获取的一个或更多个对应输入相同,以及(ii)从一个或更多个输入产生至少一个输出的至少一个操作在第一计算任务和第二计算任务中相同。
7.在示例实施例中,一个或更多个处理器被配置成在以下项之间进行比较,以便确定当前版本与由第一计算任务获取的输入相同:(i)在一个或更多个输入的当前版本上计算的一个或更多个第一签名(signature),以及(ii)在由第一计算任务获取的一个或更多个对应输入上计算的一个或更多个第二签名。
8.在另一实施例中,一个或更多个处理器被配置成仅识别影响第一计算任务的输出中的一个或更多个输出的第一计算任务的输入。在又一实施例中,一个或更多个处理器被配置成在发现至少一个操作在第二计算任务和第一计算任务之间不同,或者发现一个或更多个输入的当前版本不同于由第一计算任务获取的一个或更多个对应输入时,执行第二计算任务。
9.在公开的实施例中,第一计算任务包括多个软件进程的层次结构,并且一个或更多个处理器被配置成识别该多个进程的层次结构并累积由多个进程获取的输入中的至少一些。在示例实施例中,第一计算任务包括一个或更多个软件进程,并且该一个或更多个处
理器被配置成通过监视由进程向os发出的os调用来识别由第一计算任务获取的输入。在实施例中,第二计算任务包括一个或更多个软件进程,该一个或更多个软件进程包括给定进程,在该给定进程中,给定输入仅在执行期间变得可用,并且一个或更多个处理器被配置成运行给定进程至少直到给定输入可用,然后基于给定输入决定是否中止(abort)给定进程并重新使用来自第一计算任务的存储的输出。
10.在一些实施例中,一个或更多个处理器被配置成通过将程序代码注入到第一计算任务中来监视os调用,该程序代码拦截由第一计算任务向os发出的os调用。在示例实施例中,第一计算任务包括多个软件进程的层次结构,并且一个或更多个处理器被配置成将拦截os调用的程序代码注入到多个软件进程中。在另一实施例中,一个或更多个处理器被配置成通过比较在第一计算任务和第二计算任务的至少相应命令行上计算的第一签名和第二签名来确定第二计算任务将产生与第一计算任务的存储的输出相同的至少一个输出。
11.在一些实施例中,除了重新使用第一计算任务的存储的输出,一个或更多个处理器还被配置成重构目标进程随后使用第二计算任务的输出所需的附加数据。在实施例中,一个或更多个处理器被配置成向目标进程指示第二计算任务已经完成执行,尽管第二计算任务并没有被执行并且第二计算任务的输出包括第一计算任务的存储的输出。
12.根据本发明的实施例,还提供了一种方法,该方法包括:接收用于执行的第一计算任务,以及在第一计算任务的执行期间(i)监视由第一计算任务发出的操作系统(os)调用,(ii)基于监视的os调用识别由第一计算任务产生的一个或更多个输出,以及(iii)将第一计算任务的一个或更多个输出存储在存储器中。接收用于执行的第二计算任务。在确定第二计算任务将产生与第一计算任务的存储的输出相同的至少一个输出时,重新使用第一计算任务的存储的输出作为第二计算任务的输出。
13.根据对本发明的实施例的以下详细描述并结合以下附图,本发明将得到更充分的理解。
14.附图简述
15.图1是示意性地示出根据本发明实施例的计算系统的框图,该计算系统使用系统调用拦截来进行计算任务输出的存储和重新使用;以及
16.图2是示意性地示出根据本发明实施例的方法的流程图,该方法使用系统调用拦截来存储和重新使用计算任务输出。
具体实施方式
17.综述
18.本文描述的本发明的实施例提供了用于有效地执行计算任务的方法和系统。如下面将详细解释的,所公开的技术存储先前执行的计算任务的输出,并且在识别出新的计算任务将产生相同的输出时重新使用先前执行的计算任务的存储的输出。
19.在一个示例场景中,如果(i)两个计算任务指定相同的操作(例如,包括命令行参数的同一命令行),以及(ii)新计算任务所需的输入(或者至少影响输出的输入)与前一个计算任务的存储的输出相同,则新计算任务将生成与前一个计算任务的输出相同的输出。对于确定性计算任务(即,给定相同输入产生相同输出的计算任务),这些条件确保前一个计算任务的存储的输出可以被安全地重新使用,以作为新计算任务的输出。输入类型和输
出类型的具体示例将在下面进一步给出。
20.然而,所公开的技术不限于前一个任务和新任务执行完全相同的操作、具有完全相同的输入并产生完全相同的输出的情况。更一般地,新任务将生成与前一个任务的存储的输出相同的至少一个输出就足够了。在任何这样的情况下,前一个任务的存储的输出可以被重新使用以作为新任务的输出,从而避免了新任务重新计算该输出的需要。如果新任务的所有输出都可以从一个或更多个先前任务的存储的输出中获得,则根本不需要唤醒(invoke)新任务。
21.换句话说,所公开的技术通常考虑对输出来说是“有意义的(meaningful)”或者与输出“相关(relevant)”的输入,而不是不影响输出的输入,诸如可忽略的命令行开关。一些输出也可能是无意义的,因此可以从缓存进程中丢弃。一个示例是日志文件,它可能因唤醒而异。
22.在一些实施例中,所公开的技术通过以下操作识别前一个任务的存储的输出可以被重新使用以作为新任务的输出:
23.●
识别由前一个任务在其执行期间获取的输入中的一个或更多个,并存储所识别的输入的签名。
24.●
使用签名比较,确定这些输入(或者影响所讨论的输出的至少一个或更多个输出)的当前版本与由第一计算任务获取的对应输入相同。
25.●
确定从输入产生所讨论的输出的一个或更多个操作(例如,命令行和命令行参数)在新任务和在前一个任务中是相同的。
26.为了验证两个计算任务的输入和相关联的操作(例如,命令行和参数)是否相同,前一个计算任务的输入和相关联操作的签名(例如,散列值)也可以被存储,并与新计算任务的相应签名进行比较。
27.所公开技术的一个重要特性是,计算任务的输入和输出(例如,输入文件和输出文件的列表)是通过拦截由计算任务进行的操作系统(os)调用来即时(即在计算任务的执行期间)识别的。可用于识别输入和输出的os调用的非限制性示例包括文件系统(fs)访问调用、注册表访问调用和网络访问调用。
28.使用os调用拦截来识别计算任务的输入和输出是非常有效的,例如,因为它不需要任何预处理或关于计算任务依赖性的先验知识。例如,在编译应用中,不需要编辑编译器产品的源代码来为编译器输出提供缓存和重新使用解决方案。因此,所公开的技术可以用于不支持预处理服务的任务和工具。当用于确实支持预处理服务的任务和工具时,所公开的技术能够跳过预处理阶段,从而减少等待时间并节省计算资源。
29.在一些实施例中,通过将专用软件代码(本文中称为“监视代码(monitoring code)”)注入到运行计算任务的进程中来识别由计算任务进行的os调用。可替代地,其他技术,例如由专用驱动器监视os调用,也可用于识别由计算任务或进程发出的os调用。
30.在各种实施例中,计算系统可以包括各种类型的一个或更多个处理器,例如,一个或更多个中央处理单元(cpu,例如,intel cpu和/或arm cpu)、图形处理单元(gpu)、加速处理单元(apu)和/或任何其他合适的处理器类型。计算任务可以由在一个或更多个处理器上运行的一个或更多个进程来执行。在本上下文中,术语“存储”和“缓存”可互换使用。
31.通常,每个计算任务(也称为“作业(job)”)包括主进程,该主进程根据所定义的层
次结构(有时被称为“进程树”)依次唤醒一个或更多个其他进程。进程树中的进程可以是主进程的直接或间接后代。进程树中的特定进程可以是一个进程的子进程,同时也可以是另一个进程的父进程。适当的监视代码被注入到每个进程中。如将在下面解释的,所公开技术的功能的一部分是基于所监视的os调用来识别进程树。
32.考虑进程树中的特定进程(被称为“父进程”),其在某个阶段唤醒另一个进程(被称为“子进程”)。在一个示例流中,父进程中注入的监视代码拦截唤醒子进程的os调用。根据拦截的os调用,父进程中的监视代码确定子进程的预期输出是否与任何缓存的输出相同。例如,监视代码可以用从os调用导出的子进程的输入和操作(例如,命令行)的签名来查询缓存。
33.如果子进程的预期输出在缓存中可用,监视代码会阻止唤醒子进程,而是重新使用缓存的输出。监视代码向父进程提供结果和用户消息(例如,stdout和stderr),使得看起来好像子进程被唤醒和执行(例如,合适的退出代码和输出数据),尽管结果是从先前执行的进程的缓存的输出中导出的。如果(根据输入和操作的签名)子进程的预期输出不与任何缓存的输出匹配,则父进程中的监视代码将启用子进程的执行,并缓存得到的输出(以及对应的输入签名)以供将来使用。
34.还考虑了其他示例流程。例如,子进程可以在它开始运行之后获得它的一些或所有输入(这种情况在本文中被称为“延迟输入”)。在这种情况下,即其中一个或更多个输入仅在子进程的执行期间可用,父进程中的监视代码可以允许子进程开始运行,至少直到相关输入可用。在这个阶段,父进程中的监视代码能够决定子进程的预期输出是否在缓存中可用。如果可用,父进程中的监视代码终止(terminate)子进程,并向父进程提供从缓存的输出导出的结果。该解决方案节省了完全执行子进程所需的时间。
35.在一些实施例中,本文描述的缓存和重新使用技术不仅可以应用于已经成功完成的计算任务,还可以应用于已经失败的计算任务。
36.本文描述的方法和系统适用于各种计算任务。由于所公开的技术是通用的,并且不依赖于具体的服务或对具体工具的熟悉程度,因此它们可以用于特定输入将导致特定输出的各种用例中。如果需要的话,只需要对所公开的技术进行最小程度的修改来适应特定的用例或应用。此外,所公开的技术通常在很少或不干预被缓存和重新使用的计算任务的正在进行的操作的情况下实现。
37.计算任务的非限制性示例包括软件编译、图像渲染、单元测试、集成测试和其他类型的测试、代码分析、代码签名、代码混淆、打包、压缩、编码、模拟、一般计算、ai和机器学习计算、3d建模、着色器编译(shader compilation)、光照贴图烘焙(lightmap baking)、视频处理、加密、科学执行(scientific executions),等等。下面将更详细地描述几个示例用例。
38.系统描述
39.图1是示意性地示出根据本发明实施例的计算系统20的框图,该计算系统20使用os调用拦截来进行计算任务输出的缓存和重新使用。在本示例中,系统20包括处理器24、存储子系统28和存储器32。处理器24运行合适的操作系统(os)36。
40.如下面将详细阐述的,在图1中看到的系统配置是一个非限制性示例实现。在替代实施例中,所公开的技术可以用在各种其他系统配置中,例如虚拟化环境、包括多个处理器
的系统、包括多个存储组件的系统(诸如文件系统和注册表)、联网系统、基于云的系统或任何其他合适的配置。为了清楚起见,下面的描述指的是集中式单处理器系统。
41.在各种实施例中,处理器24可以被配置成执行各种类型的计算任务(为了简洁起见,本文中简称为“任务”)。一个绝非用于限制的典型示例是编译源代码以便产生中间代码和可执行目标代码的编译器进程。可替代地,所公开的技术可以用于任何其他合适种类的计算任务。
42.本文描述的实施例主要指确定性计算任务,即,在给定相同输入的情况下保证产生相同输出的任务。然而,所公开的技术在一些情况下也可以用于非确定性任务。例如,任务可以具有确定性输出和非确定性输出,在这种情况下,所公开的技术可以应用于确定性输出的子集。作为另一个示例,非确定性输出可能具有少量的可能值,在这种情况下,如果可能,缓存各种可能的输出并且在每次唤醒时选择正确的输出可能是值得的。
43.此外,本文描述的示例主要考虑产生彼此二进制相同(binary-identical)的输出的任务。然而,所公开的技术在一些情况下可以用于产生功能上等同但不一定二进制相同的输出的任务。在本专利申请和权利要求书的上下文中,术语“相同输出”既指二进制相同的输出,也指功能上等同但不是二进制相同的输出。类似地,术语“相同输入”既指二进制相同的输入,也指功能上等同但不是二进制相同的输入。
44.处理器24通过运行一个或更多个软件进程40(为了简洁起见,本文中简称为“进程”)来执行计算任务。在一些情况下,每个进程40对应于相应的计算任务。在其他情况下,给定的计算任务由多个进程40执行,例如,由唤醒一个或更多个子进程的主进程执行。属于给定任务的进程可以是主进程的直接或间接后代。给定任务中进程的层次结构被称为“进程树”。图1的示例示出了包括被表示为40a-40d的四个进程的进程树。进程40a是主进程。进程40b和40c是进程40a的子进程。进程40d是进程40c的子进程(并且是进程40a的间接后代)。
45.计算任务(例如,编译任务或任何其他任务)通常由任务定义(例如,命令行)指定,该任务定义定义了所需的操作以及可能的一个或更多个参数。参数可以包括例如命令行开关、环境变量等。在执行期间,计算任务读取一个或更多个输入,例如,从输入文件(或文件夹、或注册表或任何其他合适的输入类型)读取数据,并对一个或更多个输出进行写入,例如,将数据写入输出文件(或文件夹、或注册表或任何其他合适的输出类型)。在图1的示例中,各种计算任务的输入文件和输出文件包括在存储子系统28中的文件系统(fs)52的一个或更多个目录48中存储的文件44。
46.更一般地说,计算任务的输入可以包括例如命令行、参与任务执行的各种进程的可执行文件和正在使用的库、指定的文件列表(例如,在命令行中传递的文件)、未指定的文件列表(例如,从先前执行中已知的文件,诸如头文件)、缺失的文件(例如,从先前执行中已知的文件,诸如配置文件)、注册表、环境变量或任何其他合适的输入。计算任务的输出可以包括例如输出文件和文件夹(包括文件删除)、标准输出(stdout)、标准错误(stderr)、进程退出代码、网络分组(例如,rest调用)、对其他进程的管道或进程间通信(ipc)调用(例如,数据库调用)、对环境变量的改变或任何其他合适的输出。作为示例,下面的描述主要涉及输入文件和输出文件。
47.通常,为了读取计算任务的输入数据,属于该任务的进程40向os 36发出一个或更
多个“系统调用”(本文中也称为“os调用”)。给定的os调用,除其他外,指定将从中读取数据的输入文件。os 36通过访问fs 52中的指定文件,并将输入数据(通常是指向数据的指针或句柄)转发给请求进程40来服务于这样的系统调用。为了写入由计算任务产生的输出数据,对应的进程40通常向os 36发出一个或更多个系统调用,每个os调用,除其他外,指定数据将被写入其中的输出文件。os 36通过将数据写入fs 52中的指定文件来服务于系统调用。更一般地,可能类型的os调用可以包括访问fs 52的调用、访问os 36的注册表的调用、请求网络访问的调用和/或读取或写入数据的任何其他合适类型的os调用。
48.在许多实际场景中,同一计算任务可能被多次接收以用于执行。例如,可以多次唤醒编译器来编译同一源文件。代替多次执行同一任务,识别这样的场景并重新使用先前执行的任务的结果是非常有利的。更一般地,在各种情况下,预先知道新的计算任务将产生与先前执行的任务的输出相同的输出。在任何这样的情况下,重新使用先前执行的任务的输出而不是让新任务再次计算和生成该输出是有利的。
49.为此,处理器24进一步运行下列软件组件:
50.●
注入的监视器56(本文中也称为“监视代码”)——被注入到进程40中的专用软件代码。在给定的进程40中,对应的监视器56拦截由该进程向os 36发出的os调用。监视器56识别请求读写数据的os调用,并从这些os调用中提取输入文件和输出文件(或者其他类型的输入和输出,只要是适用的)的名称(通常具有完整路径)。在一些实施例中,监视器56还拦截创建子进程的os调用,以便也将监视代码注入到子进程中。
51.●
任务管理器60——一种软件组件,其使用由监视器56拦截的信息来缓存(存储)先前执行的任务并在新任务中重新使用缓存的信息。
52.在一些实施例中,任务管理器60将信息缓存在存储器32中的合适的存储器内数据库64中。数据库64包括一个或更多个条目68。每个条目68包括以下信息:
53.●
任务信息(task_info):任务定义(例如,命令行和任何命令行参数),加上在任务定义的至少一部分上计算的任务签名。任务签名被用作用于查询数据库64的密钥。可以使用任何合适类型的签名,例如散列。任务签名通常是在任务定义中影响任务输出的部分上计算的。任务定义中不影响输出的部分,例如一些命令行开关,通常被排除在任务签名之外。
54.●
由任务读取的(一个或更多个)输入文件或其他输入的列表,以及在至少一些输入上计算的相应签名。在一个实施例中,签名包括在输入上计算的md5散列值。可替代地,可以使用任何其他合适的签名。签名可以是标准的已知签名,例如,md5或sha,或者专有签名,例如为特定输入类型设计的签名。在一些实施例中,输入文件列表排除不影响任务输出的输入文件。签名通常也只在影响输出的输入上进行计算。
55.●
由任务产生的(一个或更多个)输出文件或其他输出的列表。
56.在图1中看到的数据库64的结构是一个高度简化的结构,选择它纯粹是为了清楚起见。在替代实施例中,数据库64可以以任何其他合适的方式实现,例如,使用多个数据库,和/或以集中式或共享配置实现。在一个实施例中,数据库64被划分成(i)包括任务信息结构的元数据数据库,和(ii)包括实际存储装置的数据数据库,输入文件和输出工件(output artifact)(例如,输出文件、退出代码、stdout、stderr)保存在该数据数据库中。输出文件通常以不同的名称保存在数据库中。转换成原始文件名是基于相应的任务信息。
57.在本示例中,为了清楚起见,所有任务都在同一处理器中运行。在替代实施例中,新任务和先前执行的任务可以在不同的处理器中运行,例如,在通过网络连接的不同主机(或vm或容器)上运行。数据库64可以向这样的多个处理器(例如向多个联网的主机)提供缓存服务。
58.示例方法流程
59.图2是示意性地示出根据本发明实施例的用于使用os调用拦截来缓存计算任务输出的方法的流程图。方法在任务接收步骤70开始,其中任务管理器60接收用于执行的新计算任务。在查询步骤74,任务管理器60在相关任务定义上(例如,在任务命令行中影响任务输出的部分上)计算任务签名,并利用任务签名查询数据库64。
60.在条目检查步骤78,任务管理器60检查数据库64是否包括其任务签名与新任务的任务签名相匹配的条目68。
61.如果步骤78的结果是数据库64不包括匹配条目,则任务管理器60开始“缓存未命中(cache miss)”流程。在执行步骤82,任务管理器允许新任务的主进程40开始执行任务。在新任务的执行期间,在进程检测和监视步骤86,主进程的注入的监视器56通过拦截并替换进程创建功能来识别新任务的进程树,包括主进程的任何直接和间接后代。主进程的注入的监视器56将监视代码56注入到所识别的进程树中的进程中。然后,每个进程内的注入的监视器56监视由该进程发出的os调用。
62.作为监视os调用的一部分,每个进程中的监视器56通常识别由进程40访问的输入文件和输出文件(或其他合适的输入和输出)。监视器56向任务管理器60报告所识别的输入文件和输出文件。在条目创建90处,任务管理器60在数据库64中为新任务创建新条目68。任务管理器60在新条目中缓存:(i)任务信息和对应的任务签名;(ii)如由监视器56报告的所识别的输入文件(或至少影响输出的输入文件)的列表,(iii)在输入文件上计算的相应签名(例如,md5散列值),以及(iv)如由监视器56报告的所识别的输出工件(例如,输出文件、退出代码、stdout、stderr)的列表。
63.另一方面,如果步骤78的结果是数据库64已经具有其任务签名与新任务的任务签名相匹配的条目68,则任务管理器60前进到签名计算步骤94,在签名计算步骤94中,任务管理器60在任务列表上的当前输入文件上(例如,当它们现在存在于fs 52中时,或者在网络或其他位置上时)计算相应的签名(例如,md5散列值)。在输入检查步骤98,任务管理器60检查输入文件的当前签名是否与缓存在数据库64的匹配条目68中的对应签名匹配。
64.如果输入文件签名中的至少一个不匹配,则缓存的输出不能作为新任务的输出被重新使用。在这种情况下,任务管理器60前进到步骤82的缓存未命中流程,并允许进程树执行新任务。
65.注意,在后一种情况下,发现任务签名与数据库64中的条目68匹配,但是发现输入文件签名中的至少一个不匹配。然而,在一些实施例中,任务管理器60不删除现有条目68。如在下面将看到的,该特征允许数据库保存与同一条目(同一任务签名)相关联的多个可选输入列表(以及多个可选的不同缓存输出)。
66.现在回到步骤98,另一方面,如果输入文件的当前签名与对应的缓存签名匹配,则任务管理器60在延迟输入检查步骤102检查新任务是否具有延迟输入。在当前上下文中,术语“延迟输入”指的是在进程开始运行之后由该进程获得的输入。如果预期没有延迟输入,
任务管理器60在重新使用步骤106阻止进程40执行新任务。相反,任务管理器60从数据库64检索前一个任务的缓存的输出,并将缓存的输出重新用作新任务的输出。
67.在一些实施例中,当进程树中的父进程40重新使用缓存的输出而不是运行子进程40时,父进程中的监视代码56以看起来好像子进程被唤醒和执行的方式向父进程提供缓存的输出。例如,父进程中的监视代码56可以向父进程提供子进程的合适的退出代码,以及被写入父进程预期的适当位置的stdout和stderr。
68.在一些实施例中,进程的用户消息(例如,stdout和stderr)也被存储在数据库64中(在步骤90)。在缓存命中(catch hit)的情况下,即,当在步骤106重新使用缓存的输出时,监视代码56可以检索缓存的用户消息并将它们提供给父进程,以便保持原始用户体验。
69.在一些实施例中,当在新的计算任务中重新使用前一个计算任务的缓存的输出时,任务管理器60重构目标进程(例如,父进程)使用输出所需的附加数据。例如,可在完成一项任务或一系列任务(例如,一个项目)时执行重构。在向目标进程提供输出之前,任务管理器通常将缓存的输出和附加数据格式化为类似于已完成任务的格式的格式。以这种方式,目标进程通常不知道:新的计算任务没有被执行,并且它接收到的输出是来自前一个任务、被重新使用的。在一些实施例中,任务管理器60向目标进程指示新的计算任务已经完成执行,尽管该新的计算任务根本没有被执行。
70.现在回到步骤102,如果发现任务具有一个或更多个延迟输入,任务管理器60前进到受限的执行步骤110。在该步骤中,允许任务执行直到注入的监视器56获得延迟输入(或至少影响输出的那些输入)的阶段。任务管理器60计算正被获得的延迟输入的签名。
71.在检测和监视步骤114(类似于上面的步骤86)中,进程的监视代码56识别进程树,并将监视代码56注入到所识别的子进程中。每个进程内的注入的监视器56监视由该进程发出的os调用,以便识别输入和输出。在延迟输入检查步骤118,任务管理器60检查延迟输入的当前签名是否与缓存在数据库64的匹配条目68中的对应签名匹配。如果是这样(即,缓存命中时),(在父进程或子进程中的)监视代码56在中止步骤122中止任务,并前进到重新使用步骤106。如果不是(即,缓存未命中时),监视代码56前进到执行步骤82。
72.图1中示出的系统20配置和图2中示出的方法流程是纯粹为了概念清晰而选择的非限制性示例。在替代实施例中,可以使用任何其他合适的配置和流程。
73.例如,如上所述,系统20可以包括虚拟化环境、包括多个处理器的系统、联网系统或基于云的系统。任何进程40可以在“裸机”处理器上、在虚拟机(vm)中、在容器中运行或以任何其他合适的方式运行。计算任务的输入和输出可以包括任何合适类型的输入和输出,例如文件、目录、对象,等等。
74.os 36可以包括任何合适类型的os,例如,linux、windows或mac os。数据库64可以是集中式的(例如,本地的)或共享的(即,分布式的)。fs 52也可以是集中式的(例如,本地的)或共享的(即,分布式的)。在一些实施例中,任务管理器60可以处理在可能不同类型的不同操作系统36下运行的不同进程40。
75.在一些实施例中,系统20可以包括数据库64的多个实例,例如,本地实例加上一个或更多个远程实例。不同的实例可以在地理上并置或分散。在一些实施例中,任务管理器60和/或监视代码56可以使用os触发器来检测对本地输入文件的修改。这种检测使得能够更快地验证输入文件。在一些实施例中,任务管理器60可以使用从项目到本地缓存的软链接,
而不是在缓存命中时复制文件。
76.图1中看到的不同系统元件可以使用软件、使用合适的硬件或使用软件和硬件元件的组合来实现。例如,存储子系统28可以包括一个或更多个磁性或固态存储设备。存储器32可以包括例如一个或更多个随机存取存储器(ram)设备。
77.在一些实施例中,处理器24包括通用处理器,该通用处理器以软件方式被编程,以执行在本文中描述的功能。软件可通过网络以电子形式下载到处理器,例如,或者可替代地或附加地,软件可以被提供和/或存储在非暂时性有形介质(诸如,磁存储器、光存储器或电子存储器)上。
78.示例用例和应用
79.如上所述,所公开的技术可以在各种各样的用例和应用中用于各种类型的计算任务。几个非限制性示例包括:
80.●
软件编译。在该应用中,输入通常包括包含源代码和参数的文件。输出通常包括包含可执行代码(目标代码)的文件和/或诸如obj文件、pdb文件、tlb文件等的任何中间输出。
81.●
软件测试。示例测试应用包括软件单元测试、集成测试、api测试或任何其他合适的测试类型。在这些应用中,输入通常包括输入文件和命令,并且输出通常包括输出文件和指示测试成功/失败的文本。
82.●
图形渲染。在该应用中,输入通常包括输入数据(文件和命令行),并且输出通常包括输出文件。
83.●
许多其他应用,例如金融模拟、风险分析、3d模型执行、代码分析、打包、代码签名、代码混淆、cad/cam模拟、蒙特卡罗模拟、着色器编译、光照贴图烘焙、压缩、编码、加密、数据转换、渲染等。
84.因此,将认识到的是,以上描述的实施例是通过示例引用的,并且本发明并不限于上文已具体示出和描述的内容。相反,本发明的范围包括上文所描述的各种特征的组合及子组合以及本发明的变型和修改,该变型和修改将在本领域的技术人员阅读上述描述之后被想到并且在现有技术中未被公开。通过引用并入本专利申请中的文件被视为本技术的组成部分,除了任何术语在这些并入的文件中在某种程度上以与本说明书中明确地或隐含地做出的定义冲突的方式被定义之外,应该仅考虑本说明书中的定义。

技术特征:
1.一种装置,包括:存储器;以及一个或更多个处理器,所述一个或更多个处理器被配置成:接收用于执行的第一计算任务;在所述第一计算任务的执行期间:(i)监视由所述第一计算任务发出的操作系统(os)调用,(ii)基于监视的os调用识别由所述第一计算任务产生的一个或更多个输出,以及(iii)将所述第一计算任务的所述一个或更多个输出存储在所述存储器中;接收用于执行的第二计算任务;以及在确定所述第二计算任务将产生与所述第一计算任务的存储的输出相同的至少一个输出时,重新使用所述第一计算任务的存储的输出作为所述第二计算任务的输出。2.根据权利要求1所述的装置,其中,所述一个或更多个处理器被配置成通过以下操作确定所述第二计算任务的至少一个输出将与所述第一计算任务的存储的输出相同:基于在所述第一计算任务的执行期间监视的所述os调用,识别由所述第一计算任务获取的一个或更多个输入;以及确定(i)所述一个或更多个输入的当前版本与由所述第一计算任务获取的一个或更多个对应输入相同,以及(ii)从所述一个或更多个输入产生所述至少一个输出的至少一个操作在所述第一计算任务和所述第二计算任务中相同。3.根据权利要求2所述的装置,其中,所述一个或更多个处理器被配置成在以下项之间进行比较,以便确定所述当前版本与由所述第一计算任务获取的输入相同:(i)在所述一个或更多个输入的当前版本上计算的一个或更多个第一签名,以及(ii)在由所述第一计算任务获取的一个或更多个对应输入上计算的一个或更多个第二签名。4.根据权利要求2所述的装置,其中,所述一个或更多个处理器被配置成仅识别影响所述第一计算任务的输出中的一个或更多个输出的所述第一计算任务的输入。5.根据权利要求2所述的装置,其中,所述一个或更多个处理器被配置成在发现所述至少一个操作在所述第二计算任务和所述第一计算任务之间不同,或者发现所述一个或更多个输入的当前版本不同于由所述第一计算任务获取的一个或更多个对应输入时,执行所述第二计算任务。6.根据权利要求2所述的装置,其中,所述第一计算任务包括多个软件进程的层次结构,并且其中,所述一个或更多个处理器被配置成识别所述多个进程的所述层次结构,并累积由所述多个进程获取的输入中的至少一些。7.根据权利要求2所述的装置,其中,所述第一计算任务包括一个或更多个软件进程,并且其中,所述一个或更多个处理器被配置成通过监视由所述进程向os发出的所述os调用来识别由所述第一计算任务获取的输入。8.根据权利要求2所述的装置,其中,所述第二计算任务包括一个或更多个软件进程,所述一个或更多个软件进程包括给定进程,在所述给定进程中,给定输入仅在执行期间变得可用,并且其中,所述一个或更多个处理器被配置成运行所述给定进程至少直到所述给定输入可用,然后基于所述给定输入决定是否中止所述给定进程并重新使用来自所述第一计算任务的存储的输出。9.根据权利要求1-8中任一项所述的装置,其中,所述一个或更多个处理器被配置成通
过将程序代码注入到所述第一计算任务中来监视所述os调用,所述程序代码拦截由所述第一计算任务向os发出的所述os调用。10.根据权利要求9所述的装置,其中,所述第一计算任务包括多个软件进程的层次结构,并且其中,所述一个或更多个处理器被配置成将拦截所述os调用的所述程序代码注入到所述多个软件进程中。11.根据权利要求1-8中任一项所述的装置,其中,所述一个或更多个处理器被配置成通过比较在所述第一计算任务和所述第二计算任务的至少相应命令行上计算的第一签名和第二签名,确定所述第二计算任务将产生与所述第一计算任务的存储的输出相同的至少一个输出。12.根据权利要求1-8中任一项所述的装置,其中,除了重新使用所述第一计算任务的存储的输出,所述一个或更多个处理器还被配置成重构目标进程随后使用所述第二计算任务的输出所需的附加数据。13.根据权利要求12所述的装置,其中,所述一个或更多个处理器被配置成向所述目标进程指示所述第二计算任务已经完成执行,尽管所述第二计算任务并没有被执行并且所述第二计算任务的输出包括所述第一计算任务的存储的输出。14.一种方法,包括:接收用于执行的第一计算任务;在所述第一计算任务的执行期间:(i)监视由所述第一计算任务发出的操作系统(os)调用,(ii)基于监视的os调用识别由所述第一计算任务产生的一个或更多个输出,以及(iii)将所述第一计算任务的所述一个或更多个输出存储在存储器中;接收用于执行的第二计算任务;以及在确定所述第二计算任务将产生与所述第一计算任务的存储的输出相同的至少一个输出时,重新使用所述第一计算任务的存储的输出作为所述第二计算任务的输出。15.根据权利要求14所述的方法,其中,确定所述第二计算任务的所述至少一个输出将与所述第一计算任务的存储的输出相同包括:基于在所述第一计算任务的执行期间监视的所述os调用,识别由所述第一计算任务获取的一个或更多个输入;以及确定(i)所述一个或更多个输入的当前版本与由所述第一计算任务获取的一个或更多个对应输入相同,以及(ii)从所述一个或更多个输入产生所述至少一个输出的至少一个操作在所述第一计算任务和所述第二计算任务中相同。16.根据权利要求15所述的方法,其中,确定所述第二计算任务的所述至少一个输出将与所述第一计算任务的存储的输出相同包括在以下项之间进行比较:(i)在所述一个或更多个输入的当前版本上计算的一个或更多个第一签名,以及(ii)在由所述第一计算任务获取的一个或更多个对应输入上计算的一个或更多个第二签名。17.根据权利要求15所述的方法,其中,识别所述一个或更多个输入包括仅识别影响所述第一计算任务的输出中的一个或更多个输出的所述第一计算任务的输入。18.根据权利要求15所述的方法,其中,并且包括:在发现所述至少一个操作在所述第二计算任务和所述第一计算任务之间不同,或者发现所述一个或更多个输入的当前版本不同于由所述第一计算任务获取的一个或更多个对应输入时,执行所述第二计算任务。
19.根据权利要求15所述的方法,其中,所述第一计算任务包括多个软件进程的层次结构,并且其中,识别所述一个或更多个输入包括识别所述多个进程的所述层次结构,并累积由所述多个进程获取的输入中的至少一些。20.根据权利要求15所述的方法,其中,所述第一计算任务包括一个或更多个软件进程,并且其中,识别所述一个或更多个输入包括监视由所述进程向os发出的所述os调用。21.根据权利要求15所述的方法,其中,所述第二计算任务包括一个或更多个软件进程,所述一个或更多个软件进程包括给定进程,在所述给定进程中,给定输入仅在执行期间变得可用,并且所述方法包括运行所述给定进程至少直到所述给定输入可用,然后基于所述给定输入决定是否中止所述给定进程并重新使用来自所述第一计算任务的存储的输出。22.根据权利要求14-21中任一项所述的方法,其中,监视所述os调用包括:将拦截由所述第一计算任务向os发出的所述os调用的程序代码注入到所述第一计算任务中。23.根据权利要求22所述的方法,其中,所述第一计算任务包括多个软件进程的层次结构,并且其中,注入所述程序代码包括将拦截所述os调用的所述程序代码注入到所述多个软件进程中。24.根据权利要求14-21中任一项所述的方法,其中,确定所述第二计算任务将产生与所述第一计算任务的存储的输出相同的至少一个输出包括:比较在所述第一计算任务和所述第二计算任务的至少相应命令行上计算的第一签名和第二签名。25.根据权利要求14-21中任一项所述的方法,并且包括:除了重新使用所述第一计算任务的存储的输出,还重构目标进程随后使用所述第二计算任务的输出所需的附加数据。26.根据权利要求25所述的方法,并且包括:向所述目标进程指示所述第二计算任务已经完成执行,尽管所述第二计算任务并没有被执行并且所述第二计算任务的输出包括所述第一计算任务的存储的输出。

技术总结
一种装置(20)包括存储器(32)和一个或更多个处理器(24)。该一个或更多个处理器被配置成:接收用于执行的第一计算任务,并且在第一计算任务的执行期间(i)监视由第一计算任务发出的操作系统(OS)调用,(ii)基于所监视的OS调用来识别由第一计算任务产生的一个或更多个输出,以及(iii)将第一计算任务的一个或更多个输出存储在存储器中。该一个或更多个处理器还被配置成接收用于执行的第二计算任务,并且在确定第二计算任务将产生与第一计算任务的存储的输出相同的至少一个输出时,重新使用第一计算任务的存储的输出作为第二计算任务的输出。输出。输出。


技术研发人员:维克多
受保护的技术使用者:快编大师软件有限公司
技术研发日:2022.02.20
技术公布日:2023/9/23
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

航空商城 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

评论

相关推荐