特許第5694170号(P5694170)IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ マイクロソフト コーポレーションの特許一覧

特許5694170選択的に軽減を使用してエラーを低減するメモリー管理技術
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】5694170
(24)【登録日】2015年2月13日
(45)【発行日】2015年4月1日
(54)【発明の名称】選択的に軽減を使用してエラーを低減するメモリー管理技術
(51)【国際特許分類】
   G06F 12/02 20060101AFI20150312BHJP
【FI】
   G06F12/02 510A
   G06F12/02 540
【請求項の数】16
【全頁数】39
(21)【出願番号】特願2011-529101(P2011-529101)
(86)(22)【出願日】2009年9月12日
(65)【公表番号】特表2012-503825(P2012-503825A)
(43)【公表日】2012年2月9日
(86)【国際出願番号】US2009056763
(87)【国際公開番号】WO2010036526
(87)【国際公開日】20100401
【審査請求日】2012年8月6日
(31)【優先権主張番号】12/238,600
(32)【優先日】2008年9月26日
(33)【優先権主張国】US
(73)【特許権者】
【識別番号】500046438
【氏名又は名称】マイクロソフト コーポレーション
(74)【代理人】
【識別番号】100140109
【弁理士】
【氏名又は名称】小野 新次郎
(74)【代理人】
【識別番号】100075270
【弁理士】
【氏名又は名称】小林 泰
(74)【代理人】
【識別番号】100080137
【弁理士】
【氏名又は名称】千葉 昭男
(74)【代理人】
【識別番号】100096013
【弁理士】
【氏名又は名称】富田 博行
(74)【代理人】
【識別番号】100119781
【弁理士】
【氏名又は名称】中村 彰吾
(72)【発明者】
【氏名】カリノイウ,シルヴィウ・シー
(72)【発明者】
【氏名】グラント,デヴィッド
(72)【発明者】
【氏名】ロレリ,アンソニー・ジェイ
(72)【発明者】
【氏名】カストゥリ,パヴァン
(72)【発明者】
【氏名】カンベル,ウィリアム
【審査官】 酒井 恭信
(56)【参考文献】
【文献】 特開2003−288266(JP,A)
【文献】 特開2008−003945(JP,A)
【文献】 特開平07−121464(JP,A)
【文献】 特開2002−108698(JP,A)
【文献】 特開平11−073364(JP,A)
【文献】 特開平04−367951(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 12/02
(57)【特許請求の範囲】
【請求項1】
コンピューターシステムに生じる(encountered by a computer system)メモリーエラーの頻度(frequency)を低下させる(reducing)方法であって、
呼び出し側ソフトウェアモジュール(calling software module)(200)から、メモリー操作(memory operation)の実行要求(request for execution)を受け取る(302)ステップと、
前記呼び出し側ソフトウェアモジュールによって要求されるメモリー操作の実行時に1つまたは複数の軽減活動(mitigation actions)が適用される(applied)べきかどうかを判定する(determining)(304)ステップと、
前記1つまたは複数の軽減活動が適用されるべき場合は、前記メモリー操作の結果メモリーエラーが発生(occurring)する可能性(likelihood)を低減する働きをし得る(may serve to)少なくとも1つの軽減活動を適用する(310)ステップと、
前記軽減活動に従って前記メモリー操作を実行する(312、314)ステップと
を含み、
前記軽減活動に従って前記メモリー操作を実行するステップは、前記軽減活動が、前記メモリー操作を実行すべきでないと示す時は、前記メモリー操作を実行しない(436、444)ステップを含む、
方法であって、
前記メモリー操作の実行要求は、前記呼び出し側ソフトウェアモジュールに第1の量(amount)のメモリーを割り当てる(allocated)要求であり、前記軽減活動に従って前記メモリー操作を実行するステップは、前記第1の量のメモリーより大きい第2の量のメモリーを割り当てる(404)ステップを含む、
方法。
【請求項2】
コンピューターシステムに生じる(encountered by a computer system)メモリーエラーの頻度(frequency)を低下させる(reducing)方法であって、
呼び出し側ソフトウェアモジュール(calling software module)(200)から、メモリー操作(memory operation)の実行要求(request for execution)を受け取る(302)ステップと、
前記呼び出し側ソフトウェアモジュールによって要求されるメモリー操作の実行時に1つまたは複数の軽減活動(mitigation actions)が適用される(applied)べきかどうかを判定する(determining)(304)ステップと、
前記1つまたは複数の軽減活動が適用されるべき場合は、前記メモリー操作の結果メモリーエラーが発生(occurring)する可能性(likelihood)を低減する働きをし得る(may serve to)少なくとも1つの軽減活動を適用する(310)ステップと、
前記軽減活動に従って前記メモリー操作を実行する(312、314)ステップと
を含み、
前記軽減活動に従って前記メモリー操作を実行するステップは、前記軽減活動が、前記メモリー操作を実行すべきでないと示す時は、前記メモリー操作を実行しない(436、444)ステップを含む、
方法であって、
前記メモリー操作の実行要求は、前記呼び出し側ソフトウェアモジュールに割り当てられたメモリーを解放する(free)要求であり、前記軽減活動に従って前記メモリー操作を実行するステップは、前記メモリー操作を後の時に(at a later time)行う(434)ステップを含む、
方法。
【請求項3】
前記メモリー操作を前記後の時に行うステップは、前記呼び出し側ソフトウェアモジュールに割り当てられた前記メモリー操作の実行要求を、解放すべき(to be freed)メモリーの待ち行列(queue)に加え(adding)(508)、前記メモリー操作の実行要求が前記待ち行列の先頭(top)に達した(reaches)時に前記メモリー操作を行って前記メモリーを解放する(512)ステップを含む、請求項に記載の方法。
【請求項4】
コンピューターシステムに生じる(encountered by a computer system)メモリーエラーの頻度(frequency)を低下させる(reducing)方法であって、
呼び出し側ソフトウェアモジュール(calling software module)(200)から、メモリー操作(memory operation)の実行要求(request for execution)を受け取る(302)ステップと、
前記呼び出し側ソフトウェアモジュールによって要求されるメモリー操作の実行時に1つまたは複数の軽減活動(mitigation actions)が適用される(applied)べきかどうかを判定する(determining)(304)ステップと、
前記1つまたは複数の軽減活動が適用されるべき場合は、前記メモリー操作の結果メモリーエラーが発生(occurring)する可能性(likelihood)を低減する働きをし得る(may serve to)少なくとも1つの軽減活動を適用する(310)ステップと、
前記軽減活動に従って前記メモリー操作を実行する(312、314)ステップと
を含み、
前記軽減活動に従って前記メモリー操作を実行するステップは、前記軽減活動が、前記メモリー操作を実行すべきでないと示す時は、前記メモリー操作を実行しない(436、444)ステップを含む、
方法であって、
前記軽減活動は、前記メモリー操作の入力情報が正しい(correct)かどうかの判定(432)であり、前記軽減活動に従って前記メモリー操作を実行するステップは、前記入力情報が正しくない場合は前記メモリー操作を実行しない(436)ステップを含む、
方法。
【請求項5】
前記メモリー操作は、ヒープメモリー(heap memory)に作用する(affecting)メモリー操作であり、前記入力情報が正しいかどうかを判定するステップは、前記入力情報がヒープメモリーのアドレスを含むかどうかを判定するステップを含む、請求項に記載の方法。
【請求項6】
コンピューターシステムに生じる(encountered by a computer system)メモリーエラーの頻度(frequency)を低下させる(reducing)方法であって、
呼び出し側ソフトウェアモジュール(calling software module)(200)から、メモリー操作(memory operation)の実行要求(request for execution)を受け取る(302)ステップと、
前記呼び出し側ソフトウェアモジュールによって要求されるメモリー操作の実行時に1つまたは複数の軽減活動(mitigation actions)が適用される(applied)べきかどうかを判定する(determining)(304)ステップと、
前記1つまたは複数の軽減活動が適用されるべき場合は、前記メモリー操作の結果メモリーエラーが発生(occurring)する可能性(likelihood)を低減する働きをし得る(may serve to)少なくとも1つの軽減活動を適用する(310)ステップと、
前記軽減活動に従って前記メモリー操作を実行する(312、314)ステップと
を含み、
前記軽減活動に従って前記メモリー操作を実行するステップは、前記軽減活動が、前記メモリー操作を実行すべきでないと示す時は、前記メモリー操作を実行しない(436、444)ステップを含む、
方法であって、
前記呼び出し側ソフトウェアモジュールについて、前記1つまたは複数の軽減活動が適用されるべきかどうかを判定するステップは、メモリー管理モジュールに関連付けられたデータストア(a data store)(218)内のエントリーを調べるステップを含み、前記エントリーは、前記呼び出し側ソフトウェアモジュールに関連付けられている(associated with)、
方法。
【請求項7】
前記メモリー管理モジュールに関連付けられたデータストアは、前記メモリー管理モジュールと対話する(interacting with)軽減有効化(enablement)モジュール(114)に関連付けられる、請求項に記載の方法。
【請求項8】
実行されると、コンピューティングデバイス(100)のオペレーティングシステム(108)のメモリー管理モジュール(110)を動作させる方法をコンピューター(102)に行わせるコンピューター実行可能命令が符号化された少なくとも1つのコンピューター可読記憶媒体(104)であって、前記方法は、
前記メモリー管理モジュールにより、第1の呼び出し側ソフトウェアモジュールからの、第1のメモリー操作を実行する第1の要求と、第2の呼び出し側ソフトウェアモジュールからの、第2のメモリー操作を実行する第2の要求とを受け取る(302)ステップと、
前記メモリー管理モジュールに関連付けられたデータストア(218)内の少なくとも1つの第1のエントリーを調べ(304)て、前記第1の呼び出し側ソフトウェアモジュールによって要求されるメモリー操作の実行時に1つまたは複数の軽減活動が適用されるべきかどうかを判定するステップと、
前記メモリー管理モジュールに関連付けられた前記データストア(218)内の少なくとも1つの第2のエントリーを調べ(304)て、前記第2の呼び出し側ソフトウェアモジュールによって要求されるメモリー操作の実行時に1つまたは複数の軽減活動が適用されるべきかどうかを判定するステップと、
部分的には、メモリーエラーが発生する可能性を低減する働きをし得る少なくとも1つの軽減活動を適用することにより、前記第1のメモリー操作を実行する(312、314)ステップと、
軽減活動を適用せずに前記第2のメモリー操作を実行する(316)ステップと
を含む、少なくとも1つのコンピューター可読記憶媒体。
【請求項9】
前記第1の呼び出し側ソフトウェアモジュールは、第1のソフトウェアアプリケーションであり、前記第2の呼び出し側ソフトウェアモジュールは、前記第1のソフトウェアアプリケーションと異なる第2のソフトウェアアプリケーションである、請求項に記載の少なくとも1つのコンピューター可読記憶媒体。
【請求項10】
前記第1のメモリー操作は、前記呼び出し側ソフトウェアモジュールのためのメモリーの割り当てを直ちに解除する操作であり、前記少なくとも1つの軽減活動を適用することにより前記第1のメモリー操作を実行するステップは、前記メモリーの割り当てを解除する前記操作を将来の時に行う(434)ステップを含む、請求項に記載の少なくとも1つのコンピューター可読記憶媒体。
【請求項11】
前記将来の時は、事前に決められた時間量ではなく、前記メモリー操作を実行するステップは、前記メモリー操作の実行要求を待ち行列に入れて前記メモリー操作の実行要求が前記待ち行列の先頭に達した時に、前記メモリー操作を実行させる(512)ステップを含む、請求項10に記載の少なくとも1つのコンピューター可読記憶媒体。
【請求項12】
前記第1のメモリー操作は、ある量のメモリーを前記第1の呼び出し側ソフトウェアモジュールに割り当てる操作であり、前記少なくとも1つの軽減活動を行うことによって前記第1のメモリー操作を実行するステップは、要求より多い量のメモリーを割り当てる(404)ステップを含む、請求項に記載の少なくとも1つのコンピューター可読記憶媒体。
【請求項13】
前記軽減活動に従って前記メモリー操作を実行するステップは、前記軽減活動が、前記メモリー操作を実行すべきでないと示す時は、前記メモリー操作を実行しない(436、444)ステップを含む、
請求項に記載の方法。
【請求項14】
複数のメモリー単位を有する少なくとも1つの記憶媒体(116)と、
少なくとも呼び出し側ソフトウェアモジュールおよびメモリー管理モジュール(110)を実行するように適合された少なくとも1つのプロセッサー(102)と
を備える装置であって、前記少なくとも1つのプロセッサーは、前記メモリー管理モジュールに関連する命令を実行して、
前記呼び出し側ソフトウェアモジュールから、前記複数のメモリー単位(units)の少なくとも1つに作用する(affect)メモリー操作の実行要求を受け取る(302)動作と、
前記呼び出し側ソフトウェアモジュールによって要求されるメモリー操作の実行時に1つまたは複数の軽減活動が適用されるべきかどうかを判定する(304)動作と、
前記1つまたは複数の軽減活動が適用されるべき場合は、前記メモリー操作の結果メモリーエラーが発生する可能性を低減する働きをし得る少なくとも1つの軽減活動を適用する(310)動作と、
前記軽減活動に従って前記メモリー操作を実行する(312、314)動作と
を行い、
前記軽減活動に従って前記メモリー操作を実行する動作は、前記メモリー操作を実行しない(436、444)動作を含む、
装置であって、
前記少なくとも1つの記憶媒体は、1つまたは複数の呼び出し側ソフトウェアモジュールによって要求されるメモリー操作に軽減活動を適用するかどうかについてのエントリー(218)を備える情報を格納し、
前記呼び出し側ソフトウェアモジュールによって要求されるメモリー操作の実行時に前記1つまたは複数の軽減活動が適用されるべきかどうかを判定する動作は、前記呼び出し側ソフトウェアモジュールに関連付けられた前記エントリーのうち少なくとも1つのエントリーを調査する動作を含む、
装置。
【請求項15】
複数のメモリー単位を有する少なくとも1つの記憶媒体(116)と、
少なくとも呼び出し側ソフトウェアモジュールおよびメモリー管理モジュール(110)を実行するように適合された少なくとも1つのプロセッサー(102)と
を備える装置であって、前記少なくとも1つのプロセッサーは、前記メモリー管理モジュールに関連する命令を実行して、
前記呼び出し側ソフトウェアモジュールから、前記複数のメモリー単位(units)の少なくとも1つに作用する(affect)メモリー操作の実行要求を受け取る(302)動作と、
前記呼び出し側ソフトウェアモジュールによって要求されるメモリー操作の実行時に1つまたは複数の軽減活動が適用されるべきかどうかを判定する(304)動作と、
前記1つまたは複数の軽減活動が適用されるべき場合は、前記メモリー操作の結果メモリーエラーが発生する可能性を低減する働きをし得る少なくとも1つの軽減活動を適用する(310)動作と、
前記軽減活動に従って前記メモリー操作を実行する(312、314)動作と
を行い、
前記軽減活動に従って前記メモリー操作を実行する動作は、前記メモリー操作を実行しない(436、444)動作を含む、
装置であって、
前記軽減活動に従って前記メモリー操作を実行する動作は、前記メモリー操作の入力情報が正しいかどうかを判定し(432)、正しくない場合は、前記メモリー操作を実行しない(436)動作を含む、
装置。
【請求項16】
複数のメモリー単位を有する少なくとも1つの記憶媒体(116)と、
少なくとも呼び出し側ソフトウェアモジュールおよびメモリー管理モジュール(110)を実行するように適合された少なくとも1つのプロセッサー(102)と
を備える装置であって、前記少なくとも1つのプロセッサーは、前記メモリー管理モジュールに関連する命令を実行して、
前記呼び出し側ソフトウェアモジュールから、前記複数のメモリー単位(units)の少なくとも1つに作用する(affect)メモリー操作の実行要求を受け取る(302)動作と、
前記呼び出し側ソフトウェアモジュールによって要求されるメモリー操作の実行時に1つまたは複数の軽減活動が適用されるべきかどうかを判定する(304)動作と、
前記1つまたは複数の軽減活動が適用されるべき場合は、前記メモリー操作の結果メモリーエラーが発生する可能性を低減する働きをし得る少なくとも1つの軽減活動を適用する(310)動作と、
前記軽減活動に従って前記メモリー操作を実行する(312、314)動作と
を行い、
前記軽減活動に従って前記メモリー操作を実行する動作は、前記メモリー操作を実行しない(436、444)動作を含む、
装置であって、
前記メモリー操作は、前記呼び出し側ソフトウェアモジュールに割り当てられたメモリーを解放する要求であり、前記軽減活動に従って前記メモリー操作を実行する動作は、前記メモリー操作を後の時に行う(434)動作を含む、
装置。
【発明の詳細な説明】
【技術分野】
【0001】
本願発明の実施例は、例えば、選択的に軽減を使用してエラーを低減するメモリー管理技術に関する。
【背景技術】
【0002】
[0001]多用途コンピューティングデバイスでは、オペレーティングシステムのみではなくとも、通例はオペレーティングシステムが使用されて、そのコンピューティングデバイスで実行される1つまたは複数のアプリケーションが使用するコンピューティングデバイスのメモリーを管理する。例えば、2つのアプリケーションがコンピューティングデバイスのメモリーにアクセスする場合、オペレーティングシステムは、両アプリケーションが相互によって格納されたデータを破損することなくメモリーにアクセスできるように、2つのアプリケーションが使用するメモリーの部分を割り当てることができる。
【発明の概要】
【発明が解決しようとする課題】
【0003】
[0002]この管理およびアービトレーションは、アプリケーションが、別のアプリケーションに使用されているメモリーの使用を試みる場合に発生し得る問題を緩和するために必要な場合がある。例えば、2つのアプリケーションが共に、同一の時間または重複している時間にメモリーの同一部分を使用することを試みた場合は、第2のアプリケーションが第1のアプリケーションのデータを上書きする可能性があり、第1のアプリケーションが適正に実行することができないか、さらにはクラッシュする可能性がある。そのようなエラーは、特に頻繁に発生する場合にはユーザーエクスペリエンスに重大な影響を与える。
【0004】
[0003]オペレーティングシステムは、通例、メモリーマネージャーを備え、アプリケーションはメモリー管理タスクを実行する要求をメモリーマネージャーに送信することができ、メモリーマネージャーは、メモリー資源の使用についてプロセス間を調停することができる。例えば、アプリケーションが一時的または永続的にデータを格納したい場合、アプリケーションは、いくらかの量のメモリーをアプリケーションに割り当てることをメモリーマネージャーに要求することができる。後に、アプリケーションがそのメモリーを必要としなくなると、アプリケーションはメモリーマネージャーにその旨を通知し、別のアプリケーションが使用できるように、割り当てられたメモリーの割り当てを解除(または「解放」)することを要求することができる。第2のアプリケーションがメモリーマネージャーにメモリー要求を送信すると、メモリーマネージャーは、自身の記録を調べて、現在割り当てられていないメモリー部分を判別し、それらの部分を第2のアプリケーションに割り当てることができる。
【0005】
[0004]例えばオペレーティングシステムと対話するプロセスを実行する可能性のあるソフトウェアアプリケーションの中には、メモリー操作の実施に関連するバグや他のプログラミング上の欠陥を含んでいるものがあり、そのようなソフトウェアアプリケーションは、メモリーマネージャーがメモリー操作を正しく実行した場合でもメモリーエラーの結果障害を起こす可能性がある。そのようなメモリーエラーは、メモリー操作間で発生し得る不整合の結果生じる可能性がある。例えば、上記のように、ソフトウェアアプリケーションは、第1の量のメモリーを当該アプリケーションに割り当てることを要求し、その後第1の量よりも大きい第2の量のデータをメモリーに書き込む場合がある。動作間の不整合、この例では第1の量と第2の量の大きさの不整合が、ソフトウェアアプリケーションの障害につながるメモリーエラーを引き起こす可能性がある。そのような障害には、メモリーエラーが原因で生じる不適正な実行や、さらにはアプリケーションの実行を停止させる破局的エラー、すなわち「クラッシュ」が含まれ得る。
【0006】
[0005]そのようなプログラミングバグの影響のために、そのようなメモリーエラーを引き起こすプログラミングバグの特定を試みるソフトウェアツールが開発されている。それらのツールは、ソフトウェアアプリケーションの開発試験時に使用することができる。
【0007】
[0006]例えば、ソフトウェアアプリケーションの開発試験時にバグを特定するために使
用可能な種々の「デバッグ」ツールが存在する。ワシントン州レドモンドのマイクロソフトコーポレーションから入手可能なVisual Studio等のソフトウェア開発アプリケーションの中には、内蔵ツール等のツールを備えるものがある。Visual Studioでは、開発者が、試験時に、ページヒープ機能を備えることができるアプリケーション検証ツール機能を有効にする選択をすることができる。ページヒープを使用して、試験対象のアプリケーションについてのメモリーの割り当ておよび使用状況を監視することにより、バッファオーバーランおよびアンダーランを含む何種かのメモリーエラーを検出することができる。ページヒープでは、ある量の確保された追加メモリー(「非アクセス可能ページ」と呼ぶ)が、ヒープメモリーの割り当て部分(通常の「ユーザー割り当て」ページ)の後に配置され、アプリケーション検証ツール機能を有効にして、非アクセス可能ページに情報が書き込まれるとそのことを検出する。そのようにして、デバッグツールは、エラーを特定し、開発者に報告することができる。
【0008】
[0007]しかし、そのようなデバッグツールは、ソフトウェアアプリケーションの実行時には使用することができない。メモリーエラーが原因でクラッシュが発生した時にクラッシュ情報を収集する他のツールが開発されており、分析時に収集された情報を使用してメモリーエラーを特定することができる。そのような実行時に経験されるクラッシュを解決する試みは、従来、そのようなエラーが発生した時に検出し、クラッシュの状態を中央の集約点に報告することに限られており、エラーに関して利用可能な情報を集約点から開発者に通知することができる。開発者は、その情報を使用してエラーを再現またはデバッグし、次いでバグの特定と解決を試みることができる。マイクロソフトコーポレーションから入手可能なWindowsオペレーティングシステムは、そのWindowsエラー報告(WER)システムにそのような報告機能を提供している。このシステムでは、アプリケーションが例えばクラッシュや他の形の不適正な終了等により不完全に終了したことをWERが検出すると、命令スタックの内容等、アプリケーションの状態に関する情報がWERによってまとめられ、集約サーバーに報告されることができる。この情報は、エラーのクラスを識別する汎用システムエラーコードも含むことができるが、エラーの原因となった正確なバグに関する情報は含まない。
【課題を解決するための手段】
【0009】
[0008]本出願人らは、メモリーエラーを引き起こすソフトウェアアプリケーション中のプログラミングバグを補償するメモリー管理を使用することにより、アプリケーションがより確実に動作し、ユーザーエクスペリエンスを向上させることが可能であることを認識および理解した。本出願人らは、多くのメモリーエラーは、アプリケーションによって行われるメモリー操作の不整合が原因で生じる可能性があり、また、そのようなプログラミングバグの影響は、それらの不整合を予想し、その不整合を補正するようにメモリー管理を行うことによって軽減可能であることを認識した。例えば、アプリケーションが要求したより多くの資源(メモリーおよび/または時間等)をアプリケーションに割り当てることにより、メモリー管理モジュールは、アプリケーションに要求よりも多くのメモリーにアクセスさせる、またはメモリーを使用し終えたことを通知した後でメモリーを使用させる、アプリケーション中のバグを補償することができる。さらに、事例によっては、メモリー管理モジュールは、例えばアプリケーションによって要求されたメモリー操作の入力情報が正しくないと検出された場合には、その操作を行わないことによってエラーを軽減することができる。
【0010】
[0009]種々の軽減活動によって多くの異なる種類のエラーが軽減されることができ、軽減活動の例は以下でより詳細に述べる。ただし、本出願人らは、そのような軽減はコンピューティングデバイスの効率に著しい影響を及ぼす可能性があり、それらのデバイスで実行されるアプリケーションの性能に影響する可能性があることを認識した。メモリー操作が要求されるたびにメモリー操作を評価および操作すると、要求の完了に時間がかかり、要求よりも大きいメモリーを割り当てると、より多くのメモリーを使用し、したがってシステムが利用可能な資源を減らす可能性がある。本出願人らは、メモリー管理モジュールが、アプリケーションごとに選択的に有効にすることが可能な軽減を有すると望ましいこ
とを認識した。
【0011】
[0010]本明細書に記載の原理により、メモリー管理モジュールに対してメモリー操作の実行要求を発行する1つまたは複数のソフトウェアモジュールごとに異なる動作モードを有するメモリー管理モジュールを実装することができる。1つの動作モードでは、呼び出し側ソフトウェアモジュールによって要求されたメモリー操作に加えて、またはその代わりに、1つまたは複数の軽減活動がメモリー管理モジュールによって行われることができ、メモリー操作は軽減活動に従って行われる。それらの軽減活動は、メモリーエラーが呼び出し側ソフトウェアモジュールに影響する可能性を低減する働きをすることができる。別の動作モードでは、メモリー管理モジュールは、軽減活動を行わずに、要求通りにメモリー操作を行う。メモリー管理モジュールは、自身に関連付けられたデータストア中にレコードを維持することができ、レコードは、呼び出し側ソフトウェアモジュールごとに、その呼び出し側ソフトウェアモジュールに対してメモリー管理モジュールが動作すべきモードを指示する少なくとも1つのエントリーを有する。
【0012】
[0011]本明細書に記載の原理の一部またはすべてに従ってメモリー管理モジュールを稼動させることにより、ユーザーアプリケーション等のソフトウェアモジュールが不適正に実行される、またはクラッシュする可能性を低下させることができ、それらのソフトウェアモジュールを使用する際のユーザーエクスペリエンスを向上させる効果がある可能性がある。
【0013】
[0012]上述の内容は本発明の非限定的な概要であり、本発明は添付の特許請求の範囲のみによって定義されることを理解されたい。
[0013]添付図面は一定の縮尺での図示を意図していない。図面では、様々な図に示された同一またはほぼ同一の各構成要素は同様の参照符号で表される。図を見やすくするために、すべての図面ですべての構成要素に符号が付されているとは限らない。
【図面の簡単な説明】
【0014】
図1】[0014]本明細書に記載の原理の一部に従って動作する技術が機能することが可能な例示的コンピューティングデバイスのブロック図である。
図2A】[0015]従来のメモリー管理技術に従って動作するシステムの構成要素間の対話の概略図である。
図2B】[0016]本明細書に記載の原理の一部に従って動作する技術が機能することが可能な一例示的システムの一部構成要素間の対話の一部の図である。
図2C】[0017]アプリケーション単位でメモリー軽減を実装するために使用できるコンピューター記憶媒体内のデータ構造の概略図である。
図3】[0018]本明細書に記載の原理の一部によりメモリー管理を行う例示的技術のフローチャートである。
図4A】[0019]本明細書に記載の原理の1つまたは複数によりメモリー操作を行う例示的技術のフローチャートである。
図4B】[0019]本明細書に記載の原理の1つまたは複数によりメモリー操作を行う例示的技術のフローチャートである。
図4C】[0019]本明細書に記載の原理の1つまたは複数によりメモリー操作を行う例示的技術のフローチャートである。
図4D】[0019]本明細書に記載の原理の1つまたは複数によりメモリー操作を行う例示的技術のフローチャートである。
図5】[0020]本明細書に記載の原理の一部によりメモリーの割り当てを解除する操作を行う一例示的技術のフローチャートである。
図6】[0021]本明細書に記載の原理の一部により特定アプリケーションに軽減技術を適用するかどうかを判定する例示的技術のフローチャートである。
図7A】[0022]本明細書に記載の原理の一部により、メモリーエラーがアプリケーションに及ぼす影響を軽減する際の軽減技術の成功を判定する例示的技術のフローチャートである。
図7B】[0022]本明細書に記載の原理の一部により、メモリーエラーがアプリケーションに及ぼす影響を軽減する際の軽減技術の成功を判定する例示的技術のフローチャートである。
図8】[0023]本明細書に記載の原理の一部により、特定アプリケーションについて軽減技術を解除するかどうかを判定する例示的技術のフローチャートである。
図9】[0024]本明細書に記載の原理の一部により動作する技術が機能することが可能な例示的コンピューティングデバイスのブロック図である。
図10】[0025]本明細書に記載の原理の一部により動作する技術が機能することが可能な一例示的システムの一部構成要素間の対話の一部の図である。
図11】[0026]本明細書に記載の原理の一部により動作する技術が機能することが可能な例示的コンピューターシステムの図である。
図12】[0027]本明細書に記載の原理の一部によるメモリー管理技術を使用するようにコンピューティングデバイスを構成する例示的技術のフローチャートである。
図13】[0028]本明細書に記載の原理の一部によるメモリー管理技術を使用するようにコンピューティングデバイスを構成するように適合された中央集約サーバーでエラーデータおよび軽減データを受け取る例示的技術のフローチャートである。
【発明を実施するための形態】
【0015】
[0029]資源管理モジュールは、共有資源を持つシステムで稼動し、その共有資源の調停役として機能して、複数の資源消費者が資源へのアクセスを試みる際に相互と衝突しないことを保証する。メモリー管理モジュールは、そのような資源管理モジュールの一例である。単一用途および多用途コンピューティングデバイスを含むコンピューティングデバイスの中には、2つ以上のタスクに関係する複数のアプリケーションや他の複数の命令セットを並行して実行するものがあり、そのような並行実行は、メモリーへのアクセスについて競合する可能性がある。2つ以上のアプリケーションが適正にコーディングされ、メモリー管理モジュールに与えられる命令が正しい場合は、メモリー管理は比較的単純な作業であり得る。本出願人らは、不都合なことにそれが常に該当するとは限らず、メモリーエラーを生じさせるプログラミングバグの結果アプリケーションまたは命令セットがクラッシュする可能性があることを認識した。例えば、ワシントン州レドモンドのマイクロソフトコーポレーションによる研究では、Windows(登録商標)オペレーティングシステムで実行されるユーザーソフトウェアアプリケーションのプログラミングバグのために、毎日著しい回数のアプリケーションクラッシュ(同調査で分析された全クラッシュ数の約15%)の原因となっているメモリーエラーが発生していることが判明した。
【0016】
[0030]本出願人らは、プログラミングバグが原因でアプリケーションに悪影響を与えるエラーが発生する確率を下げる処置をとる、改良されたメモリー管理モジュールを使用することにより、アプリケーション中のプログラミングバグの影響を軽減できることを認識および理解した。例えば、メモリー管理モジュールは、アプリケーション要求より多い資源をアプリケーションに割り当てることにより、結果としてアプリケーションが要求したよりも多くのメモリーを使用する、またはアプリケーションがメモリーの使用を終えたことを通知した後にメモリーを使用することにつながる、アプリケーション中のバグを補償することができる。さらに、事例によっては、メモリー管理モジュールは、メモリー操作を行うための呼び出しをアプリケーションが行うことで要求されたメモリー操作を実行しないことによりエラーを軽減することができる。例えば、動作のための入力情報が不正確であることを検出した場合、メモリー管理モジュールはその動作を実行しなくてよい。種々の軽減活動で多くの異なる種類のエラーが軽減されることができ、それらの活動の例は下記でより詳細に述べる。ただし、メモリーエラーを引き起こすプログラミングバグを軽減する任意の適当な活動を行うことができるため、下記に挙げる以外に多くの異なる種類の軽減活動が可能であることを理解されたい。
【0017】
[0031]本出願人らは、場合によっては、軽減活動は、アプリケーションまたは他の命令セットの実行に悪影響を与え得ることも認識および理解した。例えば、要求されたよりも多くのメモリーをアプリケーションに割り当てる、または別のアプリケーションによる使用のためにメモリーを解放するまで遅延を置くと、コンピューティングデバイスはそうで
ない場合よりも多くのメモリーを使用する。また、メモリー操作がメモリー管理モジュールに受け取られた時に調べて軽減活動が利用可能であるかどうかを判定すると、それらのメモリー操作に応答するのにかかる時間が増大し、結果としてアプリケーションの実行時間が増大する。本出願人らは、メモリーマネージャーを呼び出すすべてのソフトウェアモジュール(「呼び出し側ソフトウェアモジュール」)に、メモリーエラーにつながるプログラミングバグがある訳ではないため、このような実行への悪影響は、これまでメモリーエラーを経験したことが検出されているかどうかに応じて呼び出し側ソフトウェアモジュールに選択的に軽減活動を適用することによって緩和できることを認識および理解した。したがって、本明細書には、アプリケーションのインスタンスである特定の呼び出し側ソフトウェアモジュールごとに異なる動作モードでメモリー操作を行う技術が記載され、動作モードは、アプリケーションのためのメモリー操作に軽減活動が適用される第1のモード、およびアプリケーションに軽減活動が適用されない第2のモード等である。
【0018】
[0032]また、本出願人らは、呼び出し側ソフトウェアモジュールに対して常に軽減モードでメモリー操作を行うことは効率的でない場合もあることを認識した。例えば、実装によっては、メモリー管理モジュールは、呼び出し側ソフトウェアモジュールによって経験され得るすべてのメモリーエラーを軽減するようには構成されない場合もあり、また、特定の呼び出し側ソフトウェアモジュールには、コンピューティングデバイスで実装された特定のメモリー管理モジュールで軽減できないプログラミングバグがある場合もある。別の例として、呼び出し側ソフトウェアモジュールによっては、実行頻度の低い命令にプログラミングバグがある場合もある。別の例として、呼び出し側ソフトウェアモジュールに、メモリーエラーを引き起こすバグがほとんどない場合もある。そのような場合はいずれも、呼び出し側ソフトウェアモジュールに対して軽減モードでメモリー管理モジュールを稼動させると、一部のエラーを軽減する助けとなり得るが、そのような軽減可能なエラーは頻繁でない可能性があり、軽減モードで稼動するために生じる効率性の損失が、エラーの軽減で得られる利得を上回る場合がある。
【0019】
[0033]したがって、本出願人らは、軽減モードでメモリー管理モジュールを稼動させる有効性を判定する検査を行い、その検査に応じてメモリー管理モジュールを構成することが望ましいことを認識および理解した。有効性の判定は任意の適当な方式で行われてよい。例えば、メモリーエラーの原因となったプログラミングバグがソフトウェアモジュールにある場合でも、メモリーエラーがモジュールに影響しなかったと検出された場合は、軽減活動が有効または成功裏にメモリーエラーを軽減したと判定することができる。この検査は、時間の経過と共にアプリケーションの複数インスタンスにわたって行って、エラーの回数および/または頻度、ならびに検出された軽減活動の成功の回数および/または頻度についての統計値を含む、軽減活動の有効性についての統計値を収集することができる。この統計値は、チケット値を含む適当な形態をとってよく、チケット値は、あるインスタンスにバグがある場合でも軽減活動が呼び出し元アプリケーションに対する影響を回避することに成功した場合に増分され、別のインスタンスで軽減活動が成功しなかった時に減分される。任意の適切な基準を使用して、軽減が成功したか、成功しなかったかを判定することができる。一部の実施形態では、軽減は、軽減することが可能な種類のバグが検出されない場合に不成功とみなすことができる。ただし、他の実施形態では、他の異なる基準または追加的な基準を適用することができる。以前の軽減の成功に基づいて軽減を適用することを選択した場合に生じる振る舞いの一例として、メモリー管理モジュールは、アプリケーションのインスタンスである特定のソフトウェアモジュールにメモリー操作を行う時に軽減モードで動作するように構成することができる。このモードには、クラッシュまたはメモリー機能に起因する他のエラーの後に入ることができる。いくらかの期間の後にモジュールへのメモリーエラーの影響を防止するのに軽減が有効でないと判定された場合、メモリー管理モジュールは、その特定アプリケーションの後続インスタンスについては軽減を行わない通常モードで動作するように構成することができる。この期間は、時間測定によって計測するか、かつ/または、成功した軽減がないままアプリケーションがクリーン終了した回数に基づく等の何らかの他の方式で計測することができる。以下にそ
のような判定を行うために使用できる例示的な検査を記載し、その検査の結果を使用して、メモリー管理モジュールが特定の呼び出し側ソフトウェアモジュールに対して動作する際のモードを制御することができる。
【0020】
[0034]本出願人らはさらに、広く公開されたソフトウェアアプリケーションに関連するもの等、ソフトウェアモジュールによっては複数のコンピューティングデバイスで実行される場合があり、そのようなコンピューティングデバイスはそれぞれ、そのソフトウェアモジュールを扱った経験、および軽減活動が有効であるかどうかについての経験を有する可能性があることを認識した。例えば、他のコンピューティングデバイスが、軽減活動が成功したか不成功であったかを判定した経験を有する場合がある。本出願人らは、したがって、他のコンピューティングデバイスの経験を活用して、アプリケーションに対して軽減活動を適用するかどうか、またはその長さを決定することにより、コンピューティングデバイスの性能をさらに向上させることが可能であることを認識および理解した。
【0021】
[0035]集約された情報を利用するために、コンピューティングデバイスは、エラーの種類および軽減活動の成功についての詳細な情報を、複数のデバイスから情報を収集する1つまたは複数の他のコンピューティングデバイスに送信するように適合することができ、複数のデバイスはすべて、1つのアプリケーションのインスタンスであるソフトウェアモジュールを実行している可能性がある。そのようなデバイスは、特定アプリケーションに関して軽減の成功についての情報を集約することができる。その集約情報に基づいて、デバイスが、特定のソフトウェアモジュールに対して軽減活動を適用するかどうかについての構成情報を、1つまたは複数のコンピューティングデバイスから受け取ることもできる。その情報は、軽減活動の成功が計測され得る際の基準となる統計値に関する情報等、任意の適切な形態でよい。例えば、構成情報は、アプリケーションに対する軽減を無効にするかどうかを判定する前に、より多い数または少ない数のアプリケーションインスタンスを考慮すべき旨の指示を含むことができる。そのような一部の実装では、指示は、アプリケーションに対する軽減を無効にするかどうかを判定するために、本明細書に記載の検査技術に従って使用することが可能な初期軽減チケット値を含むことができる。したがって、以下に、軽減活動を適用するようにコンピューティングデバイス上のメモリー管理モジュールを構成する際に使用できる情報を、他のコンピューティングデバイスとの間で送受信する技術が記載される。
【0022】
[0036]特定の実施形態では、本明細書に記載される原理の一部に従って、各実施形態がすべての原理を使用せずに、技術を実施することが可能であることを理解されたい。本発明の実施形態は、特定の原理またはそれら原理の特定の組で実施することに限定されないため、それら原理の1つまたは複数の適切な組み合わせを実装することができる。例えば、選択的に軽減活動を適用するが軽減活動の有効性は検査せず、他のコンピューティングデバイスから構成データを受け付けないメモリー管理モジュール、または、選択的に軽減活動を適用し、有効性を検査するが、他のコンピューティングデバイスからの構成データは受け付けないメモリー管理モジュールを実装することができる。
【0023】
[0037]以下に記載される技術は、各種方式で実装することができ、各種の命令セットに作用することができる。説明を簡潔にするために、以下の例では、メモリー管理モジュールおよびエラー報告サービスは、コンピューティングデバイスのオペレーティングシステムの一部として、また、ソフトウェアモジュールはオペレーティングシステムに管理されるアプリケーションとして説明する。そのような例は、本明細書に記載の原理の一部の商用実装の1つに見られ、その場合オペレーティングシステムはMicrosoft Windows(登録商標)であり、以下に記載される軽減モジュールはフォールトトレラントヒープ(FTH)クライアントであり、以下に記載の軽減有効化モジュールはFTHサーバーであり、エラー報告クライアントおよびサーバーは、Windows(登録商標)エラー報告(WER)サービスのコンポーネントである。ただし、これは本明細書に記載の原理を実装することが可能な種々の方式の一例に過ぎず、他の方式が可能であることを理解されたい。例えば、メモリー管理モジュールは、コンピューティングデバイスのオペレーティングシステムと対話する独立型コンポーネントとして、またはオペレーティング
システムに管理されるアプリケーションのコンポーネントとして、またはオペレーティングシステムを持たないコンピューティングデバイスで実行されるモジュールとして実装することが可能である。さらに、メモリー管理モジュールに要求を発行するソフトウェアモジュール(「呼び出し側ソフトウェアモジュール」)は、プロセッサーによって実行可能な命令の適切な構成であってよい。一部の実装では、ソフトウェアモジュールは、ユーザーアプリケーションのインスタンス、オペレーティングシステムのコンポーネント、サービスもしくはデーモン、または他の適切なソフトウェアモジュールであってよい。各ソフトウェアモジュールは、下記のように1つまたは複数の「機能モジュール」であってよい。
【0024】
[0038]また、メモリー管理モジュールは、1つまたは複数のメモリー操作の適当な組み合わせ、ならびに1つまたは複数の軽減活動の適当な組み合わせを行うように実装することができる。メモリー操作は、割り当て、割り当て解除(解放)、再割り当て、ページング、および多くのその他の操作等、メモリー資源の使用に影響する適当な動作であり得る。軽減活動は、呼び出し側ソフトウェアモジュール中のプログラミングバグがメモリーエラーを生じさせ、不適正な実行またはクラッシュを引き起こす等して呼び出し側ソフトウェアモジュールに負の影響を与える可能性を低減するために、メモリー管理モジュールで行うことが可能な任意の適当な活動であってよい。
【0025】
[0039]メモリーエラーは、不適正な実行またはクラッシュを引き起こす等によりソフトウェアに負の影響を与え得るメモリー破損を生じさせるエラーであり得る。多くの場合、メモリー破損は、メモリー操作間の不整合につながるプログラミングバグが原因で生じ得る。メモリーエラーには、割り当てメモリーの境界外側への書き込み(バッファオーバーランまたはアンダーラン)、重複する時間に2つのモジュールがそれぞれ同じメモリー空間を使用している際の別のソフトウェアモジュールによる格納情報の上書き、または、モジュールに割り当てられたメモリー部分と異なる部分の使用、が含まれる。これらのメモリーエラーは、ソフトウェアモジュールが経験し、本明細書に記載の原理の一部によって軽減され得る種類の例に過ぎないことを理解されたい。
【0026】
[0040]メモリーエラーの軽減は、1つまたは複数の適切な軽減活動を行うことにより、適当な方式で行うことができる。場合によっては、軽減活動は、整合しないメモリー操作を予想して行われる活動、およびその不整合に対処しようとする活動を含むことができる。例示的な軽減活動は下記でより詳細に説明するが、実行前に操作を変更する活動、操作を実行しない活動、後の時に操作を実行する活動、実行前に操作についての正しい入力を確認する活動、または、メモリー空間に対する最小限の変更で操作を行う活動を含み得る。
【0027】
[0041]さらに、一般に「ヒープ」メモリーと呼ばれる1種類のメモリーに動作するメモリー管理モジュールを用いる例示的実装を以下に記載する。ただし、スタックメモリーおよび/またはグローバル変数メモリーを含む1つまたは複数の適切な種類のメモリーが、本明細書に記載の原理の一部に従って動作する技術で管理されることが可能であることを理解されたい。
【0028】
[0042]本明細書に記載の原理の一例示的実装では、呼び出し側ソフトウェアモジュール(例えばソフトウェアアプリケーションのインスタンスであり得る)が、メモリー操作を行う要求をメモリー管理モジュールに発行することができる。メモリー管理モジュールは、軽減有効化モジュールと対話することができる。軽減有効化モジュールは、有効化モジュールによって格納された規則および設定データの1つまたは複数のエントリーを調べて、その特定の呼び出し側ソフトウェアモジュールに操作を行う際にメモリー管理モジュールが動作するモードを決定することができる。この実装および一部の他の実装では、規則および設定データの調査は、1つまたは複数の統計が閾値レベルを上回るか、下回るかを調べて判定することを含むことができる。規則および設定が、メモリー管理ユニットが軽減モードで動作すべきでないと示す場合、例えば軽減チケット値が閾値レベル未満の場合は、メモリー操作は要求通り行われる。一方、規則および設定が、メモリー管理ユニットが軽減モードで動作すべきと示す場合は、メモリー管理ユニットの軽減モジュールが有効
にされることができる。そして軽減モジュールは、メモリー管理モジュールと連携して、メモリーエラーが呼び出し側ソフトウェアモジュールに負の影響を与える可能性を低減するのに役立ち得る1つまたは複数の軽減活動に従ってメモリー操作を行うことができる。メモリー管理モジュールの動作モードは、好ましくはソフトウェアモジュールごとに独立しており、またメモリー管理ユニットは、ある呼び出し側ソフトウェアモジュールには第1のモードでメモリー操作を行い、別の呼び出し側ソフトウェアモジュールには第2のモードで別のメモリー操作を行ってよいことを理解されたい。
【0029】
[0043]この例示的実装では、軽減モジュールおよび軽減有効化モジュールは、1つまたは複数の軽減活動が、一旦有効化されるとエラーの軽減に成功したかどうかを評価するようにも適合することができる。これは、任意の適当な方式で行うことができ、その例は以下で述べる。例えば、軽減活動が行われると、最初の観察が行われ、後に記録された観察結果と比較されて、その軽減活動でエラーの発生が阻止された可能性のあるプログラミングバグを示唆する可能性のある活動を呼び出し側ソフトウェアモジュールが行ったかどうかを判定することができる。例えば、下記で述べるように、割り当て動作時に、要求よりも多くの量のメモリーを割り当てることができ、その追加メモリーにマーカー値を書き込むことができる。後に呼び出し側ソフトウェアモジュールがメモリーの割り当て解除を要求すると、軽減モジュールは、追加メモリーを調べて、マーカー値がまだメモリーにあることを確かめることができる。マーカー値の一部またはすべてが上書きされている場合は、軽減モジュールは、軽減活動(追加メモリーの割り当て)が、バッファオーバーランが原因で生じるメモリーエラーを防止する効果があったと判定することができる。軽減活動の有効性の評価のさらなる詳細および他の例示的検査を下記で述べる。軽減チケット値を用いる一部の実装では、特定の呼び出し側ソフトウェアモジュールに対して軽減活動が有効であったと判定されると、軽減チケット値を増分することができ、軽減活動が有効でなかった、または効果がなかったと判定された場合は、軽減チケット値は減分することができる。
【0030】
[0044]この実装では、軽減モジュールおよび軽減有効化モジュールは、さらに、メモリーエラーがソフトウェアモジュールに負の影響を与えることを防止するための軽減活動の有効性、およびその軽減活動を有効にするかどうかに関する情報を、遠隔のコンピューティングデバイスとの間で送受信するように適合することができる。例えば、呼び出し側ソフトウェアモジュールがクラッシュしたことをメモリー管理モジュールが検出すると、メモリー管理モジュールは、記録から、メモリーエラーが検出されたかどうか、およびそれらのメモリーエラーの中で軽減されたものがあるかどうかを判定することができる。そして、その情報を1つまたは複数の他のコンピューティングデバイスに送信し、それに対して1つまたは複数の他のコンピューティングデバイスから情報を受け取ることができる。すべての実装で該当する訳ではないが、この例示的実装では、1つまたは複数の他のコンピューティングデバイスは集約サーバーを備えることができ、集約サーバーも、Windowsエラー報告サービス等のエラー報告サービスの一部として機能することができる。集約サーバーは、1つまたは複数のコンピューティングデバイスからエラーおよび軽減の情報を受け付け、その情報を、クラッシュしたことが検出されたソフトウェアモジュールの開発者を含むベンダーに送信することができる。集約サーバーは、各コンピューティングデバイスで軽減活動がメモリーエラーの軽減に成功しているかどうかも判定することができ、特定のソフトウェアモジュールについて軽減モードを有効にするかどうかをそのコンピューティングデバイスに通知することができる。一部の実装では、軽減モードを有効にするかどうかをコンピューティングデバイスに通知することは、軽減チケット値の推奨初期値の送信を含むことができ、この値は、軽減がこれまで成功している、または高確率で成功している場合はより高い値とし、軽減がこれまで成功していない、または低い確率でのみ成功している場合はより低い値等とされるが、本発明の実施形態はこの点で限定されないため、他の実装は任意の適切な構成情報で動作してよいことを理解されたい。
【0031】
[0045]この例示的実施形態は、本明細書に記載される原理の多くに従って動作するものと記載されるが、他の実装は、それらの原理のうちより多い数または少ない数に従って動
作することが可能であり、すべての実装が本明細書に記載のすべての原理に従って動作することが可能であるとは限らないことを理解されたい。
【0032】
[0046]上記で簡単に述べたように、本出願人らは、多くの異なる種類のプログラミングバグが、ソフトウェアモジュールを不適正に実行させる、またはクラッシュさせる等により、ソフトウェアモジュールに負の影響を与え得るメモリーエラーを引き起こす可能性があることを認識した。文脈上、最も一般的なそのようなプログラミングバグのいくつかを以下に記載するが、このエラーの列挙は、本明細書に記載の原理の一部の実装で軽減することが可能なすべてのプログラミングバグを網羅するものではなく、それらの原理の一部またはすべてに従って動作する技術を使用して軽減することが可能な他のバグが存在することを理解されたい。
【0033】
[0047]第1の例として、呼び出し側ソフトウェアモジュールが、ある量のメモリー、例えば16バイトのメモリーを自身に割り当てるようにメモリー管理モジュールに要求し、次いで要求したよりも多くのメモリー、例えば17バイト以上を使用することを試みる場合がある。従来のメモリー管理モジュールは、ソフトウェアモジュールが追加のメモリーを使用していることを検出することができず、そのメモリーを別のソフトウェアモジュールに割り当てる可能性がある。そして、他方のソフトウェアモジュールがメモリーの使用を開始すると、1つまたは両方のソフトウェアモジュールがメモリーの使用を試みた時にメモリーエラーの結果不適正な実行となるか、さらにはクラッシュする可能性がある。
【0034】
[0048]メモリーエラーを引き起こす可能性のあるプログラミングバグの第2の例として、ソフトウェアモジュールが、いくらかのメモリーをソフトウェアモジュールに割り当てるようにメモリー管理モジュールに要求し、その後メモリーを使用し終わったことをメモリー管理モジュールに通知するが、その後メモリーを使用し続ける場合がある。メモリー管理モジュールの記録では、メモリーは、解放されて別のソフトウェアモジュールに割り当てられる状態になっており、両方のソフトウェアモジュールが同時にメモリーの使用を試みて、結果として一方または両方が不適正な実行となる可能性がある。
【0035】
[0049]第3の例として、ソフトウェアモジュールが、メモリーを使い終わったことをメモリー管理モジュールに通知することによってモジュールに割り当てられていたメモリーを「解放」し、その後、プログラミングバグのためにそのメモリーを再び解放する場合がある。メモリー管理モジュールは、その間にそのメモリーを別のソフトウェアモジュールに割り当てている可能性があり、2番目の不適正な解放操作の結果、メモリーを第3のソフトウェアモジュールに割り当てる可能性がある。そして、第2および第3のソフトウェアモジュールの一方または両方が、第1のモジュール中のプログラミングバグのために不適正な実行となる可能性がある。
【0036】
[0050]第4の例として、一部のソフトウェアモジュールは、終了されると、自身に割り当てられていたすべてのメモリーを解放することを試みるが、試みるのが早過ぎる、または他の形で不正確である場合があり、その結果ソフトウェアモジュールがクラッシュする可能性がある。
【0037】
[0051]第5の例として、汎用アドレス空間、スタックメモリー、および動的メモリーまたはヒープメモリー等の異なる種類のメモリーに異なる情報が格納される場合がある。命令セットの中には、プログラミングバグのために、ヒープメモリー操作を使用して汎用アドレス空間メモリーで行われるべき操作を行う等、誤ったコマンドを使用して異なる種類のメモリーと対話するものがあり得る。メモリー管理モジュールが、汎用アドレス空間メモリーの識別子を使用してヒープメモリーに対する操作を行うと、間違ったメモリー上で動作していることになり、ヒープメモリーを使用して呼び出しまたは命令セットを行うソフトウェアモジュールは、結果としてクラッシュする可能性がある。
【0038】
[0052]第6の例として、命令セットへのメモリー割り当てを縮小または拡大する再割り当て操作では、メモリー割り当てを別のメモリー部分に移動することができるが、プログラミングバグのために、命令セットが、元の場所のメモリーを参照し続ける場合がある。したがって、その元のメモリーを使用している当該命令セットおよび他の命令セットがバグの結果クラッシュする可能性がある。
【0039】
[0053]メモリー管理モジュールは、本明細書に記載の原理に従って動作することにより、上記および他のプログラミングバグが、不適正な実行さらにはクラッシュを引き起こすことでソフトウェアモジュールに負の影響を与えるメモリーエラーを生じさせるのを防止することができる。ソフトウェアモジュールへの負の影響は、ユーザーエクスペリエンスに負の影響を与える可能性があり、そのようなプログラミングバグの影響を軽減するとユーザーエクスペリエンスが大幅に改善する可能性がある。また、選択的に軽減活動を有効にするように動作し、軽減活動の有効性を検査することにより、それらの軽減活動の負の影響自体を軽減することができる。
【0040】
[0054]本明細書に記載の原理に従って動作する上記および他の技術のさらなる機能および利点は、下記の例からより完全に理解されよう。以下の例は、本発明の理解を助け、本明細書に記載される原理の利益を示すものであるが、本発明の実施形態の全範囲を例示するものではない。
【0041】
[0055]本明細書に記載の原理に従って動作する技術は、各種コンピューティングシステムで実装することができ、その例は下記で詳細に説明する。そのようなシステムは、一般に、いくつかの機能モジュールを実装する適切に構成されたコンピューティングデバイスの使用を伴い、各機能モジュールは、そのような技術の実行を達成するために必要な1つまたは複数の動作を提供する。各機能モジュールは、各自の方式で実装することができ、すべての機能モジュールを同じ方式で実装する必要はない。本明細書で使用される場合、機能モジュールは、動作上の役割を行うシステムの構造コンポーネントである。動作上の役割は、1つのソフトウェア要素の一部であっても、全体であってもよい。例えば、機能モジュールは、プロセス、単独プロセス、または他の適切な処理単位の機能を行うことができる。機能モジュールは、コンピューター実行可能命令を備えることができ、コンピューター記憶媒体にコード化されることができる。また、そのようなコンピューター実行可能命令は、いくつかの適切なプログラミング言語および/またはプログラミングツールもしくはスクリプト化ツールを使用して書くことができ、フレームワークまたは仮想機械で実行される実行可能機械言語コードまたは中間コードとしてコンパイルすることもできる。機能モジュールは、適宜、並列または直列実行することができ、メッセージパッシングプロトコルを使用して、または他の適当な方式で、モジュールが実行されるコンピューター上の共有メモリーを使用して相互間で情報を渡すことができる。1つまたは複数のタスクを実行する例示的な機能モジュールを以下で説明するが、記載される機能モジュールおよびタスクの分割は、本明細書に記載の例示的技術を実装することが可能な機能モジュールの種類を例示するに過ぎず、また、本発明は、特定の数、分割、または種類の機能モジュールへの実装に限定されないことを理解されたい。一部の実装では、全機能を単一の機能モジュールに実装することができる。さらに、下記では、分かりやすいように、機能モジュールはすべて1つまたは2つのコンピューティングデバイスで実行されるものとして述べるが、実装によっては、機能モジュールは、相互と通信するように構成された多くの別個のコンピューティングデバイスまたは単一のコンピューティングデバイスの別個のプロセッサーで実装されてよいことを理解されたい。例えば、1つのプロセッサーが、メモリー操作を行う要求をメモリー管理モジュールに発行する呼び出し側ソフトウェアモジュールを実行するように適合され、別のプロセッサーが、メモリー管理モジュールを実行するように適合されることができる。
【0042】
[0056]下記のいくつかの例示的実施形態では、本明細書に記載の原理に従って動作する技術は、磁気媒体(例えばハードディスクドライブ)、コンパクトディスク(CD)やデジタル多用途ディスク(DVD)等の光学媒体、永続的もしくは非永続的な固体素子メモリー(例えばフラッシュメモリー、磁気RAM等)、または他の適切な記憶媒体等の1つまたは複数のコンピューター可読記憶媒体にコード化されたコンピューター実行可能命令として実装することができる。コンピューター記憶媒体は、図1および図9のコンピューター可読記憶媒体104として(すなわちコンピューティングデバイス100の一部として)、または独立したコンピューター記憶媒体として実装することができる。本明細書で使用される場合、「コンピューター可読記憶媒体」を含む「コンピューター可読媒体」は
、媒体へのデータの記録過程中に何らかの方式で変更されることが可能な少なくとも1つの物理構造を持つ有形記憶媒体を指すことを理解されたい。例えば、記録の過程中にコンピューター可読媒体の物理構造の一部の磁化状態を変更することができる。いくつかのそのような実施形態では、本明細書に記載の原理に従って動作する技術を実装するコンピューター実行可能命令は、1つまたは複数の独立型機能モジュール(例えばメモリー管理モジュール)として実装することができる。
【0043】
[0057]本明細書に記載の技術はコンピューター実行可能命令として実施されるが、下記で説明する図1および図9の例示的コンピューティングデバイスを含めて、任意の適切なコンピューターシステムで動作する適切なコンピューティングデバイスで実行することが可能である。例えば、本明細書に述べられる原理の一部またはすべてに従って動作する技術は、単一の多用途プログラム可能デジタルコンピューター装置、処理能力を共有し、本明細書に記載の技術を共同して実施する2つ以上の多用途コンピューター装置からなる連携システム、本明細書に記載の技術の実行を専用とする単一のコンピューター装置もしくは(共に配置または地理的に分散された)コンピューター装置からなる連携システム、本明細書に記載の技術を実施するための1つまたは複数の特定用途集積回路(ASIC)、本明細書に記載の技術を実施するための1つまたは複数の利用者設定可能ゲートアレイ(FPGA)、または他の適切なシステムで動作することが可能である。
【0044】
[0058]図1に、本明細書に記載の技術を実施するシステムで使用することが可能なコンピューティングデバイス100の形態のコンピューティングデバイスの例示的な一実装を示すが、他の実装が可能である。さらに、図1は、コンピューティングデバイスが本明細書に記載の原理に従って動作するために必要な構成要素の図示でも、完全な図示でもないことを理解されたい。他の適切なコンピューティングデバイスで他の実装が動作し得ることをさらに理解されたい。
【0045】
[0059]コンピューティングデバイス100は、プロセッサー102、コンピューター可読記憶媒体104、およびメモリー116を備えることができる。コンピューティングデバイス100は、例えばデスクトップまたはラップトップ型パーソナルコンピューター、ワークステーション、サーバー、メインフレーム、スマートフォン、携帯情報端末(PDA)、独立型ネットワークデバイス、または、1つまたは複数のソフトウェアモジュールを1つの時に実行することができ、1つまたは複数のソフトウェアモジュール間で共有可能なメモリー等の1つまたは複数の資源を有する他の適切なコンピューティングデバイスを含む、適切なコンピューティングデバイスであってよい。コンピューター可読記憶媒体104は、プロセッサー102によって処理されるデータおよび/または実行される命令を格納するように適合された、適切な有形記憶媒体であってよい。プロセッサー102は、データの処理および命令の実行を可能にする。データおよび命令は、コンピューター可読記憶媒体104に格納することができ、例えばコンピューティングデバイス100の構成要素間の通信を可能にすることができる。
【0046】
[0060]コンピューター可読記憶媒体104に格納されたデータおよび命令は、本明細書に記載の原理に従って動作する技術を実装するコンピューター実行可能命令を含むことができる。図1の例では、コンピューター可読記憶媒体104は、上記のように、各種モジュールを実施するコンピューター実行可能命令を格納し、各種情報を格納する。コンピューター可読記憶媒体104は、コンピューティングデバイスで実行することが可能な1つまたは複数のソフトウェアモジュール106と、コンピューティングデバイス100におけるプロセスの実行を支配し、メモリー116等の共有資源の使用を調整することができるオペレーティングシステム108とに関連するデータおよび命令を格納する。
【0047】
[0061]メモリーの使用を調整するために、オペレーティングシステム108は、呼び出し側ソフトウェアモジュールによって要求されるメモリー操作を行うメモリー管理モジュール110を有することができる。呼び出し側ソフトウェアモジュールは、ソフトウェアアプリケーション106、オペレーティングシステム108の他のコンポーネント、またはコンピューティングデバイス100で実行される他のソフトウェア要素等であり得る。メモリー管理モジュール110は、従来のメモリー管理技術ならびに本明細書に記載の技
術の1つまたは複数を行うように、任意の適当な方式で実装することができる。上記のように、本明細書に記載の技術の一部の実装では、メモリー管理モジュール110は、呼び出し側ソフトウェアモジュールによってメモリー操作が要求されると1つまたは複数の軽減活動を行う働きをすることが可能な軽減モジュール112を備えることができる。軽減モジュール112は、軽減活動を必要としていることが検出されたソフトウェアモジュールだけに軽減活動が行われるように、呼び出し側ソフトウェアモジュール単位で選択的に適用されてよい。したがって、そのような実装で検出および有効化を行うために、オペレーティングシステム108はさらに、コンピューティングデバイス100内のソフトウェアモジュールの実行を監視する軽減有効化モジュール114を備えることができる。ただし、代替の実装では、軽減モードは、コンピューティングデバイス900の管理者等によって手動で有効または無効にすることができ、そのような実装では、軽減有効化モジュールは備えなくてよい。軽減モジュール112および軽減有効化モジュール114を含む図1に示すモジュールは、下記の例示的技術を含めて、本明細書に記載の原理に従って適当な方式で動作するように適合することができる。
【0048】
[0062]図1に示す実装は、本明細書に記載の原理を実装することが可能な種々の方式の例示に過ぎないことを理解されたい。本発明の実施形態は特定のモジュールまたはモジュールのセットとして実装されることに限定されないため、代替の実装では、軽減モジュールおよび軽減有効化モジュールは、オペレーティングシステムとは別個のコンポーネントとして実装しても、または、オペレーティングシステム中の単一のコンポーネントとして、または他の適当な方式で実装してもよい。
【0049】
[0063]従来のメモリー管理モジュールと、図1に示す実装に従って動作するメモリー管理モジュールの違いを図2Aおよび図2Bに示す。図2Aでは、複数の呼び出し側ソフトウェアモジュール200が、メモリー操作の実施要求を含む操作要求202および204をオペレーティングシステムAPIおよびメモリー管理モジュール206に発行している。それらの操作は要求通りに実施され、適切な情報が呼び出し側ソフトウェアモジュールに戻される。軽減活動は利用することができず、呼び出し側ソフトウェアアプリケーションの監視は行われず、これらのソフトウェアモジュールは、上記のものを含むプログラミングバグが原因で発生するメモリーエラーの影響を受ける可能性がある。
【0050】
[0064]図2Bに、図1の例示的実装を示し、ここでは軽減モジュール112がオペレーティングシステムのコンポーネントとして実装されている。この実装では、図の実施形態のソフトウェアモジュールは、軽減モジュール112、および軽減モジュール112が特定の呼び出し側ソフトウェアモジュールに対して実装されているかどうかを認識しないので、呼び出し側ソフトウェアモジュール200は、オペレーティングシステムおよびメモリー管理モジュール206に図2Aと同じ操作要求202および204を発行する。上記で述べ、図2Bに示すように、軽減モジュール112は、呼び出し側ソフトウェアモジュールごとに選択的に適用されて1つまたは複数の軽減活動を行うことができ、したがって、呼び出し側ソフトウェアモジュール200によって発行された操作要求は、必ずしもすべてではないが、一部が軽減モジュール112にインターセプトされる。特定の呼び出し側ソフトウェアモジュールに軽減モジュール112を有効にすべきかどうかを判定するために、軽減有効化モジュール114は、メモリー管理ユニット110および軽減モジュール112、ならびに呼び出し側ソフトウェアモジュール200と通信状態にある。
【0051】
[0065]呼び出し側ソフトウェアアプリケーションからメモリー操作を行う要求が送信されたことを検出すると、軽減有効化モジュール114は、軽減有効化モジュール114に関連付けられた軽減データストア212に格納された情報を検討して、要求されたメモリー操作を行う際に軽減モジュールが軽減モードで動作すべきかどうかを判定することができる。データストア212は、メモリー管理モジュール110の動作に関連する情報を維持しているため、メモリー管理モジュール110に関連付けられたデータストアとみなしてもよく、上記の一部の実装では、軽減有効化モジュール114がメモリー管理モジュール110の一部として実装される場合は、メモリー管理モジュール110の一部としてもよい。データストア212に格納された情報の検討は、イベントログ216ならびに規則
および設定218の検討を含めて、適当な動作を含むことができる。データストア212は、永続的な方式で格納することができ、軽減有効化モジュール114が無効化またはシャットダウンされた場合、後に再有効化されると、それまでに行われた決定についての情報を含む、過去に収集された情報にアクセスすることができる。
【0052】
[0066]データストア212は、呼び出し側ソフトウェアモジュール200に経験されたメモリーエラー、軽減されたことが検出されたメモリーエラー、および行われることが要求されたメモリー操作についての情報を含むイベントログ216を格納することができる。イベントログ216の各エントリーは、任意の適切な情報を含むことができ、それらの情報には、ソフトウェアモジュールの名前等のバケットパラメーター、ソフトウェアモジュールのバージョン、エラー時に実行されていたソフトウェアモジュールのライブラリーまたは部分、エラーが検出された実行中の点、およびエラーを記述する例外コード、ならびに他の適切な情報が含まれる。規則および設定18は、1つまたは複数の呼び出し側ソフトウェアモジュール200についての適切な情報、ならびに一般的な軽減ポリシーについての情報を格納することができる。図2Cに、規則および設定218に格納することが可能な情報の一例を示す。規則および設定218は、複数の呼び出し側ソフトウェアモジュール200それぞれについてのエントリーを備えることができ、エントリーは、各呼び出し側ソフトウェアモジュールについて、アプリケーション識別子等の呼び出し側ソフトウェアモジュールの識別子、その呼び出し側ソフトウェアモジュールに対して軽減モードを有効にするかどうかの判定で使用できる1つまたは複数の値、および有効にする場合に軽減が有効にされた時刻を含む。軽減モードを有効にすべきかどうかの判定で使用できる1つまたは複数の値は、任意の適切な値でよく、ソフトウェアモジュールが経験したエラーに関して、および/または呼び出し側ソフトウェアモジュールが関連付けられたアプリケーションの1つまたは複数のインスタンスにわたる軽減活動の成功の検出に関して収集されることが可能な1つまたは複数の統計値が含まれる。それらの統計値は適切な形態をとることができる。一部の実装では、統計値は、成功が検出されると増分され、エラーが検出されると減分されることが可能な軽減チケット値の形をとることができる。そして、軽減チケット値を閾値等の他の統計値と比較して、そのアプリケーションの後続インスタンスに軽減モードを有効にすべきかどうかを判定することができる。ただし、統計値は、規則および設定218に格納することが可能な値の種類の一例に過ぎず、軽減チケット値は、格納することが可能な統計値の種類の一例に過ぎないことを理解されたい。
【0053】
[0067]軽減有効化モジュール114は、その情報を適当な方式で検討して、下記の例示的技術等により、特定のソフトウェアモジュールに対して軽減モードを有効にするかどうかを決定することができる。
【0054】
[0068]特定のソフトウェアモジュールに対して軽減モードを有効にするかどうかを判定する例示的技術を説明する文脈を提供するために、軽減モジュール112が軽減モードで動作するための例示的技術を初めに説明する。上記で概説した例および下記でより具体的に説明する例を含む軽減活動は、任意の適当な方式で行うことができ、それらの軽減活動を実施する軽減モードは、任意の適当な方式で行われてよい。図3に、メモリー管理モジュールを選択的に軽減モードで稼動させる本発明の実施形態によって実装できる、軽減モジュール112が軽減モードで動作する方式の一例を示すが、メモリー管理モジュールは、本明細書に記載の原理に従う適当な方式で実装してよいため、異なる2つのモードで動作させないことを含めて、他の方式が可能である。
【0055】
[0069]図3の例示的プロセス300はブロック302で開始し、呼び出し側ソフトウェアモジュールが、メモリー操作をメモリー管理モジュール110に行わせる要求を発行する。ブロック304で、要求を発行した特定の呼び出し側ソフトウェアモジュールについて、メモリー管理モジュール110が軽減モードで動作して1つまたは複数の軽減活動を行うべきかどうかが判定される(下記の一部の事例では、説明を簡潔にするために、これは、ソフトウェアモジュールが軽減モードで動作するかどうか、と記載する場合があるが、これは純粋に説明を容易にするために行われるものであり、好ましくは、ソフトウェアモジュールは軽減モジュールおよび軽減モジュールが動作しているモードを認識しないこ
とを理解されたい)。メモリー管理モジュール110が軽減モードで動作すべきと判定された場合は、軽減モジュール112が有効にされ、メモリー操作を行う要求をブロック306で受け取る。
【0056】
[0070]ブロック306で要求を受け取ると、軽減モジュール112およびメモリー管理モジュール110は、軽減活動に従ってメモリー操作を行うことができる。一部の実装では、これは、単一の活動の実施、または多数の活動の実施を含むことができる。図3の図示では、分かりやすいように、軽減活動に従ったメモリー操作の実施を4つの別個の動作として示すが、これは単に視覚化の容易のためであり、図3に従って動作する技術は図示の通りに実装されない場合もあることを理解されたい。
【0057】
[0071]ブロック308で、軽減モジュール112は、少なくとも要求されたメモリー操作の種類およびその操作の入力パラメーターに基づいて、自身が軽減活動を行うように適合されているかどうかを判定する。これを行うことができるのは、一部の実装では、軽減モジュール112は、1つまたは複数のメモリー操作のセットから生じる1つまたは複数の種類のメモリーエラーだけを軽減するように構成することができ、そのため、特定のメモリー操作について行うことができる軽減活動を持たない場合もあるためである。一部の代替実装では、全種類のメモリー操作について軽減活動を行うように適合されたメモリー管理モジュール112を実装することもでき、したがって、判定ブロック308のあるプロセスを実装しない場合もある。
【0058】
[0072]ブロック308で利用可能な軽減活動が少なくとも1つあると判定された場合は、ブロック310でその軽減活動が行われ、これは軽減活動を当該操作に適用することを含むことができる。メモリー操作への軽減活動の適用は、下記で詳細に述べる手順を含めて、任意の適切な手順を備えてよい。例えば、軽減活動の適用は、操作の入力パラメーターが正しいかどうかを判定する等のメモリー操作の評価、要求されたメモリー量を増やす等のメモリー操作のパラメーターの調整、後の時までメモリー操作を行うのを待つ、またはメモリー操作を行わないことを含むことができる。軽減活動が適用された後に、ブロック312で、そのメモリー操作をなお行うべきかどうかが判定される。行う場合は、ブロック314で軽減が適用された操作が行われ、プロセス300が終了する。一方、ブロック312でメモリー操作を行うべきでないと判定された場合、例えば軽減活動がメモリー操作を行っていない場合や、入力パラメーターが不正確と判定される場合も、プロセス300は終了する。
【0059】
[0073]ブロック304に戻り、メモリー管理モジュール110が軽減モードで動作すべきでないと判定された場合、またはブロック308で利用可能な軽減活動がないと判定される場合は、ブロック316で要求通りにメモリー操作が行われ、プロセス300が終了する。ブロック316の実行は、従来のメモリーマネージャーで行われるような実行でよいが、適切な実行方法が使用されてよい。
【0060】
[0074]図4A、4B、4Cおよび4Dに、図3のブロック310等で、少なくとも1種類の軽減活動を行うために軽減モジュール112によって試みられることが可能な4つの異なるプロセスを示す。これらのプロセスは、そのような軽減活動を実行するために実装可能なプロセスの種類の例示に過ぎず、さらに、それらの軽減活動は、軽減モジュール112で実施することが可能な軽減活動の種類を例示するに過ぎないことを理解されたい。
【0061】
[0075]そのような軽減活動の第1の例を図4Aのプロセス400Aに示す。プロセス400Aはブロック402で開始し、呼び出し側ソフトウェアモジュールによって要求されるメモリー操作が割り当て動作、すなわち、呼び出し側ソフトウェアモジュールがある量のデータをある期間格納できるように自身にいくらかの量のメモリーを割り当てる要求であるかどうかが判定される。そのような要求でない場合、プロセス400Aは終了する。一方、要求されたメモリー操作がある量のメモリーの割り当て動作である場合は、ブロック404で、割り当てメモリーの量を増やす軽減活動が行われる。一部の実装では、この増加されたメモリー量は、要求されるメモリーのサイズに依存することができ、例えば要求メモリーの2倍とすることができる。別の実装では、追加メモリーは、所与のコンピューティングデバイスに対して固定量のメモリーであってよく、例えば、32ビットプロセ
ッサーの場合は、追加割り当てメモリーは32バイト(すなわち4バイトが要求された場合、合計割り当て量は36バイト)、64ビットプロセッサーの場合は、追加割り当てメモリーは48バイトとすることができる。任意の適切な量の追加メモリーをブロック404で割り当ててよい。
【0062】
[0076]次いで、ブロック406で、マーカー値を追加メモリーに格納することにより、追加メモリーが追加メモリーとして「マーク」される。マーカー値は任意の適切な値でよく、メモリーブロック単位等のメモリー単位ごとに格納される、繰り返される値か、または、割り当てられた追加メモリーの全空間にわたって書き込まれる単一の値もしくは値のパターンであってよい。このマーカー値は、下記のように、メモリーエラーの軽減に軽減活動が成功したかどうかを判定する評価の一部として使用できる任意の適切な値でよい。例えば、追加メモリーが後に再調査され、マーカー値が上書きされたと判定された場合は、ソフトウェアモジュールが、バッファオーバーランエラーを生じさせたプログラミングバグの影響を受けている(つまり要求されたよりも多くの量のデータが書き込まれ)、追加の割り当てで余分の空間を割り当てることによってメモリーエラーが軽減されたと判定することができる。マーカー値が書き込まれると、プロセス400Aは終了する。
【0063】
[0077]図4Bに、本明細書に記載の原理の一部に従って軽減活動を実行する第2の例示的プロセス400Bを示す。プロセス400Bはブロック410で開始し、要求されるメモリー操作が、呼び出し側ソフトウェアモジュールが以前に割り当てられたある量のメモリーを増加または減少することを求める再割り当て操作であるかどうかが判定される。再割り当て操作でない場合は、プロセス400Bは終了する。
【0064】
[0078]一方、メモリー操作が再割り当て操作である場合は、ブロック412で、要求がメモリー割り当て量の減少であるかどうかが判定される。メモリー割り当て量の減少である場合は、ブロック414で、元の割り当ての残りのメモリーの割り当てが解除される時に、割り当てが同じルート位置に保たれる。ブロック416で、メモリー管理モジュール110は、残りのメモリーを直ちには解放せず、待ち時間の後まで待機する。ブロック414で、上記のようなマーカーが解放されるメモリーに付加されることができる。メモリーが実際に解放される時に、それらのマーカーを調べて、使用されなかったはずのメモリーがアクセスされたかどうかを確認することができる。そしてプロセス400Bは終了する。
【0065】
[0079]ブロック412で要求される再割り当てがメモリー量の増加であると判定された場合は、ブロック418で、元の割り当てのすぐ隣に十分な空きメモリーがあって、すぐ隣のメモリーから要求の新しいメモリーを割り当てることができ、元の場所をデータのために保持しておくことができるかどうかが判定される。そうである場合は、ブロック420でそれが行われ、すなわち、元の割り当てにあるデータが同じ場所に保たれ、その場所から割り当てが拡大され、プロセスが終了する。
【0066】
[0080]一方、すぐ隣に十分なメモリーがない場合は、ブロック422で割り当てがメモリーの別の部分のより大きな空間に移動され、ブロック424で、待ち時間の後まで元のメモリーの割り当てが解除されない。上記のように、以前割り当てられ、もはや使用すべきでないメモリーをマーカーで満たして、そのメモリーへのアクセスを発生させるバグを検出することができる。そしてプロセスは終了する。
【0067】
[0081]この軽減を使用して、メモリー割り当てがメモリーの別の部分に移動された再割り当て操作の後に、ソフトウェアモジュールに元のメモリー空間を引き続き使用させるプログラミングバグの影響を受けるソフトウェアモジュール中のメモリーエラーを軽減することができる。メモリー割り当てを同じ場所に保持することを試み、待ち時間後まで他のソフトウェアモジュールにメモリーブロックを使用させないことにより、ソフトウェアモジュールは待ち時間が満了するまで元の割り当てを使用することができるので、そのようなプログラミングバグの影響を軽減することができる。
【0068】
[0082]図4Cに別の例示的プロセス400Cを示す。プロセス400Cはブロック430で開始し、要求される操作が割り当て解除、すなわち「解放」操作であるかどうかが判定される。そうでない場合プロセス400Cは終了する。
【0069】
[0083]一方、要求されるメモリー操作が解放操作である場合は、ブロック432で、解放操作の入力パラメーターが正しいかどうかが判定される。例えば、メモリー管理モジュール110がヒープメモリーの割り当てを管理するモジュールである場合は、ブロック432で、解放が要求されるメモリーのアドレスが、スタックメモリーまたはグローバル変数空間のアドレスではなく、適正に割り当てられたヒープメモリーであるかどうかが判定されることができる。この判定は、任意の適当な方式で行うことができる。
【0070】
[0084]例えば、軽減モジュール112は、アドレスをヒープのアドレス範囲と比較することにより、「解放」操作の入力アドレスで参照されるメモリーがヒープメモリーであるかどうかを判定することができる。ヒープメモリーでない場合は、入力アドレスが誤っている可能性がある。別の例として、メモリーマネージャーは、ヒープ内にメモリーブロックを割り当てると、そのブロックをマーカーで標識付けすることができる。軽減モジュール112が図4Aのプロセス400Aを実施するように実装された場合は、適正に割り当てられたヒープメモリーであれば、追加メモリーにマーカー値を格納しているはずである。そのようなマーカー値が存在するかどうかを調べることにより、軽減モジュール112は、メモリー管理モジュール110によってメモリーが適正に割り当てられ、したがって入力パラメーターが正しいと判断することができる。ブロック432でいずれかの形でパラメーターが正しいと判定された場合は、ブロック434で、要求される解放操作を待ち時間後に行うことができ、プロセス400Cが終了する。上記のように、軽減モードでは、「解放」メモリーは、直ちには使用可能状態にしないことができる。むしろメモリーはマーカー値で満たして、そのメモリーへの想定外のアクセスの検出を可能にすることができる。一方、パラメーターが正しくない場合は、ブロック436で、その操作が無視されるか、またはエラーメッセージが生成され、呼び出し側ソフトウェアモジュールに送り返されることができ、そしてプロセスが終了する。操作を無視する時は、軽減がバグによるエラーの発生を阻止するのに成功した旨の指示を格納することができる。そのような格納された指示は、下記のように使用されて、呼び出し側ソフトウェアモジュールに軽減400Cを適用し続けるかどうかを判定することができる。
【0071】
[0085]図4Dに、1つまたは複数の軽減活動を実施するために軽減モジュール112によって実装することが可能なプロセスの今1つの例を示す。図4Dのプロセス400Dでは、初めにブロック440で、要求されるメモリー操作が割り当て解除、すなわち「解放」操作であるかどうかが判定される。解放操作でない場合は、プロセス400Dは終了する。一方、要求されるメモリー操作が解放操作である場合は、ブロック442で、解放操作が「二重解放」であるかどうかが判定される。すなわち、その解放操作が、呼び出し側ソフトウェアモジュール中のプログラミングバグによる以前の解放操作の繰り返しであるかどうかが判定される。この判定は、例えばまだ前回の要求の待ち時間内にあるために、解放が要求されるメモリーがまだ行われていないかどうかを判定する等、適当な方式で行うことができる。この待ち時間内にあるメモリーは、上記のようにマーカー値を保持していることにより、または「解放済み」のメモリーブロックのレコードを格納していることにより、または他の適当な方式で識別することができる。
【0072】
[0086]繰り返しの場合は、ブロック444で操作が無視される。繰り返しでない場合は、呼び出し側ソフトウェアは終了時に割り当てメモリーのクリーンアップを試みることから、ブロック446で、その解放操作が呼び出し側ソフトウェアモジュールの終了に関連するかどうかが判定される。これは任意の適当な方式で行うことができる。終了に関連する場合は、ブロック444で、要求が無視され、行われない。これは2つの理由で行うことができる。第1に、調査により、ユーザーアプリケーション等の多くの呼び出し側ソフトウェアモジュールはシャットダウン時に不正確にメモリーを解放しており、その結果メモリーエラーの30%はシャットダウン時に経験されていることが明らかになっている。第2に、多くのオペレーティングシステム108およびメモリー管理モジュール110は、呼び出し側ソフトウェアモジュールの終了時に自動的な解放操作をすでに備えており、そのため、呼び出し側ソフトウェアモジュールによってなされる解放操作要求は、繰り返しとみなすことができる。ブロック442または446いずれかの決定の結果ブロック4
44で動作が無視された場合は、プロセス400Dは終了する。
【0073】
[0087]一方、ブロック446で要求されるメモリー操作が解放または終了操作でないと判定された場合は、ブロック448で待ち時間の後に解放操作が行われる。これは、プログラミングバグのために呼び出し側ソフトウェアモジュールがメモリーを解放し、解放後もメモリーを使用し続ける場合に発生し得るメモリーエラーを防止するために行うことができる。待ち時間後まで解放操作を行わないことにより、メモリーが解放後直ちに別のソフトウェアモジュールに再割り当てされる(その場合、元のソフトウェアモジュールと新しいソフトウェアモジュールの両方がそのメモリーを使用し、それぞれが他方によって保存されたデータを上書きする可能性がある)ことから生じ得るメモリーエラーの影響を軽減することができる。待ち時間後にメモリー操作が行われると、プロセス400Dが終了する。
【0074】
[0088]待ち時間後の解放操作の実施は、任意の適当な方式で行うことができる。例えば、待ち時間は、数秒間等の設定された時間であってよい。待ち時間は、柔軟性のある時間であってもよく、要求される割り当ておよび解放操作の数に基づく時間、メモリー需要が低い時はより長く、メモリー需要が高い時は短い時間等とすることができる。別の可能な実装は、アプリケーションが終了するまで待ち、プロセスが終了する時に、そのプロセス内で使用されたメモリーの割り当てを解除するオペレーティングシステムの部分によって、メモリーが実際に解放されるものである。そのようにすると、アプリケーションが終了し、そのアプリケーションが実行されていたプロセスも終了し、最後にメモリーが解放されることができる。他の実装では、待ち時間は、まったく設定された時間でなくてよく、解放操作を待ち行列に入れて待ち行列の先頭に達した時に実行される結果生じる不確定の時間であってよい。そのような実装の一例を図5に示すが、他の実装が可能であることを理解されたい。
【0075】
[0089]図5のプロセス500はブロック502で開始し、解放メモリーキャッシュのサイズが決定される。これは、全メモリー空間に対する比率を選択する、またはコンピューティングデバイスのユーザーもしくは管理者から入力を受け付ける等、任意の適当な方式で判定することができる。例えば、解放メモリーキャッシュは、8メガバイト(8MB)であり得る。ブロック506で、軽減モジュール112が、解放操作を行う要求を受け取る。ブロック508で、解放が要求されるメモリーがキャッシュに追加され、すなわち、解放操作のメモリーの量が合計キャッシュに加えられる。メモリーがキャッシュに加えられると、行われる操作の指示もプロセス待ち行列に加えられ、操作が要求されたことを指示する。メモリーが「キャッシュ」にある間は、メモリーは呼び出し側ソフトウェアモジュールに割り当てられたものとして維持されることを理解されたい。何故ならば、この実装では、キャッシュは、解放が要求されているがまだ解放されていないメモリーの量の標識として維持されるためである。
【0076】
[0090]キャッシュにメモリーを加えた後に、ブロック510で、まだ解放されていないメモリーの量がキャッシュのサイズに達した、または超えたかどうかが判定される。まだ達していない場合は、プロセス500はブロック506に戻り、別のメモリー解放命令を受け取る。キャッシュの制限に到達している、または超えている場合は、ブロック512で、少なくとも待ち行列の先頭にある操作が取り出され、実行されて、その遅延された最も古い解放操作に関連付けられたメモリーを解放し、キャッシュに割り当てられたメモリーのサイズを制限以下に下げる。状況によっては、キャッシュのサイズを再び制限以下に戻すために待ち行列にある2つ以上の操作を実行する必要がある場合もあるが、原理は図5に示すものと同じであることを理解されたい。待ち行列中の1番目の操作が実行され、待ち行列から削除されると、プロセス500の流れはブロック506に戻り、解放操作を行う別の命令が受け取られる。
【0077】
[0091]上記では、軽減モジュール112が1つまたは複数の軽減活動を使用してメモリーエラーがソフトウェアモジュールに負の影響を与える可能性を低減する軽減モードを有する、メモリー管理モジュール110のいくつかの例示的実装を説明している。上記のように、それらの軽減は、軽減が各アプリケーション中のエラーを減らす見込みがあるかど
うかに基づいて、アプリケーション単位で選択的に適用することができる。軽減モードを選択的に有効にし、軽減活動の有効性を評価するための軽減有効化モジュール114の例示的実装を説明することができる。ただし、本発明の実施形態はこの点で限定されないため、軽減有効化モジュール114は、軽減モジュール112のコンポーネントとして等、任意の適当な方式で実装できることを理解されたい。
【0078】
[0092]図6に、本明細書に記載の原理によるそのような例示的実装の1つを示す。図6のプロセス600はブロック602で開始し、呼び出し側ソフトウェアモジュールにエラーが経験されたことを軽減有効化モジュール114が検出する。この検出は、ソフトウェアモジュールがクラッシュまたは他の形で不適正に実行されたことを検出することによって等、任意の適当な方式で行われてよい。ブロック604で、エラーに関連付けられたエラーコードが読み出され、ブロック606でそれがメモリーエラーであったかどうかが判定される。メモリーエラーでなかった場合は、プロセス600は終了する。
【0079】
[0093]一方、メモリーエラーであった場合は、プロセス600はブロック608に進み、データストア212の規則および設定のレコード218にエントリーを作成または編集する等により、その特定の呼び出し側ソフトウェアモジュールに対して軽減モードが有効化され、エラーイベントに関する情報がイベントログ216に書き込まれる。一部の実装では、軽減モードは、メモリーエラーが最初に検出された時に有効にすることができ、一方、代替の実装では、閾値回数のメモリーエラー、または1時間に4回等の一定時間枠内の閾値回数に達しないと、軽減モードが適用されない。本明細書に記載の原理に従って軽減モードを開始するための任意の適切な検査を実装することができる。
【0080】
[0094]ソフトウェアモジュールによって操作が要求され、メモリー管理モジュールの軽減モジュール114によって行われるのに伴い、ブロック610で、軽減有効化モジュール114が時間の経過に伴う軽減活動の成功を追跡する。成功の追跡は、本明細書に記載の技術のうちのいずれかによってなど、任意の適当な方式で行うことができる。一部の実装では、これは、ソフトウェアモジュールに経験されたエラーの検出、および/またはメモリーエラーがソフトウェアモジュールに負の影響を与えるのを防止することにおける軽減活動の成功の検出についての統計の集計を含むことができる。そのような統計は、あるアプリケーションに関連するソフトウェアモジュールの特定インスタンスについて集計しても、または1つのソフトウェアモジュールの複数のインスタンスにわたり時間の経過と共に収集してもよい。一部の実装では、統計は、軽減チケット値、または、成功と、軽減が成功せずにアプリケーションが実行されたインスタンスの両方を追跡できる他の機構を含むことができる。具体例として、軽減チケット値は、軽減活動が成功したと検出されると増分され、軽減が成功せずにアプリケーションが終了した時に減分されることができる。成功した軽減がない終了は、アプリケーションからの「クリーン」終了時のみに判定されることができる。ただし、エラーまたはクラッシュのどちらかがソフトウェアモジュールに影響したことが検出される場合や、アプリケーションの特定インスタンスについて成功した軽減がなかった場合等、成功した軽減がないことについては他の基準が適用されてよい。
【0081】
[0095]ブロック612で、ブロック610の追跡の間に収集された情報が使用されて、軽減活動がエラーの軽減に成功したかどうかを判定する。軽減チケット値等の統計値を使用する実装では、この判定は、軽減チケット値が特定の閾値を上回るかどうかを判定することによって等、統計値が、成功数が特定の閾値レベルを上回る、またはエラー数が特定の閾値レベル未満であると示すかどうかの判定を含むことができるが、任意の適当な方式で行われてよい。軽減活動がエラー軽減に成功した場合は、ブロック614で、そのソフトウェアモジュールに軽減モードが維持されるが、軽減活動が成功しなかった場合は、ブロック616でソフトウェアモジュールについて軽減モードが無効にされる。ブロック614または616の後、プロセス600は終了する。
【0082】
[0096]図6のプロセス600は、本明細書に記載の原理に従って軽減有効化モジュール114によって実装することが可能な技術の種類の例示に過ぎず、他のプロセスが可能であることを理解されたい。例えば、図6ではエラーの検出およびエラーコードの評価は、
軽減有効化モジュール114の担当として図示するが、いくつかの代替実装では、それらの機能は、Microsoft WindowsオペレーティングシステムのWindows診断インフラストラクチャ(WDI)モジュール等の、オペレーティングシステム108の別のモジュールによって行うことができ、軽減有効化モジュール114は、WDIモジュールを監視して、メモリーエラーが検出された時にその旨を判定する、またはメモリーエラーが検出された時にWDIモジュールから通知されることができる。
【0083】
[0097]さらに、軽減モードは、軽減活動がエラーの軽減に成功したかどうかに関するブロック612での判定に基づいて有効または無効にされるものとして記載されている。一部の実装では、軽減有効化モジュール114は、それに加えて、またはそれに代えて、時間や、メモリー操作が軽減モードで行われているソフトウェアモジュールの数等、他の要因に基づいて軽減モードを有効/無効にしてもよい。例えば、一実装では、ソフトウェアモジュールの動作は、1週間等の一定期間のみ軽減モードで行い、その後通常の(非軽減)モードに戻ることができる。
【0084】
[0098]別の例示的実装では、軽減有効化モジュール114は、システム資源を節減するために、一度に4つのみ等、所与の時間内に所定数のソフトウェアアプリケーションのみに軽減モードを有効にすることができる。最大数に達し、ブロック602〜606等で別のソフトウェアモジュールに軽減モードを有効にすべきと検出されると、最も早く軽減モードが有効にされたソフトウェアモジュールが軽減モードを無効にして、新しいソフトウェアモジュールが軽減モードを有効にできるようにする。
【0085】
[0099]実装によっては、上記の各技術の組み合わせを使用することができ、軽減活動がエラーの軽減に成功していることを軽減有効化モジュール114が検出する限り、所定期間にわたりソフトウェアモジュールに軽減モードが有効な状態にしておかれるが、別のソフトウェアモジュールが軽減モードから利益を得られる可能性があると次に検出された時には、設定期間だけモードが有効にされ、その後無効にされる。
【0086】
[0100]アプリケーションに経験されるメモリーエラー数の低減における軽減活動の成功の追跡は、任意の適当な方式で行うことができる。図7Aおよび図7Bに、軽減活動の成功を検出するための2つの例示的技術のフローチャートを示すが、軽減することが望まれるメモリーエラーの種類、および軽減モジュール112が利用可能な軽減活動の種類に応じて、他の技術が可能であることを理解されたい。
【0087】
[0101]図7Aのプロセス700Aは、エラー軽減における軽減活動の成功をどのようにして追跡できるかに関するプロセス全体の一例である。この例では、図4の割り当てプロセス400Aが追跡される軽減活動である。プロセス700Aはブロック702で開始し、軽減有効化モジュール114が、何らかの理由でソフトウェアモジュールに軽減モードを有効にする。ブロック704で、その特定のソフトウェアモジュールに対する割り当て操作を行う要求が軽減モジュール112によって受け取られ、図4Aのプロセス400Aに従って、要求より多いメモリーが割り当てられ、その追加メモリーにマーカー値が書き込まれる。
【0088】
[0102]ブロック706で、軽減モジュール112が、ブロック704で割り当てられたメモリーの解放操作を行う要求を受け取る。上記のように、この解放操作は遅らせることができる。しかし、その解放操作がブロック708で実施される時に、ブロック704で割り当てられた追加メモリーが書き込まれたマーカー値をまだ格納しているかどうかが判定される。追加メモリーがまだマーカー値を格納している場合は、ブロック710で、軽減有効化モジュール114は、そのインスタンスではメモリーエラーに対して軽減活動の効果がない旨の指示を、自身のイベントログ216等に格納することができる。一方、ブロック708で追加メモリーがマーカー値を格納していないと判定された場合は、ブロック712で、軽減有効化モジュール114は、エラーの軽減成功の指示をイベントログ216に格納することができる。この場合は、ソフトウェアモジュールが空間を要求した分のデータよりも多くのデータを書き込み、したがって、軽減モジュール112によりバッファオーバーランエラーの軽減に成功したことが成功裏に検出される。ブロック710または712いずれかで指示を格納した後、ブロック714でメモリーが解放され、解放は
図5に関連して説明した遅延解放プロセス500によってなど、任意の方式で行ってよい。ブロック714でメモリーが解放されると、プロセスは終了する。
【0089】
[0103]図7Bに、エラー軽減における軽減モジュールの成功を追跡する別の例示的技術700Bを示し、この技術は、図5のプロセス500等の遅延解放による軽減活動に従う。プロセス700Aと同様に、プロセス700Bはブロック720で開始し、何らかの理由で軽減有効化モジュール114によって特定のソフトウェアモジュールに軽減モードが有効にされる。ブロック722で、軽減モジュール112は、その特定ソフトウェアモジュールに以前に割り当てられたメモリーの解放操作を行う要求を受け取る。ブロック724で、解放が求められるメモリーの内容についてチェックサムまたはハッシュ値が任意の適当な方式で計算され、ブロック726で、待ち時間の後まで解放操作の実行が遅らされる。ブロック728で、待ち時間の後、メモリーの内容についてチェックサムまたはハッシュ値が再度計算される。ブロック730で、ブロック724で計算された元のハッシュ値がブロック728の新しいハッシュ値と一致するかどうかが判定される。一致する場合は、ブロック732で、軽減有効化モジュール114は、そのインスタンスでは軽減活動がエラーの軽減に効果がなかった旨をそのイベントログ216に格納することができる。一方、ブロック730でハッシュ値が同じでないと判定された場合は、ブロック734で、軽減モジュール112がエラー軽減に成功した旨の指示が、軽減有効化モジュール114のイベントログ216に格納されることができる。これは、メモリーの内容が時間と共に変化したため、待ち時間の後まで解放を遅らせることで、ソフトウェアモジュールがメモリーの使用を終える前にメモリーを解放するプログラミングバグから生じた可能性のあるメモリーエラーの影響が軽減されたことを検出できるからである。ブロック732または734のいずれかの指示を格納した後、ブロック736でメモリーが解放され、プロセスが終了する。
【0090】
[0104]プロセス700Aおよび700Bで格納される軽減活動の有効性および無効性の指示は、任意の適当な方式で使用することができる。一部の実装では、その指示を使用して、アプリケーションに関連するソフトウェアモジュールに軽減活動が与える効果についての統計値を計算することができる。そのような統計値は、ソフトウェアアプリケーションの複数のインスタンスにわたって計算することができる。そのような統計値は、成功した軽減の頻度の算出を可能にする時間成分を含むことができる。実装によっては、時間成分は、何回かの成功した軽減が観察された期間の指示であってよい。ただし、時間成分は、呼び出し側ソフトウェアモジュールの呼び出し回数として計測してもよい。成功した軽減の頻度は、軽減を維持することで呼び出し側ソフトウェアモジュールへのバグの影響を回避できる見込みがあるかどうかについての予測変数とすることができ、それらの統計に基づいて、呼び出し側ソフトウェアモジュールの今後のインスタンスに軽減活動を実装するかどうかを決定することができる。
【0091】
[0105]上記のように、一実装では、図2Cに示すような軽減チケット値を統計値として使用して、特定のソフトウェアモジュールに軽減モードを有効にすべきかどうかを判定することができる。この軽減チケット値は、任意の適切な値でよく、任意の適当な方式で初期化および調整することができる。図8に、呼び出し側ソフトウェアモジュールごとに軽減チケット値を使用して、軽減モードを管理するために使用できる技術の一例を示す。ここで例示する実施形態では、チケット値は、不揮発性メモリーに格納され、アプリケーションの複数のインスタンス、コンピューターの複数回のシャットダウン、または他のイベントにわたって継続することができる。
【0092】
[0106]図8のプロセス800はブロック802で開始し、軽減有効化モジュール114によってメモリーエラーが検出される。ブロック802の検出は、ソフトウェアモジュールの不適正な実行またはクラッシュを検出することによって等、任意の適当な方式で行われてよい。ブロック804でソフトウェアモジュールに軽減モードが有効にされ、ブロック806で軽減チケット値が特定の値に初期化される。この特定の値は適当な値でよく、特定のシステム上のすべてのソフトウェアモジュールに対して一定の値、機能やソース開発者等の適当な特性に基づいて特定のアプリケーション群に選択された値、特定のソフト
ウェアモジュールに選択された値、または他の適切な値であってよい。一部の実装では、下記のように、初期値は、対象アプリケーションについてのエラー軽減の成功に関する履歴データに基づくことができる。一例示的実装では、軽減チケット値は整数であってよく、ソフトウェアモジュールに対して軽減モードが有効にされる時、初期化された値は7とすることができる。
【0093】
[0107]ブロック808で、軽減モジュール112が軽減モードでソフトウェアモジュールにメモリー操作を行い、モジュールの各実行等のソフトウェアモジュールの各インスタンス化について、軽減有効化モジュール114が、そのインスタンス化におけるエラー軽減の軽減モジュール112の成功を追跡する。成功の追跡は、図7Aおよび図7Bに関連して上述した技術のうちのいずれかによってなど、任意の適当な方式で行ってよい。
【0094】
[0108]ブロック810で、軽減有効化モジュール114がソフトウェアモジュールのインスタンスの終了を検出する。インスタンスの終了は、ユーザー主導またはプロセス主導の終了の結果生じた終了等の適正な終了である場合も、またはクラッシュの結果生じた不適正な終了である場合もある。ブロック810で、ソフトウェアモジュールのインスタンスの終了およびその終了の原因についての情報が、軽減データストア212のイベントログ216に格納されることができる。
【0095】
[0109]ブロック812で、ブロック808および810で収集された情報が軽減有効化モジュール814によって使用されて、ソフトウェアモジュールの軽減チケット値を更新する。一部の実装では、軽減モジュール112がエラーの軽減に成功したことが検出された場合は、軽減チケット値を増分することができる。軽減モジュール112がエラーの軽減に成功しなかった場合は、軽減チケット値は減分することができる。他の実装では、これより多くの要因を使用することができる。表Iに、軽減チケット値を調整する方式を決定する際に使用できる要因の一例を示す。ただし、この他の要因も可能である。
【0096】
【表1】
【0097】
[0110]表Iの例では、ソフトウェアモジュールのインスタンスの終了の種類と、軽減活動の成功両方についての情報を使用して、ソフトウェアモジュールの軽減チケット値を調整する方式を決定する。表Iで、インスタンスがクラッシュ等の不適正な実行で終了したと軽減有効化モジュール114が判定した場合は、成功した軽減があったかどうかに関係なく、軽減チケット値を減分することができる。これを行うことができるのは、クラッシュを阻止するのに十分なことを軽減モードの軽減活動で行わなかったことが明白であり、また、まだクラッシュがある場合には、メモリー管理モジュール110を軽減モードで動作させることによる効率の損失が軽減モードの利益を上回ると推測できるためである。ただし、チケット値に変更を行わない等、クラッシュに対する他の可能な反応が可能である。
【0098】
[0111]一方、軽減有効化モジュール114が、インスタンスが適正な実行で終了してクリーン終了となったと検出した場合は、成功した軽減があったかどうかの判定がより重要になる。表Iの実装では、インスタンスがクリーンに終了し、成功した軽減が検出されなかった場合は、軽減チケット値は減分することができる。これを行うことができるのは、軽減活動で顕著な効果が得られることなくインスタンスが正常に動作している場合は、検出された利益が効率の損失を上回ることはないためである。一方、インスタンスがクリーンに終了し、成功した軽減がいくつか検出された場合は、成功した軽減が少なくとも部分的にインスタンスの正常な動作に寄与していると推測できるため、軽減チケット値は増分することができる。
【0099】
[0112]表Iの例では軽減チケット値は、各事例につき1だけ増分または減分されるが、他の実装では、事例ごとに異なる値等、事例ごとに任意の適切な値が使用されてよいことを理解されたい。また、チケット値に設定された上限があってもよい。
【0100】
[0113]ブロック812で任意の適切な技術を使用して軽減チケット値が更新されると、ブロック814で、ソフトウェアモジュールの軽減チケット値が閾値レベル未満であるかどうかが判定される。例えば、軽減チケット値が整数の場合は、軽減チケット値がゼロ(0)以下であるかどうかが判定されることができる。軽減チケット値が閾値未満でない場合は、プロセス800は引き続きソフトウェアモジュールの次のインスタンスで軽減活動の成功を追跡する。一方、軽減チケット値が閾値レベル未満と判定された場合は、ソフトウェアモジュールの今後のインスタンスに対して軽減モードを無効にすることができ、プロセス800が終了する。
【0101】
[0114]軽減チケット値を使用する本明細書に記載の原理の実装においては、値は、ソフトウェアモジュールのインスタンスの実行後だけでなく、任意の適切な時に調整することができる。例えば、一実装では、上記のように、1週間等のある期間にわたりソフトウェアモジュールに軽減モードを有効にすることができ、その後軽減モードは解除される。そのため、軽減チケット値を使用する実装では、その期間後に軽減チケット値は、ヌルにリセットする、またはゼロに減らす、または他の形でクリアすることができる。一部の実装では、場合によっては、一定期間に加えて、特定の時に一定数のソフトウェアモジュールのみが軽減モードで動作することを許され、別のソフトウェアモジュールが軽減モードに置かれると、第1のソフトウェアモジュールの軽減チケット値をクリアすることができる。また、図2Cに示す場合のようにデータ構造のサイズを恣意的に増大させるのを避けるために、アプリケーションについての情報をある期間後に完全に削除してもよい。
【0102】
[0115]プロセス800で使用される軽減チケット値の初期値は、コンピューティングデバイス100のユーザーおよび/または管理者からなど、任意の適切な供給元から受け取られることができる。本明細書に記載の原理の一部に従って動作する一部の実装では、初期値の供給元は、特定ソフトウェアモジュールのエラー軽減における軽減活動の成功についての情報を複数のコンピューティングデバイスから収集する集約サーバー等の、遠隔コンピューティングデバイスであってよい。そのような実装を図9図11に示し、その実施形態により動作する技術を図12図13に示す。
【0103】
[0116]図9に、この実装によるコンピューティングデバイス900の一実装を示す。上記で図1に関して述べたように、コンピューティングデバイス900の図は、コンピューティングデバイス900の構成要素の完全な図示でも、この実装によるコンピューティングデバイスを稼動させるために必要な構成要素の図示でもない。図9のコンピューティングデバイス900は、上記の図1のコンピューティングデバイス100といくつかの共通の構成要素を共有し、そのため、それらの共通構成要素は同じ参照符号で示し、ここではさらには説明しない。さらに、コンピューティングデバイス900は、デスクトップまたはラップトップ型のパーソナルコンピューターを含む上記の適切なコンピューティングデバイスとして実装してもよいことを理解されたい。
【0104】
[0117]共通の構成要素に加えて、図9のコンピューティングデバイス100は、オペレーティングシステム108のコンポーネントであるエラー報告クライアント902、ならびにネットワークアダプター904を備える。ネットワークアダプター904は、コンピューティングデバイス900が適切なコンピューティングネットワークを通じて他の適切なコンピューティングデバイスと通信することを可能にする適切なハードウェアおよび/またはソフトウェアであってよい。コンピューティングネットワークは、インターネットを含む、2つ以上のコンピューター間でデータを交換するための適切な有線および/または無線通信媒体であってよい。一部の実装では、ネットワークアダプター904は、2つ以上の別個のネットワークアダプターとして実装することができ、2つ以上の種類のネットワークインタフェースを介した接続を提供する(例えばEthernetアダプター等の有線ネットワークアダプターと、IEEE802.11gアダプター等の無線ネットワークアダプター)。エラー報告クライアント902は、コンピューティングデバイス90
0で実行されるソフトウェアモジュールに関する情報、ならびにソフトウェアモジュールによって経験されたエラーおよび軽減モジュール112によってとられた成功した軽減活動についての情報を収集する、適切な機能モジュールであってよい。エラー報告クライアント902は、ネットワークアダプター904を使用してその情報を集約サーバーを含む適切な宛先に送信することができる。
【0105】
[0118]図10に、コンピューティングデバイス900が機能することが可能なコンピューターシステムの一例を示す。図10は、コンピューティングデバイス900が接続できる通信ネットワーク1000を備えたコンピューターシステムを示す。通信ネットワーク1000は、家庭ネットワーク、企業ネットワークのサブネット、インターネット、ならびに/または他のネットワーク等のより大きな有線ネットワークおよび/または無線ネットワークの一部を含む、任意の適切な有線ネットワークおよび/または無線ネットワークでよい。さらに、上記のように、コンピューティングデバイス900は、デスクトップ型パーソナルコンピューターとして図示するが、任意の適切なコンピューティングデバイスであってよい。コンピューティングデバイス900から、通信ネットワーク1100を介してサーバー1002にアクセスすることができる。集約サーバーは、任意の適切な情報を収集するように構成された適切なサーバーデバイスとして実装することができ、コンピューティングデバイス900ならびにコンピューティングデバイス1006Aおよび1006Bを含む複数のコンピューティングデバイスで実行されるソフトウェアモジュールに関連するデータの中央リポジトリとして機能するエラー報告サーバーとしての実装が含まれる。エラー報告サーバー1002に格納されるデータは、関連付けられたデータストア1104への格納を含めて、任意の適当な方式で格納されることができる。下記でさらに詳細に述べるように、エラー報告サーバー1002は、複数のコンピューティングデバイスのエラー報告クライアントから送信される情報を集約し、情報を評価し、コンピューティングデバイスに構成情報を提供するように適合することができる。そのようにして、コンピューティングデバイス900は、他のコンピューティングデバイス1006Aおよび1006Bの経験に基づいて構成することができ、その逆も同様である。エラー報告サーバー1002から提供される構成情報は、アプリケーションの複数のインスタンスにわたって軽減活動の成功を計測するための構成統計を含む、任意の適当な情報であってよい。ローカルに収集される統計と同様に、成功に関する情報を時間成分と組み合わせて、将来の成功を予測するために使用できる軽減成功の頻度を得ることができる。そのような情報を使用して、軽減を適用するかどうか、および、適用する時間の長さを示す値を導出することができる。例えば、構成の統計は、軽減モードを無効にすべきと決定する前に検討すべきインスタンスの数の指示を含むことができる。一部の実装では、構成の統計は、特定アプリケーションについての軽減チケットの初期値を含むことができる。
【0106】
[0119]図11は、図10に示すコンピューターシステムの各種構成要素の対話の図である。図11のシステムは、上記の図2Bのシステムと共通の構成要素を共有する。説明を簡潔にするために、それら共通の構成要素は同じ参照符号で示し、ここではさらに説明しない。図11のシステムで、エラー報告クライアント902は、コンピューティングデバイス900で実行されるソフトウェアモジュールの不適正な実行に関連する情報を収集する。エラー報告クライアント902は、ソフトウェアモジュールが不適正に実行されている、例えばクラッシュまたは他の形で不適正に終了したことを検出すると、ソフトウェアモジュールと軽減有効化モジュール114の両方からその不適正な実行に関連する情報を取得することができる。ソフトウェアモジュールに関連する情報は、任意の適当な情報でよく、不適正な実行に関連付けられたエラーコード、およびクラッシュ時のソフトウェアモジュールの実行についての状態情報を提供する「スタックダンプ」を含む。ソフトウェアモジュールからのこの情報に加えて、エラー報告クライアント902は、メモリーエラーについての情報、および、ソフトウェアモジュールが軽減モードで動作していた場合は軽減モジュール112によって検出された軽減の成功、ならびにそのソフトウェアモジュールの軽減チケット値を軽減有効化モジュール114から取得するように構成することもできる。その際、エラー報告クライアント900は、不適正な実行時のソフトウェアモジ
ュールの状態についての情報を従来のエラー報告クライアントよりも多く取得し、これまでに可能であったよりも多くの詳細な情報を集約サーバーに提供することができる。従来はエラーの報告はクラッシュがトリガーとなっていたが、他の適切なトリガーを使用してよく、それには、単に時間の経過をトリガーとして、クラッシュが発生しない場合でも格納された軽減情報をエラー報告サービスに転送できるようにすることが含まれる。
【0107】
[0120]エラー報告クライアント902は、次いでその詳細情報を、エラー報告データストア1004に格納するためにエラー報告サーバー1002に送信することができる。エラー報告データストア1004の情報は、ソフトウェアモジュールの不適正な実行についてのクラッシュ情報1106、ならびに軽減の設定1108を含むことができる。軽減の設定1108は、軽減に関する任意の適切な情報、および/またはコンピューティングデバイス900等のコンピューティングデバイスにおける軽減モードを調整するために使用できる成功の頻度情報を含む任意の適当な情報であってよい。そして、エラー報告サーバー1002は、エラー報告クライアント902から送信された情報を、エラー報告データストア1104に格納された情報と共に処理し、応答として適切な構成情報を提供することができる。上記のように、構成情報は、提案される初期軽減チケット値等の任意の適切な情報であってよい。構成情報をエラー報告クライアントに提供するのに加えて、エラー報告サーバー1002は、任意の適切な情報を他関係者に送信してよい。例えば、軽減活動の成功およびエラーの種類についての情報がメモリー管理モジュール110および/またはオペレーティングシステム108の開発者に送信され、メモリー管理モジュール110によって検出されたメモリーエラーについての情報がソフトウェアモジュールの開発者に送信されて、開発者がメモリーエラーの原因となったプログラミングバグを特定し、解決することを試みられるようにしてもよい。
【0108】
[0121]図12および図13に、本明細書に記載の原理の一部に従って動作するエラー報告サーバーを備えた実装のコンピューターシステムを稼動させるための例示的プロセスを示す。図12および図13の例では、エラー報告サーバーに送信される情報、およびエラー報告サーバーから受信される情報は、軽減チケット値を含むことができる。ただし、本発明の実施形態はこれらの点に関して限定されないため、エラー報告サーバーを備えるすべての実装が、複数インスタンスにわたる軽減活動の成功を追跡する統計値を使用できるとは限らず、統計値を使用する一部の実装は軽減チケット値を使用しない場合もあることを理解されたい。
【0109】
[0122]図12は、本明細書に記載の原理の一部によりコンピューティングデバイス900を動作させて、エラー報告サーバー1002との間で情報を交換し、サーバーから構成データを受け付ける一例示的プロセス1200を示す。ただし、エラー報告サーバーを備える本明細書に記載の原理の実装は任意の適当な方式で動作してよく、それらの実装は、図12に示す例示的プロセス1200を用いて実装されることに限定されないことを理解されたい。
【0110】
[0123]例示的プロセス1200はブロック1202で開始し、エラー報告クライアント902が、ユーザーがエラー報告を許可したかどうかを調べる。許可している場合は、エラー報告クライアントは、エラー報告サーバー1002との接続を開き、ブロック1204で、サーバーに情報を送信してエラーおよび軽減の成功について報告する。ブロック1202および1204の動作は、ソフトウェアモジュールの不適正な実行を検出した後、または周期的な報告時等、任意の適切な時に実行されてよい。ブロック1204で送信される情報は、時間、および送信が行われる状況に応じて変化してよい。例えば、これらの動作がソフトウェアモジュールの不適正な実行の検出に応答して行われる場合は、情報は、そのソフトウェアモジュールに関連するエラーおよび軽減の成功についての情報を含むことができ、一方、動作が周期的な報告時に行われる場合は、情報は、前回の報告以後コンピューティングデバイス900によって実行されたソフトウェアモジュールのすべてまたは一部に関連することができる。ブロック1206で、ブロック1204の送信に続き、エラー報告クライアント902がエラー報告サーバー1002に構成データを要求し、ブロック1208で構成データを受信することができる。ブロック1210で、エラー報
告クライアント902は、構成データを軽減有効化モジュール116に提供することができ、軽減有効化モジュールは、軽減データストア212の規則および設定データ218を更新することができる。データストア212を更新すると、軽減有効化モジュール114は、次いで規則および設定を適用して、コンピューティングデバイス900で実行されるソフトウェアモジュールに軽減モードを選択的に有効化し、プロセスが終了する。規則および設定の適用は任意の適当な方式で行われてよい。例えば、構成データが初期軽減チケット値を含む場合は、ソフトウェアモジュールに軽減モードを有効にすると、軽減有効化モジュール114は、そのソフトウェアモジュールの軽減チケット値を、構成データに含まれる値に初期化することができる。
【0111】
[0124]図13に、本明細書に記載の原理の一部によりエラー報告サーバー1002を稼動させる例示的プロセス1300を示す。プロセス1300はブロック1302で開始し、エラー報告サーバー1002が1つまたは複数のエラー報告クライアント900/1006A/1006Bとの接続を開く。ブロック1304で、エラー報告サーバー1002は、クライアントから情報を受信し、その情報をデータストア1004に集約する。ブロック1304で受信される情報は、ソフトウェアモジュールに経験され、エラー報告クライアントによって検出されたエラー、および軽減モジュール112によって行われ、検出された軽減活動の成功についての情報を含む、任意の適切な種類の情報であってよい。ブロック1306で、ブロック1304で受信された軽減成功データが、情報で報告された各ソフトウェアモジュールについての以前の軽減成功データと比較されて、軽減モードでソフトウェアモジュールを動作させることが全体として成功しているかどうかを判定する。例えば、この判定は、検出された不適正な実行の回数が、軽減されたエラーの数を上回っている、または実質的に上回っているかどうかを判定することを含むか、または他の適切な判定を含むことができる。
【0112】
[0125]ブロック1306のこの比較に基づいて、ブロック1308で、特定のソフトウェアモジュールについて軽減モードがメモリーエラーの軽減に成功しているかどうかについて判定が行われる。成功している場合は、ブロック1310で、エラー報告サーバー1310が、例えばそのソフトウェアモジュールには高い初期軽減チケット値を使用するようにクライアントに通知することにより、軽減モードを使用するようにクライアントに通知することができる。一方、ブロック1308で軽減モードが成功していないと判定された場合は、ブロック1312で、エラー報告サーバーは、例えば低い初期軽減チケット値を使用するようにクライアントに通知することにより、軽減モードの使用を制限するようにクライアントに通知する。ブロック1310または1312いずれかでのクライアントへの通知後、プロセス1300は終了する。
【0113】
[0126]上記のように、一部の実装では、軽減有効化モジュール114は、ソフトウェアモジュールが閾値回数クラッシュするか、または、1時間に4回等、一定期間内に閾値回数クラッシュするまで、特定のソフトウェアモジュールに軽減モードを有効にしないことができる。ただし、コンピューティングデバイス900が対話することができるエラー報告サーバー1002を備える一部の実装では、ソフトウェアモジュールによる不適正な実行が検出されるたびに(そのような検出の初回を含む)、情報がエラー報告サーバーに送信されることができる。エラー報告サーバー1002の記録が、ソフトウェアモジュールのエラーの軽減に軽減モードが成功していることを示す場合は、図12および図13との関連で述べたように、エラー報告サーバー1002は、軽減モードを使用するように指示する構成情報をコンピューティングデバイス902に送信することができる。そのような実装では、その構成情報に応答して、軽減有効化モジュール114は、軽減有効化モジュールで維持されている閾値規則に関係なく、そのソフトウェアモジュールが次に実行されるとソフトウェアモジュールに対して軽減モードを有効にすることができる。
【0114】
[0127]以上、本発明の少なくとも1つの実施形態の数個の態様を説明したが、当業者には各種の改変、変更、および改良が容易に着想されるであろうことを理解されたい。
[0128]例えば、利用可能なすべての軽減が適用されるか、または軽減がまったく適用されないかの2つの動作モードについて記載している。実施形態によっては、利用可能な軽
減のすべてではなく一部が適用される中間の選択肢が可能であり得ることを理解されたい。
【0115】
[0129]そのような改変、変更、および改良は、本開示の一部であることが意図され、本発明の主旨および範囲内にあることが意図される。したがって、前述の説明および図面は例に過ぎない。
【0116】
[0130]本発明の各種態様は、単独で、または組み合わせて、または前述の実施形態で具体的には述べない各種構成で用いることができ、したがって、その適用は、前述の説明で述べた、または図面に示した構成要素の詳細および構成に限定されない。例えば、1つの実施形態で説明した態様を、他の実施形態で説明した態様とどのような形で組み合わせてもよい。
【0117】
[0131]また、本発明は、方法として実施することができ、その例を上記で提供した。方法の一部として行われる動作は、適当な方式で順序付けてよい。したがって、例示的実施形態では順次行われる動作として示されていても、一部の動作を同時に行う等、例示した順序と異なる順序で動作が行われる実施形態を構築することができる。
【0118】
[0132]クレームにおけるクレーム要素を修飾する「第1」、「第2」、「第3」等の序数語の使用は、それ自体は、別の要素に対するあるクレーム要素の優先性、優位性、または序列を意味するものでも、方法の動作が行われる時間的順序を意味するものでもなく、単に、ある名前を有する1つのクレーム要素を(序数語の使用を除いて)同じ名前の別の要素から区別して、それらのクレーム要素を区別する標識として使用される。
【0119】
[0133]また、本明細書で使用される表現および用語は、説明を目的とするものであり、限定的とみなすべきでない。本明細書の「〜を含む」、「〜を備える」、「〜を有する」、「〜を包含する」、「〜を伴う」、およびそれらの変化形の使用は、その後に列挙される項目およびそれらの同等語句、ならびに追加的な項目を包含するものとする。
図1
図2A
図2B
図2C
図3
図4A
図4B
図4C
図4D
図5
図6
図7A
図7B
図8
図9
図10
図11
図12
図13