JP5489884B2 - 命令実行装置、命令実行方法、及び命令実行プログラム - Google Patents

命令実行装置、命令実行方法、及び命令実行プログラム Download PDF

Info

Publication number
JP5489884B2
JP5489884B2 JP2010148579A JP2010148579A JP5489884B2 JP 5489884 B2 JP5489884 B2 JP 5489884B2 JP 2010148579 A JP2010148579 A JP 2010148579A JP 2010148579 A JP2010148579 A JP 2010148579A JP 5489884 B2 JP5489884 B2 JP 5489884B2
Authority
JP
Japan
Prior art keywords
instruction
specific
memory area
unit
execution
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2010148579A
Other languages
English (en)
Other versions
JP2012014312A (ja
Inventor
拓 井上
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2010148579A priority Critical patent/JP5489884B2/ja
Priority to US13/165,850 priority patent/US20120005460A1/en
Publication of JP2012014312A publication Critical patent/JP2012014312A/ja
Application granted granted Critical
Publication of JP5489884B2 publication Critical patent/JP5489884B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45516Runtime code conversion or optimisation
    • G06F9/45525Optimisation or modification within the same instruction set architecture, e.g. HP Dynamo

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Description

本発明は、コンピュータ上で所定の実行系により実行される命令を含む命令列内の特定の命令の実行を監視するために、メモリ領域を必要とする付加処理を行う技術に関する。
従来、トレース単位での動的コンパイルやバイナリ変換を行う処理系において、トレースを生成するために、プログラムの実行を監視することがなされている。
例えば、非特許文献1は、ループの実行回数を監視するために、プログラム内の後方へのジャンプ命令の各々にカウンタ変数を割り付け、それぞれのジャンプの実行回数をカウントする技術を開示する。非特許文献1に記載の技術によれば、カウンタ変数のアドレスは、後方へのジャンプの実行時にジャンプ命令のアドレスをキーとしてハッシュテーブルを参照することによって取得される。
また、非特許文献2は、監視対象のプログラムを書き換え、ジャンプ命令の飛び先をプロファイル用のコードに変更し、それによってカウンタの計算を行う技術を開示する。
また、動作中のプログラムの一部を書き換える技術に関して、特許文献1が存在する。特許文献1は、書き換え条件が成立すると、変更対象とされる旧プログラムの先頭に新プログラムが格納された新プログラム格納エリアのアドレスを書き込み、新プログラム格納エリアの末尾にジャンプ先アドレスとして旧プログラム格納エリアの次のアドレスを書き込む技術を開示する。
なお、以下に挙げる特許文献2は、ベース値とベース値からのオフセット値によってアドレスを求める手法についての背景技術として記載したものである。
特開平成9―244717号公報 特開2005―322232号公報
Vasanth Bala, Evelyn Duesterwald, Sanjeev Banerjia, "Dynamo: A Transparent Dynamic OptimizationSystem", ACM SIGPLAN Notices, Volume 35, pp.1-12, May 2000 Eli D. Collins, Barton P. Miller, "A Loop-aware Search Strategy forAutomated Performance Analysis", In High PerformanceComputing and Communications (HPCC-05), Sorrento, Italy, September 2005.
しかしながら、非特許文献1が開示する技術は、プログラムの挙動を変えることなくプログラムの実行を監視することを可能とするものの、ハッシュテーブル参照のオーバーヘッドが大きいという問題がある。一方、特許文献1や非特許文献2が開示する技術は、カウンタのアドレスを求めるためにハッシューブルを参照することを必要としないので、非特許文献1の技術と比較してオーバーヘッドが小さい。
しかし、特許文献1や非特許文献2が開示する技術は、元のプログラムを書き換えて他のコードに変更してしまうため、元のプログラムの挙動を変えてしまう。仮に、書き換えられた部分のコードを他の場所に退避させるとしても、今度は実行命令数の増大によって、プログラムの挙動が変わってしまう。また、これら技術では、元のプログラム言語で記述できる以上のことはできない。
この発明は、上記の問題点を解決するためになされたものであって、オーバーヘッドを低減し、かつ、プログラムの挙動を変えない、プログラムの実行を監視する技術を提供することを目的とする。
上記課題を解決するために、本発明の第1の態様においては、コンピュータ上で所定の実行系により実行される命令を含む命令列内に含まれる監視対象の特定の命令の実行に対して、メモリ領域を必要とする付加処理を行う命令実行装置であって、メモリ上に読み込まれた前記命令列内に含まれる前記特定の命令に対し、前記付加処理のためのメモリ領域を確保するメモリ確保部と、前記特定の命令を、確保した前記メモリ領域にコピーし、かつ、前記付加処理を行う専用命令及び前記メモリ領域の位置を特定する特定情報で置換する命令置換部と、前記命令列内の前記専用命令の読み出しに応答して、該専用命令と共に置換された前記特定情報から前記メモリ領域を取得し、該メモリ領域を用いて前記付加処理を実行する付加処理実行部と、取得された前記メモリ領域にコピーされた前記特定の命令を参照して、該特定の命令によりなされる処理と同じ処理を行う被置換命令実行部とを含む、命令実行装置を提供する。
好ましくは、前記付加処理部及び前記被置換命令実行部は、前記専用命令に応答して呼び出される、前記専用命令のハンドラとして実装される。
また好ましくは、前記実行系は、Java(R)仮想マシンであり、前記メモリ上に読み込まれた前記命令列は、1以上の前記特定の命令を含む、クラスファイルに含まれる各メソッドのバイトコード列である。そして前記メモリ確保部は、前記クラスファイルの前記メソッド毎に、前記メモリ領域を、前記1以上の特定の命令の数に等しい要素数からなる配列として確保し、確保した前記配列の位置情報を前記メソッドに関連付けて保存する。更に前記命令置換部は、バイトコード列内に含まれる前記1以上の特定の命令の各々を、前記配列の各要素にコピーし、かつ、前記専用命令及び前記特定の命令に割り当てられた前記配列のインデックス情報で置換する。
また好ましくは、前記特定の命令は後方へのジャンプ命令であり、前記メモリ領域を必要とする付加処理は、前記後方へのジャンプ命令の実行回数をカウントするカウンタ処理である。
更に好ましくは、前記配列のインデックス情報は、バイトコード列内の前記後方へのジャンプ命令のジャンプ先を示すオフセット情報と置換される。これに代えて、前記配列のインデックス情報は、前記専用命令の命令名に埋め込まれて前記バイトコード列内の前記特定の命令と置換されてもよい。
また好ましくは、前記メモリ確保部及び前記命令置換部を、前記特定の命令に応答して呼び出される、前記特定の命令のハンドラの一部として実装し、該特定の命令のハンドラは、前記特定の命令を処理すると共に、確保した前記メモリ領域の初期化を行う。
更に好ましくは、前記命令実行装置は、マルチスレッド環境下で動作し、前記特定の命令のハンドラは更に、1のスレッドの要求に基づく前記命令列内の前記特定の命令の読み出しに応答して、処理の実行の待機を要求する待機命令で前記特定の命令を置換し、該特定の命令を一時的な退避場所に格納する待機命令挿入部と、前記命令列内の前記特定の命令を実行中の他のスレッドの有無を確認する実行状態確認部とを含み、前記メモリ確保部は、前記特定の命令を実行中の他のスレッドが存在しないことを条件にその処理を開始し、前記命令置換部は、一時的な退避場所に格納された前記特定の命令を前記メモリ領域の前記他の一部にコピーし、かつ、前記バイトコード列内の前記待機命令を、前記専用命令及び前記特定情報で置換する。
以上、命令実行装置として本発明を説明したが、本発明は、コンピュータにより実行される、命令実行方法および命令実行プログラムとして把握することもできる。
本発明によれば、メモリ上に読み込まれた命令列内の監視対象の特定の命令は、付加処理を行う専用命令と該専用命令のための追加のメモリ領域の位置を特定する特定情報に置き換えられ、追加のメモリ領域にコピーされるので、追加のメモリ領域の位置を取得するのにハッシュテーブルを参照する必要がなく、オーバーヘッドを低減できる。また、本発明によれば、命令列内から専用命令が読み出されると、追加のメモリ領域を用いて付加処理が実行された後、該領域内の特定の命令を参照して特定の命令と同様の処理がなされるので、元のプログラムの挙動が変わらない。本発明のその他の効果については、各実施の形態の記載から理解される。
本発明に係る命令実行方法を適用可能なコンピュータ・システムの機能構成を示す構成図である。 本発明の第1の実施形態に係る命令実行装置200の機能ブロック図である。 本発明に係る命令実行装置によるバイトコードの書き換えの一例を示す図である。 (a)は、従来のジャンプ命令のハンドラの擬似コードの一例を示す。(b)は、本発明の専用命令のハンドラの擬似コードの一例を示す。 本発明の第1の実施形態に係る命令実行装置200による処理の流れを示すフローチャートである。 図5に示したメモリ確保及び命令置換処理(S505)の流れを示すフローチャートである。 図5に示した専用命令のハンドラ215による処理(S515)の流れを示すフローチャートである。 本発明の第2の実施形態に係る命令実行装置800の機能ブロック図である。 本発明の第2の実施形態に係る命令実行装置800による処理の流れを示すフローチャートである。 図9に示した特定命令のハンドラ805による処理(S905)の流れを示すフローチャートである。 本発明の第3の実施形態に係る命令実行装置1100の機能ブロック図である。 特定命令のハンドラ1105による処理の流れを示すフローチャートである。 カウンタ処理によるオーバーヘッドを従来技術と本発明とで比較した実験結果を示す図である。 本発明の実施形態に係るコンピュータ50のハードウェア構成の一例を示す。
以下、本発明を実施するための形態を図面に基づいて詳細に説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
動的コンパイルを行う言語や、バイナリ変換等において、処理を行う単位としてトレースを用いる技術が重要になっている。トレースとは、動的に実行を監視することによって決定される、頻繁に実行される命令列である。トレースベースの処理系では、実行回数の多いループを見つけてトレースを生成する候補とするために、一般に、後方へのジャンプ命令ごとにカウンタを設け、実行回数をカウントすることがなされている。この際、上述したように、従来技術ではジャンプ命令のアドレスをキーとするハッシュテーブルを用いてカウンタの管理が行われていたため、ハッシュを引くオーバーヘッドが大きくなっていた。
本発明は、このようなトレースベースの処理系において、トレースを生成するために実行を監視するオーバーヘッドの削減を、プログラムの挙動を変えずに行うことを目的とするものである。なお、以下では理解を容易にするために、本発明を仮想マシンにおけるインタプリタに適用する場合について説明する。また、トレースを生成するための実行の監視は、ジャンプ命令の実行回数をカウントするカウンタ処理により行うものとする。しかし、本発明の適用は仮想マシンにおけるインタプリタに限定されず、
例えば、他のマシン用のバイナリを実行するバイナリトランスレータ・エミュレータにも適用でき、監視対象の特定の命令の実行に対してなされる、メモリ領域を必要とする任意の付加処理に対して適用可能であることに留意されたい。
図1は、本発明を適用可能なコンピュータ・システム100の構成を示す。コンピュータ・システム100は中央処理装置(CPU)、メモリ及びこれらの周辺回路等(図示しない)を含む一般的なコンピュータのハードウェア105、オペレーティング・システム(OS)110、仮想マシン125、記憶装置115を含む。なお、仮想マシン125は、一例として、サン・マイクロシステムズ(Sun(登録商標)Microsystems)から入手可能なJava(R)仮想マシンであってよい。以下では仮想マシン125は、Java(R)仮想マシンであるとして説明する。
Java(R)仮想マシン125は、通信網及び記録媒体等(図示しない)を介して予め記憶装置115に導入され、システムの立ち上げ時にハードウェア105のメモリにロードされて、OS110上で動作する。Java(R)仮想マシン125は、サーバコンピュータ等のコンピュータから通信網を介して送信されたバイトコード120、または、記録媒体を介して記憶装置115に供給されたバイトコード120を実行する。
Java(R)ランタイム関数140は、Java(R)の言語仕様のうち、バイトコードの仕様以外の部分を処理する関数群であって、例えば、まだメモリにロードされていないバイトコードを、記憶装置115等からメモリにロードしたり、オブジェクトを作成するために、メモリ内の領域を確保したりする。
JITコンパイラ130は、バイトコード120を動的コンパイルし、ハードウェア105のCPUが実行可能なマシンコード形式のバイトコードを生成する。生成されたマシンコード形式のバイトコードは、ハードウェア105のCPUにより実行される。
インタプリタ135は、バイトコード120を1命令ずつ処理し、バイトコードごとに定義された処理を行う。また、インタプリタ135は、バイトコードをハードディスクドライブ等の記憶装置115や通信網から読み込んだり、OS110へ要求したりなど、バイトコード操作以外の処理を、Java(R)ランタイム関数140を介して処理する。
インタプリタ135はまた、本発明に係るバイトコード実行方法を実現するために必要な構成要素を含み、メモリ上に読み込まれたバイトコード列内に含まれる監視対象の特定の命令の実行に対して、メモリ領域を必要とする付加処理を行う。
即ち、インタプリタ135は、メモリ上に読み込まれたバイトコード列内に含まれる監視対象の特定の命令に対し、付加処理のための追加のメモリ領域を確保してその一部に特定の命令をコピーし、バイトコード列内の特定の命令を、付加処理を行う専用命令と追加のメモリ領域の位置を特定する特定情報とで置換する。また、インタプリタ135は、バイトコード列内から専用命令を読み出されると、該専用命令と共に特定の命令と置換された特定情報に基づきメモリ領域を取得して、追加のメモリ領域の他の一部を用いて付加処理を実行し、更に、該メモリ領域内にコピーされた特定の命令を参照して該命令と同様の処理を行う。
なお、追加のメモリを確保して命令の置換を行うまでの一連の処理は、特定の命令を含むバイトコード列のメモリ上への読み込みに応答して行ってもよく、或いは、特定の命令の実行に応答して行ってもよい。以下では、前者を第1実施形態、後者を第2実施形態として順に説明する。また、上述したように以下の説明では、特定の命令は後方へのジャンプ命令であるとする。更に、後方へのジャンプ命令の実行に対して行われるメモリ領域を必要とする付加処理は、後方へのジャンプ命令の実行回数をカウントするカウンタ処理であるとする。
(第1実施形態) 図2は、本発明の第1の実施形態に係る命令実行装置200としてのインタプリタの機能ブロック図である。第1の実施形態に係る命令実行装置200としてのインタプリタは、メモリ確保部205と、命令置換部210と、専用命令ハンドラ215とを含む。専用命令ハンドラ215は、付加処理実行部220と、被置換命令実行部225とを含む。
メモリ確保部205は、メモリ上にクラスファイルがロードされると、クラスファイルに含まれるメソッド毎に、付加処理のためのメモリ領域として、メソッドのバイトコード列内に含まれる1以上の特定の命令の数に等しい要素数からなる配列を確保する。そのためメモリ確保部205は、クラスファイルのロードに応答して、各メソッドのバイトコード列を走査し、後方へのジャンプ命令に相当するバイトコード、例えば、goto、ifeq、if_icmpeq等のJava(R)バイトコードの数をカウントする。
配列の各要素は、メソッドに含まれる1以上の後方へのジャンプ命令にそれぞれ割り当てられる。要素のメモリ領域の一部は、付加処理のための作業領域、即ちカウンタとして使用される。また、要素のメモリ領域の他の一部は、該要素を割り当てられた特定の命令、即ち後方へのジャンプ命令とジャンプ先へのオフセットとをコピーするための領域として使用される。従って、本実施例における配列の各要素のサイズは、少なくとも、カウンタのバイト数(例えば4バイト)と後方へのジャンプ命令の情報のサイズ(例えば、ジャンプ命令の2バイトとジャンプ先へのオフセットの2バイト)を足し合わせた8バイトである。
メモリ確保部205はまた、確保した配列の位置情報、例えば、配列へのポインタをメソッドに関連付けて保存する。一例としてメモリ確保部205は、配列の位置情報をメソッドごとの情報(例えば、名前、アクセス制御情報)を格納するメソッド構造体に格納してもよい。なお、メモリ確保部205は、メソッド単位に代えて、クラス単位で配列を確保してもよい。この場合、メモリ確保部205は、配列の位置情報を、クラスごとの情報(例えば、名前、メソッド、変数等のリスト)を格納するクラス構造体に格納してよい。ただし、クラスに含まれるメソッドの数が多い場合は、メソッド単位で処理することが好ましい。これは、後述する命令置換部210により使用される配列の要素を指定するインデックの長さが2バイトを超えるケースが起こり得るためであり、その場合、インデックス情報を元のバイトコード列に埋め込むことが難しくなる。
命令置換部210は、メソッドのバイトコード列内に含まれる1以上の特定の命令の各々を、メモリ確保部205により確保された配列の各要素にコピーする。本実施例では、特定の命令は後方へのジャンプ命令であるため、命令置換部210は、後方へのジャンプ命令をジャンプ先へのオフセットと共に配列の要素にコピーする。そのため命令置換部210は、メモリ確保部205によるメモリの確保に応答して、クラスフィル内の各メソッドのバイトコード列を走査し、後方へのジャンプ命令に相当するバイトコード、例えば、goto、ifeq、if_icmpeq等のJava(R)バイトコードを検出すると、これを配列の要素に順にコピーする。以下では、JBgotoのように、Java(R)のバイトコード名には最初にJBを付けてJava(R)バイトコードであることを示す。
命令置換部210はまた、メソッドのバイトコード列内に含まれる1以上の特定の命令、即ち後方へのジャンプ命令の各々を、それに割り当てられたメモリ領域の位置を特定する特定情報と、付加処理を行う専用命令とで置換する。ここで付加処理を行う専用命令とは、命令実行装置200としてのインタプリタにより処理されるように事前に定義される専用の命令であって、該専用の命令と置換される特定の命令の実行に対する付加処理と、置換される特定の命令と同様の処理とをインタプリタに処理させる命令である。以下ではこの専用の命令の名前を、JBbackedgeとする。
また、上述したように、本実施例では、後方へのジャンプ命令の各々に配列の要素が割り当てられる。そこで命令置換部210は、割り当てられたメモリ領域の位置を特定する特定情報として、配列のインデックスを利用してもよい。更に、命令置換部210は、配列のインデックス情報を、後方へのジャンプ命令のジャンプ先を示すオフセット情報と置換してもよい。これに代えて命令置換部210は、配列のインデックス情報を、専用命令の名前に埋め込んで、バイトコード列内の後方へのジャンプ命令と置換してもよい。例えば、バイトコード列内の注目する後方へのジャンプ命令に割り当てられた配列の要素のインデックスが2であるとすると、命令置換部210は、JBbackedge2を、そのバイトコード列内の注目する後方へのジャンプ命令と置換してよい。
ここで、図3を参照して、メモリ確保部205による配列の確保と、命令置換部210による命令のコピー及び置換とを説明する。図3の横軸t302は時間の流れを示し、番号300で参照される矩形は、メモリ上にロードされたメソッドを示す。なお、図3の上段に示すメソッド300、330、380は、状態は異なるがいずれも同じメソッドを示す。同様に図3の下段に示す配列320、360は、状態は異なるがいずれも同じ配列を示す。メソッド300は、バイトコード列305を含み、バイトコード列305内には、後方へのジャンプ命令としてJBgoto310がオフセット(<jumpoffset>)315と共に含まれている。
メモリ確保部205は、メモリ上にメソッド300がロードされると、バイトコード列305を走査して、JBgoto310のような後方へのジャンプ命令の数nをカウントする。続いて、メモリ確保部205は、図3に示すように、求まった後方へのジャンプ命令数nに等しい要素数からなる配列320をメモリ上に確保し、矢印322に示すように、確保した配列320の位置情報を、メソッド330のメソッド構造体335に格納する。
次に命令置換部210は、メソッド330のバイトコード列340を走査して、検出した後方へのジャンプ命令を、配列360の要素にコピーする。なお、割り当てる配列の要素は、一例として、後方へのジャンプ命令の検出順に配列の先頭から決定してよい。図3では、矢印357により示されるように、後方へのジャンプ命令JBgoto345がオフセット(<jumpoffset>)350と共に、割り当てられた配列360の要素の一部370と375にそれぞれコピーされている。また、同要素の他の一部365は、後述する専用命令JBbackedge390によりカウンタとして使用される領域であるため、命令置換部210は、要素365に初期値0を設定したカウンタ変数を格納する。
その後命令置換部210は、バイトコード列340内のコピーされた後方へのジャンプ命令JBgoto345とそのオフセット(<jumpoffset>)350を、矢印378に示すように、それぞれ、専用命令JBbackedge390と割り当てられた配列の要素の位置を特定するインデックス情報(<index>)395とで置換する。命令置換部210による命令のコピーと置換は、メソッド330のバイトコード列340内に未処理の後方へのジャンプ命令がなくなるまで繰り返される。
図2に戻って、専用命令ハンドラ215は、バイトコード列内の専用命令に応答して呼び出される、専用命令のハンドラである。専用命令ハンドラ215は、付加処理実行部220と被置換命令実行部225とを含む。
付加処理実行部220は、専用命令ハンドラ215が呼び出されると、上記専用命令と共に特定の命令と置換されたバイトコード列内の特定情報に基づいてメモリ領域を取得し、該メモリ領域を用いて置換された特定の命令に対する付加処理を実行する。具体例として、特定情報として配列のインデックス情報が、後方へのジャンプ命令のオフセット情報(例えば、2バイトの情報)と置換されている場合を考える。なお、配列本体への位置情報、例えば、配列へのポインタ情報は、メソッド構造体に格納されているものとする。
上記ケースにおいて付加処理実行部220は、バイトコード列から読み出された専用命令に続く2バイトを配列のインデックス情報として読み出す。また、付加処理実行部220は、メソッド構造体から配列へのポインタ情報を読み出し、配列の先頭のアドレスを取得する。目的のメモリ領域の位置は、配列の先頭のアドレスに、インデックス情報に要素のサイズを乗じた値を加えることにより求められる。付加処理実行部220は、求めたメモリ領域をカウンタ変数として利用し、後方へのジャンプ命令の実行回数をカウントする。なお、インデックス情報が専用命令に埋め込まれている場合も、同様にして目的のメモリ領域を取得できる。
被置換命令実行部225は、付加処理実行部220により取得されたメモリ領域にコピーされている、置換された特定の命令を参照して、該特定の命令によりなされる処理と同じ処理を行う。
図4に、専用命令ハンドラ215の擬似コードを示す。比較のため、図4(a)には、ジャンプ命令のアドレスをキーとするハッシュテーブルを用いてカウンタを管理する、従来のハンドラの擬似コードを示す。コード中に記載されるPCはプログラムカウンタであり、従来のハンドラが呼び出される際には、PCはジャンプ命令のアドレスを指している。
1行目のコードでは、PCが指すアドレスの次のアドレスから2バイトが読み取られ、これがジャンプ命令のオフセット値としてoffsetに設定される。2行目のコードでは、式、offset<0が検査され、PCが指すジャンプ命令が後方へのジャンプ命令であることが確認される。後方へのジャンプ命令である場合、次の3―4行目のコードが実行され、3行目のコードでは、PC、即ちジャンプ命令のアドレスを引数としてハッシュテーブルが参照され、結果であるカウンタのアドレスがcounterAddrに設定される。4行目のコードでは、カウンタの値が1インクリメントされる。最後の6行目のコードでは、PCにoffsetの値が加えられ、ジャンプ先のアドレスがPCに設定される。
図4(b)は、本発明の専用命令ハンドラ215の擬似コードの一例を示す。ここでも、コード中に記載されるPCはプログラムカウンタを示し、本発明の専用命令ハンドラ215が呼び出される際には、PCはジャンプ命令のアドレスを指している。1行目のコードでは、PCが指すアドレスの次のアドレスから2バイトが読み取られ、これが専用命令と置換された後方へのジャンプ命令に割り当てられた配列の要素を示すインデックス情報としてindexに設定される。3行目のコードでは、メソッド構造体に格納された配列の先頭のアドレスに8*indexが加えられ、加算された値が配列の要素の先頭アドレスとしてcounterAddressに設定される。ここで、要素のサイズは、カウンタとして使用する4バイトと、元のジャンプ命令のバイトコード情報のコピー先として使用する4バイトの合計8バイトとしている。
4行目のコードでは、配列の要素の先頭アドレスcounterAddressに4バイトを加えることにより、元のバイトコード情報の先頭アドレスが求められ、該アドレスにある情報が元のバイトコード情報としてoriginalBCに設定される。5行目のコードでは、counterAddressを用いてカウンタの値が1インクリメントされる。6行目以降のif文では、originalBC が後方へのジャンプ命令(JBgoto、JBifeq、JBif_icmpeq等)と比較され、置換された後方へのジャンプ命令の種類を特定され、特定された種類のジャンプ命令と同様の処理が行われる。例えば、元のバイトコードoriginalBCがJBgotoである場合、8行目のコードにおいて、アドレス(counterAddress+5)から2バイトが読み取られ、JBgotoのジャンプ先を示すオフセット情報としてoffsetに設定される。そして9行目のコードにおいて、offsetの値をPCに加えることにより、ジャンプ先のアドレスがPCに設定される。
一方、元のバイトコードoriginalBCがJBifeqである場合、12行目のコードにおいて、アドレス(counterAddress+5)から2バイトが読み取られ、これがJBifeqのジャンプ先を示すオフセット情報としてoffsetに設定される。そして13行目のコードにおいて、最初のオペランドが0であるか否かが検査され、0である場合、offsetの値をPCに加えることにより、ジャンプ先のアドレスがPCに設定される。最初のオペランドが0でない場合、次の処理へ進むためにPCに3が加えられる。
また、元のバイトコードoriginalBCがJBif_icmpeqである場合、17行目のコードにおいて、アドレス(counterAddress+5)から2バイトが読み取られ、これがJBif_icmpeqのジャンプ先を示すオフセット情報としてoffsetに設定される。そして18行目のコードにおいて、最初のオペランドと2番目のオペランドが等しいか否かが検査され、等しい場合、offsetの値をPCに加えることにより、ジャンプ先のアドレスがPCに設定される。等しくない場合、次の処理へ進むためにPCに3を加えられる。上記以外の後方へのジャンプ命令についても、同様に処理できる。
次に図5から図7を参照して、本発明の第1の実施形態に係る命令実行装置200としてのインタプリタによる処理の流れを説明する。図5は、本発明の第1の実施形態に係る命令実行装置200によるバイトコード実行処理の全体の流れを示すフローチャートである。図6は、図5に示すメモリ確保及び命令置換処理(S505)の流れを示すフローチャートである。図7は、図5に示す専用命令のハンドラによる処理(S515)の流れを示すフローチャートである。
図5に示す処理は、ステップ500より開始され、命令実行装置200は、メモリ上に新しいクラスファイルがロードされたか否かを判定する。新しいクラスファイルがロードされた場合(ステップ500:YES)、処理はステップ505へ進み、メモリ確保部205は、クラスファイル内の各メソッドについて、メモリ確保処理と命令置換処理とを実行する。メモリ確保部205による各処理の詳細は、図6を参照して後述する。
一方、ステップ500において、新しいクラスファイルがロードされていない場合(ステップ500:NO)、処理はステップ510へ進み、命令実行装置200は、メモリ上のバイトコード列から次のバイトコードを読み出し、該バイトコードが専用命令であるか否かを判定する。なお、命令実行装置200が初めてステップ510を実行する場合における次のバイトコードとは、メモリ上のクラスファイルに含まれるメソッドの最初のバイトコードである。
ステップ510において、読み込んだバイトコードが専用命令である場合、命令実行装置200は専用命令のハンドラを呼び出して専用命令を処理する(ステップ515)。一方、ステップ510において、読み込んだバイトコードが専用命令でない場合、命令実行装置200は、そのバイトコードに定義された処理を行う(ステップ520)。続いて命令実行装置200は、次のバイトコードが存在するか否か、即ち、プログラムの終わりであるか否かを判定し(ステップ525)、プログラムの終わりでない場合(ステップ525:NO)、処理はステップ500に戻り一連の処理を繰り返す。一方、ステップ525において、プログラムの終わりである場合(ステップ525:YES)、命令実行装置200は、処理を終了する。
図6に示すフローチャートは、図5に示すステップ505の処理の詳細を示し、メモリ上にロードされたクラスファイルに含まれるメソッド毎にメモリ確保部205により実行される。図6に示す処理は、ステップ600より開始され、メモリ確保部205は、メソッドのバイトコード列を走査して、置換対象の命令、即ち、後方へのジャンプ命令の数nをカウントする。続いてメモリ確保部205は、カウント数nが正であるか否かを判定し(ステップ602)、カウント数nが正でない場合(ステップ602:NO)、処理を終了する。
一方、カウント数nが正である場合(ステップ602:YES)、メモリ確保部205は、n個の所定のサイズmの要素からなる配列をメモリ上に確保し、確保した配列へのポインタを所定の位置Aに格納する(ステップ605)。ここで所定のサイズmとは、上述したように、付加処理であるカウンタ処理に必要なメモリ領域のサイズr1と、置換対象の命令である、後方へのジャンプ命令及びそのオフセット値をコピーするのに必要なメモリ領域のサイズr2を足し合わせたサイズ(例えば、8バイト)である。また、所定の位置Aとは、一例として、メソッドに関連する情報を格納するメソッド構造体である。なお、各要素のメモリ領域のうち、付加処理に利用される領域にはカウンタの値として初期値0を設定しておくものとする。
メモリ確保部205により配列が確保されると、命令置換部210は、現在処理中の配列のインデックスを示す変数iを用意し、変数iに初期値0を設定する(ステップ610)。続いて命令置換部210は、メモリ確保部205が処理した先程のメソッドのバイトコード列を再び走査して、置換対象の後方へのジャンプ命令を検出し、該命令をそのオフセット情報と共に、i番目の要素にコピーする(ステップ615)。
続いて命令置換部210は、i番目の要素にコピーしたバイトコード列内の後方へのジャンプ命令を専用の命令(JBbackedg)で置換し、かつ、現在の要素のインデックスを示す変数iの値を、バイトコード列内の後方へのジャンプ命令に続く2バイトの領域、即ち、後方へのジャンプ命令のオフセットが格納されていた領域に格納する(ステップ620)。続いて命令置換部210は、変数iを1インクリメントし(ステップ625)、変数iが後方へのジャンプ命令の数nに等しいか否かを判定する(ステップ630)。
変数iが後方へのジャンプ命令の数nに等しくない場合(ステップ630:NO)、処理はステップ615に戻り、命令置換部210は、ステップ615からステップ630までの一連の処理を繰り返し、メソッドのバイトコード列内の全ての後方へのジャンプ命令について、命令の置換とコピーとを行う。一方、ステップ630において、変数iが後方へのジャンプ命令の数nに等しい場合(ステップ630:YES)、命令置換部210は処理を終了する。
図7に示すフローチャートは、上述したように、図5に示すステップ515の処理の詳細を示す。図7に示す処理は、専用命令のハンドラ215が呼び出されることにより開始され、専用命令のハンドラ215の付加処理実行部220は、バイトコード列内の専用命令(JBbackedg)の次のバイトコードを所定のバイト数読み込み、これを変数indexに設定する(ステップ700)。ここで所定のバイト数とは、配列の要素のインデックスのサイズであり、例えば2バイトである。
続いて付加処理実行部220は、メソッド構造体等の所定の位置Aから配列へのポインタを読み出し、配列の先頭のアドレスArrayを取得する(ステップ705)。続いて付加処理実行部220は、式(Array + index*m)を計算し、付加処理のためのメモリ領域のアドレスAddressを取得する(ステップ710)。なお、上述したようにmは要素のサイズであり、付加処理であるカウンタ処理に必要なメモリ領域のサイズr1と、置換対象の命令である後方へのジャンプ命令及びそのオフセット値をコピーするのに必要なメモリ領域のサイズr2を足し合わせた値を有する。
続いて付加処理実行部220は、アドレスAddressにより指定されるメモリ領域をカウンタとして使用し、置換対象の後方へのジャンプ命令の実行回数をカウントすべく、カウンタを1インクリメントする(ステップ715)。また、専用命令のハンドラ215の被置換命令実行部225は、式(Address + r1)により求まるアドレスから、置換された元の後方へのジャンプ命令を、そのオフセット情報と共に読み出す(ステップ720)。続いて被置換命令実行部225は、読み出した元の後方へのジャンプ命令とオフセット情報とを参照して、元の命令と同様の処理を行う(ステップ725)。このときプログラムカウンタPCは、バイトコード列内の元の後方へのジャンプ命令があったアドレスを指したままであるため、被置換命令実行部225は、読み出したオフセットの値をそのまま利用して後方へのジャンプ命令を処理できることに留意されたい。そして処理は終了する。
このように第1の実施形態に係る命令実行装置200によれば、メモリ上に読み込まれたバイトコード列内に監視対象の特定の命令が検出されると、付加処理のための追加のメモリ領域が確保され、検出された特定の命令は、確保されたメモリ領域の一部にコピーされた後、付加処理を行う専用命令と追加のメモリ領域の位置を特定する特定情報とに置換される。このため、第1の実施形態に係る命令実行装置200によれば、追加のメモリ領域の位置を取得するのにハッシュテーブルを参照する必要がなく、オーバーヘッドを低減できる。
また、第1の実施形態に係る命令実行装置200によれば、バイトコード列内から専用命令が読み出されると、特定情報から取得されたメモリ領域を用いて付加処理が実行された後、該領域内の特定の命令を参照して該命令と同様の処理がなされる。このため、第1の実施形態に係る命令実行装置200によれば、挙動の変化を、命令実行装置200それ自身(本実施例ではJava(R)仮想マシンのレイヤー)の中だけにとどめるため、元のプログラムの挙動を変えることなく付加処理を行うことができる。
(第2実施形態)図8は、本発明の第2の実施形態に係る命令実行装置800としてのインタプリタの機能ブロック図である。第2の実施形態に係る命令実行装置800では、追加のメモリを確保して命令の置換を行うまでの一連の処理を、特定の命令(本実施例では、後方へのジャンプ命令)に応答して呼び出される、特定の命令のハンドラの処理の一部として実行する。そのため、特定の命令の最初の実行に対しては、専用命令よる付加処理(本実施例では、カウンタ処理)が行われない。そこで、特定の命令の最初の実行に対する付加処理は、特定の命令のハンドラが初期化処理として行うものとする。
第2の実施形態に係る命令実行装置800としてのインタプリタは、特定命令ハンドラ805を含み、該特定命令ハンドラ805は、メモリ確保部810と、命令置換部815と、初期化部820と、特定命令処理部825とを含む。また、第2の実施形態に係る命令実行装置800としてのインタプリタは、専用命令ハンドラ830を含み、専用命令ハンドラ830は、付加処理実行部835と、被置換命令実行部840とを含む。なお、専用命令ハンドラ830については、既に説明した第1の実施形態に係る命令実行装置200における専用命令ハンドラ215の機能と変わるところがないため、繰り返しを避けるためここでは説明を省略する。
特定命令ハンドラ805は、命令実行装置800が、クラスファイルに含まれるメソッドのバイトコード列から特定の命令のバイトコードを読み出すことに応答して呼び出される。なお、特定命令ハンドラ805は、後述するメモリ確保部810により確保される配列の現在の要素数を示す変数counterArraySizeを有し、変数counterArraySizeには初期値として0が設定されているものとする。
メモリ確保部810は、現在確保されている配列の要素数を変数counterArraySizeの値により確認し、変数counterArraySizeの値が0である場合、即ち、初めて配列を確保する場合、1個の所定サイズmの要素の配列をメモリ上に確保する。また、メモリ確保部810は、確保した配列の位置情報、例えば、配列へのポインタをメソッドに関連付けて保存する。一例として、メモリ確保部810は、配列の位置情報をメソッド構造体に格納する。メモリ確保部810はまた、変数counterArraySizeを1インクリメントする。
なお、第1実施形態係る命令実行装置200に関連して説明したように、要素のメモリ領域の一部は、付加処理のための作業領域、即ちカウンタとして使用される。また、要素のメモリ領域の他の一部は、該要素を割り当てられる特定の命令、即ち後方へのジャンプ命令とジャンプ先へのオフセットとをコピーするための領域として使用される。従って、上記要素の所定サイズmは、少なくとも、カウンタのバイト数(例えば4バイト)と後方へのジャンプ命令の情報のサイズ(例えば、ジャンプ命令の2バイトとジャンプ先へのオフセットの2バイト)を足し合わせた8バイトとする。
メモリ確保部810はまた、変数counterArraySizeの値が0でない場合、変数counterArraySizeを1インクリメントして、配列のサイズを、所定サイズmの要素を変数counterArraySizeの値の数だけ有する配列に拡張する。
命令置換部815は、特定命令ハンドラ805の呼び出し元であるバイトコード列内の特定の命令を、該特定の命令に対してメモリ確保部810が確保したインデックス値がcounterArraySize-1である配列の要素にコピーする。本実施例では、特定の命令は後方へのジャンプ命令であるため、命令置換部815は、後方へのジャンプ命令をジャンプ先へのオフセットと共に配列の要素にコピーする。
命令置換部815はまた、コピーしたバイトコード列内の後方へのジャンプ命令を、該ジャンプ命令に割り当てられた配列の要素の位置を特定する特定情報と、付加処理を行う専用命令とで置換する。特定情報として配列のインデックスを利用する場合、インデックスの値はcounterArraySize-1となる。また、専用命令は、第1実施形態に関連して説明した専用命令と同じであるため、ここでは説明を省略する。なお、第2実施形態においても、専用の命令の名前をJBbackedgeとする。
初期化部820は、メモリ確保部810により確保されたインデックス値がcounterArraySize-1である要素の一部の領域を用いて、バイトコード列内の特定の命令に対する付加処理、すなわち後方へのジャンプ命令の実行回数をカウントする。特定命令ハンドラ805は、バイトコード列内の各特定の命令について、該命令が専用命令に置換される前の最初の実行時に1度だけ呼び出されるものである。そのため、付加処理部820による上記カウンタ処理は、バイトコード列内の各特定の命令に対するカウンタを1で初期化することに等しい。
特定命令処理部825は、特定の命令に対してもともと定義されている本来の処理を実行する。即ち、特定の命令が後方へのジャンプ命令であれば、特定命令処理部825は、後方へのジャンプ命令に対し定義されている本来のジャンプ処理を行う。
次に図9及び10を参照して、本発明の第2の実施形態に係る命令実行装置800による処理の流れを説明する。図9は、本発明の第2の実施形態に係る命令実行装置800によるバイトコード実行処理の全体の流れを示すフローチャートである。図10は、図5に示す特定命令ハンドラ805による処理(S910)を示すフローチャートである。
図9に示す処理は、ステップ900より開始され、命令実行装置800は、メモリ上に新しいクラスファイルがロードされると、クラスファイル内の各メソッドについて、バイトコード列からバイトコードを順に読み出す。続いて命令実行装置800は、読み出したバイトコードが特定の命令、本実施例では後方へのジャンプ命令であるか否かを判定する(ステップ905)。特定の命令である場合(ステップ905:YES)、命令実行装置800は、特定命令ハンドラ805を呼び出して特定の命令を処理する(ステップ910)。特定命令ハンドラ805による処理の詳細は、図10を参照して後述する。
ステップ905で特定の命令でない場合、命令実行装置800は、読み出したバイトコードが専用の命令、本実施例ではJBbackedgeであるか否かを判定する(ステップ915)。専用の命令である場合(ステップ915:YES)、命令実行装置800は、専用命令ハンドラ830を呼び出して専用の命令を処理する(ステップ920)。専用命令のハンドラ830による処理の詳細は、図7を参照して説明した専用命令のハンドラ215による処理と同じであるため、ここでは説明を省略する。
ステップ915で専用の命令でない場合、命令実行装置800は、読み出したバイトコードに定義された処理を行う(ステップ925)。ステップ910、ステップ920、又はステップ925から処理はステップ930へ進み、命令実行装置800は、プログラムの終わりであるか否か、即ち、次のバイトコードが存在するか否かを判定し(ステップ930)、プログラムの終わりでない場合(ステップ930:NO)、命令実行装置800はステップ900に戻って一連の処理を繰り返す。一方、ステップ930において、プログラムの終わりである場合、命令実行装置800は処理を終了する。
図10は、特定命令、即ち後方へのジャンプ命令のハンドラ805による処理の流れを示すフローチャートである。図10に示す処理はステップ1000より開始し、メモリ確保部810は、現在確保されている配列の要素数を示すcounterArraySizeの値が0であるか否かを判定する。counterArraySizeの値が0である場合(ステップ1000:YES)、メモリ確保部810は、counterArraySizeを1インクリメントして、所定サイズmの要素1つからなる配列をメモリに確保し、配列へのポインタを、現在処理中のメソッドのメソッド構造体に格納する(ステップ1005)。ここで現在処理中のメソッドとは、特定命令ハンドラ805の呼び出し元である特定の命令が含まれるメソッドである。
一方、ステップ1000において、counterArraySizeの値が0でない場合(ステップ1000:NO)、メモリ確保部810は、counterArraySizeを1インクリメントして、既にメモリ上に確保されている配列を、counterArraySizeの値に要素の所定のサイズmを乗じて得られるサイズに拡張する(ステップ1010)。続いて処理は、ステップ1005またはステップ1010からステップ1015へ進み、命令置換部815は、実行中の元の特定の命令である後方へのジャンプ命令を、インデックスの値がcounterArraySize-1である新しく確保された配列の要素にコピーする。
続いて命令置換部815は、バイトコード列内の元の特定の命令である後方へのジャンプ命令を、専用の命令JBbackedgeと、後方へのジャンプ命令に割り当てられた配列の要素のインデックス情報(counterArraySize-1)とで置換する(ステップ1020)。続いて初期化部820は、インデックスの値がcounterArraySize-1である新しく確保された配列の要素の一部の領域をカウンタとして利用し、所定の付加処理である後方へのジャンプ命令の実行回数をカウントする(ステップ1025)。続いて特定命令処理部825は、元の特定の命令である後方へのジャンプ命令に元々定義されていた操作を行う(ステップ1030)。その後処理は終了する。
このように、第2の実施形態に係る命令実行装置800によれば、第1の実施形態に係る命令実行装置200と同様に、追加のメモリ領域の位置を取得するのにハッシュテーブルを参照する必要がないため、オーバーヘッドを低減でき、また、挙動の変化が、命令実行装置800それ自身(本実施例ではJava(R)仮想マシンのレイヤー)の中だけにとどめられるため、元のプログラムの挙動を変えることなく付加処理を行うことができる。
更に第2の実施形態に係る命令実行装置800によれば、バイトコード列内の特定の命令(例えば、後方へのジャンプ命令)が実際に実行されるそのときに、該特定の命令に付加処理(例えば後方へのジャンプ命令の実行回数をカウントするカウンタ処理)のためのメモリ領域が割り当てられる。そのため、実際には実行されることのないバイトコード列内の特定の命令にまで付加処理のためのメモリ領域を割り当ててしまうことによるメモリの浪費がない。
ところで第2の実施形態に係る命令実行装置800では、Java(R)仮想マシンのようにマルチスレッド環境下で動作する場合に、スレッド間の競合が問題となる。即ち、マルチスレッド環境下では、1のスレッドによるバイトコード列内の特定の命令の処理の要求に応答して、特定命令ハンドラ805が特定の命令の書き換えを行っている最中に、他のスレッドによりその特定の命令の処理が要求されることが起こりえる。そこで、このような競合の問題に対処した命令実行装置を、第3の実施形態に係る命令実行装置1100として以下に説明する。
(第3の実施形態)図11は、本発明の第3の実施形態に係る命令実行装置1100としてのインタプリタの機能ブロック図である。第3の実施形態に係る命令実行装置1100としてのインタプリタは、基本的には、第2の実施形態に係る命令実行装置800としてのインタプリタと同じ機能構成を有する。ただし、第3の実施形態に係る特定命令ハンドラ1105は、待機命令挿入部1110と、実行状態確認部1115とを新たに含む。そこで以下ではこの新たに追加される待機命令挿入部1110と、実行状態確認部1115とについて主に説明する。
特定命令ハンドラ1105は、1のスレッドの要求に基づいて命令実行装置1110がバイトコード列から特定の命令のバイトコードを読み出すと、これに応答して呼び出される。呼び出された特定命令ハンドラ1105はまず、待機命令挿入部1110に処理を開始させる。待機命令挿入部1110は、特定命令ハンドラ1105の呼び出し元であるバイトコード列内の特定の命令を、一時的な退避場所に退避させた後、処理の実行の待機を要求する待機命令で置換する。ここで一時的な退避場所とは、メモリ上の領域であってもよく、或いはレジスタであってもよい。なお特定の命令が後方へのジャンプ命令である場合、そのジャンプ先を示すオフセット情報も一緒に退避させるものとする。
実行状態確認部1115は、特定命令ハンドラ1105の呼び出し元であるバイトコード列内の特定の命令を実行中の他のスレッドが存在するか否かを確認する。そのような他のスレッドの有無の確認は、現在のスレッドの一覧を取得し、各スレッドについて実行中のバイトコードの位置を調べることにより行ってよい。
なお、第3の実施形態に係る命令実行装置1100におけるメモリ確保部1120は、実行状態確認部1115による確認の結果に基づき、上記特定の命令を実行中の他のスレッドが存在しないことを条件にその処理を開始するものとする。
また、第3の実施形態に係る命令実行装置1100における命令置換部1125は、一時的な退避場所に格納された特定の命令を、該命令に対してメモリ確保部1120により確保された配列の要素にコピーし、かつ、待機命令挿入部1110により埋め込まれたバイトコード列内の待機命令を、専用命令及び配列の要素のインデックスで置換するものとする。なお、その他の構成要素の機能については、上述したように、第2実施形態に係る命令実行装置800と変わるところがないため、ここでは説明を省略する。
次に図12を参照して、本発明の第3の実施形態に係る特定命令ハンドラ1105による処理の流れを説明する。なお、本発明の第3の実施形態に係る命令実行装置1100による全体の処理の流れ及び専用命令のハンドラ1140による処理の流れは、それぞれ、図9を参照して説明した本発明の第2の実施形態に係る命令実行装置800による処理の流れ、及び図7を参照して説明した本発明の第1の実施形態に係る命令実行装置200の専用命令ハンドラ215による処理の流れと基本的に同じであるため、ここでは説明を省略する。
図12に示す処理は、1のスレッドの要求に基づき、バイトコード列内の特定の命令である後方へのジャンプ命令に応答して特定命令ハンドラ1105が呼び出されることにより開始する。待機命令挿入部1110は、特定命令ハンドラ1105の呼び出し元となったバイトコード列内の後方へのジャンプ命令を、処理の実行の待機を要求する待機命令JBwaitで置換し、元の後方へのジャンプ命令をそのオフセット情報と共に、メモリやレジスタ等の一時的な退避場所に格納する(ステップ1200)。
続いて実行状態確認部1115は、全スレッドの現在の実行状態、即ち、実行中のバイトコードの位置を確認し(ステップ1205)、特定命令ハンドラ1105の呼び出し元となったバイトコード列内の後方へのジャンプ命令を実行中の他のスレッドが存在しないか否かを判定する(ステップ1210)。そのような他のスレッドが存在する場合(ステップ1210:YES)、処理はステップ1205へ戻り一連の処理を繰り返す。
一方、ステップ1210で、上記後方へのジャンプ命令を実行中の他のスレッドが存在しない場合、処理はステップ1215へ進み、メモリ確保部1120は、現在確保されている配列の要素数を示すcounterArraySizeの値が0であるか否かを判定する。counterArraySizeの値が0である場合(ステップ1215:YES)、メモリ確保部810は、counterArraySizeを1インクリメントして、所定のサイズmの要素1つからなる配列をメモリに確保し、配列へのポインタを、現在処理中のメソッドのメソッド構造体に格納する(ステップ1220)。ここで現在処理中のメソッドとは、特定命令ハンドラ1105の呼び出し元の特定の命令が含まれるメソッドである。
一方、ステップ1215において、counterArraySizeの値が0でない場合、メモリ確保部1120は、counterArraySizeを1インクリメントして、既にメモリ上に確保されている配列を、counterArraySizeの値に要素の所定のサイズmを乗じて得られるサイズに拡張する(ステップ1225)。続いて処理は、ステップ1220またはステップ1225からステップ1230へ進み、命令置換部1125は、一時的な退避場所に格納された元の特定の命令である後方へのジャンプ命令をそのオフセット情報と共に、インデックスの値がcounterArraySize-1である新しく確保された配列の要素にコピーする。
続いて命令置換部1125は、バイトコード列内の待機命令JBwaitを、専用の命令JBbackedgeと、後方へのジャンプ命令に割り当てられた配列の要素のインデックス情報(counterArraySize-1)とで置換する(ステップ1235)。続いて初期化部1130は、インデックスの値がcounterArraySize-1である新しく確保された配列の要素の一部の領域をカウンタとして利用し、所定の付加処理である後方へのジャンプ命令の実行回数をカウントする(ステップ1240)。続いて特定命令処理部1135は、元の特定の命令である後方へのジャンプ命令に元々定義されていた操作を行う(ステップ1245)。そして処理は終了する。
このように、第3の実施形態に係る命令実行装置1100の特定命令ハンドラ1105によれば、最初に書き換え対象の特定の命令が待機命令で置換されるため、新たに特定の命令を実行するスレッドが存在しなくなり、また、書き換え対象の特定の命令を実行中の他のスレッドが存在しない場合に特定命令の置換処理が開始されるため、マルチスレッド環境下での競合の問題が解決される。
次に図13を参照して、本発明によるオーバーヘッド削減の効果を検証する。図13に示すグラフは、後方へのジャンプ命令の実行回数をカウントするカウンタ処理によるオーバーヘッドを、そのような付加処理を行わない場合、従来技術を利用した場合、本発明を利用した場合の3つケースについて比較した実験結果である。縦軸は相対的な実行時間を示し、横軸はDaCapo benchmarksuiteというベンチマーク群の各プログラム名を示している。図13に示すグラフから分かるように、どのようなプログラムについても、本発明によればカウンタ処理によるオーバーヘッドを無視できる。
図14は、本実施形態に係るコンピュータ50のハードウェア構成の一例を示した図である。コンピュータ50は、バス2に接続されたメインCPU(中央処理装置)1とメインメモリ4を含んでいる。ハードディスク装置13、30、及びCD−ROM装置26、29、フレキシブル・ディスク装置20、MO装置28、DVD装置31のようなリムーバブル・ストレージ(記録メディアを交換可能な外部記憶システム)がフレキシブル・ディスクコントローラ19、IDEコントローラ25、SCSIコントローラ27などを経由してバス2へ接続されている。
フレキシブル・ディスク、MO、CD−ROM、DVD−ROMのような記憶メディアが、リムーバブル・ストレージに挿入される。これらの記憶メディアやハードディスク装置13、30、ROM14には、オペレーティング・システムと協働してCPU等に命令を与え、本発明を実施するためのコンピュータ・プログラムのコードを記録することができる。即ち、上記説明した数々の記憶装置には、コンピュータ50にインストールされ、コンピュータ50を命令実行装置200、800、又は1100として機能させるバイトコード実行プログラムを記録することができる。
コンピュータ50を命令実行装置200として機能させる上記バイトコード実行プログラムは、メモリ確保モジュール、命令置換モジュール、専用命令ハンドラ・モジュールを含む。これらモジュールは、CPU1等に働きかけて、コンピュータ50を、メモリ確保部205、命令置換部210、専用命令ハンドラ215としてそれぞれ機能させる。また、専用命令ハンドラ・モジュールは、更に、付加処理実行モジュールと、被置換命令実行モジュールを含む。これらモジュールは、CPU1等に働きかけて、コンピュータ50を、付加処理実行部220、被置換命令実行部215としてそれぞれ機能させる。
コンピュータ50を命令実行装置800として機能させる上記バイトコード実行プログラムは、特定命令ハンドラ・モジュールと、専用命令ハンドラ・モジュールを含む。これらモジュールは、CPU1等に働きかけて、コンピュータ50を、特定命令ハンドラ805、専用命令ハンドラ830としてそれぞれ機能させる。また、特定命令ハンドラ・モジュールは、メモリ確保モジュール、命令置換モジュール、初期化モジュール、特定命令処理モジュールを含む。これらモジュールは、CPU1等に働きかけて、コンピュータ50を、メモリ確保部810、命令置換部815、初期化部820、特定命令処理部825としてそれぞれ機能させる。また、専用命令ハンドラ・モジュールは、更に、付加処理実行モジュールと、被置換命令実行モジュールを含む。これらモジュールは、CPU1等に働きかけて、コンピュータ50を、付加処理実行部835、被置換命令実行部840としてそれぞれ機能させる。
コンピュータ50を命令実行装置1100として機能させる上記バイトコード実行プログラムは、特定命令ハンドラ・モジュールと、専用命令ハンドラ・モジュールを含む。これらモジュールは、CPU1等に働きかけて、コンピュータ50を、特定命令ハンドラ1105、専用命令ハンドラ1140としてそれぞれ機能させる。また、特定命令ハンドラ・モジュールは、待機命令挿入モジュール、実行状態確認モジュール、メモリ確保モジュール、命令置換モジュール、初期化モジュール、特定命令処理モジュールを含む。これらモジュールは、CPU1等に働きかけて、コンピュータ50を、待機命令挿入部1110、実行状態確認部1115、メモリ確保部810、命令置換部815、初期化部820、特定命令処理部825としてそれぞれ機能させる。また、専用命令ハンドラ・モジュールは、更に、付加処理実行モジュールと、被置換命令実行モジュールを含む。これらモジュールは、CPU1等に働きかけて、コンピュータ50を、付加処理実行部1145、被置換命令実行部1150としてそれぞれ機能させる。コンピュータ・プログラムは圧縮し、また複数に分割して複数の媒体に記録することもできる。
コンピュータ50は、キーボード/マウス・コントローラ5を経由して、キーボード6やマウス7のような入力デバイスからの入力を受ける。コンピュータ50は、オーディオコントローラ21を経由して、マイク24からの入力を受け、またスピーカー23から音声を出力する。コンピュータ50は、視覚データをユーザに提示するための表示装置11に、グラフィックスコントローラ10を経由して接続される。コンピュータ50は、ネットワーク・アダプタ18(イーサネット(登録商標)・カードやトークンリング・カード)等を介してネットワークに接続し、他のコンピュータ等と通信を行うことが可能である。
以上の説明により、本実施形態に係るコンピュータ50は、通常のパーソナルコンピュータ、ワークステーション、メインフレームなどの情報処理装置、又は、これらの組み合わせによって実現されることが容易に理解されるであろう。なお、上記説明した構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
以上、実施形態を用いて本発明の説明をしたが、本発明の技術範囲は上記実施形態に記載の範囲には限定されない。上記の実施形態に、種々の変更または改良を加えることが可能であることが当業者に明らかである。従って、そのような変更または改良を加えた形態も当然に本発明の技術的範囲に含まれる。

Claims (7)

  1. コンピュータ上で所定の実行系により実行される命令を含む命令列内に含まれる監視対象の特定の命令の実行に対して、メモリ領域を必要とする付加処理を行う命令実行装置であって、
    メモリ上に読み込まれた前記命令列内に含まれる前記特定の命令に対し、前記付加処理のためのメモリ領域を確保するメモリ確保部と、
    前記特定の命令を、確保した前記メモリ領域にコピーし、かつ、前記付加処理を行う専用命令及び前記メモリ領域の位置を特定する特定情報で置換する命令置換部と、
    前記命令列内の前記専用命令の読み出しに応答して、該専用命令と共に置換された前記特定情報から前記メモリ領域を取得し、該メモリ領域を用いて前記付加処理を実行する付加処理実行部と、
    取得された前記メモリ領域にコピーされた前記特定の命令を参照して、該特定の命令によりなされる処理と同じ処理を行う被置換命令実行部とを含み、
    前記付加処理実行部及び前記被置換命令実行部を、前記専用命令に応答して呼び出される前記専用命令のハンドラとして実装し
    前記メモリ確保部及び前記命令置換部を、前記特定の命令に応答して呼び出される、前記特定の命令のハンドラの一部として実装し、該特定の命令のハンドラは、前記特定の命令を処理すると共に、確保した前記メモリ領域の初期化を行う、
    命令実行装置。
  2. 前記実行系は、Java(R)仮想マシンであり、前記メモリ上に読み込まれた前記命令列は、1以上の前記特定の命令を含む、クラスファイルに含まれる各メソッドのバイトコード列であり、前記メモリ確保部は、前記クラスファイルの前記メソッド毎に、前記メモリ領域を、前記1以上の特定の命令の数に等しい要素数からなる配列として確保し、確保した前記配列の位置情報を前記メソッドに関連付けて保存し、前記命令置換部は、前記バイトコード列内に含まれる前記1以上の特定の命令の各々を、前記配列の各要素にコピーし、かつ、前記専用命令及び前記特定の命令に割り当てられた前記配列のインデックス情報で置換する、請求項に記載の命令実行装置。
  3. 前記特定の命令は後方へのジャンプ命令であり、前記メモリ領域を必要とする付加処理は、前記後方へのジャンプ命令の実行回数をカウントするカウンタ処理である、請求項に記載の命令実行装置。
  4. 前記配列のインデックス情報は、前記バイトコード列内の前記後方へのジャンプ命令のジャンプ先を示すオフセット情報と置換される、請求項に記載の命令実行装置。
  5. 前記配列のインデックス情報は、前記専用命令の命令名に埋め込まれて前記バイトコード列内の前記後方へのジャンプ命令と置換される、請求項に記載の命令実行装置。
  6. 前記命令実行装置は、マルチスレッド環境下で動作し、前記特定の命令のハンドラは更に、1のスレッドの要求に基づく前記命令列内の前記特定の命令の読み出しに応答して、処理の実行の待機を要求する待機命令で前記特定の命令を置換し、該特定の命令を一時的な退避場所に格納する待機命令挿入部と、前記命令列内の前記特定の命令を実行中の他のスレッドの有無を確認する実行状態確認部とを含み、前記メモリ確保部は、前記特定の命令を実行中の他のスレッドが存在しないことを条件にその処理を開始し、前記命令置換部は、一時的な退避場所に格納された前記特定の命令を前記メモリ領域にコピーし、かつ、前記バイトコード列内の前記待機命令を、前記専用命令及び前記特定情報で置換する、請求項に記載の命令実行装置。
  7. コンピュータ上で所定の実行系により実行される命令を含む命令列内に含まれる監視対象の特定の命令の実行に対してメモリ領域を必要とする付加処理を行う、コンピュータにおいて実行される命令実行プログラムであって、該命令実行プログラムは前記コンピュータに、
    メモリ上に読み込まれた前記命令列内に含まれる前記特定の命令に対し、前記付加処理のためのメモリ領域を確保するステップと、
    前記特定の命令を、確保した前記メモリ領域にコピーし、かつ、前記付加処理を行う専用命令及び前記メモリ領域の位置を特定する特定情報で置換するステップと、
    前記命令列内の前記専用命令の読み出しに応答して、該専用命令と共に置換された前記特定情報から前記メモリ領域を取得し、該メモリ領域を用いて前記付加処理を実行するステップと、
    取得された前記メモリ領域にコピーされた前記特定の命令を参照して、該特定の命令によりなされる処理と同じ処理を行うステップと
    を実行させ、前記命令実行プログラムは、前記専用命令に応答して呼び出される専用命令のハンドラと、前記特定の命令に応答して呼び出される特定命令のハンドラとを含み、前記専用命令のハンドラは前記確保するステップと、前記置換するステップとを前記コンピュータに実行させ、前記特定命令のハンドラは、前記付加処理を実行するステップと、前記特定の命令によりなされる処理と同じ処理を行うステップとを前記コンピュータに実行させ、かつ、前記コンピュータに、前記特定の命令を処理すると共に、確保した前記メモリ領域の初期化を行わせる、
    命令実行プログラム。
JP2010148579A 2010-06-30 2010-06-30 命令実行装置、命令実行方法、及び命令実行プログラム Expired - Fee Related JP5489884B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2010148579A JP5489884B2 (ja) 2010-06-30 2010-06-30 命令実行装置、命令実行方法、及び命令実行プログラム
US13/165,850 US20120005460A1 (en) 2010-06-30 2011-06-22 Instruction execution apparatus, instruction execution method, and instruction execution program

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2010148579A JP5489884B2 (ja) 2010-06-30 2010-06-30 命令実行装置、命令実行方法、及び命令実行プログラム

Publications (2)

Publication Number Publication Date
JP2012014312A JP2012014312A (ja) 2012-01-19
JP5489884B2 true JP5489884B2 (ja) 2014-05-14

Family

ID=45400637

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2010148579A Expired - Fee Related JP5489884B2 (ja) 2010-06-30 2010-06-30 命令実行装置、命令実行方法、及び命令実行プログラム

Country Status (2)

Country Link
US (1) US20120005460A1 (ja)
JP (1) JP5489884B2 (ja)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9027003B2 (en) * 2008-03-31 2015-05-05 Vmware, Inc. Precise branch counting in virtualization systems
US9674141B2 (en) * 2013-12-27 2017-06-06 Intel Corporation Techniques for implementing a secure mailbox in resource-constrained embedded systems
US10191723B2 (en) * 2015-06-30 2019-01-29 Citrix Systems, Inc. Virtualization layer for mobile applications
US20180285240A1 (en) * 2017-04-04 2018-10-04 Microsoft Technology Licensing, Llc Instrumenting computer programs for telemetry data collection
US10552185B2 (en) * 2018-05-24 2020-02-04 International Business Machines Corporation Lightweight and precise value profiling

Family Cites Families (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5226127A (en) * 1989-04-07 1993-07-06 Intel Corporation Method and apparatus providing for conditional execution speed-up in a computer system through substitution of a null instruction for a synchronization instruction under predetermined conditions
JPH0540654A (ja) * 1991-08-05 1993-02-19 Tohoku Nippon Denki Software Kk 任意命令トレースシステム
JP3305841B2 (ja) * 1993-12-08 2002-07-24 株式会社東芝 プログラム制御装置
US6112025A (en) * 1996-03-25 2000-08-29 Sun Microsystems, Inc. System and method for dynamic program linking
US5870607A (en) * 1996-09-11 1999-02-09 Brown University Research Foundation Method and apparatus for selective replay of computer programs
US6289300B1 (en) * 1998-02-06 2001-09-11 Analog Devices, Inc. Integrated circuit with embedded emulator and emulation system for use with such an integrated circuit
US6151709A (en) * 1998-02-13 2000-11-21 Novell, Inc. Processes and apparatuses for uploading instructions to a computer
US6735689B1 (en) * 2000-05-01 2004-05-11 Raza Microelectronics, Inc. Method and system for reducing taken branch penalty
EP1644853A4 (en) * 2003-07-01 2007-01-17 Stream Engineering Corp CONTEXT-RELATED STREAMING SYSTEM AND METHOD
US7849452B2 (en) * 2004-04-23 2010-12-07 Waratek Pty Ltd. Modification of computer applications at load time for distributed execution
US7526608B2 (en) * 2004-05-28 2009-04-28 Sony Computer Entertainment Inc. Methods and apparatus for providing a software implemented cache memory
US7921407B2 (en) * 2004-08-10 2011-04-05 Oracle America, Inc. System and method for supporting multiple alternative methods for executing transactions
US20060225049A1 (en) * 2005-03-17 2006-10-05 Zhiyuan Lv Trace based signal scheduling and compensation code generation
US7669186B2 (en) * 2005-11-16 2010-02-23 Sun Microsystems, Inc. Debugging applications at resource constrained virtual machines using dynamically installable lightweight agents
JP2008204013A (ja) * 2007-02-16 2008-09-04 Seiko Epson Corp スレッド動作異常検知方法、マルチスレッドシステム
US8667476B1 (en) * 2009-01-20 2014-03-04 Adaptmicrosys LLC Instruction grouping and ungrouping apparatus and method for an adaptive microprocessor system

Also Published As

Publication number Publication date
US20120005460A1 (en) 2012-01-05
JP2012014312A (ja) 2012-01-19

Similar Documents

Publication Publication Date Title
US8832672B2 (en) Ensuring register availability for dynamic binary optimization
US7203941B2 (en) Associating a native resource with an application
US9235433B2 (en) Speculative object representation
US8510710B2 (en) System and method of using pooled thread-local character arrays
TWI442235B (zh) 記憶體交易群組
US7406684B2 (en) Compiler, dynamic compiler, and replay compiler
US8843920B2 (en) Systems and methods for deferring software implementation decisions until load time
JP2012506094A (ja) ランタイムにおいて生成したコードのキャッシュへの格納
US20090319554A1 (en) Unified metadata for external components
JP2009032252A (ja) クラッシュダンプ用のメモリアロケーション
JP5489884B2 (ja) 命令実行装置、命令実行方法、及び命令実行プログラム
US11579855B2 (en) Reduced memory consumption of compiler-transformed asynchronous methods
EP2080115B1 (en) Automatic native generation
JP5719278B2 (ja) 情報処理装置、プロファイル対象決定プログラム及び方法
JP2009152790A (ja) 動的再構成支援プログラム、動的再構成支援方法、動的再構成回路、動的再構成支援装置および動的再構成システム
JP2008003882A (ja) コンパイラプログラム,リストベクトルの領域割当て最適化方法,コンパイル処理装置およびコンパイラプログラムを記録したコンピュータ読み取り可能な記録媒体
US20190265956A1 (en) Compiler-Generated Asynchronous Enumerable Object
JP5871589B2 (ja) 情報処理装置、配列の初期サイズ調整プログラム及び方法
KR20060035077A (ko) 데이터 처리 장치 및 이를 이용한 레지스터 할당 방법
JP2003241967A (ja) プログラム実行装置およびその方法、並びにそこで実行されるプログラム
JP6245028B2 (ja) 実行制御方法、実行制御プログラムおよび実行制御装置
JP6691294B2 (ja) 情報処理装置、ダイナミックリンクプログラムおよびプログラム再開方法
JP2009064125A (ja) サーバ装置、そのプログラム
JP2014130401A (ja) プログラム生成装置、プログラム生成方法、および、コンピュータ・プログラム
JP2009223841A (ja) 命令ログ取得プログラム及び仮想計算機システム

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20130304

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20131129

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20131203

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20140106

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20140121

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20140204

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20140225

R150 Certificate of patent or registration of utility model

Ref document number: 5489884

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees