説明

プログラムの配布方法およびシステム

【課題】 プログラマの介在なしにプログラムをダイナミックに再構成できるようにする方法およびシステムを提供する。
【解決手段】 システム上で実行しているプログラムのソースコードを変更することなく、コンピュータ・ネットワーク内の複数のコンピュータ間に、プログラムをダイナミックに配布することができる。さらに、この方法およびシステムは、システムの管理者が、ダイナミックに再構成されるプログラムのソーステキストを変更することなしに、再構成が行われる条件を指定できることを可能にする。

【発明の詳細な説明】
【0001】
【発明の属する技術分野】オブジェクトをコンピュータからコンピュータへダイナミックに移動する能力は有用であることは、長い間知られていた。例えば、オブジェクトを移動することは、システムがコンピュータ間にバランスを与えることを可能にする。さらに、オブジェクトを移動することは、システムがしばしば通信するオブジェクトをダイナミックに集合させ、ネットワーク・トラヒックを軽減し、システムの全性能を改善することを可能にする。
【0002】
【従来の技術】しかし、オブジェクトが再配置される(移行される)ことを可能にする現在のシステムは、重大な欠点に悩まされており、典型的に、専用プログラミング言語(または汎用言語への専用変更)、または専用オペレーティング・システムを必要とする。前者の場合、プログラマは新しいスキルを開発し、それらのコードを追加の構文で修飾しなければならない。後者の場合、得られるプログラムは、たまにしか利用されないシステム上での実行が制限される。
【0003】ダイナミック・オブジェクト配布(Dynamic Object Distribution:DOD)に関係する本発明は、これらの制限のいずれにも悩まされることのないシステムを開示する。好適な実施例では、プログラマは、プログラムを、特殊な構文または表記を付加することなしに、Javaプログラミング言語(Javaは、Sun Microsystemsの登録商標である)で簡単に書くことができる。そしてプログラムを、産業界で広く利用されている標準的なJava仮想マシーン(Java Virtual Machine:JVM)で実行する。
【0004】オブジェクト移行は、大学および産業界で広く研究されてきた。vカーネルのようなシステムは、vカーネルを実行するシステム上でのページベースの移行を可能にするが、vカーネルを有さないシステムは、移行を行うことができない。vカーネルは、オペレーティング・システム変更を要求するので、広くは用いられていない。ワシントン大学のAmberのようなシステムは、マルチプロセッサ・コンピュータのノード間で、オブジェクトを移行する。しかし、Amberは、プログラムを特殊な言語で書くことを必要とする。Amberの実行時間は、また、広く用いられていない。本発明の主な利点は、カーネルの変更を必要とせず、広く利用されている言語であるJavaで働くことである。
【0005】本発明に関連する出願としては、以下のものがある。
米国特許第08/852,263号明細書“A Process for Running Objects Remotely”米国特許第08/941,815号明細書“Apparatus and Method for Dynamically Modifying ClassFiles During Loading for Execution”
【0006】DODシステムは、オブジェクトについてのローカルおよびリモート“プロキシ(proxies)”を、バイトコード・ファイルから生成する。プロキシは、オブジェクトへの、およびオブジェクトからのメソッド・コールを代行受信し、コールをオブジェクトへ送る。オブジェクトがローカルであると(オブジェクトは移行されなかった)、ローカル・プロキシは、コールをオブジェクトへ直接に送り、オブジェクトがリモートであると(オブジェクトは移行された)、ローカル・プロキシは、コールをリモート・プロキシに送り、リモート・プロキシがコールをオブジェクトに送る。バイトコード変更ツールは、オブジェクトの名称と、オブジェクトへのリファレンスを調整し、オブジェクトとプロキシとの間で名称競合が発生しないことを保証する。
【0007】図1は、背景技術として、標準Javaオブジェクト上のメソッドから、他の標準Javaオブジェクトへのコール、つまり図1ではオブジェクトA101からオブジェクトB105へのコールを示している。図2および図3は、オブジェクトが移行した前後の典型的なコールのシナリオを示す。図2は、コールがローカル・プロキシ103を経てローカル・オブジェクト105に間接的に送られることを示している。図3は、コールが、ローカル・プロキシ103からリモート・プロキシ104へ、そしてリモート・マシーン上にあるオブジェクト106へ送られることを示している。
【0008】ユーザ指定の条件(または前述した“述語(predicates))”に基づいて、“移行スレッド(migratiion thread)”は、いつオブジェクトが移行されるべきかを決定する。“移行スレッド”は、コンピュータ上の資源をモニタして、いつ述語が満足されるかを決定する。(任意に、移行スレッドは、また、リモート・コンピュータについての情報を収集する。例えば、移行スレッドは、標準Unixのコマンド“ruptime”を用いてこのような情報を収集することができる。このコマンドは、リモート・コンピュータのプロセッサ負荷についての情報を戻す。このような情報は、移行の決定に用いることができる。)オブジェクトを移行するためには、移行スレッドは、ローカル・プロキシを命令して、メソッド・コールをリモート・プロキシへ送り、およびオブジェクトのシリアル化されたバージョンおよびそのリモート・プロキシをリモート・コンピュータへ送る。リモート・コンピュータでは、両方のオブジェクトは、アンシリアル化される。シリアル化は、図11に示され、さらにJavain a Nutshell,second edition,O‘Reilly,May 1997,pp.172−177に説明されている。シリアル化は、オブジェクトのフラット化であり、したがってオブジェクトは、ネットワークを経て、より効率的に転送できる。そして、アンシリアライザは、目的地で元のオブジェクトを再構成する。
【0009】
【発明が解決しようとする課題】本発明の目的は、プログラマの介在なしに、プログラムがダイナミックに再構成できるようにする方法を提供することにある。
【0010】本発明の他の目的は、システム上で実行されているプログラムのソース・テキストに変更することなく、システムがダイナミックに再構成可能となるようにすることにある。
【0011】本発明のさらに他の目的は、ダイナミックに再構成されるべきプログラムのソース・テキストに変更することなく、再構成が生じる条件を、管理者が特定できるようにすることにある。
【0012】本発明のさらに他の目的は、ユーザベースで再構成を行う条件を、プログラマが指定できるようにすることにある。
【0013】本発明のさらに他の目的は、配布の時にプログラマの介在なしに、システムをダイナミックかつ自動的に再構成することにある。
【0014】
【課題を解決するための手段】本発明により定義されるダイナミック・オブジェクト配布(DOD)は、入力として、次のものを有する。
―ソフトウェア・アプリケーションよりなるJavaクラス・ファイルのセット。各クラス・ファイルは、Javaバイトコードを含んでいる(Javaは、Sun Microsystems,Inc.の登録商標である。)
―プログラマが、移行を可能にすることを選択するオブジェクトのリスト。デフォルトによって、DODは、すべてのオブジェクトが移行可能であると仮定する。
―DODがオブジェクトを移行する条件(“述語”)のリスト。
【0015】
【発明の実施の形態】本発明(DOD)は、自動オブジェクト配布(AOD,前記した米国特許出願第08/852,363号明細書に記載されている)に類似のプロキシ方式を用いている。したがって、ここでAODについては簡単に触れておく。AODは、プログラマまたはシステム管理者が、プログラムが実行を開始する前のいつでも、プログラムをいかにクライアントおよびサーバのコンピュータに配布すべきかを可能にする。AODは、アプリケーションが配布アプリケーションとして実行することを可能にするコードを自動的に生成する。
【0016】しかし、前記したAODの発明について述べられているように、AODは、オブジェクトが実行時間にクライアントとサーバとの間を移行することを許さない。AODは、実行の前に、配布が完了することを要求する。実行時間の間にオブジェクトを移動して、サーバ負荷のような変化する状態に調整することは有益である。すなわち、サーバがよりビジーになると、より多くのクラスがクライアントに移動し、サーバの負荷を軽減する。本発明では、実行時間中にオブジェクトが移動することを可能にするAODへの強化について開示する。
【0017】まず、AODを再検討するのに、以下の例を用いる。オブジェクト“a”は、クラスAにより例示され、クラスAは、クラスBにより例示されるオブジェクト“b”を含んでいる(関係がある)ものとする。クラスBは、method foo()を有している。この状況に対する擬似コードを以下に示す。
【0018】


プログラマが、“a”は“b”から分割されるべきであると決定するならば、AODプロセスは、クラスBに対し2つのプロキシB′およびB″を生成するであろう。“a”から“b”へのコールは、プロキシB′によって代行受信され、ネットワークを経てプロキシB″へ送られ、プロキシB″はクラスBにローカル・コールを行い、結果を必要に応じて戻す。この構成が一度形成されると、構成は実行時間に変更できない。
【0019】ダイナミック・オブジェクト配布(DOD)は、AODを強化するものである。DODでは、プログラマは、どのクラスを最初にクライアントに与えるか、およびどのクラスを最初にサーバに与えるかのみならず、どのクラスを一方から他方へダイナミックに移動させるかを識別する。どのクラスを移動させるかについての識別は、プログラムが実行されるまではいつでも行うことができる。プログラマは、プログラム自体を変化させる(既知の技術であり、以下の説明を参照されたい)ことによってではなく、別個のファイルをリストに(例えば)タイプすることによって、これらのクラスを識別する。仕様の他のメソッドは、当業者には明らかであろう。実行時に、プログラマ指定の“述語”を用いて、オブジェクトの自動移行をトリガする。
【0020】DODプロセスは、以下のステップを含む。これらのステップ(本発明の好適な実施例としての)は、Javaプログラミング言語および実行環境で表されるが、他のオブジェクト指向プログラミング・システムでは、他の実施例も可能である。
1)Javaプログラミング言語のアプリケーションを有するクラスを書込む。
2)ソースJavaファイルを、Javaバイトコード・ファイルへコンパイルする。
3)どのオブジェクトが移動するのに利用できるかを識別する。
4)オブジェクトを移動できる述語(条件)を指定する。
5)システムの各クラスにより例示されたオブジェクトについて初期実行位置を指定する。
6)ローカルおよびリモート移行プロキシを生成する(以下に説明する)。
【0021】次に、ユーザは、プログラムをスタートさせる。プログラムが実行されるにつれて、DODプロセスは、ステップ4の述語が満足されたときに、オブジェクトを自動的に移動する。
【0022】これらの各ステップに加えて、DODは、“移行スレッド”を含んでいる。このスレッドは、システム資源をモニタする責任があり、述語(ステップ4に記述され、さらに以下に説明される)がいつ満足されたかを決定する。また、スレッドは、オブジェクト移行を開始させる。
【0023】このプロセスを、次に、詳細に説明する。ステップ1および2は、Javaについてのアプリケーション開発の標準部分である。従来の実施では、ステップ2の後に、ユーザによりアプリケーションが実行される。しかし、このアプリケーションは、オブジェクトをダイナミックに移動させる能力に欠けている。
【0024】次に、開発者が“モバイル(mobile)であることを望むクラスが識別される。モバイル・クラスにより例示されるオブジェクトは、DODによる移行のための候補である。プログラマが、リストに入らないことを選択すると、DODは、すべてのオブジェクトを移行できると仮定する。したがって、プログラマは、デフォルトによって、ソースの変更を行うことを必要とせず、さらに、オブジェクト移行を可能にするなんらの追加の作業を必要としない。これは、既知の技術から逸脱している。しかし以下に説明するように、可能な移行のためのオブジェクトを準備することは、システム・オーバヘッドを伴う。プログラマは、どのオブジェクトが移行されないかを知ることによって、このオーバヘッドを軽減することができる。プログラムに対し無変更を要求することは、別個のリストが必要とされるとしても、現在の技術に対してかなりの利点を与える。
【0025】ステップ4では、述語が指定される。これらの述語を用いて、システムのダイナミック動作を制御する。プログラマは、オブジェクトが移行される条件を識別する。例えば、O1〜O9で示されるオブジェクトがサーバで実行されるならば、プログラマは、次のことを指定できる。すなわち、サーバの負荷が限界値T1を越えると、DODがオブジェクトO1およびO2を移行させ、サーバの負荷が限界値T2を越えると、DODがオブジェクトO3,O4,O5を移行させ、サーバの負荷が限界値T3を越えると、DODがオブジェクトO6を移行させる。オブジェクトO7,O8,O9は移行されない。好適な実施例では、この情報は、“移行ファイル(migration file)”と呼ばれるファイルにおいて簡単に指定される。しかし、他の仕様メソッドは、明らかに可能であり、当業者には自明であろう。
【0026】移行ファイルは、ユーザ・ベースおよびよりグローバル・ベースで指定できることに留意すべきである。すなわち、好適な実施例では、移行ファイルの各バージョン(あるいは、1つの移行ファイル内の各セクション)は、アプリケーションの1つ以上のユーザに関係している。したがって、アプリケーションは、異なるユーザにより実行されるときに、異なる振舞いを任意に示すことができる。
【0027】ステップ5は、システムの初期構成を示す。すなわち、プログラマは、どのクラスがサーバ・オブジェクトを生成するか、およびどのクラスがクライアント・オブジェクトを生成するかを、システムに知らせる。好適な実施例では、この情報は、移行ファイルにも格納される。
【0028】移行ファイルの例は、次のとおりである。
User1 MyClassOne CPU>.5 # move if CPU over half utilizedUser1 MyClassTwo CPU>.7 # move if CPU over 70% utilizedUser1 MyClassThree CPU >.9 # move if CPU over 90% utilizedUser1 MyIOClassOne Disk <.4 # move if disk is 60% fullUser1 MyIOClassTwo Disk <.2 # move if disk is 80% full(“#”は、コメントの開示を示し、ライン上の次のテキストは無視される。)
ローカルおよびリモート・プロキシの生成は、DODシステムに対する1つのキーである。これは例によって説明される。前に示した変更バージョンの例へ戻ることは、オブジェクト“a”および“b”は、共に存在し、およびプログラマ指定のオブジェクトが、移行候補としてクラスBにより例示されたものと仮定する。DODは、クラスBについてのバイトコード(“b”は、インスタンスである)を読取り、その共用(public)メソッドのすべてを調べる。AODにおけるように、DODは、B′と呼ばれるクラスBのプロキシを生成する。したがって、クラスBへのすべてのコールは、プロキシB′を経て間接的に送られる。ローカル・コールの場合には、呼出し順序は、A→B′→Bである。リモート・コールの場合には、AODにおけるように、呼出し順序は、A→B′→B″→Bである。
【0029】したがって、プロキシB′は、ローカル・コールおよびリモート・コールの両方を許容するように構成される。例示の擬似コードでは、プロキシB′は、以下のように表される。
【0030】
class B[ boolean local = TRUE; // object starts local B () [ // constructor for the proxy for B create a reference to the real B ] foo () [ if (local) make local call to the local foo(); else make remote call to foo as described in AOD ] ]以下に示すように、各プロキシに対し、オブジェクトを移行させるためには、コードを付加しなければならない。さらに、タイミングの競合に対してメソッド・コールを保護するコードを付加しなければならない。すなわち、オブジェクトにおけるメソッドに対するコールは、オブジェクトが移行されている間は、許可されない。これは、プロキシ・クラスを“同期化(synchronized)”(標準的なJava用語)させ、競争状態に対してクラスを保護し、移行メソッドを付加することによって行われる。最後に、ローカル・プロキシは、移行スレッドと共に自身を登録しなければならない。このことは、オブジェクトが移行されなければならないときに、移行スレッドが、プロキシを配置することを可能にする。
【0031】各プロキシは、“移行可能(Migratable)”インタフェースを実行するように、構成される。このことは、移行スレッドの“登録(register)”メソッドが、単一タイプのオブジェクトを、パラメータすなわり移行インタフェースを実行するプロキシ・クラスとして、受取ることを可能にする。したがって移行スレッドの登録メソッドは、オブジェクトが移行されなければならないときに用いるテーブルに、パラメータ(プロキシ・オブジェクト)へのリファレンスを格納する。
【0032】したがってプロキシB′は、次のようになる。
【0033】
synchronized class B implements migratable [ boolean local = TRUE; // object starts local B() [ // constructor for the proxy for B create a reference to the real B register with the migration thread ] migrate () [ serialize the "real" b; send the serialized object via a socket to the partner where it will be instantiated local = FALSE ] foo () [ if (local) make local call to the "real" foo (); else make remote call to foo as described in AOD ] ]プロキシ・オブジェクトB′は、標準Javaの意味構造によって同期されるので、移行メソッドは、オブジェクトにおける他のメソッドが呼出されている間は、実行されず、同様に、オブジェクトが移行している間は、メソッドは呼出すことができないことに留意すべきである。
【0034】オブジェクトのシリアル化、およびシリアル化されたオブジェクトをソケットを通過させることは、Javaにおいて周知の技術である。オブジェクトがシリアル化されて、ネットワーク上に送られた後(“ライトオブジェクト(writeObject)”と呼ばれる標準的なJavaメソッドを用いて)、オブジェクトは、他の標準Javaメソッド(“リードオブジェクト(readObject)”)を用いて、リモート・コンピュータ上でDODコンポーネントによって受け取られる。そして、アンシリアル化されたオブジェクトが、リモート・コンピュータ上で実行される準備状態にある。
【0035】典型的に、シリアル化されるためには、標準Javaのリリースに設けられたシリアル化可能(Serializable)インタフェースをクラスが実行しなければならない。しかし、シリコン化可能インタフェースを実行しないクラスの例は、JVMによってシリアル化されない。しかし、DODは、ソース変更なしに、オブジェクトが移行できることを要求し、およびJavaは、シリアル化可能オブジェクトが、シリアル化可能インタフェースを実行することを要求する。
【0036】この明らかな問題は、ユーザによってモバイルとしてリストされているが、シリアル化可能インタフェースを実施しないこれらのクラスを識別することによって解決される。前述した米国特許出願“Apparatus and Method for Dynamically Class Files During Loading for Execution”に記載されているJOIEツールのような既知のバイトコード変更ツールを用いて、JVMによってクラスが最初に負荷されるときの時点で、クラスをシリアル化可能インタフェースの実行としてマークする変換が与えられる。この時点では、実行は通常通り進行する。変更(クラスにシリアル化可能インタフェースを実行させる)は、バイトコード変更ツールによって、自動的に行われるので、プログラマは何かをすることは要求されず、ソースコードに対する変更は生じない。同様のメカニズムを用いて、パラメータ・オブジェクトが、ローカル・プロキシからリモート・プロキシへ転送されなけれならないならば、パラメータ・オブジェクトは、シリアル化可能インタフェースを実行するように作成することができる。図9は、プロキシ生成およびバイトコード変更のプロセスを示す。
【0037】図9において、オブジェクト401は、プロキシ・ジェネレータ403によって処理される。プロキシ生成器は、ローカル・プロキシ405とリモート・プロキシ407を生成し、および未変更のオブジェクト401を保持する。バイトコード変更器409は、未変更オブジェクト401を処理して、これからシリアル化可能オブジェクト411を生成する。
【0038】AODにおけるように、リモート・プロキシ(この例ではB″)は、ローカル・プロキシからのコールを受取り、ローカル・コールを元のオブジェクト(B)に対して行う。さらに、リモート・プロキシは、リモート・オブジェクトから、リモート・プロキシを経て、およびローカル・プロキシを経て、最後に呼出し先へコールを転送するためのコードを含まなければならない。
【0039】図10に示すように、リターン・コールのためのコードを生成するプロセスは、AODにおいて用いられるプロセス、および着信コールのためにここで用いられるプロセスに非常に類似している。移行可能なオブジェクトのためのバイトコードは検査され、他のオブジェクトに対するすべてのメソッド・コールが取出される。このような各コールに対し、ローカル・プロキシ510およびリモート・プロキシ520の両方が構成され、これらはバイトコード内にあるメソッドに類似の名称のメソッドを含んでいる。リモート・プロキシにおけるコードは、メソッドが呼びだされるとき、ローカル・プロキシへのリモート(RMI)コールが実行される。ローカル・プロキシにおけるコードは、リモート・コールを受信したとき、実際の呼出し先にローカル・コールを行う。したがって、このプロセスは、可能性のある着信コール(すなわち、共用メソッド)の代りに、オブジェクトが発信コールに対して検査されることを除いて、着信コールに対してプロキシを生成するプロセスとほぼ同じである。ローカル・プロキシおよびリモート・プロキシの通常の機能は、この場合反転されることに留意すべきである。
【0040】ローカル・マシンに戻るようにオブジェクトを移行させることは、プロセスの反転を事実上伴う。プロセスは、“非移行(unmigration)”が発生することを検出すると、移行スレッドによって開始される。移行スレッドは、ローカル・プロキシにおける“非移行”メソッドを呼出す。
【0041】非移行の際には、タイミング問題が発生しないことを保証することは重要である。ローカル・プロキシが同期されるので、ローカル・プロキシにおいて実行される唯一のメソッドとなる時まで、非移行メソッドへのコールを実行しない(すなわち、コールはブロックする)。リモート呼出し先へのすべてのコールが、ローカル・プロキシを通過しなければならないので、我々は、非移行が発生するとき、リモート呼出し先は実行しないことを知っている。ローカル・プロキシにおける非移行メソッドは、リモート・プロキシにおける移行メソッドを事実上呼出す。ローカル・プロキシにおける非移行メソッドへのコールは、全移行が終了するまで終わらない。
【0042】リモート・プロキシにおける移行メソッドは、ローカル・プロキシにおける移行メソッドが実行する同じ機能を実行する。移行メソッドは、オブジェクトをシリアル化し、それをローカル・マシンへ転送する。ローカル・マシンは、オブジェクトをアンシリアル化する。この時点では、ローカル・プロキシは、その“ローカル”ブールをセットする。発展中の例では、プロキシB′は次のようになる。
【0043】
synchronized class B[ boolean local = TRUE; // object starts local B () [ // constructor for the proxy for B create a reference to the real B register with the migration thread ] unmigrate () [ make a remote call to migrate on the remote proxy receive the serialized object unserialize the object local = TRUE; return; ] migrate () [ serialize the "real" b; send the serialized object via a socket to the partner where it will be instantiated local = FALSE; return; ] foo () [ if (local) make local call to the "real" foo (); else make remote call to foo as described in AOD ] ]次に、ユーザは、クライアント/サーバJavaアプリケーションであるときに、システムを実際にスタートさせる。アプリケーションが実行されると、DODは、移行ファイルにおいて指定された述語をモニタする。述語が満足されると(例えば、負荷限界値が満足されると)、移行プロセスがトリガされる。
【0044】移行を実行するためには、DODプロセスの移行スレッドが、述語が満足されたことを検出すると、移行ファイルを用いて、どのオブジェクトが移動すなわち移行されるかを決定する。これらは、各オブジェクトについてのプロキシにおける移行メソッド(前述した)を呼出す。移行スレッドは、以下に示される擬似コードを実行する。
【0045】
do forever [ check for object registration check computer resource usage compare usages to predicates if a predicate is satisfied [ check list of registered objects, initiating migration for those whose predicate was satisfied ] ]ローカル・プロキシにおける移行メソッドは、オブジェクトをシリアル化し、オブジェクトはプロキシを有し、プロキシは移行メソッドを呼出して、実行のためのリモート・ノードに送る。リモート・マシン上のJVMは、“リードオブジェクト”メソッドを呼出して、シリアル化されたオブジェクトを読取り、リモート・メソッド呼出し登録(Remote Method Invocation(RMI)Registry)で、リモート・プロキシを登録する。TCP/IPソケットを経てネットワークにわたるシリアル化されたオブジェクトを読取って書込む技術、およびRMI登録とで対話する技術は、周知である。さらに、移行されたオブジェクトについてのリモート・プロキシ(ステップ6で生成された)は、リモート・ノードに送られる。
【0046】前述したローカル・プロキシは、代理しているオブジェクトによって含まれるすべての共用メソッドを含むように構成される。これらメソッドの各々は、実際のオブジェクトにおけるメソッド(実際のオブジェクトがローカルならば)を呼出し、あるいはリモート・オブジェクトにおけるメソッドをリモート的に(RMIを経て)呼出す(オブジェクトが移行され、現在リモートであるならば)。
【0047】移行可能なオブジェクトを呼出すオブジェクトについてのコードを変更することを避けるためには、プロキシは、プロキシとして働くオブジェクトの名称を持つようにする。したがって、移行可能なオブジェクトについて元々指定されたコールを、標準のJava意味構造によって、プロキシで再目標とされる。
【0048】しかし、Javaは、2つのオブジェクトが、同一の名称を有することを許さない。オブジェクトがローカル的に実行されている場合には、プロキシおよびプロキシされるオブジェクトは、同一の名称を有する。この問題を是正するためには、名称変更プロセスが実行される。
【0049】バイトコード変更ツールを用いて、元のオブジェクト(移行可能なオブジェクト)は、バイトコード・ファイルのその名称に任意のストリングを付加することによって、名称変更される。クラスの構成も、同様な方法により名称が変更される。次に、プロキシは、この新しい名称のオブジェクトに対し呼出しを行う。
【0050】例えば、上記のことからコード・フラグメントを考察する。
【0051】
class A [ A () [ // constructor for A ] some#method () [ B b = new B (); // allocate object b b. foo (); // call for method on b ] ] class B [ B () [ // constructor for B ] foo () [ // foo performs some action ] ] To create a proxy for B, first B is renamed in its bytecode ("class" file), then the proxy is created: class Bwxyz [ // this is the real, renamed B Bwxyz () [ // constructor for the real class ] foo () [ // foo performs some action ] ] synchronized calss B [ // this is the proxy for B Bwxyz myBwxyz; // reference to the original object B () [ // constructor for B myBwxyz = new Bwxyz (); // create a new object for the original B register with the migration thread ] foo () [ // calls foo on the renamed version of the original B myBwxyz. foo (); ] migrate () [ // as above, object migration code, called by migr. thread serialize the "real" b; send the serialized object via a socket to the partner where it will be instantiated local = FALSE; ] unmigrate () [ make a remote call to migrate on the remote proxy receive the serialized object unserialize the object local = TRUE; return; ] ]Aから“B.foo”へのコールは、プロキシ・オブジェクトBにおける“foo”メソッドに関係する。したがって、Bプロキシは、Bへの代行受信されたコールを有している。また、Bプロキシは、そのリファレンスを経て、元のオブジェクトBに呼出しを行う。
【0052】図4は、3つのオブジェクトA,B,Cを含む簡単なオブジェクト指向プログラムを示す。オブジェクトAは、a1〜a3で表示された3つのメソッドを有し、オブジェクトBは、b1〜b4で表示された4つのメソッドを有し、オブジェクトCは、c1,c2で表示された2つのメソッドを有している。図に示すように、以下のメソッド・コールが存在する。
【0053】
a1 calls b3 and b4a2 calls b2b2 calls c2c1 calls a2図5は、プログラマが、Cが唯一の移行可能なオブジェクトであることを指定した後の図4と同じプログラムを示す。システムは、図にCLとして指定されたローカル・プロキシを自動的に生成する。このCLは、cl1およびcl2で指定された2つのメソッドを含んでいる。命名の競合の議論について、ローカル・プロキシおよびそのメソッドは、オブジェクトおよびそのメソッドの元の名称で命名される。オリジナル・オブジェクトCは、バイトコード変更ツールによって名称変更された(図にはオブジェクト名称変更は示されていない)。
【0054】メソッド・コール・リストは、このように調整される。
【0055】
a1 calls b3 and b4a2 calls b2b2 calls cl2cl2 calls c2cl1 calls c1 (unused)c1 calls a2これはローカル構成であるので、呼出し元(例えば、B)からのコールは、ローカル・プロキシ(CL)により代行受信され、標準的なメソッド・コールを経て呼出し先(C)へ送られる。
【0056】図6は、移行スレッドを示す。このスレッドは、満足された述語を検出し、メッセージを、オブジェクトC(CL)についてのローカル・プロキシにおける“migrate(移行)”メソッドに送る。このことは、リモート・マシンへのオブジェクトCの移行を生じさせ、および図7に示される構成に変化させる。
【0057】図7は、オブジェクトCがリモート・コンピュータへ移行した後の同じ構成操作を示す。メソッド・コール・リストは、次のようになる。
【0058】
a1 calls b3 and b4a2 calls b2// Call from b2 to c2 indirected remotelyb2 calls cl2cl2 calls cr2 using RMIcr2 calls c2// Potential, but unused, calls into c1cl1 calls cr1 using RMI (unused)cr1 calls c1 (unused)// Calls from c1 to a2c1 calls ar2ar2 calls al1 using RMIal2 calls a2前記したように、DODは、以下のメインステップよりなる。すなわち、プログラマは、アプリケーションを書込み、コンパイルする。結果は、1組のJavaバイトコード(クラス)ファイルである。これは、Javaアプリケーションについての標準的な展開相であり、厳密には本発明の一部ではない。次に、プログラマは、どのオブジェクトを移行できるか、およびオブジェクトが移行すべき条件を識別する。次に、DODは、ローカル・スタブおよびリモート・スタブを生成する。DODは、バイトコード変更を実行して、適切なクラスがシリアル化可能インタフェースを実施し、すべての名称競合が解決されることを保証する。これらスタブは、メソッド・コールをオブジェクト(それがローカルであろうと、リモートであろうと)に送るためのコードを含んでいる。スタブはまた、オブジェクトを移行させるために必要なコードを含んでいる。次に移行スレッドは、システム資源をモニタし、述語がいつ満足されるかを決定する。述語が満足されると、述語はオブジェクトのプロキシにおける移行メソッドを呼出し、移行を生じさせる。次に、移行メソッドは、要求されるリモート・プロキシと共に、リモート・オブジェクトをシリアル化し、これらをリモートJVM(Java仮想マシン)に転送する。リモートJVMでは、オブジェクトが再例示される。次に、アプリケーションを、その新しい構成で再スタートすることができる。
【0059】上述したAODの発明について、この移行は、メソッド・コール境界(これは、標準的な規則であり、良好なプログラミング・プラクティスである)に沿ったブレークを信頼するので、そのメンバ変数がアクセスされるオブジェクトは、直接に移行できない。困難性を避けるためには、潜在的に移行可能であるオブジェクトは、利用(private)メンバ変数のみを含まなければならない。
【0060】まとめとして、本発明の構成に関して以下の事項を開示する。
(1)プログラムのオブジェクトを、第1のコンピュータから1つ以上のリモート・コンピュータへダイナミックに配布する方法であって、前記オブジェクトの各々は1つ以上のプログラム化エンティティを有し、前記プログラム内のすべてのオブジェクトを識別するステップと、前記プログラムのオブジェクトが移行される条件のリストを作成するステップと、移行できる各オブジェクトについて、オブジェクトの外部からアクセスされる各前記プログラム化エンティティを識別するステップと、リモート・コンピュータに移動でき、リモート・コンピュータからアクセスできる各オブジェクトについて、第1のプロキシおよび第2のプロキシを生成するステップとを含み、前記第1のプロキシは、前記最初のオブジェクトと同じ物理的デバイス上にあり、前記第2のプロキシは、前記同じ物理的デバイス上で生成されて、オブジェクト移行時に、前記リモート・コンピュータに転送され、前記第1のプロキシは、ネットワーク・リンケージおよび指示を含み、前記リモート・コンピュータ上の前記プログラム化エンティティをアクセスし、前記第2のプロキシは、ネットワーク・リンケージおよび指示を含み、前記第1のコンピュータ上の前記プログラム化エンティティをアクセスし、前記条件のリストの前記オブジェクトの対応する条件が合うときに、前記第1のコンピュータからリモート・コンピュータへ、オブジェクトを移動するステップを含む、ことを特徴とする方法。
(2)前記プログラム内のすべてのオブジェクトのうちのいずれが、移行のために利用できるかを識別するステップと、移行のために利用できるオブジェクトの名称を、リストに配置するステップと、前記リストを、配布方法への入力として利用するステップと、を含むことを特徴とする上記(1)に記載の方法。
(3)前記第1のコンピュータからリモート・コンピュータへオブジェクトを移動するステップは、前記オブジェクトのコピーを、前記リモート・コンピュータに移動するステップと、前記第2のプロキシを、前記リモート・コンピュータへ移動するステップと、前記リモート・コンピュータ上の前記第2のプロキシを呼出すために、前記第1のプロキシを送るステップと、を含むことを特徴とする上記(1)または(2)に記載の方法。
(4)プログラムのオブジェクトを、第1のコンピュータから1つ以上のリモート・コンピュータへダイナミックに配布するコンピュータ読取り可能なコードであって、前記オブジェクトの各々は、1つ以上のプログラム化エンティティを有し、前記プログラム内のすべてのオブジェクトを識別する第1のサブプロセスと、前記プログラムのオブジェクトが移行される条件のリストを作成する第2のサブプロセスと、前記第1および第2のサブプロセスに応答し、移行できる各オブジェクトについて、オブジェクトの外部からアクセスされる各前記プログラム化エンティティを識別するサブプロセスと、前記第1および第2のサブプロセスに応答し、リモート・コンピュータに移動でき、リモート・コンピュータからアクセスできる各オブジェクトについて、第1のプロキシおよび第2のプロキシを生成するサブプロセスとを含み、前記第1のプロキシは、前記最初のオブジェクトと同じ物理的デバイス上にあり、前記第2のプロキシは、前記同じ物理的デバイス上に生成されて、オブジェクト移行時に、前記リモート・コンピュータに転送され、前記第1のプロキシは、ネットワーク・リンケージおよび指示を含み、前記リモート・コンピュータ上の前記プログラム化エンティティをアクセスし、前記第2のプロキシは、ネットワーク・リンケージおよび指示を含み、前記第1のコンピュータ上の前記プログラム化エンティティをアクセスし、前記条件のリストの前記オブジェクトの対応する条件が合うときに、前記第1のコンピュータからリモート・コンピュータへ、オブジェクトを移動するサブプロセスを含む、ことを特徴とするコンピュータ読取り可能なコード。
(5)前記第1のサブプロセスに応答し、前記プログラム内のすべてのオブジェクトのうちのいずれが、移行のために利用できるかを識別するサブプロセスと、移行のために利用できるオブジェクトの名称を、リストに配置するサブプロセスと、前記リストを、配布方法への入力として利用するサブプロセスと、を含むことを特徴とする上記(4)に記載のコンピュータ読取り可能なコード。
(6)前記第1のコンピュータからリモート・コンピュータへオブジェクトを移動するサブプロセスは、前記オブジェクトのコピーを、前記リモート・コンピュータに移動するサブプロセスと、前記第2のプロキシを、前記リモート・コンピュータへ移動するサブプロセスと、前記リモート・コンピュータ上の前記第2のプロキシを呼出すために、前記第1のプロキシを送るサブプロセスと、を含むことを特徴とする上記(4)または(5)に記載のコンピュータ読取り可能なコード。
(7)通信機構を用いて共に接続された複数のコンピュータを有するコンピュータ・ネットワーク内に含まれるシステムであって、前記システムは、プログラムのオブジェクトを、第1のコンピュータから1つ以上のリモート・コンピュータへダイナミックに配布する方法を含み、前記オブジェクトの各々は、1つ以上のプログラム化エンティティを有し、前記プログラム内のすべてのオブジェクトを識別する手段と、前記プログラムのオブジェクトが移行される条件のリストを作成する手段と、移行できる各オブジェクトについて、オブジェクトの外部からアクセスされる各前記プログラム化エンティティを識別する手段と、リモート・コンピュータに移動でき、リモート・コンピュータからアクセスできる各オブジェクトについて、第1のプロキシおよび第2のプロキシを生成する手段とを備え、前記第1のプロキシは、前記最初のオブジェクトと同じ物理的デバイス上にあり、前記第2のプロキシは、前記同じ物理的デバイス上に生成されて、オブジェクト移行時に、前記リモート・コンピュータに転送され、前記第1のプロキシは、ネットワーク・リンケージおよび指示を含み、前記リモート・コンピュータ上の前記プログラム化エンティティをアクセスし、前記第2のプロキシは、ネットワーク・リンケージおよび指示を含み、前記第1のコンピュータ上の前記プログラム化エンティティをアクセスし、前記条件のリストの前記オブジェクトの対応する条件が合うときに、前記第1のコンピュータからリモート・コンピュータへ、オブジェクトを移動する手段を備える、ことを特徴とするシステム。
(8)前記プログラム内のすべてのオブジェクトのうちのいずれが、移行のために利用できるかを識別する手段と、移行のために利用できるオブジェクトの名称を、リストに配置する手段と、前記リストを、配布方法への入力として利用する手段と、を備えることを特徴とする上記(7)に記載のシステム。
(9)前記第1のコンピュータからリモート・コンピュータへオブジェクトを移動する手段は、前記オブジェクトのコピーを、前記リモート・コンピュータに移動する手段と、前記第2のプロキシを、前記リモート・コンピュータへ移動する手段と、前記リモート・コンピュータ上の前記第2のプロキシを呼出すために、前記第1のプロキシを送る手段と、を有することを特徴とする上記(7)または(8)に記載のシステム。
【図面の簡単な説明】
【図1】メソッド間のコールを示す図である。
【図2】移行前のオブジェクト内のメソッド間のコールを示す図である。
【図3】移行後のメソッド間のコールを示す図である。
【図4】3つのオブジェクトを有する標準オブジェクト指向プログラムを示す図である。
【図5】1つの再配置可能なオブジェクトを有するローカル構成を示す図である。
【図6】図5の構成についての移行スレッドを示す図である。
【図7】メソッドCがリモート・ホストへ移行された後の動作を説明する図である。
【図8】メソッドCがリモート・ホストへ移行された後の動作を説明する図である。
【図9】プロキシ生成およびバイトコードの生成を示す図である。
【図10】コール・リターンの準備を示す図である。
【図11】オブジェクトのシリアル化を示す図である。
【符号の説明】
401 オブジェクト
403 プロキシ生成器
405 ローカル・プロキシ
407 リモート・プロキシ
409 バイトコード変更器
411 シリアル化可能オブジェクト
510 ローカル・プロキシ
520 リモート・プロキシ

【特許請求の範囲】
【請求項1】プログラムのオブジェクトを、第1のコンピュータから1つ以上のリモート・コンピュータへダイナミックに配布する方法であって、前記オブジェクトの各々は1つ以上のプログラム化エンティティを有し、前記プログラム内のすべてのオブジェクトを識別するステップと、前記プログラムのオブジェクトが移行される条件のリストを作成するステップと、移行できる各オブジェクトについて、オブジェクトの外部からアクセスされる各前記プログラム化エンティティを識別するステップと、リモート・コンピュータに移動でき、リモート・コンピュータからアクセスできる各オブジェクトについて、第1のプロキシおよび第2のプロキシを生成するステップとを含み、前記第1のプロキシは、前記最初のオブジェクトと同じ物理的デバイス上にあり、前記第2のプロキシは、前記同じ物理的デバイス上で生成されて、オブジェクト移行時に、前記リモート・コンピュータに転送され、前記第1のプロキシは、ネットワーク・リンケージおよび指示を含み、前記リモート・コンピュータ上の前記プログラム化エンティティをアクセスし、前記第2のプロキシは、ネットワーク・リンケージおよび指示を含み、前記第1のコンピュータ上の前記プログラム化エンティティをアクセスし、前記条件のリストの前記オブジェクトの対応する条件が合うときに、前記第1のコンピュータからリモート・コンピュータへ、オブジェクトを移動するステップを含む、ことを特徴とする方法。
【請求項2】前記プログラム内のすべてのオブジェクトのうちのいずれが、移行のために利用できるかを識別するステップと、移行のために利用できるオブジェクトの名称を、リストに配置するステップと、前記リストを、配布方法への入力として利用するステップと、を含むことを特徴とする請求項1記載の方法。
【請求項3】前記第1のコンピュータからリモート・コンピュータへオブジェクトを移動するステップは、前記オブジェクトのコピーを、前記リモート・コンピュータに移動するステップと、前記第2のプロキシを、前記リモート・コンピュータへ移動するステップと、前記リモート・コンピュータ上の前記第2のプロキシを呼出すために、前記第1のプロキシを送るステップと、を含むことを特徴とする請求項1または2記載の方法。
【請求項4】プログラムのオブジェクトを、第1のコンピュータから1つ以上のリモート・コンピュータへダイナミックに配布するコンピュータ読取り可能なコードであって、前記オブジェクトの各々は、1つ以上のプログラム化エンティティを有し、前記プログラム内のすべてのオブジェクトを識別する第1のサブプロセスと、前記プログラムのオブジェクトが移行される条件のリストを作成する第2のサブプロセスと、前記第1および第2のサブプロセスに応答し、移行できる各オブジェクトについて、オブジェクトの外部からアクセスされる各前記プログラム化エンティティを識別するサブプロセスと、前記第1および第2のサブプロセスに応答し、リモート・コンピュータに移動でき、リモート・コンピュータからアクセスできる各オブジェクトについて、第1のプロキシおよび第2のプロキシを生成するサブプロセスとを含み、前記第1のプロキシは、前記最初のオブジェクトと同じ物理的デバイス上にあり、前記第2のプロキシは、前記同じ物理的デバイス上に生成されて、オブジェクト移行時に、前記リモート・コンピュータに転送され、前記第1のプロキシは、ネットワーク・リンケージおよび指示を含み、前記リモート・コンピュータ上の前記プログラム化エンティティをアクセスし、前記第2のプロキシは、ネットワーク・リンケージおよび指示を含み、前記第1のコンピュータ上の前記プログラム化エンティティをアクセスし、前記条件のリストの前記オブジェクトの対応する条件が合うときに、前記第1のコンピュータからリモート・コンピュータへ、オブジェクトを移動するサブプロセスを含む、ことを特徴とするコンピュータ読取り可能なコード。
【請求項5】前記第1のサブプロセスに応答し、前記プログラム内のすべてのオブジェクトのうちのいずれが、移行のために利用できるかを識別するサブプロセスと、移行のために利用できるオブジェクトの名称を、リストに配置するサブプロセスと、前記リストを、配布方法への入力として利用するサブプロセスと、を含むことを特徴とする請求項4記載のコンピュータ読取り可能なコード。
【請求項6】前記第1のコンピュータからリモート・コンピュータへオブジェクトを移動するサブプロセスは、前記オブジェクトのコピーを、前記リモート・コンピュータに移動するサブプロセスと、前記第2のプロキシを、前記リモート・コンピュータへ移動するサブプロセスと、前記リモート・コンピュータ上の前記第2のプロキシを呼出すために、前記第1のプロキシを送るサブプロセスと、を含むことを特徴とする請求項4または5記載のコンピュータ読取り可能なコード。
【請求項7】通信機構を用いて共に接続された複数のコンピュータを有するコンピュータ・ネットワーク内に含まれるシステムであって、前記システムは、プログラムのオブジェクトを、第1のコンピュータから1つ以上のリモート・コンピュータへダイナミックに配布する方法を含み、前記オブジェクトの各々は、1つ以上のプログラム化エンティティを有し、前記プログラム内のすべてのオブジェクトを識別する手段と、前記プログラムのオブジェクトが移行される条件のリストを作成する手段と、移行できる各オブジェクトについて、オブジェクトの外部からアクセスされる各前記プログラム化エンティティを識別する手段と、リモート・コンピュータに移動でき、リモート・コンピュータからアクセスできる各オブジェクトについて、第1のプロキシおよび第2のプロキシを生成する手段とを備え、前記第1のプロキシは、前記最初のオブジェクトと同じ物理的デバイス上にあり、前記第2のプロキシは、前記同じ物理的デバイス上に生成されて、オブジェクト移行時に、前記リモート・コンピュータに転送され、前記第1のプロキシは、ネットワーク・リンケージおよび指示を含み、前記リモート・コンピュータ上の前記プログラム化エンティティをアクセスし、前記第2のプロキシは、ネットワーク・リンケージおよび指示を含み、前記第1のコンピュータ上の前記プログラム化エンティティをアクセスし、前記条件のリストの前記オブジェクトの対応する条件が合うときに、前記第1のコンピュータからリモート・コンピュータへ、オブジェクトを移動する手段を備える、ことを特徴とするシステム。
【請求項8】前記プログラム内のすべてのオブジェクトのうちのいずれが、移行のために利用できるかを識別する手段と、移行のために利用できるオブジェクトの名称を、リストに配置する手段と、前記リストを、配布方法への入力として利用する手段と、を備えることを特徴とする請求項7記載のシステム。
【請求項9】前記第1のコンピュータからリモート・コンピュータへオブジェクトを移動する手段は、前記オブジェクトのコピーを、前記リモート・コンピュータに移動する手段と、前記第2のプロキシを、前記リモート・コンピュータへ移動する手段と、前記リモート・コンピュータ上の前記第2のプロキシを呼出すために、前記第1のプロキシを送る手段と、を有することを特徴とする請求項7または8記載のシステム。

【図1】
image rotate


【図2】
image rotate


【図3】
image rotate


【図11】
image rotate


【図4】
image rotate


【図5】
image rotate


【図6】
image rotate


【図7】
image rotate


【図8】
image rotate


【図9】
image rotate


【図10】
image rotate


【公開番号】特開平11−312088
【公開日】平成11年(1999)11月9日
【国際特許分類】
【出願番号】特願平11−32596
【出願日】平成11年(1999)2月10日
【出願人】(390009531)インターナショナル・ビジネス・マシーンズ・コーポレイション (4,084)
【氏名又は名称原語表記】INTERNATIONAL BUSINESS MASCHINES CORPORATION