(57)【要約】      （修正有）【課題】他のＣＰＵを停止させることなく、ある命令列を別の命令列に変更する方法であって、命令変更処理のオーバヘッドと、変更後のソフトウェア実行のオーバヘッドの両方を少なくできる、命令の動的変更方法を提供する。【解決手段】変更対象箇所の命令列を特定し、バイパス経路に、変更対象箇所の命令列相当の命令列を設ける。変更対象箇所の命令列の先頭部分を１命令にて例外発生命令に変更し、バイパス経路に設けられた命令列を実行。バイパス経路の通過は以下の処理が完了するまでに限られる。全てのＣＰＵにおいて、全てのスレッドが、変更対象箇所の命令列を実行しなくなったことを確認。変更対象箇所の命令列の先頭部分でない部分を、所望の命令列に変更する。上記で行った例外発生命令への変更を「実行位置を移す所望の命令列の前半部分」に置き換える。バイパス経路上に有る命令列の実行を中止し、変更後の対象個所の命令列を実行するためである。【選択図】  図１３
2006277429.tif 000002
【特許請求の範囲】
【請求項１】
メモリ上に展開されたマルチスレッドソフトウェア命令を実行する計算機システムにおいて、
変更対象箇所の命令列を特定する第１のステップと、
バイパス経路を設ける第２のステップと、
前記バイパス経路に、変更対象箇所の命令列相当の命令列を設ける第３のステップと、
前記変更対象箇所の命令列の先頭部分を、例外発生命令に一命令で変更する第４のステップと、
前記例外発生命令が指示する、前記バイパス経路に設けられた命令列を実行させる第５のステップと、
全てのＣＰＵにおいて、全てのスレッドが、前記バイパス経路に設けられた命令列を実行していることを確認する第６のステップと、
前記変更対象箇所の命令列の先頭部分でない部分を、所望の命令列に変更する第７のステップと、
を有することを特徴とする、命令の動的変更方法。
【請求項２】
請求項１記載の命令の動的変更方法において、
第７のステップが、前記変更対象箇所の命令列の先頭部分でない部分を、所望の命令列の先頭部分でない部分に置き換えるステップであり、更に、
前記変更対象箇所の命令列の先頭部分を、所望の命令列の先頭部分に置き換える第８のステップを有する、命令の動的変更方法。
【請求項３】
請求項１記載の命令の動的変更方法において、
第２のステップと第３のステップが、前記変更対象箇所の命令列を、メモリ上の別の場所に複製するステップである、命令の動的変更方法。
【請求項４】
請求項１記載の命令の動的変更方法において、
第６のステップの確認は、ソフトウェア命令の処理の合間で不定期に実行される、ソフトウェア遅延処理による、命令の動的変更方法。
【請求項５】
請求項１記載の命令の動的変更方法において、
第６のステップの確認は、他のＣＰＵに割り込み信号を送り、それまでの処理とは非同期的にある処理を実行させる、ＣＰＵ間割り込み機能による、命令の動的変更方法。
【請求項６】
請求項１記載の命令の動的変更方法において、
第６のステップの確認は、定期的にある処理を実行させる、タイマ割り込み機能による、命令の動的変更方法。
【請求項７】
請求項１記載の命令の動的変更方法において、
第６のステップの確認は、例外発生命令によって発生した例外処理による、命令の動的変更方法。
【請求項８】
請求項１記載の命令の動的変更方法において、
第７のステップの所望の命令列は、実行位置を変える命令である、命令の動的変更方法。
【請求項９】
請求項１記載の命令の動的変更方法において、
第６のステップの確認に際し、
前記変更対象箇所の命令列を実行しているスレッドが有れば、そのスレッドを優先的に実行させる、命令の動的変更方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、計算機内部の命令実行手順に係り、特に、バイパス経路を用いて命令実行を動的に変更する方法に関する。
【背景技術】
【０００２】
１又は複数のＣＰＵを持つ計算機において、計算機の性能測定や障害記録のために、ある命令を実行した際に、別の命令を呼び出して状態を調べることが必要とされ、これをプローブという。
また、ある命令に不良があり、ソフトウェアを実行中に、別の命令に置き換えることで、不良のある命令を回避することが為されるが、これをライブパッチという。
どちらも、その時点でメモリ上の実行領域にある命令を実行する代わりに、新しい命令を実行することとなる。このように、実行命令を変更するための従来の手法としては以下の方法がある。
【０００３】
１．メモリ上で、命令の先頭部分を特定の例外発生命令に変更し、例外を発生させて特定の処理を実行させる、デバッグ割り込み方法。
この方法は、例えば、非特許文献１の７頁、 Probe Mechanismにおいて、ブレークポイント例外を発生させてprobe actionと呼ばれる処理を実行する方法として、紹介されている。
【０００４】
２．命令の変更時に他のＣＰＵ(Central Processing Unit)が変更対象命令コードを実行しないことを保証した上で、メモリ上で、ある位置の命令列を、別の位置へジャンプする命令に変更する方法。
この方法は、例えば、非特許文献２の３.１において、シングルスレッドで割り込みがない場合に、安全に行えることが紹介されている。
なお、非特許文献３については後述する。
【０００５】
【非特許文献１】Dynamic Probes - Debugging by Stealth (Jan 2003)Presented by Suparna Bhattacharya at Linux.Conf.Au 2003(http://www-124.ibm.com/linux/papers/dprobes/lca03/dprobes-lca2003.pdf)
【非特許文献２】David J., Paul H.J. Kelly, Tony Field and Uli Harder. GILK: A dynamic instrumentation tool for the Linux Kernel. In Proceedings of the 12th International Conference on Computer Performance Evalution, TOOLS 2002, LNCS 2324
【非特許文献３】IA-32 Intel Architecture Software Developer's Manual Volume2A
【発明の開示】
【発明が解決しようとする課題】
【０００６】
上述のデバッグ割り込み方法では、対象命令が実行されると必ず割り込み処理が発生するため、実行のオーバヘッドが大きく、計算機の性能を下げてしまう。
また、上述のジャンプする命令に変更する方法は、マルチスレッドのような並列処理を行うプログラムには、同時に同一の処理ができないため、適用できない。
なお、マルチスレッドその他並列処理に対応させるため、他のＣＰＵの動作を止める命令を発生させ、他のＣＰＵが完全に停止するまで待って、メモリ上で、ある位置の命令列を、別の位置へジャンプする命令に変更する方法も、本願の発明者らによれば想定できる。しかしこの方法では、全てのＣＰＵの動作が止まるまで、実行を待たねばならず、命令変更処理自体の実行に多くの時間がかかってしまい、現実的でない。
【０００７】
本発明の目的は、上述の従来技術の課題を解決し、他のＣＰＵを停止させることなく、ある命令列を別の命令列に変更する方法であって、命令変更処理のオーバヘッドと、変更後のソフトウェア実行のオーバヘッドの両方を少なくできる、命令の動的変更方法を提供することにある。
【課題を解決するための手段】
【０００８】
次の複数の操作で、命令の動的変更を行う。
１）変更対象箇所の命令列を特定し、バイパス経路に、変更対象箇所の命令列相当の命令列を設ける。
２）変更対象箇所の命令列の先頭部分を、例外発生命令に変更し、これが指示する、バイパス経路に設けられた命令列を実行させる。他のスレッドが、変更対象箇所の命令列を実行しないようにするためである。また例外発生命令への変更は１命令で行う。他のスレッドの実行が不用意に待たされぬようにするためである。
【０００９】
なお、変更対象箇所の命令列を実行するたびに例外が発生し実行速度が低下するが、バイパス経路の「通過」は以下の処理が完了するまでに限られる。
３）全てのＣＰＵにおいて、全てのスレッドが、変更対象箇所の命令列を実行しなくなったこと、つまり、バイパス経路に設けられた命令列を実行していることを確認する。
４）変更対象箇所の命令列の先頭部分でない部分を、所望の命令列に変更する。例えば、「実行位置を移す所望の命令列の後半部分」に変更する。
５）上記２）で変更対象箇所の命令列の先頭部分を、例外発生命令に変更しているが、この例外発生命令を「実行位置を移す所望の命令列の前半部分」に置き換える。バイパス経路上に有る命令列の実行を中止し、変更後の対象個所の命令列を実行するためである。
【発明の効果】
【００１０】
複数のＣＰＵを持つ計算機において、他のＣＰＵを停止させることなく、他のＣＰＵに影響を与えず、あるＣＰＵの命令列を別の命令列に変更することが可能になる。また、他のＣＰＵの待機時間を少なくすることができる。
【００１１】
より具体的には、上記の置き換え処理により、影響を受ける命令列（置き換え部分命令コード列）を、最小限にとどめられる優位性がある。
【発明を実施するための最良の形態】
【００１２】
以下に、本発明の実施の形態を説明する。
【実施例１】
【００１３】
図１は、本発明を適用可能な計算機の概要を示した図である。
計算機１は、1以上のＣＰＵ２−１（第一ＣＰＵ）、ＣＰＵ２−２（第２ＣＰＵ）が、同一の主記憶装置；メモリ３を共有し、これらはバス４その他の通信路で相互に接続されている。バス４は、ユーザが計算機１に対して処理要求ができるよう、入出力装置５につながっている。
また、各ＣＰＵは、例外発生機能１１、ＣＰＵが計算中の値を保持するためのレジスタ１２、命令を実行するメモリ３上のアドレスを決める実行位置レジスタ１３、デバッグ実行機能１４、複数のＣＰＵを識別できるようなＣＰＵ番号１５を有する。
【００１４】
ここで、例外発生機能１１とは、ある特定の例外発生命令コード１１１０(図１３)を実行した場合に、それまで実行していた命令とは非同期的に、特定の処理を実行する機能である。例外発生命令コード１１１０は、例えば非特許文献３の３-３５９に示されるINT3命令のように、そのＣＰＵの最小命令コード長の長さであり、1命令で書き換えることのできる命令である（後述）。
デバッグ実行機能１４とは、ある特定の位置のメモリにアクセスした、あるいは特定の位置の命令を実行した場合に、それまで実行していた命令とは非同期的に、特定の処理を実行する機能である。
【００１５】
図２に、メモリ３上に格納されているソフトウェア２０の構造を示す。
ソフトウェア２０はマルチスレッドに対応しており、複数のＣＰＵを有する場合、あるＣＰＵ２−１と別のＣＰＵ２−２が、同一のソフトウェア２０を共有し、非同期に命令を実行することが可能である。
【００１６】
置き換え開始処理２１は、本発明の動的変更方法に係る一連の処理を開始するための処理である。例外処理２２とは、ＣＰＵの例外発生機能１１により実行される処理である。デバッグ処理２３とは、ＣＰＵのデバッグ実行機能１４により実行される処理である。
ソフトウェア遅延処理２４とは、各々のＣＰＵで順序に従い実行されるソフトウェア２０自体の処理の合間に実行される処理であり、例えばスレッド切り替え処理２５を実行する直前に実行される。スレッド切り替え処理２５とは、ソフトウェア２０が実行する複数のスレッドを切り替えるための処理である。実行先切り替え処理２６とは、条件が合えば命令列の変更を実際に実行する処理である。これらの処理の詳細は図５以降で述べる。
【００１７】
置き換え部分命令コード列２７とは、ソフトウェア２０の命令コード列のうち命令の変更を行う対象となる部分の命令コード列（変更対象箇所の命令列）である。
置き換え先命令コード列２８とは、命令コード列の変更の後、置き換え部分命令コード列２７の代わりに実行する命令コード列（変更対象箇所の命令列相当の命令列）である。この置き換え先命令コード列２８の作成の例としては、非特許文献２に示す方法がある。この3.1節では、置き換え部分命令コード列２７の命令列を解析し、任意の命令列に、置き換え部分命令コード列２７相当の命令列を足し合わせて、置き換え先命令コード列２８を生成する。
【００１８】
置き換え動作フラグ２９とは、命令変更処理の動作状態を示すフラグであり、０にクリアされていれば何もしていないことを表し、１にセットされていれば命令を変更中であることを表す。
コピー命令コード列５０とは、置き換え部分命令コード列２７の内容を複製した命令コード列である。複製のタイミングは後述する置き換え開始処理２１より前であればいつでも良い。
置き換え部分命令コード列２７、置き換え先命令コード列２８、コピー命令コード列５０などの命令コード列は、複数の命令コードによって成り立っている。
【００１９】
図３に確認完了フラグテーブル３０の構造を示す。
確認完了フラグテーブル３０は、ＣＰＵ２−１、２−２の各々において、置き換え部分命令コード列２７を実行していないことを確認したことを示すフラグである。このテーブル３０は、計算機１上にあるＣＰＵの数だけ、確認完了フラグ３１−１、３１−２、・・・・３１−ｎを持つ。この確認完了フラグ３１の番号は、それぞれＣＰＵ番号１５に対応している。
例えば、ＣＰＵ番号１５が１のとき、1番目の確認完了フラグ３１−１がそのＣＰＵ２−１の状態を表す。確認完了フラグ３１は１にセットされていれば置き換え部分命令コード列２７を実行していないことの確認が完了したことを表し、０にクリアされていればまだ確認が完了していないことを表す。確認完了フラグテーブル３０にあるすべての確認完了フラグ３１が１になっていれば、安全に、命令の変更を行うことができる。
【００２０】
図４に、実行コンテキストテーブル４０を示す。
それぞれのスレッドに対応した実行コンテキスト４１−１、４１−２、・・・・４１−ｎから成り立つ。一つの実行コンテキスト４１には、スレッド番号４２、レジスタ１２の値、実行位置レジスタ１３の値を保存するようになっている。
ここで、スレッドとは、非同期に動作する実行単位である。各スレッドは、独自に、スレッド番号４２、レジスタ１２と実行位置レジスタ１３の値、即ち実行コンテキスト４１を持ち、他のスレッドと同じメモリ３（図１）を共有する。
【００２１】
置き換え開始処理２１の処理手順を、図５を用いて説明する。
本発明において、例えば、入出力装置５を通して、ソフトウェア２０（図２）の置き換え部分命令コード列２７を実行する代わりに、置き換え先命令コード列２８を実行するように変更する要求があった場合には、この要求を受けたＣＰＵが、置き換え開始処理２１を実行する。
ＣＰＵは、この処理を二重に実行しようとしていないか、すなわち置き換え動作フラグ２９（図２）が０にクリアされているかどうかを調べる（ステップ５０１）。
置き換え動作フラグ２９が０でない場合は、置き換え開始処理２１を二重に実行しようとしているため、処理を終了する（ステップ５０２）。
【００２２】
置き換え動作フラグ２９が０である場合は、置き換え処理を実行する。
まず確認完了フラグテーブル３０を全て０にクリアし（ステップ５０５）、例外が発生した場合に例外処理２２を呼び出すように、すべてのＣＰＵ２の例外発生機能１１を設定する（ステップ５０６）。さらに置き換え部分命令コード列２７の先頭が格納されている位置に、例外発生命令コード１１１０を一命令で書き込む（図５のステップ５０７、図１３）。
置き換え動作フラグを１にセットし（ステップ５０８）、実行先切り替え処理２６を実行して（ステップ５０９）、終了する（ステップ５０２）。ＣＰＵ２が置き換え開始処理２１のステップ５０７で埋め込んだ例外発生命令コード１１１０を実行すると、例外処理２２が実行される。
【００２３】
図６を用いて、例外処理２２の処理手順を説明する。
実行位置レジスタ１３を含む全てのレジスタ１２の状態をメモリ３に保存する（ステップ６０１）。コピー命令コード列５０中の一命令目を実行した直後にデバッグ処理２３を実行するように、デバッグ実行機能１４を設定する（ステップ６０２）。
ステップ６０１で保存したメモリ３の内容のうち、実行位置レジスタ１３の値を、コピー命令コード列５０を実行する値に変更する（ステップ６０３）。メモリ３に保存した、全てのレジスタ１２を復帰して命令の実行を再開する（ステップ６０４）。ここで再開される命令は、コピー命令コード列５０の命令である。
例外処理２２のステップ６０２、あるいは後述するデバッグ処理２３のステップ７０３においてデバッグ実行機能１４を設定したため、コピー命令コード列５０を一命令実行すると、デバッグ処理２３が実行される。
【００２４】
図７を用いて、デバッグ処理２３の処理手順を説明する。
実行位置レジスタ１３を含む全てのレジスタ１２の状態をメモリ３に保存する（ステップ７０１）。メモリ３上に保存した実行位置レジスタ１３の値が、コピー命令コード列５０の範囲内にあるかどうか、つまりコピー命令コード列５０に含まれる複数の命令コードのどれかを指しているかどうかを調べる（ステップ７０２）。
範囲内にあるなら、つまりコピー命令コード列５０に含まれる複数の命令コードのどれかを指しているなら、実行位置レジスタ１３の値が示す位置の命令を実行した直後にデバッグ処理２３を実行するように、デバッグ実行機能１４を設定する（ステップ７０３）。
【００２５】
もし実行位置レジスタ１３がコピー命令コード列５０の範囲外に出ている、つまりコピー命令コード列５０に含まれる複数の命令コードのどれも指していないなら、メモリ３上の元の実行位置レジスタ１３から、コピー命令コード列５０の先頭位置を引き（ステップ７０４）、置き換え部分命令コード列２７の位置を、メモリ３上の元の実行位置レジスタ１３に足す（ステップ７０５）。
全てのレジスタ１２を復帰させてデバッグ処理から復帰し、実行を再開する（ステップ７０６）。
【００２６】
通常の処理実行中にコンテキストスイッチが起きた場合には、スレッド切り替え処理２５（図２）が実行される。
スレッド切り替え処理２５では、ＣＰＵ２のレジスタ１２と、実行位置レジスタ１３とをまとめて、実行コンテキスト４１として、実行コンテキストテーブル４０に保存する。これに伴い、別の実行コンテキスト４１からレジスタ１２と実行位置レジスタ１３を復帰させる。
【００２７】
図８を用いて、ソフトウェア遅延処理２４（図２）の処理手順を説明する。通常の処理実行中に、アイドル状態に達した場合や、コンテキストスイッチが起きる直前などに、ソフトウェア遅延処理２４が実行される。
置き換え動作フラグ２９（図２）の値が０であるかを調べ（ステップ８０１）、０でなければ実行先切り替え処理２６を実行する（ステップ８０２）。そしてソフトウェア遅延処理２４を終了する。（ステップ８０３）
図９を用いて、実行先切り替え処理２６の処理手順を説明する。
ソフトウェア遅延処理２４のステップ８０２（図８）から実行先切り替え処理２６が実行される。まず、実行コンテキストテーブル４０を検索し、実行位置レジスタ１３の値が置き換え部分命令コード列２７の位置になっている実行コンテキスト４１を探す（ステップ９０１）。
実行位置レジスタ１３の値が置き換え部分命令コード列２７の位置になっているものがあるならば（ステップ９０２）、何もしないで処理を終了する（ステップ９０８）。もし該当するものがなければ、確認完了フラグテーブル３０のうち、自分のＣＰＵ番号１５の確認完了フラグ３１を１にセットする（ステップ９０３）。
【００２８】
確認完了フラグテーブル３０の確認完了フラグ３１が全て１にセットされたかどうかを確認し（ステップ９０４）、確認完了フラグ３１のうち、ひとつでも１でなければ、別のＣＰＵ２において、まだ実行先切り替え処理２６が実行されていないことを示している。この場合、処理を終了する（ステップ９０８）。
すべて１にセットされていれば、実行位置変更命令コード列１１１１（図１３）のうち、置き換え開始処理２１で書き込んだ例外発生命令コード１１１０に重ならない部分だけを書き込む（ステップ９０５）。
続いて、実行位置変更命令コード列１１１１のうち、例外発生命令コード１１１０に重なる部分を一命令で書き込む（ステップ９０６）。
【００２９】
本発明では、このように、一命令で書き込めない命令を書き込むに際し、実行されない命令部分（図において「後半」と表示する、先頭部分でない部分）を先に何命令か費やして書き込み、最後に一命令で先頭部分を書き込むことにより、書き込み操作における命令実行の正当性を保障している。
命令の変更後、置き換え動作フラグを０にクリアして（ステップ９０７）、実行先切り替え処理２６を終了する（ステップ９０８）。この実行先切り替え処理２６は、各々のＣＰＵ２において、少なくとも一度は実行される必要がある。
【００３０】
図１０を用いて、置き換え部分命令コード列２７（図２）を実行する代わりに、置き換え先命令コード列２８を実行する場合の処理を説明する。図１０は、例えば、第一ＣＰＵ２−１、第二ＣＰＵ２−２を有する計算機上で、かかる処理がどのよう為されるかを示す、タイムチャートである。
第一ＣＰＵ２−１で、置き換えを行う要求が発生したとする。
まず、第一ＣＰＵ２−１上で置き換え開始処理２１を実行し、確認完了フラグテーブル３０を全て０にする（図５、ステップ５０５）。また置き換え部分命令コード列２７の先頭部分を例外発生命令コード１１１０に書き換える（処理１０１、図５のステップ５０７）。
【００３１】
そのまま、第一ＣＰＵ２−１で実行先切り替え処理２６を実行し（図５、ステップ５０９）、置き換え部分命令コード列２７を実行しているスレッドがなければ（図９、ステップ９０２）、第一ＣＰＵ２−１に対応する確認完了フラグテーブル３０のうち、自分の確認完了フラグ３１−１を１にセットする（状態１０６、図９のステップ９０３）。
しかし全ての確認完了フラグ３１が１にセットされていないので（ステップ９０４）、そのまま切り替え処理を終了する（処理１０２、図９のステップ９０８）。
【００３２】
この後、第二ＣＰＵ２−２で、ソフトウェア遅延処理２４が実行された場合には（図１０、処理１０３）、置き換え動作フラグ２９（図２）が１になっているため、実行先切り替え処理２６を実行する。
実行先切り替え処理２６では第二ＣＰＵ２−２に対応する確認完了フラグテーブル３０の確認完了フラグ３１−２をセットし（状態１０７、図９のステップ９０３）、このとき全ての確認完了フラグテーブル３０が１にセットされたので（ステップ９０４）、第二ＣＰＵ２−２は置き換え部分命令コード列２７を、実行位置変更命令コード列１１１１に書き換える処理を実行する（図１０の処理１０４、図９のステップ９０５〜９０８）。
これ以降、変更部分では置き換え先命令コード列２８が実行される。
【００３３】
図１１タイムチャートを用いて、第一ＣＰＵ２−１が処理１０１（図１０）の置き換え開始処理２１のステップ５０７を実行した後に、第二ＣＰＵ２−２が置き換え部分命令コード列２７を実行しようとした場合の動作を説明する。
この例では、コピー命令コード列５０が、ある２つの命令コード（コード１とコード２）を含んでいるとする。
【００３４】
第一ＣＰＵ２−１上では置き換え開始処理２１を実行し、確認完了フラグテーブル３０を全て０にする（図５、ステップ５０５）。また、置き換え部分命令コード列２７の先頭部分を、例外発生命令コード１１１０に書き換える（図１１の処理１０１、図５のステップ５０７）。そのまま、第一ＣＰＵ２−１で実行先切り替え処理２６を実行し、第一ＣＰＵ２−１に対応する確認完了フラグテーブル３０のうち、自分の確認完了フラグ３１−１を１にセットする（図１１の処理１０２、図９のステップ９０３）。
【００３５】
処理１０１の置き換え開始処理２１のステップ５０７を完了した時刻ｔ（１１４）で、第二ＣＰＵ２−２が置き換え部分命令コード列２７を実行すると、置き換えた例外発生命令コード１１０を実行することで、例外処理２２（図２）が実行される（処理１１１）。もしステップ５０７が完了する前に、置き換え部分命令コード列２７が実行されると、例外処理２２は発生せず、変更前の置き換え部分命令コード列２７が実行される。
【００３６】
例外処理２２の実行後、実行位置レジスタ１３はコピー命令コード列５０のコード１の一命令目を指しており（状態１１５）、コピー命令コード列５０を一命令実行すると、デバッグ実行機能１４によりデバッグ処理２３が実行される（デバッグ処理１１２）。
デバッグ処理２３のステップ７０２において、実行位置レジスタ１３がコピー命令コード列５０のコード２を指している（状態１１６）ため、続けてコード２を一命令実行し、再びデバッグ実行機能１４によりデバッグ処理２３が実行される（処理１１３）。次にデバッグ処理２３のステップ７０２において、実行位置レジスタ１３がコピー命令コード列５０をさしていない（状態１１７）ため、コピー命令コード列５０の実行を終了する（デバッグ処理１１３の終了）。
【００３７】
次に、第二ＣＰＵ２−２で、ソフトウェア遅延処理２４が実行されると（処理１０３）、置き換え動作フラグ２９が１になっているために実行先切り替え処理２６を実行する。実行先切り替え処理２６では、第二ＣＰＵ２−２に対応する確認完了フラグテーブル３０の確認完了フラグ３１−２を１にセットし（ステップ９０３）、このとき全ての確認完了フラグテーブル３０が１にセットされていることを確認し（ステップ９０４）、第二ＣＰＵ２−２は置き換え部分命令コード列２７を実行位置変更命令コード列１１１１に書き換える（図１１の処理１０４、図９のステップ９０５〜９０８）。
【００３８】
図１２のタイムチャートを用いて、処理１０２の実行先切り替え処理２６を実行した際に、変更対象の置き換え部分命令コード列２７が実行中である場合の動作を説明する。実行コンテキストテーブル４０に、実行位置レジスタ１３の値が、置き換え部分命令コード列２７の位置になっている、実行コンテキスト４１があった場合が該当する。
【００３９】
第一ＣＰＵ２−１上で置き換え開始処理２１を実行し、置き換え部分命令コード列２７の先頭部分を例外発生命令コード１１１０に書き換える（処理１０１）。そのまま、第一ＣＰＵ２−１で実行先切り替え処理２６を実行するが、図１２の状態１２４に示すように、実行コンテキストテーブルの中に、スレッド番号３の実行位置レジスタの値が、置き換え部分命令コード列２７の位置になっているコンテキストが存在するため、確認完了フラグテーブル３０を０のままとして、終了する（処理１０２）。
【００４０】
スレッド切り替え処理２５が実行され（処理１２１）、それまで第一ＣＰＵ２−１で実行していたスレッド番号４のスレッドと、スレッド番号３のスレッドとが切り替えられる。すると、実行コンテキストテーブル４０の全ての実行位置レジスタ１３の値は、置き換え部分命令コード列２７の位置でなくなる（状態１２５）。
この後、第二ＣＰＵ２−２で、ソフトウェア遅延処理２４が実行され（処理１０３）、置き換え動作フラグ２９が１になっているために実行先切り替え処理２６を実行する。実行先切り替え処理２６では、置き換え部分命令コード列２７を実行していなければ、第二ＣＰＵ２−２に対応する確認完了フラグテーブル３０の確認完了フラグ３１−２を１にセットする（処理１０４）。
【００４１】
第一ＣＰＵ２−１で、ソフトウェア遅延処理２４が実行され（処理１２２）、置き換え動作フラグ２９が１になっているために実行先切り替え処理２６を実行する。実行先切り替え処理２６では、置き換え部分命令コード列２７を実行していなければ、第一ＣＰＵ２−１に対応する確認完了フラグテーブル３０の確認完了フラグ３１−１を１にセットする。
こうして全ての確認完了フラグテーブル３０が１にセットされたため、第一ＣＰＵ２−１は置き換え部分命令コード列２７を実行位置変更命令コード列１１１１に書き換えることができる（処理１２３）。
【００４２】
図１３を用いて、ソフトウェア２０の置き換え部分命令コード列２７を実行する代わりに、置き換え先命令コード列２８を実行する場合（図１０）の、メモリ３の状態変化の様子を説明する。
置き換え要求が発生する前の状態（図１０の処理１０１前）では、置き換え部分命令コード列２７は、メモリ３上に存在する（図１３、状態１１０１）。この時点では、ＣＰＵ２がこの部分の命令を実行するときは置き換え部分命令コード列２７を実行する。
【００４３】
置き換え開始処理２１のステップ５０７を実行した後（図１０の処理１０１以降）では、置き換え部分命令コード列２７の先頭位置に例外発生命令コード１１１０が書き込まれている（状態１１０２）。この時点では、ＣＰＵ２がこの部分の命令を実行するときには、例外処理２２を通じて、コピー命令コード列５０（図２）を実行する。
置き換え先命令コード列２８への実行位置を変更するための実行位置変更命令コード列１１１１は、メモリ３上に一命令で完全に書き込むことはできない。このため、実行先切り替え処理２６（図１０の処理１０４）のステップ９０５（図９）を実行した直後の状態では、例外発生命令コード１１１０は残したまま、実行位置変更命令コード列１１１１のうち、先頭部分の一命令で書き込める部分だけを残し、残りの部分（図中、「後半」と表示する）だけを書き込んでいる（状態１１０３）。
この時点でも、ＣＰＵ２がこの部分の命令を実行するときには、例外処理２２を通じて、コピー命令コード列５０を実行する。
【００４４】
実行先切り替え処理２６を実行し終わった状態（図１０の処理１０４以降）では、例外発生命令コード１１１０も含めて、実行位置変更命令コード列１１１１に書き換わる（状態１１０４）。この時点で、ＣＰＵ２がこの部分の命令を実行するときには、実行位置変更命令コード列１１１１を通じて、置き換え先命令コード列２８を実行する。
【００４５】
以上に説明した方法を用いることにより、第一の実施形態の計算機１は、複数のＣＰＵ２を持った計算機１上であっても、全てのＣＰＵ２を待たせることなく、要求があったＣＰＵとは別のＣＰＵにおいて、実行位置変更命令コード列１１１１を安全に書き込むことが可能である。
【００４６】
以下に、実施例１に基づいて、その一部を別の技術的手段に置換し、実施例１と同等の効果を奏する方法（実施例２乃至実施例７）を示す。
【実施例２】
【００４７】
実施例１の図２で示すメモリ３に、新たに、復旧開始処理１４１と実行先復旧処理１４２を追加し、図２のソフトウェア遅延処理２４と置き換え動作フラグ２９を一部、修正して、それぞれ、ソフトウェア遅延処理２４’、置き換え動作フラグ２９’とし、実施例２としても良い。
置き換え動作フラグ２９’は、その値が０にクリアされていれば何も動作しておらず、１にセットされていれば命令を変更中（置き換え動作中）であり、−１にセットされていれば命令を復旧中であることを表す機能を有する。
【００４８】
図５を流用して、復旧開始処理１４１の処理の流れを説明する。
ステップ５０１と同様に、置き換え動作フラグ２９’が０にクリアされているかどうかを調べる。０でない場合は、前回の置き換え処理が完了していないので、エラーを返して終了することとする。「エラーを返して終了する」という箇所が、ステップ５０１のＮＯの処理と異なる。
【００４９】
置き換え動作フラグ２９’が０である場合は、確認完了フラグテーブル３０を全て０にクリアし（ステップ５０５と同様）、例外が発生した場合に例外処理２２を呼び出すように、すべてのＣＰＵ２の例外発生機能１１を設定する（ステップ５０６と同様）。さらに置き換え部分命令コード列２７の先頭が格納されている位置に、例外発生命令コード１１１０を一命令で書き込む（ステップ５０７と同様）。置き換え動作フラグを−１にセットし（ステップ５０８と同様、ただし値を−１とする点において異なる）、実行先切り替え処理２６を実行する（ステップ５０９と同様）。
【００５０】
図８を流用して、ソフトウェア遅延処理２４’の処理手順を説明する。
置き換え動作フラグ２９’が０であるかどうかを調べ（ステップ８０１と同様）、０であれば、そのまま終了する（ステップ８０５と同様）。
０でないとき、置き換え動作フラグ２９’が１であるかどうかを調べ（以下、図８に示されないステップ）、１ならば実行先切り替え処理２６を実行する。置き換え動作フラグ２９’が０でも１でもない、すなわち−１であれば、実行先復旧処理１４２を実行する。そしてソフトウェア遅延処理２４を終了する（８０３と同様）。
【００５１】
図９を流用して、実行先復旧処理１４２の処理手順を説明する。
実行コンテキストテーブル４０を検索し、実行位置レジスタ１３の値が実行位置変更命令コード列１１１１の位置になっている実行コンテキスト４１を探す（ステップ９０１と同様）。
実行位置レジスタ１３の値が置き換え部分命令コード列２７の位置になっている実行コンテキスト４１が見つかったならば（ステップ９０２、YESと同様）、何もしないで終了する（ステップ９０８と同様）。
【００５２】
もし該当する実行コンテキスト４１がなければ、確認完了フラグテーブル３０のうち、自分のＣＰＵ番号１５の確認完了フラグ３１をセットする（ステップ９０３と同様）。
確認完了フラグテーブル３０が全て１にセットされているかどうか調べ（ステップ９０４と同様）、一つでも０ならば終了する（ステップ９０８と同様）。すべて１にセットされているなら、コピー命令コード列５０のうち、復旧開始処理１４１のステップ１３０７で書き込んだ、例外発生命令コード１１１０に重ならない部分だけを書き込む（ステップ９０５と同様、ただし「コピー命令コード列のうち」の箇所が異なる）。
続いて、例外発生命令コード１１１０に重なる部分を一命令で書き込む（ステップ９０６と同様、ただし「コピー命令コード列のうち」の箇所が異なる）。置き換え動作フラグを０にクリアし（ステップ９０７と同様）、処理を終了する（ステップ９０８と同様）。
【実施例３】
【００５３】
図１の計算機１の構成に、あるＣＰＵが他のＣＰＵにそれまでの処理とは非同期的に、ある処理を実行させる、ＣＰＵ間割り込み機能１６を追加したものである。
メモリ３上には、実施例１の構成に加えて、ＣＰＵ間割り込み機能１６により実行される、ＣＰＵ間割り込み処理１９１を有している。
【００５４】
図５を流用して、実施例３の置き換え開始処理２１のフローを説明する。
置き換え動作フラグ２９が０にクリアされているかどうかを調べる（ステップ５０１と同様）。０でない場合は、前回の置き換え処理が完了していないので、エラーを返して終了する。「エラーを返して終了する」という箇所が、ステップ５０１のＮＯの処理と異なる。
【００５５】
置き換え動作フラグ２９が０である場合は、確認完了フラグテーブル３０を全て０にクリアし（ステップ５０５と同様）、例外が発生した場合に例外処理２２を呼び出すように、すべてのＣＰＵ２の例外発生機能１１を設定する（ステップ５０６と同様）。
さらに置き換え部分命令コード列２７の先頭が格納されている位置に、例外発生命令コード１１１０を一命令で書き込む（ステップ５０７と同様）。
置き換え動作フラグを１にセットする（ステップ５０８と同様）。
【００５６】
ＣＰＵ間割り込み処理１９１が他のＣＰＵ２で実行されるように、ＣＰＵ間割り込み機能１６を設定する（図５のステップ５０８の次に介在する、図５には無いステップＡ）。ＣＰＵ間割り込み機能１６を動作させて（ステップＡの次に為される図示されないステップＢ）、実行先切り替え処理２６を実行する（ステップ５０９と同様）。
【００５７】
図８を流用して、ＣＰＵ間割り込み処理１９１の処理手順を説明する。
まず実行位置レジスタ１３を含む全てのレジスタ１２の状態をメモリ３に保存する。この準備のステップは図８には示されていない。
置き換え動作フラグが０であるかどうかを調べ（ステップ８０１と同様）、０でないなら、メモリ３上に保存した実行位置レジスタ１３の値が、置き換え部分命令コード列２７の範囲内かどうかを調べる（図示しないステップＣ）。レジスタ１３の値が置き換え部分命令コード列２７の範囲外であれば実行先切り替え処理２６を実行する（図示しないステップＤ）。
【００５８】
置き換え動作フラグが０である（ステップ８０１、YESと同様）か、レジスタ１３の値が置き換え部分命令コード列２７の範囲内（ステップＣ、YES）か、実行先切り替え処理２６を実行し終わったら（ステップＤ）、ＣＰＵ間割り込み処理１９１を実行するときに保存した全てのレジスタ１２を復帰して（図示しない復帰のステップ）、処理１９１を終了する（ステップ８０３と同様）。
【００５９】
ＣＰＵ間割り込み処理１９１のステップＣにおいて、実行位置レジスタ１３の値が、置き換え部分命令コード２７の範囲内である場合には、ＣＰＵ間割り込み処理１９１自体は実行先切り替え処理２６による命令コードの変更ができない。しかし、その後、ソフトウェア遅延処理２４が再度、実行先切り替え処理２６を実行するため、命令の変更は確実に行われる。
【００６０】
本実施例では、ソフトウェア遅延処理２４の実行よりも、ＣＰＵ間割り込み処理１９１の実行が早く行われる場合には、処理を高速化できる。ＣＰＵ間割り込み処理１９１で命令変更ができなくても、ソフトウェア遅延処理２４により命令の変更が行われる。
【実施例４】
【００６１】
図１の計算機１の構成に、ＣＰＵ２が定期的にある処理を実行させる、タイマ割り込み機能を追加したものである。メモリ３上では、図２のソフトウエア遅延処理２４に代わり、タイマ割り込み機能による、タイマ割り込み処理２３１が存在している。
各ＣＰＵが有するタイマ割り込み機能により、一定間隔で、タイマ割り込み処理２３１が実行される。ソフトウェア２０は、ソフトウェア遅延処理２４を持たないが、実施例１乃至３で用いたソフトウェア遅延処理２４は、タイマ割り込み処理２３１が代行できる。
【００６２】
図８を流用して、タイマ割り込み処理２３１の処理手順を説明する。
実行位置レジスタ１３を含む全てのレジスタ１２の状態を、メモリ３に保存する。この準備のステップは図８には示されていない。
置き換え動作フラグが０であるかどうかを調べ（ステップ８０１と同様）、０でないなら、メモリ３上に保存した実行位置レジスタ１３の値が、置き換え部分命令コード列２７の範囲内かどうかを調べる（図示しないステップＥ）。
【００６３】
実行位置レジスタ１３の値が、置き換え部分命令コード列２７の範囲外であれば、実行先切り替え処理２６を実行する（図示しないステップＦ）。
置き換え動作フラグが０である（ステップ８０１、YESと同様）か、実行位置レジスタ１３の値が、置き換え部分命令コード列２７の範囲内（ステップＥ、YES）か、実行先切り替え処理２６を実行し終わったら（ステップＦ）、タイマ割り込み処理２３１を実行するときに保存した、全てのレジスタ１２を復帰して（図示しない復帰のステップ）、処理２３１を終了する（ステップ８０３と同様）。
【００６４】
タイマ割り込み処理２３１が、ＣＰＵ毎に実行できる場合には、この方法を使うことができ、しかも一定時間毎に必ず実行されることが分かっているため、実行先切り替え処理２６を確実に行うことができる。
【実施例５】
【００６５】
ソフトウェア２０からソフトウェア遅延処理２４を省き、例外処理２２の処理において、ソフトウェア遅延処理２４で行っていた処理を行うものである。
図８を流用して、本実施例おける例外処理２２の処理手順を説明する。
例外処理２２では、すべてのレジスタの状態をメモリに保存する。この準備のステップは図８には示されていない。
置き換え動作フラグ２９の値が０かどうか調べ（ステップ８０１と同様）、０でなければ（ステップ８０１、NOと同様）、実行先切り替え処理２６を実行する（ステップ８０２と同様）。
【００６６】
実行先切り替え処理２６の終了後に、再び、置き換え動作フラグ２９の値が０でないかを調べ（図示しないステップＧ）、０でなければ（ステップＧ、YES）、コピー命令コード列５０のうち、１命令目を実行した直後に、デバッグ処理２３を実行するように、デバッグ実行機能１４を設定する（図示しないステップＨ）。そして、コピー命令コード列５０を実行するように、実行位置レジスタ１３を保存したメモリ３を変更する（図示しないステップＩ）。
【００６７】
最終的に、例外処理２２を実行するときに保存した、全てのレジスタ１２を復帰して（図示しない復帰のステップ）、処理２２を終了する（ステップ８０３と同様）。
本実施例では、ソフトウェア遅延処理２４や、タイマ割り込み機能１７、ＣＰＵ間割り込み１６など、特別な処理が不要であるため、ソフトウェア２０の処理を単純に実現することができる。
【実施例６】
【００６８】
実施例６における計算機１の構成では、実施例１に比べ、ＣＰＵ２は、デバッグ実行機能１４を省略して構成される。ソフトウェア２０は、デバッグ処理２３と、コピー命令コード列５０を有さない。
【００６９】
実施例１の図１３における、置き換え部分命令コード列２７を、実行位置変更命令コード列１１１１で置き換える方法を、本実施例では例外処理２２における、実行位置レジスタ１３の値を、所望の値で置き換える処理に適用している。
これにより、デバッグ処理２３やコピー命令コード列５０を用いてバイパス経路上の所定の命令を実行するのではなく、例外処理２２から直接、置き換え先命令コード列２８を実行できる。
【００７０】
図６を流用して、実施例６の例外処理２２の処理手順を説明する。
すべてのレジスタの状態をメモリに保存する（ステップ６０１と同様）。
置き換え先命令コード列２８を実行するように、実行位置レジスタ１３を保存したメモリ３を変更する（ステップ６０２、６０３に代わる図示しないステップＪ）。
例外処理２２を実行するときに保存した全てのレジスタ１２を復帰して処理を終了する（ステップ６０４と同様）。
【００７１】
デバッグ実行機能１４の無いＣＰＵ２に対しても、命令の動的変更が行える。また、コードを完全に変更する前に、置き換え先命令コード列２８を実行できるため、命令の変更後に行いたい処理を、置き換え開始処理の直後から実行することができる。
【実施例７】
【００７２】
実施例１のスレッド切り替え処理２５を変更し、実行位置レジスタ１３の値が置き換え部分命令コード列２７の位置になっている、実行コンテキスト４１を優先的に実行するようにする。
これにより処理を足止めしているスレッドを優先的に実行でき、コードの変更処理を速く終了できる。
【産業上の利用可能性】
【００７３】
他のＣＰＵを停止させることなく、他のＣＰＵに影響を与えず、高速に、あるＣＰＵの命令列を別の命令列に変更することが可能になるので、複数のＣＰＵを持つ計算機システムに広く適用できる。
【図面の簡単な説明】
【００７４】
【図１】本発明を適用可能な計算機の概要を示した図である。
【図２】メモリ３上に格納されているプログラムの構成例を示す図である。
【図３】確認完了フラグテーブル３０の構成例を表す図である。
【図４】実行コンテキストテーブル４０の構成例を示す図である。
【図５】実施例１における、置き換え開始処理２１の処理手順を表すフローチャートである。
【図６】実施例１における、例外処理２２の処理手順を表すフローチャートである。
【図７】デバッグ処理２３の処理手順を表すフローチャートである。
【図８】ソフトウェア遅延処理２４の処理手順を表すフローチャートである。
【図９】実行先切り替え処理２５の処理手順を表すフローチャートである。
【図１０】実施例１の置き換え部分命令コード列２７を、実行位置変更命令コード列１１１１（図１３）に変更する処理を表すタイムチャートである。
【図１１】実施例１における置き換え部分命令コード列２７を実行位置変更命令コード列１１１１に変更する処理において、他のＣＰＵが置き換え部分命令コード列２７を実行しようとして例外処理２２を実行した場合の処理を表すタイムチャートである。
【図１２】実施例１における置き換え部分命令コード列２７を実行位置変更命令コード列１１１１に変更する処理において、置き換え部分命令コード列２７を実行している実行コンテキスト４１があった場合の処理を表すタイムチャートである。
【図１３】ソフトウェア２０の置き換え部分命令コード列２７を実行する代わりに、置き換え先命令コード列２８を実行する場合（図１０）の、メモリ３の状態変化の様子を説明する図である。
【符号の説明】
【００７５】
１１…例外発生機能、    １３…実行位置レジスタ、
２５…スレッド切り替え処理、    ２６…実行先切り替え処理、
２７…置き換え部分命令コード列、    ２８…置き換え先命令コード列、
２９…置き換え動作フラグ、    ３１…確認完了フラグ、
５０…コピー命令コード列、    １１１０…例外発生命令コード、
１１１１…実行位置変更命令コード列。
【図１】
2006277429.tif 000003
【図２】
2006277429.tif 000004
【図３】
2006277429.tif 000005
【図４】
2006277429.tif 000006
【図５】
2006277429.tif 000007
【図６】
2006277429.tif 000008
【図７】
2006277429.tif 000009
【図８】
2006277429.tif 000010
【図９】
2006277429.tif 000011
【図１０】
2006277429.tif 000012
【図１１】
2006277429.tif 000013
【図１２】
2006277429.tif 000014
【図１３】
2006277429.tif 000015