(57)【要約】  マネージド実行環境におけるアプリケーション実行中のタイムアウトを回避する試みを、メモリ割当てを監視することで実装することができる。
2009512936.tif 000002
【特許請求の範囲】
【請求項１】
以下のステップを備える方法
マネージド実行環境（２００）内のアプリケーションの実行（４０５）中にメモリ割当てが閾値を超過したことの表示を受信するステップと（４１５）、および
前記アプリケーションの少なくとも一部の実行を分離境界に渡って再配分するステップ。（４３５）
【請求項２】
前記方法をロードバランサに従って実施することを特徴とする請求項１に記載の方法。
【請求項３】
前記の受信した表示が、予想される実行タイムアウトに対して準備するための通知を含むことを特徴とする請求項１に記載の方法。
【請求項４】
前記の受信した表示が、差し迫ったメモリヒープのスイープが実行タイムアウトを引き起こすと予想されるという通知を含むことを特徴とする請求項１に記載の方法。
【請求項５】
前記の受信した表示が、前記アプリケーションの実行と関連して状態のプレビューを含むことを特徴とする請求項１に記載の方法。
【請求項６】
前記の受信ステップが、アプリケーションプログラミングインタフェース（ＡＰＩ）のインスタンス化を前記マネージド実行環境に関連付けたメモリ管理コンポーネントから受信するステップをさらに含むことを特徴とする請求項１に記載の方法。
【請求項７】
前記の分離境界が、マシン境界、プロセス境界、スレッド境界、クラス境界、またはアセンブリ境界のうち任意の１つでありうることを特徴とする請求項１に記載の方法。
【請求項８】
前記の再配分ステップが、前記アプリケーションの少なくとも一部の実行を再配分するステップを含むことを特徴とする請求項１に記載の方法。
【請求項９】
前記の再配分ステップが、前記アプリケーションの少なくとも一部の実行要求を前記の分離境界に渡ってリダイレクトするステップを含むことを特徴とする請求項１に記載の方法。
【請求項１０】
前記の再配分ステップが、前記アプリケーションの一部の実行に対する要求を別のサーバにリダイレクトするステップを含むことを特徴とする請求項１に記載の方法。
【請求項１１】
読み出し時に１つまたは複数のプロセッサに対して以下を行う、１つまたは複数の実行可能命令を有する少なくとも１つのコンピュータ読取可能媒体
マネージドコードの実行（４０５）中にメモリ割当てを監視すること（４１０）、
前記のメモリ割当てが閾値を超過する時点を決定すること（４１５）、および
前記のメモリ割当てが前記の閾値を超過したことの通知を送信すること。（４２５）  
【請求項１２】
前記の１つまたは複数の実行可能な送信命令が、前記の１つまたは複数のプロセッサに前記の通知をロードバランサに対して送信させることを特徴とする請求項１１に記載の少なくとも１つのコンピュータ読取可能媒体。
【請求項１３】
前記の１つまたは複数の実行可能な送信命令が、前記の１つまたは複数のプロセッサにＡＰＩクラスをインスタンス化させることを特徴とする請求項１１に記載の少なくとも１つのコンピュータ読取可能媒体。
【請求項１４】
前記の通知が、差し迫ったオブジェクトの割当解除の実施がマネージドコードの実行をタイムアウトさせうるという表示を含むことを特徴とする請求項１１に記載の少なくとも１つのコンピュータ読取可能媒体。
【請求項１５】
前記の通知が、前記のマネージドコードの一部を実行する要求を分離境界に渡ってリダイレクトする命令を含むことを特徴とする請求項１１に記載の少なくとも１つのコンピュータ読取可能媒体。
【請求項１６】
前記の通知が、前記のマネージドコードの一部を実行する要求を、マシン境界、プロセス境界、スレッド境界、クラス境界、またはアセンブリ境界のうち任意の１つに渡ってリダイレクトする命令を含むことを特徴とする請求項１１に記載の少なくとも１つのコンピュータ読取可能媒体。
【請求項１７】
前記の通知が、前記のマネージドコードの一部を実行する要求を別のサーバにリダイレクトする命令を含むことを特徴とする請求項１１に記載の少なくとも１つのコンピュータ読取可能媒体。
【請求項１８】
以下を備えるシステム
マネージドコードの実行（４０５）中にメモリ割当てを監視（４１０）するマネージャ（２１０）と、
前記の監視した割当てが閾値を超過するときに通知を送信（４２５）するアドミニストレータ（２１５）と、および
前記通知により指示されて、実行用の前記のマネージドコードの一部を分離境界に渡って配分（４３０）するコンポーネント。（３１５）
【請求項１９】
前記の通知が、差し迫った前記メモリのスキャンがマネージドコードの実行をタイムアウトさせるであろうことを示すことを特徴とする請求項１８に記載のシステム。
【請求項２０】
前記の分離境界が、マシン境界、プロセス境界、スレッド境界、クラス境界、またはアセンブリ境界の１つであることを特徴とする請求項１８に記載のシステム。
【発明の詳細な説明】
【背景技術】
【０００１】
マネージド実行環境におけるメモリ管理は、メモリヒープのスイープまたはスキャン中にマネージドスレッドを一時中断することを含むことができる。しかしながら、マネージドスレッドを長期に渡って中断すると、対応するアプリケーションの実行がタイムアウトする可能性がある。
【発明の開示】
【０００２】
マネージド実行環境においてアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの部分を実行することは、少なくとも潜在的なメモリ管理の実装規模によって影響を受ける可能性がある。
【発明を実施するための最良の形態】
【０００３】
マネージド実行環境におけるロードバランシングを添付図面に従って説明する。
【０００４】
本明細書ではロードバランシングを説明する。より詳細には本説明は、アプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの少なくとも一部の或る特定の振る舞いを、それぞれの実行環境における潜在的なメモリ管理の実装規模に少なくとも関係するデータに基づいて制御することに関する。
【０００５】
この「発明を実施するための最良の形態」の文脈で、およびオブジェクト指向プログラミングに関連して、メソッドをオブジェクトが実施する処理と考えることができる。従って、例えば、メッセージをオブジェクトに送信するとそのメソッドが実装される。
【０００６】
本明細書で説明する「プロセス」は、アプリケーション、プログラム、関数、または他のプログラム可能コードおよび実行可能コードのアセンブリのモジュールまたはコードアセンブリを実際に実行することを指すことができる。
【０００７】
本明細書で説明する「アセンブリ」は、コードの展開単位を指すことができ、版管理可能であるかまたはできない。
【０００８】
本明細書で説明する「リソース」は、所与のコンピューティング環境に関連付けられる物理的および論理的なリソースの両方を含むことができる。非限定的な例として、上記のリソースの範囲はファイルからポート、共有状態に渡ることができる。即ち上記のリソースは、複数の実行可能エンティティが共有しうる任意の実行不能エンティティであることができる。
【０００９】
本明細書で説明する「スレッド」は、アプリケーション、プログラム、関数、または他のプログラム可能および実行可能なコードアセンブリ内部の実行パスを指すことができる。スレッドにより、実行可能命令モジュールの複数の実行パスまたは実行ストリームが同一のアプリケーション、プログラム、関数、または他のプログラム可能および実行可能なコードアセンブリ内部で並列に生ずることができ、それにより、それぞれのストリーム内部で、様々なトランザクションまたはメッセージを処理することができる。マルチタスキングまたはマルチプロセッシング環境の中でマルチスレッディングプロセスを実行することができる。マルチタスキングまたはマルチプロセッシング環境は、マネージド実行環境またはアンマネージド実行環境に見出すことができる。
【００１０】
本明細書で説明する「分離境界」は、分離の単位としての役割を果たす論理的または物理的な構成概念を指すことができる。プロセスは分離境界の例である。マネージド実行環境内部では、上記の分離境界をアプリケーションドメインと呼ぶことができる。アプリケーションドメインに複数の実行スレッドを含めることができる。上記の用語は例として与えたに過ぎない。即ち、本明細書で説明する実装例はアプリケーションドメインに限定されず、または上述のマネージド実行環境にも限定されず、むしろ他の実行環境内の様々な他の分離境界実行内部で適用することができる。より詳細には、本明細書で説明したリソース配分の範囲はさらにマシン境界、プロセス境界、スレッド、およびクラス境界またはアセンブリ境界に関連することができる。さらに詳細には、リソース配分の範囲はパブリック／プライベートな公開、アセンブリ、またはクラスに関連することができる。さらに、リソース配分は複数の軸またはアノテーションを有することができ、それらには例えばリソースタイプおよびリソースの可視性が含まれる。
【００１１】
分離境界により、その中で実行されるコードを特定の情報源からロードすることができる。分離境界は、他の上記分離境界と独立に停止することができ、その中で発生した障害がプロセス内部の他の分離境界に影響を及ぼさないように分離境界内部の処理を分離することができる。より詳細には、他の分離境界がリソースに対する変更を認識しないか、またはシリアライズされた原子的な方法でリソースを認識するかのいずれかである限り、分離境界はその中のリソースの消費を分離することができる。
【００１２】
図１は処理ノードを有するネットワーク環境の例１００を示す。処理ノードは、様々な個数および組合せで互いに通信して、１つまたは複数のロードバランシングの例を実装することができる。しかしながら、ロードバランシングの実装はネットワーク環境内のノードに限定されない。図１のネットワーク環境の例において、クライアント装置１０５、サーバ装置１１０Ａおよび１１０Ｂ、および「その他」装置１１５をネットワーク１２５経由で互いに通信可能に接続することができる。さらに、クライアント装置１０５、サーバ装置１１０Ａおよび１１０Ｂ、ならびに「その他」装置１１５の少なくとも１つは本明細書で説明するようにロードバランシング１２０を実装することができる。
【００１３】
クライアント装置１０５は多数の従来のコンピューティング装置のうち少なくとも１つであることができ、デスクトップパーソナルコンピュータ（ＰＣ）、ワークステーション、メインフレームコンピュータ、インターネット機器、およびセットトップボックスが含まれる。さらに、クライアント装置１０５は有線および／または無線リンクによりネットワーク１２５と関連付け可能な少なくとも１つの装置であることができ、携帯情報端末（ＰＤＡ）、ラップトップコンピュータ、携帯電話、等が含まれる。さらに、クライアント装置１０５は様々な個数および／または組合せでの上述のクライアント装置を表すことができる。「その他」装置１１５を、任意の上記例のクライアント装置１０５で具体化することもできる。
【００１４】
サーバ装置１１０Ａおよび１１０Ｂは任意の様々なデータおよび／または機能性を、ロードバランシング１２０の少なくとも１つの実装に従って、クライアント装置１０５または「その他」装置１１５に与えることができる。データは公に利用可能であるかまたはもう一つの選択しとしてデータを制限することができる。例えばデータを或る特定のユーザにのみ制限すること、または適切な受信料またはライセンス料を支払う場合にのみ制限することができる。サーバ装置１１０Ａおよび１１０Ｂのいずれかは、様々な個数および／または組合せでのネットワークサーバ、アプリケーションサーバ、またはブレードサーバであることができる。一般に、サーバ装置１１０Ａおよび１１０Ｂはコンテンツ源の役割を果たし、クライアント装置１０５は上記コンテンツをネットワーク１２５経由またはオフラインのいずれかで受信する。しかしながら、本明細書で説明する実装例によると、クライアント装置１０５ならびにサーバ装置１１０Ａおよび１１０Ｂは交互にネットワーク環境１００内でノードを送受信することができる。さらに、ロードバランシング１２０の少なくとも１つの例によると、サーバ装置１１０Ａおよび１１０Ｂをネットワーク１２５上の多数のサーバ装置の１つとして実装することができる。上記構成を非公式に「サーバファーム」と見なすことができる。上記のサーバファームでは、２つ以上のネットワークサーバは同一のアプリケーション、プログラム、関数、または他のプログラム可能および実行可能なコードアセンブリの少なくとも一部の実行を共有することができる。さらに、「その他」装置１１５を任意の上記例のサーバ装置１１０Ａおよび１１０Ｂにより具体化することもできる。
【００１５】
「その他」装置１１５は、本明細書で説明する１つまたは複数の例に従ってロードバランシング１２０を実装可能な任意の更なる装置であることができる。即ち、「その他」装置１１５は、少なくともマネージド実行環境においてアプリケーション、プログラム、関数、または他のプログラム可能および実行可能なコードアセンブリの少なくとも一部に対するロードバランシング１２０を実装可能な、ソフトウェア対応コンピューティング装置または処理装置であることができる。より詳細には、「その他」装置１１５はロードバランサの役割を果たすことができる。ロードバランサとして、「その他」装置１１５を、クライアント装置１０５またはサーバ装置１１０Ａおよび１１０Ｂのいずれかから物理的に独立したハードウェア装置として実装することができる。または、「その他」装置１１５を、クライアント装置１０５またはサーバ装置１１０Ａおよび１１０Ｂの少なくとも１つにおけるファームウェアまたはソフトウェアとして実装することができる。従って、「その他」装置１１５は、オペレーティングシステム、インタープリタ、コンバータ、コンパイラ、またはそれらの上に実装したランタイム実行環境の少なくとも１つを有するコンピューティング装置、処理装置、またはサーバ装置であることができる。これらの例は決して限定的であることを意図しておらず、従ってそのように解釈すべきではない。
【００１６】
ネットワーク１２５は任意の様々な従来のネットワークのトポロジおよび型を表すことができ、有線および／または無線ネットワークを含むことができる。ネットワーク１２５はさらに、パブリックおよび／または独自のプロトコルを含む任意の様々な従来のネットワークプロトコルを利用することができる。ネットワーク１２５は例えば、インターネットおよび、８０２．１１システムのような１つまたは複数のローカルエリアネットワーク（個々に「ＬＡＮ」とも呼ばれる）の少なくとも一部、Ｂｌｕｅｔｏｏｔｈのようなパーソナルエリアネットワーク（即ち「ＰＡＮ」）を含むことができる。
【００１７】
装置１０５、１１０Ａ、１１０Ｂ、および１１５の少なくとも１つにおけるコンピュータアーキテクチャは一般に、コンピューティングプラットフォームをハードウェアおよびソフトウェアの観点で定義している。コンピューティング装置に対するソフトウェアは、機能に基づいてグループに分類される。そのグループは、ハードウェア抽象化層（または「ＨＡＬ」と呼ばれる）、オペレーティングシステム（または「ＯＳ」と呼ばれる）、およびアプリケーションを含む。
【００１８】
ランタイム実行環境は分離空間を指すことができ、ＯＳとアプリケーションとの間に存在することができる。ランタイム実行環境においてアプリケーションは特定のタスクを、少なくとも１つの処理装置１０５、１つまたは複数のサーバ装置１１０Ａおよび１１０Ｂ、または他の装置１１５で実行することができる。より詳細にはランタイム実行環境は、サーバ、デスクトップコンピュータ、ラップトップコンピュータ、移動体処理装置、セットトップボックス、およびゲームコンソールを含む処理装置が拡大する範囲で、上記処理装置で実行中のアプリケーションに抽象化層およびサービスを与え、さらにアプリケーションにそのメモリ管理および構成を含む能力を与えることによりアプリケーション実行の信頬性を高めることを意図している。
【００１９】
ランタイム実行環境はアプリケーションプログラミングおよびアプリケーション実行プラットフォームのうち少なくとも１つとしての役割を果たすことができる。
【００２０】
アプリケーションプログラミングプラットフォームとして、ランタイム実行環境は、複数のコンピューティング言語の１つで書くことが可能なターゲットアプリケーションを中間言語（以降、「ＩＬ」）にコンパイルすることができる。ＩＬは一般にプラットフォームと独立であり、中央演算装置（以降、「ＣＰＵ」）がＩＬを実行する。実際、ＩＬは多数のＣＰＵのマシン語よりも高レベルである。
【００２１】
アプリケーション実行プラットフォームとして、ランタイム実行環境はＩＬを解釈してネイティブなマシン命令にコンパイルすることができる。ランタイム実行環境はインタープリタまたは「ジャストインタイム」（以降、「ＪＩＴ」）コンパイラのいずれかを利用して上記命令を実行することができる。または、ネイティブプラットフォーム実行形式ではなくＩＬ形式でランタイム実行環境に配布し、既にアセンブリ、メソッド、または型の任意の１つにコンパイルした中間言語のコード（即ち、「ＩＬ」）をランタイム実行環境は実行、読み出し、解釈、または分析することができる。上記ＩＬの情報源を、装置１０５、１１０、および１１５と同一または別個のものにおける非マネージド実行環境またはランタイム実行環境の別実装のいずれかにおいて処理することができる。情報源はＩＬを、ＩＬが対応するアプリケーション、プログラム、関数、または他のプログラム可能および実行可能なコードアセンブリのインストール時またはインストール前に展開することができる。
【００２２】
それと関係なく、ネイティブマシン命令を次いでＣＰＵにより直接実行することができる。ＩＬはＣＰＵ独立なので、そのＣＰＵプラットフォーム上で実行中のＯＳが適切なランタイム実行環境をホストする限り、ＩＬをＣＰＵプラットフォーム上で実行することができる。ロードバランシング１２０が関連しうるランタイム環境の例には、ＶｉｓｕａｌＢａｓｉｃランタイム環境、例えばＪａｖａ（登録商標）（Ｒ）のルーチンの実行に用いるＪａｖａ（登録商標）（Ｒ）仮想マシンランタイム環境、または例えばマイクロソフト．ＮＥＴTMアプリケーションをルーチン呼び出しの実行前にマシン語にコンパイルする共通言語ランタイム（ＣＬＲ）が含まれる。しかしながら上記のリストは例を与えるに過ぎない。実装例はこれらのマネージド実行環境にのみには限定されない。さらに、１つまたは複数の例をテスト環境および／またはアンマネージド実行環境内部で実装できるので、実装例はマネージド実行環境にのみは限定されない。
【００２３】
ＩＬにコンパイルされるアプリケーションを「マネージドコード」と呼ぶことができ、従ってランタイム実行環境を代替的に「マネージド実行環境」と称することができる。マネージドコードの一部を「マネージドイメージ」と呼ぶことができる。実行にランタイム実行環境を利用しないコードをネイティブコードアプリケーションと呼ぶことができる。
【００２４】
図２は、ロードバランシングの例１２０（図１を参照）を実装可能なランタイム実行環境の例２００を示す。
【００２５】
少なくとも１つの実装例によると、ランタイム実行環境２００は、コンピューティング装置プラットフォームに対してマネージドコードの実行を促進することができる。マネージドコードを、アプリケーション開発技術のコアセットの一部であると考えることができ、さらにランタイム実行環境２００での実行に対しコンパイルされて対応するサービスをそのコンピューティング装置プラットフォームに提供するコードと見なすことができる。加えて、ランタイム実行環境２００は解釈レベルにあるマネージドコードを、プロセッサがプロキシして次いで実行する命令に変換することができる。ランタイム実行環境２００に対するフレームワークはクラスライブラリを与えることもできる。そのクラスライブラリは、マネージドアプリケーションに対するソフトウェアビルディングブロックと見なすことができる。
【００２６】
さらなる実装例によるとランタイム実行環境２００は、カーネルから期待できる少なくとも部分的な機能性を与えることができる。カーネルは、装置１０５、１１０Ａ、１１０Ｂ、および１１５のうち任意の特定のものに対するリソース制限に依存して、コンピューティング装置プラットフォームを欠くことができるかまたは欠いてはならない。従って、ランタイム実行環境２００の少なくとも１つの例は、入出力（以降、「Ｉ／Ｏ」）ルーチン管理、メモリ管理、認証、およびサービスルーチン管理を実装することができる。従って、ランタイム実行環境２００はＩ／Ｏコンポーネント２０５、少なくとも１つのメモリマネージャ２１０、アドミニストレータ２１５、および実行コンポーネント２２０を含むことができる。これらのコンポーネントは、以下でさらに詳細に説明するが、例として与えるに過ぎない。即ち、その例は任意の特定の実装に限定されるとは意図しておらず、そのように推測するべきではない。さらにコンポーネントを、様々な組合せおよび構成でのランタイム実行環境２００の例で実装することができる。
【００２７】
ランタイム実行環境２００のＩ／Ｏコンポーネント２０５は、コンピューティング装置プラットフォームに関連付けたデータ源（即ち、プロセッサおよび周辺機器）に非同期にアクセスすることができる。図１に関して上述した１つまたは複数の装置１０５、１１０Ａ、１１０Ｂ、および１１５が上記データ源の例でありうる。より詳細には、Ｉ／Ｏコンポーネント２０５はランタイム実行環境２００に対して、堅牢なシステムスループット、およびＩ／Ｏ要求の発生元であるコードの更なるストリームラインの性能を与えることができる。
【００２８】
メモリマネージャ２１０は、「ガベージコレクタ」と見なされる、ランタイム実行環境２００内部のモジュールまたはランタイム実行環境２００に関連付けたモジュールを指すことができる。ガベージコレクション（または、以降で「ＧＣ」と称する）を、マネージドコード実行環境の堅牢な特徴と見なすことができる。「ＧＣ」により、オブジェクトがどのアプリケーションによっても使用されない場合、メモリヒープのスイープまたはスキャンの際にオブジェクトが解放（即ち、割り当て解除）される。メモリマネージャ２１０の少なくとも１つの例において、フリーメモリヒープのスイープを線形探索として実装することができる。上記の実装は、メモリサイズが制限され、対応する装置のユーザがスイープの完了の遅延を認識可能なコンピューティング装置プラットフォームの例に良く適している。
【００２９】
メモリマネージャ２１０の例は「並列ＧＣ」の機能性を実装することができ、それによりメモリヒープのスイープまたはスキャン中にマネージドスレッドは実行を継続することができる。即ち、割当解除中に、並列ＧＣにより割当てを並行して継続することができる。並列ＧＣの機能性（または本発明では「並列ＧＣ」と称する）は対話またはＧＵｌ（グラフィカルユーザインタフェース）ベースのアプリケーションに適している。
【００３０】
しかしながら、ロードバランシング１２０は並列ＧＣの機能性に関連できるが、ロードバランシング１２０の本実装例を非並列ＧＣの機能性のコンテクストで説明する。非並列ＧＣの機能性により、１つまたは複数のマネージドスレッドをメモリヒープのスイープまたはスキャン中に中断することができる。
【００３１】
メモリマネージャ２１０が実装する更なる機能は、一定の揮発性ＲＡＭの１つまたは複数の連続ブロック（即ち、メモリヒープ）の記憶あるいはコンピューティング装置プラットフォーム上で実行中のタスクの間で一連の連続メモリブロックを管理すること、コンピューティング装置プラットフォーム上で実行中の少なくとも１つのアプリケーションにメモリを割り当てること、少なくとも１つのアプリケーションによる要求に応じてメモリの少なくとも一部を解放すること、および任意のアプリケーションが、任意の他のアプリケーションに割り当てたメモリ空間に強制的にアクセスすることを防止すること、を含むことができる。
【００３２】
アドミニストレータ２１５は、アプリケーション、プログラム、メソッド、関数、または他のプログラム可能および実行可能なコードのアセンブリを少なくとも一部を受信してランタイム実行環境２００内で実行する役割を果たす、ランタイム実行環境２２０内部のモジュールまたはランタイム実行環境２２０に関連付けたモジュールを指すことができる。さらに、ロードバランシング１２０の少なくとも１つの実装例に従ってアドミニストレータ２１５はメモリマネージャ２１０と協調して、ランタイム実行環境２２０内部のアプリケーション、プログラム、メソッド、関数、または他のプログラム可能および実行可能なコードのアセンブリの振る舞いを、コンパイル時、初期実行時、またはそれ以降のアプリケーション実行中の任意の時点に制御することができる。
【００３３】
実行コンポーネント２２０は、コンピューティング装置プラットフォームに対するマネージドコード実行を可能とする役割を果たす、ランタイム実行環境２００内部のモジュールまたはランタイム実行環境２００に関連付けたモジュールを指すことができる。実行コンポーネント２２０を、アプリケーションのコード実行を実装する環境、およびランタイムサービス（例えば、装置アクセスおよびメモリ管理）を提供可能な環境と見なすことができる。
【００３４】
図３は、ロードバランシング１２０の実装例（図１を参照）に従うデータフローの例３００を示す。データフローの例３００は図１および図２の特徴を参照して記述してあるが、上記の実装は例として与えるに過ぎず、限定的に解釈するようには意図していない。
【００３５】
プロセス３０５Ａ、３０５Ｂ、および３０５Ｃを、上述の「分離境界」の説明に少なくとも従って、論理的または物理的な構成概念と見なすことができる。従って、プロセス３０５Ａ、３０５Ｂ、および３０５Ｃは、ロードバランシング１２０の様々な実装に従って、マシン境界、プロセス境界、スレッド、アプリケーションドメイン、およびクラス境界またはアセンブリ境界に関連することができる。さらに、ロードバランシング１２０の実装は３つの上記構成概念（即ち、３０５Ａ、３０５Ｂ、および３０５Ｃ）に決して限定されず、本明細書では説明の目的で図示および説明するに過ぎない。
【００３６】
例として、プロセス３０５Ａ、３０５Ｂ、および３０５Ｃは複数のサーバ（即ち、マシン境界）に関連することができる。ハードウェアとして実装すると、サーバ３０５Ａ、３０５Ｂ、および３０５Ｃは別個のハードウェア装置であることができ、それらの上で少なくとも１つのランタイム実行環境２００がアプリケーション実行プラットフォームとして実行されている。ソフトウェアサーバとして実装すると、プロセス３０５Ａ、３０５Ｂ、および３０５Ｃは、ランタイム実行環境２００の実装により実行されている共通アプリケーション、プログラム、メソッド、関数、またはプログラム可能および実行可能コードのアセンブリの、モジュール型コンポーネントであることができる。
【００３７】
メモリ管理データ３１０は、プロセス３０５Ａ、３０５Ｂ、および３０５Ｃの少なくとも１つから生じ、差し迫ったメモリヒープのスイープまたはスキャン（即ち、ＧＣ）を参照するデータを含み、ランタイム実行環境２００の実装が実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリが使用しない１つまたは複数のオブジェクトを解放（即ち、割当解除）することができる。
【００３８】
プロセス３０５Ａ、３０５Ｂ、および３０５Ｃを別個のハードウェア装置として実装する例では、メモリ管理データ３１０は、１つまたは複数の上記装置で実行されるランタイム実行環境２００の実装から生ずることができる。プロセス３０５Ａ、３０５Ｂ、および３０５Ｃを共通アプリケーション、プログラム、メソッド、関数、またはプログラム可能および実行可能なコードのアセンブリの、モジュール型コンポーネントとして実装する例では、メモリ管理データ３１０は、そのモジュール型コンポーネントが実行中のランタイム実行環境２００の実装から生ずることができる。より詳細には、上記の例ではメモリ管理データ３１０はメモリマネージャ２１０またはアドミニストレータモジュール２１５から単独または複合的に生ずることができる。
【００３９】
メモリ管理データ３１０は、様々なシステムアーキテクチャのアプリケーションプログラムインタフェース（ＡＰＩ）と互換性のある１つまたは複数のＡＰＩを用いてトランザクションを実装することができる。より詳細には、メモリ管理データ３１０に対応するＡＰＩは、ロードバランシング１２０の様々な実装に従って、プロセス３０５Ａ、３０５Ｂ、および３０５Ｃの間で（即ち、マシン境界、プロセス境界、スレッド、アプリケーションドメイン、およびクラス境界またはアセンブリ境界に渡って）ロードバランシングを開始することができる。本明細書で説明したように、ＡＰＩを、アプリケーション、プログラム、メソッド、関数、または他のプログラム可能および実行可能なコードのアセンブリが使用してランタイム実行環境２００またはオペレーティングシステムによりプロシージャの性能を制御する１つまたは複数のルーチンと見なすことができる。
【００４０】
メモリ管理データ３１０は、メモリマネージャ２１０またはアドミニストレータモジュール２１５が単独または複合的に実装する１つまたは複数のＡＰＩを含むことができる。以下で列挙および説明する上記ＡＰＩの命名法は説明の目的で与えたものであり、非限定的な例として与えたものである。
【００４１】
ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒは、そのインスタンス化の意図が、ランタイム実行環境２００の特定の実装が実行中の同一または別のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの少なくとも一部を再配分するようロードバランサ３１５に指示することでありうるクラスを指すことができる。より詳細には、メモリマネージャ２１０またはアドミニストレータ２１５が単独または複合的に、ランタイム実行環境２００上の差し迫ったＧＣがランタイム実行環境２００上の同一または別のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの実行をタイムアウトさせる程長く実行する可能性があることを検出するときに、ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒをインスタンス化することができる。上記の検出は、現在のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリを実行する間におけるメモリヒープの閾値量の割当てに基づくことができる。次いで効率的に、ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒのインスタンス化によりロードバランサにランタイム実行環境２００の状態を事前に通知することができる。
【００４２】
より詳細には、メモリマネージャ２１０またはアドミニストレータ２１５が単独または複合的に、差し迫ったＧＣが論理的または物理的な大きさだけ閾値を将来超過する可能性があると検出するときに、ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒをインスタンス化することができる。例えば、メモリマネージャ２１０またはアドミニストレータ２１５が単独または複合的に、差し迫ったＧＣが後世代のＧＣの実装であり、従って現在利用可能な処理能力下で許容される最大量（即ち、２ＧＢ）のヒープをスイープまたはスキャンする可能性があることを検出するときに、ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒをインスタンス化することができる。結果として、メモリヒープのスイープまたはスキャン中にマネージドスレッドが中断される可能性があるので、アプリケーション、プログラム、メソッド、関数、または他のコードアセンブリは後世代ＧＣの完了前にタイムアウトする可能性がある。従って上記規模のＧＣの開始前に、ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒをインスタンス化してロードバランサ３１５に対し、アプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの実行の少なくとも一部を再配布する必要性を少なくとも通知することができる。
【００４３】
勿論、上の２ＧＢのヒープは後世代のＧＣの例として説明したに過ぎない。ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒのインスタンス化に対する触媒として作用しうる差し迫ったＧＣの規模は無数の要因に基づいて変化することができ、処理能力が向上すると増加することができる。上記の要因は、処理装置の処理能力とＧＣの予想完了時間とに関連することができる。さらに、実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリを書いたプログラマの嗜好により、アドミニストレータ２１５に対して示すように、プログラマが効率性およびセキュリティの問題の少なくとも１つにより動機付けされるとき、ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒのインスタンス化を開始することができる。
【００４４】
さらに、ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒの少なくとも１つの代替的な実装は、ランタイム実行環境２００が実行中の対応するアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの少なくとも一部に対する実行をリダイレクトする１つまたは複数の特定の命令を含むことができる。
【００４５】
ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒは、そのインスタンス化の意図が、ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒがインスタンス化したＧＣの完了をロードバランサ３１５に通知することであるクラスを指すことができる。従って、ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒのインスタンス化は、実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの１つまたは複数の部分の再配分をランタイム実行環境２００による実行に悪影響を与えずに停止できることを、ロードバランサ３１５に通知する役割を果たすことができる。より詳細には、メモリマネージャ２１０またはアドミニストレータ２１５が単独または複合的に、直近のＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒのインスタンス化の触媒の役割を果たすＧＣの完了、ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒのインスタンス化から経過した所定の閾値時間、あるいは別のプログラムしたコードモジュールが現在実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリに対して実行されること、のうち少なくとも１つを検出するときにＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒをインスタンス化することができる。
【００４６】
ロードバランサ３１５は、クライアント装置１０５のいずれかから物理的に独立したハードウェア装置、あるいはクライアント装置１０５またはサーバ装置１１０Ａおよび１１０Ｂのうち少なくとも１つの上のファームウェアまたはソフトウェアコンポーネントのいずれかを指すことができる。
【００４７】
ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒのインスタンス化の際、ロードバランサ３１５は現在実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの少なくとも一部の処理を再配分して、ＧＣ中のタイムアウトを回避することができる。例えば、プロセス３０５Ａ上の差し迫ったＧＣを参照するＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒのインスタンス化を含むメモリ管理データ３１０の受信時に、ロードバランサ３１５は同一または別の現在実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの一部を実行する１つまたは複数の要求を受信し、上記実行をプロセス３０５Ｂおよびプロセス３０５Ｃのうち少なくとも１つにリダイレクトすることができる。
【００４８】
ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒのインスタンス化の際、ロードバランサ３１５は現在実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの部分の処理をプロセス３０５Ｂおよびプロセス３０５Ｃに再配分することを中止することができる。従って、ロードバランサ３１５は、プロセス３０５Ａ上で実行される現在実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリを均衡させる選択肢を有することができる。
【００４９】
データフロー３００の少なくとも１つの代替的な実装にはロードバランサ３１５は含まれない。即ち、上記の代替的な実装はプロセス３０５Ａ、３０５Ｂ、および３０５Ｃを有することでロードバランシングを実現する。
【００５０】
図４は、少なくとも１つのロードバランシング１２０の実装例（図１を参照）に対応する処理フローの例４００を示す。処理フローの例４００を図１−３からの特徴を参照して以下で説明するが、上記の実装は例として与えるに過ぎず、限定的に解釈されるようには意図していない。
【００５１】
ブロック４０５は、単独または様々な組合せで協調的にプロセス３０５Ａ、プロセス３０５Ｂ、またはプロセス３０５Ｃの一部として実装されているアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの少なくとも一部の実行を指すことができる。ブロック４０５はマネージド実行環境（即ち、ランタイム実行環境２００）での実行を指すことができるが、ロードバランシング１２０はそのように限定されない。
【００５２】
ブロック４１０は、メモリマネージャ２１０またはアドミニストレータ２１５が単独または共同で、現在実行しているアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの実行中に閾値量のヒープが既に割当てられ従ってＧＣが差し迫っていることの決定を指すことができる。またはブロック４１０は、メモリマネージャ２１０またはアドミニストレータ２１５が単独または共同で、プログラムコードの少なくとも一部を検査してランタイム実行環境２００が実行中の処理装置のメモリヒープのスイープまたはスキャンが差し迫っていることの決定を指すことができる。
【００５３】
判定４１５は、メモリマネージャ２１０またはアドミニストレータ２１５が単独または共同で、所定閾値と比較して予想されるＧＣの実装規模を評価することを指すことができる。その評価を行って、メモリヒープの物理的な規模が、現在実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの実行をタイムアウトさせうる所定閾値（例えば、２ＧＢまたはそれ以上）を超過するかどうかを決定することができる。１つの代替手段によるとその評価を、タイムアウトを回避するための所定時間閾値に対するＧＣの予想完了時間から構成することができる。さらに別の例によるとその評価はプログラムコードの少なくとも一部の検査を含むこともでき、そのプログラムコードは、差し迫ったＧＣが実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリを再配分する少なくとも一部のための触媒の役割を果たすよう故意に意図されるかどうかを決定する。
【００５４】
否定判定４１５に続くブロック４２０Ａは、メモリマネージャ２１０が、プロセス３０５Ａ、３０５Ｂ、または３０５Ｃのうちホストプロセスであるものの上で実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリに対するＧＣを実装することを指すことができる。処理フローは次いでブロック４０５に戻り、現在実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの実行を継続することができる。
【００５５】
肯定判定４１５に続くブロック４２５は、メモリマネージャ２１０またはアドミニストレータ２１５が単独または共同で、予想したＧＣが所定の閾値を満足または超過することをロードバランサ３１５に通知することを指すことができる。即ち、予想したＧＣの論理または物理パラメータの閾値超過が期待されると決定すると、マネージメントモジュール２１０またはアドミニストレータ２１５は単独または共同で、差し迫ったＧＣが現在実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリに対してタイムアウトを引き起こしうることをロードバランサに通知することができる。さらに詳細には、マネージメントモジュール２１０またはアドミニストレータ２１５は単独または共同で、予想した状態を通知するＡＰＩ（例えば、ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒ）をインスタンス化することができる。
【００５６】
ブロック４２５の少なくとも１つの代替的な実装において、メモリマネージャ２１０またはアドミニストレータ２１５は単独または共同で、別の形で通知を行うことができる。例えば、その通知は、メモリマネージャ２１０またはアドミニストレータ２１５で以前に登録したプロセス３０５Ａ、プロセス３０５Ｂ、またはプロセス３０５Ｃの一部として実行されるアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの呼び出しを含むイベントであることができる。
【００５７】
上記の通知イベントの例は、単独または共同でメモリマネージャ３１０またはアドミニストレータ２１５を通して１つまたは複数のメモリ管理イベント（例えば、ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒ）を監視する図３のプロセス３０５Ａ、３０５Ｂ、および３０５Ｃの各々を含むことができる。例えば、プロセス３０５Ａは、ＭａｘＧｅｎＮｏｔｉｆｉｅｒがメモリマネージャ２１０またはアドミニストレータ２１５により単体または共同で発行されたときに呼び出し可能な２つの関数を実装することができる。上記の呼び出しの非限定的な例を以下に示す。
(1)  GC.MaxGenerationNotifier += new
MaxGenerationNotificationHandler(On_MaxGeneration_Notify1)
(2)  GC.MaxGenerationNotifier += new
MaxGenerationNotificationHandler(On_MaxGeneration_Notify2)
ここで、ＭａｘＧｅｎｅｒａｔｉｏｎ＿Ｎｏｔｉｆｙ１およびＭａｘＧｅｎｅｒａｔｉｏｎ＿Ｎｏｔｉｆｙ２は前述の関数である。さらに、関数ＭａｘＧｅｎｅｒａｔｉｏｎ＿Ｎｏｔｉｆｙ１およびＭａｘＧｅｎｅｒａｔｉｏｎ＿Ｎｏｔｉｆｙ２はロードバランサ３１５に監視イベントを通知することができる。従って、監視イベントが発生すると、ロードバランサ３１５は要求されたロードバランシング動作を行うことができる。
【００５８】
ブロック４３０は、ロードバランサ３１５が、現在実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの少なくとも一部をプロセス３０５Ａ、３０５Ｂ、および３０５Ｃ間で再配分することを指すことができる。従って、例えば、ホストプロセス３０５Ａに従いＧＣの実施を予想してブロック４２５で通知を受信する場合、ブロック４３０は、ロードバランサ３１５が同一または別の現在実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの少なくとも一つを実行する要求を受信し、その要求された実行をプロセス３０５Ｂおよび３０５Ｃの少なくとも一部にリダイレクトすることを指すことができる。即ちブロック４３０は、ロードバランサ３１５が、現在実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの少なくとも一部を現在実行中のプロセス３０５Ａからプロセス３０５Ｂおよびプロセス３０５Ｃのうち現在実行中のものへ再配分することを指すことができる。
【００５９】
ブロック４２０Ｂは、メモリマネージャ２１０が、プロセス３０５Ａ、３０５Ｂ、または３０５Ｃのうちホストプロセスであるものの上で実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリに対するＧＣを実施することを指すことができ、それぞれのアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの少なくとも一部が、他の現在実行中のプロセス３０５Ａ、３０５Ｂ、および３０５Ｃの上で実行されている。従って、例えば、ホストプロセス３０５Ａに従いＧＣの実施を予想してブロック４２５で通知を受信する場合、ブロック４３０は、ロードバランサ３１５が現在実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの少なくとも一部をプロセス３０５Ｂおよび３０５Ｃの少なくとも１つに再配分することを指すことができ、ブロック４２０Ａは、メモリマネージャ２１０がホストプロセス３０５Ａ上でＧＣを実施することを指すことができる。
【００６０】
ブロック４３５は、メモリマネージャ２１０またはアドミニストレータ２１５が単独または共同でＧＣの完了をロードバランサ３１５に通知することを指すことができる。通知には、現在のロードバランシングの実施を中止する命令を含むことができるかまたは含むことができない。さらに詳細には、管理モジュール２１０またはアドミニストレータ２１５は単独または共同で、現在の状態を通知するＡＰＩ（例えば、ＭａｘＧｅｎｅｒａｔｉｏｎＮｏｔｉｆｉｅｒ）をインスタンス化することができる。処理フローは次いでブロック４０５に戻り、現在実行中のアプリケーション、プログラム、メソッド、関数、または他のコードアセンブリの実行を継続することができる。
【００６１】
ブロック４２５での処理と同様に、通知イベントは、単独または共同でメモリ２１０またはアドミニストレータ２１５を通して１つまたは複数のメモリ管理イベント（例えば、ＭａｘＧｅｎｅｒａｔｉｏｎＣｏｍｐｌｅｔｅＮｏｔｉｆｉｅｒ）をサブスクライブする図３のプロセス３０５Ａ、３０５Ｂ、および３０５Ｃの各々を含むことができる。従って例えば、プロセス３０５Ａは、ＭａｘＧｅｎＣｏｍｐｌｅｔｅＮｏｔｉｆｉｅｒがメモリマネージャ２１０またはアドミニストレータ２１５により単独または共同で発行されたときに呼び出し可能な２つの関数を実装することができる。上記の呼び出しの非限定的な例を以下に示す。
(1)  GC.MaxGenerationCompleteNotifier += new
MaxGenerationCompleteNotificationHandler(On_MaxGenerationComplete_Notify1)
(2)  GC.MaxGenerationCompleteNotifier += new
MaxGenerationCompleteNotificationHandler(On_MaxGenerationComplete_Notify2)
ここで、ＭａｘＧｅｎｅｒａｔｉｏｎＣｏｍｐｌｅｔｅ＿Ｎｏｔｉｆｙ１およびＭａｘＧｅｎｅｒａｔｉｏｎＣｏｍｐｌｅｔｅ＿Ｎｏｔｉｆｙ２は前述の関数である。さらに、関数ＭａｘＧｅｎｅｒａｔｉｏｎＣｏｍｐｌｅｔｅ＿Ｎｏｔｉｆｙ１およびＭａｘＧｅｎｅｒａｔｉｏｎＣｏｍｐｌｅｔｅ＿Ｎｏｔｉｆｙ２はロードバランサ３１５にサブスクライブイベントを通知することができる。従って、サブスクライブイベントが発生すると、ロードバランサ３１５は要求に応じてロードバランサ３１５を少なくとも一時的に中止することができる。
【００６２】
図１−４に関連して上述したランタイム実行環境上で実行される１つまたは複数のアプリケーションに関するロードバランシングは、メモリ管理データに関連付けたデータに従って実装することができる。しかしながら、本明細書で説明した限定の例はメモリ管理データに基づくロードバランシングのみに限定されない。むしろ、通知（即ち、ノーティフィケーション）は無数の論理的および物理的基準に基づくロードバランシングを実施するようにインスタンス化することができる。
【００６３】
上述した任意の例および実装に対するコンピュータ環境は、例えば、１つまたは複数のプロセッサまたは演算装置、システムメモリ、および様々なシステムコンポーネントを接続するシステムバスを有するコンピューティング装置を含むことができる。
【００６４】
コンピューティング装置は様々なコンピュータ読取可能媒体を含むことができる。コンピュータ読取可能媒体には、揮発性および不揮発性媒体、取り外し可能および取り外し不能媒体の両方が含まれる。システムメモリはコンピュータ読取可能媒体を、ランダムアクセスメモリ（ＲＡＭ）のような揮発性メモリ、および／あるいは読取専用メモリ（ＲＯＭ）またはフラッシュＲＡＭのような形態で含むことができる。コンピュータがアクセス可能なデータを記憶できる他種のコンピュータ読取可能媒体を利用して、コンピューティングシステムおよび環境の例を実装できることは理解できる。その他種のコンピュータ読取可能媒体には例えば、磁気カセットまたは他の磁気記憶装置、フラッシュメモリカード、ＣＤ−ＲＯＭ、デジタル多用途ディスク（ＤＶＤ）または他の光学記憶、ランダムアクセスメモリ（ＲＡＭ）、読取専用メモリ（ＲＯＭ）、電気的消去プログラム可能型読取専用メモリ（ＥＥＰＲＯＭ）等がある。
【００６５】
本出願を通して言及した「例」、「代替例」、「少なくとも１つの例」、「実装」、「実装例」は、本発明の少なくとも１つの実装に含まれる特定の説明した特徴、構造、または特性を意味する。従って、上記句の使用は複数の実装を指すことができる。さらに、説明した特徴、構造、または特性を１つまたは複数の実装において適切な任意の方法で組み合わせることができる。
【００６６】
しかしながら当業界の技術者は、本発明を１つまたは複数の特定の詳細なしに、または他の方法、リソース、材料、等とともに実践できることを認識するであろう。他の事例では、本発明の態様が不明瞭になることを単に避けるため、公知の構造、リソース、または操作を図示または説明していない。
【００６７】
本発明の実装例および応用例を図示および説明してきたが、本発明は上述した構成およびリソースに正確に限定されないことは理解されるべきである。当業界の技術者に明らかな様々な修正、変更、および変形を、上述および添付請求項で説明する本発明の範囲から逸脱せずに、本明細書で開示した本発明の方法およびシステムの配置、操作、および詳細において行うことができる。
【図面の簡単な説明】
【００６８】
【図１】ロードバランシング技術の例を実装する装置とネットワーク上で通信する装置である。
【図２】ロードバランシング技術の例を実装する実行環境の例である。
【図３】ロードバランシングの実装例に従うデータノード間のデータフローの例である。
【図４】ロードバランシングの実装例に従う処理フローの例である。
【図１】
2009512936.tif 000003
【図２】
2009512936.tif 000004
【図３】
2009512936.tif 000005
【図４】
2009512936.tif 000006
【国際調査報告】
2009512936.tif 000007
2009512936.tif 000008