專利名稱:選擇性地使用緩解來減少錯(cuò)誤的存儲(chǔ)器管理技術(shù)的制作方法
選擇性地使用緩解來減少錯(cuò)誤的存儲(chǔ)器管理技術(shù)背景在多用途計(jì)算設(shè)備中,操作系統(tǒng)通常,但不專門地,用于管理供在該計(jì)算設(shè)備上執(zhí)行的一個(gè)或多個(gè)應(yīng)用程序使用的該計(jì)算設(shè)備的存儲(chǔ)器。例如,如果兩個(gè)應(yīng)用程序存取計(jì)算設(shè)備上的存儲(chǔ)器,則操作系統(tǒng)可分配存儲(chǔ)器的各部分以供這兩個(gè)應(yīng)用程序使用,使得兩者都能存取存儲(chǔ)器而不破壞對(duì)方所存儲(chǔ)的數(shù)據(jù)。該管理和仲裁可能是緩解在應(yīng)用程序試圖使用對(duì)方正在使用的存儲(chǔ)器時(shí)引發(fā)的問題所必需的。例如,如果兩個(gè)應(yīng)用程序都試圖在相同或重疊的時(shí)間段內(nèi)使用存儲(chǔ)器的同一部分,則第二個(gè)應(yīng)用程序可能蓋寫第一個(gè)應(yīng)用程序的數(shù)據(jù),且第一個(gè)應(yīng)用程序可能無法正確執(zhí)行或者甚至可能崩潰。諸如這些的錯(cuò)誤對(duì)用戶體驗(yàn)有顯著影響,尤其是在它們頻繁發(fā)生的情況下。操作系統(tǒng)通常包括應(yīng)用程序可向其發(fā)送執(zhí)行存儲(chǔ)器管理任務(wù)的請(qǐng)求的存儲(chǔ)器管理器,使得存儲(chǔ)器管理器可針對(duì)存儲(chǔ)器資源的使用在進(jìn)程之間進(jìn)行仲裁。例如,如果應(yīng)用程序希望臨時(shí)或永久地存儲(chǔ)數(shù)據(jù),則應(yīng)用程序可請(qǐng)求存儲(chǔ)器管理器向該應(yīng)用程序分配某一量的存儲(chǔ)器。稍后,當(dāng)應(yīng)用程序不再需要該存儲(chǔ)器時(shí),應(yīng)用程序可如此通知存儲(chǔ)器管理器,并且請(qǐng)求解除分配(或“釋放”)所分配的存儲(chǔ)器,以使其可被另一應(yīng)用程序使用。當(dāng)?shù)诙?yīng)用程序向存儲(chǔ)器管理器發(fā)送對(duì)存儲(chǔ)器的請(qǐng)求時(shí),存儲(chǔ)器管理器可咨詢其記錄來確定存儲(chǔ)器中當(dāng)前未被分配的部分,并將這些部分分配給第二應(yīng)用程序??蓤?zhí)行與操作系統(tǒng)進(jìn)行交互的進(jìn)程的某些軟件應(yīng)用程序例如可包括與執(zhí)行存儲(chǔ)器操作相關(guān)的隱錯(cuò)或其他編程缺陷,并且即使是在存儲(chǔ)器管理器正確地執(zhí)行了存儲(chǔ)器操作的時(shí)候,軟件應(yīng)用程序也可能因存儲(chǔ)器錯(cuò)誤而失敗。這些存儲(chǔ)器錯(cuò)誤可因可在存儲(chǔ)器操作之間引發(fā)的不一致性而引起。例如,如上所述,軟件應(yīng)用程序可請(qǐng)求向應(yīng)用程序分配第一數(shù)量的存儲(chǔ)器,然后將大于該第一數(shù)量的第二數(shù)量的數(shù)據(jù)寫入該存儲(chǔ)器。操作之間的不一致性——在該示例中,是第一數(shù)量和第二數(shù)量之間大小的不一致性——會(huì)引起導(dǎo)致軟件應(yīng)用程序中的失敗的存儲(chǔ)器錯(cuò)誤。這些失敗可包括因存儲(chǔ)器錯(cuò)誤所引起的不正確執(zhí)行,或甚至是停止應(yīng)用程序的執(zhí)行的災(zāi)難性錯(cuò)誤或“崩潰”。由于這些編程隱錯(cuò)的影響,已經(jīng)開發(fā)了軟件工具來試圖標(biāo)識(shí)引起這些存儲(chǔ)器錯(cuò)誤的編程隱錯(cuò)。這些工具可在軟件應(yīng)用程序的開發(fā)性測(cè)試期間使用。例如,存在可用于在軟件應(yīng)用程序的開發(fā)性測(cè)試期間標(biāo)識(shí)隱錯(cuò)的不同類型的“診斷”工具。某些軟件開發(fā)應(yīng)用程序,如可從美國華盛頓州雷蒙德市的微軟公司獲得的Visual Studio,具有諸如這些的內(nèi)置工具。在Visual Mudio中,開發(fā)者可選擇在測(cè)試期間啟用可包括頁堆(Page Heap)功能的應(yīng)用程序驗(yàn)證器(Application Verifier)功能。頁堆可用于通過監(jiān)視對(duì)于正被測(cè)試的應(yīng)用程序的存儲(chǔ)器分配和使用來檢測(cè)某些存儲(chǔ)器錯(cuò)誤,包括緩存溢出和數(shù)據(jù)不足。在頁堆中,在堆存儲(chǔ)器的所分配的部分(正常地,是“用戶分配”頁)之后放置一定量的保留的額外存儲(chǔ)器(稱為“不可存取頁”),并且啟用應(yīng)用程序驗(yàn)證器功能來檢測(cè)信息何時(shí)被寫入該不可存取頁。以此方式,診斷工具可以標(biāo)識(shí)錯(cuò)誤并將其報(bào)告給開發(fā)者。
然而,此類診斷工具可能無法在軟件應(yīng)用程序的運(yùn)行時(shí)期間使用。開發(fā)了其他工具來在存儲(chǔ)器錯(cuò)誤引起崩潰時(shí)收集崩潰信息,該收集的信息在被分析時(shí)可用于標(biāo)識(shí)存儲(chǔ)器錯(cuò)誤。這一解決運(yùn)行時(shí)期間經(jīng)歷的崩潰的嘗試在傳統(tǒng)上限于檢測(cè)此類錯(cuò)誤何時(shí)發(fā)生并將崩潰狀況報(bào)告給中央聚集點(diǎn),該中央聚集點(diǎn)然后向開發(fā)者通知關(guān)于錯(cuò)誤的可用信息。開發(fā)者可試圖使用該信息來重建或診斷錯(cuò)誤,然后標(biāo)識(shí)并解決該隱錯(cuò)。可從微軟公司獲得的 Windows操作系統(tǒng)在其Windows錯(cuò)誤報(bào)告(WER)系統(tǒng)中提供了此類報(bào)告功能。在該系統(tǒng)中, 當(dāng)WER檢測(cè)到應(yīng)用程序非干凈地退出時(shí)——例如,通過崩潰或以其他方式不正確退出—— 則諸如指令棧的內(nèi)容等關(guān)于應(yīng)用程序狀態(tài)的信息可由WER捆綁并報(bào)告給聚集服務(wù)器。該信息還可包括標(biāo)識(shí)錯(cuò)誤的類的通用系統(tǒng)錯(cuò)誤代碼,但是不包括關(guān)于引起該錯(cuò)誤的確切隱錯(cuò)的 fn息ο概述申請(qǐng)人:認(rèn)識(shí)到且明白,通過使用存儲(chǔ)器管理來補(bǔ)償引起存儲(chǔ)器錯(cuò)誤的軟件應(yīng)用程序中的編程隱錯(cuò),應(yīng)用程序能更可靠地操作,且改善用戶體驗(yàn)。申請(qǐng)人認(rèn)識(shí)到,許多存儲(chǔ)器錯(cuò)誤可能是由應(yīng)用程序執(zhí)行的存儲(chǔ)器操作中的不一致性引起的,且這些編程隱錯(cuò)的影響可通過預(yù)期這些不一致性并以糾正它們的方式執(zhí)行存儲(chǔ)器管理來緩解。例如,通過向應(yīng)用程序分配多于請(qǐng)求量的資源(如存儲(chǔ)器和/或時(shí)間),存儲(chǔ)器管理模塊可補(bǔ)償應(yīng)用程序中導(dǎo)致應(yīng)用程序存取多于請(qǐng)求量的存儲(chǔ)器、或在其發(fā)信號(hào)通知其處理完存儲(chǔ)器之后使用存儲(chǔ)器的隱錯(cuò)。此外,在某些情況下,存儲(chǔ)器管理模塊可通過例如在其檢測(cè)到對(duì)應(yīng)用程序所請(qǐng)求的存儲(chǔ)器操作的輸入信息不正確的情況下不執(zhí)行該操作來緩解錯(cuò)誤??捎貌煌愋偷木徑鈩?dòng)作來緩解許多不同類型的錯(cuò)誤,其示例將在下文中更詳細(xì)討論。然而,申請(qǐng)人明白,諸如此類的緩解可對(duì)計(jì)算設(shè)備的效率有顯著影響,并且可影響在這些設(shè)備上執(zhí)行的應(yīng)用程序的性能。每次當(dāng)請(qǐng)求存儲(chǔ)器操作時(shí)評(píng)估并操縱該操作可增加完成請(qǐng)求的時(shí)間,并且分配多于請(qǐng)求量的存儲(chǔ)器使用了更多存儲(chǔ)器且因此會(huì)減少系統(tǒng)可用的資源。申請(qǐng)人明白存儲(chǔ)器管理模塊的具有能夠?qū)γ恳粦?yīng)用程序選擇性地啟用的緩解的愿望。根據(jù)此處描述的原理,可實(shí)現(xiàn)一種存儲(chǔ)器管理模塊,該存儲(chǔ)器管理模塊對(duì)于向該存儲(chǔ)器管理模塊發(fā)出執(zhí)行存儲(chǔ)器操作的請(qǐng)求的一個(gè)或多個(gè)軟件模塊中的每一個(gè)具有不同的操作模式。在一種操作模式中,作為調(diào)用軟件模塊所請(qǐng)求的存儲(chǔ)器操作的補(bǔ)充或替代,存儲(chǔ)器管理模塊可執(zhí)行一個(gè)或多個(gè)緩解動(dòng)作,使得該存儲(chǔ)器操作根據(jù)該緩解動(dòng)作來執(zhí)行。這些緩解動(dòng)作可用于降低存儲(chǔ)器錯(cuò)誤影響調(diào)用軟件模塊的可能性。在另一種操作模式中,該存儲(chǔ)器管理模塊如所請(qǐng)求地執(zhí)行存儲(chǔ)器操作而不執(zhí)行緩解動(dòng)作。一種存儲(chǔ)器管理模塊可在與該存儲(chǔ)器管理模塊相關(guān)聯(lián)的數(shù)據(jù)存儲(chǔ)中維護(hù)一記錄,該記錄具有對(duì)應(yīng)于每一調(diào)用軟件模塊的至少一個(gè)條目,該條目指示對(duì)于該調(diào)用軟件模塊存儲(chǔ)器管理模塊應(yīng)以其操作的模式。根據(jù)此處所描述的部分或全部原理來操作存儲(chǔ)器管理模塊可以降低諸如用戶應(yīng)用程序等軟件模塊不正確執(zhí)行或崩潰的可能性,這可用于改善在使用這些軟件模塊時(shí)的用戶體驗(yàn)。應(yīng)當(dāng)理解,以上內(nèi)容旨在是本發(fā)明的非限制概述,本發(fā)明僅由所附權(quán)利要求書來定義。
附圖簡述附圖不旨在按比例繪制。在附圖中,各個(gè)附圖中示出的每一完全相同或近乎完全相同的組件由同樣的標(biāo)號(hào)來表示。出于簡明的目的,不是每一個(gè)組件在每張附圖中均被標(biāo)號(hào)。在附圖中
圖1是根據(jù)此處描述的原理中的某一些來操作的技術(shù)可在其中起作用的示例性計(jì)算設(shè)備的框圖;圖2A是根據(jù)用于存儲(chǔ)器管理的常規(guī)技術(shù)來操作的系統(tǒng)的各組件之間的交互的示意圖;圖2B是根據(jù)此處描述的部分原理來操作的技術(shù)可在其中其作用的一個(gè)示例性系統(tǒng)的某些組件之間的某些交互的示意圖;圖2C是可用于在逐個(gè)應(yīng)用程序的基礎(chǔ)上實(shí)現(xiàn)存儲(chǔ)器緩解的計(jì)算機(jī)存儲(chǔ)介質(zhì)中的數(shù)據(jù)結(jié)構(gòu)的示意性圖示;圖3是根據(jù)此處所描述的某些原理來執(zhí)行存儲(chǔ)器管理的示例性技術(shù)的流程圖;圖4A、4B、4C和4D是根據(jù)此處描述的一個(gè)或多個(gè)原理來執(zhí)行存儲(chǔ)器操作的示例性技術(shù)的流程圖;圖5是根據(jù)此處所描述的某些原理來執(zhí)行解除存儲(chǔ)器分配的操作的一個(gè)示例性技術(shù)的流程圖;圖6是根據(jù)此處描述的某些原理來確定是否將緩解技術(shù)應(yīng)用于特定應(yīng)用程序的示例性技術(shù)的流程圖;圖7A和7B是根據(jù)此處描述的某些原理來確定緩解技術(shù)成功地緩解了存儲(chǔ)器錯(cuò)誤對(duì)應(yīng)用程序的影響的示例性技術(shù)的流程圖;圖8是根據(jù)此處描述的某些原理來確定是否對(duì)特定應(yīng)用程序移除緩解技術(shù)的示例性技術(shù)的流程圖;圖9是根據(jù)此處描述的原理中的某一些來操作的技術(shù)可在其中起作用的示例性計(jì)算設(shè)備的框圖;圖10是根據(jù)此處描述的部分原理來操作的技術(shù)可在其中其作用的一個(gè)示例性系統(tǒng)的某些組件之間的某些交互的示意圖;圖11示出了根據(jù)此處描述的某些原理來操作的技術(shù)可在其中起作用的示例性計(jì)算機(jī)系統(tǒng);圖12是根據(jù)此處描述的某些原理來配置計(jì)算設(shè)備以便使用存儲(chǔ)器管理技術(shù)的示例性技術(shù)的流程圖;以及圖13是根據(jù)此處描述的某些原理在適用于配置計(jì)算設(shè)備以便使用存儲(chǔ)器管理技術(shù)的中央聚集服務(wù)器處接收錯(cuò)誤和緩解數(shù)據(jù)的示例性技術(shù)的流程圖。詳細(xì)描述資源管理模塊在具有共享資源的系統(tǒng)中操作,且用作該共享資源的仲裁者來確保其多個(gè)消費(fèi)者在試圖訪問該資源時(shí)不會(huì)彼此干涉。存儲(chǔ)器管理模塊是這一資源管理模塊的一個(gè)示例。某些計(jì)算設(shè)備,包括單用途和多用途計(jì)算設(shè)備,可以并行執(zhí)行與兩個(gè)或更多任務(wù)相關(guān)的應(yīng)用程序或其他指令集,并且這些并行執(zhí)行可能會(huì)競(jìng)爭(zhēng)對(duì)存儲(chǔ)器的存取。如果兩個(gè)或更多應(yīng)用程序被正確地編碼并且給予存儲(chǔ)器管理模塊的指令是正確的,則存儲(chǔ)器管理可
7以是相對(duì)簡單的任務(wù)。不幸的是,申請(qǐng)人認(rèn)識(shí)到,情況并非始終如此,且應(yīng)用程序或指令集可能會(huì)因?yàn)橐鸫鎯?chǔ)器錯(cuò)誤的編程隱錯(cuò)而崩潰。例如,華盛頓州雷蒙德市的微軟公司的研究發(fā)現(xiàn)在Windows操作系統(tǒng)中運(yùn)行的用戶軟件應(yīng)用程序中的編程隱錯(cuò)引起存儲(chǔ)器錯(cuò)誤,這些存儲(chǔ)器錯(cuò)誤是每天大量應(yīng)用程序崩潰的源頭——占研究中分析了全部數(shù)量的崩潰中的約15%。申請(qǐng)人:認(rèn)識(shí)到且明白,應(yīng)用程序中的編程隱錯(cuò)的影響可通過使用改進(jìn)的存儲(chǔ)器管理模塊來緩解,該改進(jìn)的存儲(chǔ)器管理模塊可采取步驟來降低引起錯(cuò)誤的編程隱錯(cuò)對(duì)應(yīng)用程序產(chǎn)生負(fù)面影響的概率。例如,通過向應(yīng)用程序分配多于應(yīng)用程序請(qǐng)求量的資源,存儲(chǔ)器管理模塊可以補(bǔ)償應(yīng)用程序中導(dǎo)致應(yīng)用程序使用多于請(qǐng)求量的存儲(chǔ)器或者在應(yīng)用程序發(fā)信號(hào)通知其已完成對(duì)存儲(chǔ)器的處理之后使用存儲(chǔ)器的隱錯(cuò)。此外,在某些情況下,存儲(chǔ)器管理模塊可以通過不執(zhí)行作出對(duì)要執(zhí)行的存儲(chǔ)器操作的調(diào)用的應(yīng)用程序所請(qǐng)求的存儲(chǔ)器操作來緩解錯(cuò)誤。例如,如果存儲(chǔ)器管理模塊檢測(cè)到關(guān)于操作的輸入信息是不正確的,則它可以不執(zhí)行該操作??捎貌煌愋偷木徑鈩?dòng)作來緩解許多不同類型的錯(cuò)誤,其示例將在下文中更詳細(xì)討論。然而,應(yīng)當(dāng)理解,除了以下列出的之外,許多不同類型的緩解動(dòng)作是可能的,可以采取任何合適的動(dòng)作來緩解引起存儲(chǔ)器錯(cuò)誤的編程隱錯(cuò)。申請(qǐng)人:還認(rèn)識(shí)到且明白,在某些情況下,緩解動(dòng)作會(huì)對(duì)應(yīng)用程序或其他指令集的性能有不利影響,例如,向應(yīng)用程序分配多于請(qǐng)求量的存儲(chǔ)器,或者在釋放存儲(chǔ)器以供另一應(yīng)用程序使用之前延遲,導(dǎo)致計(jì)算設(shè)備使用的存儲(chǔ)器比其本來將使用的更多。另外,通過在存儲(chǔ)器管理模塊接收到存儲(chǔ)器操作時(shí)檢查該存儲(chǔ)器操作來確定緩解動(dòng)作是否可用,增加了響應(yīng)這些存儲(chǔ)器操作的時(shí)間,導(dǎo)致應(yīng)用程序的執(zhí)行時(shí)間增加。申請(qǐng)人認(rèn)識(shí)到且明白,由于并非所有調(diào)用存儲(chǔ)器管理器的軟件模塊(“調(diào)用軟件模塊”)將具有導(dǎo)致存儲(chǔ)器錯(cuò)誤的編程隱錯(cuò),對(duì)性能的這一不利影響可通過取決于是否檢測(cè)到調(diào)用軟件模塊經(jīng)歷了存儲(chǔ)器錯(cuò)誤而對(duì)調(diào)用軟件模塊選擇性地應(yīng)用緩解動(dòng)作來減輕。因此,此處所描述的是用于對(duì)每一具體的調(diào)用軟件模塊以不同操作模式執(zhí)行存儲(chǔ)器操作的技術(shù),其中調(diào)用軟件模塊是應(yīng)用程序的實(shí)例,這些操作模式如其中對(duì)應(yīng)用程序向存儲(chǔ)器操作應(yīng)用緩解動(dòng)作的第一模式,以及不對(duì)應(yīng)用程序應(yīng)用緩解動(dòng)作的第二模式。另外,申請(qǐng)人明白,在緩解模式中始終對(duì)調(diào)用軟件模塊執(zhí)行存儲(chǔ)器操作可能并不是高效的。例如,在某些實(shí)現(xiàn)中,存儲(chǔ)器管理模塊可以不被配置成緩解調(diào)用軟件模塊可經(jīng)歷的所有存儲(chǔ)器錯(cuò)誤,并且特定調(diào)用軟件模塊可具有可能無法通過在計(jì)算設(shè)備上實(shí)現(xiàn)的特定存儲(chǔ)器管理模塊來緩解的編程隱錯(cuò)。作為另一示例,某些調(diào)用軟件模塊可在某些不頻繁執(zhí)行的指令中具有編程隱錯(cuò)。作為另一示例,調(diào)用軟件模塊可具有非常少的導(dǎo)致存儲(chǔ)器錯(cuò)誤的隱錯(cuò)。在這些情況的每一種中,盡管對(duì)調(diào)用軟件模塊在緩解模式中操作存儲(chǔ)器管理模塊可能有助于緩解某些錯(cuò)誤,但這些可緩解錯(cuò)誤可能是不頻繁的,并且因在緩解模式中進(jìn)行操作而引起的效率損失可能會(huì)超過緩解錯(cuò)誤的獲益。因此,申請(qǐng)人認(rèn)識(shí)到且明白進(jìn)行測(cè)試來確定在緩解模式中操作存儲(chǔ)器管理模塊的有效性并響應(yīng)于該測(cè)試來配置存儲(chǔ)器管理模塊的愿望。確定有效性可以按任何合適的方式來完成。例如,如果檢測(cè)到存儲(chǔ)器錯(cuò)誤不影響軟件模塊,則即使引起錯(cuò)誤的編程隱錯(cuò)存在于該模塊中,也確定緩解動(dòng)作有效地或成功地緩解了存儲(chǔ)器錯(cuò)誤。該測(cè)試可以隨時(shí)間且隨應(yīng)用程序的多個(gè)實(shí)例來執(zhí)行,以收集關(guān)于緩解動(dòng)作是否有效的統(tǒng)計(jì)數(shù)據(jù),包括關(guān)于錯(cuò)誤和檢測(cè)到的緩解動(dòng)作的成功的數(shù)量和/或頻率的統(tǒng)計(jì)數(shù)據(jù)。這些統(tǒng)計(jì)數(shù)據(jù)可采用任何合適的形式,包括作為標(biāo)簽值,該標(biāo)簽值在一個(gè)實(shí)例中在即使存在隱錯(cuò)但緩解動(dòng)作仍成功地避免了對(duì)調(diào)用應(yīng)用程序的影響的情況下遞增,且在另一實(shí)例中在緩解動(dòng)作不成功時(shí)遞減??墒褂萌魏魏线m的準(zhǔn)則來確定緩解是成功還是不成功。在某些實(shí)施例中,如果沒有檢測(cè)到可被緩解類型的隱錯(cuò),則緩解可被認(rèn)為是不成功的。然而,在其他實(shí)施例中,可以應(yīng)用其他不同或附加的準(zhǔn)則。作為基于緩解的先前成功來選擇應(yīng)用緩解所引起的行為的一個(gè)示例,存儲(chǔ)器管理模塊可被配置成當(dāng)對(duì)作為應(yīng)用程序的實(shí)例的特定軟件模塊執(zhí)行存儲(chǔ)器操作時(shí)以緩解模式來操作??稍诒罎⒒驓w因于存儲(chǔ)器功能的其他錯(cuò)誤之后進(jìn)入該模式。如果在某一段時(shí)間之后確定緩解未有效地阻止存儲(chǔ)器錯(cuò)誤影響該模塊,則存儲(chǔ)器管理模塊可被配置成對(duì)該特定應(yīng)用程序的后續(xù)實(shí)例以正常模式操作而沒有緩解。該時(shí)間段可以通過計(jì)時(shí)來測(cè)量,和 /或以某種其他方式,如基于在沒有成功緩解的情況下從應(yīng)用程序干凈退出的次數(shù)來測(cè)量。 以下描述了可用于作出這一判定的示例性測(cè)試,其結(jié)果可用于控制對(duì)特定的調(diào)用軟件模塊存儲(chǔ)器管理模塊應(yīng)以其操作的模式。申請(qǐng)人:還明白,諸如與廣泛發(fā)行的軟件應(yīng)用程序相關(guān)聯(lián)的某些軟件模塊可在多個(gè)計(jì)算設(shè)備上執(zhí)行,且這些計(jì)算設(shè)備中的每一個(gè)可具有這些軟件模塊以及緩解動(dòng)作是否有效的經(jīng)驗(yàn)。例如,其他計(jì)算設(shè)備可具有確定緩解動(dòng)作是成功還是不成功的經(jīng)驗(yàn)。申請(qǐng)人認(rèn)識(shí)到且明白,計(jì)算設(shè)備的性能因此可通過充分利用其他計(jì)算設(shè)備的經(jīng)驗(yàn)來作出關(guān)于是否對(duì)應(yīng)用程序應(yīng)用緩解動(dòng)作以及應(yīng)用緩解動(dòng)作多長時(shí)間來進(jìn)一步提高。為了利用聚集的信息,計(jì)算設(shè)備可適用于向從多個(gè)設(shè)備收集信息的一個(gè)或多個(gè)其他計(jì)算設(shè)備發(fā)送關(guān)于錯(cuò)誤類型和緩解動(dòng)作的成功的詳細(xì)信息,所有這些設(shè)備可執(zhí)行作為應(yīng)用程序的實(shí)例的軟件模塊。這一個(gè)或多個(gè)設(shè)備可聚集關(guān)于對(duì)特定應(yīng)用程序緩解的成功的信息?;谠摼奂男畔ⅲO(shè)備還可從一個(gè)或多個(gè)計(jì)算設(shè)備接收關(guān)于是否要對(duì)特定軟件模塊應(yīng)用緩解動(dòng)作的配置信息。該信息可以采用任何合適的形式,如關(guān)于可對(duì)照其來測(cè)量緩解動(dòng)作的成功的統(tǒng)計(jì)數(shù)據(jù)。例如,配置信息可包括在確定是否對(duì)應(yīng)用程序禁用緩解之前應(yīng)考慮應(yīng)用程序的更多或更少數(shù)量實(shí)例的指示。在某些這樣的實(shí)現(xiàn)中,這些指令可包括初始緩解標(biāo)簽值,該標(biāo)簽值可根據(jù)此處所描述的測(cè)試技術(shù)使用來確定是否要對(duì)應(yīng)用程序禁用緩解。因此,以下描述的是用于向其他計(jì)算設(shè)備發(fā)送并從其他計(jì)算設(shè)備接收信息的技術(shù),該信息可用于配置計(jì)算設(shè)備上的存儲(chǔ)器管理模塊來應(yīng)用緩解動(dòng)作。應(yīng)當(dāng)理解,在具體實(shí)施例中,各技術(shù)可以根據(jù)此處描述的某些原理來實(shí)現(xiàn)而無需每一實(shí)施例都使用所有原理。可實(shí)現(xiàn)這些原理中的一個(gè)或多個(gè)的任何合適的組合,本發(fā)明的各實(shí)施例不限于用任何具體原理或這些原理的集合來實(shí)現(xiàn)。例如,可以實(shí)現(xiàn)選擇性地應(yīng)用緩解動(dòng)作但不測(cè)試緩解動(dòng)作的有效性或接受來自其他計(jì)算設(shè)備的配置數(shù)據(jù)的存儲(chǔ)器管理模塊,或者實(shí)現(xiàn)選擇性地應(yīng)用緩解動(dòng)作并測(cè)試有效性但不接受來自其他計(jì)算設(shè)備的配置數(shù)據(jù)的存儲(chǔ)器管理模塊。以下描述的技術(shù)可以用各種方式中的任一種來實(shí)現(xiàn),并在各種類型的指令集的任一種上操作。為簡明起見,以下的示例將存儲(chǔ)器管理模塊和錯(cuò)誤報(bào)告服務(wù)描述為計(jì)算設(shè)備的操作系統(tǒng)的一部分,且將軟件模塊描述為由操作系統(tǒng)管理的應(yīng)用程序。這一示例可以在此處描述的某些原理的一種商業(yè)實(shí)現(xiàn)中看到,其中操作系統(tǒng)是Microsoft Windows,以下描述的緩解模塊是容錯(cuò)堆(FTH)客戶端,以下描述的緩解啟用模塊是FTH服務(wù)器,且錯(cuò)誤報(bào)告客戶端和服務(wù)器是Windows錯(cuò)誤報(bào)告(WE 服務(wù)的組件。然而,應(yīng)當(dāng)理解,這僅是可實(shí)現(xiàn)此處所描述的原理的不同方式的一個(gè)示例,且其他方式是可能的。例如,存儲(chǔ)器管理模塊可被實(shí)現(xiàn)為與計(jì)算設(shè)備的操作系統(tǒng)交互的獨(dú)立組件、由操作系統(tǒng)管理的應(yīng)用程序的組件、或在不具有操作系統(tǒng)的計(jì)算設(shè)備上執(zhí)行的模塊。此外,向存儲(chǔ)器管理模塊發(fā)出請(qǐng)求的軟件模塊 (“調(diào)用軟件模塊”)可以是可由處理器執(zhí)行的指令的任何合適的安排。在某些實(shí)現(xiàn)中,軟件模塊可以是用戶應(yīng)用程序的實(shí)例、操作系統(tǒng)的組件、服務(wù)或端口映射程序、或任何其他合適的軟件模塊。每一軟件模塊可以是以下描述的一個(gè)或多個(gè)“功能模塊”。另外,存儲(chǔ)器管理模塊可以被實(shí)現(xiàn)為執(zhí)行一個(gè)或多個(gè)存儲(chǔ)器操作的任何合適的組合,以及一個(gè)或多個(gè)緩解動(dòng)作的任何合適的組合。存儲(chǔ)器操作可以是影響存儲(chǔ)器資源的使用的任何合適的操作,如分配、解除分配(釋放)、重新分配、分頁、以及許多其他操作。緩解動(dòng)作可以是可由存儲(chǔ)器管理模塊采取來降低調(diào)用軟件模塊中的編程隱錯(cuò)將導(dǎo)致存儲(chǔ)器錯(cuò)誤且如通過引起不正確執(zhí)行或崩潰而負(fù)面地影響調(diào)用軟件模塊的可能性。存儲(chǔ)器錯(cuò)誤可以是導(dǎo)致會(huì)如通過引起不正確執(zhí)行或崩潰而負(fù)面地影響軟件模塊的存儲(chǔ)器破壞的任何錯(cuò)誤。在許多情況下,存儲(chǔ)器破壞可由導(dǎo)致存儲(chǔ)器操作之間的不一致性的編程隱錯(cuò)引起。存儲(chǔ)器錯(cuò)誤包括在所分配的存儲(chǔ)器的邊界外部寫入(緩存溢出或數(shù)據(jù)不足)、當(dāng)兩個(gè)模塊在重疊的時(shí)間段內(nèi)各自使用相同的存儲(chǔ)器空間時(shí)另一軟件模塊對(duì)所存儲(chǔ)的信息的蓋寫、或使用與分配給模塊的不同的存儲(chǔ)器部分。應(yīng)當(dāng)理解,這些存儲(chǔ)器錯(cuò)誤僅是軟件模塊可經(jīng)歷且可通過此處描述的某些原理來緩解的類型的示例。緩解存儲(chǔ)器錯(cuò)誤可以通過執(zhí)行任何合適的一個(gè)或多個(gè)緩解動(dòng)作以任何合適的方式來完成。在某些情況下,緩解動(dòng)作可包括在預(yù)期不一致存儲(chǔ)器操作時(shí)采取的且試圖抵消該不一致性的動(dòng)作。示例性緩解動(dòng)作在下文中更詳細(xì)地描述,但是可包括在執(zhí)行操作之前改變操作、不執(zhí)行操作、在稍后的時(shí)間執(zhí)行操作、在執(zhí)行操作之前確認(rèn)對(duì)操作的正確輸入、 或以對(duì)存儲(chǔ)器空間的最小改變來執(zhí)行操作中的任一動(dòng)作。此外,以下用對(duì)通常稱為“堆”存儲(chǔ)器的一種類型的存儲(chǔ)器來操作的存儲(chǔ)器管理模塊描述了示例性實(shí)現(xiàn)。然而,應(yīng)當(dāng)理解,任何一種或多種合適類型的存儲(chǔ)器可由根據(jù)此處描述的某些原理來操作的技術(shù)來管理,包括棧存儲(chǔ)器和/或全局變量存儲(chǔ)器。在此處描述的原理的一個(gè)示例性實(shí)現(xiàn)中,調(diào)用軟件模塊(可以是例如軟件應(yīng)用程序的實(shí)例)可向存儲(chǔ)器管理模塊發(fā)出執(zhí)行存儲(chǔ)器操作的請(qǐng)求。存儲(chǔ)器管理模塊可以與緩解啟用模塊進(jìn)行交互。緩解啟用模塊可以咨詢啟用模塊所存儲(chǔ)的規(guī)則和設(shè)置數(shù)據(jù)的一個(gè)或多個(gè)條目來確定當(dāng)對(duì)特定的調(diào)用軟件模塊執(zhí)行操作時(shí)存儲(chǔ)器管理模塊應(yīng)以其操作的模式。咨詢規(guī)則和設(shè)置數(shù)據(jù)在這一和某些其他實(shí)現(xiàn)中可包括檢查來確定一個(gè)或多個(gè)統(tǒng)計(jì)數(shù)據(jù)是在閾值水平之上還是之下。如果規(guī)則和設(shè)置指示存儲(chǔ)器管理單元不應(yīng)以緩解模式操作——例如,如果緩解標(biāo)簽值低于閾值水平——?jiǎng)t如所請(qǐng)求地執(zhí)行存儲(chǔ)器操作。然而,如果規(guī)則和設(shè)置指示存儲(chǔ)器管理單元應(yīng)以緩解模式操作,則可啟用存儲(chǔ)器管理單元的緩解模塊。緩解模塊然后可結(jié)合存儲(chǔ)器管理模塊來根據(jù)一個(gè)或多個(gè)緩解操作執(zhí)行存儲(chǔ)器操作,這些緩解動(dòng)作可用于降低存儲(chǔ)器錯(cuò)誤負(fù)面地影響調(diào)用軟件模塊的可能性。應(yīng)當(dāng)理解,存儲(chǔ)器管理模塊的操作模式較佳地獨(dú)立于每一軟件模塊,且存儲(chǔ)器管理單元可以對(duì)一個(gè)調(diào)用軟件模塊以第一模式執(zhí)行存儲(chǔ)器操作,且對(duì)另一調(diào)用軟件模塊以第二模式執(zhí)行另一存儲(chǔ)器操作。在該示例性實(shí)現(xiàn)中,緩解和緩解啟用模塊也可適用于評(píng)估一個(gè)或多個(gè)緩解動(dòng)作一旦被啟用是否成功地緩解了錯(cuò)誤。這可以用任何合適的方式來完成,其示例在下文中討論。
10例如,當(dāng)執(zhí)行緩解動(dòng)作時(shí),可取得最初的觀察結(jié)果并將其與稍后記錄的觀察結(jié)果進(jìn)行比較, 來確定調(diào)用軟件模塊是否采取了指示可通過緩解動(dòng)作阻止其引起錯(cuò)誤的編程隱錯(cuò)的任何動(dòng)作。例如,如以下所討論的,在分配操作期間,可分配大于請(qǐng)求量的存儲(chǔ)器,并且可將標(biāo)記值寫入額外存儲(chǔ)器中。當(dāng)調(diào)用軟件模塊稍后請(qǐng)求解除該存儲(chǔ)器的分配時(shí),緩解模塊可檢查該額外存儲(chǔ)器來查看標(biāo)記值是否仍在該存儲(chǔ)器中。如果部分或全部標(biāo)記值已被蓋寫,則緩解模塊可確定緩解動(dòng)作(分配額外存儲(chǔ)器)有效地阻止了緩存溢出引起的存儲(chǔ)器錯(cuò)誤。評(píng)估緩解動(dòng)作和其他示例性測(cè)試的有效性的進(jìn)一步細(xì)節(jié)在下文中討論。在使用緩解標(biāo)簽值的某些實(shí)現(xiàn)中,當(dāng)確定緩解動(dòng)作對(duì)特定調(diào)用軟件模塊有效時(shí),則可遞增該緩解標(biāo)簽值,且如果確定緩解動(dòng)作不是有效的或沒有任何效果時(shí),則可遞減該緩解標(biāo)簽值。在該實(shí)現(xiàn)中,緩解和緩解啟用模塊可進(jìn)一步適用于向遠(yuǎn)程計(jì)算設(shè)備發(fā)送和從遠(yuǎn)程計(jì)算設(shè)備接收關(guān)于緩解動(dòng)作阻止存儲(chǔ)器錯(cuò)誤負(fù)面地影響軟件模塊的有效性以及關(guān)于是否啟用緩解動(dòng)作的信息。例如,當(dāng)存儲(chǔ)器管理模塊檢測(cè)到調(diào)用軟件模塊崩潰時(shí),它可從記錄中確定是否檢測(cè)到任何存儲(chǔ)器錯(cuò)誤以及這些存儲(chǔ)器錯(cuò)誤中的任一個(gè)是否被緩解。它然后可將該信息發(fā)送到一個(gè)或多個(gè)其他計(jì)算設(shè)備,且作為回報(bào)可從一個(gè)或多個(gè)其他計(jì)算設(shè)備接收信息。在該示例性實(shí)現(xiàn)但非所有實(shí)現(xiàn)中,一個(gè)或多個(gè)其他計(jì)算設(shè)備可包括聚集服務(wù)器,且該聚集服務(wù)器可用作諸如Windows錯(cuò)誤報(bào)告服務(wù)等錯(cuò)誤報(bào)告服務(wù)的一部分。聚集服務(wù)器可接受來自一個(gè)或多個(gè)計(jì)算設(shè)備的錯(cuò)誤和緩解信息,并且可以將該信息發(fā)送給包括被檢測(cè)為崩潰的軟件模塊的開發(fā)者的廠商。聚集服務(wù)器還可確定緩解動(dòng)作是否在每一計(jì)算設(shè)備處成功地緩解了存儲(chǔ)器錯(cuò)誤,并且可通知計(jì)算設(shè)備是否對(duì)特定軟件模塊啟用緩解模式。在某些實(shí)現(xiàn)中,通知計(jì)算設(shè)備是否啟用緩解模式可包括發(fā)送關(guān)于緩解標(biāo)簽值的推薦初始化值,如在緩解在歷史上成功或以高比率成功時(shí)的較高值,以及在緩解在歷史上不成功或成功但僅有低比率時(shí)的較低值,但是應(yīng)理解,其他實(shí)現(xiàn)可對(duì)任何合適的配置信息操作,因?yàn)楸景l(fā)明的各實(shí)施例在這一方面不受限制。應(yīng)當(dāng)理解,盡管該示例性實(shí)施例被描述為根據(jù)此處描述的許多原理來操作,但其他實(shí)現(xiàn)可根據(jù)這些原理中的較多或較少數(shù)量的原理來操作,且并非所有實(shí)現(xiàn)都要根據(jù)此處描述的所有原理來操作。如上簡要討論的,申請(qǐng)人明白,許多不同類型的編程隱錯(cuò)會(huì)引起可諸如通過使得軟件模塊不正確地執(zhí)行或崩潰而負(fù)面地影響軟件模塊的存儲(chǔ)器錯(cuò)誤。對(duì)于上下文,這些編程隱錯(cuò)中一些最常見的隱錯(cuò)在下文中描述,但應(yīng)理解,該錯(cuò)誤列表不是可通過實(shí)現(xiàn)此處描述的某些原理來緩解的全部編程隱錯(cuò)的全面描述,且存在可使用根據(jù)這些原理中的某一些或全部操作的技術(shù)來緩解的其他隱錯(cuò)。作為第一示例,調(diào)用軟件模塊可請(qǐng)求存儲(chǔ)器管理模塊向該軟件模塊分配某一量的存儲(chǔ)器——例如,16字節(jié)——然后試圖使用多于請(qǐng)求量的存儲(chǔ)器——例如,17字節(jié)或更多。 常規(guī)的存儲(chǔ)器管理模塊不能檢測(cè)到該軟件模塊正在使用額外存儲(chǔ)器,且可將該存儲(chǔ)器分配給另一軟件模塊。如果該另一軟件模塊然后開始使用該存儲(chǔ)器,則作為在它/它們?cè)噲D使用存儲(chǔ)器時(shí)的存儲(chǔ)器錯(cuò)誤的結(jié)果,一個(gè)或兩個(gè)軟件模塊可能不正確地執(zhí)行或甚至崩潰。作為可引起存儲(chǔ)器錯(cuò)誤的編程隱錯(cuò)的第二個(gè)示例,軟件模塊可請(qǐng)求存儲(chǔ)器管理模塊向該軟件模塊分配某些存儲(chǔ)器,然后通知存儲(chǔ)器管理模塊它已經(jīng)完成了對(duì)該存儲(chǔ)器的處理,但是接著繼續(xù)使用該存儲(chǔ)器。根據(jù)存儲(chǔ)器管理模塊的記錄,該存儲(chǔ)器被釋放以分配給另一軟件模塊,并且兩個(gè)軟件模塊可試圖同時(shí)使用該存儲(chǔ)器,導(dǎo)致一個(gè)或兩個(gè)軟件模塊不正確地執(zhí)行。作為第三個(gè)示例,軟件模塊可通過通知存儲(chǔ)器管理模塊它已經(jīng)完成了對(duì)存儲(chǔ)器的處理來“釋放”已經(jīng)被分配給它的存儲(chǔ)器,然后可通過編程隱錯(cuò)再次釋放該存儲(chǔ)器。存儲(chǔ)器管理模塊可與此同時(shí)將該存儲(chǔ)器分配給另一軟件模塊,并且作為第二個(gè)不正確的釋放操作的結(jié)果,可將其分配給第三個(gè)軟件模塊。作為第一個(gè)軟件模塊中的編程隱錯(cuò)的結(jié)果,第二和第三軟件模塊中的一個(gè)或兩個(gè)然后可不正確地執(zhí)行。作為第四個(gè)示例,某些軟件模塊在退出時(shí)可能試圖釋放分配給它們的所有存儲(chǔ)器,但是可能會(huì)過早地或以其他方式不正確地這樣做,且會(huì)導(dǎo)致軟件模塊的崩潰。作為第五個(gè)示例,不同的信息可被存儲(chǔ)在不同類型的存儲(chǔ)器中,如通用地址空間、 棧存儲(chǔ)器、以及動(dòng)態(tài)或堆存儲(chǔ)器。某些指令集可通過編程隱錯(cuò)而使用錯(cuò)誤的命令來與不同類型的存儲(chǔ)器交互,如使用堆存儲(chǔ)器操作來執(zhí)行打算在通用地址空間存儲(chǔ)器上完成的操作。當(dāng)存儲(chǔ)器管理模塊使用通用地址空間存儲(chǔ)器的標(biāo)識(shí)符在堆存儲(chǔ)器上執(zhí)行操作時(shí),則它正在錯(cuò)誤的存儲(chǔ)器上操作,且使用堆存儲(chǔ)器來作出該調(diào)用或指令集的軟件模塊結(jié)果會(huì)崩潰。作為第六個(gè)示例,在減少或擴(kuò)大對(duì)指令集的存儲(chǔ)器分配的重新分配操作中,存儲(chǔ)器分配可被移至存儲(chǔ)器的另一部分,但是通過編程隱錯(cuò),該指令集會(huì)繼續(xù)引用原始位置中的存儲(chǔ)器。該指令集以及任何其他使用該原始存儲(chǔ)器的指令集因此會(huì)因隱錯(cuò)而崩潰。通過根據(jù)此處描述的原理來操作,存儲(chǔ)器管理模塊可阻止這些和其他編程隱錯(cuò)引起通過導(dǎo)致不正確執(zhí)行或甚至崩潰來負(fù)面地影響軟件模塊的存儲(chǔ)器錯(cuò)誤。對(duì)軟件模塊的負(fù)面影響可對(duì)用戶體驗(yàn)有負(fù)面影響,且緩解這些編程隱錯(cuò)的影響可顯著地改善用戶體驗(yàn)。另外,通過操作來選擇性地啟用緩解動(dòng)作并測(cè)試其有效性,這些緩解動(dòng)作的任何負(fù)面影響本身可被緩解。根據(jù)此處所描述的原理來操作的這些和其他技術(shù)的其他功能和優(yōu)點(diǎn)將從以下描述的示例中得到更完全的理解。以下示例旨在方便理解本發(fā)明并示出此處所描述的原理的好處,但不例示本發(fā)明的各實(shí)施例的全部范圍。本文描述的技術(shù)可在各種計(jì)算系統(tǒng)中實(shí)現(xiàn),這些計(jì)算系統(tǒng)的示例在下文較為詳細(xì)地描述。此類系統(tǒng)一般涉及使用適當(dāng)配置的計(jì)算設(shè)備,這些計(jì)算設(shè)備實(shí)現(xiàn)各自提供完成此類技術(shù)的執(zhí)行所需的一個(gè)或多個(gè)操作的多個(gè)功能模塊。每一個(gè)功能模塊可以按照其自己的方式來實(shí)現(xiàn);不必全都用相同方式實(shí)現(xiàn)。如此處所使用的,功能模塊是執(zhí)行執(zhí)行操作職責(zé)的系統(tǒng)的結(jié)構(gòu)組件。操作職責(zé)可以是整個(gè)軟件元素的一部分。例如,功能模塊可執(zhí)行進(jìn)程、離散進(jìn)程、或任何其他合適的處理單元的功能。功能模塊可包括計(jì)算機(jī)可執(zhí)行指令,并且可在計(jì)算機(jī)存儲(chǔ)介質(zhì)上編碼。此外,這樣的計(jì)算機(jī)可執(zhí)行指令可使用多種合適的程序設(shè)計(jì)語言和/或程序設(shè)計(jì)或腳本工具中的任何一種來編寫,而且它們還可被編譯為可執(zhí)行機(jī)器語言代碼或在框架或虛擬機(jī)上執(zhí)行的中間代碼。功能模塊可在適當(dāng)時(shí)并行或串行執(zhí)行,并且可使用在其上執(zhí)行這些模塊的計(jì)算機(jī)上的共享存儲(chǔ)器、使用消息傳遞協(xié)議、或以任何其他合適的方式,來在彼此之間傳遞信息。下文描述了執(zhí)行一項(xiàng)或多項(xiàng)任務(wù)的示例性功能模塊,但應(yīng)該理解領(lǐng)會(huì),所描述的功能模塊和任務(wù)劃分僅僅示出可實(shí)現(xiàn)本文描述的示例性技術(shù)的功能模塊的類型,并且本發(fā)明并不限于在任何特定數(shù)量、劃分、或類型的功能模塊中實(shí)現(xiàn)。在一些實(shí)現(xiàn)中,所有功能可在單個(gè)功能模塊中實(shí)現(xiàn)。此外,為清楚起見,功能模塊在下文中是作為全部在一個(gè)或兩個(gè)計(jì)算設(shè)備上執(zhí)行來討論的,但應(yīng)該理解,在一些實(shí)現(xiàn)中,功能模塊可在適用于彼此通信的許多單獨(dú)的計(jì)算設(shè)備或單個(gè)計(jì)算設(shè)備的單獨(dú)的處理器上實(shí)現(xiàn)。例如, 一個(gè)處理器可適用于執(zhí)行向存儲(chǔ)器管理模塊發(fā)出執(zhí)行存儲(chǔ)器操作的請(qǐng)求的調(diào)用軟件模塊, 而另一處理器可適用于執(zhí)行存儲(chǔ)器管理模塊。在以下描述的一些實(shí)施例中,根據(jù)此處描述的原理來操作的技術(shù)可被實(shí)現(xiàn)為在一個(gè)或多個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)上編碼的計(jì)算機(jī)可執(zhí)行指令,這些計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)諸如有磁介質(zhì)(例如,硬盤驅(qū)動(dòng)器)、諸如緊致盤(⑶)或數(shù)字多功能盤(DVD)等光介質(zhì)、持久或非持久固態(tài)存儲(chǔ)器(例如,閃存、磁RAM等)、或任何其他合適的存儲(chǔ)介質(zhì)。計(jì)算機(jī)存儲(chǔ)介質(zhì)可被實(shí)現(xiàn)為圖1和9的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)104(即,作為計(jì)算設(shè)備100的一部分)或被實(shí)現(xiàn)為單獨(dú)的計(jì)算機(jī)存儲(chǔ)介質(zhì)。應(yīng)當(dāng)理解,如此處所使用的,包括“計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)”的 “計(jì)算機(jī)可讀介質(zhì)”指的是具有可在其上記錄數(shù)據(jù)的過程期間用某種方式更改的至少一個(gè)物理結(jié)構(gòu)的有形存儲(chǔ)介質(zhì)。例如,計(jì)算機(jī)可讀介質(zhì)的物理結(jié)構(gòu)的一部分的磁化狀態(tài)可在記錄過程中更改。在一些此類實(shí)施例中,實(shí)現(xiàn)依照本文描述的原理來操作的技術(shù)的計(jì)算機(jī)可執(zhí)行指令可被實(shí)現(xiàn)為一個(gè)或多個(gè)獨(dú)立功能模塊(例如,存儲(chǔ)器管理模塊)。在此處描述的技術(shù)被具體化為計(jì)算機(jī)可執(zhí)行指令的情況下,它們可在任何合適的計(jì)算機(jī)系統(tǒng)中操作的任何合適的計(jì)算設(shè)備上執(zhí)行,包括以下圖ι和9描述的示例性計(jì)算設(shè)備。例如,根據(jù)本文討論的一些或所有原理來操作的技術(shù)可以在以下系統(tǒng)上操作單個(gè)多用途可編程數(shù)字計(jì)算機(jī)裝置、共享處理能力并聯(lián)合執(zhí)行本文描述的技術(shù)的兩個(gè)或更多多用途計(jì)算機(jī)裝置的協(xié)調(diào)系統(tǒng)、專用于執(zhí)行本文描述的技術(shù)的單個(gè)計(jì)算機(jī)裝置或計(jì)算機(jī)裝置(同處一處或在地理上分布)的協(xié)調(diào)系統(tǒng)、用于執(zhí)行本文描述的技術(shù)的一個(gè)或多個(gè)專用集成電路(ASIC)、用于執(zhí)行本文描述的技術(shù)的一個(gè)或多個(gè)現(xiàn)場(chǎng)可編程門陣列(FPGA)、或任何其他合適的系統(tǒng)。圖1示出了計(jì)算設(shè)備100形式的可用于實(shí)現(xiàn)本文描述的技術(shù)的系統(tǒng)中的計(jì)算設(shè)備的一個(gè)示例性實(shí)現(xiàn),然而其他實(shí)現(xiàn)也是可能的。此外,應(yīng)理解,圖1既不旨在是對(duì)用于依照本發(fā)明描述的原理操作的計(jì)算設(shè)備的必要組件的描繪,也不旨在是全面描繪。還應(yīng)當(dāng)理解, 其他實(shí)現(xiàn)可在任何其他合適的計(jì)算設(shè)備中操作。計(jì)算設(shè)備100可包括處理器102、計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)104和存儲(chǔ)器116。計(jì)算設(shè)備100可以是任何合適的計(jì)算設(shè)備,包括例如臺(tái)式或膝上型個(gè)人計(jì)算機(jī)、工作站、服務(wù)器、 大型機(jī)、智能電話、個(gè)人數(shù)字助理(PDA)、獨(dú)立聯(lián)網(wǎng)設(shè)備、或能夠在單個(gè)時(shí)間執(zhí)行一個(gè)或多個(gè)軟件模塊且具有可在一個(gè)或多個(gè)軟件模塊之間共享的諸如存儲(chǔ)器等一個(gè)或多個(gè)資源的任何其他合適的計(jì)算設(shè)備。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)104可以是適用于存儲(chǔ)要由處理器102處理的數(shù)據(jù)和/或要由處理器902執(zhí)行的指令的任何合適的有形存儲(chǔ)介質(zhì)。處理器102能夠處理數(shù)據(jù)和執(zhí)行指令。這些數(shù)據(jù)和指令可被存儲(chǔ)在計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)104上,并且例如可以啟用計(jì)算設(shè)備100的各組件之間的通信。存儲(chǔ)在計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)104上的數(shù)據(jù)和指令可包括實(shí)現(xiàn)根據(jù)本文描述的原理操作的技術(shù)的計(jì)算機(jī)可執(zhí)行指令。在圖1的示例中,如上所述,計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)104 存儲(chǔ)實(shí)現(xiàn)各種模塊并存儲(chǔ)各種信息的計(jì)算機(jī)可執(zhí)行指令。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)104存儲(chǔ)與可在計(jì)算設(shè)備上執(zhí)行的一個(gè)或多個(gè)軟件模塊106以及可支配計(jì)算設(shè)備100上的進(jìn)程的執(zhí)行
13并調(diào)節(jié)諸如存儲(chǔ)器116等共享資源的使用的操作系統(tǒng)108相關(guān)的數(shù)據(jù)和指令。為了調(diào)節(jié)對(duì)存儲(chǔ)器的使用,操作系統(tǒng)108可具有用于執(zhí)行調(diào)用軟件模塊所請(qǐng)求的存儲(chǔ)器操作的存儲(chǔ)器管理模塊110。調(diào)用軟件模塊可以是軟件應(yīng)用程序106、操作系統(tǒng)108 的其他組件、或在計(jì)算設(shè)備100上執(zhí)行的任何其他軟件元件。存儲(chǔ)器管理模塊110可以用任何合適的方式來實(shí)現(xiàn)以執(zhí)行常規(guī)存儲(chǔ)器管理技術(shù)以及此處描述的一種或多種技術(shù)。如上所述,在此處描述的技術(shù)的某些實(shí)現(xiàn)中,存儲(chǔ)器管理模塊110可包括緩解模塊112,緩解模塊112可用于在調(diào)用軟件模塊請(qǐng)求存儲(chǔ)器操作時(shí)執(zhí)行一個(gè)或多個(gè)緩解動(dòng)作。緩解模塊112 可以對(duì)每一調(diào)用軟件模塊選擇性地應(yīng)用,使得緩解動(dòng)作僅對(duì)被檢測(cè)為需要緩解動(dòng)作的軟件模塊執(zhí)行。因此,為了在這些實(shí)現(xiàn)中執(zhí)行檢測(cè)和啟用,操作系統(tǒng)108還可包括用于監(jiān)視計(jì)算設(shè)備100中的軟件模塊的執(zhí)行的緩解啟用模塊114。然而,在替換實(shí)現(xiàn)中,緩解模塊可諸如由計(jì)算設(shè)備900的管理員來手動(dòng)啟用或禁用,并且在此類實(shí)現(xiàn)中可以不提供緩解啟用模塊。圖1所示的模塊,包括緩解模塊112和緩解啟用模塊114,可適用于根據(jù)此處描述的原理以任何合適的方式操作,包括通過以下描述的示例性技術(shù)中的任一種來操作。應(yīng)當(dāng)理解,圖1所示的實(shí)現(xiàn)僅是可實(shí)現(xiàn)此處描述的原理的不同方式的示例。在替換實(shí)現(xiàn)中,緩解模塊和緩解啟用模塊可被實(shí)現(xiàn)為與操作系統(tǒng)分開的組件,或者可被實(shí)現(xiàn)為操作系統(tǒng)內(nèi)的單個(gè)組件,或以任何其他合適的方式來實(shí)現(xiàn),因?yàn)楸景l(fā)明的各實(shí)施例不限于被實(shí)現(xiàn)為任何特定模塊或模塊集。常規(guī)存儲(chǔ)器管理模塊和根據(jù)圖1所示的實(shí)現(xiàn)來操作的存儲(chǔ)器管理模塊之間的區(qū)別在圖2A和2B中示出。在圖2A中,示出多個(gè)調(diào)用軟件模塊200向操作系統(tǒng)API和存儲(chǔ)器管理模塊206發(fā)出操作請(qǐng)求202和204,包括執(zhí)行存儲(chǔ)器操作的請(qǐng)求。這些操作如所請(qǐng)求地被執(zhí)行,并且任何合適的信息被返回給調(diào)用軟件模塊。沒有緩解動(dòng)作可用,且不執(zhí)行對(duì)調(diào)用軟件應(yīng)用程序的監(jiān)視,使得這些軟件模塊容易受到因包括上述隱錯(cuò)在內(nèi)的編程隱錯(cuò)引起的存儲(chǔ)器錯(cuò)誤的影響。在圖2B中,示出了圖1的示例性實(shí)現(xiàn),且緩解模塊112被實(shí)現(xiàn)為操作系統(tǒng)的組件。 在該實(shí)現(xiàn)中,調(diào)用軟件模塊200向操作系統(tǒng)和存儲(chǔ)器管理模塊206發(fā)出相同的操作請(qǐng)求202 和204,因?yàn)樵谒緦?shí)施例中,這些軟件模塊不知道緩解模塊112以及是否對(duì)特定的調(diào)用軟件模塊實(shí)現(xiàn)了緩解模塊。如上所討論且如圖2B中所示,緩解模塊112可對(duì)每一調(diào)用軟件模塊選擇性地應(yīng)用來執(zhí)行一個(gè)或多個(gè)緩解動(dòng)作,且因此,調(diào)用軟件模塊200所發(fā)出的操作請(qǐng)求中的某一些(不一定是全部)被緩解模塊112截取。為了確定是否應(yīng)對(duì)特定調(diào)用軟件模塊啟用緩解模塊112,緩解啟用模塊114與存儲(chǔ)器管理單元110和緩解模塊112、以及調(diào)用軟件模塊200進(jìn)行通信。在檢測(cè)到調(diào)用軟件應(yīng)用程序已經(jīng)發(fā)送了執(zhí)行存儲(chǔ)器操作的請(qǐng)求之后,緩解啟用模塊114可以審閱存儲(chǔ)在與緩解啟用模塊114相關(guān)聯(lián)的緩解數(shù)據(jù)存儲(chǔ)212中的信息,來確定在執(zhí)行所請(qǐng)求的存儲(chǔ)器操作時(shí)緩解模塊是否應(yīng)以緩解模式操作。這也可被認(rèn)為是與存儲(chǔ)器管理模塊110相關(guān)聯(lián)的數(shù)據(jù)存儲(chǔ),因?yàn)樗S護(hù)與存儲(chǔ)器管理模塊110的操作相關(guān)的信息,且在上述的某些實(shí)現(xiàn)中,在緩解啟用模塊114被實(shí)現(xiàn)為存儲(chǔ)器管理模塊110的一部分時(shí)可以是存儲(chǔ)器管理模塊110的一部分。審閱存儲(chǔ)在數(shù)據(jù)存儲(chǔ)212中的信息可包括任何合適的動(dòng)作,包括審閱事件日志216以及規(guī)則與設(shè)置218。數(shù)據(jù)存儲(chǔ)212可按持久方式來存儲(chǔ),從而如果緩解啟用模塊114被禁用或關(guān)閉,當(dāng)它稍后被重新啟用時(shí),它將能夠訪問先前收集的信息,包括關(guān)于先前作出的決策的信息。數(shù)據(jù)存儲(chǔ)212可存儲(chǔ)事件日志216,該事件日志包括關(guān)于調(diào)用軟件模塊200經(jīng)歷的存儲(chǔ)器錯(cuò)誤、被檢測(cè)為被緩解的存儲(chǔ)器錯(cuò)誤、以及被請(qǐng)求執(zhí)行的存儲(chǔ)器操作的信息。事件日志216中的每一條目可包括任何合適的信息,包括裝桶(bucketing)參數(shù),如軟件模塊的名稱、軟件模塊的版本、在錯(cuò)誤的時(shí)候軟件模塊的什么庫或部分正被執(zhí)行、在執(zhí)行中的哪一點(diǎn)檢測(cè)到錯(cuò)誤、以及描述錯(cuò)誤的異常代碼,以及任何其他合適的信息。規(guī)則與設(shè)置18可存儲(chǔ)關(guān)于一個(gè)或多個(gè)調(diào)用軟件模塊200的任何合適的信息,以及關(guān)于通用緩解策略的信息。圖 2C示出了可被存儲(chǔ)在規(guī)則與設(shè)置218中的信息的一個(gè)示例。規(guī)則與設(shè)置218可包括對(duì)應(yīng)于多個(gè)調(diào)用軟件模塊200中的每一個(gè)(包括對(duì)應(yīng)于調(diào)用軟件模塊的每一標(biāo)識(shí)符,其可以是應(yīng)用程序標(biāo)識(shí)符)的條目,可在確定是否應(yīng)對(duì)調(diào)用軟件模塊啟用緩解模式時(shí)使用的一個(gè)或多個(gè)值,以及如果是則要啟用緩解的時(shí)間??稍诖_定是否應(yīng)啟用緩解模式時(shí)使用的一個(gè)或多個(gè)值可以是任何合適的值,包括可被收集的、關(guān)于跨調(diào)用軟件模塊所關(guān)聯(lián)的應(yīng)用程序的一個(gè)或多個(gè)實(shí)例軟件模塊所經(jīng)歷的錯(cuò)誤和/或所檢測(cè)的緩解動(dòng)作的成功的一個(gè)或多個(gè)統(tǒng)計(jì)數(shù)據(jù)。這些統(tǒng)計(jì)數(shù)據(jù)可采取任何合適的形式。在某些實(shí)現(xiàn)中,統(tǒng)計(jì)數(shù)據(jù)可采取緩解標(biāo)簽值的形式,該標(biāo)簽值在檢測(cè)到成功的情況下可遞增,且在檢測(cè)到錯(cuò)誤的情況下遞減。緩解標(biāo)簽值然后可以與諸如閾值等其他統(tǒng)計(jì)值進(jìn)行比較,來確定是否應(yīng)對(duì)應(yīng)用程序的后續(xù)實(shí)例啟用緩解模式。然而,應(yīng)當(dāng)理解,統(tǒng)計(jì)數(shù)據(jù)僅是可被存儲(chǔ)在規(guī)則與設(shè)置218中的值的類型的一個(gè)示例,且緩解標(biāo)簽值僅是可被存儲(chǔ)的統(tǒng)計(jì)數(shù)據(jù)的類型的一個(gè)示例。緩解啟用模塊114可以用任何合適的方式,包括通過以下討論的示例性技術(shù)中的任一種,審閱該信息來確定是否對(duì)特定軟件模塊啟用緩解模式。為了提供用于確定是否對(duì)特定軟件模塊啟用緩解模式的示例性技術(shù)的討論的上下文,首先描述當(dāng)緩解模塊112處于緩解模式時(shí)的緩解模塊112的操作的示例性技術(shù)。包括以上概括描述以及以下更具體描述的示例在內(nèi)的緩解動(dòng)作可以用任何合適的方式來執(zhí)行, 并且實(shí)現(xiàn)這些緩解動(dòng)作的緩解模式可以用任何合適的方式來執(zhí)行。圖3示出了其中緩解模塊112可以以由本發(fā)明的各實(shí)施例實(shí)現(xiàn)的緩解模式操作的方式的一個(gè)示例,該緩解模塊選擇性地以緩解模式操作存儲(chǔ)器管理模塊,但是其他方式也是可能的,根據(jù)此處描述的原理, 存儲(chǔ)器管理模塊可以用任何合適的方式來實(shí)現(xiàn),包括不以兩種不同模式操作。圖3的說明性過程300在框302開始,在那里調(diào)用軟件模塊發(fā)出要存儲(chǔ)器管理模塊110執(zhí)行存儲(chǔ)器操作的請(qǐng)求。在框304,對(duì)發(fā)出請(qǐng)求的特定調(diào)用軟件模塊確定存儲(chǔ)器管理模塊110是否應(yīng)以緩解模式操作來執(zhí)行一個(gè)或多個(gè)緩解動(dòng)作(在以下的某些情況下,為簡明起見,這可被描述為軟件模塊是否以緩解模式操作,但應(yīng)理解,這樣做純粹是為了方便描述,并且較佳地,軟件模塊不知道緩解模塊以及緩解模塊操作的模式)。如果確定存儲(chǔ)器管理模塊110應(yīng)以緩解模式操作,則啟用緩解模塊112,并且在框306,接收?qǐng)?zhí)行存儲(chǔ)器操作的請(qǐng)求。在框306中接收到該請(qǐng)求之后,緩解模塊112和存儲(chǔ)器管理模塊110可根據(jù)緩解動(dòng)作來執(zhí)行存儲(chǔ)器操作。在某些實(shí)現(xiàn)中,這可包括執(zhí)行單個(gè)動(dòng)作或可包括執(zhí)行許多動(dòng)作。在圖3的圖示中,為清楚起見,根據(jù)緩解動(dòng)作執(zhí)行存儲(chǔ)器操作被示為四個(gè)單獨(dú)的操作,但是應(yīng)理解,這僅是為了方便可視化,且根據(jù)圖3操作的技術(shù)可以不完全如圖所示那樣來實(shí)現(xiàn)。在框308,緩解模塊112至少基于所請(qǐng)求的存儲(chǔ)器操作的類型以及該操作的輸入?yún)?shù)來確定其是否適用于執(zhí)行任何緩解動(dòng)作??梢赃@樣做是因?yàn)樵谀承?shí)現(xiàn)中,緩解模塊 112可能僅被配置成緩解因一組一個(gè)或多個(gè)存儲(chǔ)器操作而導(dǎo)致的一種或多種類型的存儲(chǔ)器錯(cuò)誤,且因此可能沒有其可以對(duì)特定存儲(chǔ)器操作執(zhí)行的緩解動(dòng)作。在某些替換實(shí)現(xiàn)中,可以實(shí)現(xiàn)適用于對(duì)所有類型的存儲(chǔ)器操作執(zhí)行緩解動(dòng)作的存儲(chǔ)器管理模塊112,因此可以不實(shí)現(xiàn)具有判定框308的過程。如果在框308確定有至少一個(gè)緩解動(dòng)作可用,則在框310執(zhí)行該緩解動(dòng)作,這可包括將該緩解動(dòng)作應(yīng)用于該操作。將緩解動(dòng)作應(yīng)用于存儲(chǔ)器操作可包括任何合適的過程,包括以下詳細(xì)討論的過程中的任一個(gè)。例如,應(yīng)用緩解動(dòng)作可包括評(píng)估存儲(chǔ)器操作,如確定該操作的輸入?yún)?shù)是否正確;調(diào)整存儲(chǔ)器操作的參數(shù),如增加所請(qǐng)求的存儲(chǔ)器的量;等待執(zhí)行存儲(chǔ)器操作直到稍后的時(shí)間;或不執(zhí)行存儲(chǔ)器操作。在框312,在應(yīng)用了緩解動(dòng)作之后, 確定是否仍要執(zhí)行該存儲(chǔ)器操作。如果是,則在框314,執(zhí)行緩解動(dòng)作,且過程300結(jié)束。然而,如果在框312確定不要執(zhí)行該存儲(chǔ)器操作——例如,如果緩解動(dòng)作不執(zhí)行存儲(chǔ)器操作, 或者如果確定輸入?yún)?shù)不正確——?jiǎng)t過程300也結(jié)束。返回到框304,如果確定存儲(chǔ)器管理模塊110不應(yīng)以緩解模式操作,或者如果在框 308確定沒有緩解動(dòng)作可用,則在框316,如所請(qǐng)求地執(zhí)行存儲(chǔ)器操作,且過程300結(jié)束???316處的執(zhí)行可以如在常規(guī)存儲(chǔ)器管理器中的那樣,但可使用任何合適的執(zhí)行方法。圖4A、4B、4C和4D示出了可由緩解模塊112采取來執(zhí)行諸如圖3的框310所示的至少一個(gè)緩解動(dòng)作的四個(gè)不同過程。應(yīng)當(dāng)理解,這些過程僅說明了可被實(shí)現(xiàn)來執(zhí)行這些緩解動(dòng)作的過程的類型,并且這些緩解動(dòng)作僅是可由緩解模塊112執(zhí)行的緩解動(dòng)作的類型的示例。這一緩解動(dòng)作的第一示例在圖4A的過程400A中示出。過程400A在框402開始, 在那里確定調(diào)用軟件模塊所請(qǐng)求的存儲(chǔ)器操作是否是分配操作;即,請(qǐng)求將一定量的存儲(chǔ)器分配給調(diào)用軟件模塊,使得該軟件模塊可在一段時(shí)間內(nèi)存儲(chǔ)一定量的數(shù)據(jù)。如果否,則過程400A結(jié)束。然而,如果所請(qǐng)求的存儲(chǔ)器操作是對(duì)一定量的存儲(chǔ)器的分配操作,則在框 404,采取緩解動(dòng)作來增加所分配的存儲(chǔ)器的量。在某些實(shí)施例中,該較大的存儲(chǔ)器量可以取決于所請(qǐng)求的存儲(chǔ)器的大小;例如,是所請(qǐng)求的存儲(chǔ)器的兩倍。在另一實(shí)現(xiàn)中,額外存儲(chǔ)器可以是用于給定計(jì)算設(shè)備的固定量的存儲(chǔ)器;例如,對(duì)于32位處理器,額外的所分配的存儲(chǔ)器可以是32字節(jié)(即,如果請(qǐng)求了四個(gè)字節(jié),則總的分配將是36字節(jié)),且對(duì)于64位處理器,該額外的所分配的存儲(chǔ)器可以是48字節(jié)。在框404可以分配任何合適量的額外存儲(chǔ)器。在框406,然后通過在其中存儲(chǔ)標(biāo)記值來將該額外存儲(chǔ)器“標(biāo)記”為額外存儲(chǔ)器。 該標(biāo)記值可以是任何合適的值,并且可以是對(duì)每一存儲(chǔ)器單元(如對(duì)每一存儲(chǔ)器塊)存儲(chǔ)的重復(fù)值,或者是跨額外的所分配的存儲(chǔ)器的整個(gè)空間寫入的單個(gè)值或值模式。該標(biāo)記值可以是可以如下所討論的用作評(píng)估的一部分來確定緩解動(dòng)作是否成功地緩解了存儲(chǔ)器錯(cuò)誤的任何合適的值。例如,如果稍后審閱該額外存儲(chǔ)器且確定標(biāo)記值已被蓋寫,則可以確定軟件模塊遭受引起緩存溢出錯(cuò)誤的編程隱錯(cuò)——意味著寫入了大于請(qǐng)求量的數(shù)據(jù)——并且額外分配通過分配額外的空間緩解了存儲(chǔ)器錯(cuò)誤。在寫入了標(biāo)記值之后,則過程400A結(jié)束ο圖4B示出了用于根據(jù)此處描述的某些原理來執(zhí)行緩解動(dòng)作的第二示例性過程400B。過程400B在框410開始,在那里確定所請(qǐng)求的存儲(chǔ)器操作是否是重新分配操作,其中調(diào)用軟件模塊正在尋求增加或減少先前分配的存儲(chǔ)器的量。如果不是重新分配操作,則過程400B結(jié)束。然而,如果存儲(chǔ)器操作是重新分配操作,則在框412,確定該請(qǐng)求是否是針對(duì)減少存儲(chǔ)器分配的。如果是,則在框414,在解除來自原始分配的剩余存儲(chǔ)器的分配時(shí)將分配保持在相同的根位置中。在框416,存儲(chǔ)器管理模塊110不立即釋放剩余的存儲(chǔ)器,而是等待直到一等待時(shí)間段之后。在框414,可將如上所述的標(biāo)記添加到要釋放的存儲(chǔ)器。當(dāng)存儲(chǔ)器實(shí)際被釋放時(shí),可檢查這些標(biāo)記來查明是否存取了旨在不被使用的存儲(chǔ)器。過程400B隨后結(jié)束。如果在框412確定所請(qǐng)求的重新分配是針對(duì)更大量的存儲(chǔ)器的,則在框418,確定是否有足夠的、與原始分配直接相鄰的空閑存儲(chǔ)器,使得可以從該直接相鄰存儲(chǔ)器分配所請(qǐng)求的新存儲(chǔ)器并且可為該數(shù)據(jù)保持原始位置。如果是,則在框420,完成將來自原始分配的數(shù)據(jù)保持在相同的位置中,從該位置擴(kuò)大分配,并且該過程結(jié)束。然而,如果沒有足夠的直接相鄰的存儲(chǔ)器,則在框422將分配移至存儲(chǔ)器的另一部分中的較大空間,并且在框4M不解除原始存儲(chǔ)器的分配,直到一等待時(shí)間段之后。如上所述,先前分配且不應(yīng)再被使用的存儲(chǔ)器可用標(biāo)記來填充,以便可檢測(cè)引起對(duì)該存儲(chǔ)器的存取的隱錯(cuò)。該過程隨后結(jié)束。該緩解可用于緩解遭受導(dǎo)致軟件模塊在其中存儲(chǔ)器分配被移至存儲(chǔ)器的不同部分的重新分配操作之后繼續(xù)使用原始存儲(chǔ)器空間的編程隱錯(cuò)的軟件模塊中的存儲(chǔ)器錯(cuò)誤。 通過試圖將存儲(chǔ)器分配保持在相同位置且不允許其他軟件模塊使用存儲(chǔ)器塊直到一等待時(shí)間段之后,這些編程隱錯(cuò)的影響可被緩解,因?yàn)檐浖K直到等待時(shí)間段到期之后才能使用原始分配。圖4C示出了另一示例性過程400C。過程400C在框430開始,在那里確定所請(qǐng)求的操作是否是解除分配,即“釋放”操作。如果否,則過程400C結(jié)束。然而,如果所請(qǐng)求的存儲(chǔ)器操作是釋放操作,則在框432,確定釋放操作的輸入?yún)?shù)是否正確。例如,如果存儲(chǔ)器管理模塊112是管理堆存儲(chǔ)器的分配的模塊,則在框432可以確定請(qǐng)求釋放的存儲(chǔ)器的地址是否是正確分配的堆存儲(chǔ)器而非棧存儲(chǔ)器或全局變量空間的地址。這可以按任何合適的方式完成。例如,緩解模塊112可以通過將“釋放”操作的輸入地址與堆的地址范圍進(jìn)行比較來確定該地址所引用的存儲(chǔ)器是否是堆存儲(chǔ)器;如果否,則該輸入地址可能是不正確的。作為另一示例,存儲(chǔ)器管理器在分配了堆中的存儲(chǔ)器塊之后可用標(biāo)記來為該塊加上標(biāo)簽。如果緩解模塊112被實(shí)現(xiàn)為執(zhí)行圖4A的過程400A,則任何正確分配的堆存儲(chǔ)器將會(huì)在額外存儲(chǔ)器中存儲(chǔ)了標(biāo)記值。通過檢查這些標(biāo)記值的存在,緩解模塊112可確定存儲(chǔ)器已被存儲(chǔ)器管理模塊110正確地分配,且因此輸入?yún)?shù)是正確的。如果在框432以任何方式確定參數(shù)是正確的,則在框434,可在等待時(shí)間段之后執(zhí)行所請(qǐng)求的釋放操作,且過程400C結(jié)束。 如上所述,在緩解模式中,“釋放的”存儲(chǔ)器可能無法直接可供使用。相反,可以用標(biāo)記值來填充該存儲(chǔ)器以便允許檢測(cè)對(duì)該存儲(chǔ)器的非預(yù)期存取。然而,如果參數(shù)是不正確的,則在框 436,可忽略該操作,或者可生成錯(cuò)誤消息并將其發(fā)回到調(diào)用軟件模塊,且該過程結(jié)束。在忽略操作時(shí),可存儲(chǔ)緩解成功地阻止了隱錯(cuò)創(chuàng)建錯(cuò)誤的指示。這一所存儲(chǔ)的指示可如下所述
17地用于確定是否繼續(xù)向調(diào)用軟件模塊應(yīng)用緩解400C。圖4D示出了可由緩解模塊112實(shí)現(xiàn)來執(zhí)行一個(gè)或多個(gè)緩解動(dòng)作的過程的另一個(gè)示例。在圖4D的過程400D中,首先在框440確定所請(qǐng)求的存儲(chǔ)器操作是否是解除分配,即 “釋放”操作。如果否,則過程400D結(jié)束。然而,如果所請(qǐng)求的存儲(chǔ)器操作是釋放操作,則在框442,確定該釋放操作是否是“雙重釋放”——即,確定該釋放操作是否因調(diào)用軟件模塊中的編程隱錯(cuò)而是先前的釋放操作的重復(fù)。這可用任何合適的方式來完成,包括通過確定請(qǐng)求釋放的存儲(chǔ)器是否仍未被執(zhí)行,因?yàn)槠淙栽谧郧耙徽?qǐng)求起的等待時(shí)間段內(nèi)。該等待時(shí)間段內(nèi)的存儲(chǔ)器可被標(biāo)識(shí)為包含如上所述的標(biāo)記值,或者通過存儲(chǔ)“釋放的”存儲(chǔ)器塊的記錄或以任何其他合適的方式來標(biāo)識(shí)。如果是重復(fù),則在框444,忽略該操作。如果不是重復(fù),則在框446,確定釋放操作是否與調(diào)用軟件模塊的退出相關(guān)聯(lián),因?yàn)檎{(diào)用軟件試圖在退出期間清除其所分配的存儲(chǔ)器。這可以按任何合適的方式完成。如果是,則在框444,忽略且不執(zhí)行所請(qǐng)求的操作。這可以出于兩個(gè)原因來完成。首先,研究顯示諸如用戶應(yīng)用程序等許多調(diào)用軟件模塊在關(guān)閉期間不正確地釋放存儲(chǔ)器,導(dǎo)致在關(guān)閉期間經(jīng)歷的30%的存儲(chǔ)器錯(cuò)誤。第二,許多操作系統(tǒng)108和存儲(chǔ)器管理模塊110已經(jīng)有了在調(diào)用軟件模塊退出時(shí)的自動(dòng)釋放操作,因此調(diào)用軟件模塊所做出的釋放操作請(qǐng)求可被認(rèn)為是重復(fù)。如果在框444作為框442或446的任一個(gè)中的判定的結(jié)果忽略該操作,則過程400D結(jié)束。然而,如果所請(qǐng)求的存儲(chǔ)器操作在框446被確定為不是退出操作時(shí)的釋放,則在框448,在等待時(shí)間段之后執(zhí)行該釋放操作。可以這樣做來防止可在調(diào)用軟件模塊因編程隱錯(cuò)而釋放存儲(chǔ)器然后在釋放之后仍使用該存儲(chǔ)器時(shí)所引發(fā)的存儲(chǔ)器錯(cuò)誤。通過直到等待時(shí)間段之后才執(zhí)行釋放操作,能緩解可因存儲(chǔ)器在釋放之后被立即重新分配給另一軟件模塊而導(dǎo)致的存儲(chǔ)器錯(cuò)誤的影響,在這種存儲(chǔ)器錯(cuò)誤的情況下,原始軟件模塊和新軟件模塊然后兩者都會(huì)使用該存儲(chǔ)器且各自蓋寫對(duì)方所保存的數(shù)據(jù)。一旦在等待時(shí)間段之后執(zhí)行了存儲(chǔ)器操作,則過程400D結(jié)束。在等待時(shí)間段之后執(zhí)行釋放操作可以用任何合適的方式來完成。例如,該等待時(shí)間段可以是一設(shè)定的時(shí)間段,如幾秒。該等待時(shí)間段也可以是靈活的時(shí)間段,如基于所請(qǐng)求的分配和釋放操作的次數(shù),如當(dāng)存在對(duì)存儲(chǔ)器的較低需求時(shí)該時(shí)間段較長,而當(dāng)存在對(duì)存儲(chǔ)器的較高需求時(shí)該時(shí)間段較短。另一可能的實(shí)現(xiàn)是等待直到應(yīng)用程序終止之后,使得在進(jìn)程終止時(shí),解除該進(jìn)程內(nèi)使用的存儲(chǔ)器的分配的操作系統(tǒng)的部分實(shí)際釋放該存儲(chǔ)器。以此方式,應(yīng)用程序終止,且該應(yīng)用程序在其中執(zhí)行的進(jìn)程也終止,存儲(chǔ)器最終可被釋放。在其他實(shí)現(xiàn)中,該等待時(shí)間段可以完全不是設(shè)定的時(shí)間段,而是因?qū)⑨尫挪僮髦糜陉?duì)列中以便在其到達(dá)該隊(duì)列的頂部時(shí)執(zhí)行而得到的非預(yù)定時(shí)間段。這一實(shí)現(xiàn)的一個(gè)示例在圖5中示出,但應(yīng)當(dāng)理解,其他實(shí)現(xiàn)是可能的。圖5的過程500在框502開始,在那里確定釋放的存儲(chǔ)器高速緩存的大小。這可以用任何合適的方式來確定,如通過選擇總存儲(chǔ)器空間的百分比,或通過接受來自計(jì)算設(shè)備的用戶或管理員的輸入。例如,所釋放的存儲(chǔ)器高速緩存可以是8兆字節(jié)(8MB)。在框 506,緩解模塊112接收用于執(zhí)行釋放操作的請(qǐng)求。在框508,將請(qǐng)求釋放的存儲(chǔ)器添加到高速緩存,這意味著將釋放操作中的存儲(chǔ)器量添加到高速緩存總量。當(dāng)將存儲(chǔ)器添加到高速緩存時(shí),也向進(jìn)程隊(duì)列添加要執(zhí)行的操作的指示,指示請(qǐng)求了該操作。應(yīng)當(dāng)理解,當(dāng)該存儲(chǔ)器在“高速緩存”中時(shí),該存儲(chǔ)器被維護(hù)為被分配給調(diào)用軟件模塊,因?yàn)樵谠搶?shí)現(xiàn)中,該高速緩存被維護(hù)為請(qǐng)求釋放但尚未釋放的存儲(chǔ)器量的指示符。在框510,在將存儲(chǔ)器添加到高速緩存之后,確定尚未釋放的存儲(chǔ)器量是否達(dá)到或超過了高速緩存的大小。如果否,則過程500返回到框506,在那里它接收釋放存儲(chǔ)器的另一指令。如果達(dá)到或超過了高速緩存限制,則在框512,至少將隊(duì)列頂部的操作彈出并執(zhí)行,從而釋放與最早延遲的釋放操作相關(guān)聯(lián)的存儲(chǔ)器并將分配給高速緩存的存儲(chǔ)器的大小減小到該限制以下。應(yīng)當(dāng)理解,在某些情況下,為了再一次將高速緩存的大小返回到限制以下,可要求執(zhí)行來自隊(duì)列的兩個(gè)或更多操作,但是該原理與圖5所示的相同。一旦執(zhí)行了隊(duì)列中的第一個(gè)操作并將其從隊(duì)列中移除,則過程500的流程返回到框506,在那里接收?qǐng)?zhí)行釋放操作的另一指令。以上描述了具有緩解模式的存儲(chǔ)器管理模塊110的若干示例性實(shí)現(xiàn),在緩解模式中,緩解模塊112使用一個(gè)或多個(gè)緩解動(dòng)作來降低存儲(chǔ)器錯(cuò)誤負(fù)面地影響軟件模塊的可能性。如下所述,這些緩解可基于緩解是否可能減少每一應(yīng)用程序中的錯(cuò)誤而在逐個(gè)應(yīng)用程序的基礎(chǔ)上選擇性地應(yīng)用??擅枋鲇糜谶x擇性地啟用緩解模式且評(píng)估緩解動(dòng)作的有效性的緩解啟用模塊114的示例性實(shí)現(xiàn)。然而,應(yīng)當(dāng)理解,緩解啟用模塊114可以用任何合適的方式來實(shí)現(xiàn),包括作為緩解模塊112的組件,因?yàn)楸景l(fā)明的各實(shí)施例在這一方面不受限制。圖6示出了根據(jù)此處描述的原理的一個(gè)這樣的示例性實(shí)現(xiàn)。圖6的過程600在框 602開始,在那里緩解啟用模塊114檢測(cè)調(diào)用軟件模塊經(jīng)歷了錯(cuò)誤。該檢測(cè)可以用任何合適的方式來執(zhí)行,如通過檢測(cè)軟件模塊崩潰或以其他方式不正確地執(zhí)行。在框604,讀取與錯(cuò)誤相關(guān)聯(lián)的錯(cuò)誤代碼,并且在框606,確定其是否是存儲(chǔ)器錯(cuò)誤。如果不是存儲(chǔ)器錯(cuò)誤,則過程600結(jié)束。然而,如果是存儲(chǔ)器錯(cuò)誤,則過程600繼續(xù)到框608,在那里如通過對(duì)數(shù)據(jù)存儲(chǔ)212 中的規(guī)則與設(shè)置記錄218創(chuàng)建或編輯條目并將關(guān)于錯(cuò)誤事件的信息寫入事件日志216來對(duì)該特定調(diào)用軟件模塊啟用緩解模式。在某些實(shí)現(xiàn)中,緩解模式可以在首次檢測(cè)到存儲(chǔ)器錯(cuò)誤時(shí)啟用,而在替換實(shí)現(xiàn)中,在應(yīng)用緩解模式之前必須達(dá)到閾值數(shù)量的存儲(chǔ)器錯(cuò)誤或在某一時(shí)間幀內(nèi)達(dá)到閾值數(shù)量的存儲(chǔ)器錯(cuò)誤,如一小時(shí)內(nèi)四次。根據(jù)此處描述的原理可以實(shí)現(xiàn)用于啟動(dòng)緩解模式的任何合適的測(cè)試。在框610,在軟件模塊請(qǐng)求且存儲(chǔ)器管理模塊的緩解模塊114執(zhí)行操作時(shí),緩解啟用模塊114隨時(shí)間跟蹤緩解動(dòng)作的成功。跟蹤成功可用任何合適的方式來完成,包括通過上述技術(shù)中的任一種。在某些實(shí)現(xiàn)中,這可包括編譯關(guān)于所檢測(cè)到的軟件模塊經(jīng)歷的錯(cuò)誤和/或所檢測(cè)到的緩解動(dòng)作在阻止存儲(chǔ)器錯(cuò)誤負(fù)面地影響軟件模塊方面的成功的統(tǒng)計(jì)數(shù)據(jù)。這些統(tǒng)計(jì)數(shù)據(jù)可對(duì)與應(yīng)用程序相關(guān)的軟件模塊的一具體實(shí)例來編譯,或者可隨時(shí)間跨軟件模塊的多個(gè)實(shí)例來收集。在某些實(shí)現(xiàn)中,該統(tǒng)計(jì)數(shù)據(jù)可包括緩解標(biāo)簽值,或者可跟蹤成功和其中應(yīng)用程序在沒有成功的緩解的情況下執(zhí)行的實(shí)例的其他機(jī)制。作為一具體示例, 緩解標(biāo)簽值可以在緩解動(dòng)作被檢測(cè)為成功時(shí)遞增,且在應(yīng)用程序在沒有成功緩解的情況下終止時(shí)遞減。在沒有成功緩解的情況下終止可以僅基于從應(yīng)用程序的“干凈”退出確定。然而,可應(yīng)用關(guān)于無成功緩解的其他度量,如是否檢測(cè)到錯(cuò)誤或崩潰影響了軟件模塊,或者在對(duì)應(yīng)用程序的具體實(shí)例沒有成功緩解的情況下。在框612,使用在框610的跟蹤期間收集的信息來確定緩解動(dòng)作是否成功地緩解了錯(cuò)誤。在使用諸如緩解標(biāo)簽值等統(tǒng)計(jì)數(shù)據(jù)的實(shí)現(xiàn)中,這可包括確定該統(tǒng)計(jì)數(shù)據(jù)是否指示成功在特定閾值水平之上或者錯(cuò)誤在特定閾值水平之下——如通過確定緩解標(biāo)簽值是否在特定閾值之上——但這可用任何合適的方式來完成。如果緩解動(dòng)作成功地緩解了錯(cuò)誤, 則在框614,可對(duì)該軟件模塊維持緩解模式,但是如果緩解動(dòng)作不成功,則在框616對(duì)該軟件模塊禁用緩解模式。在框616或616之后,過程600結(jié)束。應(yīng)當(dāng)理解,圖6的過程600僅是可由緩解啟用模塊114根據(jù)此處描述的原理來實(shí)現(xiàn)的技術(shù)的類型的示例,其他技術(shù)也是可能的。例如,盡管檢測(cè)錯(cuò)誤和評(píng)估錯(cuò)誤代碼在圖6 中被描述為是緩解啟用模塊114的責(zé)任,但在某些替換實(shí)現(xiàn)中,這些功能可由操作系統(tǒng)108 的另一模塊來執(zhí)行,如微軟Windows操作系統(tǒng)的Windows診斷基礎(chǔ)結(jié)構(gòu)(WDI),且緩解啟用模塊114可監(jiān)視WDI模塊來確定何時(shí)檢測(cè)到存儲(chǔ)器錯(cuò)誤,或當(dāng)檢測(cè)到存儲(chǔ)器錯(cuò)誤時(shí)由WDI 模塊通知。此外,緩解模式被描述為基于框612中對(duì)緩解動(dòng)作是否成功地緩解了錯(cuò)誤的判定來啟用或禁用。在某些實(shí)現(xiàn)中,緩解啟用模塊114可另外地或另選地基于其他因素來啟用 /禁用緩解模式,如其存儲(chǔ)器操作以緩解模式執(zhí)行的軟件模塊的時(shí)間或數(shù)量。例如,在一個(gè)實(shí)現(xiàn)中,軟件模塊的操作可以僅在一段時(shí)間(如一周)內(nèi)以緩解模式執(zhí)行,之后回退到正常 (非緩解)模式。在另一示例性實(shí)現(xiàn)中,緩解啟用模塊114可以在給定時(shí)間內(nèi)僅對(duì)一設(shè)定數(shù)量的軟件應(yīng)用程序啟用緩解模式,如同時(shí)僅對(duì)四個(gè)軟件應(yīng)用程序啟用,來節(jié)省系統(tǒng)資源。如果達(dá)到了最大值且如在框602-606中檢測(cè)到應(yīng)對(duì)另一軟件模塊啟用緩解模式,則最早啟用了緩解模式的軟件模塊可將該緩解模式禁用,使得新軟件模塊可啟用緩解模式。在某些實(shí)現(xiàn)中,可使用這些技術(shù)中的每一個(gè)的組合,使得緩解模塊保持在一設(shè)定時(shí)間段內(nèi)對(duì)軟件模塊啟用,只要緩解啟用模塊114檢測(cè)到緩解動(dòng)作成功地緩解了錯(cuò)誤,但是該模式僅被啟用一設(shè)定時(shí)間段,之后當(dāng)接著檢測(cè)到另一軟件模塊可從緩解模式中獲益時(shí)則禁用該模式。跟蹤緩解動(dòng)作在減少應(yīng)用程序經(jīng)歷的存儲(chǔ)器錯(cuò)誤的數(shù)量方面的成功可用任何合適的方式來執(zhí)行。圖7A和7B示出了用于檢測(cè)緩解動(dòng)作的成功的兩種示例性技術(shù)的流程圖, 但應(yīng)當(dāng)理解,取決于期望被緩解的存儲(chǔ)器錯(cuò)誤的類型以及對(duì)緩解模塊112可用的緩解動(dòng)作的類型,其他技術(shù)是可能的。圖7A的過程700A是關(guān)于如何能跟蹤緩解動(dòng)作在緩解錯(cuò)誤方面的成功的總體過程的一個(gè)示例。在該示例中,圖4A的分配過程400A是緩解動(dòng)作被跟蹤。過程700A在框702 開始,在那里緩解啟用模塊114出于任何原因?qū)浖K啟用緩解模式。在框704,緩解模塊112接收對(duì)特定軟件模塊執(zhí)行分配操作的請(qǐng)求,并且根據(jù)圖4A的過程400A,分配多于請(qǐng)求量的存儲(chǔ)器且將標(biāo)記值寫入該額外存儲(chǔ)器。在框706,緩解模塊112接收對(duì)框704中分配的存儲(chǔ)器執(zhí)行釋放操作的請(qǐng)求。如上所述,該釋放操作可被延遲。但是,當(dāng)在框708處實(shí)現(xiàn)該操作時(shí),確定框704中分配的額外存儲(chǔ)器是否仍存儲(chǔ)寫入它的標(biāo)記值。如果該額外存儲(chǔ)器仍存儲(chǔ)該標(biāo)記值,則在框710,緩解啟用模塊114可存儲(chǔ)在該實(shí)例中緩解動(dòng)作對(duì)存儲(chǔ)器錯(cuò)誤沒有影響的指示,如存儲(chǔ)在其事件日志216中。然而,如果在框708確定額外存儲(chǔ)器未存儲(chǔ)標(biāo)記值,則在框712,緩解啟用模塊 114可在事件日志216中存儲(chǔ)成功地緩解了錯(cuò)誤的指示。在這一情況下,成功地檢測(cè)到軟件模塊寫入了多于空間請(qǐng)求量的數(shù)據(jù),且因此緩解模塊112成功地緩解了緩存溢出錯(cuò)誤。在框710或712中存儲(chǔ)了任一指示之后,在框714釋放存儲(chǔ)器,這可以用任何方式來完成,包括根據(jù)結(jié)合圖5描述的延遲的釋放過程500。在框714中釋放了存儲(chǔ)器之后,該過程結(jié)束。圖7B示出了用于跟蹤緩解模塊在緩解錯(cuò)誤方面的成功的另一示例性技術(shù)700B, 這一次是根據(jù)諸如圖5的過程500等延遲的釋放緩解動(dòng)作來進(jìn)行的。如同過程700A —樣, 過程700B在框720開始,在那里緩解模塊出于任何原因?qū)μ囟ㄜ浖K啟用緩解模式。在框722,緩解模塊112接收對(duì)先前已被分配給特定軟件模塊的存儲(chǔ)器執(zhí)行釋放操作的請(qǐng)求。 在框724,對(duì)于期望被釋放的存儲(chǔ)器的內(nèi)容以任何合適的方式計(jì)算校驗(yàn)和或散列值,且在框 726,延遲釋放操作的執(zhí)行直到一等待時(shí)間段之后。在框728,在該等待時(shí)間段之后,再一次為存儲(chǔ)器的內(nèi)容計(jì)算校驗(yàn)和或散列值。在框730,確定來自框724的原始散列值是否匹配框728的后一散列值。如果是,則在框732,緩解啟用模塊114可在其事件日志216中存儲(chǔ)緩解動(dòng)作在該實(shí)例中對(duì)緩解錯(cuò)誤沒有影響。然而,如果在框730確定散列值不相同,則在框 734,可在緩解啟用模塊114的事件日志216中存儲(chǔ)緩解模塊112成功緩解錯(cuò)誤的指示,因?yàn)榭梢詸z測(cè)到由于存儲(chǔ)器的內(nèi)容隨時(shí)間改變,延遲釋放直到等待時(shí)間段之后緩解了因編程隱錯(cuò)在軟件模塊完成使用存儲(chǔ)器之前釋放了存儲(chǔ)器而引起的存儲(chǔ)器錯(cuò)誤的影響。在框732 或734中存儲(chǔ)任一指示之后,在框736釋放存儲(chǔ)器,且該過程結(jié)束。過程700A和700B所存儲(chǔ)的緩解動(dòng)作的有效和無效性的指示可用任何合適的方式來使用。在某些實(shí)現(xiàn)中,這些指示可用于計(jì)算關(guān)于緩解動(dòng)作對(duì)與應(yīng)用程序相關(guān)的軟件模塊的影響的統(tǒng)計(jì)數(shù)據(jù)。這些統(tǒng)計(jì)數(shù)據(jù)可以跨軟件應(yīng)用程序的多個(gè)實(shí)例來計(jì)算。這些統(tǒng)計(jì)數(shù)據(jù)可以包括允許計(jì)算成功緩解頻率的時(shí)間分量。在某些實(shí)施例中,該時(shí)間分量可以是觀察到多個(gè)成功緩解的時(shí)間的指示。然而,該時(shí)間分量也可被測(cè)量為調(diào)用軟件模塊的調(diào)用次數(shù)。成功緩解頻率可以是保持緩解是否有可能避免隱錯(cuò)對(duì)調(diào)用軟件模塊的影響的預(yù)測(cè)符,并且可以基于這些統(tǒng)計(jì)數(shù)據(jù)來確定是否對(duì)調(diào)用軟件模塊的將來實(shí)例實(shí)現(xiàn)緩解動(dòng)作。如上所述,在一個(gè)實(shí)現(xiàn)中,可使用諸如圖2C所示的緩解標(biāo)簽值來作為用于確定是否應(yīng)對(duì)特定軟件模塊啟用緩解模式的統(tǒng)計(jì)數(shù)據(jù)。該緩解標(biāo)簽值可以是任何合適的值,并且可以用任何合適的方式來初始化和調(diào)整。圖8示出了可用于使用每一調(diào)用軟件模塊的緩解標(biāo)簽值來管理緩解模式的技術(shù)的一個(gè)示例。在所示實(shí)施例中,標(biāo)簽值被存儲(chǔ)在非易失性存儲(chǔ)器中,并且可以跨應(yīng)用程序的實(shí)例、計(jì)算機(jī)的關(guān)閉或其他事件而持久保存。圖8的過程800在框802開始,在那里緩解啟用模塊114檢測(cè)存儲(chǔ)器錯(cuò)誤???02 中的檢測(cè)可以用任何合適的方式來完成,包括通過檢測(cè)軟件模塊的不正確執(zhí)行或崩潰。在框804,對(duì)軟件模塊啟用緩解模式,并且在框806,將緩解標(biāo)簽值初始化為一特定值。該特定值可以是任何合適的值,并且可以是跨特定系統(tǒng)上的所有軟件模塊一致的值、基于任何合適的特性(如函數(shù)或源開發(fā)者)為特定一組應(yīng)用程序選擇的值、為特定軟件模塊選擇的值、 或任何其他合適的值。在某些實(shí)施例中,如下所述,該初始值可以基于關(guān)于對(duì)所關(guān)注的應(yīng)用程序成功緩解了錯(cuò)誤的歷史數(shù)據(jù)。在一個(gè)示例性實(shí)現(xiàn)中,緩解標(biāo)簽值可以是整數(shù),且在對(duì)軟件模塊啟用緩解模式時(shí),該初始化的值可以是七(7)。在框808,緩解模塊112以緩解模式對(duì)軟件模塊執(zhí)行存儲(chǔ)器操作,并且對(duì)于該軟件模塊的每一實(shí)例化——如模塊的每一次執(zhí)行——緩解啟用模塊114跟蹤緩解模塊112在該實(shí)例化中緩解錯(cuò)誤的成功。跟蹤成功可用任何合適的方式來完成,包括通過以上結(jié)合圖7A和7B描述的技術(shù)中的任一種。在框810,緩解啟用模塊114檢測(cè)軟件模塊的實(shí)例的結(jié)束。實(shí)例的結(jié)束可以是正確的結(jié)束,如用戶驅(qū)動(dòng)或進(jìn)程驅(qū)動(dòng)的退出所導(dǎo)致的結(jié)束,或者可以是不正確的結(jié)束,如崩潰導(dǎo)致的結(jié)束。在框810,可將關(guān)于軟件模塊的實(shí)例的結(jié)束以及該結(jié)束的起因的信息存儲(chǔ)在緩解數(shù)據(jù)存儲(chǔ)212的事件日志216中。在框812,緩解啟用模塊814使用框808和810中收集的信息來更新軟件模塊的緩解標(biāo)簽值。在某些實(shí)現(xiàn)中,如果檢測(cè)到緩解模塊112成功地緩解了錯(cuò)誤,則可遞增緩解標(biāo)簽值。如果緩解模塊112未成功緩解錯(cuò)誤,則可遞減緩解標(biāo)簽值。在其他實(shí)現(xiàn)中,可使用更多因素。表I示出了可用于確定如何調(diào)整緩解標(biāo)簽值的因素的一個(gè)示例,但其他因素是可能的。
權(quán)利要求
1.一種用于降低計(jì)算機(jī)系統(tǒng)遇到存儲(chǔ)器錯(cuò)誤的頻率的方法,所述方法包括從調(diào)用軟件模塊(200)接收(30 執(zhí)行存儲(chǔ)器操作的請(qǐng)求;確定(304)在所述調(diào)用軟件模塊請(qǐng)求的存儲(chǔ)器操作的執(zhí)行期間是否應(yīng)當(dāng)應(yīng)用一個(gè)或多個(gè)緩解動(dòng)作;如果應(yīng)當(dāng)應(yīng)用所述一個(gè)或多個(gè)緩解動(dòng)作,則應(yīng)用(310)至少一個(gè)緩解動(dòng)作,所述緩解動(dòng)作可用于降低作為所述存儲(chǔ)器操作的結(jié)果而發(fā)生存儲(chǔ)器錯(cuò)誤的可能性;以及根據(jù)所述緩解動(dòng)作執(zhí)行(312、314)所述存儲(chǔ)器操作。
2.如權(quán)利要求1所述的方法,其特征在于,所述存儲(chǔ)器操作是請(qǐng)求將第一數(shù)量的存儲(chǔ)器分配給所述調(diào)用軟件模塊,且所述至少一個(gè)緩解動(dòng)作包括分配G04)比所述第一數(shù)量的存儲(chǔ)器更多的第二數(shù)量的存儲(chǔ)器。
3.如權(quán)利要求1所述的方法,其特征在于,所述存儲(chǔ)器操作是請(qǐng)求釋放分配給所述調(diào)用軟件模塊的存儲(chǔ)器,并且根據(jù)所述緩解動(dòng)作執(zhí)行所述存儲(chǔ)器操作包括在稍后的時(shí)間執(zhí)行 (434)所述存儲(chǔ)器操作。
4.如權(quán)利要求3所述的方法,其特征在于,在稍后的時(shí)間執(zhí)行所述存儲(chǔ)器操作包括將分配給所述調(diào)用軟件模塊的存儲(chǔ)器添加(508)到要釋放的存儲(chǔ)器的隊(duì)列,并且在所述存儲(chǔ)器到達(dá)所述隊(duì)列的頂部時(shí)執(zhí)行(51 釋放所述存儲(chǔ)器的存儲(chǔ)器操作。
5.如權(quán)利要求1所述的方法,其特征在于,所述緩解動(dòng)作是確定(432)所述存儲(chǔ)器操作的輸入信息是否正確,并且其中根據(jù)所述緩解動(dòng)作執(zhí)行所述存儲(chǔ)器操作包括如果所述輸入信息不正確則不執(zhí)行(436)所述存儲(chǔ)器操作。
6.如權(quán)利要求5所述的方法,其特征在于,所述存儲(chǔ)器操作是影響堆存儲(chǔ)器的操作,并且確定所述輸入信息是否正確包括確定所述輸入信息是否包括堆存儲(chǔ)器的地址。
7.如權(quán)利要求1所述的方法,其特征在于,根據(jù)所述緩解動(dòng)作執(zhí)行所述存儲(chǔ)器操作包括當(dāng)所述緩解動(dòng)作指示不應(yīng)執(zhí)行所述存儲(chǔ)器操作時(shí)不執(zhí)行(436、444)所述存儲(chǔ)器操作。
8.如權(quán)利要求1所述的方法,其特征在于,確定對(duì)所述調(diào)用軟件模塊是否應(yīng)當(dāng)應(yīng)用一個(gè)或多個(gè)緩解動(dòng)作包括檢查與存儲(chǔ)器管理模塊相關(guān)聯(lián)的數(shù)據(jù)存儲(chǔ)018)中的條目,所述條目與所述調(diào)用軟件模塊相關(guān)聯(lián)。
9.如權(quán)利要求8所述的方法,其特征在于,所述與存儲(chǔ)器管理模塊相關(guān)聯(lián)的數(shù)據(jù)存儲(chǔ)與和所述存儲(chǔ)器管理模塊交互的緩解啟用模塊(114)相關(guān)聯(lián)。
10.至少一個(gè)其上編碼有計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)(104),所述計(jì)算機(jī)可執(zhí)行指令在被執(zhí)行時(shí)使得計(jì)算機(jī)(10 執(zhí)行一種操作計(jì)算設(shè)備(100)的操作系統(tǒng) (108)的存儲(chǔ)器管理模塊(110)的方法,所述方法包括用所述存儲(chǔ)器管理模塊接收(30 來自第一調(diào)用軟件模塊的執(zhí)行第一存儲(chǔ)器操作的第一請(qǐng)求,以及來自第二調(diào)用軟件模塊的執(zhí)行第二存儲(chǔ)器操作的第二請(qǐng)求;審閱(304)與所述存儲(chǔ)器管理模塊相關(guān)聯(lián)的數(shù)據(jù)存儲(chǔ)(218)中的至少一個(gè)第一條目來確定在所述第一調(diào)用軟件模塊請(qǐng)求的存儲(chǔ)器操作的執(zhí)行期間是否應(yīng)當(dāng)應(yīng)用一個(gè)或多個(gè)緩解動(dòng)作;審閱(304)與所述存儲(chǔ)器管理模塊相關(guān)聯(lián)的數(shù)據(jù)存儲(chǔ)(218)中的至少一個(gè)第二條目來確定在所述第二調(diào)用軟件模塊請(qǐng)求的存儲(chǔ)器操作的執(zhí)行期間是否應(yīng)當(dāng)應(yīng)用一個(gè)或多個(gè)緩解動(dòng)作;通過部分地應(yīng)用至少一個(gè)緩解動(dòng)作來執(zhí)行(312、314)所述第一存儲(chǔ)器操作,所述至少一個(gè)緩解動(dòng)作可用于降低發(fā)生存儲(chǔ)器錯(cuò)誤的可能性;以及在不應(yīng)用緩解動(dòng)作的情況下執(zhí)行(316)所述第二存儲(chǔ)器操作。
11.如權(quán)利要求10所述的至少一個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在于,所述第一調(diào)用軟件模塊是第一軟件應(yīng)用程序,所述第二調(diào)用軟件模塊是與所述第一軟件應(yīng)用程序不同的第二軟件應(yīng)用程序。
12.如權(quán)利要求10所述的至少一個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在于,所述第一存儲(chǔ)器操作是立即解除用于所述調(diào)用軟件模塊的存儲(chǔ)器的分配,并且通過應(yīng)用所述至少一個(gè)緩解動(dòng)作來執(zhí)行所述第一存儲(chǔ)器操作包括在將來的時(shí)間執(zhí)行(434)解除所述存儲(chǔ)器的分配的操作。
13.如權(quán)利要求12所述的至少一個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在于,所述將來時(shí)間不是預(yù)定量的時(shí)間,并且執(zhí)行所述存儲(chǔ)器操作包括將所述存儲(chǔ)器操作置于隊(duì)列中以便在所述存儲(chǔ)器操作到達(dá)所述隊(duì)列的頂部時(shí)執(zhí)行(512)。
14.如權(quán)利要求10所述的至少一個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在于,所述第一存儲(chǔ)器操作是將某一數(shù)量的存儲(chǔ)器分配給所述第一調(diào)用軟件模塊的操作,并且通過執(zhí)行所述至少一個(gè)緩解動(dòng)作來執(zhí)行所述第一存儲(chǔ)器操作包括分配(404)多于請(qǐng)求量的存儲(chǔ)器。
15.如權(quán)利要求10所述的至少一個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在于,通過部分地應(yīng)用所述至少一個(gè)緩解動(dòng)作來執(zhí)行所述第一存儲(chǔ)器操作包括確定(43 所述第一存儲(chǔ)器操作的輸入信息是否正確,并且如果不正確,則不執(zhí)行所述第一存儲(chǔ)器操作,并向所述第一調(diào)用軟件模塊返回所述第一存儲(chǔ)器操作被執(zhí)行的指示。
16.一種裝置,包括具有多個(gè)存儲(chǔ)器單元的至少一個(gè)存儲(chǔ)介質(zhì)(116);以及適用于至少執(zhí)行調(diào)用軟件模塊和存儲(chǔ)器管理模塊(110)的至少一個(gè)處理器(102),所述至少一個(gè)處理器執(zhí)行與所述存儲(chǔ)器管理模塊相關(guān)的指令來執(zhí)行以下動(dòng)作從所述調(diào)用軟件模塊接收(30 執(zhí)行存儲(chǔ)器操作來影響所述多個(gè)存儲(chǔ)器單元中的至少一個(gè)的請(qǐng)求;確定(304)在所述調(diào)用軟件模塊請(qǐng)求的存儲(chǔ)器操作的執(zhí)行期間是否應(yīng)當(dāng)應(yīng)用一個(gè)或多個(gè)緩解動(dòng)作;如果應(yīng)當(dāng)應(yīng)用所述一個(gè)或多個(gè)緩解動(dòng)作,則應(yīng)用(310)至少一個(gè)緩解動(dòng)作,所述緩解動(dòng)作可用于降低作為所述存儲(chǔ)器操作的結(jié)果而發(fā)生存儲(chǔ)器錯(cuò)誤的可能性;以及根據(jù)所述緩解動(dòng)作執(zhí)行(312、314)所述存儲(chǔ)器操作。
17.如權(quán)利要求16所述的裝置,其特征在于,所述至少一個(gè)存儲(chǔ)器存儲(chǔ)包括關(guān)于是否向一個(gè)或多個(gè)調(diào)用軟件模塊所請(qǐng)求的存儲(chǔ)器操作應(yīng)用緩解動(dòng)作的條目(218)的信息,并且確定在所述調(diào)用軟件模塊所請(qǐng)求的存儲(chǔ)器操作的執(zhí)行期間是否應(yīng)當(dāng)應(yīng)用一個(gè)或多個(gè)緩解動(dòng)作包括審閱各條目中與所述調(diào)用軟件模塊相關(guān)聯(lián)的至少一個(gè)條目。
18.如權(quán)利要求16所述的裝置,其特征在于,根據(jù)所述緩解動(dòng)作執(zhí)行所述存儲(chǔ)器操作包括不執(zhí)行(436、444)所述存儲(chǔ)器操作。
19.如權(quán)利要求16所述的裝置,其特征在于,根據(jù)所述緩解動(dòng)作執(zhí)行所述存儲(chǔ)器操作包括確定(432)所述存儲(chǔ)器操作的輸入信息是否正確,且如果不正確,則不執(zhí)行(436)所述存儲(chǔ)器操作。
20.如權(quán)利要求16所述的裝置,其特征在于,所述存儲(chǔ)器操作是請(qǐng)求釋放分配給所述調(diào)用軟件模塊的存儲(chǔ)器,并且根據(jù)所述緩解動(dòng)作執(zhí)行所述存儲(chǔ)器操作包括在稍后的時(shí)間執(zhí)行(434)所述存儲(chǔ)器操作。
全文摘要
用于執(zhí)行存儲(chǔ)器管理來緩解存儲(chǔ)器錯(cuò)誤的技術(shù)。根據(jù)此處描述的原理,可實(shí)現(xiàn)一種存儲(chǔ)器管理模塊,該存儲(chǔ)器管理模塊對(duì)于向該存儲(chǔ)器管理模塊發(fā)出執(zhí)行存儲(chǔ)器操作的請(qǐng)求的一個(gè)或多個(gè)軟件模塊中的每一個(gè)以不同操作模式來操作。在一種操作模式中,作為調(diào)用軟件模塊所請(qǐng)求的存儲(chǔ)器操作的補(bǔ)充或替代,存儲(chǔ)器管理模塊可執(zhí)行一個(gè)或多個(gè)緩解動(dòng)作,使得該存儲(chǔ)器操作根據(jù)這些緩解動(dòng)作來執(zhí)行。這些緩解動(dòng)作可用于降低存儲(chǔ)器錯(cuò)誤負(fù)面地影響調(diào)用軟件模塊的可能性。在另一種操作模式中,該存儲(chǔ)器管理模塊如所請(qǐng)求地執(zhí)行存儲(chǔ)器操作而不執(zhí)行緩解動(dòng)作。
文檔編號(hào)G06F12/00GK102165426SQ200980138420
公開日2011年8月24日 申請(qǐng)日期2009年9月12日 優(yōu)先權(quán)日2008年9月26日
發(fā)明者A·J·洛雷利, D·格蘭特, P·卡斯圖里, S·C·卡利諾, W·坎貝爾 申請(qǐng)人:微軟公司