(57)【特許請求の範囲】
【請求項１】
データ処理システムにおいて、前記データ処理システムにおけるコンピュータ・コードの実行をプロファイリングするための時間ベース・コンテキスト・サンプリングを実施するための方法であって、
イベントの発生に応答して、前記データ処理システムのプロセッサ上で実行されている複数の実行スレッドに関連付けられた複数のサンプリング・スレッドを起動することと、
前記データ処理システムのプロセッサにより、前記各サンプリング・スレッドについて、１つ又は複数の対象仮想マシンに関する対応する実行スレッドの実行状態を判断することと、
前記プロセッサにより、前記各サンプリング・スレッドについて、前記対応する実行スレッドの前記実行状態に基づき、前記対応する実行スレッドに関連付けられた仮想マシンからトレース情報を取り出すべきか否かを判断することと、
前記各サンプリング・スレッドについて、前記対応する実行スレッドに関連付けられた仮想マシンからトレース情報を取り出すとの判断に応答して、前記トレース情報を前記仮想マシンから取り出し、該トレース情報を、前記データ処理システムに関連付けられたストレージ・デバイスに格納することと
を含み、
前記各サンプリング・スレッドについて、前記対応する実行スレッドに関連付けられた仮想マシンからトレース情報を取り出すか否かを判断することが、
前記サンプリング・スレッドのいずれかが、前記対応する実行スレッドに関連付けられた仮想マシンからトレース情報を取り出すべきであるか判断することと、
前記サンプリング・スレッドのいずれもトレース情報を取り出すべきではないとの判断に応答して、前記対応する実行スレッドの実行の条件に基づき、前記複数の実行スレッドに関連付けられた１つ又は複数のデバイス・ドライバ・サンプリング統計量カウンタを更新することと、
を含む、方法。
【請求項２】
対象仮想マシンを選択することであって、前記対象仮想マシンに関するトレース情報が前記データ処理システムの前記プロセッサ上の前記対象仮想マシン内で実行されているスレッドから収集される、対象仮想マシンを選択することをさらに含み、
前記各サンプリング・スレッドについて、前記対応する実行スレッドに関連付けられた仮想マシンからトレース情報を取り出すべきか否かを判断することが、前記対応する実行スレッドが前記対象仮想マシン内で現在実行中であるか判断することを含み、
前記対応する実行スレッドに関連付けられた前記仮想マシンが前記対象仮想マシンであることに応答して、該仮想マシンからトレース情報が取り出される、請求項１に記載の方法。
【請求項３】
カレント・サンプリング・スレッドに対応する前記実行スレッドが対象仮想マシン内で現在実行中ではないが、対象仮想マシン内で実行中の対応する実行スレッドを有する少なくとも１つの他のサンプリング・スレッドが存在する場合に、前記少なくとも１つの他のサンプリング・スレッドによりトレース情報が収集されるまで、前記カレント・サンプリング・スレッドがスピン状態に置かれる、請求項２に記載の方法。
【請求項４】
前記対応する実行スレッドの実行の条件に基づき、前記複数の実行スレッドに関連付けられた１つ又は複数のサンプリング統計量カウンタを更新することをさらに含む、請求項１乃至３のいずれかに記載の方法。
【請求項５】
前記１つ又は複数のサンプリング統計量カウンタが、サンプリング・スレッドが起動状態のときに、前記サンプリング・スレッドがその対応する実行スレッドがガベージ・コレクション動作に関与していると判断する回数をカウントするための第１のカウンタ、サンプリング・スレッドが起動状態のときに、前記サンプリング・スレッドがその対応する実行スレッドが対象仮想マシンの外部プロセスを実行中であると判断する回数をカウントするための第２のカウンタ、又はサンプリング・スレッドが起動状態のときに、前記サンプリング・スレッドがその対応する実行スレッドが対象仮想マシン内で実行中であると判断する回数をカウントするための第３のカウンタのうちの少なくとも１つを含む、請求項４に記載の方法。
【請求項６】
前記対象仮想マシンを選択することが、
前記データ処理システム内で実行されるプロファイラ・ツールに複数の仮想マシンを登録することと、
前記プロファイラ・ツールに登録された前記複数の仮想マシンの中から対象仮想マシンとしての仮想マシンの選択を受け取ることと、
を含む、請求項２に記載の方法。
【請求項７】
前記プロファイラ・ツールが、該プロファイラ・ツールに登録された前記複数の仮想マシンのサブセットを巡るサイクルの中の次の仮想マシンを選択することにより、前記複数の仮想マシンの中から対象仮想マシンを選択する、請求項６に記載の方法。
【請求項８】
前記選択された対象仮想マシンが、トレース情報の収集のために選択された、前記プロファイラ・ツールに登録されている前記複数の仮想マシンのサブセットの一部であり、前記複数の仮想マシンの前記サブセットは、前記プロファイラ・ツールに登録されている前記複数の仮想マシンの総数を下回る、請求項６に記載の方法。
【請求項９】
前記サンプリング・スレッドに対応するメモリの作業領域に、前記選択された対象仮想マシンの識別子が書き込まれる、請求項２に記載の方法。
【請求項１０】
コンピュータ・プログラムであって、前記コンピュータ・プログラムは、コンピュータ・デバイス上で実行されたとき、前記コンピュータ・デバイスに、
イベントの発生に応答して、複数の実行スレッドに関連付けられた複数のサンプリング・スレッドを起動させ、
前記各サンプリング・スレッドについて、１つ又は複数の対象仮想マシンに関する対応する実行スレッドの実行状態を判断させ、
前記各サンプリング・スレッドについて、前記対応する実行スレッドの前記実行状態に基づき、前記対応する実行スレッドに関連付けられた仮想マシンからトレース情報を取り出すか否かを判断させ、
前記各サンプリング・スレッドについて、前記対応する実行スレッドに関連付けられた仮想マシンからトレース情報を取り出すとの判断に応答して、前記トレース情報を前記仮想マシンから取り出し、該トレース情報を、前記コンピュータ・デバイスに関連付けられたストレージ・デバイスに格納させ、
前記コンピュータ・プログラムが、
前記サンプリング・スレッドのいずれかが、前記対応する実行スレッドに関連付けられた仮想マシンからトレース情報を取り出すべきであるか判断することと、
前記サンプリング・スレッドのいずれもトレース情報を取り出すべきではないとの判断に応答して、前記対応する実行スレッドの実行の条件に基づき、前記複数の実行スレッドに関連付けられた１つ又は複数のデバイス・ドライバ・サンプリング統計量カウンタを更新することと
によって、前記各サンプリング・スレッドについて、前記対応する実行スレッドに関連付けられた仮想マシンからトレース情報を取り出すか否かを前記コンピュータ・デバイスに判断させる、コンピュータ・プログラム。
【請求項１１】
プロセッサと、
前記プロセッサに結合されたメモリと
を備えた装置であって、前記メモリは命令を含み、前記命令は、前記プロセッサにより実行されたとき、前記プロセッサに、
イベントの発生に応答して、複数の実行スレッドに関連付けられた複数のサンプリング・スレッドを起動させ、
前記各サンプリング・スレッドについて、１つ又は複数の対象仮想マシンに関する対応する実行スレッドの実行状態を判断させ、
前記各サンプリング・スレッドについて、前記対応する実行スレッドの前記実行状態に基づき、前記対応する実行スレッドに関連付けられた仮想マシンからトレース情報を取り出すか否かを判断させ、
前記各サンプリング・スレッドについて、前記対応する実行スレッドに関連付けられた仮想マシンからトレース情報を取り出すとの判断に応答して、前記トレース情報を前記仮想マシンから取り出し、該トレース情報を、前記コンピュータ・デバイスに関連付けられたストレージ・デバイスに格納させ、
前記命令は、
前記サンプリング・スレッドのいずれかが、前記対応する実行スレッドに関連付けられた仮想マシンからトレース情報を取り出すべきであるか判断することと、
前記サンプリング・スレッドのいずれもトレース情報を取り出すべきではないとの判断に応答して、前記対応する実行スレッドの実行の条件に基づき、前記複数の実行スレッドに関連付けられた１つ又は複数のデバイス・ドライバ・サンプリング統計量カウンタを更新することと
によって、前記各サンプリング・スレッドについて、前記対応する実行スレッドに関連付けられた仮想マシンからトレース情報を取り出すか否かを前記プロセッサに判断させる、
装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本出願は、一般に、改善されたデータ処理装置及び方法に関し、より具体的には、多重仮想マシンのためのサポートを有する、トレース・データの時間ベース・コンテキスト・サンプリングのための機構に関する。
【背景技術】
【０００２】
データ処理システム、及びデータ処理システム内で実行されるアプリケーションの性能の解析及び強化において、データ処理システム内のどのソフトウェア・モジュールがシステム・リソースを使用しているかを知ることは有用である。データ処理システムの効果的な管理及び強化には、種々のシステム・リソースがいつどのように使用されているかを知ることが必要である。データ処理システムを監視及び検査して、データ処理システム内で種々のソフトウェア・アプリケーションが実行される際のリソース消費を判断するために、パフォーマンス・ツールが使用される。例えば、パフォーマンス・ツールは、あるデータ処理システム内で最も頻繁に実行されるモジュール及び命令を識別することができ、又は、最大量のメモリを割り当てるモジュール若しくは最多のＩ／Ｏ要求を実行するモジュールを識別することができる。ハードウェア・パフォーマンス・ツールは、システム内に組み込むことができ、又は後の時点でシステムに追加することができる。
【０００３】
１つの公知のソフトウェア・パフォーマンス・ツールは、トレース・ツールである。トレース・ツールは、実行中のプログラムについての実行フローを示すトレース情報を提供するために、複数の技術を用いることができる。１つの技術は、ある種のイベントが発生する都度ログを取ることにより特定の命令シーケンスの動向を把握する、所謂イベント・ベースのプロファイリング技術である。例えば、トレース・ツールは、モジュール、サブルーチン、メソッド、関数又はシステム・コンポーネントへと入る（エントリ）毎に、及びこれらから出る（エグジット）毎にログを取ることができる。あるいは、トレース・ツールは、リクエスタ、及び、各メモリ割当て要求に対して割り当てられたメモリの量のログを取ることができる。典型的には、そのような各イベントついて、タイム・スタンプが付された記録が作成される。任意のコード・セグメントの実行、Ｉ／Ｏ又はデータ伝送の開始及び完了、並びにその他の多くの対象イベントをトレースするために、エントリ−エグジットの記録と同様の、対応する記録の対もまた使用される。
【０００４】
種々のコンピュータ・ファミリによって生成されるコードの性能を改善するには、プロセッサがコードを実行するに際してどこで時間が消費されるかを判断することが必要となる場合が多く、このような努力は、コンピュータ処理技術分野においては「ホット・スポット」の探索として一般に知られている。理想的には、コードの改善によって最も利益を得るであろう領域に注意を集中するために、このようなホット・スポットを命令及び／又はコードのソース・ラインのレベルで分離することが望まれる。
【０００５】
もう１つのトレース技術は、プログラムの実行フローを定期的にサンプリングして、プログラムが大量の時間を費やしているように見えるプログラム中の特定の位置を識別することを伴う。この技術は、アプリケーション又はデータ処理システムの実行に一定の間隔で定期的に割込みをかけるという発想に基づく、所謂サンプリング・ベースのプロファイリングである。各々の割込みにおいて、所定の時間にわたって又は所定の対象イベント数にわたって、情報が記録される。例えば、プロファイリング中のより大きなプログラムの中の実行可能部分である現在実行中のスレッドのプログラム・カウンタを、各々の時間間隔ごとに記録することができる。これらの値は、後処理時間においてそのデータ処理システムについての負荷マップ及び記号テーブル情報と照合して分析することができ、この解析から、どこで時間が消費されているかについてのプロファイルを得ることができる。
【発明の概要】
【発明が解決しようとする課題】
【０００６】
公知のサンプリング型トレース技術は、一度に１つの実行環境に対してトレースを実施することに限定されている。即ち、プログラムの実行フローのサンプリングは、単一のオペレーティング・システム及び仮想マシン実行環境に関して実施される。しかしながら、近年、アプリケーション・ミドルウェアは、種々のアプリケーションをサポートするために多重仮想マシンを使用する必要が増してきた。公知のサンプリング型トレース技術を用いた場合、各々の個別の仮想マシン実行環境を一度に１つずつ逐次的に個別にサンプリングしなければならない。これにより、トレース及び解析にかかる時間が長くなると共に、もたらされるトレース情報が他の手法で得られるトレース情報ほど正確ではなくなることがある。
【課題を解決するための手段】
【０００７】
１つの例示的な実施形態において、データ処理システムにおいて、データ処理システムにおけるコンピュータ・コードの実行をプロファイリングするための時間ベース・コンテキスト・サンプリングを実施するための方法が提供される。本方法は、イベントの発生に応答して、データ処理システムのプロセッサ上で実行されている複数の実行スレッドに関連付けられた複数のサンプリング・スレッドを起動することを含む。本方法は、各サンプリング・スレッドについて、１つ又は複数の対象仮想マシンに関する対応する実行スレッドの実行状態を判断することをさらに含む。さらに、本方法は、各サンプリング・スレッドについて、対応する実行スレッドの実行状態に基づき、対応する実行スレッドに関連付けられた仮想マシンからトレース情報を取り出すべきか否かを判断することを含む。さらにまた、本方法は、各サンプリング・スレッドについて、対応する実行スレッドに関連付けられた仮想マシンからトレース情報を取り出すとの判断に応答して、トレース情報を仮想マシンから取り出すことを含む。
【０００８】
他の例示的な実施形態において、コンピュータ可読プログラムを有するコンピュータ使用可能又は可読媒体を含むコンピュータ・プログラム製品が提供される。コンピュータ可読プログラムは、コンピュータ・デバイス上で実行されたとき、コンピュータ・デバイスに、本方法の例示的な実施形態に関して上記で概説した種々の動作のうちの１つ又はそれらの組み合わせを実施させる。
【０００９】
さらに別の例示的な実施形態において、システム／装置が提供される。システム／装置は、１つ又は複数のプロセッサと、１つ又は複数のプロセッサに結合されたメモリとを含むことができる。メモリは命令を含むことができ、命令は、１つ又は複数のプロセッサにより実行されたとき、１つ又は複数のプロセッサに、本方法の例示的な実施形態に関して上記で概説した種々の動作のうちの１つ又はそれらの組み合わせを実施させる。
【００１０】
本発明のこれら及び他の特徴並びに利点は、本発明の例示的な実施形態についての以下の詳細な説明の中で説明され、又はこれを考慮すれば当業者には明らかとなるであろう。
【００１１】
本発明の好ましい実施形態は、例示の目的のみで、添付の図面を参照して説明される。
【図面の簡単な説明】
【００１２】
【図１】例示的な実施形態を実装することができるデータ処理システムの絵画的表現である。
【図２】例示的な実施形態の態様を実装することができるデータ処理システムの要素の例示的なブロック図である。
【図３】１つの例示的な実施形態による、コンピュータ・プログラムの実行をプロファイリングするために用いられるコンポーネントを示す例示的な図である。
【図４】１つの例示的な実施形態による、コール・スタック情報の取得に用いられるコンポーネントを示す図である。
【図５】１つの例示的な実施形態による、コール・ツリーの図である。
【図６】１つの例示的な実施形態による、ノード内の情報を示す図である。
【図７】１つの例示的な実施形態による、ターゲット・スレッドについてのコール・スタック情報を取得するための例示的なプロセスの概要を示すフローチャートである。
【図８】１つの例示的な実施形態による、コール・スタック情報を収集するためのサンプリング・スレッドにおける例示的なプロセスの概要を示すフローチャートである。
【図９】１つの例示的な実施形態による、割込みの受信に応答してプロセッサ上のサンプリング・スレッドに通知するための例示的なプロセスの概要を示すフローチャートである。
【図１０】例示的な一実施形態による、サンプリング・スレッドについての例示的なプロセスの概要を示すフローチャートである。
【図１１】例示的な一実施形態による、多重仮想マシンと関連した多重プロセッサにより実行される多重スレッドに関してコンピュータ・プログラムのプロファイリングを実施するためのシステムの例示的なブロック図である。
【図１２】多重プロセッサ及び多重仮想マシンの多重スレッドがプロファイリングされる例示的な一実施形態による、サンプリング・スレッドの例示的な動作の概要を示すフローチャートである。
【発明を実施するための形態】
【００１３】
例示的な実施形態は、多重仮想マシン・サポートを有する、トレース・データの時間ベース・コンテキスト・サンプリングを提供するための機構を提供する。例示的な実施形態の機構によれば、多重仮想マシン実行環境を、種々の仮想マシンにアクセスする種々のプロセッサに関連付けられた複数のサンプラ・スレッドを用いて同時にサンプリングすることができる。さらに、これらのサンプラ・スレッドの各々を起動させ、取得すべきトレース・データ又は情報がもしあればどれを取得するのかを判断するための機構が提供される。したがって、トレース情報のサンプリングを要求するデバイス・ドライバに対する呼出しを生じさせる割込み又はその他のイベントが生じる度毎に、プロファイラ内の各サンプリング・スレッドが起動され、そして、サンプリング・スレッドが起動された時点の実行スレッドの状態に応じてトレース情報が取得され、特定のスレッドのためのトレース・データ・ファイル内に格納される。
【００１４】
取得すべきトレース・データが存在するか否か、そして存在する場合はどのトレース・データを取得すべきかについての判断は、サンプラ・スレッドが起動された時点で、実行環境内の対応する実行スレッドの実行がどの状態にあるかに基づいて行うことができる。例えば、実行スレッドが仮想マシンに現在アクセス中の時点でサンプラ・スレッドが起動された場合には、コール・スタック情報を収集することができる。実行スレッドがガベージ・コレクション動作を実施している最中の時点でサンプラ・スレッドが起動された場合には、コール・スタック情報は収集しなくてもよい。実行スレッドの特定の実行状態に基づいていつどのようなトレース情報を収集すべきかを定義するために、種々の条件を確立することができる。
【００１５】
さらに、実行スレッドと仮想マシンとに関連したサンプラ・スレッドの使用に関する統計量の取得に使用するための種々のカウンタを設けることができる。これらのカウンタは、実行スレッドの実行状態の特定の条件と関連付けることができる。サンプラ・スレッドが起動され、それに対応する実行スレッドの状態がカウンタに関連付けられた条件に対応するたびごとに、対応するカウンタをインクリメントすることができる。これらのカウンタ値も同様にサンプリングすることができ、実行スレッドについてのトレース・データ・ファイルの一部として格納することができる。この情報を他のトレース情報と共に用いて、実行中の様々な時点における、そのデータ処理システムの実行環境におけるコンピュータ・プログラムの実行状態を詳述するレポートを生成することができる。この情報は、コンピュータ・プログラムの実行中の処理リソースの配分を識別するために用いることができる。
【００１６】
当業者であれば認識するように、本発明の実施形態は、システム、方法、又はコンピュータ・プログラム製品として具体化することができる。従って、本発明の実施形態は、全体がハードウェアの実施形態、全体がソフトウェアの実施形態（ファームウェア、常駐ソフトウェア、マイクロコードなどを含む）、又は、ソフトウェアの態様とハードウェアの態様とを組み合わせた実施形態の形を取ることができ、本明細書においてはこれらの全てを一般に、「回路」、「モジュール」又は「システム」と呼ぶことができる。さらに、本発明は、媒体内に具体化されたコンピュータ使用可能プログラム・コードを有する、いずれかの有形の表現媒体内に具体化されたコンピュータ・プログラムの形態をとることができる。
【００１７】
１つ又は複数のコンピュータ使用可能媒体又はコンピュータ可読媒体のいずれの組み合わせを用いることもできる。コンピュータ使用可能媒体又はコンピュータ可読媒体は、例えば、電子的、磁気的、光学的、電磁気的、赤外線又は半導体のシステム、装置、デバイス又は伝搬媒体とすることができるが、これらに限定されるものではない。コンピュータ可読媒体のより具体的な例（非網羅的なリスト）として、以下のもの、すなわち、１つ又は複数の配線を有する電気的接続、ポータブル・コンピュータ・ディスケット、ハード・ディスク、ランダム・アクセス・メモリ（ＲＡＭ）、読み出し専用メモリ（ＲＯＭ）、消去可能プログラム可能読み出し専用メモリ（ＥＰＲＯＭ又はフラッシュメモリ）、光ファイバ、ポータブル・コンパクト・ディスク読み出し専用メモリ（ＣＤＲＯＭ）、光記憶装置、インターネット又はイントラネットをサポートする伝送媒体、又は磁気記憶装置が挙げられる。プログラムが印刷された紙又は他の適切な媒体も、そのプログラムを例えば、その紙又は他の媒体の光学スキャンによって電子的にキャプチャし、次いで、必要に応じて、コンパイルし、解釈し、又はそれ以外の適切な手法で処理し、その後、コンピュータ・メモリ内に格納することができるので、コンピュータ使用可能媒体又はコンピュータ可読媒体はプログラムが印刷された紙又は別の適切な媒体とすることさえできることに留意されたい。本明細書の文脈内において、コンピュータ使用可能媒体又はコンピュータ可読媒体は、命令実行システム、装置、又はデバイスによって使用するため、又はこれらと関連して使用するために、プログラムを収納、保存、通信、伝搬、又は輸送することができるあらゆる媒体とすることができる。コンピュータ使用可能媒体は、コンピュータ使用可能なプログラム・コードが、ベースバンド内で又は搬送波の一部としてその中で具体化された、伝搬されるデータ信号を含むものとすることができる。コンピュータ使用可能プログラム・コードは、これらに限定されるものではないが、無線、有線、光ファイバ・ケーブル、及び無線周波数（ＲＦ）などを含むいずれかの適切な媒体を用いて伝送することができる。
【００１８】
本発明の実施形態における動作を実行するためのコンピュータ・プログラム・コードは、Ｊａｖａ（商標）、ＳｍａｌｌＴａｌｋ（商標）、Ｃ＋＋などのようなオブジェクト指向型プログラミング言語、及び、「Ｃ」プログラミング言語又は同様のプログラミング言語のような従来の手続き型プログラミング言語を含む、１つ又は複数のプログラミング言語のいずれかの組合せで記述することができる。プログラム・コードは、全体をユーザのコンピュータ上で実行することができ、スタンドアロン型のソフトウェア・パッケージとして部分的にユーザのコンピュータ上で実行することができ、一部をユーザのコンピュータ上で実行し、一部をリモート・コンピュータ上で実行することができ、又は、全体をリモート・コンピュータ若しくはサーバ上で実行することができる。後者のシナリオでは、リモート・コンピュータは、ローカル・エリア・ネットワーク（ＬＡＮ）又は広域ネットワーク（ＷＡＮ）を含むいずれかのタイプのネットワークを通じてユーザのコンピュータに接続することができ、又は、（例えば、インターネット・サービス・プロバイダを用いるインターネットを通じて）外部コンピュータに対する接続を行うこともできる。さらに、プログラム・コードをサーバ又はリモート・コンピュータ上のコンピュータ可読ストレージ媒体上に具体化し、ネットワークを介して、リモート・コンピュータ又はユーザのコンピュータのコンピュータ可読ストレージ媒体に格納及び／又は実行のためにダウンロードすることができる。しかも、コンピュータ・システム又はデータ処理システムのいずれも、ネットワークを介してリモート・コンピュータ・システム又はデータ処理システムからプログラム・コードをダウンロードした後で、コンピュータ可読ストレージ媒体にプログラム・コードを格納することができる。
【００１９】
例示的な実施形態は、本発明の例示的な実施形態による方法、装置（システム）、及びコンピュータ・プログラム製品のフローチャート図及び／又はブロック図を参照して、以下で説明される。フローチャート図及び／又はブロック図の各ブロック、並びにフローチャート図及び／又はブロック図内のブロックの組合せは、コンピュータ・プログラム命令によって実装できることが理解されよう。これらのコンピュータ・プログラム命令を、汎用コンピュータ、専用コンピュータ、又は他のプログラム可能データ処理装置のプロセッサに提供して、マシンを製造し、それにより、コンピュータ又は他のプログラム可能データ処理装置のプロセッサによって実行される命令が、フローチャート及び／又はブロック図の１つ又は複数のブロック内で指定された機能／動作を実装するための手段を生成するようにすることができる。
【００２０】
これらのコンピュータ・プログラム命令を、コンピュータ又は他のプログラム可能データ処理装置に特定の様式で機能するように指示することができるコンピュータ可読媒体に格納して、それにより、そのコンピュータ可読媒体に格納された命令が、フローチャート及び／又はブロック図の１つ又は複数のブロック内で指定された機能／動作を実装する命令手段を含む製品を製造するようにすることもできる。
【００２１】
コンピュータ・プログラム命令を、コンピュータ又は他のプログラム可能データ処理装置にロードして、コンピュータ又は他のプログラム可能データ処理装置上で一連の動作ステップを実施させてコンピュータ実装プロセスを生成し、それにより、コンピュータ又は他のプログラム可能装置上で実行される命令が、フローチャート及び／又はブロック図の１つ又は複数のブロック内で指定された機能／動作を実装するためのプロセスを提供するようにすることもできる。
【００２２】
図面内のフローチャート及びブロック図は、本発明の種々の実施形態による、システム、方法、及びコンピュータ・プログラム製品の可能な実装の、アーキテクチャ、機能及び動作を示す。この点に関して、フローチャート又はブロック図内の各ブロックは、指定された論理機能を実装するための１つ又は複数の実行可能命令を含む、モジュール、セグメント、又はコードの一部を表すことができる。幾つかの代替的な実装において、ブロック内に記された機能は、図面に記された順序とは異なる順序で行われることがあることにも留意すべきである。例えば、連続して図示された２つのブロックが実際には実質的に同時に実行されることもあり、又はこれらのブロックは、関与する機能に応じて、ときには逆順で実行されることもある。ブロック図及び／又はフローチャート図内の各ブロック、並びにブロック図及び／又はフローチャート図内のブロックの組み合わせは、指定された機能又は行為を実行する専用ハードウェア・ベースのシステム、又は専用のハードウェアとコンピュータ命令との組み合わせによって実装することができることにも留意されたい。
【００２３】
ここで、図、特に図１を参照して、例示的な実施形態を実装することができるデータ処理システムの絵画的表現が示される。図１に示されるように、コンピュータ１００は、システム・ユニット１０２と、映像表示端末１０４と、キーボード１０６と、フロッピィドライブ及びその他のタイプの永続的及び取り外し可能なストレージ媒体を含むことができるストレージ・デバイス１０８と、マウス１１０とを含む。パーソナル・コンピュータ１００には付加的な入力デバイスを含めることができる。付加的な入力デバイスの例は、例えば、ジョイスティック、タッチパッド、タッチ・スクリーン、トラックボール、及びマイクロフォンを含むことができる。
【００２４】
コンピュータ１００は、ニューヨーク州アーモンク所在のＩｎｔｅｒｎａｔｉｏｎａｌ  Ｂｕｓｉｎｅｓｓ  Ｍａｃｈｉｎｅｓ  Ｃｏｒｐｏｒａｔｉｏｎの製品であるＩＢＭ（商標）ｅＳｅｒｖｅｒ（商標）コンピュータ又はＩｎｔｅｌｌｉＳｔａｔｉｏｎ（商標）コンピュータなどのいずれかの適切なコンピュータ、又はいずれかの他のタイプのコンピュータ・デバイスとすることができる。図示された表現はパーソナル・コンピュータを示すが、他の実施形態を他のタイプのデータ処理システムに実装することができる。例えば、他の実施形態をネットワーク・コンピュータに実装することができる。コンピュータ１００はまた、コンピュータ１００内の動作中のコンピュータ可読媒体内に常駐するシステム・ソフトウェアにより実装することができるグラフィカル・ユーザ・インターフェース（ＧＵＩ）を含むことが好ましい。
【００２５】
ここで図２を参照すると、本発明の例示的な実施形態によるデータ処理システムの図が示される。この説明例では、データ処理システム２００は、プロセッサ・ユニット２０４と、メモリ２０６と、永続的ストレージ２０８と、通信ユニット２１０と、入力／出力（Ｉ／Ｏ）ユニット２１２と、ディスプレイ２１４との間の通信を提供する、通信ファブリック２０２を含む。
【００２６】
プロセッサ・ユニット２０４は、メモリ２０６にロードすることができるソフトウェアのための命令を実行する役目を果たす。プロセッサ・ユニット２０４は、特定の実装に応じて、１つ又は複数のプロセッサの組とすることも、マルチ・プロセッサ・コアとすることもできる。さらに、プロセッサ・ユニット２０４は、主プロセッサ又は制御プロセッサが主プロセッサと同一の又は異なる命令セットを用いる二次プロセッサ又はコプロセッサと共にシングル・チップ上に存在する１つ又は複数の異種プロセッサ・システムを用いて実装することができる。例示的な実施形態の機構を実装するのに用いることができる異種プロセッサ・システムの一例は、ニューヨーク州アーモンク所在のＩｎｔｅｒｎａｔｉｏｎａｌ  Ｂｕｓｉｎｅｓｓ  Ｍａｃｈｉｎｅｓ  Ｃｏｒｐｏｒａｔｉｏｎから入手可能なＣｅｌｌ  Ｂｒｏａｄｂａｎｄ  Ｅｎｇｉｎｅ（商標）である。別の説明例として、プロセッサ・ユニット２０４は、同じタイプの複数のプロセッサを含む対称型マルチ・プロセッサ（ＳＭＰ）システムとすることができる。
【００２７】
これらの例におけるメモリ２０６は、例えば、ランダム・アクセス・メモリとすることができる。永続的ストレージ２０８は、特定の実装に応じて種々の形態を取ることができる。例えば、永続的ストレージ２０８は、１つ又は複数のコンポーネント又はデバイスを含むことができる。例えば、永続的ストレージ２０８は、ハード・ドライブ、フラッシュメモリ、書換え可能光ディスク、書換え可能磁気テープ、又はそれらのいくつかの組み合わせとすることができる。永続的ストレージ２０８によって用いられる媒体は、取り外し可能なものとすることもできる。例えば、取り外し可能ハード・ドライブを永続的ストレージ２０８に用いることができる。
【００２８】
これらの例における通信ユニット２１０は、他のデータ処理システム又はデバイスとの通信を提供する。これらの例では、通信ユニット２１０は、ネットワーク・インターフェース・カードである。通信ユニット２１０は、物理通信リンク及び無線通信リンクの一方又は両方の使用によって、通信を提供することができる。
【００２９】
入力／出力ユニット２１２は、データ処理システム２００に接続することができる他のデバイスでのデータの入力及び出力を可能にする。例えば、入力／出力ユニット２１２は、キーボード及びマウスを通じたユーザ入力のための接続を提供することができる。さらに、入力／出力ユニット２１２は、プリンタに出力を送信することができる。ディスプレイ２１４は、情報をユーザに表示する機構を提供する。
【００３０】
オペレーティング・システム及びアプリケーション又はプログラムのための命令は、永続的ストレージ２０８上に配置される。これらの命令を、プロセッサ・ユニット２０４によって実行するためにメモリ２０６にロードすることができる。異なる実施形態のプロセスは、メモリ２０６のような記憶域に配置することができるコンピュータ実装命令を用いて、プロセッサ・ユニット２０４によって実施することができる。これらの命令は、コンピュータ使用可能プログラム・コード、又はコンピュータ可読プログラム・コードと呼ばれ、プロセッサ・ユニット２０４内のプロセッサによって読み出し、実行することができる。コンピュータ可読プログラム・コードは、メモリ２０６又は永続的ストレージ２０８といった異なる物理的な又は有形のコンピュータ可読媒体に組み込むことができる。
【００３１】
コンピュータ使用可能プログラム・コード２１６は、コンピュータ可読媒体２１８上に関数形態で配置されており、データ処理システム２００上にロード又は転送することができる。これらの例では、コンピュータ使用可能プログラム・コード２１６及びコンピュータ可読媒体２１８がコンピュータ・プログラム製品２２０を形成する。一例において、コンピュータ可読媒体２１８は、例えば光ディスク又は磁気ディスクとすることができ、光又は磁気ディスクは、永続的ストレージ２０８の一部であるハード・ドライブのような記憶デバイスに転送するために、永続的ストレージ２０８の一部であるドライブ又は他のデバイス内に挿入され又は配置される。コンピュータ可読ストレージ媒体２１８は、データ処理システム２００に接続されるハード・ドライブ又はフラッシュメモリといった永続的ストレージの形態を取ることもできる。
【００３２】
あるいは、コンピュータ使用可能プログラム・コード２１６は、コンピュータ可読媒体２１８から、通信ユニット２１０への通信リンクを通じて、及び／又は入力／出力ユニット２１２への接続を通じてデータ処理システム２００に転送することもできる。説明例において、通信リンク及び／又は接続は物理的なものであっても無線式であってもよい。コンピュータ可読媒体は、コンピュータ可読プログラム・コードを収容する、通信リンク又は無線伝送のような非有形媒体の形態を取ることもできる。
【００３３】
データ処理システム２００について例示された異なるコンポーネントは、異なる実施形態を実装することができる方式に対してアーキテクチャ上の制限を与えることを意味するものではない。異なる例示的な実施形態は、データ処理システム２００について例示されたコンポーネントに加えて、又はそれらを置き換えるコンポーネントを含むデータ処理システムで実装することができる。図２に示されたその他のコンポーネントは、示された説明例とは異なっていてもよい。
【００３４】
例えば、バス・システムを用いて通信ファブリック２０２を実装することができ、システム・バス又は入力／出力バスのような１つ又は複数のバスを含むことができる。当然のことながら、バス・システムは、バス・システムに取り付けられた異なるコンポーネント又は装置間でのデータ転送を提供する、任意の適切なタイプのアーキテクチャを用いて実装することができる。さらに、通信ユニットが、モデム又はネットワーク・アダプタといった、データの送信及び受信に用いられる１つ又は複数のデバイスを含むことができる。さらに、メモリは、例えばメモリ２０６、又は、通信ファブリック２０２内に存在し得るインターフェース及びメモリ・コントローラ・ハブの中で見られるようなキャッシュであってもよい。
【００３５】
図１及び図２に示される例は、アーキテクチャ上の制限を意味するものではない。さらに、例示的な実施形態は、ソース・コードのコンパイルのため及びコードの実行のための、コンピュータで実装される方法、装置、及びコンピュータ使用可能プログラム・コードを提供する。示される実施形態に関して説明される方法は、図１に示されるデータ処理システム１００若しくは図２に示されるデータ処理システム２００、又は本説明を考慮すれば当業者には容易に明らかとなるようなその他のタイプのデータ処理システム及び／又はコンピュータ・デバイスのような、データ処理システムにおいて実施することができる。
【００３６】
例示的な実施形態は、サンプリングの時点で割込みされた各仮想マシンからサンプルを取得させることによって、１つ又は複数のプロセッサの多重仮想マシンから同時に効率的な方式でコール・スタック情報をサンプリングするための、コンピュータ実装方法、装置、及びコンピュータ使用可能プログラム・コードを提供する。さらに、例えばプロファイラ機構内の種々のカウンタその他を用いて、統計情報を収集して、データ処理システムの実行環境の様々な領域でスレッドにより消費される時間に関する統計情報を提供することができる。
【００３７】
例示的な実施形態の機構は、同時に複数のプロセッサ及び多重仮想マシンについてコール・スタック情報のサンプルを取得するように動作するが、最初は、１つ又は複数のプロセッサ及び単一の仮想マシンに関して、どのようにそうしたコール・スタック情報のサンプリングを実施することができるのかを理解することが最良である。従って、この説明は、最初に単一の仮想マシン及び１つ又は複数のプロセッサ上で実行されるスレッドに関するコール・スタック情報をサンプリングする方法の例を提供し、その後、例示的な実施形態に従い、これをどのように拡張して複数のプロセッサ及び多重仮想マシンについてのコール・スタック情報の同時サンプリングとすることができるかを示すことにする。
【００３８】
図３は、例示的な実施形態による、処理中の状態を識別するために用いられるコンポーネントを示す例示的な図である。この図示された例においては、コンポーネントは、図２のデータ処理システム２００のようなデータ処理システムで見られるハードウェア及びソフトウェア・コンポーネントの例である。
【００３９】
図示された例では、プロセッサ・ユニット３００は、オペレーティング・システム３０４に送られる割込み３０２を生成することができ、プロセッサ・ユニット３００内の別のプロセッサは、同じくオペレーティング・システム３０４に送られる割込み３０３を生成することができる。これらの割込みの結果として、オペレーティング・システム３０４によって生成され、デバイス・ドライバ３０８に送られる、ルーチン又は関数の呼び出し３０６が生じ得る。オペレーティング・システム３０４のようなオペレーティング・システムがプロセッサからの割込みに基づいて呼び出し３０６のような呼び出しを生成できるようにするための種々の機構が存在する。そうした機構の例として、割込みハンドラ、即ち特定の割込み条件を処理するように設計されたコンピュータ・コードの一部をオペレーティング・システム３０４に登録し、割込み３０２及び／又は３０３が生じたときに通知させるようにすること、又はデバイス・ドライバ３０８に割込みベクトルをフック（直接処理）させて、割込み３０２又は３０３のいずれかが生じたときにデバイス・ドライバ３０８が制御を獲得するようにすることが挙げられる。
【００４０】
デバイス・ドライバ３０８が、呼び出し３０６を受信し、サンプルを取得すべきであると決定すると、デバイス・ドライバ３０８は、コール・スタックをサンプリングすべきスレッドのスレッド識別子（ＴＩＤ）などの情報を選択されたサンプリング・スレッド（図示せず）のための作業領域３１１に置く。即ち、プロファイラ３１８の各サンプリング・スレッドについて別々の作業領域３１１が存在することができ、情報は、実行環境におけるコンピュータ・コードの実行をプロファイリングするためのトレース・データをサンプリングするのに用いられるプロファイラ３１８の適切なサンプリング・スレッドのための適切な作業領域３１１に置かれる。デバイス・ドライバ３０８は、さらに、プロファイラ３１８の対応するサンプリング・スレッドに信号を送り、スレッド３１０内の対象スレッドについてのコール・スタック情報を収集するようサンプリング・スレッドに命令する。これらの例では、対象スレッドは、デバイス・ドライバ３０８に対するオペレーティング・システム呼び出し３０６を生じさせた割込み３０２又は３０３を生成した処理ユニット３００のプロセッサ上で実行されていたスレッドである。
【００４１】
デバイス・ドライバ３０８から信号を送られたサンプラ・スレッドは、データ領域３１４内の対応する作業領域３１１を確認し、その特定のサンプリング・スレッドがどの作業を実施すべきかを決定する。これらの例では、作業領域３１１は、割込みされたスレッドについてのコール・スタック情報の取得に必要な作業を識別することができる。あるいは、デバイス・ドライバ３０８によって作業領域３１１に置かれた特定の情報に応じて、サンプル・スレッドは、カウンタのインクリメント、カウンタ値の読み出し、統計量の生成などといった他の動作を実行することができる。
【００４２】
１つの例示的な実施形態において、スレッド３１０内のサンプリング・スレッドは、仮想マシン３１６からコール・スタック情報を収集する作業を実施し、この仮想マシン３１６は、１つの例示的な実施形態において、Ｊａｖａ（商標）仮想マシン（ＪＶＭ）である。例示的な実施形態は、ＪＶＭからコール・スタック情報を取得するという状況で説明されるが、例示的な実施形態はそのように限定されるものではない。それどころか、コール・スタック情報の収集は、特定の実装に応じて、他の仮想マシン、又は仮想マシン内にない他のアプリケーションに関して実施することができる。
【００４３】
プロファイラ３１８は、１つの例示的な実施形態において、時間ベース・コンテキスト・サンプリング・プロファイラ・アプリケーションである。プロファイラ３１８内の選択されたサンプリング・スレッドは、作業領域３１１内に配置された情報を用いて、コール・スタックを取得すべきスレッドを決定する。例えば、割込みされたスレッドについてのプロセス識別子（ＰＩＤ）及びスレッド識別子（ＴＩＤ）を作業領域３１１に書き込み、それにより、サンプリング・スレッドに対して、どのプロセスのどの実行スレッドがサンプリングの対象であるのかを識別することができる。ＴＩＤにより識別された実行スレッドについてのコール・スタック情報を取得し、サンプリング・スレッドにより処理して、プロファイラ３１８により割り当てられ管理されるデータ領域３２０内にコール・ツリー３１７を作成することができる。コール・ツリー３１７は、コール・スタック情報を含み、かつ、割込み及びコール・スタックのサンプリングの時点で実行中のカレント・ルーチンである葉ノードについての付加的な情報をさらに含むことができる。
【００４４】
これらの説明的な実例における割込みの場合において、割込みハンドラは、対象スレッドが割り込みされたこと、即ち、対象スレッドが実行中でありその実行が割込みハンドラに分岐したことの判断を下し、遅延手続き呼び出し（ＤＰＣ）又は第２レベル割込みハンドラを始動して、プロファイラ３１８に信号を送ることができる。１つの実施形態では、割込みは、ポリシー３２６のような何らかの基準に基づいて定期的に生成される。これらの例においては、コール・スタック情報の収集のトリガは、指定されたプロセス内のスレッドが割り込みされる都度、実施することができる。言うまでもないが、他のイベントを用いて情報の収集を始動することもできる。例えば、ハードウェア・カウンタのオーバーフローに応じて定期的に情報を生成することができる。
【００４５】
プロファイラ３１８は、ある期間にわたって収集されたコール・スタック情報に基づくレポート３２２を生成することができる。時間ベース・サンプリングは、サンプルが取得された時点でコードが実行されていたルーチンにおいて消費されたサイクルの正確な推定を与え、また、サンプルが取得されたコードに到達するために取られた経路についても正確な推定を与える。収集された情報に基づくレポートは、各ルーチンで消費された時間、並びに選択されたルーチンにより呼び出されたルーチンにおける累積時間についての合理的に正確な状況を描き出す。
【００４６】
図４は、１つの例示的な実施形態によるコール・スタック情報の取得に用いられるコンポーネントを示す例示的な図である。この例においては、データ処理システム４００は、プロセッサ４０２、４０４、及び４０６を含む。これらのプロセッサは、例えば図３のプロセッサ・ユニット３００に見られるようなプロセッサの例である。実行中、プロセッサ４０２、４０４、及び４０６の各々が自身の上で実行されているスレッドを有することができる。あるいは、１つ又は複数のプロセッサがアイドル状態であってもよく、アイドル・プロセッサ上ではスレッドは実行されていない。
【００４７】
図示された例では、割込みが発生したとき、ターゲット・スレッド４０８はプロセッサ４０２上で実行中であり、スレッド４１０はプロセッサ４０４上で実行中であり、スレッド４１２はプロセッサ４０６上で実行中である。この例の目的上、ターゲット・スレッド４０８がプロセッサ４０２上で割込みされたスレッドである。例えば、ターゲット・スレッド４０８の実行は、タイマー割込み又はハードウェア・カウンタのオーバーフローによって割込みすることができ、その場合には、カウンタの値は、指定された数のイベントの後で、例えば１００，０００個の命令が完了した後で、オーバーフローするようにセットされる。
【００４８】
割込みが生成されると、デバイス・ドライバ４１４は、サンプリング・スレッド４１６、４１８、及び４２０に信号を送る。これらのサンプリング・スレッドの各々は、プロセッサのうちの１つに関連付けられる。サンプリング・スレッド４１８はプロセッサ４０４に関連付けられ、サンプリング・スレッド４２０はプロセッサ４０６に関連付けられ、サンプリング・スレッド４１６はプロセッサ４０２に関連付けられる。デバイス・ドライバ４１４は、所定のサンプリング基準が満たされたとき、例えば上述のタイマー又はカウンタがオーバーフローしたときに、これらのサンプリング・スレッド４１６、４１８、及び４２０を起動する。これらの例において、デバイス・ドライバ４１４は、図３のデバイス・ドライバ３０８と同様のものである。
【００４９】
サンプリング・スレッド４１８及び４２０には信号が送られ、サンプリング・スレッド４１６に信号が送られるまではいかなる作業も行うことなくアクティブであること又は実行されることが許可される。即ち、サンプリング・スレッド４１６には、ターゲット・スレッド４０８についてのコール・スタック情報を取得する要求という作業が割り当てられるが、スレッド４１０及び４１２はまだ割込みされていないので、サンプリング・スレッド４１８及び４２０には作業が割り当てられない。サンプリング・スレッド４１８及び４２０は、プロセッサ４０４及びプロセッサ４０６がアイドル状態に入らないようにするためにアクティブにされる。こうすることで、全てのプロセッサが現時点でスレッドを実行してビジー状態となっているので、ターゲット・スレッド４０８はプロセッサ４０２から別のプロセッサに移動することはない。これらの例では、プロセッサ４０２、４０４、及び４０６を非アイドル状態にすることにより、ターゲット・スレッド４０８がプロセッサ４０２から別のプロセッサに移動することが回避される。
【００５０】
図示された例では、サンプリング・スレッド４１６は、仮想マシン４２２からコール・スタック情報を取得するという形で作業を割り当てられる。仮想マシン４２２は、図３のオペレーティング・システム３０４内で実行されている仮想マシン３１６と同様のものである。コール・スタック情報は、この例ではＪＶＭである仮想マシン４２２に対して適切な呼び出しを行うことにより取得することができる。図示された例において、ＪＶＭにアクセスするために用いられるインターフェースは、Ｊａｖａ  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ  Ｔｏｏｌｓ  Ｉｎｔｅｒｆａｃｅ（ＪＶＭＴＩ）である。このインターフェースにより、コール・スタック情報の収集が可能になる。コール・スタックは、例えば、異なるスレッド又はメソッドについての使用カウント（ｕｓａｇｅ  ｃｏｕｎｔ）を含む標準的なツリーとすることができる。ＪＶＭＴＩは、Ｊａｖａ  ５ソフトウェア開発キット（ＳＤＫ）バージョン１．５．０で入手可能なインターフェースである。Ｊａｖａ  ｖｉｒｔｕａｌ  ｍａｃｈｉｎｅ  ｐｒｏｆｉｌｉｎｇ  ｉｎｔｅｒｆａｃｅ（ＪＶＭＰＩ）は、Ｊａｖａ  ２プラットフォーム標準版（Ｊ２ＳＥ）ＳＤＫバージョン１．４．２で入手可能である。これら２つのインターフェースは、プロセス又はスレッドがＪＶＭに対するツール・インターフェースの形でＪＶＭから情報を取得することを可能にする。これらのインターフェースの説明はＳｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ，Ｉｎｃ．から入手可能であるので、これらのインターフェースについてのこれ以上の説明はここでは提示しない。例示的な実施形態によれば、どちらかのインターフェース、又はＪＶＭに対する他のいずれかのインターフェースを用いて、１つ又は複数のスレッドについてのコール・スタック情報を取得することができる。
【００５１】
サンプリング・スレッド４１６は、処理のために、プロファイラ４２４にコール・スタック情報を提供する。プロファイラ４２４は、サンプリングの時点で仮想マシン４２２から取得されたコール・スタック情報から、コール・ツリーを構築する。コール・ツリーは、コール・スタック情報をコール・スタック情報の中で識別されるメソッド及び／又は関数への出入について解析することにより構築することができる。このコール・ツリーは、図３のプロファイラ３１８により、図３のデータ領域３２０の中のツリー３１７として、又は別個のデータ領域の中の別個のファイルとして、格納することができる。
【００５２】
図５は、例示的な実施形態の機構を用いて生成することができるコール・ツリーの例示的な図である。コール・ツリー５００は、例えば図３のコール・ツリー３１７と同様のコール・ツリーの例である。コール・ツリー５００は、図３のプロファイラ３１８のようなアプリケーションにより、１つ又は複数のサンプリング・スレッドを用いて収集されたコール・スタック情報に基づいて作成及び修正される。図５に示される例示的なコール・ツリー５００において、コール・ツリー５００は、ノード５０２、５０４、５０６、及び５０８と、コール・ツリー５００内のどのノードがその他のどのノードを呼び出すのかを示すノード間のアークとで構成される。図示された例では、ノード５０２はメソッドＡに入ることを表し、ノード５０４はメソッドＢに入ることを表し、ノード５０６及びノード５０８はそれぞれ、メソッドＣ及びメソッドＤに入ることを表す。
【００５３】
ここで図６を参照すると、１つの例示的な実施形態による、コール・ツリーのノード内の情報を示す図が示される。エントリ６００は、仮想マシンのコール・スタックをサンプリングするサンプリング・スレッドにより取得されるトレース情報に基づいて生成される、図５のコール・ツリーのようなコール・ツリーのノード５０２のようなノード内の情報の例である。この例では、エントリ６００は、メソッド／関数識別子６０２と、ツリー・レベル（ＬＶ）６０４と、サンプル６０６とを含む。メソッド／関数識別子６０２は、例えば、ノードが表すメソッド又は関数の名を含む。ツリー・レベル（ＬＶ）６０４は、コール・ツリー内における特定のノードの階層的ツリー・レベルを識別する。例えば、再び図５を参照すると、エントリ６００が図５のノード５０２についてのものである場合、ツリー・レベル６０４は、このノードが根ノードであることを示す。
【００５４】
コール・ツリーのノードを用いて、プロセッサ・ユニット３００、オペレーティング・システム３０４、仮想マシン３１６などを含む実行環境において図３のスレッド３１０を用いてコンピュータ・プログラムの実行をサンプリングした結果を示す図３のレポート３２２のような、レポートを生成することができる。レポートは、例えばコンピュータ・プログラムの実行が比較的大量の時間を消費している領域を識別するための、コール・ツリー及びそのノードの解析とすることができる。レポートは、実行環境内でコンピュータ・プログラムが実行される方式を視覚化するための機構を提供することができる。レポートの視覚化機構は、個々のルーチンについてのフラット・プロファイル、即ち特定のルーチンの実行時間の量と、ルーチンが呼び出した全てのルーチンで消費された時間の集計とを含むことができる。他のレポートは、各ルーチンの呼び出し元、及びそのルーチンが呼び出したルーチン、並びに、ルーチンとそのルーチンが呼び出したルーチンへの経路を識別するための完全なコール・スタックを識別することができる。
【００５５】
ここで図３に戻ると、プロファイラ３１８のサンプル・スレッドに信号が送られると、プロファイラ３１８の対応するサンプラ・スレッドは、仮想マシン・インターフェース、例えばＪＶＭＴＩ及び／又はＬＶＭＰＩを介して、対象となる各スレッドについてコール・スタックを取り出すことを要求する。取り出された各コール・スタックはプロセス又は仮想マシンに特有のコール・ツリー内に「ウォークされる（ｗａｌｋｅｄ）」、即ち記録される。これは典型的には、ロッキングを回避するため、及び改善された性能を与えるためにスレッドによって記録される。取り出されたコール・スタックがツリー内にウォークされた後で、計量値（ｍｅｔｒｉｃ）、この場合にはサンプルのカウントが、葉ノード内のサンプル・ベースに追加される。デバイス・ドライバ３０８によって提供されるサンプル又は計量値に対する変更がその都度、コール・ツリーの葉ノードのベース計量値に追加される。これらの計量値は、例えば、特定のコール・スタック・シーケンスの発生のサンプルのカウントを含むことができる。他の実施形態において、コール・スタック・シーケンスを単に記録することができる。
【００５６】
図７は、１つの例示的な実施形態による、ターゲット・スレッドについてのコール・スタック情報を取得するためのプロセスの例示的なフローチャートである。図７において示されるプロセスは、例えば図４のデバイス・ドライバ４１４のようなソフトウェア・コンポーネントに実装することができる。
【００５７】
プロセスは、監視されるイベントを検出することにより開始する（ステップ７００）。１つの例示的な実施形態において、この監視されるイベントは、例えば、プロセッサによる割込みが発生したことを示す、オペレーティング・システムからの呼び出しとすることができる。ターゲット・スレッド、即ち監視されるイベントが発生したときに実行中であったスレッドが識別される（ステップ７０２）。サンプリング・スレッドの各々のための作業領域に、プロファイラのサンプリング・スレッドに対応するそれぞれのプロセス及びスレッド識別子を識別する情報が書き込まれ、その後、各サンプリング・スレッドに信号が送られる（ステップ７０４）。
【００５８】
ステップ７０４において、信号は、イベントが発生したときに対象となるターゲット・スレッドが実行されていたプロセッサに関連付けられたサンプリング・スレッドのみに送られるのではなく、全てのサンプリング・スレッドに送られる。対象となるターゲット・スレッドが実行されていたプロセッサに関連付けられていないサンプリング・スレッドについては、後述するように、これらのサンプリング・スレッドはスピン状態に入り、特定のサンプリングについてのいかなるコール・トレース情報も生成しない。全てのサンプリング・スレッドへの信号送信は、アイドル状態のプロセッサが存在しないように保証するために行われる。プロセッサがアイドル状態に入ること又はアイドル状態のままでいることを防止することにより、これらの例示的な実施形態においてターゲット・スレッドの移行又は移動が回避される。
【００５９】
その後、対象となるターゲット・スレッドについて、コール・スタック情報の収集が開始され（ステップ７０６）、その後プロセスは終了する。上述のように、コール・スタック情報の収集は、例えば、ＪＶＭのＪＶＭＴＩ及び／又はＪＶＭＰＩインターフェースを用いて実施することができる。
【００６０】
次に図８を参照して、１つの例示的な実施形態による、コール・ツリーを生成するためのスレッドにおけるプロセスのフローチャートが提供される。図８に示されるプロセスは、例えば図４のサンプリング・スレッド４１６のようなサンプリング・スレッドに実装することができる。従って、図８に示されるプロセスは、仮想マシンから対象となるターゲット・スレッドについてのコール・スタック情報を収集するサンプリング・スレッドを用いて、図３のプロファイラ３１８のようなプロファイラにおいて実施することができる。
【００６１】
プロセスは、ターゲット・スレッドに関する情報をサンプリングするという通知を受信することにより開始する（ステップ８００）。例えば、この通知は、サンプリング・スレッドにコール・スタック情報を収集させるという、デバイス・ドライバからの信号送信とすることができる。その後、例えば、ＪＶＭＴＩ及び／又はＪＶＭＰＩなどの仮想マシン・インターフェースを介して、仮想マシンからコール・スタック情報が取り出される（ステップ８０２）。例えば、コール・スタック情報をウォークさせて、コール・ツリーを構成するノードとノード間のアークとを生成することなどにより、コール・スタック情報から出力コール・ツリーが生成される（ステップ８０４）。図５のコール・ツリー５００は、サンプリング・スレッドにより生成することができる出力コール・ツリーの例である。
【００６２】
最後に、出力コール・ツリーがデータ領域に格納され（ステップ８０６）、その後プロセスは終了する。これらの例において、コール・ツリーは、図３のデータ領域３１４のようなデータ領域に格納され、１つ又は複数のレポートを生成するための基礎とすることができる。
【００６３】
図９は、１つの例示的な実施形態による、割込みの受信に応答してプロセッサ上のスレッドに通知するためのプロセスのフローチャートである。図９に示されるプロセスは、例えば図４のデバイス・ドライバ４１４のようなソフトウェア・コンポーネントに実装することができる。
【００６４】
図９に示されるように、プロセスは、割込みなどのイベントを待機することにより開始する（ステップ９００）。イベントが発生すると、例えば割込みが発生すると、カレント・プロセッサが識別される（ステップ９０２）。この例では、カレント・プロセッサは割込みを受信したプロセッサである。ターゲット・スレッドは、割込みの時点でカレント・プロセッサ上で実行中であったスレッドである。ターゲット・スレッドは、コール・スタック情報が所望される対象スレッドである。
【００６５】
カレント・プロセッサのための作業が存在するかどうかについての判断が行われる（ステップ９０４）。ステップ９０４は、図３のポリシー３２６のようなポリシーを用いて、デバイス・ドライバにより実施することができる。割込みが発生する都度コール・スタック情報が所望されるとは限らない。コール・スタック情報の収集をトリガする「イベント」は、割込みの発生と条件の存在の組み合わせとすることができる。例えば、特定のユーザ又はユーザ・タイプがデータ処理システムにログインするなどのある種のユーザ状態が発生するまで、コール・スタック情報は所望されないものとすることができる。別の例として、ユーザがあるプロセスを開始するまで、又はあるアクションを始動するまで、コール・スタック情報が所望されないようにすることができる。作業が存在しない場合には、プロセスはステップ９００に戻り、別の割込みを待つ。
【００６６】
カレント・プロセッサのための作業が存在する場合は、プロセスは作業を割り当てる（ステップ９０６）。図３の作業領域３１１のような作業領域に作業割当てを配置することにより、作業を割り当てることができる。これらの例において、作業は、割込み発生時に対象スレッドが実行されていたプロセッサに関連付けられたサンプリング・スレッドに割り当てられる。非カレント・プロセッサが選択され（ステップ９０８）、選択されたプロセッサ上のスレッドに通知される（ステップ９１０）。ステップ９１０において、選択されたプロセッサのためのサンプリング・スレッドに、そのサンプリング・スレッドを起動するための信号が送信される。
【００６７】
その後、通知する非カレント・プロセッサがさらに存在するかどうかについての判断が行われる（ステップ９１２）。通知のための非カレント・プロセッサがさらに存在する場合には、プロセスはステップ９０８に戻る。そうでない場合は、カレント・プロセッサ上のスレッドに通知され（ステップ９１４）、その後プロセスは終了する。カレント・プロセッサのためのサンプリング・スレッドは、これらの例では最後に通知されるが、例示的な実施形態はそのように限定されるものではない。それどころか、カレント・プロセッサ上のスレッドに最初に通知することができる。
【００６８】
ここで図１０を参照すると、１つの例示的な実施形態により、サンプリング・スレッドのためのプロセスのフローチャートが示される。図１０に示されるプロセスは、図３のプロファイラ３１８のようなプロファイラ・アプリケーションと関連して、図４のサンプリング・スレッド４１６、サンプリング・スレッド４１８、又はサンプリング・スレッド４２０のようなサンプリング・スレッドにより実装することができる。
【００６９】
図１０に示されるように、プロセスは、通知を待機することにより開始する（ステップ１０００）。通知を受け取ると、サンプリング・スレッドに作業が割り当てられたかどうかについての判断が行われる（ステップ１００２）。作業が割り当てられたかどうかの識別は、例えば図３の作業領域３１１のようなメモリ位置又はデータ領域を参照し、そこに、プロセス識別子、スレッド識別子、及び実施すべき作業のタイプ、例えば収集するトレース情報のタイプなどを示すその他の情報が存在するかどうかを判定することによって行われる。例示的な実施形態の目的上、作業領域におけるプロセス識別子及びスレッド識別子の存在は、それ自体が、その特定のプロセス識別子及びスレッド識別子についてのコール・スタック情報を取り出すべきであるという指示となる。１つの例示的な実施形態において、図３のデータ領域３１４内で異なるサンプリング・スレッドに作業を割り当てることができる。
【００７０】
作業が割り当てられていなかった場合には、プロセスは、ステップ１０１０に続く。一方、作業が割り当てられていた場合には、割り当てられた作業が実施される（ステップ１００４）。これらの例では、作業は、ターゲット・スレッドについてのコール・スタック情報を取得することである。
【００７１】
次いで、作業が完了したかどうかについて判断が行われる（ステップ１００６）。作業が完了していない場合には、プロセスはステップ１００４に戻る。そうでない場合、作業が完了しているならば、作業が完了したことの指示が作成される（ステップ１００８）。この指示は、例えば図３の作業領域３１１のような作業領域内に作成することができる。この指示により、他のサンプリング・スレッドは、コール・スタック情報が収集されたことを知ることができるようになる。
【００７２】
作業を完了したスレッド、又は作業が割り当てられなかった（ステップ１００２）スレッドについては、プロセスは、スレッドの全てにより実施される全ての作業が完了するまで、スピン状態に入る（ステップ１０１０）。スピン状態が完了すると、プロセスはステップ１０００に戻り、別の通知を待機する。ステップ１０１０の実施において、サンプリング・スレッドは、スピン−待機ループを実行することができる。このタイプのループは、メモリ位置を読み取り、次いでそれを特定の値と比較する、短いコード・セグメントである。メモリ位置の内容がこの値と等しい場合は、ループは実行を完了する。これらの例において、メモリ位置は作業領域である。サンプリング・スレッドによる作業が完了したことの指示は、これらの例においては、スピン状態を停止するのに必要な特定の値である。そうでなければ、メモリ位置が再度読み取られ、再び比較が実施される。これらの例において、スピン状態は作業が完了したことを示す指示が発生したときに終了する。この機構により、コール・スタック情報が収集されるまでサンプリング・スレッドがアクティブであり続けることが可能になる。
【００７３】
上記の機構は、プロファイラが、一度に１つのサンプリング・スレッドを使用して、一度に１つの実行スレッドについてのコール・スタック情報を実行環境の単一の仮想マシンと関連して収集することを可能にする。どの一回でも、割込みを生成したプロセッサに関連付けられたサンプリング・スレッドのみが実際に使用され、トレース情報が収集され、即ちコール・スタックがサンプリングされる。割込みされたプロセッサに対応するサンプリング・スレッドがコール・スタック情報を収集している間、コール・スタック情報の収集中にスレッドが移行することを回避するために、他のサンプリング・スレッドを起動させて単にスピン状態に置くことができる。しかしながら、これらの他のサンプリング・スレッドに関してのトレース情報は収集されない。
【００７４】
更なる例示的な実施形態において、上記のように、データ処理システムは、複数の仮想マシンを含むことができ、複数のプロセッサ上のスレッドはこれらの仮想マシンの１つ又は複数にアクセスする。この更なる例示的な実施形態において、トレース情報のサンプリング、例えば１つ又は複数の仮想マシンのコール・スタックのサンプリングを要するイベントが発生する都度、全てのプロセッサの全てのサンプリング・スレッドが起動される。サンプリング・スレッドの各々に関して、対応する実行スレッドの実行状態についての判断が行われる。この判断は、そのサンプリング・スレッドがトレース情報を収集すべきであるのか、ループ又はスピン状態に置かれるべきなのか、又は単にデバイス・ドライバのサンプリング統計量情報を更新すべきなのかを決定する。１つの実施形態において、各プロセッサ上で割込みが生成され、各割込みハンドラは、全てのプロセッサが割込みされるまで、又は遅延手続き呼び出し（ＤＰＣ）若しくは第２レベル割込みハンドラが待ち行列に入れられるまでループし、そしてＤＰＣ又は第２レベル割込みハンドラは、そのプロセッサのＤＰＣ又は第２レベルハンドラが実行中であると判断されるまでループする。代替的な実施形態において、サンプリング割込みが１つのプロセッサ上で発生すると、プロセッサ間割込み（ＩＰＩ）が生成され、他のプロセッサに割込みを強制する。いずれの場合でも、全てのプロセッサがサンプルの処理を続行する準備ができたと判断されると、論理は、いずれかのサンプラ・スレッドがサンプリングを処理するようポストされる必要があるかどうかについて判断を行う。どのサンプラ・スレッドもサンプルを処理するようポストされる必要がない場合には、カウントが更新される。例えば、各サンプリング・スレッドについて、対応する実行スレッドが対象仮想マシン内で現在実行中である場合、即ち対象仮想マシンにアクセス中である場合には、その仮想マシン及び実行スレッドについてのトレース情報が対応するサンプリング・スレッドにより収集される。実行スレッドは対象仮想マシン内で現在実行されていないが、対象仮想マシン内で実行中の、実行スレッドに関連付けられた他のサンプリング・スレッドが存在する場合には、他のサンプリング・スレッドによりトレース情報が収集されるまで、カレント・サンプリング・スレッドをループ又はスピン状態に置くことができる。これらの状態のどちらも存在しない場合には、デバイス・ドライバのサンプリング統計量、例えばカウンタ値が単に更新される。これらのデバイス・ドライバのサンプリング統計量は、他の状態が検出されたときにも同様に更新することができる。
【００７５】
例えば、ＪＶＭは、ＪＶＭにアタッチされたプロファイラによって監視されるように登録される。プロファイラは、あるＪＶＭを監視すべきである判断すると、各プロセスにつき１つのサンプリング・スレッドを作成し、そのＪＶＭをデバイス・ドライバによりサポートされるインターフェースを介して登録する。サンプルが取得されると、デバイス・ドライバは登録されたＪＶＭの各々の中を巡回（ｒｏｔａｔｅ）してカウントを更新し、特定のサンプラ・スレッドへの通知が必要であるかどうかを判断する。いずれかのサンプラ・スレッドに通知が必要である場合には、１プロセッサにつき１つのサンプラ・スレッドに、割込みされたスレッドについてのコール・スタックを取り出すように通知するか、又は全てのサンプラ・スレッドが作業を完了するまでスピン状態で待機するように通知する。サンプリング・スレッドによる完了の判断は、全てのサンプラ・スレッド、即ち全ての登録されたＪＶＭを、進行中の作業についてチェックすることにより行うことができる。全てのサンプラ・スレッドが作業を完了したと判断されると、サンプラ・スレッドはブロック状態に入り、新しい作業が割り当てられるのを待つ。
【００７６】
図１１は、例示的な一実施形態による、多重仮想マシンと関連した多重プロセッサにより実行される多重スレッドに関してコンピュータ・プログラムのプロファイリングを実施するためのシステムの例示的なブロック図である。図１１に示されるように、各サンプリング・スレッド１１１６−１１２０は、データ処理システム１１００のプロセッサ１１０２−１１０６のうちの１つの上で実行される対応するスレッド１１０８−１１１２に関連付けられる。これらの実行スレッド１１０８−１１１２は、データ処理システム１１００の１つ又は複数の仮想マシン１１２２−１１２６にアクセスすることができる。さらに、サンプリング・スレッド１１１６−１１２０は、対応する仮想マシン・インターフェース１１３２−１１３６を介して、仮想マシン１１２２−１１２６にアクセスすることができる。プロファイラ１１４０は、上述の方式と同様の方式で動作して、対応するサンプリング・スレッド１１１６−１１２０を用いて、対象仮想マシン１１２２−１１２６の各々のコール・スタック情報のようなトレース情報を収集することができる。プロファイラ１１４０は、サンプリング・スレッド１１１６−１１２０から収集されたトレース情報に基づき、１つ又は複数のトレース・データ・ファイル及びコール・ツリーを生成することができる。
【００７７】
デバイス・ドライバ１１１４は、図４のデバイス・ドライバ４１４と同様に、サンプリング・スレッド１１１６−１１２０に信号を送って、これらのサンプリング・スレッド１１１６−１１２０を起動させ、トレース情報の収集を行うべきかどうか判断させる。加えて、デバイス・ドライバ１１１４は、複数のサンプリング統計量カウンタ１１５０−１１５４を保持することができ、これらは、サンプリング・スレッド１１１６−１１２０が起動される都度、実行スレッド１１０８−１１１２の実行状態に基づきインクリメントされる。プロファイラ１１４０は、これらのカウンタ１１５０−１１５４にアクセスして、スレッド１１０８−１１１２の実行のサンプリングについての統計情報を取得し、トレース・データ・ファイル及びレポートの生成の際にこの統計情報を用いることができる。
【００７８】
上述のように、プロセッサ１１０２−１１０６によりサンプリング割込みが生成される都度、割込みはオペレーティング・システムに送られ、次にオペレーティング・システムがデバイス・ドライバ１１１４に対する呼び出しを生成する。デバイス・ドライバ１１１４は、プロファイラ１１４０のサンプリング・スレッド１１１６−１１２０に信号を送って、これらのサンプリング・スレッド１１１６−１１２０を起動させることができる。これに応答して、各サンプリング・スレッド１１１６−１１２０は、対応する実行スレッド１１０８−１１１２の状態を判断し、この状態に基づいて、その実行スレッドがアクセスしている仮想マシンからトレース情報を収集すべきか否かを判断する。例えば、それぞれのサンプリング・スレッド１１１６−１１２０の作業領域に１つ又は複数の対象仮想マシン１１２２−１１２６の識別子を書き込むことができる。
【００７９】
必ずしもデータ処理システムの全ての仮想マシン１１２２−１１２６を対象仮想マシンとして指定する必要はない。例えば、場合によっては、単一の仮想マシン１１２２のみをプロファイラ１１４０の対象とすることができる。１つの仮想マシン１１２２のみが対象であるとしても、各実行スレッド１１０８−１１１２が同一の仮想マシン１１２２にアクセスすることも可能であり、又は、多重実行スレッド１１０８−１１１２が同一の仮想マシン１１２２と関連して実行され、又はこれにアクセスすることができるように、同一の仮想マシン１１２２のインスタンスを実行スレッド１１０８−１１１２の多重のインスタンスと関連して提供することもできる。このような場合には、例示的な実施形態の機構は、これらの実行スレッドの各々についてトレース情報を収集するが、このトレース情報を総計するか、又はその他の手法でトレース情報を組み合わせることができる。
【００８０】
サンプリングの時点で対象仮想マシン１１２２−１１２６内で実行中の関連付けられた実行スレッド１１０８−１１１２を有する各サンプリング・スレッド１１１６−１１２０について、コール・スタック情報のようなトレース情報が収集され、プロファイラ１１４０に提供される。仮想マシン１１２２−１１２６内で実行中ではない関連付けられた実行スレッド１１０８−１１１２を有するサンプリング・スレッド１１１６−１１２０については、そうしたトレース情報は収集されない。それどころか、少なくとも１つの他のサンプリング・スレッド１１１６−１１２０がトレース情報を収集すべきである判断された場合には、対象仮想マシン１１２２−１１２６内で実行中ではないサンプリング・スレッドは、他のサンプリング・スレッドがそのトレース情報の収集を終えるまで、スピン又はループ状態に置くことができる。
【００８１】
どちらの事例でも、又はどちらの事例も起きなかった場合でも、デバイス・ドライバ１１１４は、実行スレッド１１０８−１１１２の判断された条件に基づき統計量カウンタ１１５０−１１５４を更新することができる。統計量カウンタ１１５０−１１５４に関連付けられる特定の条件は、様々なタイプとすることができる。例えば、１つの統計量カウンタ１１５０をガベージ・コレクション条件に関連付けることができ、その場合、サンプリング・スレッド１１１６−１１２０が、対応する実行スレッド１１０８−１１１２がガベージ・コレクション動作に関与していると判断したときには、統計量カウンタ１１５０がインクリメントされる。更なる例として、別の統計量カウンタ１１５２は、実行スレッドが単に対象仮想マシンの外部のプロセスを実行中であると判断される条件に関連付けることができ、サンプリング・スレッド１１１６−１１２０が、その対応する実行スレッド１１０８−１１１２が対象仮想マシンの外部で実行中であると判断すると、それに対応してインクリメントすることができる。
【００８２】
更に別の例として、第３の統計量カウンタ１１５４は、実行スレッドが対象仮想マシン内で実行中であるという条件に関連付けることができる。従って、サンプリング・スレッド１１１６−１１２０が、その対応する実行スレッドが対象仮想マシン１１２２−１１２６内で実行中であると判断すると、カウンタ１１５４をデバイス・ドライバ１１１４によりインクリメントすることができる。その他のタイプの実行スレッド１１０８−１１１２の実行条件に関連付けられた他のカウンタを、カウンタ１１５０−１１５４に追加して、又はこれら代わりに用いることができることを認識されたい。
【００８３】
プロファイラ１１４０は、レポートを生成するときに、これらのカウンタ１１５０−１１５４にアクセスし、これらを用いてレポートに実行統計量を提供することができる。例えば、カウンタ１１５０のカウント値は、スレッドがガベージ・コレクション動作の実行に消費する時間の相対量に関する情報を提供することができる。カウンタ１１５２のカウント値は、スレッドが対象仮想マシンの外部でプロセスを実行するのに消費する時間の相対量に関する情報を提供することができる。さらに、カウンタ１１５４のカウント値は、スレッドが対象仮想マシン内でプロセスを実行するのに消費する時間の相対量に関する情報を提供することができる。
【００８４】
このようにして、サンプリング・スレッド１１１６−１１２０に対応する実行スレッド１１０８−１１１２の実行状態に応じて、データ処理システムの対象となる１つ又は複数の仮想マシン１１２２−１１２６についてのトレース情報を同時に収集することができる。その結果、公知のプロファイリング・ツールの逐次的な手法に比べて、より正確なトレース情報をより効率的且つタイムリーな手法で収集することができる。その上、対象仮想マシン内で実行されている各実行スレッドについて、そのスレッドが元の割込みを生成したものであるか否かに関わりなくトレース情報を収集することができる。統計量カウンタを用いて、実行スレッドの状態についての情報を、その実行スレッドが元の割込みを生成したものであるか否かに関わりなく生成することができる。これらの統計量カウンタは、データ処理システムの実行環境の様々な部分で実行スレッドにより消費される時間についての識見を提供することができる。
【００８５】
このトレース情報及び統計量カウンタ情報に基づいて、プロファイラによってレポートを生成することができる。これらのレポートは、コール・スタック、特定のコード部分において消費される時間に関する統計的尺度などについての情報を提供することができる。トレース・レポートは、例示的な実施形態の特定の実装に応じて多数の異なる形式を取ることができる。そのようなレポートをポスト・プロセッサなどによる更なる処理に供し、最適化の候補となり得るコード部分、コードの訂正が必要な領域又は望ましい領域を有するコード部分などを識別するための、他のレポートを生成することができる。
【００８６】
１つの例示的な実施形態において、例示的な実施形態の機構を用いて収集されたトレース情報は、後で用いるためにトレース及び／又はレポート・データ・ファイルに格納することができることを認識されたい。別途のコンピュータ・コードの実行及びトレースを実施して、第２のトレース情報及び第２のトレース及び／又はレポート・データ・ファイルを生成することができる。これらの別途のコンピュータ・コードの実行及びトレースは次にポスト・プロセッサに提供され、ポスト・プロセッサは、トレース同士を比較して、修正を必要とする問題が存在するコンピュータ・コードの部分、又はより良好な性能のためにコンピュータ・コードを調整若しくは最適化することができる部分を識別することができる。そのような比較及び解析は、調整を行うことができる又は行うべきである問題又は領域を示す所定の基準を満たす特定の性質又は条件を識別する規則に基づいて、ポスト・プロセッサによって自動的に実施することができる。
【００８７】
図１２は、多重プロセッサ及び多重仮想マシンの多重スレッドがプロファイリングされる例示的な一実施形態による、サンプリング・スレッドの例示的な動作の概要を示すフローチャートである。図１２は、各サンプリング・スレッドについて逐次的に実行するものとして示されているが、実行スレッドの状態の判断は逐次的ではなくむしろ並列的に実施することができることを認識されたい。
【００８８】
図１２に示されるように、動作は、デバイス・ドライバがデータ処理システムのプロセッサの各々のためのサンプラ・スレッドの各々に対して信号を送ることにより開始する（ステップ１２１０）。次のサンプラ・スレッドが選択され（ステップ１２２０）、選択されたサンプラ・スレッドの対応する実行スレッドが、サンプリングの時点で対象仮想マシン内で実行中であるかどうかについての判断が行われる（ステップ１２３０）。対象仮想マシン内で実行スレッドが実行中であった場合、その仮想マシンについてのコール・スタック情報が取り出され、例えば統計量カウンタ内にあるデバイス・ドライバ統計量が更新される（ステップ１２４０）。次いで、処理すべきサンプリング・スレッドがそれ以上存在するかどうかについて判断が行われる（ステップ１２５０）。存在する場合には、動作はステップ１１２０に戻り、そうでない場合には、動作は終了する。
【００８９】
対象仮想マシン内で実行スレッドが実行中でない場合、トレース情報（例えばコール・スタック情報）を仮想マシンから取り出す必要があるいずれかの他のサンプリング・スレッドが存在するかどうかについて判断が行われる（ステップ１２６０）。存在する場合は、カレント・サンプリング・スレッドは、他のサンプリング・スレッドによってコール・スタックが取り出されるまで、ループ／スピン状態に置かれる。さらに、デバイス・ドライバ統計量が更新される（ステップ１２７０）。少なくとも１つの他のサンプリング・スレッドがコール・スタック情報を取り出すことを必要としない場合には、単にデバイス・ドライバ統計量を更新することができる（ステップ１２８０）。
【００９０】
このようにして、例示的な実施形態は、多重仮想マシンのためのサポートを有する時間ベース・コンテキスト・サンプリングのための機構を提供する。上記のように、例示的な実施形態は、完全にハードウェアの実施形態、完全にソフトウェアの実施形態、又はハードウェア要素とソフトウェア要素の両方を含む実施形態の形を取ることができることを認識されたい。１つの例示的な実施形態においては、例示的な実施形態の機構は、ファームウェア、常駐ソフトウェア、マイクロコードなどを含むがこれらに限定されないソフトウェア又はプログラム・コードに実装される。
【００９１】
プログラム・コードを格納及び／又は実行するのに適したデータ処理システムは、システム・バスを通じてメモリ要素に直接又は間接に接続される少なくとも１つのプロセッサを含む。メモリ要素は、プログラム・コードの実際の実行中に用いられるローカル・メモリと、大容量記憶装置と、実行中に大容量記憶装置からコードを取り出さなければならない回数を減らすために少なくとも幾つかのプログラム・コードの一時的な記憶場所を提供するキャッシュ・メモリとを含むことができる。
【００９２】
入出力デバイス即ちＩ／Ｏデバイス（キーボード、ディスプレイ、ポインティング・デバイスなどを含むがこれらに限定されない）は、システムに、直接的に、又は介在するＩ／Ｏコントローラを通じて結合することができる。ネットワーク・アダプタをシステムに結合して、データ処理システムを、介在する私設ネットワーク又は公衆ネットワークを通じて他のデータ処理システム又は遠隔のプリンタ若しくは記憶装置に結合できるようにすることもできる。モデム、ケーブル・モデム、及びイーサネット・カードは、現時点で利用可能なネットワーク・アダプタのタイプのうちのごく一部である。
【００９３】
本説明は、例示及び説明を目的として提示されており、網羅的であることも、開示された形態に限定することも、意図されていない。当業者には、多くの変更及び変形が明らかであろう。実施形態は、原理及び実際の用途を最も良く説明するために、並びに、種々の変更を伴う本発明の実施形態を当業者が検討される特定の用途に適したものとして理解できるように、選択され説明されたものである。
【符号の説明】
【００９４】
１００：コンピュータ
１０２：システム・ユニット
１０４：映像表示端末
１０６：キーボード
１０８：ストレージ・デバイス
１１０：マウス
２００、４００、１１００：データ処理システム
２０２：通信ファブリック
２２０：コンピュータ・プログラム製品
５００：コール・ツリー
５０２、５０４、５０６、５０８：ノード
６００：エントリ
【図１】
0005520371.tif 000002
【図２】
0005520371.tif 000003
【図３】
0005520371.tif 000004
【図４】
0005520371.tif 000005
【図５】
0005520371.tif 000006
【図６】
0005520371.tif 000007
【図７】
0005520371.tif 000008
【図８】
0005520371.tif 000009
【図９】
0005520371.tif 000010
【図１０】
0005520371.tif 000011
【図１１】
0005520371.tif 000012
【図１２】
0005520371.tif 000013