(57)【特許請求の範囲】
【請求項１】
呼び出し側ソフトウェアモジュール(calling software module)のためにメモリー操作(memory operation)を実行する(executing)際に１つまたは複数の軽減活動(mitigation actions)を適用する(apply)かどうかを判定する、コンピューターによって実施される方法であって、
前記呼び出し側ソフトウェアモジュールのための少なくとも１つの第１のメモリー操作(memory operation)を実行する（３１２、３１４）ステップであって、前記実行(executing)は、前記１つまたは複数の軽減活動(mitigation actions)の適用(applying)を含むステップと、
前記１つまたは複数の軽減活動が、メモリーエラーが前記呼び出し側ソフトウェアモジュールに影響を与える(impacting)のを阻止する(prevented)のに成功したか(successfully)どうかを評価する(evaluating)（７０８、７３０）ステップと、
前記１つまたは複数の軽減活動(mitigation actions)が前記呼び出し側ソフトウェアモジュールに影響する(affecting)メモリーエラーを低減する(reduces)可能性(likelihood)を判定する（６１２）ステップと、
その後(subsequently)、前記呼び出し側ソフトウェアモジュールのための少なくとも１つの第２のメモリー操作を実行し（３１２、３１４、３１６）、その実行と併せて(in conjunction of which)、前記可能性(likelihood)に基づいて前記１つまたは複数の軽減活動が選択的に適用されるステップと
を含み、前記実行するステップ(the executing)は、
前記判定された(the determined)可能性(likelihood)が閾値を上回る場合は、前記１つまたは複数の軽減活動に従って前記呼び出し側ソフトウェアモジュールのために前記少なくとも１つの第２のメモリー操作を実行する（３１２、３１４）ステップと、
前記判定された可能性が閾値を下回る(below)場合は、前記１つまたは複数の軽減活動を行わずに(without)前記呼び出し側ソフトウェアモジュールのために前記少なくとも１つの第２のメモリー操作を実行する（３１６）ステップと
を含む方法。
【請求項２】
前記１つまたは複数の軽減活動は、割り当て操作の場合(for an allocation operation)、前記割り当て操作において要求された以上(than requested)の追加(extra)メモリーを割り当て(allocating)（７０４）、前記追加メモリーにマーカー値(marker value)を書き込むステップを含み、
前記１つまたは複数の軽減活動が、メモリーエラーが前記呼び出し側ソフトウェアモジュールに影響を与える(impacting)のを阻止するのに成功したかどうかを評価するステップは、前記追加メモリーを再調査し(reviewing)（７０８）、前記追加メモリーが前記マーカー値を保持している(holds)かどうかを判定する(determine)ステップを含む、請求項１に記載の方法。
【請求項３】
前記１つまたは複数の軽減活動は、メモリーの解放操作の場合(for a free operationfor memory)、待ち時間(wait period)の後に前記解放操作(free operation)を行う（７３６）ステップを含み、
前記１つまたは複数の軽減活動が、メモリーエラーが前記呼び出し側ソフトウェアモジュールに影響を与えるのを阻止するのに成功したかどうかを評価するステップは、前記待ち時間の後に、前記メモリーの内容(contents)が、前記解放操作が要求された時の内容と同じであるかどうかを判定する（７３０）ステップを含む、請求項１に記載の方法。
【請求項４】
前記１つまたは複数の軽減が、メモリーエラーが前記呼び出し側ソフトウェアモジュールに影響を与えるのを阻止するのに成功したかどうかを評価するステップは、前記呼び出し側ソフトウェアモジュールの終了(exit)を検出し（８１０）、前記終了が適正(proper)であったかどうかを判定し、前記呼び出し側ソフトウェアモジュールが適正に終了したことが検出された場合は、前記１つまたは複数の軽減活動が成功したと判定するステップを含む、請求項１に記載の方法。
【請求項５】
前記終了が適正であった場合は前記軽減が成功した旨を示す(indicate)第１の統計値(statistic)を更新し、前記終了が適正でなかった場合は前記軽減が成功しなかった旨を示す第２の統計値を更新するステップをさらに含む、請求項４に記載の方法。
【請求項６】
前記第１の統計値および第２の統計値は、前記呼び出し側ソフトウェアモジュールの一連のインスタンスにわたって(over a series of instances)更新され、
前記可能性を判定するステップは、前記第１および第２の統計値を評価するステップを含む、請求項５に記載の方法。
【請求項７】
前記可能性を判定するステップは、前記評価する動作(act of evaluating)に基づいて、前記呼び出し側ソフトウェアモジュールの複数のインスタンスにわたる(over a plurality of instances)前記１つまたは複数の軽減活動の成功を示す前記呼び出し側ソフトウェアモジュールについての統計値を更新する（８１２）ステップを含み、
前記その後(subsequently)実行する動作は、前記統計値に従って行われる、請求項１に記載の方法。
【請求項８】
前記統計値は軽減チケット値(ticket value)であり、前記統計値を更新するステップは、前記１つまたは複数の軽減活動が成功した場合は前記軽減チケット値を増分し(incrementing)、前記１つまたは複数の軽減活動が成功しなかった場合は前記軽減チケット値を減分する(decrementing)ステップを含む、請求項７に記載の方法。
【請求項９】
呼び出し側ソフトウェアモジュールのためにメモリー管理動作を実行する際に１つまたは複数の軽減活動を適用するように適合されたコンピューターシステム内でメモリーを管理する方法であって、
前記呼び出し側ソフトウェアモジュールによって経験されたメモリーエラーを検出する（６０２）ステップであって、前記メモリーエラーはメモリー操作に関連するステップと、
メモリー管理(management)モジュールに関連付けられた(associated with)データストア(data store)に、前記呼び出し側ソフトウェアモジュールのために前記メモリー操作を実行する際に前記１つまたは複数の軽減活動が適用されるべき旨の指示を格納する（６０８）ステップと、
後に(subsequently)前記１つまたは複数の軽減活動に従って前記呼び出し側ソフトウェアモジュールのために少なくとも１つの第１のメモリー操作を実行する（６１０）ステップと、
前記１つまたは複数の軽減活動が前記メモリー操作に関連するメモリーエラーの数を減らすことに成功したかどうかを評価する(evaluating)（７０８、７３０）ステップと、
前記評価する動作(act)の結果に基づいて、前記呼び出し側ソフトウェアモジュールについての少なくとも１つの統計値を更新する（８１２）ステップと、
その後(subsequently)前記呼び出し側ソフトウェアモジュールのために少なくとも１つの第２のメモリー操作を実行する（３００）ステップと
を含み、前記実行するステップ(the executing)は、
前記統計値が閾値を上回る場合は、前記１つまたは複数の軽減活動に従って前記呼び出し側ソフトウェアモジュールに前記少なくとも１つの第２のメモリー操作を実行する（３１２、３１４）ステップと、
前記統計値が閾値を下回る場合は、前記１つまたは複数の軽減活動を行わずに、前記呼び出し側ソフトウェアモジュールに前記少なくとも１つの第２のメモリー操作を実行する（３１６）ステップと
を含む方法。
【請求項１０】
前記１つまたは複数の軽減が適用されたことがある第２の呼び出し側ソフトウェアモジュールについて、前記１つまたは複数の軽減が、前記第２の呼び出し側ソフトウェアモジュールに負の影響を与える(negatively affecting)メモリーエラーの数を減らすことに成功しているかどうかを評価する（６１２、８０８）ステップと、
前記１つまたは複数の軽減活動が将来前記呼び出し側ソフトウェアモジュールに適用されるかどうかに関係なく、前記第２の呼び出し側ソフトウェアモジュールのための将来の(future)メモリー操作に前記１つまたは複数の軽減活動を適用する（３１２、３１４）ステップと
をさらに含む、請求項９に記載の方法。
【請求項１１】
前記少なくとも１つの統計値は、前記呼び出し側ソフトウェアモジュールの複数のインスタンスにわたって(over a plurality of instances)更新され、
前記少なくとも１つの第１のメモリー操作は前記呼び出し側ソフトウェアモジュールの第１のインスタンスによって要求され、前記少なくとも１つの第２のメモリー操作は前記呼び出し側ソフトウェアモジュールの第２のインスタンスによって要求される、請求項９に記載の方法。
【請求項１２】
前記少なくとも１つの統計値は、前記呼び出し側ソフトウェアモジュールの複数のインスタンスにわたる前記１つまたは複数の軽減活動の成功を示す軽減チケット値を含む、請求項９に記載の方法。
【請求項１３】
前記軽減チケット値の更新は、前記１つまたは複数の軽減活動が成功した場合は前記軽減チケット値を増分し、前記１つまたは複数の軽減活動が成功しなかった場合は前記軽減チケット値を減分することを含む、請求項１２に記載の方法。
【請求項１４】
実行されると、呼び出し側ソフトウェアモジュールのためにメモリー操作を実行する際に１つまたは複数の軽減活動を適用するかどうかを判定する方法をコンピューター（１０２）に行わせるコンピューター実行可能命令が符号化された少なくとも１つのコンピューター可読記憶媒体（１０４）であって、前記方法は、
前記呼び出し側ソフトウェアモジュールのために少なくとも１つの第１のメモリー操作を実行する（３１２、３１４）ステップであって、前記実行は、前記１つまたは複数の軽減活動の適用を含むステップと、
前記１つまたは複数の軽減活動が、前記呼び出し側ソフトウェアモジュールに影響するメモリーエラーの数を減らすことに成功したかどうかを評価する（６１２、７０８、７３０）ステップと、
その後前記１つまたは複数の軽減活動に従って前記呼び出し側ソフトウェアモジュールのために少なくとも１つの第２のメモリー操作を実行する（３００）ステップと
を含み、前記実行するステップは、
前記１つまたは複数の軽減活動が成功した場合は、前記１つまたは複数の軽減活動に従って前記呼び出し側ソフトウェアモジュールのために前記少なくとも１つの第２のメモリー操作を実行する（３１２、３１４）ステップと、
前記１つまたは複数の軽減活動が成功しなかった場合は、前記１つまたは複数の軽減活動を行わずに前記呼び出し側ソフトウェアモジュールのために前記少なくとも１つの第２のメモリー操作を実行する（３１６）ステップと
を含む、ことを特徴とする少なくとも１つのコンピューター可読記憶媒体。
【請求項１５】
前記１つまたは複数の軽減活動は、割り当て操作の場合、前記割り当て操作において要求された以上の追加(extra)メモリーを割り当て（７０４）、前記追加メモリーにマーカー値を書き込むステップを含み、
前記１つまたは複数の軽減活動が成功したかどうかを評価するステップは、前記追加メモリーを再調査し（７０８）、前記追加メモリーが前記マーカー値を保持しているかどうかを判定するステップを含む、請求項１４に記載の少なくとも１つのコンピューター可読記憶媒体。
【請求項１６】
前記１つまたは複数の軽減活動は、メモリーの解放操作の場合(for a free operationof memory)、待ち時間の後に前記解放操作を行う（７３６）ステップを含み、
前記１つまたは複数の軽減活動が成功したかどうかを評価するステップは、前記待ち時間の後に、前記メモリーの内容が、前記解放操作が要求された時の内容と同じであるかどうかを判定する（７３０）ステップを含む、請求項１４に記載の少なくとも１つのコンピューター可読記憶媒体。
【請求項１７】
前記１つまたは複数の軽減が成功したかどうかを評価するステップは、前記呼び出し側ソフトウェアモジュールの終了を検出し（８１０）、前記終了が適正であったかどうかを判定し、前記呼び出し側ソフトウェアモジュールが適正に終了したことが検出された場合は前記１つまたは複数の軽減活動が成功したと判定するステップを含む、請求項１４に記載の少なくとも１つのコンピューター可読記憶媒体。
【請求項１８】
前記方法が、前記終了が適正であった場合は前記軽減が成功した旨を示す第１の統計値を更新し、前記終了が適正でなかった場合は前記軽減が成功しなかった旨を示す第２の統計値を更新するステップをさらに含む、請求項１７に記載の少なくとも１つのコンピューター可読記憶媒体。
【請求項１９】
前記評価する動作に基づいて、前記呼び出し側ソフトウェアモジュールの複数のインスタンスにわたる前記１つまたは複数の軽減活動の成功を示す、前記呼び出し側ソフトウェアモジュールについての統計値を更新する（８１２）ステップをさらに含み、
前記その後実行する動作は前記統計値に従って行われる、
請求項１４に記載の少なくとも１つのコンピューター可読記憶媒体。
【請求項２０】
前記統計値は軽減チケット値であり、前記統計値を更新するステップは、前記１つまたは複数の軽減活動が成功した場合は前記軽減チケット値を増分し、前記１つまたは複数の軽減活動が成功しなかった場合は前記軽減チケット値を減分するステップを含む、請求項１９に記載の少なくとも１つのコンピューター可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本願発明の実施例は、例えば、選択的に軽減を使用してエラーを低減するメモリー管理技術の有効性の評価に関する。
【背景技術】
【０００２】
[0001]多用途コンピューティングデバイスでは、オペレーティングシステムのみではなくとも、通例はオペレーティングシステムが使用されて、そのコンピューティングデバイスで実行される１つまたは複数のアプリケーションが使用するコンピューティングデバイスのメモリーを管理する。例えば、２つのアプリケーションがコンピューティングデバイスのメモリーにアクセスする場合、オペレーティングシステムは、両アプリケーションが相互によって格納されたデータを破損することなくメモリーにアクセスできるように、２つのアプリケーションが使用するメモリーの部分を割り当てることができる。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
[0002]この管理およびアービトレーションは、アプリケーションが、別のアプリケーションに使用されているメモリーの使用を試みる場合に発生し得る問題を緩和するために必要な場合がある。例えば、２つのアプリケーションが共に、同一の時間または重複している時間にメモリーの同一部分を使用することを試みた場合は、第２のアプリケーションが第１のアプリケーションのデータを上書きする可能性があり、第１のアプリケーションが適正に実行することができないか、さらにはクラッシュする可能性がある。そのようなエラーは、特に頻繁に発生する場合にはユーザーエクスペリエンスに重大な影響を与える。
【０００４】
[0003]オペレーティングシステムは、通例、メモリーマネージャーを備え、アプリケーションはメモリー管理タスクを実行する要求をメモリーマネージャーに送信することができ、メモリーマネージャーは、メモリー資源の使用についてプロセス間を調停することができる。例えば、アプリケーションが一時的または永続的にデータを格納したい場合、アプリケーションは、いくらかの量のメモリーをアプリケーションに割り当てることをメモリーマネージャーに要求することができる。後に、アプリケーションがそのメモリーを必要としなくなると、アプリケーションはメモリーマネージャーにその旨を通知し、別のアプリケーションが使用できるように、割り当てられたメモリーの割り当てを解除（または「解放」）することを要求することができる。第２のアプリケーションがメモリーマネージャーにメモリー要求を送信すると、メモリーマネージャーは、自身の記録を調べて、現在割り当てられていないメモリー部分を判別し、それらの部分を第２のアプリケーションに割り当てることができる。
【０００５】
[0004]例えばオペレーティングシステムと対話するプロセスを実行する可能性のあるソフトウェアアプリケーションの中には、メモリー操作の実施に関連するバグや他のプログラミング上の欠陥を含んでいるものがあり、そのようなソフトウェアアプリケーションは、メモリーマネージャーがメモリー操作を正しく実行した場合でもメモリーエラーの結果障害を起こす可能性がある。そのようなメモリーエラーは、メモリー操作間で発生し得る不整合の結果生じる可能性がある。例えば、上記のように、ソフトウェアアプリケーションは、第１の量のメモリーを当該アプリケーションに割り当てることを要求し、その後第１の量よりも大きい第２の量のデータをメモリーに書き込む場合がある。動作間の不整合、この例では第１の量と第２の量の大きさの不整合が、ソフトウェアアプリケーションの障害につながるメモリーエラーを引き起こす可能性がある。そのような障害には、メモリーエラーが原因で生じる不適正な実行や、さらにはアプリケーションの実行を停止させる破局的エラー、すなわち「クラッシュ」が含まれ得る。
【０００６】
[0005]そのようなプログラミングバグの影響のために、そのようなメモリーエラーを引き起こすプログラミングバグの特定を試みるソフトウェアツールが開発されている。それらのツールは、ソフトウェアアプリケーションの開発試験時に使用することができる。
【０００７】
[0006]例えば、ソフトウェアアプリケーションの開発試験時にバグを特定するために使用可能な種々の「デバッグ」ツールが存在する。ワシントン州レドモンドのマイクロソフトコーポレーションから入手可能なＶｉｓｕａｌ  Ｓｔｕｄｉｏ等のソフトウェア開発アプリケーションの中には、内蔵ツール等のツールを備えるものがある。Ｖｉｓｕａｌ  Ｓｔｕｄｉｏでは、開発者が、試験時に、ページヒープ機能を備えることができるアプリケーション検証ツール機能を有効にする選択をすることができる。ページヒープを使用して、試験対象のアプリケーションについてのメモリーの割り当ておよび使用状況を監視することにより、バッファオーバーランおよびアンダーランを含む何種かのメモリーエラーを検出することができる。ページヒープでは、ある量の確保された追加メモリー（「非アクセス可能ページ」と呼ぶ）が、ヒープメモリーの割り当て部分（通常の「ユーザー割り当て」ページ）の後に配置され、アプリケーション検証ツール機能を有効にして、非アクセス可能ページに情報が書き込まれるとそのことを検出する。そのようにして、デバッグツールは、エラーを特定し、開発者に報告することができる。
【０００８】
[0007]しかし、そのようなデバッグツールは、ソフトウェアアプリケーションの実行時には使用することができない。メモリーエラーが原因でクラッシュが発生した時にクラッシュ情報を収集する他のツールが開発されており、分析時に収集された情報を使用してメモリーエラーを特定することができる。そのような実行時に経験されるクラッシュを解決する試みは、従来、そのようなエラーが発生した時に検出し、クラッシュの状態を中央の集約点に報告することに限られており、エラーに関して利用可能な情報を集約点から開発者に通知することができる。開発者は、その情報を使用してエラーを再現またはデバッグし、次いでバグの特定と解決を試みることができる。マイクロソフトコーポレーションから入手可能なＷｉｎｄｏｗｓオペレーティングシステムは、そのＷｉｎｄｏｗｓエラー報告（ＷＥＲ）システムにそのような報告機能を提供している。このシステムでは、アプリケーションが例えばクラッシュや他の形の不適正な終了等により不完全に終了したことをＷＥＲが検出すると、命令スタックの内容等、アプリケーションの状態に関する情報がＷＥＲによってまとめられ、集約サーバーに報告されることができる。この情報は、エラーのクラスを識別する汎用システムエラーコードも含むことができるが、エラーの原因となった正確なバグに関する情報は含まない。
【課題を解決するための手段】
【０００９】
[0008]本出願人らは、メモリーエラーを引き起こすソフトウェアアプリケーション中のプログラミングバグを補償するメモリー管理を使用することにより、アプリケーションがより確実に動作し、ユーザーエクスペリエンスを向上させることが可能であることを認識および理解した。本出願人らは、多くのメモリーエラーは、アプリケーションによって行われるメモリー操作の不整合が原因で生じる可能性があり、また、そのようなプログラミングバグの影響は、それらの不整合を予想し、その不整合を補正するようにメモリー管理を行うことによって軽減可能であることを認識した。例えば、アプリケーションが要求したより多くの資源（メモリーおよび／または時間等）をアプリケーションに割り当てることにより、メモリー管理モジュールは、アプリケーションに要求よりも多くのメモリーにアクセスさせる、またはメモリーを使用し終えたことを通知した後でメモリーを使用させる、アプリケーション中のバグを補償することができる。さらに、事例によっては、メモリー管理モジュールは、例えばアプリケーションによって要求されたメモリー操作の入力情報が正しくないと検出された場合には、その操作を行わないことによってエラーを軽減することができる。
【００１０】
[0009]種々の軽減活動によって多くの異なる種類のエラーが軽減されることができ、軽減活動の例は以下でより詳細に述べる。ただし、本出願人らは、そのような軽減はコンピューティングデバイスの効率に著しい影響を及ぼす可能性があり、それらのデバイスで実行されるアプリケーションの性能に影響する可能性があることを認識した。メモリー操作が要求されるたびにメモリー操作を評価および操作すると、要求の完了に時間がかかり、要求よりも大きいメモリーを割り当てると、より多くのメモリーを使用し、したがってシステムが利用可能な資源を減らす可能性がある。本出願人らは、メモリー管理モジュールが、アプリケーションごとに選択的に有効にすることが可能な軽減を有すると望ましいことを認識した。
【００１１】
[0010]本明細書に記載の原理により、メモリー管理モジュールに対してメモリー操作の実行要求を発行する１つまたは複数のソフトウェアモジュールごとに異なる動作モードを有するメモリー管理モジュールを実装することができる。１つの動作モードでは、呼び出し側ソフトウェアモジュールによって要求されたメモリー操作に加えて、またはその代わりに、１つまたは複数の軽減活動がメモリー管理モジュールによって行われることができ、メモリー操作は軽減活動に従って行われる。それらの軽減活動は、メモリーエラーが呼び出し側ソフトウェアモジュールに影響する可能性を低減する働きをすることができる。別の動作モードでは、メモリー管理モジュールは、軽減活動を行わずに、要求通りにメモリー操作を行う。メモリー管理モジュールは、自身に関連付けられたデータストア中にレコードを維持することができ、レコードは、呼び出し側ソフトウェアモジュールごとに、その呼び出し側ソフトウェアモジュールに対してメモリー管理モジュールが動作すべきモードを指示する少なくとも１つのエントリーを有する。
【００１２】
[0011]しかし、本出願人らは、上記のような軽減は、その軽減が実装されるコンピューティングデバイスおよびアプリケーションの効率性に著しい影響を及ぼす可能性があることを認識した。メモリー操作が要求されるたびにメモリー操作を評価および操作すると要求の完了に時間がかかる可能性があり、要求より多いメモリーを割り当てると、より多くのメモリーを使用し、したがってシステムが利用可能な資源を減らす可能性がある。したがって、本出願人らは、メモリー管理モジュールが、ソフトウェアモジュールごとに選択的に有効にすることが可能な軽減を有すると望ましいことを認識した。
【００１３】
[0012]本明細書に記載の原理に従い、メモリー管理モジュールに対してメモリー操作の実行要求を発行する１つまたは複数のソフトウェアモジュール各々に対して２つの動作モードの１つで機能するメモリー管理モジュールを実装することができる。１つの動作モードでは、呼び出し側ソフトウェアモジュールによって要求されたメモリー操作に加えて、またはその代わりに、１つまたは複数の軽減活動がメモリー管理モジュールによって行われることができ、メモリー操作は軽減活動に従って行われる。それらの軽減活動は、メモリーエラーが呼び出し側ソフトウェアモジュールに影響する可能性を低減する働きをすることができる。他方の動作モードでは、メモリー管理モジュールは、軽減活動を行わずに要求通りにメモリー操作を行う。ソフトウェアモジュールに対して軽減活動が有効にされると、その軽減活動を監視して、ソフトウェアモジュールに負の影響を与えるメモリーエラーの数を減らすことに軽減活動が成功しているかどうかを判定することができる。監視は、時間の経過と共にアプリケーションの複数のインスタンスにわたって監視して軽減活動が効果的であるかどうかについての統計値を収集する等、適当な方式で行われてよい。エラーおよび軽減活動の成功の検出の回数および／または頻度についての統計値を含めて、任意の適当な統計値が収集されてよい。それらの統計値は、適当な形態をとってよく、あるインスタンスで軽減活動が成功すると増分され、別のインスタンスで軽減活動が成功しないと減分されるチケット値の形態が含まれる。軽減活動がソフトウェアモジュールに負の影響を与えるメモリーエラーの数を減らすことに成功していることが監視で判明した場合、その軽減活動は、そのソフトウェアモジュールによって要求される将来のメモリー操作に適用することができる。成功していない場合、メモリー管理モジュールは、そのソフトウェアモジュールによって要求される将来のメモリー操作にその軽減活動を適用するのを控えることができる。メモリー管理モジュールは、自身に関連付けられたデータストア中にレコードを維持することができ、レコードは、各呼び出し側ソフトウェアモジュールについて、その呼び出し側ソフトウェアモジュールに対してメモリー管理モジュールが動作すべきモードを示す少なくとも１つのエントリーを有する。
【００１４】
[0013]本明細書に記載の原理の一部またはすべてに従ってメモリー管理モジュールを稼動させることにより、ユーザーアプリケーション等のソフトウェアモジュールが不適正に実行される、またはクラッシュする可能性を下げることを含むいくつかの利点が得られ、それにより、それらのソフトウェアモジュールを使用する際のユーザーエクスペリエンスを向上させる効果があり得る。
【００１５】
[0014]上述の内容は本発明の非限定的な概要であり、本発明は添付の特許請求の範囲のみによって定義されることを理解されたい。
[0015]添付図面は一定の縮尺での図示を意図していない。図面では、様々な図に示された同一またはほぼ同一の各構成要素は同様の参照符号で表される。図を見やすくするために、すべての図面ですべての構成要素に符号が付されているとは限らない。
【図面の簡単な説明】
【００１６】
【図１】[0016]本明細書に記載の原理の一部に従って動作する技術が機能することが可能な例示的コンピューティングデバイスのブロック図である。
【図２Ａ】[0017]従来のメモリー管理技術に従って動作するシステムの構成要素間の対話の概略図である。
【図２Ｂ】[0018]本明細書に記載の原理の一部に従って動作する技術が機能することが可能な一例示的システムの一部構成要素間の対話の一部の図である。
【図２Ｃ】[0019]アプリケーション単位でメモリー軽減を実装するために使用できるコンピューター記憶媒体内のデータ構造の概略図である。
【図３】[0020]本明細書に記載の原理の一部によりメモリー管理を行う例示的技術のフローチャートである。
【図４Ａ】[0021]本明細書に記載の原理の１つまたは複数によりメモリー操作を行う例示的技術のフローチャートである。
【図４Ｂ】[0021]本明細書に記載の原理の１つまたは複数によりメモリー操作を行う例示的技術のフローチャートである。
【図４Ｃ】[0021]本明細書に記載の原理の１つまたは複数によりメモリー操作を行う例示的技術のフローチャートである。
【図４Ｄ】[0021]本明細書に記載の原理の１つまたは複数によりメモリー操作を行う例示的技術のフローチャートである。
【図５】[0022]本明細書に記載の原理の一部によりメモリーの割り当てを解除する操作を行う一例示的技術のフローチャートである。
【図６】[0023]本明細書に記載の原理の一部により特定アプリケーションに軽減技術を適用するかどうかを判定する例示的技術のフローチャートである。
【図７Ａ】[0024]本明細書に記載の原理の一部により、メモリーエラーがアプリケーションに及ぼす影響を軽減する際の軽減技術の成功を判定する例示的技術のフローチャートである。
【図７Ｂ】[0024]本明細書に記載の原理の一部により、メモリーエラーがアプリケーションに及ぼす影響を軽減する際の軽減技術の成功を判定する例示的技術のフローチャートである。
【図８】[0025]本明細書に記載の原理の一部により、特定アプリケーションについて軽減技術を解除するかどうかを判定する例示的技術のフローチャートである。
【図９】[0026]本明細書に記載の原理の一部により動作する技術が機能することが可能な例示的コンピューティングデバイスのブロック図である。
【図１０】[0027]本明細書に記載の原理の一部により動作する技術が機能することが可能な一例示的システムの一部構成要素間の対話の一部の図である。
【図１１】[0028]本明細書に記載の原理の一部により動作する技術が機能することが可能な例示的コンピューターシステムの図である。
【図１２】[0029]本明細書に記載の原理の一部によるメモリー管理技術を使用するようにコンピューティングデバイスを構成する例示的技術のフローチャートである。
【図１３】[0030]本明細書に記載の原理の一部によるメモリー管理技術を使用するようにコンピューティングデバイスを構成するように適合された中央集約サーバーでエラーデータおよび軽減データを受け取る例示的技術のフローチャートである。
【発明を実施するための形態】
【００１７】
[0031]資源管理モジュールは、共有資源を持つシステムで稼動し、その共有資源の調停役として機能して、複数の資源消費者が資源へのアクセスを試みる際に相互と衝突しないことを保証する。メモリー管理モジュールは、そのような資源管理モジュールの一例である。単一用途および多用途コンピューティングデバイスを含むコンピューティングデバイスの中には、２つ以上のタスクに関係する複数のアプリケーションや他の複数の命令セットを並行して実行するものがあり、そのような並行実行は、メモリーへのアクセスについて競合する可能性がある。２つ以上のアプリケーションが適正にコーディングされ、メモリー管理モジュールに与えられる命令が正しい場合は、メモリー管理は比較的単純な作業であり得る。本出願人らは、不都合なことにそれが常に該当するとは限らず、メモリーエラーを生じさせるプログラミングバグの結果アプリケーションまたは命令セットがクラッシュする可能性があることを認識した。例えば、ワシントン州レドモンドのマイクロソフトコーポレーションによる研究では、Ｗｉｎｄｏｗｓ（登録商標）オペレーティングシステムで実行されるユーザーソフトウェアアプリケーションのプログラミングバグのために、毎日著しい回数のアプリケーションクラッシュ（同調査で分析された全クラッシュ数の約１５％）の原因となっているメモリーエラーが発生していることが判明した。
【００１８】
[0032]本出願人らは、プログラミングバグが原因でアプリケーションに悪影響を与えるエラーが発生する確率を下げる処置をとる、改良されたメモリー管理モジュールを使用することにより、アプリケーション中のプログラミングバグの影響を軽減できることを認識および理解した。例えば、メモリー管理モジュールは、アプリケーション要求より多い資源をアプリケーションに割り当てることにより、結果としてアプリケーションが要求したよりも多くのメモリーを使用する、またはアプリケーションがメモリーの使用を終えたことを通知した後にメモリーを使用することにつながる、アプリケーション中のバグを補償することができる。さらに、事例によっては、メモリー管理モジュールは、メモリー操作を行うための呼び出しをアプリケーションが行うことで要求されたメモリー操作を実行しないことによりエラーを軽減することができる。例えば、動作のための入力情報が不正確であることを検出した場合、メモリー管理モジュールはその動作を実行しなくてよい。種々の軽減活動で多くの異なる種類のエラーが軽減されることができ、それらの活動の例は下記でより詳細に述べる。ただし、メモリーエラーを引き起こすプログラミングバグを軽減する任意の適当な活動を行うことができるため、下記に挙げる以外に多くの異なる種類の軽減活動が可能であることを理解されたい。
【００１９】
[0033]本出願人らは、場合によっては、軽減活動は、アプリケーションまたは他の命令セットの実行に悪影響を与え得ることも認識および理解した。例えば、要求されたよりも多くのメモリーをアプリケーションに割り当てる、または別のアプリケーションによる使用のためにメモリーを解放するまで遅延を置くと、コンピューティングデバイスはそうでない場合よりも多くのメモリーを使用する。また、メモリー操作がメモリー管理モジュールに受け取られた時に調べて軽減活動が利用可能であるかどうかを判定すると、それらのメモリー操作に応答するのにかかる時間が増大し、結果としてアプリケーションの実行時間が増大する。本出願人らは、メモリーマネージャーを呼び出すすべてのソフトウェアモジュール（「呼び出し側ソフトウェアモジュール」）に、メモリーエラーにつながるプログラミングバグがある訳ではないため、このような実行への悪影響は、これまでメモリーエラーを経験したことが検出されているかどうかに応じて呼び出し側ソフトウェアモジュールに選択的に軽減活動を適用することによって緩和できることを認識および理解した。したがって、本明細書には、アプリケーションのインスタンスである特定の呼び出し側ソフトウェアモジュールごとに異なる動作モードでメモリー操作を行う技術が記載され、動作モードは、アプリケーションのためのメモリー操作に軽減活動が適用される第１のモード、およびアプリケーションに軽減活動が適用されない第２のモード等である。
【００２０】
[0034]また、本出願人らは、呼び出し側ソフトウェアモジュールに対して常に軽減モードでメモリー操作を行うことは効率的でない場合もあることを認識した。例えば、実装によっては、メモリー管理モジュールは、呼び出し側ソフトウェアモジュールによって経験され得るすべてのメモリーエラーを軽減するようには構成されない場合もあり、また、特定の呼び出し側ソフトウェアモジュールには、コンピューティングデバイスで実装された特定のメモリー管理モジュールで軽減できないプログラミングバグがある場合もある。別の例として、呼び出し側ソフトウェアモジュールによっては、実行頻度の低い命令にプログラミングバグがある場合もある。別の例として、呼び出し側ソフトウェアモジュールに、メモリーエラーを引き起こすバグがほとんどない場合もある。そのような場合はいずれも、呼び出し側ソフトウェアモジュールに対して軽減モードでメモリー管理モジュールを稼動させると、一部のエラーを軽減する助けとなり得るが、そのような軽減可能なエラーは頻繁でない可能性があり、軽減モードで稼動するために生じる効率性の損失が、エラーの軽減で得られる利得を上回る場合がある。
【００２１】
[0035]したがって、本出願人らは、軽減モードでメモリー管理モジュールを稼動させる有効性を判定する検査を行い、その検査に応じてメモリー管理モジュールを構成することが望ましいことを認識および理解した。有効性の判定は任意の適当な方式で行われてよい。例えば、メモリーエラーの原因となったプログラミングバグがソフトウェアモジュールにある場合でも、メモリーエラーがモジュールに影響しなかったと検出された場合は、軽減活動が有効または成功裏にメモリーエラーを軽減したと判定することができる。この検査は、時間の経過と共にアプリケーションの複数インスタンスにわたって行って、エラーの回数および／または頻度、ならびに検出された軽減活動の成功の回数および／または頻度についての統計値を含む、軽減活動の有効性についての統計値を収集することができる。この統計値は、チケット値を含む適当な形態をとってよく、チケット値は、あるインスタンスにバグがある場合でも軽減活動が呼び出し元アプリケーションに対する影響を回避することに成功した場合に増分され、別のインスタンスで軽減活動が成功しなかった時に減分される。任意の適切な基準を使用して、軽減が成功したか、成功しなかったかを判定することができる。一部の実施形態では、軽減は、軽減することが可能な種類のバグが検出されない場合に不成功とみなすことができる。ただし、他の実施形態では、他の異なる基準または追加的な基準を適用することができる。以前の軽減の成功に基づいて軽減を適用することを選択した場合に生じる振る舞いの一例として、メモリー管理モジュールは、アプリケーションのインスタンスである特定のソフトウェアモジュールにメモリー操作を行う時に軽減モードで動作するように構成することができる。このモードには、クラッシュまたはメモリー機能に起因する他のエラーの後に入ることができる。いくらかの期間の後にモジュールへのメモリーエラーの影響を防止するのに軽減が有効でないと判定された場合、メモリー管理モジュールは、その特定アプリケーションの後続インスタンスについては軽減を行わない通常モードで動作するように構成することができる。この期間は、時間測定によって計測するか、かつ／または、成功した軽減がないままアプリケーションがクリーン終了した回数に基づく等の何らかの他の方式で計測することができる。以下にそのような判定を行うために使用できる例示的な検査を記載し、その検査の結果を使用して、メモリー管理モジュールが特定の呼び出し側ソフトウェアモジュールに対して動作する際のモードを制御することができる。
【００２２】
[0036]本出願人らはさらに、広く公開されたソフトウェアアプリケーションに関連するもの等、ソフトウェアモジュールによっては複数のコンピューティングデバイスで実行される場合があり、そのようなコンピューティングデバイスはそれぞれ、そのソフトウェアモジュールを扱った経験、および軽減活動が有効であるかどうかについての経験を有する可能性があることを認識した。例えば、他のコンピューティングデバイスが、軽減活動が成功したか不成功であったかを判定した経験を有する場合がある。本出願人らは、したがって、他のコンピューティングデバイスの経験を活用して、アプリケーションに対して軽減活動を適用するかどうか、またはその長さを決定することにより、コンピューティングデバイスの性能をさらに向上させることが可能であることを認識および理解した。
【００２３】
[0037]集約された情報を利用するために、コンピューティングデバイスは、エラーの種類および軽減活動の成功についての詳細な情報を、複数のデバイスから情報を収集する１つまたは複数の他のコンピューティングデバイスに送信するように適合することができ、複数のデバイスはすべて、１つのアプリケーションのインスタンスであるソフトウェアモジュールを実行している可能性がある。そのようなデバイスは、特定アプリケーションに関して軽減の成功についての情報を集約することができる。その集約情報に基づいて、デバイスが、特定のソフトウェアモジュールに対して軽減活動を適用するかどうかについての構成情報を、１つまたは複数のコンピューティングデバイスから受け取ることもできる。その情報は、軽減活動の成功が計測され得る際の基準となる統計値に関する情報等、任意の適切な形態でよい。例えば、構成情報は、アプリケーションに対する軽減を無効にするかどうかを判定する前に、より多い数または少ない数のアプリケーションインスタンスを考慮すべき旨の指示を含むことができる。そのような一部の実装では、指示は、アプリケーションに対する軽減を無効にするかどうかを判定するために、本明細書に記載の検査技術に従って使用することが可能な初期軽減チケット値を含むことができる。したがって、以下に、軽減活動を適用するようにコンピューティングデバイス上のメモリー管理モジュールを構成する際に使用できる情報を、他のコンピューティングデバイスとの間で送受信する技術が記載される。
【００２４】
[0038]特定の実施形態では、本明細書に記載される原理の一部に従って、各実施形態がすべての原理を使用せずに、技術を実施することが可能であることを理解されたい。本発明の実施形態は、特定の原理またはそれら原理の特定の組で実施することに限定されないため、それら原理の１つまたは複数の適切な組み合わせを実装することができる。例えば、選択的に軽減活動を適用するが軽減活動の有効性は検査せず、他のコンピューティングデバイスから構成データを受け付けないメモリー管理モジュール、または、選択的に軽減活動を適用し、有効性を検査するが、他のコンピューティングデバイスからの構成データは受け付けないメモリー管理モジュールを実装することができる。
【００２５】
[0039]以下に記載される技術は、各種方式で実装することができ、各種の命令セットに作用することができる。説明を簡潔にするために、以下の例では、メモリー管理モジュールおよびエラー報告サービスは、コンピューティングデバイスのオペレーティングシステムの一部として、また、ソフトウェアモジュールはオペレーティングシステムに管理されるアプリケーションとして説明する。そのような例は、本明細書に記載の原理の一部の商用実装の１つに見られ、その場合オペレーティングシステムはＭｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓ（登録商標）であり、以下に記載される軽減モジュールはフォールトトレラントヒープ（ＦＴＨ）クライアントであり、以下に記載の軽減有効化モジュールはＦＴＨサーバーであり、エラー報告クライアントおよびサーバーは、Ｗｉｎｄｏｗｓ（登録商標）エラー報告（ＷＥＲ）サービスのコンポーネントである。ただし、これは本明細書に記載の原理を実装することが可能な種々の方式の一例に過ぎず、他の方式が可能であることを理解されたい。例えば、メモリー管理モジュールは、コンピューティングデバイスのオペレーティングシステムと対話する独立型コンポーネントとして、またはオペレーティングシステムに管理されるアプリケーションのコンポーネントとして、またはオペレーティングシステムを持たないコンピューティングデバイスで実行されるモジュールとして実装することが可能である。さらに、メモリー管理モジュールに要求を発行するソフトウェアモジュール（「呼び出し側ソフトウェアモジュール」）は、プロセッサーによって実行可能な命令の適切な構成であってよい。一部の実装では、ソフトウェアモジュールは、ユーザーアプリケーションのインスタンス、オペレーティングシステムのコンポーネント、サービスもしくはデーモン、または他の適切なソフトウェアモジュールであってよい。各ソフトウェアモジュールは、下記のように１つまたは複数の「機能モジュール」であってよい。
【００２６】
[0040]また、メモリー管理モジュールは、１つまたは複数のメモリー操作の適当な組み合わせ、ならびに１つまたは複数の軽減活動の適当な組み合わせを行うように実装することができる。メモリー操作は、割り当て、割り当て解除（解放）、再割り当て、ページング、および多くのその他の操作等、メモリー資源の使用に影響する適当な動作であり得る。軽減活動は、呼び出し側ソフトウェアモジュール中のプログラミングバグがメモリーエラーを生じさせ、不適正な実行またはクラッシュを引き起こす等して呼び出し側ソフトウェアモジュールに負の影響を与える可能性を低減するために、メモリー管理モジュールで行うことが可能な任意の適当な活動であってよい。
【００２７】
[0041]メモリーエラーは、不適正な実行またはクラッシュを引き起こす等によりソフトウェアに負の影響を与え得るメモリー破損を生じさせるエラーであり得る。多くの場合、メモリー破損は、メモリー操作間の不整合につながるプログラミングバグが原因で生じ得る。メモリーエラーには、割り当てメモリーの境界外側への書き込み（バッファオーバーランまたはアンダーラン）、重複する時間に２つのモジュールがそれぞれ同じメモリー空間を使用している際の別のソフトウェアモジュールによる格納情報の上書き、または、モジュールに割り当てられたメモリー部分と異なる部分の使用、が含まれる。これらのメモリーエラーは、ソフトウェアモジュールが経験し、本明細書に記載の原理の一部によって軽減され得る種類の例に過ぎないことを理解されたい。
【００２８】
[0042]メモリーエラーの軽減は、１つまたは複数の適切な軽減活動を行うことにより、適当な方式で行うことができる。場合によっては、軽減活動は、整合しないメモリー操作を予想して行われる活動、およびその不整合に対処しようとする活動を含むことができる。例示的な軽減活動は下記でより詳細に説明するが、実行前に操作を変更する活動、操作を実行しない活動、後の時に操作を実行する活動、実行前に操作についての正しい入力を確認する活動、または、メモリー空間に対する最小限の変更で操作を行う活動を含み得る。
【００２９】
[0043]さらに、一般に「ヒープ」メモリーと呼ばれる１種類のメモリーに動作するメモリー管理モジュールを用いる例示的実装を以下に記載する。ただし、スタックメモリーおよび／またはグローバル変数メモリーを含む１つまたは複数の適切な種類のメモリーが、本明細書に記載の原理の一部に従って動作する技術で管理されることが可能であることを理解されたい。
【００３０】
[0044]本明細書に記載の原理の一例示的実装では、呼び出し側ソフトウェアモジュール（例えばソフトウェアアプリケーションのインスタンスであり得る）が、メモリー操作を行う要求をメモリー管理モジュールに発行することができる。メモリー管理モジュールは、軽減有効化モジュールと対話することができる。軽減有効化モジュールは、有効化モジュールによって格納された規則および設定データの１つまたは複数のエントリーを調べて、その特定の呼び出し側ソフトウェアモジュールに操作を行う際にメモリー管理モジュールが動作するモードを決定することができる。この実装および一部の他の実装では、規則および設定データの調査は、１つまたは複数の統計が閾値レベルを上回るか、下回るかを調べて判定することを含むことができる。規則および設定が、メモリー管理ユニットが軽減モードで動作すべきでないと示す場合、例えば軽減チケット値が閾値レベル未満の場合は、メモリー操作は要求通り行われる。一方、規則および設定が、メモリー管理ユニットが軽減モードで動作すべきと示す場合は、メモリー管理ユニットの軽減モジュールが有効にされることができる。そして軽減モジュールは、メモリー管理モジュールと連携して、メモリーエラーが呼び出し側ソフトウェアモジュールに負の影響を与える可能性を低減するのに役立ち得る１つまたは複数の軽減活動に従ってメモリー操作を行うことができる。メモリー管理モジュールの動作モードは、好ましくはソフトウェアモジュールごとに独立しており、またメモリー管理ユニットは、ある呼び出し側ソフトウェアモジュールには第１のモードでメモリー操作を行い、別の呼び出し側ソフトウェアモジュールには第２のモードで別のメモリー操作を行ってよいことを理解されたい。
【００３１】
[0045]この例示的実装では、軽減モジュールおよび軽減有効化モジュールは、１つまたは複数の軽減活動が、一旦有効化されるとエラーの軽減に成功したかどうかを評価するようにも適合することができる。これは、任意の適当な方式で行うことができ、その例は以下で述べる。例えば、軽減活動が行われると、最初の観察が行われ、後に記録された観察結果と比較されて、その軽減活動でエラーの発生が阻止された可能性のあるプログラミングバグを示唆する可能性のある活動を呼び出し側ソフトウェアモジュールが行ったかどうかを判定することができる。例えば、下記で述べるように、割り当て動作時に、要求よりも多くの量のメモリーを割り当てることができ、その追加メモリーにマーカー値を書き込むことができる。後に呼び出し側ソフトウェアモジュールがメモリーの割り当て解除を要求すると、軽減モジュールは、追加メモリーを調べて、マーカー値がまだメモリーにあることを確かめることができる。マーカー値の一部またはすべてが上書きされている場合は、軽減モジュールは、軽減活動（追加メモリーの割り当て）が、バッファオーバーランが原因で生じるメモリーエラーを防止する効果があったと判定することができる。軽減活動の有効性の評価のさらなる詳細および他の例示的検査を下記で述べる。軽減チケット値を用いる一部の実装では、特定の呼び出し側ソフトウェアモジュールに対して軽減活動が有効であったと判定されると、軽減チケット値を増分することができ、軽減活動が有効でなかった、または効果がなかったと判定された場合は、軽減チケット値は減分することができる。
【００３２】
[0046]この実装では、軽減モジュールおよび軽減有効化モジュールは、さらに、メモリーエラーがソフトウェアモジュールに負の影響を与えることを防止するための軽減活動の有効性、およびその軽減活動を有効にするかどうかに関する情報を、遠隔のコンピューティングデバイスとの間で送受信するように適合することができる。例えば、呼び出し側ソフトウェアモジュールがクラッシュしたことをメモリー管理モジュールが検出すると、メモリー管理モジュールは、記録から、メモリーエラーが検出されたかどうか、およびそれらのメモリーエラーの中で軽減されたものがあるかどうかを判定することができる。そして、その情報を１つまたは複数の他のコンピューティングデバイスに送信し、それに対して１つまたは複数の他のコンピューティングデバイスから情報を受け取ることができる。すべての実装で該当する訳ではないが、この例示的実装では、１つまたは複数の他のコンピューティングデバイスは集約サーバーを備えることができ、集約サーバーも、Ｗｉｎｄｏｗｓエラー報告サービス等のエラー報告サービスの一部として機能することができる。集約サーバーは、１つまたは複数のコンピューティングデバイスからエラーおよび軽減の情報を受け付け、その情報を、クラッシュしたことが検出されたソフトウェアモジュールの開発者を含むベンダーに送信することができる。集約サーバーは、各コンピューティングデバイスで軽減活動がメモリーエラーの軽減に成功しているかどうかも判定することができ、特定のソフトウェアモジュールについて軽減モードを有効にするかどうかをそのコンピューティングデバイスに通知することができる。一部の実装では、軽減モードを有効にするかどうかをコンピューティングデバイスに通知することは、軽減チケット値の推奨初期値の送信を含むことができ、この値は、軽減がこれまで成功している、または高確率で成功している場合はより高い値とし、軽減がこれまで成功していない、または低い確率でのみ成功している場合はより低い値等とされるが、本発明の実施形態はこの点で限定されないため、他の実装は任意の適切な構成情報で動作してよいことを理解されたい。
【００３３】
[0047]この例示的実施形態は、本明細書に記載される原理の多くに従って動作するものと記載されるが、他の実装は、それらの原理のうちより多い数または少ない数に従って動作することが可能であり、すべての実装が本明細書に記載のすべての原理に従って動作することが可能であるとは限らないことを理解されたい。
【００３４】
[0048]上記で簡単に述べたように、本出願人らは、多くの異なる種類のプログラミングバグが、ソフトウェアモジュールを不適正に実行させる、またはクラッシュさせる等により、ソフトウェアモジュールに負の影響を与え得るメモリーエラーを引き起こす可能性があることを認識した。文脈上、最も一般的なそのようなプログラミングバグのいくつかを以下に記載するが、このエラーの列挙は、本明細書に記載の原理の一部の実装で軽減することが可能なすべてのプログラミングバグを網羅するものではなく、それらの原理の一部またはすべてに従って動作する技術を使用して軽減することが可能な他のバグが存在することを理解されたい。
【００３５】
[0049]第１の例として、呼び出し側ソフトウェアモジュールが、ある量のメモリー、例えば１６バイトのメモリーを自身に割り当てるようにメモリー管理モジュールに要求し、次いで要求したよりも多くのメモリー、例えば１７バイト以上を使用することを試みる場合がある。従来のメモリー管理モジュールは、ソフトウェアモジュールが追加のメモリーを使用していることを検出することができず、そのメモリーを別のソフトウェアモジュールに割り当てる可能性がある。そして、他方のソフトウェアモジュールがメモリーの使用を開始すると、１つまたは両方のソフトウェアモジュールがメモリーの使用を試みた時にメモリーエラーの結果不適正な実行となるか、さらにはクラッシュする可能性がある。
【００３６】
[0050]メモリーエラーを引き起こす可能性のあるプログラミングバグの第２の例として、ソフトウェアモジュールが、いくらかのメモリーをソフトウェアモジュールに割り当てるようにメモリー管理モジュールに要求し、その後メモリーを使用し終わったことをメモリー管理モジュールに通知するが、その後メモリーを使用し続ける場合がある。メモリー管理モジュールの記録では、メモリーは、解放されて別のソフトウェアモジュールに割り当てられる状態になっており、両方のソフトウェアモジュールが同時にメモリーの使用を試みて、結果として一方または両方が不適正な実行となる可能性がある。
【００３７】
[0051]第３の例として、ソフトウェアモジュールが、メモリーを使い終わったことをメモリー管理モジュールに通知することによってモジュールに割り当てられていたメモリーを「解放」し、その後、プログラミングバグのためにそのメモリーを再び解放する場合がある。メモリー管理モジュールは、その間にそのメモリーを別のソフトウェアモジュールに割り当てている可能性があり、２番目の不適正な解放操作の結果、メモリーを第３のソフトウェアモジュールに割り当てる可能性がある。そして、第２および第３のソフトウェアモジュールの一方または両方が、第１のモジュール中のプログラミングバグのために不適正な実行となる可能性がある。
【００３８】
[0052]第４の例として、一部のソフトウェアモジュールは、終了されると、自身に割り当てられていたすべてのメモリーを解放することを試みるが、試みるのが早過ぎる、または他の形で不正確である場合があり、その結果ソフトウェアモジュールがクラッシュする可能性がある。
【００３９】
[0053]第５の例として、汎用アドレス空間、スタックメモリー、および動的メモリーまたはヒープメモリー等の異なる種類のメモリーに異なる情報が格納される場合がある。命令セットの中には、プログラミングバグのために、ヒープメモリー操作を使用して汎用アドレス空間メモリーで行われるべき操作を行う等、誤ったコマンドを使用して異なる種類のメモリーと対話するものがあり得る。メモリー管理モジュールが、汎用アドレス空間メモリーの識別子を使用してヒープメモリーに対する操作を行うと、間違ったメモリー上で動作していることになり、ヒープメモリーを使用して呼び出しまたは命令セットを行うソフトウェアモジュールは、結果としてクラッシュする可能性がある。
【００４０】
[0054]第６の例として、命令セットへのメモリー割り当てを縮小または拡大する再割り当て操作では、メモリー割り当てを別のメモリー部分に移動することができるが、プログラミングバグのために、命令セットが、元の場所のメモリーを参照し続ける場合がある。したがって、その元のメモリーを使用している当該命令セットおよび他の命令セットがバグの結果クラッシュする可能性がある。
【００４１】
[0055]メモリー管理モジュールは、本明細書に記載の原理に従って動作することにより、上記および他のプログラミングバグが、不適正な実行さらにはクラッシュを引き起こすことでソフトウェアモジュールに負の影響を与えるメモリーエラーを生じさせるのを防止することができる。ソフトウェアモジュールへの負の影響は、ユーザーエクスペリエンスに負の影響を与える可能性があり、そのようなプログラミングバグの影響を軽減するとユーザーエクスペリエンスが大幅に改善する可能性がある。また、選択的に軽減活動を有効にするように動作し、軽減活動の有効性を検査することにより、それらの軽減活動の負の影響自体を軽減することができる。
【００４２】
[0056]本明細書に記載の原理に従って動作する上記および他の技術のさらなる機能および利点は、下記の例からより完全に理解されよう。以下の例は、本発明の理解を助け、本明細書に記載される原理の利益を示すものであるが、本発明の実施形態の全範囲を例示するものではない。
【００４３】
[0057]本明細書に記載の原理に従って動作する技術は、各種コンピューティングシステムで実装することができ、その例は下記で詳細に説明する。そのようなシステムは、一般に、いくつかの機能モジュールを実装する適切に構成されたコンピューティングデバイスの使用を伴い、各機能モジュールは、そのような技術の実行を達成するために必要な１つまたは複数の動作を提供する。各機能モジュールは、各自の方式で実装することができ、すべての機能モジュールを同じ方式で実装する必要はない。本明細書で使用される場合、機能モジュールは、動作上の役割を行うシステムの構造コンポーネントである。動作上の役割は、１つのソフトウェア要素の一部であっても、全体であってもよい。例えば、機能モジュールは、プロセス、単独プロセス、または他の適切な処理単位の機能を行うことができる。機能モジュールは、コンピューター実行可能命令を備えることができ、コンピューター記憶媒体にコード化されることができる。また、そのようなコンピューター実行可能命令は、いくつかの適切なプログラミング言語および／またはプログラミングツールもしくはスクリプト化ツールを使用して書くことができ、フレームワークまたは仮想機械で実行される実行可能機械言語コードまたは中間コードとしてコンパイルすることもできる。機能モジュールは、適宜、並列または直列実行することができ、メッセージパッシングプロトコルを使用して、または他の適当な方式で、モジュールが実行されるコンピューター上の共有メモリーを使用して相互間で情報を渡すことができる。１つまたは複数のタスクを実行する例示的な機能モジュールを以下で説明するが、記載される機能モジュールおよびタスクの分割は、本明細書に記載の例示的技術を実装することが可能な機能モジュールの種類を例示するに過ぎず、また、本発明は、特定の数、分割、または種類の機能モジュールへの実装に限定されないことを理解されたい。一部の実装では、全機能を単一の機能モジュールに実装することができる。さらに、下記では、分かりやすいように、機能モジュールはすべて１つまたは２つのコンピューティングデバイスで実行されるものとして述べるが、実装によっては、機能モジュールは、相互と通信するように構成された多くの別個のコンピューティングデバイスまたは単一のコンピューティングデバイスの別個のプロセッサーで実装されてよいことを理解されたい。例えば、１つのプロセッサーが、メモリー操作を行う要求をメモリー管理モジュールに発行する呼び出し側ソフトウェアモジュールを実行するように適合され、別のプロセッサーが、メモリー管理モジュールを実行するように適合されることができる。
【００４４】
[0058]下記のいくつかの例示的実施形態では、本明細書に記載の原理に従って動作する技術は、磁気媒体（例えばハードディスクドライブ）、コンパクトディスク（ＣＤ）やデジタル多用途ディスク（ＤＶＤ）等の光学媒体、永続的もしくは非永続的な固体素子メモリー（例えばフラッシュメモリー、磁気ＲＡＭ等）、または他の適切な記憶媒体等の１つまたは複数のコンピューター可読記憶媒体にコード化されたコンピューター実行可能命令として実装することができる。コンピューター記憶媒体は、図１および図９のコンピューター可読記憶媒体１０４として（すなわちコンピューティングデバイス１００の一部として）、または独立したコンピューター記憶媒体として実装することができる。本明細書で使用される場合、「コンピューター可読記憶媒体」を含む「コンピューター可読媒体」は、媒体へのデータの記録過程中に何らかの方式で変更されることが可能な少なくとも１つの物理構造を持つ有形記憶媒体を指すことを理解されたい。例えば、記録の過程中にコンピューター可読媒体の物理構造の一部の磁化状態を変更することができる。いくつかのそのような実施形態では、本明細書に記載の原理に従って動作する技術を実装するコンピューター実行可能命令は、１つまたは複数の独立型機能モジュール（例えばメモリー管理モジュール）として実装することができる。
【００４５】
[0059]本明細書に記載の技術はコンピューター実行可能命令として実施されるが、下記で説明する図１および図９の例示的コンピューティングデバイスを含めて、任意の適切なコンピューターシステムで動作する適切なコンピューティングデバイスで実行することが可能である。例えば、本明細書に述べられる原理の一部またはすべてに従って動作する技術は、単一の多用途プログラム可能デジタルコンピューター装置、処理能力を共有し、本明細書に記載の技術を共同して実施する２つ以上の多用途コンピューター装置からなる連携システム、本明細書に記載の技術の実行を専用とする単一のコンピューター装置もしくは（共に配置または地理的に分散された）コンピューター装置からなる連携システム、本明細書に記載の技術を実施するための１つまたは複数の特定用途集積回路（ＡＳＩＣ）、本明細書に記載の技術を実施するための１つまたは複数の利用者設定可能ゲートアレイ（ＦＰＧＡ）、または他の適切なシステムで動作することが可能である。
【００４６】
[0060]図１に、本明細書に記載の技術を実施するシステムで使用することが可能なコンピューティングデバイス１００の形態のコンピューティングデバイスの例示的な一実装を示すが、他の実装が可能である。さらに、図１は、コンピューティングデバイスが本明細書に記載の原理に従って動作するために必要な構成要素の図示でも、完全な図示でもないことを理解されたい。他の適切なコンピューティングデバイスで他の実装が動作し得ることをさらに理解されたい。
【００４７】
[0061]コンピューティングデバイス１００は、プロセッサー１０２、コンピューター可読記憶媒体１０４、およびメモリー１１６を備えることができる。コンピューティングデバイス１００は、例えばデスクトップまたはラップトップ型パーソナルコンピューター、ワークステーション、サーバー、メインフレーム、スマートフォン、携帯情報端末（ＰＤＡ）、独立型ネットワークデバイス、または、１つまたは複数のソフトウェアモジュールを１つの時に実行することができ、１つまたは複数のソフトウェアモジュール間で共有可能なメモリー等の１つまたは複数の資源を有する他の適切なコンピューティングデバイスを含む、適切なコンピューティングデバイスであってよい。コンピューター可読記憶媒体１０４は、プロセッサー１０２によって処理されるデータおよび／または実行される命令を格納するように適合された、適切な有形記憶媒体であってよい。プロセッサー１０２は、データの処理および命令の実行を可能にする。データおよび命令は、コンピューター可読記憶媒体１０４に格納することができ、例えばコンピューティングデバイス１００の構成要素間の通信を可能にすることができる。
【００４８】
[0062]コンピューター可読記憶媒体１０４に格納されたデータおよび命令は、本明細書に記載の原理に従って動作する技術を実装するコンピューター実行可能命令を含むことができる。図１の例では、コンピューター可読記憶媒体１０４は、上記のように、各種モジュールを実施するコンピューター実行可能命令を格納し、各種情報を格納する。コンピューター可読記憶媒体１０４は、コンピューティングデバイスで実行することが可能な１つまたは複数のソフトウェアモジュール１０６と、コンピューティングデバイス１００におけるプロセスの実行を支配し、メモリー１１６等の共有資源の使用を調整することができるオペレーティングシステム１０８とに関連するデータおよび命令を格納する。
【００４９】
[0063]メモリーの使用を調整するために、オペレーティングシステム１０８は、呼び出し側ソフトウェアモジュールによって要求されるメモリー操作を行うメモリー管理モジュール１１０を有することができる。呼び出し側ソフトウェアモジュールは、ソフトウェアアプリケーション１０６、オペレーティングシステム１０８の他のコンポーネント、またはコンピューティングデバイス１００で実行される他のソフトウェア要素等であり得る。メモリー管理モジュール１１０は、従来のメモリー管理技術ならびに本明細書に記載の技術の１つまたは複数を行うように、任意の適当な方式で実装することができる。上記のように、本明細書に記載の技術の一部の実装では、メモリー管理モジュール１１０は、呼び出し側ソフトウェアモジュールによってメモリー操作が要求されると１つまたは複数の軽減活動を行う働きをすることが可能な軽減モジュール１１２を備えることができる。軽減モジュール１１２は、軽減活動を必要としていることが検出されたソフトウェアモジュールだけに軽減活動が行われるように、呼び出し側ソフトウェアモジュール単位で選択的に適用されてよい。したがって、そのような実装で検出および有効化を行うために、オペレーティングシステム１０８はさらに、コンピューティングデバイス１００内のソフトウェアモジュールの実行を監視する軽減有効化モジュール１１４を備えることができる。ただし、代替の実装では、軽減モードは、コンピューティングデバイス９００の管理者等によって手動で有効または無効にすることができ、そのような実装では、軽減有効化モジュールは備えなくてよい。軽減モジュール１１２および軽減有効化モジュール１１４を含む図１に示すモジュールは、下記の例示的技術を含めて、本明細書に記載の原理に従って適当な方式で動作するように適合することができる。
【００５０】
[0064]図１に示す実装は、本明細書に記載の原理を実装することが可能な種々の方式の例示に過ぎないことを理解されたい。本発明の実施形態は特定のモジュールまたはモジュールのセットとして実装されることに限定されないため、代替の実装では、軽減モジュールおよび軽減有効化モジュールは、オペレーティングシステムとは別個のコンポーネントとして実装しても、または、オペレーティングシステム中の単一のコンポーネントとして、または他の適当な方式で実装してもよい。
【００５１】
[0065]従来のメモリー管理モジュールと、図１に示す実装に従って動作するメモリー管理モジュールの違いを図２Ａおよび図２Ｂに示す。図２Ａでは、複数の呼び出し側ソフトウェアモジュール２００が、メモリー操作の実施要求を含む操作要求２０２および２０４をオペレーティングシステムＡＰＩおよびメモリー管理モジュール２０６に発行している。それらの操作は要求通りに実施され、適切な情報が呼び出し側ソフトウェアモジュールに戻される。軽減活動は利用することができず、呼び出し側ソフトウェアアプリケーションの監視は行われず、これらのソフトウェアモジュールは、上記のものを含むプログラミングバグが原因で発生するメモリーエラーの影響を受ける可能性がある。
【００５２】
[0066]図２Ｂに、図１の例示的実装を示し、ここでは軽減モジュール１１２がオペレーティングシステムのコンポーネントとして実装されている。この実装では、図の実施形態のソフトウェアモジュールは、軽減モジュール１１２、および軽減モジュール１１２が特定の呼び出し側ソフトウェアモジュールに対して実装されているかどうかを認識しないので、呼び出し側ソフトウェアモジュール２００は、オペレーティングシステムおよびメモリー管理モジュール２０６に図２Ａと同じ操作要求２０２および２０４を発行する。上記で述べ、図２Ｂに示すように、軽減モジュール１１２は、呼び出し側ソフトウェアモジュールごとに選択的に適用されて１つまたは複数の軽減活動を行うことができ、したがって、呼び出し側ソフトウェアモジュール２００によって発行された操作要求は、必ずしもすべてではないが、一部が軽減モジュール１１２にインターセプトされる。特定の呼び出し側ソフトウェアモジュールに軽減モジュール１１２を有効にすべきかどうかを判定するために、軽減有効化モジュール１１４は、メモリー管理ユニット１１０および軽減モジュール１１２、ならびに呼び出し側ソフトウェアモジュール２００と通信状態にある。
【００５３】
[0067]呼び出し側ソフトウェアアプリケーションからメモリー操作を行う要求が送信されたことを検出すると、軽減有効化モジュール１１４は、軽減有効化モジュール１１４に関連付けられた軽減データストア２１２に格納された情報を検討して、要求されたメモリー操作を行う際に軽減モジュールが軽減モードで動作すべきかどうかを判定することができる。データストア２１２は、メモリー管理モジュール１１０の動作に関連する情報を維持しているため、メモリー管理モジュール１１０に関連付けられたデータストアとみなしてもよく、上記の一部の実装では、軽減有効化モジュール１１４がメモリー管理モジュール１１０の一部として実装される場合は、メモリー管理モジュール１１０の一部としてもよい。データストア２１２に格納された情報の検討は、イベントログ２１６ならびに規則および設定２１８の検討を含めて、適当な動作を含むことができる。データストア２１２は、永続的な方式で格納することができ、軽減有効化モジュール１１４が無効化またはシャットダウンされた場合、後に再有効化されると、それまでに行われた決定についての情報を含む、過去に収集された情報にアクセスすることができる。
【００５４】
[0068]データストア２１２は、呼び出し側ソフトウェアモジュール２００に経験されたメモリーエラー、軽減されたことが検出されたメモリーエラー、および行われることが要求されたメモリー操作についての情報を含むイベントログ２１６を格納することができる。イベントログ２１６の各エントリーは、任意の適切な情報を含むことができ、それらの情報には、ソフトウェアモジュールの名前等のバケットパラメーター、ソフトウェアモジュールのバージョン、エラー時に実行されていたソフトウェアモジュールのライブラリーまたは部分、エラーが検出された実行中の点、およびエラーを記述する例外コード、ならびに他の適切な情報が含まれる。規則および設定１８は、１つまたは複数の呼び出し側ソフトウェアモジュール２００についての適切な情報、ならびに一般的な軽減ポリシーについての情報を格納することができる。図２Ｃに、規則および設定２１８に格納することが可能な情報の一例を示す。規則および設定２１８は、複数の呼び出し側ソフトウェアモジュール２００それぞれについてのエントリーを備えることができ、エントリーは、各呼び出し側ソフトウェアモジュールについて、アプリケーション識別子等の呼び出し側ソフトウェアモジュールの識別子、その呼び出し側ソフトウェアモジュールに対して軽減モードを有効にするかどうかの判定で使用できる１つまたは複数の値、および有効にする場合に軽減が有効にされた時刻を含む。軽減モードを有効にすべきかどうかの判定で使用できる１つまたは複数の値は、任意の適切な値でよく、ソフトウェアモジュールが経験したエラーに関して、および／または呼び出し側ソフトウェアモジュールが関連付けられたアプリケーションの１つまたは複数のインスタンスにわたる軽減活動の成功の検出に関して収集されることが可能な１つまたは複数の統計値が含まれる。それらの統計値は適切な形態をとることができる。一部の実装では、統計値は、成功が検出されると増分され、エラーが検出されると減分されることが可能な軽減チケット値の形をとることができる。そして、軽減チケット値を閾値等の他の統計値と比較して、そのアプリケーションの後続インスタンスに軽減モードを有効にすべきかどうかを判定することができる。ただし、統計値は、規則および設定２１８に格納することが可能な値の種類の一例に過ぎず、軽減チケット値は、格納することが可能な統計値の種類の一例に過ぎないことを理解されたい。
【００５５】
[0069]軽減有効化モジュール１１４は、その情報を適当な方式で検討して、下記の例示的技術等により、特定のソフトウェアモジュールに対して軽減モードを有効にするかどうかを決定することができる。
【００５６】
[0070]特定のソフトウェアモジュールに対して軽減モードを有効にするかどうかを判定する例示的技術を説明する文脈を提供するために、軽減モジュール１１２が軽減モードで動作するための例示的技術を初めに説明する。上記で概説した例および下記でより具体的に説明する例を含む軽減活動は、任意の適当な方式で行うことができ、それらの軽減活動を実施する軽減モードは、任意の適当な方式で行われてよい。図３に、メモリー管理モジュールを選択的に軽減モードで稼動させる本発明の実施形態によって実装できる、軽減モジュール１１２が軽減モードで動作する方式の一例を示すが、メモリー管理モジュールは、本明細書に記載の原理に従う適当な方式で実装してよいため、異なる２つのモードで動作させないことを含めて、他の方式が可能である。
【００５７】
[0071]図３の例示的プロセス３００はブロック３０２で開始し、呼び出し側ソフトウェアモジュールが、メモリー操作をメモリー管理モジュール１１０に行わせる要求を発行する。ブロック３０４で、要求を発行した特定の呼び出し側ソフトウェアモジュールについて、メモリー管理モジュール１１０が軽減モードで動作して１つまたは複数の軽減活動を行うべきかどうかが判定される（下記の一部の事例では、説明を簡潔にするために、これは、ソフトウェアモジュールが軽減モードで動作するかどうか、と記載する場合があるが、これは純粋に説明を容易にするために行われるものであり、好ましくは、ソフトウェアモジュールは軽減モジュールおよび軽減モジュールが動作しているモードを認識しないことを理解されたい）。メモリー管理モジュール１１０が軽減モードで動作すべきと判定された場合は、軽減モジュール１１２が有効にされ、メモリー操作を行う要求をブロック３０６で受け取る。
【００５８】
[0072]ブロック３０６で要求を受け取ると、軽減モジュール１１２およびメモリー管理モジュール１１０は、軽減活動に従ってメモリー操作を行うことができる。一部の実装では、これは、単一の活動の実施、または多数の活動の実施を含むことができる。図３の図示では、分かりやすいように、軽減活動に従ったメモリー操作の実施を４つの別個の動作として示すが、これは単に視覚化の容易のためであり、図３に従って動作する技術は図示の通りに実装されない場合もあることを理解されたい。
【００５９】
[0073]ブロック３０８で、軽減モジュール１１２は、少なくとも要求されたメモリー操作の種類およびその操作の入力パラメーターに基づいて、自身が軽減活動を行うように適合されているかどうかを判定する。これを行うことができるのは、一部の実装では、軽減モジュール１１２は、１つまたは複数のメモリー操作のセットから生じる１つまたは複数の種類のメモリーエラーだけを軽減するように構成することができ、そのため、特定のメモリー操作について行うことができる軽減活動を持たない場合もあるためである。一部の代替実装では、全種類のメモリー操作について軽減活動を行うように適合されたメモリー管理モジュール１１２を実装することもでき、したがって、判定ブロック３０８のあるプロセスを実装しない場合もある。
【００６０】
[0074]ブロック３０８で利用可能な軽減活動が少なくとも１つあると判定された場合は、ブロック３１０でその軽減活動が行われ、これは軽減活動を当該操作に適用することを含むことができる。メモリー操作への軽減活動の適用は、下記で詳細に述べる手順を含めて、任意の適切な手順を備えてよい。例えば、軽減活動の適用は、操作の入力パラメーターが正しいかどうかを判定する等のメモリー操作の評価、要求されたメモリー量を増やす等のメモリー操作のパラメーターの調整、後の時までメモリー操作を行うのを待つ、またはメモリー操作を行わないことを含むことができる。軽減活動が適用された後に、ブロック３１２で、そのメモリー操作をなお行うべきかどうかが判定される。行う場合は、ブロック３１４で軽減が適用された操作が行われ、プロセス３００が終了する。一方、ブロック３１２でメモリー操作を行うべきでないと判定された場合、例えば軽減活動がメモリー操作を行っていない場合や、入力パラメーターが不正確と判定される場合も、プロセス３００は終了する。
【００６１】
[0075]ブロック３０４に戻り、メモリー管理モジュール１１０が軽減モードで動作すべきでないと判定された場合、またはブロック３０８で利用可能な軽減活動がないと判定される場合は、ブロック３１６で要求通りにメモリー操作が行われ、プロセス３００が終了する。ブロック３１６の実行は、従来のメモリーマネージャーで行われるような実行でよいが、適切な実行方法が使用されてよい。
【００６２】
[0076]図４Ａ、４Ｂ、４Ｃおよび４Ｄに、図３のブロック３１０等で、少なくとも１種類の軽減活動を行うために軽減モジュール１１２によって試みられることが可能な４つの異なるプロセスを示す。これらのプロセスは、そのような軽減活動を実行するために実装可能なプロセスの種類の例示に過ぎず、さらに、それらの軽減活動は、軽減モジュール１１２で実施することが可能な軽減活動の種類を例示するに過ぎないことを理解されたい。
【００６３】
[0077]そのような軽減活動の第１の例を図４Ａのプロセス４００Ａに示す。プロセス４００Ａはブロック４０２で開始し、呼び出し側ソフトウェアモジュールによって要求されるメモリー操作が割り当て動作、すなわち、呼び出し側ソフトウェアモジュールがある量のデータをある期間格納できるように自身にいくらかの量のメモリーを割り当てる要求であるかどうかが判定される。そのような要求でない場合、プロセス４００Ａは終了する。一方、要求されたメモリー操作がある量のメモリーの割り当て動作である場合は、ブロック４０４で、割り当てメモリーの量を増やす軽減活動が行われる。一部の実装では、この増加されたメモリー量は、要求されるメモリーのサイズに依存することができ、例えば要求メモリーの２倍とすることができる。別の実装では、追加メモリーは、所与のコンピューティングデバイスに対して固定量のメモリーであってよく、例えば、３２ビットプロセッサーの場合は、追加割り当てメモリーは３２バイト（すなわち４バイトが要求された場合、合計割り当て量は３６バイト）、６４ビットプロセッサーの場合は、追加割り当てメモリーは４８バイトとすることができる。任意の適切な量の追加メモリーをブロック４０４で割り当ててよい。
【００６４】
[0078]次いで、ブロック４０６で、マーカー値を追加メモリーに格納することにより、追加メモリーが追加メモリーとして「マーク」される。マーカー値は任意の適切な値でよく、メモリーブロック単位等のメモリー単位ごとに格納される、繰り返される値か、または、割り当てられた追加メモリーの全空間にわたって書き込まれる単一の値もしくは値のパターンであってよい。このマーカー値は、下記のように、メモリーエラーの軽減に軽減活動が成功したかどうかを判定する評価の一部として使用できる任意の適切な値でよい。例えば、追加メモリーが後に再調査され、マーカー値が上書きされたと判定された場合は、ソフトウェアモジュールが、バッファオーバーランエラーを生じさせたプログラミングバグの影響を受けている（つまり要求されたよりも多くの量のデータが書き込まれ）、追加の割り当てで余分の空間を割り当てることによってメモリーエラーが軽減されたと判定することができる。マーカー値が書き込まれると、プロセス４００Ａは終了する。
【００６５】
[0079]図４Ｂに、本明細書に記載の原理の一部に従って軽減活動を実行する第２の例示的プロセス４００Ｂを示す。プロセス４００Ｂはブロック４１０で開始し、要求されるメモリー操作が、呼び出し側ソフトウェアモジュールが以前に割り当てられたある量のメモリーを増加または減少することを求める再割り当て操作であるかどうかが判定される。再割り当て操作でない場合は、プロセス４００Ｂは終了する。
【００６６】
[0080]一方、メモリー操作が再割り当て操作である場合は、ブロック４１２で、要求がメモリー割り当て量の減少であるかどうかが判定される。メモリー割り当て量の減少である場合は、ブロック４１４で、元の割り当ての残りのメモリーの割り当てが解除される時に、割り当てが同じルート位置に保たれる。ブロック４１６で、メモリー管理モジュール１１０は、残りのメモリーを直ちには解放せず、待ち時間の後まで待機する。ブロック４１４で、上記のようなマーカーが解放されるメモリーに付加されることができる。メモリーが実際に解放される時に、それらのマーカーを調べて、使用されなかったはずのメモリーがアクセスされたかどうかを確認することができる。そしてプロセス４００Ｂは終了する。
【００６７】
[0081]ブロック４１２で要求される再割り当てがメモリー量の増加であると判定された場合は、ブロック４１８で、元の割り当てのすぐ隣に十分な空きメモリーがあって、すぐ隣のメモリーから要求の新しいメモリーを割り当てることができ、元の場所をデータのために保持しておくことができるかどうかが判定される。そうである場合は、ブロック４２０でそれが行われ、すなわち、元の割り当てにあるデータが同じ場所に保たれ、その場所から割り当てが拡大され、プロセスが終了する。
【００６８】
[0082]一方、すぐ隣に十分なメモリーがない場合は、ブロック４２２で割り当てがメモリーの別の部分のより大きな空間に移動され、ブロック４２４で、待ち時間の後まで元のメモリーの割り当てが解除されない。上記のように、以前割り当てられ、もはや使用すべきでないメモリーをマーカーで満たして、そのメモリーへのアクセスを発生させるバグを検出することができる。そしてプロセスは終了する。
【００６９】
[0083]この軽減を使用して、メモリー割り当てがメモリーの別の部分に移動された再割り当て操作の後に、ソフトウェアモジュールに元のメモリー空間を引き続き使用させるプログラミングバグの影響を受けるソフトウェアモジュール中のメモリーエラーを軽減することができる。メモリー割り当てを同じ場所に保持することを試み、待ち時間後まで他のソフトウェアモジュールにメモリーブロックを使用させないことにより、ソフトウェアモジュールは待ち時間が満了するまで元の割り当てを使用することができるので、そのようなプログラミングバグの影響を軽減することができる。
【００７０】
[0084]図４Ｃに別の例示的プロセス４００Ｃを示す。プロセス４００Ｃはブロック４３０で開始し、要求される操作が割り当て解除、すなわち「解放」操作であるかどうかが判定される。そうでない場合プロセス４００Ｃは終了する。
【００７１】
[0085]一方、要求されるメモリー操作が解放操作である場合は、ブロック４３２で、解放操作の入力パラメーターが正しいかどうかが判定される。例えば、メモリー管理モジュール１１０がヒープメモリーの割り当てを管理するモジュールである場合は、ブロック４３２で、解放が要求されるメモリーのアドレスが、スタックメモリーまたはグローバル変数空間のアドレスではなく、適正に割り当てられたヒープメモリーであるかどうかが判定されることができる。この判定は、任意の適当な方式で行うことができる。
【００７２】
[0086]例えば、軽減モジュール１１２は、アドレスをヒープのアドレス範囲と比較することにより、「解放」操作の入力アドレスで参照されるメモリーがヒープメモリーであるかどうかを判定することができる。ヒープメモリーでない場合は、入力アドレスが誤っている可能性がある。別の例として、メモリーマネージャーは、ヒープ内にメモリーブロックを割り当てると、そのブロックをマーカーで標識付けすることができる。軽減モジュール１１２が図４Ａのプロセス４００Ａを実施するように実装された場合は、適正に割り当てられたヒープメモリーであれば、追加メモリーにマーカー値を格納しているはずである。そのようなマーカー値が存在するかどうかを調べることにより、軽減モジュール１１２は、メモリー管理モジュール１１０によってメモリーが適正に割り当てられ、したがって入力パラメーターが正しいと判断することができる。ブロック４３２でいずれかの形でパラメーターが正しいと判定された場合は、ブロック４３４で、要求される解放操作を待ち時間後に行うことができ、プロセス４００Ｃが終了する。上記のように、軽減モードでは、「解放」メモリーは、直ちには使用可能状態にしないことができる。むしろメモリーはマーカー値で満たして、そのメモリーへの想定外のアクセスの検出を可能にすることができる。一方、パラメーターが正しくない場合は、ブロック４３６で、その操作が無視されるか、またはエラーメッセージが生成され、呼び出し側ソフトウェアモジュールに送り返されることができ、そしてプロセスが終了する。操作を無視する時は、軽減がバグによるエラーの発生を阻止するのに成功した旨の指示を格納することができる。そのような格納された指示は、下記のように使用されて、呼び出し側ソフトウェアモジュールに軽減４００Ｃを適用し続けるかどうかを判定することができる。
【００７３】
[0087]図４Ｄに、１つまたは複数の軽減活動を実施するために軽減モジュール１１２によって実装することが可能なプロセスの今１つの例を示す。図４Ｄのプロセス４００Ｄでは、初めにブロック４４０で、要求されるメモリー操作が割り当て解除、すなわち「解放」操作であるかどうかが判定される。解放操作でない場合は、プロセス４００Ｄは終了する。一方、要求されるメモリー操作が解放操作である場合は、ブロック４４２で、解放操作が「二重解放」であるかどうかが判定される。すなわち、その解放操作が、呼び出し側ソフトウェアモジュール中のプログラミングバグによる以前の解放操作の繰り返しであるかどうかが判定される。この判定は、例えばまだ前回の要求の待ち時間内にあるために、解放が要求されるメモリーがまだ行われていないかどうかを判定する等、適当な方式で行うことができる。この待ち時間内にあるメモリーは、上記のようにマーカー値を保持していることにより、または「解放済み」のメモリーブロックのレコードを格納していることにより、または他の適当な方式で識別することができる。
【００７４】
[0088]繰り返しの場合は、ブロック４４４で操作が無視される。繰り返しでない場合は、呼び出し側ソフトウェアは終了時に割り当てメモリーのクリーンアップを試みることから、ブロック４４６で、その解放操作が呼び出し側ソフトウェアモジュールの終了に関連するかどうかが判定される。これは任意の適当な方式で行うことができる。終了に関連する場合は、ブロック４４４で、要求が無視され、行われない。これは２つの理由で行うことができる。第１に、調査により、ユーザーアプリケーション等の多くの呼び出し側ソフトウェアモジュールはシャットダウン時に不正確にメモリーを解放しており、その結果メモリーエラーの３０％はシャットダウン時に経験されていることが明らかになっている。第２に、多くのオペレーティングシステム１０８およびメモリー管理モジュール１１０は、呼び出し側ソフトウェアモジュールの終了時に自動的な解放操作をすでに備えており、そのため、呼び出し側ソフトウェアモジュールによってなされる解放操作要求は、繰り返しとみなすことができる。ブロック４４２または４４６いずれかの決定の結果ブロック４４４で動作が無視された場合は、プロセス４００Ｄは終了する。
【００７５】
[0089]一方、ブロック４４６で要求されるメモリー操作が解放または終了操作でないと判定された場合は、ブロック４４８で待ち時間の後に解放操作が行われる。これは、プログラミングバグのために呼び出し側ソフトウェアモジュールがメモリーを解放し、解放後もメモリーを使用し続ける場合に発生し得るメモリーエラーを防止するために行うことができる。待ち時間後まで解放操作を行わないことにより、メモリーが解放後直ちに別のソフトウェアモジュールに再割り当てされる（その場合、元のソフトウェアモジュールと新しいソフトウェアモジュールの両方がそのメモリーを使用し、それぞれが他方によって保存されたデータを上書きする可能性がある）ことから生じ得るメモリーエラーの影響を軽減することができる。待ち時間後にメモリー操作が行われると、プロセス４００Ｄが終了する。
【００７６】
[0090]待ち時間後の解放操作の実施は、任意の適当な方式で行うことができる。例えば、待ち時間は、数秒間等の設定された時間であってよい。待ち時間は、柔軟性のある時間であってもよく、要求される割り当ておよび解放操作の数に基づく時間、メモリー需要が低い時はより長く、メモリー需要が高い時は短い時間等とすることができる。別の可能な実装は、アプリケーションが終了するまで待ち、プロセスが終了する時に、そのプロセス内で使用されたメモリーの割り当てを解除するオペレーティングシステムの部分によって、メモリーが実際に解放されるものである。そのようにすると、アプリケーションが終了し、そのアプリケーションが実行されていたプロセスも終了し、最後にメモリーが解放されることができる。他の実装では、待ち時間は、まったく設定された時間でなくてよく、解放操作を待ち行列に入れて待ち行列の先頭に達した時に実行される結果生じる不確定の時間であってよい。そのような実装の一例を図５に示すが、他の実装が可能であることを理解されたい。
【００７７】
[0091]図５のプロセス５００はブロック５０２で開始し、解放メモリーキャッシュのサイズが決定される。これは、全メモリー空間に対する比率を選択する、またはコンピューティングデバイスのユーザーもしくは管理者から入力を受け付ける等、任意の適当な方式で判定することができる。例えば、解放メモリーキャッシュは、８メガバイト（８ＭＢ）であり得る。ブロック５０６で、軽減モジュール１１２が、解放操作を行う要求を受け取る。ブロック５０８で、解放が要求されるメモリーがキャッシュに追加され、すなわち、解放操作のメモリーの量が合計キャッシュに加えられる。メモリーがキャッシュに加えられると、行われる操作の指示もプロセス待ち行列に加えられ、操作が要求されたことを指示する。メモリーが「キャッシュ」にある間は、メモリーは呼び出し側ソフトウェアモジュールに割り当てられたものとして維持されることを理解されたい。何故ならば、この実装では、キャッシュは、解放が要求されているがまだ解放されていないメモリーの量の標識として維持されるためである。
【００７８】
[0092]キャッシュにメモリーを加えた後に、ブロック５１０で、まだ解放されていないメモリーの量がキャッシュのサイズに達した、または超えたかどうかが判定される。まだ達していない場合は、プロセス５００はブロック５０６に戻り、別のメモリー解放命令を受け取る。キャッシュの制限に到達している、または超えている場合は、ブロック５１２で、少なくとも待ち行列の先頭にある操作が取り出され、実行されて、その遅延された最も古い解放操作に関連付けられたメモリーを解放し、キャッシュに割り当てられたメモリーのサイズを制限以下に下げる。状況によっては、キャッシュのサイズを再び制限以下に戻すために待ち行列にある２つ以上の操作を実行する必要がある場合もあるが、原理は図５に示すものと同じであることを理解されたい。待ち行列中の１番目の操作が実行され、待ち行列から削除されると、プロセス５００の流れはブロック５０６に戻り、解放操作を行う別の命令が受け取られる。
【００７９】
[0093]上記では、軽減モジュール１１２が１つまたは複数の軽減活動を使用してメモリーエラーがソフトウェアモジュールに負の影響を与える可能性を低減する軽減モードを有する、メモリー管理モジュール１１０のいくつかの例示的実装を説明している。上記のように、それらの軽減は、軽減が各アプリケーション中のエラーを減らす見込みがあるかどうかに基づいて、アプリケーション単位で選択的に適用することができる。軽減モードを選択的に有効にし、軽減活動の有効性を評価するための軽減有効化モジュール１１４の例示的実装を説明することができる。ただし、本発明の実施形態はこの点で限定されないため、軽減有効化モジュール１１４は、軽減モジュール１１２のコンポーネントとして等、任意の適当な方式で実装できることを理解されたい。
【００８０】
[0094]図６に、本明細書に記載の原理によるそのような例示的実装の１つを示す。図６のプロセス６００はブロック６０２で開始し、呼び出し側ソフトウェアモジュールにエラーが経験されたことを軽減有効化モジュール１１４が検出する。この検出は、ソフトウェアモジュールがクラッシュまたは他の形で不適正に実行されたことを検出することによって等、任意の適当な方式で行われてよい。ブロック６０４で、エラーに関連付けられたエラーコードが読み出され、ブロック６０６でそれがメモリーエラーであったかどうかが判定される。メモリーエラーでなかった場合は、プロセス６００は終了する。
【００８１】
[0095]一方、メモリーエラーであった場合は、プロセス６００はブロック６０８に進み、データストア２１２の規則および設定のレコード２１８にエントリーを作成または編集する等により、その特定の呼び出し側ソフトウェアモジュールに対して軽減モードが有効化され、エラーイベントに関する情報がイベントログ２１６に書き込まれる。一部の実装では、軽減モードは、メモリーエラーが最初に検出された時に有効にすることができ、一方、代替の実装では、閾値回数のメモリーエラー、または１時間に４回等の一定時間枠内の閾値回数に達しないと、軽減モードが適用されない。本明細書に記載の原理に従って軽減モードを開始するための任意の適切な検査を実装することができる。
【００８２】
[0096]ソフトウェアモジュールによって操作が要求され、メモリー管理モジュールの軽減モジュール１１４によって行われるのに伴い、ブロック６１０で、軽減有効化モジュール１１４が時間の経過に伴う軽減活動の成功を追跡する。成功の追跡は、本明細書に記載の技術のうちのいずれかによってなど、任意の適当な方式で行うことができる。一部の実装では、これは、ソフトウェアモジュールに経験されたエラーの検出、および／またはメモリーエラーがソフトウェアモジュールに負の影響を与えるのを防止することにおける軽減活動の成功の検出についての統計の集計を含むことができる。そのような統計は、あるアプリケーションに関連するソフトウェアモジュールの特定インスタンスについて集計しても、または１つのソフトウェアモジュールの複数のインスタンスにわたり時間の経過と共に収集してもよい。一部の実装では、統計は、軽減チケット値、または、成功と、軽減が成功せずにアプリケーションが実行されたインスタンスの両方を追跡できる他の機構を含むことができる。具体例として、軽減チケット値は、軽減活動が成功したと検出されると増分され、軽減が成功せずにアプリケーションが終了した時に減分されることができる。成功した軽減がない終了は、アプリケーションからの「クリーン」終了時のみに判定されることができる。ただし、エラーまたはクラッシュのどちらかがソフトウェアモジュールに影響したことが検出される場合や、アプリケーションの特定インスタンスについて成功した軽減がなかった場合等、成功した軽減がないことについては他の基準が適用されてよい。
【００８３】
[0097]ブロック６１２で、ブロック６１０の追跡の間に収集された情報が使用されて、軽減活動がエラーの軽減に成功したかどうかを判定する。軽減チケット値等の統計値を使用する実装では、この判定は、軽減チケット値が特定の閾値を上回るかどうかを判定することによって等、統計値が、成功数が特定の閾値レベルを上回る、またはエラー数が特定の閾値レベル未満であると示すかどうかの判定を含むことができるが、任意の適当な方式で行われてよい。軽減活動がエラー軽減に成功した場合は、ブロック６１４で、そのソフトウェアモジュールに軽減モードが維持されるが、軽減活動が成功しなかった場合は、ブロック６１６でソフトウェアモジュールについて軽減モードが無効にされる。ブロック６１４または６１６の後、プロセス６００は終了する。
【００８４】
[0098]図６のプロセス６００は、本明細書に記載の原理に従って軽減有効化モジュール１１４によって実装することが可能な技術の種類の例示に過ぎず、他のプロセスが可能であることを理解されたい。例えば、図６ではエラーの検出およびエラーコードの評価は、軽減有効化モジュール１１４の担当として図示するが、いくつかの代替実装では、それらの機能は、Ｍｉｃｒｏｓｏｆｔ  ＷｉｎｄｏｗｓオペレーティングシステムのＷｉｎｄｏｗｓ診断インフラストラクチャ（ＷＤＩ）モジュール等の、オペレーティングシステム１０８の別のモジュールによって行うことができ、軽減有効化モジュール１１４は、ＷＤＩモジュールを監視して、メモリーエラーが検出された時にその旨を判定する、またはメモリーエラーが検出された時にＷＤＩモジュールから通知されることができる。
【００８５】
[0099]さらに、軽減モードは、軽減活動がエラーの軽減に成功したかどうかに関するブロック６１２での判定に基づいて有効または無効にされるものとして記載されている。一部の実装では、軽減有効化モジュール１１４は、それに加えて、またはそれに代えて、時間や、メモリー操作が軽減モードで行われているソフトウェアモジュールの数等、他の要因に基づいて軽減モードを有効／無効にしてもよい。例えば、一実装では、ソフトウェアモジュールの動作は、１週間等の一定期間のみ軽減モードで行い、その後通常の（非軽減）モードに戻ることができる。
【００８６】
[0100]別の例示的実装では、軽減有効化モジュール１１４は、システム資源を節減するために、一度に４つのみ等、所与の時間内に所定数のソフトウェアアプリケーションのみに軽減モードを有効にすることができる。最大数に達し、ブロック６０２〜６０６等で別のソフトウェアモジュールに軽減モードを有効にすべきと検出されると、最も早く軽減モードが有効にされたソフトウェアモジュールが軽減モードを無効にして、新しいソフトウェアモジュールが軽減モードを有効にできるようにする。
【００８７】
[0101]実装によっては、上記の各技術の組み合わせを使用することができ、軽減活動がエラーの軽減に成功していることを軽減有効化モジュール１１４が検出する限り、所定期間にわたりソフトウェアモジュールに軽減モードが有効な状態にしておかれるが、別のソフトウェアモジュールが軽減モードから利益を得られる可能性があると次に検出された時には、設定期間だけモードが有効にされ、その後無効にされる。
【００８８】
[0102]アプリケーションに経験されるメモリーエラー数の低減における軽減活動の成功の追跡は、任意の適当な方式で行うことができる。図７Ａおよび図７Ｂに、軽減活動の成功を検出するための２つの例示的技術のフローチャートを示すが、軽減することが望まれるメモリーエラーの種類、および軽減モジュール１１２が利用可能な軽減活動の種類に応じて、他の技術が可能であることを理解されたい。
【００８９】
[0103]図７Ａのプロセス７００Ａは、エラー軽減における軽減活動の成功をどのようにして追跡できるかに関するプロセス全体の一例である。この例では、図４の割り当てプロセス４００Ａが追跡される軽減活動である。プロセス７００Ａはブロック７０２で開始し、軽減有効化モジュール１１４が、何らかの理由でソフトウェアモジュールに軽減モードを有効にする。ブロック７０４で、その特定のソフトウェアモジュールに対する割り当て操作を行う要求が軽減モジュール１１２によって受け取られ、図４Ａのプロセス４００Ａに従って、要求より多いメモリーが割り当てられ、その追加メモリーにマーカー値が書き込まれる。
【００９０】
[0104]ブロック７０６で、軽減モジュール１１２が、ブロック７０４で割り当てられたメモリーの解放操作を行う要求を受け取る。上記のように、この解放操作は遅らせることができる。しかし、その解放操作がブロック７０８で実施される時に、ブロック７０４で割り当てられた追加メモリーが書き込まれたマーカー値をまだ格納しているかどうかが判定される。追加メモリーがまだマーカー値を格納している場合は、ブロック７１０で、軽減有効化モジュール１１４は、そのインスタンスではメモリーエラーに対して軽減活動の効果がない旨の指示を、自身のイベントログ２１６等に格納することができる。一方、ブロック７０８で追加メモリーがマーカー値を格納していないと判定された場合は、ブロック７１２で、軽減有効化モジュール１１４は、エラーの軽減成功の指示をイベントログ２１６に格納することができる。この場合は、ソフトウェアモジュールが空間を要求した分のデータよりも多くのデータを書き込み、したがって、軽減モジュール１１２によりバッファオーバーランエラーの軽減に成功したことが成功裏に検出される。ブロック７１０または７１２いずれかで指示を格納した後、ブロック７１４でメモリーが解放され、解放は、図５に関連して説明した遅延解放プロセス５００によってなど、任意の方式で行ってよい。ブロック７１４でメモリーが解放されると、プロセスは終了する。
【００９１】
[0105]図７Ｂに、エラー軽減における軽減モジュールの成功を追跡する別の例示的技術７００Ｂを示し、この技術は、図５のプロセス５００等の遅延解放による軽減活動に従う。プロセス７００Ａと同様に、プロセス７００Ｂはブロック７２０で開始し、何らかの理由で軽減有効化モジュール１１４によって特定のソフトウェアモジュールに軽減モードが有効にされる。ブロック７２２で、軽減モジュール１１２は、その特定ソフトウェアモジュールに以前に割り当てられたメモリーの解放操作を行う要求を受け取る。ブロック７２４で、解放が求められるメモリーの内容についてチェックサムまたはハッシュ値が任意の適当な方式で計算され、ブロック７２６で、待ち時間の後まで解放操作の実行が遅らされる。ブロック７２８で、待ち時間の後、メモリーの内容についてチェックサムまたはハッシュ値が再度計算される。ブロック７３０で、ブロック７２４で計算された元のハッシュ値がブロック７２８の新しいハッシュ値と一致するかどうかが判定される。一致する場合は、ブロック７３２で、軽減有効化モジュール１１４は、そのインスタンスでは軽減活動がエラーの軽減に効果がなかった旨をそのイベントログ２１６に格納することができる。一方、ブロック７３０でハッシュ値が同じでないと判定された場合は、ブロック７３４で、軽減モジュール１１２がエラー軽減に成功した旨の指示が、軽減有効化モジュール１１４のイベントログ２１６に格納されることができる。これは、メモリーの内容が時間と共に変化したため、待ち時間の後まで解放を遅らせることで、ソフトウェアモジュールがメモリーの使用を終える前にメモリーを解放するプログラミングバグから生じた可能性のあるメモリーエラーの影響が軽減されたことを検出できるからである。ブロック７３２または７３４のいずれかの指示を格納した後、ブロック７３６でメモリーが解放され、プロセスが終了する。
【００９２】
[0106]プロセス７００Ａおよび７００Ｂで格納される軽減活動の有効性および無効性の指示は、任意の適当な方式で使用することができる。一部の実装では、その指示を使用して、アプリケーションに関連するソフトウェアモジュールに軽減活動が与える効果についての統計値を計算することができる。そのような統計値は、ソフトウェアアプリケーションの複数のインスタンスにわたって計算することができる。そのような統計値は、成功した軽減の頻度の算出を可能にする時間成分を含むことができる。実装によっては、時間成分は、何回かの成功した軽減が観察された期間の指示であってよい。ただし、時間成分は、呼び出し側ソフトウェアモジュールの呼び出し回数として計測してもよい。成功した軽減の頻度は、軽減を維持することで呼び出し側ソフトウェアモジュールへのバグの影響を回避できる見込みがあるかどうかについての予測変数とすることができ、それらの統計に基づいて、呼び出し側ソフトウェアモジュールの今後のインスタンスに軽減活動を実装するかどうかを決定することができる。
【００９３】
[0107]上記のように、一実装では、図２Ｃに示すような軽減チケット値を統計値として使用して、特定のソフトウェアモジュールに軽減モードを有効にすべきかどうかを判定することができる。この軽減チケット値は、任意の適切な値でよく、任意の適当な方式で初期化および調整することができる。図８に、呼び出し側ソフトウェアモジュールごとに軽減チケット値を使用して、軽減モードを管理するために使用できる技術の一例を示す。ここで例示する実施形態では、チケット値は、不揮発性メモリーに格納され、アプリケーションの複数のインスタンス、コンピューターの複数回のシャットダウン、または他のイベントにわたって継続することができる。
【００９４】
[0108]図８のプロセス８００はブロック８０２で開始し、軽減有効化モジュール１１４によってメモリーエラーが検出される。ブロック８０２の検出は、ソフトウェアモジュールの不適正な実行またはクラッシュを検出することによって等、任意の適当な方式で行われてよい。ブロック８０４でソフトウェアモジュールに軽減モードが有効にされ、ブロック８０６で軽減チケット値が特定の値に初期化される。この特定の値は適当な値でよく、特定のシステム上のすべてのソフトウェアモジュールに対して一定の値、機能やソース開発者等の適当な特性に基づいて特定のアプリケーション群に選択された値、特定のソフトウェアモジュールに選択された値、または他の適切な値であってよい。一部の実装では、下記のように、初期値は、対象アプリケーションについてのエラー軽減の成功に関する履歴データに基づくことができる。一例示的実装では、軽減チケット値は整数であってよく、ソフトウェアモジュールに対して軽減モードが有効にされる時、初期化された値は７とすることができる。
【００９５】
[0109]ブロック８０８で、軽減モジュール１１２が軽減モードでソフトウェアモジュールにメモリー操作を行い、モジュールの各実行等のソフトウェアモジュールの各インスタンス化について、軽減有効化モジュール１１４が、そのインスタンス化におけるエラー軽減の軽減モジュール１１２の成功を追跡する。成功の追跡は、図７Ａおよび図７Ｂに関連して上述した技術のうちのいずれかによってなど、任意の適当な方式で行ってよい。
【００９６】
[0110]ブロック８１０で、軽減有効化モジュール１１４がソフトウェアモジュールのインスタンスの終了を検出する。インスタンスの終了は、ユーザー主導またはプロセス主導の終了の結果生じた終了等の適正な終了である場合も、またはクラッシュの結果生じた不適正な終了である場合もある。ブロック８１０で、ソフトウェアモジュールのインスタンスの終了およびその終了の原因についての情報が、軽減データストア２１２のイベントログ２１６に格納されることができる。
【００９７】
[0111]ブロック８１２で、ブロック８０８および８１０で収集された情報が軽減有効化モジュール８１４によって使用されて、ソフトウェアモジュールの軽減チケット値を更新する。一部の実装では、軽減モジュール１１２がエラーの軽減に成功したことが検出された場合は、軽減チケット値を増分することができる。軽減モジュール１１２がエラーの軽減に成功しなかった場合は、軽減チケット値は減分することができる。他の実装では、これより多くの要因を使用することができる。表Ｉに、軽減チケット値を調整する方式を決定する際に使用できる要因の一例を示す。ただし、この他の要因も可能である。
【００９８】
【表１】
0005474982.tif 000002
【００９９】
[0112]表Ｉの例では、ソフトウェアモジュールのインスタンスの終了の種類と、軽減活動の成功両方についての情報を使用して、ソフトウェアモジュールの軽減チケット値を調整する方式を決定する。表Ｉで、インスタンスがクラッシュ等の不適正な実行で終了したと軽減有効化モジュール１１４が判定した場合は、成功した軽減があったかどうかに関係なく、軽減チケット値を減分することができる。これを行うことができるのは、クラッシュを阻止するのに十分なことを軽減モードの軽減活動で行わなかったことが明白であり、また、まだクラッシュがある場合には、メモリー管理モジュール１１０を軽減モードで動作させることによる効率の損失が軽減モードの利益を上回ると推測できるためである。ただし、チケット値に変更を行わない等、クラッシュに対する他の可能な反応が可能である。
【０１００】
[0113]一方、軽減有効化モジュール１１４が、インスタンスが適正な実行で終了してクリーン終了となったと検出した場合は、成功した軽減があったかどうかの判定がより重要になる。表Ｉの実装では、インスタンスがクリーンに終了し、成功した軽減が検出されなかった場合は、軽減チケット値は減分することができる。これを行うことができるのは、軽減活動で顕著な効果が得られることなくインスタンスが正常に動作している場合は、検出された利益が効率の損失を上回ることはないためである。一方、インスタンスがクリーンに終了し、成功した軽減がいくつか検出された場合は、成功した軽減が少なくとも部分的にインスタンスの正常な動作に寄与していると推測できるため、軽減チケット値は増分することができる。
【０１０１】
[0114]表Ｉの例では軽減チケット値は、各事例につき１だけ増分または減分されるが、他の実装では、事例ごとに異なる値等、事例ごとに任意の適切な値が使用されてよいことを理解されたい。また、チケット値に設定された上限があってもよい。
【０１０２】
[0115]ブロック８１２で任意の適切な技術を使用して軽減チケット値が更新されると、ブロック８１４で、ソフトウェアモジュールの軽減チケット値が閾値レベル未満であるかどうかが判定される。例えば、軽減チケット値が整数の場合は、軽減チケット値がゼロ（０）以下であるかどうかが判定されることができる。軽減チケット値が閾値未満でない場合は、プロセス８００は引き続きソフトウェアモジュールの次のインスタンスで軽減活動の成功を追跡する。一方、軽減チケット値が閾値レベル未満と判定された場合は、ソフトウェアモジュールの今後のインスタンスに対して軽減モードを無効にすることができ、プロセス８００が終了する。
【０１０３】
[0116]軽減チケット値を使用する本明細書に記載の原理の実装においては、値は、ソフトウェアモジュールのインスタンスの実行後だけでなく、任意の適切な時に調整することができる。例えば、一実装では、上記のように、１週間等のある期間にわたりソフトウェアモジュールに軽減モードを有効にすることができ、その後軽減モードは解除される。そのため、軽減チケット値を使用する実装では、その期間後に軽減チケット値は、ヌルにリセットする、またはゼロに減らす、または他の形でクリアすることができる。一部の実装では、場合によっては、一定期間に加えて、特定の時に一定数のソフトウェアモジュールのみが軽減モードで動作することを許され、別のソフトウェアモジュールが軽減モードに置かれると、第１のソフトウェアモジュールの軽減チケット値をクリアすることができる。また、図２Ｃに示す場合のようにデータ構造のサイズを恣意的に増大させるのを避けるために、アプリケーションについての情報をある期間後に完全に削除してもよい。
【０１０４】
[0117]プロセス８００で使用される軽減チケット値の初期値は、コンピューティングデバイス１００のユーザーおよび／または管理者からなど、任意の適切な供給元から受け取られることができる。本明細書に記載の原理の一部に従って動作する一部の実装では、初期値の供給元は、特定ソフトウェアモジュールのエラー軽減における軽減活動の成功についての情報を複数のコンピューティングデバイスから収集する集約サーバー等の、遠隔コンピューティングデバイスであってよい。そのような実装を図９〜図１１に示し、その実施形態により動作する技術を図１２〜図１３に示す。
【０１０５】
[0118]図９に、この実装によるコンピューティングデバイス９００の一実装を示す。上記で図１に関して述べたように、コンピューティングデバイス９００の図は、コンピューティングデバイス９００の構成要素の完全な図示でも、この実装によるコンピューティングデバイスを稼動させるために必要な構成要素の図示でもない。図９のコンピューティングデバイス９００は、上記の図１のコンピューティングデバイス１００といくつかの共通の構成要素を共有し、そのため、それらの共通構成要素は同じ参照符号で示し、ここではさらには説明しない。さらに、コンピューティングデバイス９００は、デスクトップまたはラップトップ型のパーソナルコンピューターを含む上記の適切なコンピューティングデバイスとして実装してもよいことを理解されたい。
【０１０６】
[0119]共通の構成要素に加えて、図９のコンピューティングデバイス１００は、オペレーティングシステム１０８のコンポーネントであるエラー報告クライアント９０２、ならびにネットワークアダプター９０４を備える。ネットワークアダプター９０４は、コンピューティングデバイス９００が適切なコンピューティングネットワークを通じて他の適切なコンピューティングデバイスと通信することを可能にする適切なハードウェアおよび／またはソフトウェアであってよい。コンピューティングネットワークは、インターネットを含む、２つ以上のコンピューター間でデータを交換するための適切な有線および／または無線通信媒体であってよい。一部の実装では、ネットワークアダプター９０４は、２つ以上の別個のネットワークアダプターとして実装することができ、２つ以上の種類のネットワークインタフェースを介した接続を提供する（例えばＥｔｈｅｒｎｅｔアダプター等の有線ネットワークアダプターと、ＩＥＥＥ８０２．１１ｇアダプター等の無線ネットワークアダプター）。エラー報告クライアント９０２は、コンピューティングデバイス９００で実行されるソフトウェアモジュールに関する情報、ならびにソフトウェアモジュールによって経験されたエラーおよび軽減モジュール１１２によってとられた成功した軽減活動についての情報を収集する、適切な機能モジュールであってよい。エラー報告クライアント９０２は、ネットワークアダプター９０４を使用してその情報を集約サーバーを含む適切な宛先に送信することができる。
【０１０７】
[0120]図１０に、コンピューティングデバイス９００が機能することが可能なコンピューターシステムの一例を示す。図１０は、コンピューティングデバイス９００が接続できる通信ネットワーク１０００を備えたコンピューターシステムを示す。通信ネットワーク１０００は、家庭ネットワーク、企業ネットワークのサブネット、インターネット、ならびに／または他のネットワーク等のより大きな有線ネットワークおよび／または無線ネットワークの一部を含む、任意の適切な有線ネットワークおよび／または無線ネットワークでよい。さらに、上記のように、コンピューティングデバイス９００は、デスクトップ型パーソナルコンピューターとして図示するが、任意の適切なコンピューティングデバイスであってよい。コンピューティングデバイス９００から、通信ネットワーク１１００を介してサーバー１１０２にアクセスすることができる。集約サーバーは、任意の適切な情報を収集するように構成された適切なサーバーデバイスとして実装することができ、コンピューティングデバイス９００ならびにコンピューティングデバイス１００６Ａおよび１００６Ｂを含む複数のコンピューティングデバイスで実行されるソフトウェアモジュールに関連するデータの中央リポジトリとして機能するエラー報告サーバーとしての実装が含まれる。エラー報告サーバー１１０２に格納されるデータは、関連付けられたデータストア１１０４への格納を含めて、任意の適当な方式で格納されることができる。下記でさらに詳細に述べるように、エラー報告サーバー１００２は、複数のコンピューティングデバイスのエラー報告クライアントから送信される情報を集約し、情報を評価し、コンピューティングデバイスに構成情報を提供するように適合することができる。そのようにして、コンピューティングデバイス９００は、他のコンピューティングデバイス１００６Ａおよび１００６Ｂの経験に基づいて構成することができ、その逆も同様である。エラー報告サーバー１００２から提供される構成情報は、アプリケーションの複数のインスタンスにわたって軽減活動の成功を計測するための構成統計を含む、任意の適当な情報であってよい。ローカルに収集される統計と同様に、成功に関する情報を時間成分と組み合わせて、将来の成功を予測するために使用できる軽減成功の頻度を得ることができる。そのような情報を使用して、軽減を適用するかどうか、および、適用する時間の長さを示す値を導出することができる。例えば、構成の統計は、軽減モードを無効にすべきと決定する前に検討すべきインスタンスの数の指示を含むことができる。一部の実装では、構成の統計は、特定アプリケーションについての軽減チケットの初期値を含むことができる。
【０１０８】
[0121]図１１は、図１０に示すコンピューターシステムの各種構成要素の対話の図である。図１１のシステムは、上記の図２Ｂのシステムと共通の構成要素を共有する。説明を簡潔にするために、それら共通の構成要素は同じ参照符号で示し、ここではさらに説明しない。図１１のシステムで、エラー報告クライアント９０２は、コンピューティングデバイス９００で実行されるソフトウェアモジュールの不適正な実行に関連する情報を収集する。エラー報告クライアント９０２は、ソフトウェアモジュールが不適正に実行されている、例えばクラッシュまたは他の形で不適正に終了したことを検出すると、ソフトウェアモジュールと軽減有効化モジュール１１４の両方からその不適正な実行に関連する情報を取得することができる。ソフトウェアモジュールに関連する情報は、任意の適当な情報でよく、不適正な実行に関連付けられたエラーコード、およびクラッシュ時のソフトウェアモジュールの実行についての状態情報を提供する「スタックダンプ」を含む。ソフトウェアモジュールからのこの情報に加えて、エラー報告クライアント９０２は、メモリーエラーについての情報、および、ソフトウェアモジュールが軽減モードで動作していた場合は軽減モジュール１１２によって検出された軽減の成功、ならびにそのソフトウェアモジュールの軽減チケット値を軽減有効化モジュール１１４から取得するように構成することもできる。その際、エラー報告クライアント９００は、不適正な実行時のソフトウェアモジュールの状態についての情報を従来のエラー報告クライアントよりも多く取得し、これまでに可能であったよりも多くの詳細な情報を集約サーバーに提供することができる。従来はエラーの報告はクラッシュがトリガーとなっていたが、他の適切なトリガーを使用してよく、それには、単に時間の経過をトリガーとして、クラッシュが発生しない場合でも格納された軽減情報をエラー報告サービスに転送できるようにすることが含まれる。
【０１０９】
[0122]エラー報告クライアント９０２は、次いでその詳細情報を、エラー報告データストア１００４に格納するためにエラー報告サーバー１００２に送信することができる。エラー報告データストア１００４の情報は、ソフトウェアモジュールの不適正な実行についてのクラッシュ情報１１０６、ならびに軽減の設定１１０８を含むことができる。軽減の設定１１０８は、軽減に関する任意の適切な情報、および／またはコンピューティングデバイス９００等のコンピューティングデバイスにおける軽減モードを調整するために使用できる成功の頻度情報を含む任意の適当な情報であってよい。そして、エラー報告サーバー１００２は、エラー報告クライアント９０２から送信された情報を、エラー報告データストア１１０４に格納された情報と共に処理し、応答として適切な構成情報を提供することができる。上記のように、構成情報は、提案される初期軽減チケット値等の任意の適切な情報であってよい。構成情報をエラー報告クライアントに提供するのに加えて、エラー報告サーバー１００２は、任意の適切な情報を他関係者に送信してよい。例えば、軽減活動の成功およびエラーの種類についての情報がメモリー管理モジュール１１０および／またはオペレーティングシステム１０８の開発者に送信され、メモリー管理モジュール１１０によって検出されたメモリーエラーについての情報がソフトウェアモジュールの開発者に送信されて、開発者がメモリーエラーの原因となったプログラミングバグを特定し、解決することを試みられるようにしてもよい。
【０１１０】
[0123]図１２および図１３に、本明細書に記載の原理の一部に従って動作するエラー報告サーバーを備えた実装のコンピューターシステムを稼動させるための例示的プロセスを示す。図１２および図１３の例では、エラー報告サーバーに送信される情報、およびエラー報告サーバーから受信される情報は、軽減チケット値を含むことができる。ただし、本発明の実施形態はこれらの点に関して限定されないため、エラー報告サーバーを備えるすべての実装が、複数インスタンスにわたる軽減活動の成功を追跡する統計値を使用できるとは限らず、統計値を使用する一部の実装は軽減チケット値を使用しない場合もあることを理解されたい。
【０１１１】
[0124]図１２は、本明細書に記載の原理の一部によりコンピューティングデバイス９００を動作させて、エラー報告サーバー１００２との間で情報を交換し、サーバーから構成データを受け付ける一例示的プロセス１２００を示す。ただし、エラー報告サーバーを備える本明細書に記載の原理の実装は任意の適当な方式で動作してよく、それらの実装は、図１２に示す例示的プロセス１２００を用いて実装されることに限定されないことを理解されたい。
【０１１２】
[0125]例示的プロセス１２００はブロック１２０２で開始し、エラー報告クライアント９０２が、ユーザーがエラー報告を許可したかどうかを調べる。許可している場合は、エラー報告クライアントは、エラー報告サーバー１００２との接続を開き、ブロック１２０４で、サーバーに情報を送信してエラーおよび軽減の成功について報告する。ブロック１２０２および１２０４の動作は、ソフトウェアモジュールの不適正な実行を検出した後、または周期的な報告時等、任意の適切な時に実行されてよい。ブロック１２０４で送信される情報は、時間、および送信が行われる状況に応じて変化してよい。例えば、これらの動作がソフトウェアモジュールの不適正な実行の検出に応答して行われる場合は、情報は、そのソフトウェアモジュールに関連するエラーおよび軽減の成功についての情報を含むことができ、一方、動作が周期的な報告時に行われる場合は、情報は、前回の報告以後コンピューティングデバイス９００によって実行されたソフトウェアモジュールのすべてまたは一部に関連することができる。ブロック１２０６で、ブロック１２０４の送信に続き、エラー報告クライアント９０２がエラー報告サーバー１００２に構成データを要求し、ブロック１２０８で構成データを受信することができる。ブロック１２１０で、エラー報告クライアント９０２は、構成データを軽減有効化モジュール１１６に提供することができ、軽減有効化モジュールは、軽減データストア２１２の規則および設定データ２１８を更新することができる。データストア２１２を更新すると、軽減有効化モジュール１１４は、次いで規則および設定を適用して、コンピューティングデバイス９００で実行されるソフトウェアモジュールに軽減モードを選択的に有効化し、プロセスが終了する。規則および設定の適用は任意の適当な方式で行われてよい。例えば、構成データが初期軽減チケット値を含む場合は、ソフトウェアモジュールに軽減モードを有効にすると、軽減有効化モジュール１１４は、そのソフトウェアモジュールの軽減チケット値を、構成データに含まれる値に初期化することができる。
【０１１３】
[0126]図１３に、本明細書に記載の原理の一部によりエラー報告サーバー１００２を稼動させる例示的プロセス１３００を示す。プロセス１３００はブロック１３０２で開始し、エラー報告サーバー１００２が１つまたは複数のエラー報告クライアント９００／１００６Ａ／１００６Ｂとの接続を開く。ブロック１３０４で、エラー報告サーバー１００２は、クライアントから情報を受信し、その情報をデータストア１００４に集約する。ブロック１３０４で受信される情報は、ソフトウェアモジュールに経験され、エラー報告クライアントによって検出されたエラー、および軽減モジュール１１２によって行われ、検出された軽減活動の成功についての情報を含む、任意の適切な種類の情報であってよい。ブロック１３０６で、ブロック１３０４で受信された軽減成功データが、情報で報告された各ソフトウェアモジュールについての以前の軽減成功データと比較されて、軽減モードでソフトウェアモジュールを動作させることが全体として成功しているかどうかを判定する。例えば、この判定は、検出された不適正な実行の回数が、軽減されたエラーの数を上回っている、または実質的に上回っているかどうかを判定することを含むか、または他の適切な判定を含むことができる。
【０１１４】
[0127]ブロック１３０６のこの比較に基づいて、ブロック１３０８で、特定のソフトウェアモジュールについて軽減モードがメモリーエラーの軽減に成功しているかどうかについて判定が行われる。成功している場合は、ブロック１３１０で、エラー報告サーバー１３１０が、例えばそのソフトウェアモジュールには高い初期軽減チケット値を使用するようにクライアントに通知することにより、軽減モードを使用するようにクライアントに通知することができる。一方、ブロック１３０８で軽減モードが成功していないと判定された場合は、ブロック１３１２で、エラー報告サーバーは、例えば低い初期軽減チケット値を使用するようにクライアントに通知することにより、軽減モードの使用を制限するようにクライアントに通知する。ブロック１３１０または１３１２いずれかでのクライアントへの通知後、プロセス１３００は終了する。
【０１１５】
[0128]上記のように、一部の実装では、軽減有効化モジュール１１４は、ソフトウェアモジュールが閾値回数クラッシュするか、または、１時間に４回等、一定期間内に閾値回数クラッシュするまで、特定のソフトウェアモジュールに軽減モードを有効にしないことができる。ただし、コンピューティングデバイス９００が対話することができるエラー報告サーバー１００２を備える一部の実装では、ソフトウェアモジュールによる不適正な実行が検出されるたびに（そのような検出の初回を含む）、情報がエラー報告サーバーに送信されることができる。エラー報告サーバー１００２の記録が、ソフトウェアモジュールのエラーの軽減に軽減モードが成功していることを示す場合は、図１２および図１３との関連で述べたように、エラー報告サーバー１００２は、軽減モードを使用するように指示する構成情報をコンピューティングデバイス９０２に送信することができる。そのような実装では、その構成情報に応答して、軽減有効化モジュール１１４は、軽減有効化モジュールで維持されている閾値規則に関係なく、そのソフトウェアモジュールが次に実行されるとソフトウェアモジュールに対して軽減モードを有効にすることができる。
【０１１６】
[0129]以上、本発明の少なくとも１つの実施形態の数個の態様を説明したが、当業者には各種の改変、変更、および改良が容易に着想されるであろうことを理解されたい。
[0130]例えば、利用可能なすべての軽減が適用されるか、または軽減がまったく適用されないかの２つの動作モードについて記載している。実施形態によっては、利用可能な軽減のすべてではなく一部が適用される中間の選択肢が可能であり得ることを理解されたい。
【０１１７】
[0131]そのような改変、変更、および改良は、本開示の一部であることが意図され、本発明の主旨および範囲内にあることが意図される。したがって、前述の説明および図面は例に過ぎない。
【０１１８】
[0132]本発明の各種態様は、単独で、または組み合わせて、または前述の実施形態で具体的には述べない各種構成で用いることができ、したがって、その適用は、前述の説明で述べた、または図面に示した構成要素の詳細および構成に限定されない。例えば、１つの実施形態で説明した態様を、他の実施形態で説明した態様とどのような形で組み合わせてもよい。
【０１１９】
[0133]また、本発明は、方法として実施することができ、その例を上記で提供した。方法の一部として行われる動作は、適当な方式で順序付けてよい。したがって、例示的実施形態では順次行われる動作として示されていても、一部の動作を同時に行う等、例示した順序と異なる順序で動作が行われる実施形態を構築することができる。
【０１２０】
[0134]クレームにおけるクレーム要素を修飾する「第１」、「第２」、「第３」等の序数語の使用は、それ自体は、別の要素に対するあるクレーム要素の優先性、優位性、または序列を意味するものでも、方法の動作が行われる時間的順序を意味するものでもなく、単に、ある名前を有する１つのクレーム要素を（序数語の使用を除いて）同じ名前の別の要素から区別して、それらのクレーム要素を区別する標識として使用される。
【０１２１】
[0135]また、本明細書で使用される表現および用語は、説明を目的とするものであり、限定的とみなすべきでない。本明細書の「〜を含む」、「〜を備える」、「〜を有する」、「〜を包含する」、「〜を伴う」、およびそれらの変化形の使用は、その後に列挙される項目およびそれらの同等語句、ならびに追加的な項目を包含するものとする。
【図１】
0005474982.tif 000003
【図２Ａ】
0005474982.tif 000004
【図２Ｂ】
0005474982.tif 000005
【図２Ｃ】
0005474982.tif 000006
【図３】
0005474982.tif 000007
【図４Ａ】
0005474982.tif 000008
【図４Ｂ】
0005474982.tif 000009
【図４Ｃ】
0005474982.tif 000010
【図４Ｄ】
0005474982.tif 000011
【図５】
0005474982.tif 000012
【図６】
0005474982.tif 000013
【図７Ａ】
0005474982.tif 000014
【図７Ｂ】
0005474982.tif 000015
【図８】
0005474982.tif 000016
【図９】
0005474982.tif 000017
【図１０】
0005474982.tif 000018
【図１１】
0005474982.tif 000019
【図１２】
0005474982.tif 000020
【図１３】
0005474982.tif 000021