(57)【特許請求の範囲】
【請求項１】
端末およびサーバを有するシステムであって、
前記端末は、
第１のアプリケーションを実行する第一の実行部と、
前記第１のアプリケーションの実行時に参照される固定リソースを参照するための変数を識別する識別情報を記憶する第一の記憶部と、
前記第一の実行部により実行された前記第１のアプリケーションにおいて用いられる変数のうち、前記第一の記憶部に記憶された識別情報が示す変数に所定の定数を設定し、前記固定リソースを開放する第一の設定部と、
前記第１のアプリケーションを停止させ、前記第１のアプリケーションの実行状態を抽出する抽出部と、
前記実行状態を前記サーバに送信する送信部とを有し、
前記サーバは、
前記送信部により送信された前記実行状態を受信する受信部と、
前記受信部が前記実行状態を受信する前に第２のアプリケーションの実行を開始する第二の実行部と、
前記第２のアプリケーションが参照する固定リソースを参照する変数を識別する識別情報を記憶する第二の記憶部と、
前記第二の実行部により実行が開始された前記第２のアプリケーションにおいて用いられる変数のうち、前記第二の記憶部に記憶された識別情報が示す変数の値を抽出し、前記受信部により受信された実行状態に基づいて生成されるインスタンスに対応する前記第１のアプリケーションにおいて用いられる変数に前記抽出した値を設定する第二の設定部と、
前記第二の設定部により設定されたインスタンスを再開することで、前記端末で停止された前記第１のアプリケーションを再開させる再開部とを有する
ことを特徴とするシステム。
【請求項２】
前記第二の設定部は、固定リソースが参照する再設定変数に、前記再開部により再開された前記第１のアプリケーションの情報を設定する
ことを特徴とする請求項１に記載のシステム。
【請求項３】
端末およびサーバを有するシステムが実行するマイグレーション方法であって、
前記端末は、
第１のアプリケーションを実行し、
実行された前記第１のアプリケーションにおいて用いられる変数のうち、前記第１のアプリケーションの実行時に参照される固定リソースを参照するための変数を識別する識別情報を記憶する第一の記憶部に記憶された識別情報が示す変数に所定の定数を設定し、前記固定リソースを開放し、
前記第１のアプリケーションを停止させ、前記第１のアプリケーションの実行状態を抽出し、
前記実行状態を前記サーバに送信し、
前記サーバは、
送信された前記実行状態を受信する前に第２のアプリケーションの実行を開始し、
前記端末から送信された前記実行状態を受信し、
実行が開始された前記第２のアプリケーションにおいて用いられる変数のうち、前記第２のアプリケーションが参照する固定リソースを参照する変数を識別する識別情報を記憶する第二の記憶部に記憶された識別情報が示す変数の値を抽出し、受信した前記実行状態に基づいて生成されるインスタンスに対応する前記第１のアプリケーションにおいて用いられる変数に前記抽出した値を設定し、
設定されたインスタンスを再開することで、前記端末で停止された前記第１のアプリケーションを再開させることを特徴とするマイグレーション方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、システムおよびマイグレーション方法に関する。
【背景技術】
【０００２】
従来、Ｊａｖａ（登録商標）アプリケーションの装置間のマイグレーションにおいて、一方の装置では、アプリケーションを実行中に、実行状態を保存し、内部形式の実行状態をバイト列に変換し、変換したバイト列を他方の装置に送信する。また、他方の装置では、受信したバイト列の実行状態を内部形式に変換し、内部形式に変換した実行状態を再開する。なお、実行状態を保存する技術は、「Ｃｈｅｃｋｐｏｉｎｔ」と称される。また、実行状態を再開する技術は、「Ｒｅｓｔａｒｔ」と称される。また、内部形式の実行状態をバイト列に変換する技術は、シリアライズ（serialize）と称される。また、バイト列の実行状態を内部形式に変換する技術は、デシリアライズ（deserialize）と称される。
【０００３】
また、Ｊａｖａアプレットを、ブラウザから切り離して、独自ウインドウに表示するために、Ｊａｖａアプレットのソースに、開発者などによって、切り離し部分を明示する技術がある。また、マイグレーション可能なアプリケーションのＧＵＩ（Graphical  User  Interface）のレイアウトまたは、ページサイズをターゲットとなるプラットホーム用に動的に変更する技術がある。また、アプリケーションの装置間のマイグレーションにおいて、移動元の装置がシリアライズできない固定リソースを有する場合には、移動先の装置が有する固定リソースを参照可能なように、変数を再バインドする技術がある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平１１−１６７４８９号公報
【特許文献２】特開２００３−３３０７１５号公報
【非特許文献】
【０００５】
【非特許文献１】「分散システム  原理とパラダイム  第二版」（アンドリュー・Ｓ・タネンバウム）
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、上記の従来の技術では、固定リソースの再バインドが容易でないという問題がある。
【０００７】
これを説明すると、従来技術では、マイグレート前後で、マイグレートする部分と、固定リソースの関係との切り張り処理が行われるように、アプリケーションを把握した上で、人がソースに記述を行う。また、従来技術では、ＧＵＩ以外の固定リソースに関しても、再バインドする。そのため、固定リソースの再バインドに、人の労力や時間などがかかり、固定リソースの再バインドが容易でない。
【０００８】
開示の技術は、上記に鑑みてなされたものであって、固定リソースの再バインドを容易にすることができるシステム、およびマイグレーション方法を提供することを目的とする。
【課題を解決するための手段】
【０００９】
本願の開示するシステムは、端末およびサーバを有する。端末は、第一の実行部と、第一の記憶部と、第一の設定部と、抽出部と、送信部とを有する。第一の実行部は、アプリケーションを実行する。第一の記憶部は、アプリケーションの実行時に参照される固定リソースを参照するための変数を識別する識別情報を記憶する。第一の設定部は、第一の実行部により実行されたアプリケーションにおいて用いられる変数のうち、第一の記憶部に記憶された識別情報が示す変数に値を設定し、前記固定リソースを開放する。抽出部は、アプリケーションを停止させ、アプリケーションの実行状態を抽出する。送信部は、実行状態をクラウドサーバに送信する。サーバは、第二の実行部と、受信部と、第二の記憶部と、第二の設定部と、再開部とを有する。第二の実行部は、アプリケーションを実行する。受信部は、送信部により送信された実行状態を受信する。第二の記憶部は、アプリケーションが参照する固定リソースを参照する変数を識別する識別情報を記憶する。第二の設定部は、第二の実行部により実行されたアプリケーションにおいて用いられる変数のうち、第二の記憶部に記憶された識別情報が示す変数の値を抽出し、受信部により受信された実行状態に基づいて生成されるインスタンスの対応する変数に抽出した値を設定する。再開部は、第二の設定部により設定されたインスタンスを再開することで、端末で停止されたアプリケーションを再開させる。
【発明の効果】
【００１０】
本願の開示するシステムおよびマイグレーション方法の一つの態様によれば、固定リソースの再バインドを容易にすることができる。
【図面の簡単な説明】
【００１１】
【図１】図１は、実施例１に係るクラウドシステムの構成の一例を示す図である。
【図２】図２は、固定リソースリストの一例を示す図である。
【図３】図３は、固定リソースリストに登録されるクラス名およびメンバ変数名の抽出方法の一例について説明するための図である。
【図４】図４は、インスタンス管理表の一例を示す図である。
【図５】図５は、端末およびクラウドサーバの処理を説明するための図である。
【図６】図６は、再設定変数リストの一例を示す図である。
【図７】図７は、変数値の更新処理方法の一例について説明するための図である。
【図８】図８は、実施例１に係るクラウドシステムの処理の手順を示すシーケンス図である。
【図９】図９は、実施例１に係るクラウドシステムの処理の手順を示すシーケンス図である。
【発明を実施するための形態】
【００１２】
以下に、本願の開示するシステムおよびマイグレーション方法の実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。そして、各実施例は、処理内容を矛盾させない範囲で適宜組み合わせることが可能である。
【実施例１】
【００１３】
実施例１に係るシステムについて説明する。図１は、実施例１に係るクラウドシステムの構成の一例を示す図である。本実施例に係るクラウドシステム１は、端末１０と、クラウドサーバ２０とを有する。なお、図１の例では、クラウドシステム１に、端末１０およびクラウドサーバ２０が各々１台の場合が示されているが、端末１０およびクラウドサーバ２０の台数はこれに限られない。例えば、端末１０およびクラウドサーバ２０のそれぞれの台数は、複数台であってもよい。端末１０は、スマートフォンなどの携帯電話や、ＰＤＡ（Personal  Digital  Assistants）、またはＰＣ（Personal  Computer）である。クラウドシステム１では、端末１０とクラウドサーバ２０とが連携し、端末１０で実行中のアプリケーションの実行状態をマイグレートして、クラウドサーバ２０でアプリケーションの続きを実行する。これにより、端末１０が備えるバッテリの消費が抑制され、また、アプリケーションの処理速度が向上される。
【００１４】
端末１０で実行中のアプリケーションの実行状態をクラウドサーバ２０にマイグレートし、クラウドサーバ２０が続きからアプリケーションを実行し、クラウドサーバ２０で実行されるアプリケーションの画面を端末１０に転送して表示する場合を想定する。この場合には、表示される画面がシームレスになる。そのため、あたかも、端末１０が、アプリケーションを高速に処理しているように見える。また、端末１０およびクラウドサーバ２０で実行されるアプリケーションの一例として、ＧＵＩを有するＪａｖａアプリケーションが挙げられる。以下の説明では、端末１０およびクラウドサーバ２０で実行されるアプリケーションが、ＧＵＩを有するＪａｖａアプリケーションである場合を例に挙げて説明する。
【００１５】
ここで、ＧＵＩを備えるＪａｖａアプリケーションをマイグレートする場合を想定する。ＧＵＩフレームワークでは、画面表示のためにｎａｔｉｖｅライブラリが使用される。ＧＵＩフレームワークでは、実行状態を抽出する場合に必要となる、メモリに記憶されたｎａｔｉｖｅライブラリの内容を、Ｊａｖａからは取得できない。そのため、ＧＵＩを有するＪａｖａアプリケーションのマイグレーションにおいて、ＧＵＩフレームワークは、実行状態をバイト列として出力できないので、他の装置に転送できない。このような場合に、マイグレートを実現するためには、シリアライズ可能な部分と、シリアライズ可能でない固定リソースの部分とを分離することが考えられる。例えば、シリアライズ可能な部分である計算処理の部分が、固定リソースに依存しない構造に変更することが考えられる。しかしながら、このような変更は、時間や労力などのコストがかかる。なお、ＧＵＩ以外にも、固定リソースとしては、ＤＢ（Data  Base）接続、ソケット接続、デバイス（カメラ、ＧＰＳ（Global  Positioning  System））などが挙げられる。
【００１６】
そこで、本実施例に係るクラウドシステム１が有する端末１０およびクラウドサーバ２０は、固定リソースの再バインドを容易にする。端末１０は、入力部１１と、出力部１２と、通信部１３と、記憶部１４と、制御部１５とを有する。
【００１７】
入力部１１は、各種情報を制御部１５に入力する。例えば、入力部１１は、ユーザから、マイグレーション要求を受け付け、マイグレーション要求を制御部１５に入力する。入力部１１のデバイスの一例としては、マウスやキーボードなどが挙げられる。
【００１８】
出力部１２は、各種情報を出力する。例えば、出力部１２は、制御部１５から画像が入力された場合には、画像を表示出力する。出力部１２のデバイスの一例としては、ＣＲＴ（Cathode  Ray  Tube）や液晶ディスプレイなどが挙げられる。
【００１９】
通信部１３は、無線通信を行う。例えば、通信部１３は、制御部１５と、クラウドサーバ２０との無線通信を行う。通信部１３は、制御部１５から情報が入力されると、入力された情報をクラウドサーバ２０へ送信する。また、通信部１３は、クラウドサーバ２０から情報が入力されると、入力された情報を制御部１５へ送信する。通信部１３の一例としては、無線通信インタフェースが挙げられる。
【００２０】
記憶部１４は、固定リソースリスト１４ａと、インスタンス管理表１４ｂとを記憶する。固定リソースリスト１４ａには、固定リソースを参照するための各メンバ変数のクラス名と変数名とが対応付けられて登録される。図２は、固定リソースリストの一例を示す図である。図２の例では、固定リソースリスト１４ａには、クラス名が「ＣａｌｃＴｈｒｅａｄ」のクラスと、メンバ変数名が「ｂ」であるメンバ変数とが対応付けられて登録されている。また、図２の例では、固定リソースリスト１４ａには、クラス名が「ＣａｌｃＴｈｒｅａｄ」のクラスと、メンバ変数名が「ｃ」であるメンバ変数とが対応付けられて登録されている。
【００２１】
ここで、固定リソースリスト１４ａに登録されるクラス名およびメンバ変数名の抽出方法の一例について説明する。図３は、固定リソースリストに登録されるクラス名およびメンバ変数名の抽出方法の一例について説明するための図である。図３の例では、端末１０およびクラウドサーバ２０が模式的に示されている。図３の例では、開発者などは、アプリケーションの改変を行い、固定リソース判別ツールを使って、固定リソースリスト１４ａを生成する。開発者などは、固定リソース判別ツールを、マイグレート対象の計算処理スレッドクラスを指定して起動する。ここで、固定リソース判別ツールについて説明する。固定リソース判別ツールは、計算処理スレッドクラスに対して「ｃｈｅｃｋｐｏｉｎｔ」を行い、シリアライズ時に「Ｅｘｃｅｐｔｉｏｎ」が発生するメンバ変数、および計算処理スレッドクラスのクラス名を固定リソースリスト１４ａに登録するツールである。このようにして、固定リソースリスト１４ａおよび後述の固定リソースリスト２４ａのそれぞれに登録されるクラス名およびメンバ変数名を抽出する。
【００２２】
また、後述のクラウドサーバ２０の記憶部２４に記憶される再設定変数リスト２４ｂの生成方法の一例についても、図３を参照して説明する。クラウドシステム１の開発者などが、アプリケーションのソースを改変し、ユーザからのマイグレート要求を受け取った時の処理をソースに記述する。例えば、開発者などは、マイグレート対象とする計算処理スレッドを指定して、マイグレート用ＡＰＩ（Application  Program  Interface）の呼び出しを行う。また、開発者などは、ＧＵＩから計算処理部を参照している場所を、計算処理部ラッパを使うように変更する。また、開発者などは、このラッパ内で、計算処理部を参照する変数を、後述の再設定変数リスト２４ｂに登録する。
【００２３】
そして、開発者などは、改変したアプリケーションと、生成した固定リソースリストを、端末１０およびクラウドサーバ２０のそれぞれの記憶部に記憶させる。また、開発者などは、再設定変数リスト２４ｂをクラウドサーバ２０の記憶部２４に記憶させる。
【００２４】
インスタンス管理表１４ｂには、マイグレートされるインスタンスの種類であるインスタンス種類と、インスタンス参照（アドレス）とが対応付けられて登録される。図４は、インスタンス管理表の一例を示す図である。図４の例では、インスタンス管理表１４ｂには、「マイグレートインスタンス」として、「計算処理部」が登録されている場合が示されている。また、図４の例では、インスタンス管理表１４ｂには、「ラッパインスタンス」として「計算処理部ラッパ」が登録されている場合が示されている。
【００２５】
記憶部１４は、例えば、フラッシュメモリなどの半導体メモリ素子、または、ハードディスク、光ディスクなどの記憶装置である。なお、記憶部１４は、上記の種類の記憶装置に限定されるものではなく、ＲＡＭ（Random  Access  Memory)、ＲＯＭ（Read  Only  Memory)であってもよい。
【００２６】
制御部１５は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する。図１に示すように、制御部１５は、第一の実行部１５ａと、第一の設定部１５ｂと、抽出部１５ｃと、送信部１５ｄとを有する。
【００２７】
第一の実行部１５ａは、アプリケーションを実行する。例えば、第一の実行部１５ａは、ＧＵＩを有するＪａｖａアプリケーションを実行する。なお、このアプリケーションは、上述したように、開発者などによって、ソースが改変されたものである。例えば、かかるアプリケーションは、クラス名およびメンバ変数名が固定ソースリスト１４ａに抽出され、毎グレート要求を受け取った時の処理がソースに記述されており、また、この処理が、抽出されたクラス名およびメンバ変数名に基づいて行われる。図５は、端末およびクラウドサーバの処理を説明するための図である。図５の例では、端末１０およびクラウドサーバ２０で行われる処理が模式的に示されている。第一の実行部１５ａは、入力部１１からマイグレート要求を受信すると、クラウドサーバ２０にアプリケーションを実行する要求であるアプリケーション実行要求を送信する。これにより、クラウドサーバ２０は、アプリケーションを実行する。そして、第一の実行部１５ａは、マイグレート処理エンジンのマイグレート用ＡＰＩを呼び出す。マイグレート処理エンジンは、第一の設定部１５ｂに、固定リソースリスト１４ａに登録されているクラス名およびメンバ変数名と一致するスレッドクラスのメンバ変数名を所定値、例えば、ｎｕｌｌを設定するように指示を出す。
【００２８】
第一の設定部１５ｂは、第一の実行部１５ａにより実行されたアプリケーションにおいて用いられる変数のうち、アプリケーションの実行時に参照される固定リソースを参照するためのメンバ変数に値を設定し、固定リソースを開放する。また、抽出部１５ｃは、アプリケーションを停止させ、アプリケーションの実行状態を抽出する。図５の例では、マイグレート処理エンジンからの指示を第一の設定部１５ｂが受信した場合には、第一の設定部１５ｂは、次のような処理を行う。すなわち、第一の設定部１５ｂは、固定リソースリスト１４ａに登録されているクラス名およびメンバ変数名と一致するスレッドクラスのメンバ変数に所定値、例えば、ｎｕｌｌを設定する。また、図５の例では、抽出部１５ｃは、端末１０上の計算処理部を停止し、計算処理部に対して「ｃｈｅｃｋｐｏｉｎｔ」を実行して、変数値、スタック内容および実行場所を含む実行状態を抽出する。スタック内容には、ローカル変数やメソッド呼び出し履歴が保持されている。
【００２９】
送信部１５ｄは、実行状態をクラウドサーバ２０に送信する。図５の例では、送信部１５ｄは、抽出された実行状態をシリアライズし、シリアライズされた実行状態をクラウドサーバ２０に送信する。
【００３０】
図１に戻り、クラウドサーバ２０は、入力部２１と、出力部２２と、通信部２３と、記憶部２４と、制御部２５とを有する。
【００３１】
入力部２１は、各種情報を制御部２５に入力する。入力部２１のデバイスの一例としては、マウスやキーボードなどが挙げられる。
【００３２】
出力部２２は、各種情報を出力する。例えば、出力部２２は、制御部２５から画像が入力された場合には、外部のディスプレイに画像を表示するように、ディスプレイの表示を制御する。
【００３３】
通信部２３は、無線通信を行う。例えば、通信部２３は、制御部２５と、端末１０との無線通信を行う。通信部２３は、制御部２５から情報が入力されると、入力された情報を端末１０へ送信する。また、通信部２３は、端末１０から情報が入力されると、入力された情報を制御部２５へ送信する。通信部２３の一例としては、無線通信インタフェースが挙げられる。
【００３４】
記憶部２４は、固定リソースリスト２４ａと、再設定変数リスト２４ｂと、インスタンス管理表２４ｃとを記憶する。固定リソースリスト２４ａには、固定リソースリスト１４ａと同一の内容が登録される。すなわち、固定リソースリスト２４ａには、アプリケーションが参照する固定リソースを参照する変数を識別する識別情報が登録される。また、再設定変数リスト２４ｂには、上述したように、計算処理部を参照する変数が登録される。図６は、再設定変数リストの一例を示す図である。図６の例では、再設定変数リスト２４ｂには、クラス名が「計算処理部ラッパ」であるラッパを参照するメンバ変数の変数名が「ｃａｌｃＴｈｒｅａｄ」であることが登録されている。また、インスタンス管理表２４ｃについては、上述したインスタンス管理表１４ｂと同様のものであるので、説明を省略する。
【００３５】
記憶部２４は、例えば、フラッシュメモリなどの半導体メモリ素子、または、ハードディスク、光ディスクなどの記憶装置である。なお、記憶部２４は、上記の種類の記憶装置に限定されるものではなく、ＲＡＭ（Random  Access  Memory)、ＲＯＭ（Read  Only  Memory)であってもよい。
【００３６】
制御部２５は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する。図１に示すように、制御部２５は、第二の実行部２５ａと、受信部２５ｂと、第二の設定部２５ｃと、再開部２５ｄとを有する。
【００３７】
第二の実行部２５ａは、アプリケーションを実行する。例えば、第二の実行部２５ａは、ＧＵＩを有するＪａｖａアプリケーションを実行する。なお、このアプリケーションは、上述したように、開発者などによって、ソースが改変されたものである。例えば、かかるアプリケーションは、クラス名およびメンバ変数名が固定ソースリスト２４ａに抽出され、毎グレート要求を受け取った時の処理がソースに記述されており、また、この処理が、抽出されたクラス名およびメンバ変数名に基づいて行われる。図５の例では、第二の実行部２５ａによって、計算処理部１が起動されている。
【００３８】
受信部２５ｂは、送信部１５ｄにより送信された実行状態を受信する。図５の例では、受信部２５ｂは、端末１０の送信部１５ｄから送信された実行状態を受信し、受信した実行状態をデシリアライズし、計算処理部の新しいインスタンス（計算処理部２）を生成する。
【００３９】
第二の設定部２５ｃは、第二の実行部２５ａにより実行されたアプリケーションにおいて用いられる変数のうち、記憶部２４に記憶された固定リソースリスト２４ａに登録された識別情報が示す変数の値を抽出し、次のように処理する。すなわち、第二の設定部２５ｃは、受信部２５ｂにより受信された実行状態に基づいて生成されるインスタンスの対応する変数に、抽出した値を設定する。図５の例では、第二の設定部２５ｃは、計算処理部１で用いられる変数のうち、固定リソースリスト２４ａに登録された識別情報が示す変数ｂ、ｃの各値を、計算処理部２の対応する変数、すなわち計算処理部２の変数ｂ、ｃのそれぞれに設定する。また、図５の例では、第二の設定部２５ｃは、計算処理部ラッパの参照先を、計算処理部１から、計算処理部２に変更する。
【００４０】
再開部２５ｄは、第二の設定部２５ｃにより設定されたインスタンスを再開することで、端末１０で停止されたアプリケーションを再開させる。図５の例では、再開部２５ｄは、計算処理部１を停止させ、計算処理部２を再開させることで、端末１０で停止されたアプリケーションを再開させる。
【００４１】
端末１０からクラウドサーバ２０へのマイグレーションについて説明した。ここで、クラウドサーバ２０が、端末１０の制御部１５が有する各部１５ａ、１５ｂ、１５ｃ、１５ｄと同様の機能を備え、端末１０が、クラウドサーバ２０の制御部２５が有する各部２５ａ、２５ｂ、２５ｃ、２５ｄおよび再設定変数リスト２４ｂと同様の機能を備えた場合を想定する。このような場合には、同様にして、クラウドサーバ２０から端末１０へのマイグレーションを行うこともできる。
【００４２】
ここで、変数値の更新処理方法の一例について説明する。図７は、変数値の更新処理方法の一例について説明するための図である。Ｊａｖａ仮想マシンでは、例えば以下のように変数が管理されている。あるオブジェクト・リファレンスが指す先はＪａｖａヒープメモリ領域内のハンドル・プール内のアドレスである。該当アドレスの内容は、オブジェクト・プール内のアドレスと、クラス・データのアドレスから成る。オブジェクト・プール内のアドレスにある内容は、対象オブジェクトの各メンバ変数の値のアドレスである。各アドレスに各メンバ変数の値がある。メンバ変数の型がクラスの場合は、メンバ変数の値として、該当クラスのインスタンスのアドレス（オブジェクト・リファレンス）が入っている。また、クラス・データのアドレスには、メソッドエリア領域内にある、対象オブジェクトのクラス構造が配置されている。クラス・データは、クラス名、コンスタント・プール、フィールド情報、メソッド情報、クラス変数などから成る。このうち、フィールド情報にメンバ変数の情報が配置されており、各メンバ変数の変数名と型から成る。
【００４３】
マイグレート開始時には、マイグレート対象オブジェクトとして、あるオブジェクト・リファレンスが指定される。固定リソースの切り張りの際に使用するデータである、固定リソースリスト１４ａ、２４ａには、以下の例のように、固定リソースを参照する各メンバ変数の、クラス名と変数名が登録されている。
【００４４】
（１）マイグレート対象オブジェクトとして指定されたオブジェクト・リファレンスが指すアドレスにあるクラス・データのアドレスにあるクラス・データから、クラス名を取得し、固定リソースリスト内で該当するクラス名を抜き出す。
【００４５】
（２）（１）で抜き出した固定リソースリストの各メンバ変数名を、クラス・データ内のフィールド情報(メンバ変数情報)内で探し、何番目の変数か（インデックス）を特定する。
【００４６】
（３）指定されたオブジェクト・リファレンスが指すアドレスにあるオブジェクト・プールのアドレスから、（２）で特定したインデックスにある変数値のアドレスにある変数値をｎｕｌｌに変更する。
【００４７】
（４）（１）で取得したクラス・データ内のフィールド情報（メンバ変数情報）の各変数の型がクラスの場合、該当する各変数について、（３）と同様の方法で変数値のアドレスを特定して変数値を取得し、再帰的に（１）−（４）の処理を行う。
【００４８】
「ｃｈｅｃｋｐｏｉｎｔ」は、実行状態の抽出を可能にするライブラリ（例:  Apache  Commons  Javaflow）を使用する。このライブラリは、コンパイル後のＪａｖａのプログラム（バイトコード）を変更することで、ローカル変数・メソッド呼び出し履歴・現在の実行場所などの実行状態を抽出可能にする。
【００４９】
シリアライズは、「ｃｈｅｃｋｐｏｉｎｔ」で抽出した実行状態を、マイグレート対象オブジェクトとして、Ｊａｖａ付属のシリアライズ用メソッド（java.io.ObjectOutputStream#writeObject()）に渡すことによって、シリアライズを行う。Ｊａｖａ付属のシリアライズ用メソッドでは、メンバ変数のシリアライズにあたって、以下の処理が行われる。
【００５０】
（Ａ）マイグレート対象オブジェクトとして指定されたオブジェクト・リファレンスが指すアドレスにあるクラス・データのアドレスにあるクラス・データ内のフィールド情報（メンバ変数情報）を取得し、各メンバ変数の型を取得する。その後、オブジェクト・プールのアドレスから、各変数値のアドレスにある変数値を取得し、型が基本データ型（int等）・Ｓｔｒｉｎｇクラスの場合は変数値をバイト列として書き出し、他のクラスの場合は（Ａ）を再帰的に実行して、バイト列を書き出す。
【００５１】
デシリアライズは、シリアライズされたバイト列を、Ｊａｖａ付属のデシリアライズ用メソッド（java.io.ObjectInputStream#readObject()）で読み込むことで、シリアライズ前と同内容のオブジェクトを生成する。
【００５２】
Ｊａｖａ付属のデシリアライズ用メソッドでは、メンバ変数のデシリアライズにあたって、以下の処理が行われる。
【００５３】
（Ｂ）シリアライズされたバイト列に含まれるクラス名をもとに、メソッドエリア内のクラス・データを探し、クラス・データ内のフィールド情報（メンバ変数情報）を取得する。
【００５４】
（Ｃ）各メンバ変数値のアドレス用の領域をオブジェクト・プール内に確保する。
【００５５】
（Ｄ）ハンドル・プール内のオブジェクト・プールのアドレスの値として、確保したオブジェクト・プール内のアドレスをセットする。
【００５６】
（Ｅ）シリアライズされたバイト列から各メンバ変数の型を取得する。メンバ変数の型が基本データ型・Ｓｔｒｉｎｇクラスでない場合は、（Ｂ）−（Ｆ）を再帰的に実行する。メンバ変数の型が基本データ型・Ｓｔｒｉｎｇクラスの場合は、シリアライズされたバイト列から各メンバ変数の値を取得する。各メンバ変数値用の領域をオブジェクト・プール内に確保し、取得したメンバ変数値をセットする。
【００５７】
（Ｆ）各メンバ変数値のアドレスの値として、確保したメンバ変数値のアドレスをセットする。
【００５８】
（ａ）デシリアライズされたオブジェクトのオブジェクト・リファレンスが指すアドレスにあるクラス・データのアドレスにあるクラス・データから、クラス名を取得し、固定リソースリスト内で該当するクラス名を抜き出す。
【００５９】
（ｂ）（ａ）で抜き出した固定リソースリストの各メンバ変数名を、クラス・データ内のフィールド情報（メンバ変数情報）内で探し、何番目の変数か（インデックス）を特定する。
【００６０】
（ｃ）インスタンス管理表から、マイグレートインスタンスを取得（オブジェクト・リファレンス）し、オブジェクト・リファレンスが指すアドレスにあるオブジェクト・プールのアドレスから、（ｂ）で特定したインデックスにある変数値のアドレスにある変数値を取得する。
【００６１】
（ｄ）デシリアライズされたオブジェクト・リファレンスが指すアドレスにあるオブジェクト・プールのアドレスから、（ｂ）で特定したインデックスにある変数値のアドレスにある変数値を、（ｃ）で取得した変数値に変更する。
【００６２】
（ｅ）（ａ）で取得したクラス・データ内のフィールド情報（メンバ変数情報）の各変数の型がクラスの場合、該当する各変数について、（ｄ）と同様の方法で変数値のアドレスを特定して変数値を取得し、再帰的に（ａ）−（ｅ）の処理を行う。
【００６３】
（１０）インスタンス管理表から、ラッパインスタンスを取得（オブジェクト・リファレンス）し、オブジェクト・リファレンスが指すアドレスにあるクラス・データのアドレスにあるクラス・データから、クラス名を取得し、再設定変数リスト内で該当するクラス名を抜き出す。
【００６４】
（１１）（１０）で抜き出した再設定変数リストの各メンバ変数名を、クラス・データのフィールド情報（メンバ変数情報）内で探し、何番目の変数か（インデックス）を特定する。
【００６５】
（１２）インスタンス管理表から、マイグレートインスタンスを取得（オブジェクト・リファレンス）。
【００６６】
（１３）（１０）で取得したラッパインスタンスのオブジェクト・リファレンスが指すアドレスにあるオブジェクト・プールのアドレスから、（１１）で特定したインデックスにある変数値のアドレスにある変数値が、（１２）で取得した値と等しい場合、変数値をデシリアライズされたオブジェクト・リファレンスに変更する。
【００６７】
再開部２５ｄは、インスタントを再開させる場合に、「ｒｅｓｔａｒｔ」を使用する。「ｒｅｓｔａｒｔ」は、「ｃｈｅｃｋｐｏｉｎｔ」時に使用したライブラリの「ｒｅｓｔａｒｔ」機能を使用する。「ｃｈｅｃｋｐｏｉｎｔ」で抽出された実行状態の続きから処理を再開する。
【００６８】
制御部２５は、ＡＳＩＣ（Application  Specific  Integrated  Circuit）やＦＰＧＡ（Field  Programmable  Gate  Array）などの集積回路またはＣＰＵ（Central  Processing  Unit）やＭＰＵ（Micro  Processing  Unit）などの電子回路である。
【００６９】
［処理の流れ］
次に、本実施例に係るクラウドシステム１の処理の流れを説明する。図８および図９は、実施例１に係るクラウドシステムの処理の手順を示すシーケンス図である。
【００７０】
図８に示すように、第一の実行部１５ａは、アプリケーションを実行する（ステップＳ１０１）。第一の実行部１５ａは、マイグレートされるインスタンスをインスタンス管理表１４ｂに登録する（ステップＳ１０２）。
【００７１】
第一の実行部１５ａは、計算処理部ラッパインスタンスをインスタンス管理表１４ｂに登録する（ステップＳ１０３）。第一の実行部１５ａは、マイグレート要求を受信する（ステップＳ１０４）。第一の実行部１５ａは、マイグレート要求を受信すると、クラウドサーバ２０にアプリケーションを実行する要求であるアプリケーション実行要求を送信する（ステップＳ１０５）。アプリケーション実行要求を受けたクラウドサーバ２０の第二の実行部２５ａは、アプリケーションを実行する（ステップＳ２０１）。
【００７２】
第一の実行部１５ａは、マイグレート処理エンジンのマイグレート用ＡＰＩを呼び出す（ステップＳ１０６）。第一の設定部１５ｂは、固定リソースリスト１４ａに登録されているクラス名およびメンバ変数名と一致するスレッドクラスのメンバ変数に所定値、例えば、ｎｕｌｌを設定する（ステップＳ１０７）。抽出部１５ｃは、マイグレート対象のインスタンスを停止させる（ステップＳ１０８）。
【００７３】
抽出部１５ｃは、マイグレート対象のインスタンスに対して「ｃｈｅｃｋｐｏｉｎｔ」を実行して、変数値、スタック内容および実行場所を含む実行状態を抽出する（ステップＳ１０９）。送信部１５ｄは、抽出された実行状態をシリアライズする（ステップＳ１１０）。送信部１５ｄは、シリアライズされた実行状態のバイト列をクラウドサーバ２０に送信する（ステップＳ１１１）。
【００７４】
クラウドサーバ２０の受信部２５ｂは、端末１０の送信部１５ｄから送信された実行状態のバイト列を受信する（ステップＳ２０２）。受信部２５ｂは、受信した実行状態をデシリアライズし、計算処理部の新しいインスタンス（計算処理部２）を生成する（ステップＳ２０３）。第二の設定部２５ｃは、第二の実行部２５ａにより実行されたアプリケーションにおいて用いられる変数のうち、記憶部２４に記憶された固定リソースリスト２４ａに登録された識別情報が示す変数の値を、次のように処理する。すなわち、第二の設定部２５ｃは、かかる変数の値を、受信部２５ｂにより受信された実行状態に基づいて生成されるインスタンスの対応する変数に設定する（ステップＳ２０４）。
【００７５】
第二の設定部２５ｃは、計算処理部ラッパの参照先を、既に実行されていたインスタンス（登録インスタンス）ではなく、新たに生成されたインスタンス（生成インスタンス）となるように、設定する（ステップＳ２０５）。
【００７６】
再開部２５ｄは、登録インスタンスを停止させる（ステップＳ２０６）。再開部２５ｄは、生成インスタンスを再開（「ｒｅｓｔａｒｔ」）させることで、端末１０で停止されたアプリケーションを再開させる（ステップＳ２０７）。再開部２５ｄは、生成インスタンスを、マイグレートされるインスタンスとして、インスタンス管理表２４ｃのマイグレートインスタンスの参照の値を、生成インスタンスに更新する（ステップＳ２０８）。そして、ユーザの操作により、または、ステップＳ１１１の処理を実行してから、所定時間が経過すると、端末１０は、マイグレート要求をクラウドサーバ２０に送信する（ステップＳ１１２）。
【００７７】
そして、図９に示す以降の処理（ステップＳ１１３〜１１９、Ｓ２０９〜２１３）については、図８に示すステップＳ２０２〜２０８、Ｓ１０６〜１１１と同様であるので説明を省略する。
【００７８】
［実施例１の効果］
上述してきたように、本実施例に係るクラウドシステム１では、マイグレーション元の端末１０、マイグレーション先のクラウドサーバ２０で、共通のアプリケーションが実行される。本実施例に係るクラウドシステム１では、マイグレーション先で、生成インスタンスの変数に、既に実行されているインスタンスの変数の値がコピーされて、固定リソースの再バインドが行われる。そのため、本実施例に係るクラウドシステム１では、固定リソースの再バインドを容易に行うことができる。
【００７９】
さて、これまで開示の装置に関する実施例について説明したが、本発明は上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下では、本発明に含まれる他の実施例を説明する。
【００８０】
例えば、実施例１では、マイグレート先の装置に、予めソースが改変されたアプリケーションや、固定リソースリストを保持させる場合を例示したが、開示の装置はこれに限られない。例えば、マイグレート時に、マイグレート元の装置が、マイグレート先の装置に、予めソースが改変されたアプリケーションや、固定リソースリストを送信するようにしてもよい。この場合、マイグレート先の装置は、受信したアプリケーションを実行し、固定リソースリストを用いて、上述したマイグレートの方法と同様に、マイグレートを行う。
【００８１】
また、実施例１において説明した処理のうち、自動的に行われるものとして説明した処理の全部または一部を手動的に行うこともできる。また、実施例１において説明した処理のうち、手動的に行われるものとして説明した処理の全部または一部を公知の方法で自動的に行うこともできる。例えば、ステップＳ２０８、ステップＳ１１９において、人間がインスタンス管理表の更新を行ってもよい。
【００８２】
また、各種の負荷や使用状況などに応じて、各実施例において説明した各処理の各ステップでの処理を任意に細かくわけたり、あるいはまとめたりすることができる。また、ステップを省略することもできる。ステップＳ１０２、ステップＳ１０３の処理をまとめることもできる。
【００８３】
また、各種の負荷や使用状況などに応じて、各実施例において説明した各処理の各ステップでの処理の順番を変更できる。
【００８４】
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的状態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、第一の設定部１５ｂと、抽出部１５ｃとが統合されてもよい。また、第二の設定部２５ｃと、再開部２５ｄとが統合されてもよい。
【００８５】
以上説明した実施形態及びその変形例に関し、更に以下の付記を開示する。
【００８６】
（付記１）端末およびサーバを有するシステムであって、
前記端末は、
アプリケーションを実行する第一の実行部と、
前記アプリケーションの実行時に参照される固定リソースを参照するための変数を識別する識別情報を記憶する第一の記憶部と、
前記第一の実行部により実行されたアプリケーションにおいて用いられる変数のうち、前記第一の記憶部に記憶された識別情報が示す変数に値を設定し、前記固定リソースを開放する第一の設定部と、
前記アプリケーションを停止させ、前記アプリケーションの実行状態を抽出する抽出部と、
前記実行状態を前記サーバに送信する送信部とを有し、
前記サーバは、
前記アプリケーションを実行する第二の実行部と、
前記送信部により送信された前記実行状態を受信する受信部と、
前記アプリケーションが参照する固定リソースを参照する変数を識別する識別情報を記憶する第二の記憶部と、
前記第二の実行部により実行されたアプリケーションにおいて用いられる変数のうち、前記第二の記憶部に記憶された識別情報が示す変数の値を抽出し、前記受信部により受信された実行状態に基づいて生成されるインスタンスの対応する変数に前記抽出した値を設定する第二の設定部と、
前記第二の設定部により設定されたインスタンスを再開することで、前記端末で停止されたアプリケーションを再開させる再開部とを有する
ことを特徴とするシステム。
【００８７】
（付記２）前記第二の設定部は、固定リソースが参照する再設定変数に、前記再開部により再開されたアプリケーションの情報を設定する
ことを特徴とする付記１に記載のシステム。
【００８８】
（付記３）端末およびサーバを有するシステムが実行するマイグレーション方法であって、
前記端末は、
アプリケーションを実行し、
前記第一の実行部により実行されたアプリケーションにおいて用いられる変数のうち、前記アプリケーションの実行時に参照される固定リソースを参照するための変数を識別する識別情報を記憶する第一の記憶部に記憶された識別情報が示す変数に値を設定し、前記固定リソースを開放し、
前記アプリケーションを停止させ、前記アプリケーションの実行状態を抽出し、
前記実行状態を前記サーバに送信し、
前記サーバは、
前記アプリケーションを実行し、
送信された前記実行状態を受信し、
前記第二の実行部により実行されたアプリケーションにおいて用いられる変数のうち、前記アプリケーションが参照する固定リソースを参照する変数を識別する識別情報を記憶する第二の記憶部に記憶された識別情報が示す変数の値を抽出し、前記受信部により受信された実行状態に基づいて生成されるインスタンスの対応する変数に前記抽出した値を設定し、
設定されたインスタンスを再開することで、前記端末で停止されたアプリケーションを再開させることを特徴とするマイグレーション方法。
【００８９】
（付記４）前記抽出した値を設定する方法は、固定リソースが参照する再設定変数に、再開されたアプリケーションの情報を設定する
ことを特徴とする付記３に記載のマイグレーション方法。
【符号の説明】
【００９０】
１        クラウドシステム
１０      端末
１４      記憶部
１４ａ    固定リソースリスト
１５      制御部
１５ａ    第一の実行部
１５ｂ    第一の設定部
１５ｃ    抽出部
１５ｄ    送信部
２０      クラウドサーバ
２４      記憶部
２４ａ    固定リソースリスト
２５      制御部
２５ａ    第二の実行部
２５ｂ    受信部
２５ｃ    第二の設定部
２５ｄ    再開部
【図１】
0005678778.tif 000002
【図２】
0005678778.tif 000003
【図３】
0005678778.tif 000004
【図４】
0005678778.tif 000005
【図５】
0005678778.tif 000006
【図６】
0005678778.tif 000007
【図７】
0005678778.tif 000008
【図８】
0005678778.tif 000009
【図９】
0005678778.tif 000010