选择性地使用缓解来评估存储器管理技术的有效性以减少错误的制作方法

文档序号:6595026阅读:178来源:国知局
专利名称:选择性地使用缓解来评估存储器管理技术的有效性以减少错误的制作方法
选择性地使用缓解来评估存储器管理技术的有效性以减少
错误背景在多用途计算设备中,操作系统通常,但不专门地,用于管理供在该计算设备上执行的一个或多个应用程序使用的该计算设备的存储器。例如,如果两个应用程序存取计算设备上的存储器,则操作系统可分配存储器的各部分以供这两个应用程序使用,使得两者都能存取存储器而不破坏对方所存储的数据。该管理和仲裁可能是缓解在应用程序试图使用对方正在使用的存储器时引发的问题所必需的。例如,如果两个应用程序都试图在相同或重叠的时间段内使用存储器的同一部分,则第二个应用程序可能盖写第一个应用程序的数据,且第一个应用程序可能无法正确执行或者甚至可能崩溃。诸如这些的错误对用户体验有显著影响,尤其是在它们频繁发生的情况下。操作系统通常包括应用程序可向其发送执行存储器管理任务的请求的存储器管理器,使得存储器管理器可针对存储器资源的使用在进程之间进行仲裁。例如,如果应用程序希望临时或永久地存储数据,则应用程序可请求存储器管理器向该应用程序分配某一量的存储器。稍后,当应用程序不再需要该存储器时,应用程序可如此通知存储器管理器,并且请求解除分配(或“释放”)所分配的存储器,以使其可被另一应用程序使用。当第二应用程序向存储器管理器发送对存储器的请求时,存储器管理器可咨询其记录来确定存储器中当前未被分配的部分,并将这些部分分配给第二应用程序。可执行与操作系统进行交互的进程的某些软件应用程序例如可包括与执行存储器操作相关的隐错或其他编程缺陷,并且即使是在存储器管理器正确地执行了存储器操作的时候,软件应用程序也可能因存储器错误而失败。这些存储器错误可因可在存储器操作之间引发的不一致性而引起。例如,如上所述,软件应用程序可请求向应用程序分配第一数量的存储器,然后将大于该第一数量的第二数量的数据写入该存储器。操作之间的不一致性一一在该示例中,是第一数量和第二数量之间大小的不一致性——会引起导致软件应用程序中的失败的存储器错误。这些失败可包括因存储器错误所引起的不正确执行,或甚至是停止应用程序的执行的灾难性错误或“崩溃”。由于这些编程隐错的影响,已经开发了软件工具来试图标识引起这些存储器错误的编程隐错。这些工具可在软件应用程序的开发性测试期间使用。例如,存在可用于在软件应用程序的开发性测试期间标识隐错的不同类型的“诊断”工具。某些软件开发应用程序,如可从美国华盛顿州雷蒙德市的微软公司获得的Visual Studio,具有诸如这些的内置工具。在Visual Mudio中,开发者可选择在测试期间启用可包括页堆(Page Heap)功能的应用程序验证器(Application Verifier)功能。页堆可用于通过监视对于正被测试的应用程序的存储器分配和使用来检测某些存储器错误,包括缓存溢出和数据不足。在页堆中,在堆存储器的所分配的部分(正常地,是“用户分配”页)之后放置一定量的保留的额外存储器(称为“不可存取页”),并且启用应用程序验证器功能来检测信息何时被写入该不可存取页。以此方式,诊断工具可以标识错误并将其报告给开发者。然而,此类诊断工具可能无法在软件应用程序的运行时期间使用。开发了其他工具来在存储器错误引起崩溃时收集崩溃信息,该收集的信息在被分析时可用于标识存储器错误。这一解决运行时期间经历的崩溃的尝试在传统上限于检测此类错误何时发生并将崩溃状况报告给中央聚集点,该中央聚集点然后向开发者通知关于错误的可用信息。开发者可试图使用该信息来重建或诊断错误,然后标识并解决该隐错。可从微软公司获得的 Windows操作系统在其Windows错误报告(WER)系统中提供了此类报告功能。在该系统中, 当WER检测到应用程序非干净地退出时——例如,通过崩溃或以其他方式不正确退出—— 则诸如指令栈的内容等关于应用程序状态的信息可由WER捆绑并报告给聚集服务器。该信息还可包括标识错误的类的通用系统错误代码,但是不包括关于引起该错误的确切隐错的 fn息ο概述申请人:认识到且明白,通过使用存储器管理来补偿引起存储器错误的软件应用程序中的编程隐错,应用程序能更可靠地操作,且改善用户体验。申请人认识到,许多存储器错误可能是由应用程序执行的存储器操作中的不一致性引起的,且这些编程隐错的影响可通过预期这些不一致性并以纠正它们的方式执行存储器管理来缓解。例如,通过向应用程序分配多于请求量的资源(如存储器和/或时间),存储器管理模块可补偿应用程序中导致应用程序存取多于请求量的存储器、或在其发信号通知其处理完存储器之后使用存储器的隐错。此外,在某些情况下,存储器管理模块可通过例如在其检测到对应用程序所请求的存储器操作的输入信息不正确的情况下不执行该操作来缓解错误。可用不同类型的缓解动作来缓解许多不同类型的错误,其示例将在下文中更详细讨论。然而,申请人明白,诸如此类的缓解可对计算设备的效率有显著影响,并且可影响在这些设备上执行的应用程序的性能。每次当请求存储器操作时评估并操纵该操作可增加完成请求的时间,并且分配多于请求量的存储器使用了更多存储器且因此会减少系统可用的资源。申请人明白存储器管理模块的具有能够对每一应用程序选择性地启用的缓解的愿望。根据此处描述的原理,可实现一种存储器管理模块,该存储器管理模块对于向该存储器管理模块发出执行存储器操作的请求的一个或多个软件模块中的每一个具有不同的操作模式。在一种操作模式中,作为调用软件模块所请求的存储器操作的补充或替代,存储器管理模块可执行一个或多个缓解动作,使得该存储器操作根据该缓解动作来执行。这些缓解动作可用于降低存储器错误影响调用软件模块的可能性。在另一种操作模式中,该存储器管理模块如所请求地执行存储器操作而不执行缓解动作。一种存储器管理模块可在与该存储器管理模块相关联的数据存储中维护一记录,该记录具有对应于每一调用软件模块的至少一个条目,该条目指示对于该调用软件模块存储器管理模块应以其操作的模式。然而,申请人明白,诸如此类的缓解可对计算设备以及其上实现的应用程序的效率有显著影响。每次当请求存储器操作时评估并操纵该操作可增加完成请求的时间,并且分配多于请求量的存储器使用了更多存储器且因此会减少系统可用的资源。因此,申请人明白存储器管理模块的具有能够对每一软件模块选择性地启用的缓解的愿望。根据此处描述的原理,可实现一种存储器管理模块,该存储器管理模块对于向该存储器管理模块发出执行存储器操作的请求的一个或多个软件模块中的每一个以两种操作模式中的一种来动作。在一种操作模式中,作为调用软件模块所请求的存储器操作的补充或替代,存储器管理模块可执行一个或多个缓解动作,使得该存储器操作根据该缓解动作来执行。这些缓解动作可用于降低存储器错误影响调用软件模块的可能性。在另一种操作模式中,该存储器管理模块如所请求地执行存储器操作而不执行缓解动作。一旦对软件模块启用了缓解动作,然后就可监视该缓解动作以便确定它们是否成功地减少了对软件模块有负面影响的存储器错误的数量。监视可以用任何合适的方式来完成,如通过随时间且随应用程序的多个实例进行监视来收集关于缓解动作是否有效的统计数据。可收集任何合适的统计数据,包括关于错误和所检测到的缓解动作的成功的数量和/或频率的统计数据。这些统计数据可采用任何合适的形式,包括作为标签值,该标签值在一个实例中在缓解动作成功的情况下递增,且在另一实例中在缓解动作不成功时递减。如果监视指示缓解动作成功地减少了对软件模块有负面影响的存储器错误的数量,则可将该缓解动作应用于该软件模块所请求的将来的存储器操作。如果否,则存储器管理模块可以禁止将缓解动作应用于该软件模块所请求的将来的存储器操作。一种存储器管理模块可在与该存储器管理模块相关联的数据存储中维护一记录,该记录具有对应于每一调用软件模块的至少一个条目,该条目指示对于该调用软件模块存储器管理模块应在其中操作的模式。根据此处所描述的部分或全部原理来操作存储器管理模块提供了多种优点,包括降低了诸如用户应用程序等软件模块不正确执行或崩溃的可能性,这可用于改善在使用这些软件模块时的用户体验。应当理解,以上内容旨在是本发明的非限制概述,本发明仅由所附权利要求书来定义。附图简述附图不旨在按比例绘制。在附图中,各个附图中示出的每一完全相同或近乎完全相同的组件由同样的标号来表示。出于简明的目的,不是每一个组件在每张附图中均被标号。在附图中

图1是根据此处描述的原理中的某一些来操作的技术可在其中起作用的示例性计算设备的框图;图2A是根据用于存储器管理的常规技术来操作的系统的各组件之间的交互的示意图;图2B是根据此处描述的部分原理来操作的技术可在其中其作用的一个示例性系统的某些组件之间的某些交互的示意图;图2C是可用于在逐个应用程序的基础上实现存储器缓解的计算机存储介质中的数据结构的示意性图示;图3是根据此处所描述的某些原理来执行存储器管理的示例性技术的流程图;图4A、4B、4C和4D是根据此处描述的一个或多个原理来执行存储器操作的示例性技术的流程图;图5是根据此处所描述的某些原理来执行解除存储器分配的操作的一个示例性技术的流程图;图6是根据此处描述的某些原理来确定是否将缓解技术应用于特定应用程序的示例性技术的流程图;图7A和7B是根据此处描述的某些原理来确定缓解技术成功地缓解了存储器错误对应用程序的影响的示例性技术的流程图;图8是根据此处描述的某些原理来确定是否对特定应用程序移除缓解技术的示例性技术的流程图;图9是根据此处描述的原理中的某一些来操作的技术可在其中起作用的示例性计算设备的框图;图10是根据此处描述的部分原理来操作的技术可在其中其作用的一个示例性系统的某些组件之间的某些交互的示意图;图11示出了根据此处描述的某些原理来操作的技术可在其中起作用的示例性计算机系统;图12是根据此处描述的某些原理来配置计算设备以便使用存储器管理技术的示例性技术的流程图;以及图13是根据此处描述的某些原理在适用于配置计算设备以便使用存储器管理技术的中央聚集服务器处接收错误和缓解数据的示例性技术的流程图。详细描述资源管理模块在具有共享资源的系统中操作,且用作该共享资源的仲裁者来确保其多个消费者在试图访问该资源时不会彼此干涉。存储器管理模块是这一资源管理模块的一个示例。某些计算设备,包括单用途和多用途计算设备,可以并行执行与两个或更多任务相关的应用程序或其他指令集,并且这些并行执行可能会竞争对存储器的存取。如果两个或更多应用程序被正确地编码并且给予存储器管理模块的指令是正确的,则存储器管理可以是相对简单的任务。不幸的是,申请人认识到,情况并非始终如此,且应用程序或指令集可能会因为引起存储器错误的编程隐错而崩溃。例如,华盛顿州雷蒙德市的微软公司的研究发现在Windows操作系统中运行的用户软件应用程序中的编程隐错引起存储器错误,这些存储器错误是每天大量应用程序崩溃的源头——占研究中分析了全部数量的崩溃中的约 15%。申请人:认识到且明白,应用程序中的编程隐错的影响可通过使用改进的存储器管理模块来缓解,该改进的存储器管理模块可采取步骤来降低引起错误的编程隐错对应用程序产生负面影响的概率。例如,通过向应用程序分配多于应用程序请求量的资源,存储器管理模块可以补偿应用程序中导致应用程序使用多于请求量的存储器或者在应用程序发信号通知其已完成对存储器的处理之后使用存储器的隐错。此外,在某些情况下,存储器管理模块可以通过不执行作出对要执行的存储器操作的调用的应用程序所请求的存储器操作来缓解错误。例如,如果存储器管理模块检测到关于操作的输入信息是不正确的,则它可以不执行该操作。可用不同类型的缓解动作来缓解许多不同类型的错误,其示例将在下文中更详细讨论。然而,应当理解,除了以下列出的之外,许多不同类型的缓解动作是可能的,可以采取任何合适的动作来缓解引起存储器错误的编程隐错。申请人:还认识到且明白,在某些情况下,缓解动作会对应用程序或其他指令集的性能有不利影响,例如,向应用程序分配多于请求量的存储器,或者在释放存储器以供另一应用程序使用之前延迟,导致计算设备使用的存储器比其本来将使用的更多。另外,通过在存储器管理模块接收到存储器操作时检查该存储器操作来确定缓解动作是否可用,增加了响应这些存储器操作的时间,导致应用程序的执行时间增加。申请人认识到且明白,由于并非所有调用存储器管理器的软件模块(“调用软件模块”)将具有导致存储器错误的编程隐错,对性能的这一不利影响可通过取决于是否检测到调用软件模块经历了存储器错误而对调用软件模块选择性地应用缓解动作来减轻。因此,此处所描述的是用于对每一具体的调用软件模块以不同操作模式执行存储器操作的技术,其中调用软件模块是应用程序的实例,这些操作模式如其中对应用程序向存储器操作应用缓解动作的第一模式,以及不对应用程序应用缓解动作的第二模式。另外,申请人明白,在缓解模式中始终对调用软件模块执行存储器操作可能并不是高效的。例如,在某些实现中,存储器管理模块可以不被配置成缓解调用软件模块可经历的所有存储器错误,并且特定调用软件模块可具有可能无法通过在计算设备上实现的特定存储器管理模块来缓解的编程隐错。作为另一示例,某些调用软件模块可在某些不频繁执行的指令中具有编程隐错。作为另一示例,调用软件模块可具有非常少的导致存储器错误的隐错。在这些情况的每一种中,尽管对调用软件模块在缓解模式中操作存储器管理模块可能有助于缓解某些错误,但这些可缓解错误可能是不频繁的,并且因在缓解模式中进行操作而引起的效率损失可能会超过缓解错误的获益。因此,申请人认识到且明白进行测试来确定在缓解模式中操作存储器管理模块的有效性并响应于该测试来配置存储器管理模块的愿望。确定有效性可以按任何合适的方式来完成。例如,如果检测到存储器错误不影响软件模块,则即使引起错误的编程隐错存在于该模块中,也确定缓解动作有效地或成功地缓解了存储器错误。该测试可以随时间且随应用程序的多个实例来执行,以收集关于缓解动作是否有效的统计数据,包括关于错误和检测到的缓解动作的成功的数量和/或频率的统计数据。这些统计数据可采用任何合适的形式,包括作为标签值,该标签值在一个实例中在即使存在隐错但缓解动作仍成功地避免了对调用应用程序的影响的情况下递增,且在另一实例中在缓解动作不成功时递减。可使用任何合适的准则来确定缓解是成功还是不成功。在某些实施例中,如果没有检测到可被缓解类型的隐错,则缓解可被认为是不成功的。然而,在其他实施例中,可以应用其他不同或附加的准则。作为基于缓解的先前成功来选择应用缓解所引起的行为的一个示例,存储器管理模块可被配置成当对作为应用程序的实例的特定软件模块执行存储器操作时以缓解模式来操作。可在崩溃或归因于存储器功能的其他错误之后进入该模式。如果在某一段时间之后确定缓解未有效地阻止存储器错误影响该模块,则存储器管理模块可被配置成对该特定应用程序的后续实例以正常模式操作而没有缓解。该时间段可以通过计时来测量,和 /或以某种其他方式,如基于在没有成功缓解的情况下从应用程序干净退出的次数来测量。 以下描述了可用于作出这一判定的示例性测试,其结果可用于控制对特定的调用软件模块存储器管理模块应以其操作的模式。申请人:还明白,诸如与广泛发行的软件应用程序相关联的某些软件模块可在多个计算设备上执行,且这些计算设备中的每一个可具有这些软件模块以及缓解动作是否有效的经验。例如,其他计算设备可具有确定缓解动作是成功还是不成功的经验。申请人认识到且明白,计算设备的性能因此可通过充分利用其他计算设备的经验来作出关于是否对应用程序应用缓解动作以及应用缓解动作多长时间来进一步提高。
为了利用聚集的信息,计算设备可适用于向从多个设备收集信息的一个或多个其他计算设备发送关于错误类型和缓解动作的成功的详细信息,所有这些设备可执行作为应用程序的实例的软件模块。这一个或多个设备可聚集关于对特定应用程序缓解的成功的信息。基于该聚集的信息,设备还可从一个或多个计算设备接收关于是否要对特定软件模块应用缓解动作的配置信息。该信息可以采用任何合适的形式,如关于可对照其来测量缓解动作的成功的统计数据。例如,配置信息可包括在确定是否对应用程序禁用缓解之前应考虑应用程序的更多或更少数量实例的指示。在某些这样的实现中,这些指令可包括初始缓解标签值,该标签值可根据此处所描述的测试技术使用来确定是否要对应用程序禁用缓解。因此,以下描述的是用于向其他计算设备发送并从其他计算设备接收信息的技术,该信息可用于配置计算设备上的存储器管理模块来应用缓解动作。应当理解,在具体实施例中,各技术可以根据此处描述的某些原理来实现而无需每一实施例都使用所有原理。可实现这些原理中的一个或多个的任何合适的组合,本发明的各实施例不限于用任何具体原理或这些原理的集合来实现。例如,可以实现选择性地应用缓解动作但不测试缓解动作的有效性或接受来自其他计算设备的配置数据的存储器管理模块,或者实现选择性地应用缓解动作并测试有效性但不接受来自其他计算设备的配置数据的存储器管理模块。以下描述的技术可以用各种方式中的任一种来实现,并在各种类型的指令集的任一种上操作。为简明起见,以下的示例将存储器管理模块和错误报告服务描述为计算设备的操作系统的一部分,且将软件模块描述为由操作系统管理的应用程序。这一示例可以在此处描述的某些原理的一种商业实现中看到,其中操作系统是Microsoft Windows,以下描述的缓解模块是容错堆(FTH)客户端,以下描述的缓解启用模块是FTH服务器,且错误报告客户端和服务器是Windows错误报告(WE 服务的组件。然而,应当理解,这仅是可实现此处所描述的原理的不同方式的一个示例,且其他方式是可能的。例如,存储器管理模块可被实现为与计算设备的操作系统交互的独立组件、由操作系统管理的应用程序的组件、或在不具有操作系统的计算设备上执行的模块。此外,向存储器管理模块发出请求的软件模块 (“调用软件模块”)可以是可由处理器执行的指令的任何合适的安排。在某些实现中,软件模块可以是用户应用程序的实例、操作系统的组件、服务或端口映射程序、或任何其他合适的软件模块。每一软件模块可以是以下描述的一个或多个“功能模块”。另外,存储器管理模块可以被实现为执行一个或多个存储器操作的任何合适的组合,以及一个或多个缓解动作的任何合适的组合。存储器操作可以是影响存储器资源的使用的任何合适的操作,如分配、解除分配(释放)、重新分配、分页、以及许多其他操作。缓解动作可以是可由存储器管理模块采取来降低调用软件模块中的编程隐错将导致存储器错误且如通过引起不正确执行或崩溃而负面地影响调用软件模块的可能性。存储器错误可以是导致会如通过引起不正确执行或崩溃而负面地影响软件模块的存储器破坏的任何错误。在许多情况下,存储器破坏可由导致存储器操作之间的不一致性的编程隐错引起。存储器错误包括在所分配的存储器的边界外部写入(缓存溢出或数据不足)、当两个模块在重叠的时间段内各自使用相同的存储器空间时另一软件模块对所存储的信息的盖写、或使用与分配给模块的不同的存储器部分。应当理解,这些存储器错误仅是软件模块可经历且可通过此处描述的某些原理来缓解的类型的示例。
缓解存储器错误可以通过执行任何合适的一个或多个缓解动作以任何合适的方式来完成。在某些情况下,缓解动作可包括在预期不一致存储器操作时采取的且试图抵消该不一致性的动作。示例性缓解动作在下文中更详细地描述,但是可包括在执行操作之前改变操作、不执行操作、在稍后的时间执行操作、在执行操作之前确认对操作的正确输入、 或以对存储器空间的最小改变来执行操作中的任一动作。此外,以下用对通常称为“堆”存储器的一种类型的存储器来操作的存储器管理模块描述了示例性实现。然而,应当理解,任何一种或多种合适类型的存储器可由根据此处描述的某些原理来操作的技术来管理,包括栈存储器和/或全局变量存储器。在此处描述的原理的一个示例性实现中,调用软件模块(可以是例如软件应用程序的实例)可向存储器管理模块发出执行存储器操作的请求。存储器管理模块可以与缓解启用模块进行交互。缓解启用模块可以咨询启用模块所存储的规则和设置数据的一个或多个条目来确定当对特定的调用软件模块执行操作时存储器管理模块应以其操作的模式。咨询规则和设置数据在这一和某些其他实现中可包括检查来确定一个或多个统计数据是在阈值水平之上还是之下。如果规则和设置指示存储器管理单元不应以缓解模式操作——例如,如果缓解标签值低于阈值水平——则如所请求地执行存储器操作。然而,如果规则和设置指示存储器管理单元应以缓解模式操作,则可启用存储器管理单元的缓解模块。缓解模块然后可结合存储器管理模块来根据一个或多个缓解操作执行存储器操作,这些缓解动作可用于降低存储器错误负面地影响调用软件模块的可能性。应当理解,存储器管理模块的操作模式较佳地独立于每一软件模块,且存储器管理单元可以对一个调用软件模块以第一模式执行存储器操作,且对另一调用软件模块以第二模式执行另一存储器操作。在该示例性实现中,缓解和缓解启用模块也可适用于评估一个或多个缓解动作一旦被启用是否成功地缓解了错误。这可以用任何合适的方式来完成,其示例在下文中讨论。 例如,当执行缓解动作时,可取得最初的观察结果并将其与稍后记录的观察结果进行比较, 来确定调用软件模块是否采取了指示可通过缓解动作阻止其引起错误的编程隐错的任何动作。例如,如以下所讨论的,在分配操作期间,可分配大于请求量的存储器,并且可将标记值写入额外存储器中。当调用软件模块稍后请求解除该存储器的分配时,缓解模块可检查该额外存储器来查看标记值是否仍在该存储器中。如果部分或全部标记值已被盖写,则缓解模块可确定缓解动作(分配额外存储器)有效地阻止了缓存溢出引起的存储器错误。评估缓解动作和其他示例性测试的有效性的进一步细节在下文中讨论。在使用缓解标签值的某些实现中,当确定缓解动作对特定调用软件模块有效时,则可递增该缓解标签值,且如果确定缓解动作不是有效的或没有任何效果时,则可递减该缓解标签值。在该实现中,缓解和缓解启用模块可进一步适用于向远程计算设备发送和从远程计算设备接收关于缓解动作阻止存储器错误负面地影响软件模块的有效性以及关于是否启用缓解动作的信息。例如,当存储器管理模块检测到调用软件模块崩溃时,它可从记录中确定是否检测到任何存储器错误以及这些存储器错误中的任一个是否被缓解。它然后可将该信息发送到一个或多个其他计算设备,且作为回报可从一个或多个其他计算设备接收信息。在该示例性实现但非所有实现中,一个或多个其他计算设备可包括聚集服务器,且该聚集服务器可用作诸如Windows错误报告服务等错误报告服务的一部分。聚集服务器可接受来自一个或多个计算设备的错误和缓解信息,并且可以将该信息发送给包括被检测为崩溃的软件模块的开发者的厂商。聚集服务器还可确定缓解动作是否在每一计算设备处成功地缓解了存储器错误,并且可通知计算设备是否对特定软件模块启用缓解模式。在某些实现中,通知计算设备是否启用缓解模式可包括发送关于缓解标签值的推荐初始化值,如在缓解在历史上成功或以高比率成功时的较高值,以及在缓解在历史上不成功或成功但仅有低比率时的较低值,但是应理解,其他实现可对任何合适的配置信息操作,因为本发明的各实施例在这一方面不受限制。应当理解,尽管该示例性实施例被描述为根据此处描述的许多原理来操作,但其他实现可根据这些原理中的较多或较少数量的原理来操作,且并非所有实现都要根据此处描述的所有原理来操作。如上简要讨论的,申请人明白,许多不同类型的编程隐错会引起可诸如通过使得软件模块不正确地执行或崩溃而负面地影响软件模块的存储器错误。对于上下文,这些编程隐错中一些最常见的隐错在下文中描述,但应理解,该错误列表不是可通过实现此处描述的某些原理来缓解的全部编程隐错的全面描述,且存在可使用根据这些原理中的某一些或全部操作的技术来缓解的其他隐错。作为第一示例,调用软件模块可请求存储器管理模块向该软件模块分配某一量的存储器——例如,16字节——然后试图使用多于请求量的存储器——例如,17字节或更多。 常规的存储器管理模块不能检测到该软件模块正在使用额外存储器,且可将该存储器分配给另一软件模块。如果该另一软件模块然后开始使用该存储器,则作为在它/它们试图使用存储器时的存储器错误的结果,一个或两个软件模块可能不正确地执行或甚至崩溃。作为可引起存储器错误的编程隐错的第二个示例,软件模块可请求存储器管理模块向该软件模块分配某些存储器,然后通知存储器管理模块它已经完成了对该存储器的处理,但是接着继续使用该存储器。根据存储器管理模块的记录,该存储器被释放以分配给另一软件模块,并且两个软件模块可试图同时使用该存储器,导致一个或两个软件模块不正确地执行。作为第三个示例,软件模块可通过通知存储器管理模块它已经完成了对存储器的处理来“释放”已经被分配给它的存储器,然后可通过编程隐错再次释放该存储器。存储器管理模块可与此同时将该存储器分配给另一软件模块,并且作为第二个不正确的释放操作的结果,可将其分配给第三个软件模块。作为第一个软件模块中的编程隐错的结果,第二和第三软件模块中的一个或两个然后可不正确地执行。作为第四个示例,某些软件模块在退出时可能试图释放分配给它们的所有存储器,但是可能会过早地或以其他方式不正确地这样做,且会导致软件模块的崩溃。作为第五个示例,不同的信息可被存储在不同类型的存储器中,如通用地址空间、 栈存储器、以及动态或堆存储器。某些指令集可通过编程隐错而使用错误的命令来与不同类型的存储器交互,如使用堆存储器操作来执行打算在通用地址空间存储器上完成的操作。当存储器管理模块使用通用地址空间存储器的标识符在堆存储器上执行操作时,则它正在错误的存储器上操作,且使用堆存储器来作出该调用或指令集的软件模块结果会崩溃。作为第六个示例,在减少或扩大对指令集的存储器分配的重新分配操作中,存储器分配可被移至存储器的另一部分,但是通过编程隐错,该指令集会继续引用原始位置中的存储器。该指令集以及任何其他使用该原始存储器的指令集因此会因隐错而崩溃。通过根据此处描述的原理来操作,存储器管理模块可阻止这些和其他编程隐错引起通过导致不正确执行或甚至崩溃来负面地影响软件模块的存储器错误。对软件模块的负面影响可对用户体验有负面影响,且缓解这些编程隐错的影响可显著地改善用户体验。另外,通过操作来选择性地启用缓解动作并测试其有效性,这些缓解动作的任何负面影响本身可被缓解。根据此处所描述的原理来操作的这些和其他技术的其他功能和优点将从以下描述的示例中得到更完全的理解。以下示例旨在方便理解本发明并示出此处所描述的原理的好处,但不例示本发明的各实施例的全部范围。本文描述的技术可在各种计算系统中实现,这些计算系统的示例在下文较为详细地描述。此类系统一般涉及使用适当配置的计算设备,这些计算设备实现各自提供完成此类技术的执行所需的一个或多个操作的多个功能模块。每一个功能模块可以按照其自己的方式来实现;不必全都用相同方式实现。如此处所使用的,功能模块是执行执行操作职责的系统的结构组件。操作职责可以是整个软件元素的一部分。例如,功能模块可执行进程、离散进程、或任何其他合适的处理单元的功能。功能模块可包括计算机可执行指令,并且可在计算机存储介质上编码。此外,这样的计算机可执行指令可使用多种合适的程序设计语言和/或程序设计或脚本工具中的任何一种来编写,而且它们还可被编译为可执行机器语言代码或在框架或虚拟机上执行的中间代码。功能模块可在适当时并行或串行执行,并且可使用在其上执行这些模块的计算机上的共享存储器、使用消息传递协议、或以任何其他合适的方式,来在彼此之间传递信息。下文描述了执行一项或多项任务的示例性功能模块,但应该理解领会,所描述的功能模块和任务划分仅仅示出可实现本文描述的示例性技术的功能模块的类型,并且本发明并不限于在任何特定数量、划分、或类型的功能模块中实现。在一些实现中,所有功能可在单个功能模块中实现。此外,为清楚起见,功能模块在下文中是作为全部在一个或两个计算设备上执行来讨论的,但应该理解,在一些实现中,功能模块可在适用于彼此通信的许多单独的计算设备或单个计算设备的单独的处理器上实现。例如, 一个处理器可适用于执行向存储器管理模块发出执行存储器操作的请求的调用软件模块, 而另一处理器可适用于执行存储器管理模块。在以下描述的一些实施例中,根据此处描述的原理来操作的技术可被实现为在一个或多个计算机可读存储介质上编码的计算机可执行指令,这些计算机可读存储介质诸如有磁介质(例如,硬盘驱动器)、诸如紧致盘(⑶)或数字多功能盘(DVD)等光介质、持久或非持久固态存储器(例如,闪存、磁RAM等)、或任何其他合适的存储介质。计算机存储介质可被实现为图1和9的计算机可读存储介质104(即,作为计算设备100的一部分)或被实现为单独的计算机存储介质。应当理解,如此处所使用的,包括“计算机可读存储介质”的 “计算机可读介质”指的是具有可在其上记录数据的过程期间用某种方式更改的至少一个物理结构的有形存储介质。例如,计算机可读介质的物理结构的一部分的磁化状态可在记录过程中更改。在一些此类实施例中,实现依照本文描述的原理来操作的技术的计算机可执行指令可被实现为一个或多个独立功能模块(例如,存储器管理模块)。在此处描述的技术被具体化为计算机可执行指令的情况下,它们可在任何合适的计算机系统中操作的任何合适的计算设备上执行,包括以下图1和9描述的示例性计算设备。例如,根据本文讨论的一些或所有原理来操作的技术可以在以下系统上操作单个多用途可编程数字计算机装置、共享处理能力并联合执行本文描述的技术的两个或更多多用途计算机装置的协调系统、专用于执行本文描述的技术的单个计算机装置或计算机装置(同处一处或在地理上分布)的协调系统、用于执行本文描述的技术的一个或多个专用集成电路(ASIC)、用于执行本文描述的技术的一个或多个现场可编程门阵列(FPGA)、或任何其他合适的系统。图1示出了计算设备100形式的可用于实现本文描述的技术的系统中的计算设备的一个示例性实现,然而其他实现也是可能的。此外,应理解,图1既不旨在是对用于依照本发明描述的原理操作的计算设备的必要组件的描绘,也不旨在是全面描绘。还应当理解, 其他实现可在任何其他合适的计算设备中操作。计算设备100可包括处理器102、计算机可读存储介质104和存储器116。计算设备100可以是任何合适的计算设备,包括例如台式或膝上型个人计算机、工作站、服务器、 大型机、智能电话、个人数字助理(PDA)、独立联网设备、或能够在单个时间执行一个或多个软件模块且具有可在一个或多个软件模块之间共享的诸如存储器等一个或多个资源的任何其他合适的计算设备。计算机可读存储介质104可以是适用于存储要由处理器102处理的数据和/或要由处理器902执行的指令的任何合适的有形存储介质。处理器102能够处理数据和执行指令。这些数据和指令可被存储在计算机可读存储介质104上,并且例如可以启用计算设备100的各组件之间的通信。存储在计算机可读存储介质104上的数据和指令可包括实现根据本文描述的原理操作的技术的计算机可执行指令。在图1的示例中,如上所述,计算机可读存储介质104 存储实现各种模块并存储各种信息的计算机可执行指令。计算机可读存储介质104存储与可在计算设备上执行的一个或多个软件模块106以及可支配计算设备100上的进程的执行并调节诸如存储器116等共享资源的使用的操作系统108相关的数据和指令。为了调节对存储器的使用,操作系统108可具有用于执行调用软件模块所请求的存储器操作的存储器管理模块110。调用软件模块可以是软件应用程序106、操作系统108 的其他组件、或在计算设备100上执行的任何其他软件元件。存储器管理模块110可以用任何合适的方式来实现以执行常规存储器管理技术以及此处描述的一种或多种技术。如上所述,在此处描述的技术的某些实现中,存储器管理模块110可包括缓解模块112,缓解模块112可用于在调用软件模块请求存储器操作时执行一个或多个缓解动作。缓解模块112 可以对每一调用软件模块选择性地应用,使得缓解动作仅对被检测为需要缓解动作的软件模块执行。因此,为了在这些实现中执行检测和启用,操作系统108还可包括用于监视计算设备100中的软件模块的执行的缓解启用模块114。然而,在替换实现中,缓解模块可诸如由计算设备900的管理员来手动启用或禁用,并且在此类实现中可以不提供缓解启用模块。图1所示的模块,包括缓解模块112和缓解启用模块114,可适用于根据此处描述的原理以任何合适的方式操作,包括通过以下描述的示例性技术中的任一种来操作。应当理解,图1所示的实现仅是可实现此处描述的原理的不同方式的示例。在替换实现中,缓解模块和缓解启用模块可被实现为与操作系统分开的组件,或者可被实现为操作系统内的单个组件,或以任何其他合适的方式来实现,因为本发明的各实施例不限于被实现为任何特定模块或模块集。
常规存储器管理模块和根据图1所示的实现来操作的存储器管理模块之间的区别在图2A和2B中示出。在图2A中,示出多个调用软件模块200向操作系统API和存储器管理模块206发出操作请求202和204,包括执行存储器操作的请求。这些操作如所请求地被执行,并且任何合适的信息被返回给调用软件模块。没有缓解动作可用,且不执行对调用软件应用程序的监视,使得这些软件模块容易受到因包括上述隐错在内的编程隐错引起的存储器错误的影响。在图2B中,示出了图1的示例性实现,且缓解模块112被实现为操作系统的组件。 在该实现中,调用软件模块200向操作系统和存储器管理模块206发出相同的操作请求202 和204,因为在所示实施例中,这些软件模块不知道缓解模块112以及是否对特定的调用软件模块实现了缓解模块。如上所讨论且如图2B中所示,缓解模块112可对每一调用软件模块选择性地应用来执行一个或多个缓解动作,且因此,调用软件模块200所发出的操作请求中的某一些(不一定是全部)被缓解模块112截取。为了确定是否应对特定调用软件模块启用缓解模块112,缓解启用模块114与存储器管理单元110和缓解模块112、以及调用软件模块200进行通信。在检测到调用软件应用程序已经发送了执行存储器操作的请求之后,缓解启用模块114可以审阅存储在与缓解启用模块114相关联的缓解数据存储212中的信息,来确定在执行所请求的存储器操作时缓解模块是否应以缓解模式操作。这也可被认为是与存储器管理模块110相关联的数据存储,因为它维护与存储器管理模块110的操作相关的信息,且在上述的某些实现中,在缓解启用模块114被实现为存储器管理模块110的一部分时可以是存储器管理模块110的一部分。审阅存储在数据存储212中的信息可包括任何合适的动作,包括审阅事件日志216以及规则与设置218。数据存储212可按持久方式来存储,从而如果缓解启用模块114被禁用或关闭,当它稍后被重新启用时,它将能够访问先前收集的信息,包括关于先前作出的决策的信息。数据存储212可存储事件日志216,该事件日志包括关于调用软件模块200经历的存储器错误、被检测为被缓解的存储器错误、以及被请求执行的存储器操作的信息。事件日志216中的每一条目可包括任何合适的信息,包括装桶(bucketing)参数,如软件模块的名称、软件模块的版本、在错误的时候软件模块的什么库或部分正被执行、在执行中的哪一点检测到错误、以及描述错误的异常代码,以及任何其他合适的信息。规则与设置18可存储关于一个或多个调用软件模块200的任何合适的信息,以及关于通用缓解策略的信息。图 2C示出了可被存储在规则与设置218中的信息的一个示例。规则与设置218可包括对应于多个调用软件模块200中的每一个(包括对应于调用软件模块的每一标识符,其可以是应用程序标识符)的条目,可在确定是否应对调用软件模块启用缓解模式时使用的一个或多个值,以及如果是则要启用缓解的时间。可在确定是否应启用缓解模式时使用的一个或多个值可以是任何合适的值,包括可被收集的、关于跨调用软件模块所关联的应用程序的一个或多个实例软件模块所经历的错误和/或所检测的缓解动作的成功的一个或多个统计数据。这些统计数据可采取任何合适的形式。在某些实现中,统计数据可采取缓解标签值的形式,该标签值在检测到成功的情况下可递增,且在检测到错误的情况下递减。缓解标签值然后可以与诸如阈值等其他统计值进行比较,来确定是否应对应用程序的后续实例启用缓解模式。然而,应当理解,统计数据仅是可被存储在规则与设置218中的值的类型的一个示例,且缓解标签值仅是可被存储的统计数据的类型的一个示例。缓解启用模块114可以用任何合适的方式,包括通过以下讨论的示例性技术中的任一种,审阅该信息来确定是否对特定软件模块启用缓解模式。为了提供用于确定是否对特定软件模块启用缓解模式的示例性技术的讨论的上下文,首先描述当缓解模块112处于缓解模式时的缓解模块112的操作的示例性技术。包括以上概括描述以及以下更具体描述的示例在内的缓解动作可以用任何合适的方式来执行, 并且实现这些缓解动作的缓解模式可以用任何合适的方式来执行。图3示出了其中缓解模块112可以以由本发明的各实施例实现的缓解模式操作的方式的一个示例,该缓解模块选择性地以缓解模式操作存储器管理模块,但是其他方式也是可能的,根据此处描述的原理, 存储器管理模块可以用任何合适的方式来实现,包括不以两种不同模式操作。图3的说明性过程300在框302开始,在那里调用软件模块发出要存储器管理模块110执行存储器操作的请求。在框304,对发出请求的特定调用软件模块确定存储器管理模块110是否应以缓解模式操作来执行一个或多个缓解动作(在以下的某些情况下,为简明起见,这可被描述为软件模块是否以缓解模式操作,但应理解,这样做纯粹是为了方便描述,并且较佳地,软件模块不知道缓解模块以及缓解模块操作的模式)。如果确定存储器管理模块110应以缓解模式操作,则启用缓解模块112,并且在框306,接收执行存储器操作的请求。在框306中接收到该请求之后,缓解模块112和存储器管理模块110可根据缓解动作来执行存储器操作。在某些实现中,这可包括执行单个动作或可包括执行许多动作。在图3的图示中,为清楚起见,根据缓解动作执行存储器操作被示为四个单独的操作,但是应理解,这仅是为了方便可视化,且根据图3操作的技术可以不完全如图所示那样来实现。在框308,缓解模块112至少基于所请求的存储器操作的类型以及该操作的输入参数来确定其是否适用于执行任何缓解动作。可以这样做是因为在某些实现中,缓解模块 112可能仅被配置成缓解因一组一个或多个存储器操作而导致的一种或多种类型的存储器错误,且因此可能没有其可以对特定存储器操作执行的缓解动作。在某些替换实现中,可以实现适用于对所有类型的存储器操作执行缓解动作的存储器管理模块112,因此可以不实现具有判定框308的过程。如果在框308确定有至少一个缓解动作可用,则在框310执行该缓解动作,这可包括将该缓解动作应用于该操作。将缓解动作应用于存储器操作可包括任何合适的过程,包括以下详细讨论的过程中的任一个。例如,应用缓解动作可包括评估存储器操作,如确定该操作的输入参数是否正确;调整存储器操作的参数,如增加所请求的存储器的量;等待执行存储器操作直到稍后的时间;或不执行存储器操作。在框312,在应用了缓解动作之后, 确定是否仍要执行该存储器操作。如果是,则在框314,执行缓解动作,且过程300结束。然而,如果在框312确定不要执行该存储器操作——例如,如果缓解动作不执行存储器操作, 或者如果确定输入参数不正确——则过程300也结束。返回到框304,如果确定存储器管理模块110不应以缓解模式操作,或者如果在框 308确定没有缓解动作可用,则在框316,如所请求地执行存储器操作,且过程300结束。框 316处的执行可以如在常规存储器管理器中的那样,但可使用任何合适的执行方法。图4A、4B、4C和4D示出了可由缓解模块112采取来执行诸如图3的框310所示的至少一个缓解动作的四个不同过程。应当理解,这些过程仅说明了可被实现来执行这些缓解动作的过程的类型,并且这些缓解动作仅是可由缓解模块112执行的缓解动作的类型的示例。这一缓解动作的第一示例在图4A的过程400A中示出。过程400A在框402开始, 在那里确定调用软件模块所请求的存储器操作是否是分配操作;即,请求将一定量的存储器分配给调用软件模块,使得该软件模块可在一段时间内存储一定量的数据。如果否,则过程400A结束。然而,如果所请求的存储器操作是对一定量的存储器的分配操作,则在框 404,采取缓解动作来增加所分配的存储器的量。在某些实施例中,该较大的存储器量可以取决于所请求的存储器的大小;例如,是所请求的存储器的两倍。在另一实现中,额外存储器可以是用于给定计算设备的固定量的存储器;例如,对于32位处理器,额外的所分配的存储器可以是32字节(即,如果请求了四个字节,则总的分配将是36字节),且对于64位处理器,该额外的所分配的存储器可以是48字节。在框404可以分配任何合适量的额外存储器。在框406,然后通过在其中存储标记值来将该额外存储器“标记”为额外存储器。 该标记值可以是任何合适的值,并且可以是对每一存储器单元(如对每一存储器块)存储的重复值,或者是跨额外的所分配的存储器的整个空间写入的单个值或值模式。该标记值可以是可以如下所讨论的用作评估的一部分来确定缓解动作是否成功地缓解了存储器错误的任何合适的值。例如,如果稍后审阅该额外存储器且确定标记值已被盖写,则可以确定软件模块遭受引起缓存溢出错误的编程隐错——意味着写入了大于请求量的数据——并且额外分配通过分配额外的空间缓解了存储器错误。在写入了标记值之后,则过程400A结束ο图4B示出了用于根据此处描述的某些原理来执行缓解动作的第二示例性过程 400B。过程400B在框410开始,在那里确定所请求的存储器操作是否是重新分配操作,其中调用软件模块正在寻求增加或减少先前分配的存储器的量。如果不是重新分配操作,则过程400B结束。然而,如果存储器操作是重新分配操作,则在框412,确定该请求是否是针对减少存储器分配的。如果是,则在框414,在解除来自原始分配的剩余存储器的分配时将分配保持在相同的根位置中。在框416,存储器管理模块110不立即释放剩余的存储器,而是等待直到一等待时间段之后。在框414,可将如上所述的标记添加到要释放的存储器。当存储器实际被释放时,可检查这些标记来查明是否存取了旨在不被使用的存储器。过程400B随后结束。如果在框412确定所请求的重新分配是针对更大量的存储器的,则在框418,确定是否有足够的、与原始分配直接相邻的空闲存储器,使得可以从该直接相邻存储器分配所请求的新存储器并且可为该数据保持原始位置。如果是,则在框420,完成将来自原始分配的数据保持在相同的位置中,从该位置扩大分配,并且该过程结束。然而,如果没有足够的直接相邻的存储器,则在框422将分配移至存储器的另一部分中的较大空间,并且在框4M不解除原始存储器的分配,直到一等待时间段之后。如上所述,先前分配且不应再被使用的存储器可用标记来填充,以便可检测引起对该存储器的存取的隐错。该过程随后结束。
该缓解可用于缓解遭受导致软件模块在其中存储器分配被移至存储器的不同部分的重新分配操作之后继续使用原始存储器空间的编程隐错的软件模块中的存储器错误。 通过试图将存储器分配保持在相同位置且不允许其他软件模块使用存储器块直到一等待时间段之后,这些编程隐错的影响可被缓解,因为软件模块直到等待时间段到期之后才能使用原始分配。图4C示出了另一示例性过程400C。过程400C在框430开始,在那里确定所请求的操作是否是解除分配,即“释放”操作。如果否,则过程400C结束。然而,如果所请求的存储器操作是释放操作,则在框432,确定释放操作的输入参数是否正确。例如,如果存储器管理模块112是管理堆存储器的分配的模块,则在框432可以确定请求释放的存储器的地址是否是正确分配的堆存储器而非栈存储器或全局变量空间的地址。这可以按任何合适的方式完成。例如,缓解模块112可以通过将“释放”操作的输入地址与堆的地址范围进行比较来确定该地址所引用的存储器是否是堆存储器;如果否,则该输入地址可能是不正确的。作为另一示例,存储器管理器在分配了堆中的存储器块之后可用标记来为该块加上标签。如果缓解模块112被实现为执行图4A的过程400A,则任何正确分配的堆存储器将会在额外存储器中存储了标记值。通过检查这些标记值的存在,缓解模块112可确定存储器已被存储器管理模块110正确地分配,且因此输入参数是正确的。如果在框432以任何方式确定参数是正确的,则在框434,可在等待时间段之后执行所请求的释放操作,且过程400C结束。 如上所述,在缓解模式中,“释放的”存储器可能无法直接可供使用。相反,可以用标记值来填充该存储器以便允许检测对该存储器的非预期存取。然而,如果参数是不正确的,则在框 436,可忽略该操作,或者可生成错误消息并将其发回到调用软件模块,且该过程结束。在忽略操作时,可存储缓解成功地阻止了隐错创建错误的指示。这一所存储的指示可如下所述地用于确定是否继续向调用软件模块应用缓解400C。图4D示出了可由缓解模块112实现来执行一个或多个缓解动作的过程的另一个示例。在图4D的过程400D中,首先在框440确定所请求的存储器操作是否是解除分配,即 “释放”操作。如果否,则过程400D结束。然而,如果所请求的存储器操作是释放操作,则在框442,确定该释放操作是否是“双重释放”——即,确定该释放操作是否因调用软件模块中的编程隐错而是先前的释放操作的重复。这可用任何合适的方式来完成,包括通过确定请求释放的存储器是否仍未被执行,因为其仍在自前一请求起的等待时间段内。该等待时间段内的存储器可被标识为包含如上所述的标记值,或者通过存储“释放的”存储器块的记录或以任何其他合适的方式来标识。如果是重复,则在框444,忽略该操作。如果不是重复,则在框446,确定释放操作是否与调用软件模块的退出相关联,因为调用软件试图在退出期间清除其所分配的存储器。这可以按任何合适的方式完成。如果是,则在框444,忽略且不执行所请求的操作。这可以出于两个原因来完成。首先,研究显示诸如用户应用程序等许多调用软件模块在关闭期间不正确地释放存储器,导致在关闭期间经历的30%的存储器错误。第二,许多操作系统108和存储器管理模块110已经有了在调用软件模块退出时的自动释放操作,因此调用软件模块所做出的释放操作请求可被认为是重复。如果在框444作为框442或446的任一个中的判定的结果忽略该操作,则过程400D结束。
然而,如果所请求的存储器操作在框446被确定为不是退出操作时的释放,则在框448,在等待时间段之后执行该释放操作。可以这样做来防止可在调用软件模块因编程隐错而释放存储器然后在释放之后仍使用该存储器时所引发的存储器错误。通过直到等待时间段之后才执行释放操作,能缓解可因存储器在释放之后被立即重新分配给另一软件模块而导致的存储器错误的影响,在这种存储器错误的情况下,原始软件模块和新软件模块然后两者都会使用该存储器且各自盖写对方所保存的数据。一旦在等待时间段之后执行了存储器操作,则过程400D结束。在等待时间段之后执行释放操作可以用任何合适的方式来完成。例如,该等待时间段可以是一设定的时间段,如几秒。该等待时间段也可以是灵活的时间段,如基于所请求的分配和释放操作的次数,如当存在对存储器的较低需求时该时间段较长,而当存在对存储器的较高需求时该时间段较短。另一可能的实现是等待直到应用程序终止之后,使得在进程终止时,解除该进程内使用的存储器的分配的操作系统的部分实际释放该存储器。以此方式,应用程序终止,且该应用程序在其中执行的进程也终止,存储器最终可被释放。在其他实现中,该等待时间段可以完全不是设定的时间段,而是因将释放操作置于队列中以便在其到达该队列的顶部时执行而得到的非预定时间段。这一实现的一个示例在图5中示出,但应当理解,其他实现是可能的。图5的过程500在框502开始,在那里确定释放的存储器高速缓存的大小。这可以用任何合适的方式来确定,如通过选择总存储器空间的百分比,或通过接受来自计算设备的用户或管理员的输入。例如,所释放的存储器高速缓存可以是8兆字节(8MB)。在框 506,缓解模块112接收用于执行释放操作的请求。在框508,将请求释放的存储器添加到高速缓存,这意味着将释放操作中的存储器量添加到高速缓存总量。当将存储器添加到高速缓存时,也向进程队列添加要执行的操作的指示,指示请求了该操作。应当理解,当该存储器在“高速缓存”中时,该存储器被维护为被分配给调用软件模块,因为在该实现中,该高速缓存被维护为请求释放但尚未释放的存储器量的指示符。在框510,在将存储器添加到高速缓存之后,确定尚未释放的存储器量是否达到或超过了高速缓存的大小。如果否,则过程500返回到框506,在那里它接收释放存储器的另一指令。如果达到或超过了高速缓存限制,则在框512,至少将队列顶部的操作弹出并执行,从而释放与最早延迟的释放操作相关联的存储器并将分配给高速缓存的存储器的大小减小到该限制以下。应当理解,在某些情况下,为了再一次将高速缓存的大小返回到限制以下,可要求执行来自队列的两个或更多操作,但是该原理与图5所示的相同。一旦执行了队列中的第一个操作并将其从队列中移除,则过程500的流程返回到框506,在那里接收执行释放操作的另一指令。以上描述了具有缓解模式的存储器管理模块110的若干示例性实现,在缓解模式中,缓解模块112使用一个或多个缓解动作来降低存储器错误负面地影响软件模块的可能性。如下所述,这些缓解可基于缓解是否可能减少每一应用程序中的错误而在逐个应用程序的基础上选择性地应用。可描述用于选择性地启用缓解模式且评估缓解动作的有效性的缓解启用模块114的示例性实现。然而,应当理解,缓解启用模块114可以用任何合适的方式来实现,包括作为缓解模块112的组件,因为本发明的各实施例在这一方面不受限制。图6示出了根据此处描述的原理的一个这样的示例性实现。图6的过程600在框602开始,在那里缓解启用模块114检测调用软件模块经历了错误。该检测可以用任何合适的方式来执行,如通过检测软件模块崩溃或以其他方式不正确地执行。在框604,读取与错误相关联的错误代码,并且在框606,确定其是否是存储器错误。如果不是存储器错误,则过程600结束。然而,如果是存储器错误,则过程600继续到框608,在那里如通过对数据存储212 中的规则与设置记录218创建或编辑条目并将关于错误事件的信息写入事件日志216来对该特定调用软件模块启用缓解模式。在某些实现中,缓解模式可以在首次检测到存储器错误时启用,而在替换实现中,在应用缓解模式之前必须达到阈值数量的存储器错误或在某一时间帧内达到阈值数量的存储器错误,如一小时内四次。根据此处描述的原理可以实现用于启动缓解模式的任何合适的测试。在框610,在软件模块请求且存储器管理模块的缓解模块114执行操作时,缓解启用模块114随时间跟踪缓解动作的成功。跟踪成功可用任何合适的方式来完成,包括通过上述技术中的任一种。在某些实现中,这可包括编译关于所检测到的软件模块经历的错误和/或所检测到的缓解动作在阻止存储器错误负面地影响软件模块方面的成功的统计数据。这些统计数据可对与应用程序相关的软件模块的一具体实例来编译,或者可随时间跨软件模块的多个实例来收集。在某些实现中,该统计数据可包括缓解标签值,或者可跟踪成功和其中应用程序在没有成功的缓解的情况下执行的实例的其他机制。作为一具体示例, 缓解标签值可以在缓解动作被检测为成功时递增,且在应用程序在没有成功缓解的情况下终止时递减。在没有成功缓解的情况下终止可以仅基于从应用程序的“干净”退出确定。然而,可应用关于无成功缓解的其他度量,如是否检测到错误或崩溃影响了软件模块,或者在对应用程序的具体实例没有成功缓解的情况下。在框612,使用在框610的跟踪期间收集的信息来确定缓解动作是否成功地缓解了错误。在使用诸如缓解标签值等统计数据的实现中,这可包括确定该统计数据是否指示成功在特定阈值水平之上或者错误在特定阈值水平之下——如通过确定缓解标签值是否在特定阈值之上——但这可用任何合适的方式来完成。如果缓解动作成功地缓解了错误, 则在框614,可对该软件模块维持缓解模式,但是如果缓解动作不成功,则在框616对该软件模块禁用缓解模式。在框616或616之后,过程600结束。应当理解,图6的过程600仅是可由缓解启用模块114根据此处描述的原理来实现的技术的类型的示例,其他技术也是可能的。例如,尽管检测错误和评估错误代码在图6 中被描述为是缓解启用模块114的责任,但在某些替换实现中,这些功能可由操作系统108 的另一模块来执行,如微软Windows操作系统的Windows诊断基础结构(WDI),且缓解启用模块114可监视WDI模块来确定何时检测到存储器错误,或当检测到存储器错误时由WDI 模块通知。此外,缓解模式被描述为基于框612中对缓解动作是否成功地缓解了错误的判定来启用或禁用。在某些实现中,缓解启用模块114可另外地或另选地基于其他因素来启用 /禁用缓解模式,如其存储器操作以缓解模式执行的软件模块的时间或数量。例如,在一个实现中,软件模块的操作可以仅在一段时间(如一周)内以缓解模式执行,之后回退到正常 (非缓解)模式。在另一示例性实现中,缓解启用模块114可以在给定时间内仅对一设定数量的软件应用程序启用缓解模式,如同时仅对四个软件应用程序启用,来节省系统资源。如果达到了最大值且如在框602-606中检测到应对另一软件模块启用缓解模式,则最早启用了缓解模式的软件模块可将该缓解模式禁用,使得新软件模块可启用缓解模式。在某些实现中,可使用这些技术中的每一个的组合,使得缓解模块保持在一设定时间段内对软件模块启用,只要缓解启用模块114检测到缓解动作成功地缓解了错误,但是该模式仅被启用一设定时间段,之后当接着检测到另一软件模块可从缓解模式中获益时则禁用该模式。跟踪缓解动作在减少应用程序经历的存储器错误的数量方面的成功可用任何合适的方式来执行。图7A和7B示出了用于检测缓解动作的成功的两种示例性技术的流程图, 但应当理解,取决于期望被缓解的存储器错误的类型以及对缓解模块112可用的缓解动作的类型,其他技术是可能的。图7A的过程700A是关于如何能跟踪缓解动作在缓解错误方面的成功的总体过程的一个示例。在该示例中,图4A的分配过程400A是缓解动作被跟踪。过程700A在框702 开始,在那里缓解启用模块114出于任何原因对软件模块启用缓解模式。在框704,缓解模块112接收对特定软件模块执行分配操作的请求,并且根据图4A的过程400A,分配多于请求量的存储器且将标记值写入该额外存储器。在框706,缓解模块112接收对框704中分配的存储器执行释放操作的请求。如上所述,该释放操作可被延迟。但是,当在框708处实现该操作时,确定框704中分配的额外存储器是否仍存储写入它的标记值。如果该额外存储器仍存储该标记值,则在框710,缓解启用模块114可存储在该实例中缓解动作对存储器错误没有影响的指示,如存储在其事件日志216中。然而,如果在框708确定额外存储器未存储标记值,则在框712,缓解启用模块 114可在事件日志216中存储成功地缓解了错误的指示。在这一情况下,成功地检测到软件模块写入了多于空间请求量的数据,且因此缓解模块112成功地缓解了缓存溢出错误。在框710或712中存储了任一指示之后,在框714释放存储器,这可以用任何方式来完成,包括根据结合图5描述的延迟的释放过程500。在框714中释放了存储器之后,该过程结束。图7B示出了用于跟踪缓解模块在缓解错误方面的成功的另一示例性技术700B, 这一次是根据诸如图5的过程500等延迟的释放缓解动作来进行的。如同过程700A —样, 过程700B在框720开始,在那里缓解模块出于任何原因对特定软件模块启用缓解模式。在框722,缓解模块112接收对先前已被分配给特定软件模块的存储器执行释放操作的请求。 在框724,对于期望被释放的存储器的内容以任何合适的方式计算校验和或散列值,且在框 726,延迟释放操作的执行直到一等待时间段之后。在框728,在该等待时间段之后,再一次为存储器的内容计算校验和或散列值。在框730,确定来自框724的原始散列值是否匹配框728的后一散列值。如果是,则在框732,缓解启用模块114可在其事件日志216中存储缓解动作在该实例中对缓解错误没有影响。然而,如果在框730确定散列值不相同,则在框 734,可在缓解启用模块114的事件日志216中存储缓解模块112成功缓解错误的指示,因为可以检测到由于存储器的内容随时间改变,延迟释放直到等待时间段之后缓解了因编程隐错在软件模块完成使用存储器之前释放了存储器而引起的存储器错误的影响。在框732 或734中存储任一指示之后,在框736释放存储器,且该过程结束。过程700A和700B所存储的缓解动作的有效和无效性的指示可用任何合适的方式来使用。在某些实现中,这些指示可用于计算关于缓解动作对与应用程序相关的软件模块的影响的统计数据。这些统计数据可以跨软件应用程序的多个实例来计算。这些统计数据可以包括允许计算成功缓解频率的时间分量。在某些实施例中,该时间分量可以是观察到多个成功缓解的时间的指示。然而,该时间分量也可被测量为调用软件模块的调用次数。成功缓解频率可以是保持缓解是否有可能避免隐错对调用软件模块的影响的预测符,并且可以基于这些统计数据来确定是否对调用软件模块的将来实例实现缓解动作。如上所述,在一个实现中,可使用诸如图2C所示的缓解标签值来作为用于确定是否应对特定软件模块启用缓解模式的统计数据。该缓解标签值可以是任何合适的值,并且可以用任何合适的方式来初始化和调整。图8示出了可用于使用每一调用软件模块的缓解标签值来管理缓解模式的技术的一个示例。在所示实施例中,标签值被存储在非易失性存储器中,并且可以跨应用程序的实例、计算机的关闭或其他事件而持久保存。图8的过程800在框802开始,在那里缓解启用模块114检测存储器错误。框802 中的检测可以用任何合适的方式来完成,包括通过检测软件模块的不正确执行或崩溃。在框804,对软件模块启用缓解模式,并且在框806,将缓解标签值初始化为一特定值。该特定值可以是任何合适的值,并且可以是跨特定系统上的所有软件模块一致的值、基于任何合适的特性(如函数或源开发者)为特定一组应用程序选择的值、为特定软件模块选择的值、 或任何其他合适的值。在某些实施例中,如下所述,该初始值可以基于关于对所关注的应用程序成功缓解了错误的历史数据。在一个示例性实现中,缓解标签值可以是整数,且在对软件模块启用缓解模式时,该初始化的值可以是七(7)。在框808,缓解模块112以缓解模式对软件模块执行存储器操作,并且对于该软件模块的每一实例化——如模块的每一次执行——缓解启用模块114跟踪缓解模块112在该实例化中缓解错误的成功。跟踪成功可用任何合适的方式来完成,包括通过以上结合图7A 和7B描述的技术中的任一种。在框810,缓解启用模块114检测软件模块的实例的结束。实例的结束可以是正确的结束,如用户驱动或进程驱动的退出所导致的结束,或者可以是不正确的结束,如崩溃导致的结束。在框810,可将关于软件模块的实例的结束以及该结束的起因的信息存储在缓解数据存储212的事件日志216中。在框812,缓解启用模块814使用框808和810中收集的信息来更新软件模块的缓解标签值。在某些实现中,如果检测到缓解模块112成功地缓解了错误,则可递增缓解标签值。如果缓解模块112未成功缓解错误,则可递减缓解标签值。在其他实现中,可使用更多因素。表I示出了可用于确定如何调整缓解标签值的因素的一个示例,但其他因素是可能的。
权利要求
1.一种用于确定在对调用软件模块执行存储器操作时是否要应用一个或多个缓解动作的计算机实现的方法,所述方法包括对所述调用软件模块执行(312、314)至少一个第一存储器操作,所述执行包括应用所述一个或多个缓解动作;评估(708、730)所述一个或多个缓解动作是否成功地阻止存储器错误影响所述调用软件模块;确定(61 所述一个或多个缓解动作减少存储器错误影响所述调用软件模块的可能性;以及随后对所述调用软件模块执行(312、314、316)至少一个第二存储器操作,结合所述至少一个第二存储器操作基于所述可能性选择性地应用所述一个或多个缓解动作,所述执行包括如果所确定的可能性高于一阈值,则根据所述一个或多个缓解动作来对所述调用软件模块执行(312、314)所述至少一个第二存储器操作,以及如果所确定的可能性低于一阈值,则在没有所述一个或多个缓解动作的情况下对所述调用软件模块执行(316)所述至少一个第二存储器操作。
2.如权利要求1所述的方法,其特征在于,所述一个或多个缓解动作包括,对分配操作,分配(704)多于所述分配操作中的请求量的额外存储器,并将一标记值写入所述额外存储器;以及其中评估所述一个或多个缓解动作是否成功地阻止存储器错误影响所述调用软件模块包括审阅(708)所述额外存储器来确定所述额外存储器是否保持所述标记值。
3.如权利要求1所述的方法,其特征在于,所述一个或多个缓解动作包括,对存储器释放操作,在等待时间段之后执行(736)所述释放操作;以及其中评估所述一个或多个缓解动作是否成功地阻止存储器错误影响所述调用软件模块包括在所述等待时间段之后,确定(730)所述存储器的内容是否与在请求所述释放操作时的内容相同。
4.如权利要求1所述的方法,其特征在于,评估所述一个或多个缓解是否成功地阻止存储器错误影响所述调用软件模块包括检测(810)所述调用软件模块的退出以及确定所述退出是否正确,并且在检测到所述调用软件模块正确退出的情况下确定所述一个或多个缓解动作是成功的。
5.如权利要求4所述的方法,其特征在于,还包括如果所述退出是正确的,则更新第一统计数据来指示所述缓解是成功的,且如果所述退出不正确,则更新第二统计数据来指示所述缓解不成功。
6.如权利要求5所述的方法,其特征在于,所述第一统计数据和第二统计数据在所述调用软件模块的一系列实例上更新,以及其中确定所述可能性包括评估所述第一和第二统计数据。
7.如权利要求1所述的方法,其特征在于,确定所述可能性包括基于所述评估动作来更新(81 关于所述调用软件模块的统计数据,该统计数据指示所述一个或多个缓解动作在所述调用软件模块的多个实例上的成功,以及其中所述随后执行的动作是根据所述统计数据来执行的。
8.如权利要求7所述的方法,其特征在于,所述统计数据是缓解标签值,并且其中更新所述统计数据包括如果所述一个或多个缓解动作是成功的则递增所述缓解标签值,且如果所述一个或多个缓解动作不成功则递减所述缓解标签值。
9.一种管理计算机系统中的存储器的方法,所述方法适用于在对调用软件模块执行存储器操作时应用一个或多个缓解动作,所述方法包括检测(60 所述调用软件模块经历的存储器错误,所述存储器错误与存储器操作相关联;在与所述存储器管理模块相关联的数据存储中存储(608)在对所述调用软件模块执行所述存储器操作时应当应用所述一个或多个缓解动作的指示;随后根据所述一个或多个缓解动作对所述调用软件模块执行(610)至少一个第一存储器操作;评估(708、730)所述一个或多个缓解动作是否成功地减少了与所述存储器操作相关联的存储器错误的数量;基于所述评估动作的结果更新(812)关于所述调用软件模块的至少一个统计数据;以及随后对所述调用软件模块执行(300)至少一个第二存储器操作,所述执行包括 如果所述统计数据高于一阈值,则根据所述一个或多个缓解动作来对所述调用软件模块执行(312、314)所述至少一个第二存储器操作;以及如果所述统计数据低于所述阈值,则在没有所述一个或多个缓解动作的情况下对所述调用软件模块执行(316)所述至少一个第二存储器操作。
10.如权利要求9所述的方法,其特征在于,还包括对向其应用了所述一个或多个缓解的第二调用软件模块,评估(612、808)所述一个或多个缓解是否成功地减少了负面地影响所述第二调用软件模块的存储器错误的数量;以及向对于所述第二调用软件模块的将来的存储器操作应用(312、314)所述一个或多个缓解动作,而不管所述一个或多个缓解动作是否将被应用于所述调用软件模块。
11.如权利要求9所述的方法,其特征在于,所述至少一个统计数据在所述调用软件模块的多个实例上更新,以及其中所述至少一个第一存储器操作是所述调用软件模块的第一实例请求的,且所述至少一个第二存储器操作是所述调用软件模块的第二实例请求的。
12.如权利要求9所述的方法,其特征在于,所述至少一个统计数据包括指示所述一个或多个缓解动作在所述调用软件模块的多个实例上的成功的缓解标签值。
13.如权利要求12所述的方法,其特征在于,更新所述缓解标签值包括如果所述一个或多个缓解动作是成功的则递增所述缓解标签值,且如果所述一个或多个缓解动作不成功则递减所述缓解标签值。
14.至少一个其上编码有计算机可执行指令的计算机可读存储介质(104),所述计算机可执行指令在被执行时使得计算机(10 执行一种用于确定在对调用软件模块执行存储器操作时是否要应用一个或多个缓解动作的方法,所述方法包括对所述调用软件模块执行(312、314)至少一个第一存储器操作,所述执行包括应用所述一个或多个缓解动作;评估(612、708、730)所述一个或多个缓解动作是否成功地减少了影响所述调用软件模块的存储器错误的数量;以及随后根据所述一个或多个缓解动作对所述调用软件模块执行(300)至少一个第二存储器操作,所述执行包括如果所述一个或多个缓解动作是成功的,则根据所述一个或多个缓解动作来对所述调用软件模块执行(312、314)至少一个第二存储器操作,以及如果所述一个或多个缓解动作不成功,则在没有所述一个或多个缓解动作的情况下对所述调用软件模块执行(316)所述至少一个第二存储器操作。
15.如权利要求14所述的至少一个计算机可读存储介质,其特征在于,所述一个或多个缓解动作包括,对分配操作,分配(704)多于所述分配操作中的请求量的额外存储器,并将一标记值写入所述额外存储器;以及其中,评估所述一个或多个缓解动作是否成功包括审阅(708)所述额外存储器来确定所述额外存储器是否保持所述标记值。
16.如权利要求14所述的至少一个计算机可读存储介质,其特征在于,所述一个或多个缓解动作包括,对存储器释放操作,在等待时间段之后执行(736)所述释放操作;以及其中评估所述一个或多个缓解动作是否成功包括在所述等待时间段之后,确定(730) 所述存储器的内容是否与在请求所述释放操作时的内容相同。
17.如权利要求14所述的至少一个计算机可读存储介质,其特征在于,评估所述一个或多个缓解是否成功包括检测(810)所述调用软件模块的退出,并确定所述退出是否正确,以及如果检测到所述调用软件模块正确地退出,则确定所述一个或多个缓解动作是成功的。
18.如权利要求17所述的至少一个计算机可读存储介质,其特征在于,所述方法还包括如果所述退出是正确的,则更新第一统计数据来指示所述缓解是成功的,且如果所述退出不正确,则更新第二统计数据来指示所述缓解不成功。
19.如权利要求14所述的至少一个计算机可读存储介质,其特征在于,还包括基于所述评估动作来更新(81 关于所述调用软件模块的统计数据,该统计数据指示所述一个或多个缓解动作在所述调用软件模块的多个实例上的成功,以及其中所述随后执行的动作是根据所述统计数据来执行的。
20.如权利要求19所述的至少一个计算机可读存储介质,其特征在于,所述统计数据是缓解标签值,并且其中更新所述统计数据包括如果所述一个或多个缓解动作是成功的则递增所述缓解标签值,且如果所述一个或多个缓解动作不成功则递减所述缓解标签值。
全文摘要
提高应用程序可靠性的用于计算机的缓解启用模块。当执行存储器管理操作时,该缓解启用模块和相关联的存储器管理器选择性地使用旨在阻止应用程序隐错引起应用程序错误的缓解。存储器管理器可以基于这些缓解成功地阻止隐错引起应用程序错误的可能性来对一个或多个应用程序中的每一个应用缓解。该可能性从关于缓解在被应用时是否阻止隐错引起会导致应用程序错误的存储器操作的历史信息来确定。该历史信息可以在应用程序的多次调用上在单个计算机上收集,或者可从各自调用该应用程序的多个计算机聚集。所确定的可能性然后可用于确定对应用程序所请求的存储器操作是否应用缓解动作以及要应用多久。
文档编号G06F15/00GK102165423SQ200980138388
公开日2011年8月24日 申请日期2009年9月14日 优先权日2008年9月26日
发明者A·J·洛雷利, D·G·格兰特, P·卡斯图里, S·C·卡利诺, W·坎贝尔 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1