(57)【要約】  通信システム（１００）は、通信装置間の通信状態に応じた負荷分散を提供する。通信装置（１０１＃０）は、決定部（４０１）によって負荷分散の設定を行うことを決定する。設定後、通信装置（１０１＃０）は、選択部（４０２）によって負荷分散の設定が行われると決定された場合、移動対象スレッドまたは移動対象プロセスを選択する。選択後、通信装置（１０１＃０）は、通信装置（１０１＃０）と通信装置（１０１＃１）とが無線通信Ｉ／Ｆ（１１１＃０）と無線通信Ｉ／Ｆ（１１１＃１）によって無線通信を行う場合、設定部（４０３）によって第１負荷分散の実行を設定する。または、通信装置（１０１＃０）と通信装置（１０１＃１）とが有線通信Ｉ／Ｆ（１１０＃０）と有線通信Ｉ／Ｆ（１１０＃１）によって有線通信を行う場合、通信装置（１０１＃０）は、設定部（４０３）によって第２負荷分散の実行を設定する。
2012066633.tif 000002
【特許請求の範囲】
【請求項１】
第１中央処理装置と第１メモリとを含む第１通信装置と、
第２中央処理装置と第２メモリとを含む第２通信装置と、
を含み、
前記第１通信装置の第１負荷量と前記第２通信装置の第２負荷量とに基づいて負荷分散を行い、
前記第１通信装置と前記第２通信装置とが無線通信を行う場合には第１負荷分散を行い、
前記第１通信装置と前記第２通信装置とが有線通信を行う場合には前記第１負荷分散とは異なる第２負荷分散を行うこと
を特徴とする通信装置。
【請求項２】
前記第１負荷分散においては、前記第１中央処理装置が実行するプロセスのプログラムコードおよびデータが前記第２メモリに転送されること
を特徴とする請求項１に記載の通信装置。
【請求項３】
前記第２負荷分散においては、前記第１中央処理装置が実行するプロセスに含まれるスレッドが前記第２通信装置に転送されること
を特徴とする請求項１または請求項２に記載の通信装置。
【請求項４】
前記第１負荷量と前記第２負荷量との差分が所定値以上であるときに前記負荷分散が行われること
を特徴とする請求項１乃至請求項３の何れか一に記載の通信装置。
【請求項５】
更にタイマーを含み、
前記タイマーからの通知に基づいて前記負荷分散を行うか否かを決定すること
を特徴とする請求項１に記載の通信装置。
【請求項６】
前記第１メモリから前記第２メモリへ転送時間に基づいて前記第２メモリに転送するプロセスを選択すること
を特徴とする請求項２に記載の通信装置。
【請求項７】
スレッドの前記第１メモリへのアクセス頻度または過去のスレッドの転送履歴に基づいて、前記第２通信装置に転送するスレッドを選択すること
を特徴とする請求項３に記載の通信装置。
【請求項８】
コンピュータによって実行される第１通信装置と第２通信装置と間の負荷分散方法であって、
前記第１通信装置と前記第２通信装置とが無線通信を行う場合には、前記第１通信装置および前記第２通信装置間で所定機能を実行するプログラムのプログラムコードおよびデータが転送される第１負荷分散が行われ、
前記第１通信装置と前記第２通信装置とが有線通信を行う場合には、前記第１通信装置および前記第２通信装置間で前記プログラムに含まれるスレッド処理が転送される第２負荷分散が行われること
を特徴とする負荷分散方法。
【請求項９】
前記第１通信装置の第１負荷量と前記第１通信装置の前記第２負荷量との差分が所定値以上であるときに前記第１負荷分散または前記第２負荷分散が行われること
を特徴とする請求項８に記載の負荷分散方法。
【請求項１０】
コンピュータによって実行される負荷分散プログラムが格納される前記コンピュータがアクセス可能な記録媒体であって、
前記プログラムは、
第１通信装置と第２通信装置の通信状態を検出する通信状態監視ユニットと、
前記第１通信装置の第１負荷量と前記第１通信装置の第２負荷量と検出する負荷監視ユニットと、
前記第１負荷量および前記第２負荷量に基づいて、前記第１通信装置と前記第２通信装置間で負荷分散を行うことを決定する負荷分散ユニットと、
を含み、
前記負荷分散ユニットは、
前記通信状態が有線通信を示すときは、前記第１通信装置および前記第２通信装置間で所定機能を実行するプログラムが転送され、
前記通信状態が無線通信を示すときは、前記第１通信装置および前記第２通信装置間で所定機能を実行するプログラムの処理単位に対応するスレッドが転送されること
を特徴とする記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、通信装置、負荷分散方法、および記録媒体に関する。
【背景技術】
【０００２】
従来、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）とメモリを搭載した処理ユニットを複数含むマルチコアプロセッサシステムの種別としては、大別して次の２つの種別に分けることができる。一つは、他の処理ユニットのメモリをＣＰＵから直接参照できない分散メモリ型のマルチコアプロセッサシステムであり、もう一つは、他の処理ユニットのメモリを参照可能な分散共有メモリ型、またはＮＵＭＡ（Ｎｏｎ−Ｕｎｉｆｏｒｍ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）型のマルチコアプロセッサシステムである（分散共有メモリ型、ＮＵＭＡ型についての説明は、たとえば、非特許文献１〜非特許文献３を参照。）。【０００３】
分散メモリ型、分散共有メモリ型、ＮＵＭＡ型のマルチコアプロセッサシステムは、大型計算機で、筐体間のような共有メモリを実現するには十分な通信帯域が得られないような状況の場合に適用されている。また、大型計算機では、非常に多くのＣＰＵを搭載するために、共有メモリではメモリアクセスが混雑しすぎて性能が出ない場合に、分散メモリ型、分散共有メモリ型、ＮＵＭＡ型のマルチコアプロセッサシステムが使用されている。【０００４】
処理ユニット間で負荷分散を行う場合、処理ユニット群が属する通信システムは、処理を処理ユニット間で移動させることになる。分散共有メモリ型、または、ＮＵＭＡ型のマルチコアプロセッサシステムにおいて、自処理ユニットのメモリと、他処理ユニットのメモリとではアクセス速度が異なるが、論理的なメモリの扱いは、共有メモリ型のマルチコアプロセッサシステムと等しい。したがって、分散共有メモリ型、または、ＮＵＭＡ型のマルチコアプロセッサシステムにおける処理の移動方法は、共有メモリ型のマルチコアプロセッサシステムと同等の方法を利用することができる。【０００５】
一方、分散メモリ型のマルチコアプロセッサシステムにおける負荷分散に関して、たとえば、移動対象の処理が利用しているデータを、処理ユニット間の通信路を利用して移動元の処理ユニットから移動先の処理ユニットに移動させるという技術が開示されている（たとえば、下記特許文献１を参照。）。具体的に、特許文献１にかかる技術では、移動対象の処理の移動後、移動先の処理ユニットが移動対象の処理を実行すると、移動元の処理ユニットのメモリにアクセスする。これにより、分散メモリ型のマルチコアプロセッサシステムにおいて処理ユニット間にて処理の移動を実現し、負荷分散を行うことができる。【０００６】
また負荷分散における、複数の処理のうち移動対象とする処理を選択する方法に適用できる技術として、スレッドの切り替え時に、メモリの容量と転送時間とに基づいたコストを算出し、コストが最も小さいスレッドに切り替えるという技術が開示されている（たとえば、下記特許文献２を参照。）。これにより、負荷分散時において、最もコストの小さい処理を移動することができる。【０００７】
また、負荷分散を実行するか否かの決定方法において、定期的に複数の処理ユニットの負荷状況を監視し、処理ユニット間で負荷量の偏りが大きい場合に、負荷分散を実行するという技術が開示されている（たとえば、下記特許文献３を参照。）。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２００９−１９９４１４号公報
【特許文献２】特開２００８−１５２４７０号公報
【特許文献３】特開２００８−１９１９４９号公報
【非特許文献】
【０００９】
【非特許文献１】「分散共有メモリ  −  Ｗｉｋｉｐｅｄｉａ」［ｏｎｌｉｎｅ］、２０１０年１０月７日検索、インターネット＜ＵＲＬ：ｈｔｔｐ：／／ｊａ．ｗｉｋｉｐｅｄｉａ．ｏｒｇ／ｗｉｋｉ／％Ｅ５％８８％８６％Ｅ６％９５％Ａ３％Ｅ５％８５％Ｂ１％Ｅ６％９Ｃ％８９％Ｅ３％８３％Ａ１％Ｅ３％８３％Ａ２％Ｅ３％８３％ＡＡ＞
【非特許文献２】「ＮＵＭＡ  −  Ｗｉｋｉｐｅｄｉａ」［ｏｎｌｉｎｅ］、２０１０年１０月７日検索、インターネット＜ＵＲＬ：ｈｔｔｐ：／／ｊａ．ｗｉｋｉｐｅｄｉａ．ｏｒｇ／ｗｉｋｉ／ＮＵＭＡ＞
【非特許文献３】「ＮＵＭＡ：理論と実践  −  ＳｏｕｒｃｅＦｏｒｇｅ．ＪＰ  Ｍａｇａｚｉｎｅ  ：  オープンソースの話題満載」［ｏｎｌｉｎｅ］、２０１０年１０月７日検索、インターネット＜ＵＲＬ：ｈｔｔｐ：／／ｓｏｕｒｃｅｆｏｒｇｅ．ｊｐ／ｍａｇａｚｉｎｅ／０３／０５／１４／０２２２２２１＞
【発明の概要】
【発明が解決しようとする課題】
【００１０】
近年では、通信装置２つを結合して使用したり、または、通信装置２つを分離し、一方の通信装置で通話を行い、他方の通信装置でネットワークに接続したり、という使用方法が提供されたセパレート型の携帯電話が存在する。それぞれの通信装置がＣＰＵとメモリを搭載していれば、このようなセパレート型の携帯電話も、分散メモリ、または分散共有メモリ、ＮＵＭＡ型のマルチコアプロセッサシステムの一形態とみなせる。【００１１】
また、上述した、分散メモリ型、分散共有メモリ型、ＮＵＭＡ型のマルチコアプロセッサシステムを適用した大型計算機では、通信路が固定されていることが想定されている。したがって、たとえば、特許文献１にかかる技術に関しても、通信路が固定されている場合の処理の移動方法を対象としている。しかしながら、前述のセパレート型の携帯電話では、通信装置間が結合、または分離した状態によって通信速度が大きく変化し、負荷分散を行うにも、通信状態によっては処理の移動が高負荷となってしまい、処理効率が低下するという問題があった。【００１２】
たとえば、セパレート型の携帯電話において、通信装置間が分離されて無線接続状態で情報を通信している場合、上述した分散共有メモリ型、またはＮＵＭＡ型を前提とした負荷分散を行うと、低速な無線接続状態で通信装置間での通信を頻繁に行うため、通信に時間がかかってしまうという問題があった。【００１３】
本発明は、上述した従来技術による問題点を解消するため、通信装置間の通信状態に応じた負荷分散を実行できる通信装置、負荷分散方法、および記録媒体を提供することを目的とする。
【課題を解決するための手段】
【００１４】
上述した課題を解決し、目的を達成するため、開示の通信装置は、第１中央処理装置と第１メモリとを含む第１通信装置と、第２中央処理装置と第２メモリとを含む第２通信装置とが、第１通信装置の第１負荷量と第２通信装置の第２負荷量とに基づいて負荷分散を行い、第１通信装置と第２通信装置とが無線通信を行う場合には第１負荷分散を行い、第１通信装置と第２通信装置とが有線通信を行う場合には第１負荷分散とは異なる第２負荷分散を行う。
【発明の効果】
【００１５】
本通信装置、負荷分散方法、および記録媒体によれば、通信装置間の通信状態に応じた負荷分散を実行でき、通信装置の処理効率が向上するという効果を奏する。
【図面の簡単な説明】
【００１６】
【図１】実施の形態１にかかる通信システム１００のハードウェアを示すブロック図である。
【図２】通信システム１００の通信状態に応じたソフトウェアの負荷分散の状態を示す説明図である。
【図３】負荷分散の具体例を示す説明図である。
【図４】通信システム１００の負荷分散実行決定および負荷分散設定の機能を示すブロック図である。
【図５】通信状態が無線接続状態における負荷分散の動作を示す説明図である。
【図６】通信状態が有線接続状態における負荷分散の動作を示す説明図である。
【図７】通信状態が有線接続状態から無線接続状態に遷移した場合の動作を示す説明図である。
【図８】通信状態が無線接続状態から有線接続状態に遷移した場合の動作を示す説明図である。
【図９】通信装置１０１間のプロセスの移動方法を示す説明図である。
【図１０】通信装置１０１間でのスレッドの移動方法を示す説明図である。
【図１１】第１負荷分散における移動対象プロセスの選択例を示す説明図である。
【図１２】第２負荷分散における移動対象スレッドの選択例を示す説明図である。
【図１３】通信システム１００の機能を示すブロック図である。
【図１４】プロセス用データ領域１３０７とＯＳ用データ領域１３０８の記憶内容の一例を示す説明図である。
【図１５】負荷監視部１３０４の処理を示すフローチャートである。
【図１６】アクセス監視部１３０２の処理を示すフローチャートである。
【図１７】通信状態監視部１３０５の処理を示すフローチャートである。
【図１８】負荷分散設定部１３０６による負荷分散設定処理を示すフローチャートである。
【図１９】負荷分散設定部１３０６による移動対象スレッド選択・移動処理を示すフローチャート（その１）である。
【図２０】負荷分散設定部１３０６による移動対象スレッド選択・移動処理を示すフローチャート（その２）である。
【図２１】負荷分散設定部１３０６による移動対象プロセス選択・移動処理を示すフローチャートである。
【図２２】負荷分散設定部１３０６による、有線通信から無線通信に遷移した際の第２負荷分散から第１負荷分散への切替処理を示すフローチャートである。
【図２３】通信装置１０１が３つ以上ある場合の負荷監視部１３０４の処理を示すフローチャートである。
【図２４】実施の形態２における移動対象プロセスの移動における動作を示す説明図である。
【図２５】実施の形態２における移動元の通信装置１０１＃０でのプロセス移動部４０４の移動元処理を示すフローチャートである。
【図２６】実施の形態２における移動先の通信装置１０１＃１でのプロセス移動部４０４の移動先処理を示すフローチャートである。
【図２７】実施の形態３における移動元の通信装置１０１＃０でのプロセス移動部４０４の移動元処理を示すフローチャートである。
【発明を実施するための形態】
【００１７】
以下に添付図面を参照して、開示の通信装置、負荷分散方法、および記録媒体の好適な実施の形態を詳細に説明する。
【００１８】
（通信システム１００のハードウェア）
図１は、実施の形態１にかかる通信システム１００のハードウェアを示すブロック図である。図１において、通信システム１００は、通信装置１０１＃０、通信装置１０１＃１を含む。また、通信システム１００は、３つ以上の通信装置１０１を含んでもよい。以下、接尾記号“＃０”は、通信装置１０１＃０に含まれるハードウェア、ソフトウェアであることを示し、接尾記号“＃１”は、通信装置１０１＃１に含まれるハードウェア、ソフトウェアであることを示す。
【００１９】
たとえば、通信システム１００は、通信装置１０１＃０、通信装置１０１＃１を１台として扱うセパレート型の携帯端末である。ユーザは、通信装置１０１＃０と通信装置１０１＃１を結合して使用したり、または通信装置１０１＃０と通信装置１０１＃１の結合を解除し、分離して使用したりすることが可能である。以下、通信装置１０１＃０のハードウェアについて説明を行うが、通信装置１０１＃１も通信装置１０１＃０と同様のハードウェアを含む。
【００２０】
通信装置１０１＃０は、中央処理装置となるＣＰＵ１０２＃０と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）１０３＃０と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）１０４＃０と、を含む。また、通信装置１０１＃０は、フラッシュＲＯＭコントローラ１０５＃０と、フラッシュＲＯＭ１０６＃０と、タイマー１０７＃０と、ディスプレイ１０８＃０と、電源管理機構１０９＃０と、有線通信Ｉ／Ｆ１１０＃０と、無線通信Ｉ／Ｆ１１１＃０と、を含む。また、各部はバス１１２＃０によってそれぞれ接続されている。
【００２１】
ここで、ＣＰＵ１０２＃０は、通信装置１０１＃０の全体の制御を司る。さらにＣＰＵ１０２＃０は、稼働中のプログラムのメモリへのアクセス回数を計測するアクセスカウンタ１１３＃０を有する。メモリとはＲＯＭ１０３＃０、ＲＡＭ１０４＃０、フラッシュＲＯＭ１０６＃０等である。ＲＯＭ１０３＃０は、ブートプログラム、アプリケーションなどの実行オブジェクトを記憶している。ＲＡＭ１０４＃０は、ＣＰＵ１０２＃０のワークエリアとして使用される。
【００２２】
フラッシュＲＯＭコントローラ１０５＃０は、ＣＰＵ１０２＃０の制御に従ってフラッシュＲＯＭ１０６＃０に対するデータのリード／ライトを制御する。フラッシュＲＯＭ１０６＃０は、フラッシュＲＯＭコントローラ１０５＃０の制御で書き込まれたデータを記憶する記録媒体である。データの具体例としては、通信システム１００を使用するユーザが有線通信Ｉ／Ｆ１１０＃０、無線通信Ｉ／Ｆ１１１＃０を通して取得した画像データ、映像データなどや、または本実施の形態の負荷分散設定をするプログラムが格納されていてもよい。また、フラッシュＲＯＭ１０６＃０は、たとえば、メモリカード、ＳＤカードなどを採用することができる。
【００２３】
タイマー１０７＃０は、定期的にＣＰＵ１０２＃０に通知する機能を有する。具体的には、タイマー１０７＃０は、クロックをカウントし、カウント数があらかじめ指定した値になったときに、ＣＰＵ１０２＃０に割込信号を通知する。
【００２４】
ディスプレイ１０８＃０は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイ１０８＃０は、たとえば、ＴＦＴ液晶ディスプレイなどを採用することができる。また、ディスプレイ１０８＃０は、ユーザによる押下を受け付けるタッチパネルであってもよい。また、ディスプレイ１０８は、通信装置１０１＃０、通信装置１０１＃１のうち、いずれか１つの通信装置１０１が有していてもよい。さらに、ディスプレイ１０８を有していない通信装置１０１は、ユーザによって数字、各種指示などの入力が行われるキーボードを有していてもよい。
【００２５】
電源管理機構１０９＃０は、通信装置１０１＃０が有するバッテリの残容量の監視と電源電圧、ＣＰＵ１０２＃０等に供給されるクロックの周波数を制御する。有線通信Ｉ／Ｆ１１０＃０と無線通信Ｉ／Ｆ１１１＃０は、通信回線を通じて通信装置１０１＃１と接続する。有線通信Ｉ／Ｆ１１０＃０は、有線回線を通じて有線通信Ｉ／Ｆ１１０＃１と接続し、無線通信Ｉ／Ｆ１１１＃０は、無線回線を通じて無線通信Ｉ／Ｆ１１１＃１と接続する。たとえば、有線接続にはＵＳＢ（Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ）端子による接続、無線接続にはＩＥＥＥ  ８０２．１５やＩＥＥＥ８０２．１１といった規格に従った接続を採用することができる。
【００２６】
また、無線通信Ｉ／Ｆ１１１＃０と、無線通信Ｉ／Ｆ１１１＃１とは、直接通信するアドホック通信となるが、無線通信Ｉ／Ｆ１１１＃０は、無線ＬＡＮを経由してインターネットなどのネットワークに接続してもよい。また、有線通信Ｉ／Ｆ１１０＃０と有線通信Ｉ／Ｆ１１０＃１は、通信装置１０１＃０と通信装置１０１＃１の結合を解除することで、有線回線を切断することも可能である。以下、有線回線が切断され、無線回線による通信が行われている通信状態を無線接続状態、有線回線による通信が行われている通信状態を有線接続状態と呼称する。
【００２７】
図２は、通信システム１００の通信状態に応じたソフトウェアの負荷分散の状態を示す説明図である。符号２０１で示すブロック図は、通信状態が無線接続状態である場合の通信システム１００を示しており、符号２０２で示すブロック図は、通信状態が有線接続状態である場合の通信システム１００を示している。通信装置１０１＃０は、ＯＳ２０３＃０を実行し、通信装置１０１＃１は、ＯＳ２０３＃１を実行する。ＯＳ２０３＃０、ＯＳ２０３＃１は、それぞれ通信装置１０１＃０、通信装置１０１＃０を制御するソフトウェアである。さらに、ＯＳ２０３＃０、ＯＳ２０３＃１の機能により、プロセス２０４、プロセス２０５、プロセス２０６がＣＰＵ１０２＃０、ＣＰＵ１０２＃１に割り当てられる。
【００２８】
プロセス２０４〜プロセス２０６は、内部にスレッドを有する。スレッドとはＣＰＵで行う処理を管理するための基本単位であり、プロセスはスレッドが利用するメモリやデバイスの管理単位である。プロセス２０４〜プロセス２０６の具体例として、プロセス２０４は、スレッド２０４−１〜スレッド２０４−３という３つのスレッドを含む。同様に、プロセス２０５は、スレッド２０５−１〜スレッド２０５−３という３つのスレッドを含む。プロセス２０６は、スレッド２０６−１〜スレッド２０６−２という２つのスレッドを含む。
【００２９】
また、説明を簡略化するために、図２における各スレッドの負荷量は全て等しく、１つのスレッドの負荷量＝１として説明を行う。さらに、ＣＰＵ１０２＃０、ＣＰＵ１０２＃１は、与えられた負荷量を実行可能な周波数で実行すると仮定する。ここで、消費電力は周波数に応じて加速度的に増加するため、図２の説明では、ＣＰＵの消費電力をＣＰＵが実行するスレッドの負荷量の合計を２乗した値と設定する。
【００３０】
符号２０１で示すブロック図では、通信状態が無線接続状態であり、プロセス単位で負荷分散を行っている。以下、プロセス単位の負荷分散を、第１負荷分散と呼称する。プロセス間では、データを共有することが少ない。したがって、第１負荷分散では通信量は小さくなる。また、具体的な負荷量として、ＣＰＵ１０２＃０は、スレッド２０４−１〜スレッド２０４−３、スレッド２０６−１、スレッド２０６−２を実行しているため、負荷量＝５となる。また、ＣＰＵ１０２＃１は、スレッド２０５−１〜スレッド２０５−３を実行しているため、負荷量＝３となる。したがって、ＣＰＵ１０２＃０の消費電力＝２５となり、ＣＰＵ１０２＃１の消費電力＝９となり、第１負荷分散時の通信システム１００の消費電力＝２５＋９＝３４となる。
【００３１】
次に、通信装置１０１＃０と通信装置１０１＃１が結合され、通信状態が無線通信から有線通信に遷移した場合のＣＰＵ１０２＃０、ＣＰＵ１０２＃１の負荷量、消費電力を説明する。
【００３２】
符号２０２で示すブロック図では、通信状態が有線接続状態であり、スレッド単位で負荷分散を行っている。以下、スレッド単位の負荷分散を、第２負荷分散と呼称する。スレッドの方がプロセスと比較して粒度が細かいため、第２負荷分散は、第１負荷分散よりも通信装置１０１の負荷量を均等に近づけることが可能である。また、スレッド間では、データを共有することが多い。したがって、第２負荷分散の通信量は、第１負荷分散の通信量に比べ大きくなる。このように、第２負荷分散の通信量は大きくなるが、有線通信は無線通信と比較し一桁ほど通信速度が速いため、通信量が大きくなっても効率のよい負荷分散を実行することができる。
【００３３】
具体的な負荷量として、ＣＰＵ１０２＃０は、スレッド２０４−１〜スレッド２０４−３、スレッド２０６−１を実行しているため、負荷量＝４となる。また、ＣＰＵ１０２＃１は、スレッド２０５−１〜スレッド２０５−３、スレッド２０６−２を実行しているため、負荷量＝４となる。したがって、ＣＰＵ１０２＃０の消費電力＝１６となり、ＣＰＵ１０２＃１の消費電力＝１６となり、第２負荷分散時の通信システム１００の消費電力＝１６＋１６＝３２となる。以上のように、粒度が細かい第２負荷分散は、第１負荷分散よりも消費電力を減少させることが可能である。
【００３４】
このように、実施の形態１にかかる通信システム１００は、通信装置１０１間での通信速度が通信状態によって大きく変化することを考慮して、通信状態に応じた効率のよい負荷分散を実現する。
【００３５】
図３は、負荷分散の具体例を示す説明図である。図２にて第１負荷分散および第２負荷分散における通信システム１００の実行状態を説明したが、図３では、通信システム１００の運用時の具体例にて、負荷分散の状態を説明する。符号３０１で示す通信システム１００は、負荷分散が行われていない状態であり、符号３０２で示す通信システム１００は、第１負荷分散が行われている状態であり、符号３０３で示す通信システム１００は、第２負荷分散が行われている状態である。
【００３６】
符号３０１で示す通信システム１００では、通信装置１０１＃０が動画再生プロセスと待ち受けプロセスを実行し、通信装置１０１＃１は特にプロセスを実行していない。負荷分散が行われていない符号３０１で示す通信システム１００では、負荷量が通信装置１０１＃０に偏っているため、負荷バランスは悪い。負荷バランスが悪いため、通信システム１００全体の消費電力は大きくなる。
【００３７】
負荷バランスが悪くなると消費電力が大きくなる理由としては、消費電力は周波数に応じて加速度的に増加するので、負荷量が大きくなった通信装置１０１の消費電力が加速度的に大きくなるためである。したがって、負荷分散し、最大の周波数を低下させた方が、全体の消費電力を小さくすることができる。また、通信装置１０１間の通信量に関しては、通信装置１０１＃０で全ての処理が行われているため、小さくなる。
【００３８】
符号３０２で示す通信システム１００では、通信装置１０１＃０が動画再生プロセスを実行し、通信装置１０１＃１が待ち受けプロセスを実行している。第１負荷分散が行われている符号３０２で示す通信システム１００では、負荷が通信装置１０１＃０と通信装置１０１＃１とに分散され、負荷バランスは符号３０１で示す通信システム１００よりよくなる。負荷バランスがよくなった結果、通信システム１００全体の消費電力は、符号３０１で示す通信システム１００より小さくなる。通信装置１０１間の通信量に関しては、プロセス間通信が発生するため、符号３０１で示す通信システム１００より大きくなる。
【００３９】
符号３０３で示す通信システム１００では、通信装置１０１＃０が動画再生プロセス内の動画再生１スレッドを実行し、通信装置１０１＃１が動画再生プロセス内の動画再生２スレッドと待ち受けプロセスを実行している。動画再生１スレッドは、たとえば、動画再生の映像部分の処理を行い、動画再生２スレッドは、動画再生の音声部分の処理を行う。
【００４０】
第２負荷分散が行われている符号３０３で示す通信システム１００では、通信装置１０１＃０の負荷と通信装置１０１＃１の負荷が均等に近くなるように負荷分散され、負荷バランスは符号３０２で示す通信システム１００よりさらによくなる。負荷バランスがさらによくなった結果、通信システム１００全体の消費電力は、符号３０２で示す通信システム１００より小さくなる。通信装置１０１間の通信量に関しては、スレッド間通信が発生し、スレッド間では共有されるデータが多いため、符号３０２で示す通信システム１００より大きくなる。
【００４１】
（実施の形態１にかかる通信システム１００の機能）
次に、実施の形態１にかかる通信システム１００の機能について説明する。図４は、通信システム１００の負荷分散設定の実行決定および負荷分散設定の機能を示すブロック図である。なお、ＯＳ２０３による、プロセスのメモリ管理、アクセス監視、通信状態監視を含めた機能については、図１３にて後述する。通信システム１００は、決定部４０１と、選択部４０２と、設定部４０３と、プロセス移動部４０４と、スレッド移動部４０５と、を含む。この制御部となる機能（決定部４０１〜スレッド移動部４０５）は、記憶装置に記憶されたプログラムをＣＰＵ１０２＃０が実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図１に示したＲＯＭ１０３＃０、ＲＡＭ１０４＃０、フラッシュＲＯＭ１０６＃０などである。
【００４２】
なお、図４では、決定部４０１〜スレッド移動部４０５は、通信装置１０１＃０の機能として図示しているが、他の通信装置１０１が、決定部４０１〜スレッド移動部４０５を有していてもよい。
【００４３】
決定部４０１は、負荷分散の設定を行うことを決定する機能を有する。たとえば、決定部４０１は、通信装置１０１＃０の負荷量と通信装置１０１＃１の負荷量との差分が所定値以上であるときに負荷分散の設定を決定する。また、決定部４０１は、通信装置１０１＃０の負荷量と通信装置１０１＃１の負荷量から算出される目標負荷量と、通信装置１０１＃０の負荷量と、の差分が所定値以上であるときに負荷分散の設定を決定してもよい。なお、目標負荷量については、通信装置１０１＃０の負荷量およびバッテリ残量と、通信装置１０１＃１の負荷量およびバッテリ残量と、から算出してもよい。なお、通信装置１０１の負荷量とは、通信装置１０１内のＣＰＵ１０２の負荷量である。ＣＰＵ１０２の具体的な負荷量の算出方法については、図１１にて後述する。
【００４４】
また、決定部４０１は、タイマー１０７＃０からの通知に基づいて負荷分散の設定を行うか否かを決定してもよい。なお、決定されたか否かという情報は、ＣＰＵ１０２＃０のレジスタ、キャッシュメモリ、ＲＡＭ１０４＃０等の記憶装置に格納される。
【００４５】
選択部４０２は、決定部４０１によって負荷分散の設定が行われると決定された場合、移動対象スレッドまたは移動対象プロセスを選択する機能を有する。たとえば、選択部４０２は、通信装置１０１＃０のメモリから通信装置１０１＃１のメモリへの転送時間に基づいて通信装置１０１＃１のメモリに転送する移動対象プロセスを選択する。また、選択部４０２は、スレッドのメモリへのアクセス頻度または過去のスレッドの転送履歴に基づいて、通信装置１０１＃１に転送する移動対象スレッドを選択してもよい。なお、転送履歴は、たとえば、通信装置１０１＃１から移動してきたスレッドの情報をＲＡＭ１０４＃０内に記憶することで、転送履歴としてもよい。
【００４６】
または、選択部４０２は、プロセスが割り当てられているＣＰＵと異なるＣＰＵに割り当てられているスレッドを、過去に移動してきたスレッドとして判断して、移動対象スレッドに選択してもよい。なお、選択された移動対象スレッドまたは移動対象プロセスの情報は、ＣＰＵ１０２＃０のレジスタ、キャッシュメモリ、ＲＡＭ１０４＃０等の記憶領域に記憶される。
【００４７】
設定部４０３は、通信装置１０１＃０と通信装置１０１＃１とが無線通信を行う場合には第１負荷分散の実行を設定し、通信装置１０１＃０と通信装置１０１＃１とが有線通信を行う場合には第２負荷分散の実行を設定する機能を有する。具体的には、選択部４０２によって移動対象プロセスが選択された場合、設定部４０３は、プロセス移動部４０４に対して移動対象プロセスを移動するように指示することで、第１負荷分散の実行を設定する。同様に、選択部４０２によって移動対象スレッドが選択された場合、設定部４０３は、スレッド移動部４０５に対して移動対象スレッドを移動するように指示することで、第２負荷分散の実行を設定する。
【００４８】
プロセス移動部４０４は、移動対象プロセスを移動元のＣＰＵ１０２から移動先のＣＰＵ１０２に移動させる機能を有する。具体的には、プロセス移動部４０４は、プロセスが実行中に使用するデータを記憶しているプロセス用データ領域を移動元のＲＡＭ１０４から移動先のＲＡＭ１０４へ転送する。続けて、プロセス移動部４０４は、移動対象プロセスが割り当てられていたＣＰＵを移動元のＣＰＵ１０２から移動先のＣＰＵ１０２にすることで、移動対象プロセスの移動を完了する。なお、プロセスの具体的な移動方法については、図９にて後述する。
【００４９】
スレッド移動部４０５は、移動対象スレッドを移動元のＣＰＵ１０２から移動先のＣＰＵ１０２に移動させる機能を有する。具体的には、スレッド移動部４０５は、移動対象スレッドが割り当てられていたＣＰＵを移動元のＣＰＵ１０２から移動先のＣＰＵ１０２にする。そして、スレッド移動部４０５は移動先のＣＰＵ１０２が移動対象スレッドの実行によってプロセス用データ領域にアクセスする場合、通信路を経由して、移動元のＲＡＭ１０４にアクセスするように設定する。なお、スレッドの具体的な移動方法については、図１０にて後述する。
【００５０】
以上、決定部４０１は、決定部４０１が含まれる通信装置１０１が負荷分散を実行するか否か、また選択部４０２、設定部４０３は、選択部４０２、設定部４０３が含まれる通信装置１０１にて割り当てられているプロセス、スレッドに対して機能していた。さらに、決定部４０１〜設定部４０３は、各部が割り当てられている通信装置１０１とは異なる他の通信装置１０１に対して機能してもよい。
【００５１】
たとえば、通信システム１００内に、通信装置１０１＃０、通信装置１０１＃１とは異なる通信装置１０１＃２が存在する場合を想定する。この場合、通信装置１０１＃２に含まれる決定部は、通信装置１０１＃０の負荷量およびバッテリ残量と、通信装置１０１＃１の負荷量およびバッテリ残量と、を取得して、通信装置１０１＃０の負荷分散の設定を実行するか否かを判断してもよい。決定後、通信装置１０１＃２に含まれる選択部は、通信装置１０１＃０に割り当てられているプロセスおよびスレッドの情報を参照し、移動対象スレッドまたは移動対象プロセスを選択する。
【００５２】
移動対象プロセスが選択された場合、通信装置１０１＃２に含まれる設定部４０３は、通信装置１０１＃０のプロセス移動部４０４に対して移動対象プロセスを移動するように指示する。また、移動対象スレッドが選択された場合、通信装置１０１＃２に含まれる設定部４０３は、通信装置１０１＃０のスレッド移動部４０５に対して移動対象スレッドを移動するように指示する。
【００５３】
図５は、通信状態が無線接続状態における負荷分散の動作を示す説明図である。図５では、通信システム１００がプロセス単位の負荷分散となる第１負荷分散を行っている状態を示している。具体的には、通信装置１０１＃０がプロセスＡ、プロセスＢを実行し、通信装置１０１＃１がプロセスＣを実行している。また、プロセスＡはメモリ使用量が小さく、プロセスＢ、プロセスＣはメモリ使用量が大きい。
【００５４】
通信システム１００は、通信装置１０１の負荷を定期的に取得し、負荷バランスが悪くなった場合、移動対象プロセスを選択し、移動対象プロセスを移動する。移動対象プロセスの選択方法は、負荷量が大きい方の通信装置１０１で実行されているプロセスのうち、メモリ使用量が最も小さいプロセスとする。
【００５５】
たとえば、図５では、通信装置１０１＃０の負荷量が増大し、負荷バランスが悪くなっている。通信装置１０１＃０は、ＣＰＵ１０２＃０が実行するプロセスＡとプロセスＢのうち、メモリ使用量が最も小さいプロセスＡを移動対象プロセスに選択し、プロセスＡを通信装置１０１＃１に移動する。なお、移動するか否かの選択方法として、通信システム１００は、移動対象プロセスのメモリ使用量から算出される移動コストと、負荷バランスとに基づいて選択する。移動コストは、たとえば、下記（１）式を用いて算出してもよい。
【００５６】
移動コスト＝移動対象プロセスのメモリ使用量／通信速度  …（１）
【００５７】
通信システム１００は、（１）式を用いて移動コストを算出し、移動コストと、現在の通信装置１０１＃１の負荷量から負荷バランスが均等になる目標値を減じた目標負荷量との差分と、を比較する。比較後、目標負荷量との差分が移動コスト以上である場合、通信システム１００は、移動対象プロセスを移動する。なお、無線通信における移動対象プロセスの移動方法については、図９にて後述する。さらに、移動コストを具体的に算出した例については、図１１にて後述する。
【００５８】
図６は、通信状態が有線接続状態における負荷分散の動作を示す説明図である。図６では、通信システム１００がスレッド単位の負荷分散となる第２負荷分散を行っている状態を示している。具体的には、通信装置１０１＃０がプロセスＡ内のスレッドＡ−１、スレッドＡ−２、プロセスＢ内のスレッドＢ−１を実行し、通信装置１０１＃１がスレッドＢ内のスレッドＢ−２、プロセスＣ内のスレッドＣ−１、スレッドＣ−２を実行している。また、プロセスＡ〜プロセスＣのメモリ使用量は図５で示した状態と等しい。
【００５９】
さらに、各スレッドのアクセス頻度として、スレッドＡ−１、スレッドＢ−１、スレッドＣ−１のアクセス頻度は低く、スレッドＡ−２、スレッドＢ−２のアクセス頻度は高い。スレッドＣ−２のアクセス頻度はアクセス頻度：低のスレッド群とアクセス頻度：高のスレッド群との中間である。
【００６０】
通信システム１００は、通信装置１０１の負荷を定期的に取得し、負荷バランスが悪くなった場合、移動対象スレッドまたは移動対象プロセスを選択し、移動対象スレッドまたは移動対象プロセスを移動する。移動対象スレッドまたは移動対象プロセスの選択方法は、負荷量が大きい方の通信装置１０１で実行されているスレッドまたはプロセスのうち、次の選択方法に基づいて選択する。
【００６１】
選択方法１：負荷量が大きい方の通信装置１０１は、実行されているスレッドのうち、過去に移動してきたスレッドを移動対象スレッドに選択する。過去に移動したスレッドが存在しない場合、負荷量が大きい方の通信装置１０１は、選択方法２による選択方法を試みる。
【００６２】
選択方法２：負荷量が大きい方の通信装置１０１は、実行されているスレッドのうち、アクセス頻度が最も低いスレッドを移動対象スレッドに選択する。負荷量が大きい方の通信装置１０１は、アクセス頻度が低いスレッド順に、移動した際に負荷バランスが目標負荷量に近づくか検証する。負荷バランスが目標負荷量に近づくスレッドが存在しない場合、負荷量が大きい方の通信装置１０１は、選択方法３による選択方法を試みる。
【００６３】
選択方法３：負荷量が大きい方の通信装置１０１は、実行されているプロセスのうち、メモリ使用量の小さいプロセスを移動対象プロセスに選択する。
【００６４】
通信システム１００は、選択方法１〜選択方法３を実行することで、移動対象スレッドまたは移動対象プロセスを選択し、移動対象スレッドまたは移動対象プロセスを移動する。なお、有線通信における移動対象スレッドまたは移動対象プロセスの移動方法については、図１０にて後述する。さらに、選択方法１、選択方法２では、スレッドを移動されることで発生する移動コストと、負荷バランスとに基づいて選択する。具体的な移動コストの算出例は、図１２にて後述する。
【００６５】
このように、通信装置１０１間が有線接続状態の場合は、高速で通信装置１０１間の通信が可能なため、スレッド単位の負荷分散となる第２負荷分散が有効となる。とはいえ、完全な共有メモリ型のマルチコアシステムと異なり、自身の通信装置１０１のメモリを参照するより他の通信装置１０１のメモリを参照した方が若干遅いため、メモリアクセスを頻繁に行う処理を移動させるとかえって効率が悪くなる可能性がある。このため、選択方法１、選択方法２による移動させても効率がよくなるスレッドが無い場合、通信システム１００は、選択方法３によるプロセス単位の負荷分散となる第１負荷分散を行う。
【００６６】
図７は、通信状態が有線接続状態から無線接続状態に遷移した場合の動作を示す説明図である。図７では、通信装置１０１＃０と通信装置１０１＃１とが結合されており通信状態が有線接続状態となる状態から、通信装置１０１＃０と通信装置１０１＃１との結合が解除され、通信状態が無線接続状態へ遷移した状態における動作を示している。図７におけるスレッド、プロセスの状態は、図６で示した状態と等しい。有線接続状態であったときには、通信システム１００は第２負荷分散を行っており通信量が大きいため、通信量が小さい第１負荷分散に遷移する。
【００６７】
図７の例では、通信システム１００が第２負荷分散を行っており、通信装置１０１＃０が移動してきたスレッドＢ−１を実行している。この状態で無線接続状態に遷移すると、通信システム１００は、通信速度が低下するにも関わらず通信量が大きいために、効率が悪化する。したがって、通信装置１０１＃０はスレッドＢ−１を通信装置１０１＃１に移動させ、通信システム１００が第１負荷分散を行うようにする。
【００６８】
図８は、通信状態が無線接続状態から有線接続状態に遷移した場合の動作を示す説明図である。図８では、通信装置１０１＃０と通信装置１０１＃１との結合が解除されており、通信状態が無線接続状態となる状態から、通信装置１０１＃０と通信装置１０１＃１とが結合され有線接続状態へ遷移した状態における動作を示している。図８におけるスレッド、プロセスの状態について、スレッドのアクセス頻度とプロセスのメモリ使用量は図６で示した状態と等しい。プロセスの割当状態については、通信装置１０１＃０がプロセスＡを実行し、通信装置１０１＃１がプロセスＢ、プロセスＣを実行する。
【００６９】
プロセス単位となる第１負荷分散よりスレッド単位となる第２負荷分散の方が、細かな粒度で負荷分散が可能で、より負荷バランスを取りやすいため、通信システム１００は、有線接続状態として再度負荷分散を検討する。具体的には、通信システム１００は、図６で示した第２負荷分散の設定を実行し、通信装置１０１間の負荷バランスをよくする。
【００７０】
図９は、通信装置１０１間のプロセスの移動方法を示す説明図である。通信装置１０１内には、ＣＰＵの要求するメモリアクセスを処理するＭＭＵ（Ｍｅｍｏｒｙ  Ｍａｎａｇｅｍｅｎｔ  Ｕｎｉｔ）９０１が存在する。ＭＭＵ９０１の機能には、メモリアクセスに関する様々な処理が存在するが、図９、図１０では、ＭＭＵ９０１の機能のうち論理アドレスを物理アドレスに変換する機能を用いて、プロセスの移動方法およびスレッドの移動方法を説明する。
【００７１】
はじめにＭＭＵ９０１が有する論理アドレスを物理アドレスに変換する機能について説明する。ＭＭＵ９０１は、変換テーブル９０２を参照する。変換テーブル９０２は、論理アドレスフィールドと、物理アドレスフィールドという２つのフィールドを含み、論理アドレスと物理アドレスを関連付けるテーブルである。また、変換テーブル９０２は、プロセスごとに存在しており、ＲＡＭ１０４に格納されている。また、論理アドレスは、プロセスＡがアクセスする論理アドレス空間９０３のアドレスであり、物理アドレスは、ＲＯＭ１０３、ＲＡＭ１０４等に割り当てられた物理アドレス空間９０４のアドレスである。
【００７２】
たとえば、変換テーブル９０２＃０の例を用いて、ＣＰＵ１０２＃０が論理アドレス“０ｘ００００００１０”に対してアクセス要求を行った場合、ＭＭＵ９０１＃０は、変換テーブル９０２＃０より、“０ｘ００００１０１０”に変換する。
【００７３】
続けて、無線接続状態におけるプロセスの移動方法について説明する。通信装置１０１＃０が実行するプロセスＢを、通信装置１０１＃１に移動させる場合を想定する。プロセスＢの論理アドレス空間９０３には、プログラムコードが格納されたコードセグメントや、変数等が格納されたデータセグメント等が存在する。なお、図９、図１０には図示していないが、移動対象となる領域として、コードセグメント、データセグメント以外に、プロセス実行中に動的に確保されるヒープセグメント、スタックセグメント等が存在する。
【００７４】
コードセグメントの論理アドレス範囲は、“０ｘ００００００００”〜“０ｘ０００００ｆｆｆ”とし、データセグメントの論理アドレス範囲は、“０ｘ００００１０００”〜“０ｘ００００１ｆｆｆ”と想定する。
【００７５】
ＭＭＵ９０１＃０は、変換テーブル９０２＃０のレコード９０５を参照して、論理アドレス範囲“０ｘ００００００００”〜“０ｘ０００００ｆｆｆ”を物理アドレス範囲“０ｘ００００１０００”〜“０ｘ００００１ｆｆｆ”に変換している。また、ＭＭＵ９０１＃０は、レコード９０６を参照して、論理アドレス範囲“０ｘ００００１０００”〜“０ｘ００００１ｆｆｆ”を物理アドレス範囲“０ｘ３ｆｆｆ００００”〜“０ｘ３ｆｆｆ０ｆｆｆ”に変換している。
【００７６】
プロセスＢの移動要求が行われると、通信システム１００は、物理アドレス空間９０４＃０のうち、プロセスＢが使用している領域を、物理アドレス空間９０４＃１にコピーする。具体的に、通信システム１００は、物理アドレス空間９０４＃０内の領域“０ｘ００００１０００”〜“０ｘ００００１ｆｆｆ”を、物理アドレス空間９０４＃１内の領域“０ｘ１０００００００”〜“０ｘ１００００ｆｆｆ”にコピーする。同様に、通信システム１００は、物理アドレス空間９０４＃０内の領域“０ｘ３ｆｆｆ００００”〜“０ｘ３ｆｆｆ０ｆｆｆ”を、物理アドレス空間９０４＃１内の領域“０ｘ１０００３０００”〜“０ｘ１０００３ｆｆｆ”にコピーする。
【００７７】
データのコピー後、通信システム１００は、変換テーブル９０２を再構築する。具体的には、通信装置１０１＃１は、ＯＳ２０３＃１の機能によって、変換テーブル９０２＃０のレコード９０５、レコード９０６を参照元として変換テーブル９０２＃１にレコード９０７、レコード９０８を生成する。
【００７８】
続けて、通信装置１０１＃１は、レコード９０７の物理アドレスフィールドを、“０ｘ００００１０００”〜“０ｘ００００１ｆｆｆ”から“０ｘ１０００００００”〜“０ｘ１００００ｆｆｆ”に書き換える。同様に、通信装置１０１＃１は、レコード９０８の物理アドレスフィールドを、“０ｘ３ｆｆｆ００００”〜“０ｘ３ｆｆｆ０ｆｆｆ”から“０ｘ１０００３０００”〜“０ｘ１０００３ｆｆｆ”に書き換える。なお、コピー終了後、レコード９０５、レコード９０６は消去されてもよい。
【００７９】
このように、図９に示した移動方法では、物理アドレス空間９０４に格納されているプロセスのデータをコピーすることで、プロセスの移動を行う。下記説明において、図９で説明した移動方法を第１の移動方法と呼称する。
【００８０】
図１０は、通信装置１０１間でのスレッドの移動方法を示す説明図である。図１０では、通信装置１０１＃０が実行するプロセスＢ内のスレッドＢ−１を、通信装置１０１＃１に移動させる場合を想定する。プロセスＢの論理アドレス空間９０３、変換テーブル９０２＃０、物理アドレス空間９０４＃０の状態は、図９におけるプロセスＢの移動前の状態と等しい。
【００８１】
スレッドＢ−１の移動要求が行われると、通信システム１００は、物理アドレス空間９０４とは別のアドレス空間となる、通信用空間１００１を確保する。具体的には、通信装置１０１＃０は、領域”０ｘ４０００００００”〜”０ｘ７ｆｆｆｆｆｆｆ”を通信用空間１００１＃０として確保する。同様に、通信装置１０１＃１も、領域”０ｘ４０００００００”〜”０ｘ７ｆｆｆｆｆｆｆ”を通信用空間１００１＃１として確保する。なお、図１０の例では通信用空間１００１の領域が通信装置１０１＃０と通信装置１０１＃１とで一致しているが、アドレスが異なる領域を確保してもよい。
【００８２】
確保された通信用空間１００１は、他の通信装置１０１の物理アドレス空間９０４と関連付けられる。たとえば、通信用空間１００１＃１のアドレス”０ｘ４０００００００”は、物理アドレス空間９０４＃０の“０ｘ００００００００”に関連付けられる。
【００８３】
そして、通信システム１００は、変換テーブル９０２を再構築する。具体的には、通信装置１０１＃１は、ＯＳ２０３＃１の機能によって、変換テーブル９０２＃０のレコード９０５、レコード９０６を参照元として変換テーブル９０２＃１にレコード１００２、レコード１００３を生成する。続けて、通信装置１０１＃１は、レコード１００２、レコード１００３の物理アドレスフィールドを、関連付けられた通信用空間１００１のアドレスに書き換える。
【００８４】
具体的には、通信装置１０１＃１は、レコード１００２の物理アドレスフィールドを、“０ｘ００００１０００”〜“０ｘ００００１ｆｆｆ”から“０ｘ４０００１０００”〜“０ｘ４０００１ｆｆｆ”に書き換える。同様に、通信装置１０１＃１は、レコード１００３の物理アドレスフィールドを、“０ｘ３ｆｆｆ００００”〜“０ｘ３ｆｆｆ０ｆｆｆ”から“０ｘ４０００２０００”〜“０ｘ４０００２ｆｆｆ”に書き換える。書き換え後、通信システム１００は、ＣＰＵ１０２＃０に割り当てられていたスレッドＢ−１を、ＣＰＵ１０２＃１に割り当てる。これにより、スレッドＢ−１の移動が完了する。
【００８５】
移動完了後、ＣＰＵ１０２＃１が、スレッドＢ−１の実行中にＭＭＵ９０１＃０の変換によって通信用空間１００１＃１にアクセス要求があった場合に、通信路を介して、関連付けられた物理アドレス空間９０４＃０にアクセスする。たとえば、ＣＰＵ１０２＃１が、論理アドレス“０ｘ００００００１０”に対する読み込み要求を実行した場合、ＭＭＵ９０１＃１は、通信用空間１００１＃１のアドレス“０ｘ４０００００１０”に変換する。続けて、通信装置１０１＃１は、有線通信Ｉ／Ｆ１１０を経由して、通信用空間１００１＃１のアドレス“０ｘ４０００００１０”に対応する物理アドレス空間９０４＃０のアドレス“０ｘ００００００１０”のデータを取得する。
【００８６】
このように、図１０に示した移動方法では、通信用空間１００１を確保し、通信用空間１００１にアクセスされた場合、関連付けられた他の通信装置１０１の物理アドレス空間９０４に格納されているデータにアクセスすることで、スレッドの移動を行う。下記説明において、図１０で説明した移動方法を第２の移動方法と呼称する。第２の移動方法では、特定の通信装置１０１のＲＡＭ１０４のデータを、特定の通信装置１０１と他の通信装置１０１で共有する状態となる。
【００８７】
なお、図１０で示した第２の移動方法について、アクセスカウンタ１１３のカウント対象となるメモリは、ＲＡＭ１０４等の物理メモリの他に、通信用空間１００１も含む。具体的には、ＣＰＵ１０２＃１が通信用空間１００１＃１にアクセスした場合、ＣＰＵ１０２＃１は、アクセスカウンタ１１３＃１をインクリメントする。
【００８８】
第１の移動方法と第２の移動方法を比較すると、オーバーヘッドについては、第１の移動方法は、データのコピーに時間がかかることから、オーバーヘッドは大きい。第２の移動方法は、通信用空間１００１を確保し、変換テーブル９０２に書き換えれば済むため、オーバーヘッドは小さい。また、第１の移動方法と第２の移動方法の通信量について、第１の移動方法は、１度データコピーを行うと通信量は小さくなる。第２の移動方法は、アクセス要求のたびに通信が発生するため、通信量は大きくなる。
【００８９】
図１１は、第１負荷分散における移動対象プロセスの選択例を示す説明図である。図１１に示す通信システム１００は、無線通信によって接続されており、第１負荷分散を行っている。具体的には、通信装置１０１＃０は、プロセスＡ、プロセスＢを実行しており、通信装置１０１＃１は、プロセスＣを実行している。プロセスＡ〜プロセスＣのメモリ使用量は、プロセスＡ：３００［Ｋバイト］、プロセスＢ：２［Ｍバイト］、プロセスＣ：１［Ｍバイト］である。
【００９０】
また、ＣＰＵ１０２＃０にかけられる最大の負荷量を１００［％］とした場合に、ＣＰＵ１０２＃０の負荷量は、７０［％］であり、通信装置１０１＃０のバッテリ残量は、４０［％］である。同様に、ＣＰＵ１０２＃１の負荷量は、３０［％］であり、通信装置１０１＃０のバッテリ残量は、６０［％］である。また、無線通信の通信速度は、１０［Ｍｂｐｓ］である。
【００９１】
なお、ＣＰＵの負荷量の算出方法としては、ＣＰＵの単位時間あたりの実行時間の比率を負荷量として算出する。また、別の算出方法としては、ＣＰＵに割り当てられている処理数に基づいて、算出してもよい。または、ＣＰＵに割り当てられている処理に付与されている処理量情報の合計を、ＣＰＵの負荷量として算出してもよい。なお、処理量情報は、事前に各処理を計測しておく。
【００９２】
負荷バランスの目標値は、通信装置１０１間のバッテリ残量に基づいて算出してもよい。たとえば、通信システム１００は、通信装置１０１間のバッテリ残量が等しい場合、または、バッテリ残量を考慮しない場合、負荷バランスの目標値を１対１に設定する。具体的には、通信装置１０１＃０の負荷量が７０％、通信装置１０１＃１の負荷量が３０％であれば、通信システム１００は、負荷バランスの目標値を５０％：５０％に設定する。また、通信装置１０１間のバッテリ残量が６対４の比であれば、通信システム１００は、負荷バランスも６対４の比となるように負荷バランスの目標値を設定する。通信装置１０１ごとに基本となる消費電力が異なる場合、通信システム１００は、消費電力量比とバッテリ残量比から負荷バランスの目標値を設定する。
【００９３】
図１１の例では、通信装置１０１＃０のバッテリ残量が４０［％］、通信装置１０１＃１のバッテリ残量が６０［％］であるため、負荷バランスの目標値を通信装置１０１＃０＝４０［％］、通信装置１０１＃１＝６０［％］に設定する。負荷量の大きい通信装置１０１＃０の目標負荷量との差分は、７０［％］−４０［％］＝３０［％］となる。
【００９４】
続けて、通信装置１０１＃０は、実行中のプロセス群から移動対象プロセスを選択する。移動対象プロセスは、移動させることにより通信装置１０１＃０の負荷バランスが負荷バランスの目標値に近づき、かつ、目標負荷量との差分に対して移動コストが充分に小さい、といった条件を満たすプロセスとなる。ＣＰＵの負荷量は、ＣＰＵの単位時間あたりの実行時間の比率であるため、たとえば、通信装置１０１＃０は、負荷量の監視間隔に目標負荷量との差分をかけて得られる時間を移動時間の許容閾値として算出し、移動時間の許容閾値と移動コストを比較する。移動コストが小さければ移動にかける時間よりも負荷改善による稼働率向上の効果の方が大きくなる。
【００９５】
図１１の例では、負荷量の監視間隔が、１［秒］であると想定すると、移動時間の許容閾値は、１［秒］＊０．３＝３００［ミリ秒］となる。また、移動コストが小さくなるプロセスは、（１）式よりメモリ使用量の小さいプロセスであるから、図１１の例ではプロセスＡが移動コストの最も小さいプロセスになる。プロセスＡの移動コストは、（１）式より、３００［Ｋバイト］／１０［Ｍｂｐｓ］＝２４０［ミリ秒］となる。結果、３００≧２４０となるため、通信装置１０１＃０は、プロセスＡを移動対象プロセスに選択する。
【００９６】
図１２は、第２負荷分散における移動対象スレッドの選択例を示す説明図である。図１２に示す通信システム１００は、有線通信Ｉ／Ｆ１１０＃０、有線通信Ｉ／Ｆ１１０＃１によって接続されており、第２負荷分散を行っている。具体的には、通信装置１０１＃０は、プロセスＡ、プロセスＢ内のスレッドＢ−１、スレッドＢ−２を実行しており、通信装置１０１＃１は、プロセスＢ内のスレッドＢ−３と、プロセスＣを実行している。
【００９７】
また、プロセスＡ〜プロセスＣのメモリ使用量は、プロセスＡ：３００［Ｋバイト］、プロセスＢ：２［Ｍバイト］、プロセスＣ：１［Ｍバイト］である。また、スレッドのアクセス頻度については、負荷量の監視間隔にメモリにアクセスした回数とする。具体的には、プロセスＡ内のスレッドＡ−１：８＊１０＾５［回］、スレッドＡ−２：６＊１０＾６［回］、スレッドＢ−１：８＊１０＾６［回］、スレッドＢ−２：３＊１０＾５［回］である。同様に、スレッドＢ−３：４＊１０＾６［回］、スレッドＣ−１：２＊１０＾５［回］、スレッドＣ−２：２＊１０＾６［回］である。
【００９８】
また、ＣＰＵ１０２＃０の負荷量は、６５［％］であり、通信装置１０１＃０のバッテリ残量は、４０［％］である。同様に、ＣＰＵ１０２＃１の負荷量は、３５［％］であり、通信装置１０１＃０のバッテリ残量は、６０［％］である。また、有線通信の通信速度は、１００［Ｍｂｐｓ］である。また、通信装置１０１＃０のバッテリ残量が４０［％］、通信装置１０１＃１のバッテリ残量が６０［％］であるため、負荷バランスの目標値を通信装置１０１＃０＝４０［％］、通信装置１０１＃１＝６０［％］に設定する。負荷量の大きい通信装置１０１＃０の目標負荷量との差分は、６５［％］−４０［％］＝２５［％］となる。
【００９９】
続けて、通信装置１０１＃０は、実行中のスレッド群の中から移動対象スレッドを選択する。移動対象スレッドは、移動による負荷の増加も考慮して負荷バランスが目標値に近づくといった条件を満たすスレッドとなる。スレッドを通信装置１０１＃０から通信装置１０１＃１に移動すると、通信に伴う時間が増加する。したがって、通信装置１０１＃０は、負荷量の監視間隔に目標負荷量との差分をかけて得られる時間を移動時間の許容閾値として算出し、移動時間の許容閾値と、スレッドの処理時間およびスレッドの移動による通信増加時間の合計値である移動コストと、を比較する。移動コストが小さければ移動にかける時間よりも負荷改善による稼働率向上の効果の方が大きくなる。
【０１００】
また、スレッドの移動による通信増加時間の算出方法としては、下記（２）式で算出することができる。
【０１０１】
通信増加時間＝スレッドのアクセス頻度＊１回のアクセスのデータ量／通信速度  …（２）
【０１０２】
図１２の例にて、負荷量の監視間隔が、１［秒］であると想定すると、移動時間の許容閾値は、１［秒］＊０．２５＝２５０［ミリ秒］となる。また、通信増加時間が小さくなるスレッドは、（２）式より、スレッドのアクセス頻度が低いスレッドであるから、図１２の例では、スレッドＢ−２が通信増加時間の最も小さいスレッドになる。スレッドＢ−２の処理時間に関しては、スレッドＢ−２の負荷量が１０［％］であることから、ＣＰＵ１０２＃０は、スレッドＢ−２を負荷量の監視間隔の１０［％］となる１［秒］＊０．１＝１００［ミリ秒］実行していることになる。
【０１０３】
スレッドＢ−２の移動による通信増加時間に関しては、１回のアクセスのデータ量を３２［ビット］と想定すると、（２）式より、３＊１０＾５［回］＊３２／１００［Ｍｂｐｓ］＝９６［ミリ秒］と算出される。以上より、スレッドＢ−２の移動コストは、１００［ミリ秒］＋９６［ミリ秒］＝１９６［ミリ秒］となる。移動時間の許容閾値と移動コストを比較すると、２５０≧１９６となるため、通信装置１０１＃０は、スレッドＢ−２を移動対象スレッドに選択する。
【０１０４】
なお、負荷量の大きい通信装置１０１の実行するスレッド群に、他の通信装置１０１から移動してきたスレッドが存在する場合、通信装置１０１は、移動してきたスレッドのうち、アクセス頻度が最も高いスレッドを移動対象スレッドとして選択してもよい。移動してきたスレッドは通信に伴う負荷が常に発生しているため、移動してきたスレッドを移動元の通信装置１０１に戻すことで、通信装置１０１間の通信量が減少し、負荷量の大きい通信装置１０１の負荷量が減少する。さらに、通信装置１０１間の通信による負荷の分、通信システム１００全体の負荷量も減少することになる。
【０１０５】
図１３は、通信システム１００の機能を示すブロック図である。図１３では、ＯＳ２０３の機能と、負荷分散設定機能とを含めた機能を図示している。また、図１３では、通信装置１０１＃０の機能を図示しているが、通信装置１０１＃１も通信装置１０１＃０と等しい機能を含む。
【０１０６】
通信装置１０１＃０は、メモリ管理部１３０１、アクセス監視部１３０２、タスク管理部１３０３、負荷監視部１３０４、通信状態監視部１３０５、負荷分散設定部１３０６を含む。また、ＲＡＭ１０４＃０は、プロセス用データ領域１３０７と、ＯＳ用データ領域１３０８を格納している。また、タスク管理部１３０３内には、プロセス管理部１３０９、スレッド管理部１３１０が含まれる。負荷監視部１３０４内には、決定部４０１が含まれる。負荷分散設定部１３０６内には、選択部４０２、設定部４０３、プロセス移動部４０４、スレッド移動部４０５が含まれる。また、プロセス用データ領域１３０７内には、プロセス管理情報１３１１とスレッド管理情報１３１２とが含まれる。
【０１０７】
メモリ管理部１３０１は、プロセスが使用する領域を管理する機能を有する。たとえば、メモリ管理部１３０１は、新たにプロセスが生成された場合に、プロセス用データ領域１３０７をＲＡＭ１０４＃０上に確保する。また、メモリ管理部１３０１は、プロセスが確保したメモリサイズをメモリ使用量としてプロセス管理情報１３１１に設定する。
【０１０８】
アクセス監視部１３０２は、ＣＰＵ１０２＃０が搭載しているアクセスカウンタ１１３＃０を参照してスレッドのアクセス頻度を更新する。たとえば、アクセス監視部１３０２は、タイマー１０７＃０からの通知を受けた場合、アクセスカウンタ１１３＃０を参照して、ＣＰＵ１０２＃０が現在稼働中のスレッドに対応するスレッド管理情報１３１２のアクセス頻度を更新する。
【０１０９】
タスク管理部１３０３は、プロセスまたはスレッドをＣＰＵ１０２＃０に割り付けて実行させるという機能を有する。また、タスク管理部１３０３はＣＰＵ１０２＃０の稼働率と、稼働中のそれぞれのスレッドの実行時間の割合から、通信装置１０１＃０の負荷量と、それぞれのスレッドの負荷量を算出する。算出後、タスク管理部１３０３は、通信装置１０１＃０の負荷量をＲＡＭ１０４のＯＳ用データ領域１３０８内に、スレッドの負荷量をスレッド管理情報１３１２内に記録する。さらに、タスク管理部１３０３は、自身の負荷状況に応じて、たとえば負荷量が低ければ周波数と電圧を落とし、負荷量が高ければ周波数と電圧を上げるといった操作を電源管理機構１０９＃０を制御して行う。
【０１１０】
また、タスク管理部１３０３のプロセス管理部１３０９は、ＲＯＭ１０３からプロセス用データ領域１３０７にプロセスの実行イメージを展開する。また、プロセス管理部１３０９は、プロセス用データ領域１３０７内にプロセス管理情報１３１１を生成する。タスク管理部１３０３のスレッド管理部１３１０は、スレッドが生成された場合に、プロセス用データ領域１３０７内にスレッド管理情報１３１２を生成する。
【０１１１】
負荷監視部１３０４は、ＣＰＵ１０２＃０の負荷状況を監視する機能を有する。具体的には、負荷監視部１３０４は、自身の通信装置１０１の負荷量と他の通信装置１０１の負荷量とを取得して、自身の負荷量と最小負荷の通信装置１０１の負荷量差が所定値以上であれば、決定部４０１により負荷分散の実行を決定する。具体的に、決定部４０１は、負荷分散設定部１３０６に負荷分散を行うように指示を出す。または、負荷監視部１３０４は、自身の負荷量とバッテリ残量に基づいて、目標となる負荷量を設定し、負荷量差が所定値以上であるときに、負荷分散設定部１３０６に負荷分散の設定を行うように指示を出してもよい。通信装置１０１＃０の負荷量の取得に関して、負荷監視部１３０４は、タスク管理部１３０３より取得する。
【０１１２】
通信状態監視部１３０５は、現在の通信状態を監視する機能を有する。具体的には、通信状態監視部１３０５は、有線通信Ｉ／Ｆ１１０＃０から有線通信の切断または接続の通知を受け、負荷分散設定部１３０６に対して、現在の通信状態に適応した負荷分散の設定を行うように指示を出す。
【０１１３】
負荷分散設定部１３０６は、負荷分散の設定を行う機能を有する。具体的には、負荷分散設定部１３０６は、選択部４０２によって移動対象スレッドまたは移動対象プロセスを選択し、設定部４０３によって負荷分散の設定をする。移動対象プロセスが選択された場合、負荷分散設定部１３０６は、プロセス移動部４０４によって移動対象プロセスを移動することで、通信システム１００の負荷分散を第１負荷分散に設定する。移動対象スレッドが選択された場合、負荷分散設定部１３０６は、スレッド移動部４０５によって移動対象スレッドを移動することで、通信システム１００の負荷分散を第２負荷分散に設定する。
【０１１４】
プロセス用データ領域１３０７は、プロセスが実行中に使用するデータを記憶する領域である。プロセス用データ領域１３０７には、プロセス管理情報１３１１と、プロセスに含まれるスレッドの個数に等しい数分のスレッド管理情報１３１２とが含まれる。プロセス用データ領域１３０７の記憶内容については、図１４にて後述する。ＯＳ用データ領域１３０８は、通信装置１０１の状態を記憶する領域である。ＯＳ用データ領域１３０８についても、図１４にて後述する。
【０１１５】
図１４は、プロセス用データ領域１３０７とＯＳ用データ領域１３０８の記憶内容の一例を示す説明図である。プロセス用データ領域１３０７は、プロセス管理情報１３１１とスレッド管理情報１３１２とプログラムコード１４０１とデータ１４０２とを含む。
【０１１６】
プロセス管理情報１３１１は、プロセスＩＤ、割当ＣＰＵ、メモリ使用量、変換テーブル、という４つのフィールドを含む。プロセスＩＤフィールドには、該当のプロセスを一意に特定する情報が格納される。たとえば、プロセスＩＤフィールドは、プロセスの名称が格納されてもよいし、プロセス用データ領域１３０７が格納されたアドレスを示すポインタなどが格納されてもよい。割当ＣＰＵフィールドには、該当のプロセスが割り当てられたＣＰＵのＩＤが格納される。メモリ使用量フィールドには、ＲＡＭ１０４のうち、該当のプロセスが確保しているメモリサイズが格納される。変換テーブルフィールドには、ＭＭＵ９０１にてアクセスされる変換テーブル９０２へのポインタが格納される。
【０１１７】
たとえば、図１２のプロセスＢにおけるプロセス管理情報１３１１の各フィールドの格納値を例とすると、プロセスＩＤフィールドには、“プロセスＢ”というＩＤが格納される。割当ＣＰＵフィールドには、“ＣＰＵ１０２＃０”というＩＤが格納される。メモリ使用量フィールドには、２［Ｍバイト］という数値が格納される。変換テーブルフィールドには、変換テーブル９０２＃０へのポインタが格納されている。
【０１１８】
スレッド管理情報１３１２は、スレッドＩＤ、割当ＣＰＵ、アクセス頻度、優先度という４つのフィールドを含む。スレッドＩＤフィールドには、該当のスレッドを一意に特定する情報が格納される。割当ＣＰＵフィールドには、該当のスレッドが割り当てられたＣＰＵのＩＤが格納される。アクセス頻度フィールドには、該当のスレッドのＲＡＭ１０４へのアクセス頻度が格納される。優先度フィールドには、該当のスレッドの優先度が格納される。
【０１１９】
たとえば、図１２のスレッドＢ−２におけるスレッド管理情報１３１２の各フィールドの格納値を例とすると、スレッドＩＤフィールドには、“スレッドＢ−３”というＩＤが格納される。割当ＣＰＵフィールドには、“ＣＰＵ１０２＃１”というＩＤが格納される。アクセス頻度フィールドは、４＊１０＾６［回］という数値が格納される。優先度フィールドは、“低”という情報が格納される。
【０１２０】
また、プログラムコード１４０１は、該当のプロセスのプログラムソースを機械語に変換したデータである。なお、プログラムコード１４０１は図９で説明したコードセグメントに格納されている。データ１４０２は、該当のプロセス、または該当のプロセスに属するスレッドが使用しているデータである。なお、データ１４０２は、図９で説明したデータセグメント、ヒープセグメント、スタックセグメントに格納されている。
【０１２１】
ＯＳ用データ領域１３０８は、プロセスリスト１４０３とスレッドリスト１４０４と負荷量１４０５と通信状態１４０６とを含む。プロセスリスト１４０３は、自身のＣＰＵ１０２で実行しているプロセスのリストである。スレッドリスト１４０４は、自身のＣＰＵ１０２で実行しているスレッドのリストである。負荷量１４０５は、自身の通信装置１０１の負荷量である。通信状態１４０６は、自身の通信装置１０１と他の通信装置１０１との通信状態の情報が格納される。
【０１２２】
たとえば、図１２の通信装置１０１＃０におけるＯＳ用データ領域１３０８の各フィールドの値を例とすると、プロセスリストフィールドには、プロセスＡ、プロセスＢという２つのプロセスが含まれるリストが格納される。スレッドリストフィールドには、スレッドＡ−１、スレッドＡ−２、スレッドＢ−１、スレッドＢ−２という４つのスレッドが含まれるリストが格納される。負荷量フィールドには、６５［％］という数値が格納されている。通信状態フィールドには、有線接続状態を示す情報が格納されている。
【０１２３】
通信システム１００は、図１３で示した機能部と図１４で示したデータを用いて負荷分散の設定を行う。以下、図１５〜図２２では、図１３で示した機能部の処理のフローチャートを記述する。また、図１５〜図２２のフローチャートを実行するＣＰＵは、通信装置１０１＃０内のＣＰＵ１０２＃０を想定して説明するが、他の通信装置１０１内のＣＰＵ１０２も等しい処理を行う。
【０１２４】
図１５は、負荷監視部１３０４の処理を示すフローチャートである。ＣＰＵ１０２＃０は、タイマー１０７＃０からの通知、または有線接続通知を受信する（ステップＳ１５０１）。通知の受信後、ＣＰＵ１０２＃０は、タスク管理部１３０３から、自身の通信装置１０１の負荷量を取得する（ステップＳ１５０２）。負荷量の取得後、ＣＰＵ１０２＃０は、電源管理機構１０９から自身の通信装置１０１のバッテリ残量を取得する（ステップＳ１５０３）。バッテリ残量の取得後、ＣＰＵ１０２＃０は、他の通信装置１０１と通信して、他の通信装置１０１の負荷量とバッテリ残量とを取得する（ステップＳ１５０４）。
【０１２５】
他の通信装置１０１の負荷量とバッテリ残量とを取得後、ＣＰＵ１０２＃０は、自身の通信装置１０１の目標負荷量を算出する（ステップＳ１５０５）。なお、バッテリ残量に基づいた目標負荷量の算出方法として、ＣＰＵ１０２＃０は、たとえば、下記（３）式を実行する。
【０１２６】
目標負荷量＝（自身の通信装置１０１の負荷量＋他の通信装置１０１の負荷量）＊自身の通信装置１０１のバッテリ残量／（自身の通信装置１０１のバッテリ残量＋他の通信装置１０１のバッテリ残量）  …（３）
【０１２７】
目標負荷量の算出後、ＣＰＵ１０２＃０は、負荷量−目標負荷量が所定値以上か否かを判断する（ステップＳ１５０６）。負荷量−目標負荷量が所定値以上の場合（ステップＳ１５０６：Ｙｅｓ）、ＣＰＵ１０２＃０は、負荷量−目標負荷量を目標負荷量との差分として記録する（ステップＳ１５０７）。記録後、ＣＰＵ１０２＃０は、負荷分散設定部１３０６に負荷分散設定の開始を指示し（ステップＳ１５０８）、負荷監視部１３０４の処理を終了する。負荷量−目標負荷量が所定値より小さい場合（ステップＳ１５０６：Ｎｏ）、ＣＰＵ１０２＃０は、負荷監視部１３０４の処理を終了する。
【０１２８】
図１６は、アクセス監視部１３０２の処理を示すフローチャートである。ＣＰＵ１０２＃０は、タイマー１０７＃０からの通知を受信し（ステップＳ１６０１）、ＣＰＵ１０２＃０のアクセスカウンタ１１３＃０の値を取得する（ステップＳ１６０２）。値の取得後、ＣＰＵ１０２＃０は、アクセス頻度を算出する（ステップＳ１６０３）。アクセス頻度の算出方法として、たとえば、ＣＰＵ１０２＃０は、アクセス頻度＝（アクセスカウンタ１１３の値／タイマー１０７の通知間隔）を実行する。
【０１２９】
アクセス頻度の算出後、ＣＰＵ１０２＃０は、アクセスカウンタ１１３＃０をリセットする（ステップＳ１６０４）。リセット後、ＣＰＵ１０２＃０は、タスク管理部１３０３から現在稼働中のスレッドを取得する（ステップＳ１６０５）。取得後、ＣＰＵ１０２＃０は、取得したスレッドに対応するスレッド管理情報１３１２内のアクセス頻度を更新する（ステップＳ１６０６）。
【０１３０】
図１７は、通信状態監視部１３０５の処理を示すフローチャートである。ＣＰＵ１０２＃０は、有線切断通知、または有線接続通知を受信したかを判断する（ステップＳ１７０１）。通知を受けていない場合（ステップＳ１７０１：通知なし）、ＣＰＵ１０２＃０は、通知を受信するまで待機し（ステップＳ１７０２）、再びステップＳ１７０１の処理に移行する。
【０１３１】
有線切断通知を受信した場合（ステップＳ１７０１：有線切断通知を受信）、ＣＰＵ１０２＃０は、無線接続状態であることを記録する（ステップＳ１７０３）。記録後、ＣＰＵ１０２＃０は、負荷分散設定部１３０６に無線接続状態への変更を通知し（ステップＳ１７０４）、通信状態監視部１３０５の処理を終了する。なお、無線接続状態への変更を受けた負荷分散設定部１３０６は、第２負荷分散から第１負荷分散への切替処理を実行する。切替処理の詳細は、図２２にて後述する。
【０１３２】
有線接続通知を受信した場合（ステップＳ１７０１：有線接続通知を受信）、ＣＰＵ１０２＃０は、有線接続状態であることを記録し（ステップＳ１７０５）、通信状態監視部１３０５の処理を終了する。
【０１３３】
図１８は、負荷分散設定部１３０６による負荷分散設定処理を示すフローチャートである。ＣＰＵ１０２＃０は、負荷分散設定の開始指示を受信し、（ステップＳ１８０１）、通信状態監視部１３０５に通信状態を問い合わせる（ステップＳ１８０２）。問い合わせ後、ＣＰＵ１０２＃０は、通信状態が有線接続状態か否かを判断する（ステップＳ１８０３）。有線接続状態である場合（ステップＳ１８０３：Ｙｅｓ）、ＣＰＵ１０２＃０は、移動対象スレッド選択処理を実行し（ステップＳ１８０４）、負荷分散設定処理を終了する。なお、移動対象スレッド選択・移動処理の詳細は、図１９、図２０にて後述する。無線接続状態である場合（ステップＳ１８０３：Ｎｏ）、ＣＰＵ１０２＃０は、移動対象プロセス選択・移動処理を実行する（ステップＳ１８０５）。移動対象プロセス選択・移動処理の詳細は、図２１にて後述する。
【０１３４】
図１９は、負荷分散設定部１３０６による移動対象スレッド選択・移動処理を示すフローチャート（その１）である。図１９で示すフローチャートでは、過去に移動してきたスレッドを検索し、過去に移動してきたスレッドが存在する場合に、移動対象スレッドとして選択して移動を行う処理を示している。
【０１３５】
ＣＰＵ１０２＃０は、タスク管理部１３０３へ、自ＣＰＵに割り当てられている全スレッドを問い合わせる（ステップＳ１９０１）。なお、タスク管理部１３０３は、自ＣＰＵに割り当てられている全スレッドの情報が記載されたスレッドリスト１４０４を参照して、問い合わせに応答する。
【０１３６】
問い合わせた後、ＣＰＵ１０２＃０は、自ＣＰＵに割り当てられているスレッドから、未選択のスレッドを選択する（ステップＳ１９０２）。選択後、ＣＰＵ１０２＃０は、選択可能なスレッドが存在したか否かを判断する（ステップＳ１９０３）。選択可能なスレッドが存在した場合（ステップＳ１９０３：Ｙｅｓ）、ＣＰＵ１０２＃０は、選択されたスレッドが属するプロセス管理情報１３１１を取得する（ステップＳ１９０４）。取得後、ＣＰＵ１０２＃０は、選択されたスレッドが属するプロセスと選択されたスレッドの割当ＣＰＵを比較する（ステップＳ１９０５）。
【０１３７】
比較結果から、ＣＰＵ１０２＃０は、割当ＣＰＵが一致したかを判断する（ステップＳ１９０６）。割当ＣＰＵが一致しなかった場合（ステップＳ１９０６：Ｎｏ）、ＣＰＵ１０２＃０は、選択されたスレッドを移動してきたスレッドとして記録する（ステップＳ１９０７）。記録後、ＣＰＵ１０２＃０は、ステップＳ１９０２の処理に移行する。また、割当ＣＰＵが一致した場合（ステップＳ１９０６：Ｙｅｓ）、ＣＰＵ１０２＃０は、ステップＳ１９０２の処理に移行する。
【０１３８】
全スレッドを選択し終え、選択可能なスレッドが存在しなかった場合（ステップＳ１９０３：Ｎｏ）、ＣＰＵ１０２＃０は、移動してきたスレッドが存在するかを判断する（ステップＳ１９０８）。移動してきたスレッドが存在する場合（ステップＳ１９０８：Ｙｅｓ）、ＣＰＵ１０２＃０は、負荷監視部１３０４から目標負荷量との差分を取得する（ステップＳ１９０９）。取得後、ＣＰＵ１０２＃０は、目標負荷量との差分から負荷増加時間の許容閾値を算出する（ステップＳ１９１０）。
【０１３９】
算出後、ＣＰＵ１０２＃０は、移動してきたスレッドの中からアクセス頻度が最も高いスレッドを選択する（ステップＳ１９１１）。選択後、ＣＰＵ１０２＃０は、タスク管理部１３０３から選択されたスレッドの負荷量から選択されたスレッドの負荷量を取得する（ステップＳ１９１２）。取得後、ＣＰＵ１０２＃０は、取得した負荷量から選択されたスレッドの処理時間を算出する（ステップＳ１９１３）。算出後、ＣＰＵ１０２＃０は、移動コストをスレッドの処理時間に設定し（ステップＳ１９１４）、負荷増加時間の許容閾値が移動コスト以上か否かを判断する（ステップＳ１９１５）。
【０１４０】
負荷増加時間の許容閾値が移動コスト以上である場合（ステップＳ１９１５：Ｙｅｓ）、ＣＰＵ１０２＃０は、選択されたスレッドを移動対象スレッドに設定する（ステップＳ１９１８）。設定後、ＣＰＵ１０２＃０は、スレッド移動部４０５に移動対象スレッドの移動を指示し（ステップＳ１９１９）、移動対象スレッド選択・移動処理を終了する。
【０１４１】
なお、移動対象スレッドの移動方法については、過去に第２の移動方法により移動してきたスレッドを移動元のＣＰＵ１０２に戻す方法となる。このとき、移動元のＣＰＵ１０２には、移動してきたスレッドが属するプロセスの変換テーブル９０２が存在するため、変換テーブル９０２に関する処理は特に行わなくてよい。もし、移動してきたスレッドを戻すことにより、移動先のＣＰＵ１０２から移動してきたスレッドが属するプロセス内のスレッドが全く存在しなくなる場合、移動先のＲＡＭ１０４に存在するプロセスに対応する変換テーブル９０２を消去してもよい。
【０１４２】
負荷増加時間の許容閾値が移動コストより小さい場合（ステップＳ１９１５：Ｎｏ）、ＣＰＵ１０２＃０は、移動してきたスレッドの中から次にアクセス頻度の高いスレッドを選択する（ステップＳ１９１６）。選択後、ＣＰＵ１０２＃０は、選択可能なスレッドが存在したかを判断する（ステップＳ１９１７）。選択可能なスレッドが存在した場合（ステップＳ１９１７：Ｙｅｓ）、ＣＰＵ１０２＃０は、ステップＳ１９１２の処理に移行する。選択可能なスレッドが存在しなかった場合（ステップＳ１９１７：Ｎｏ）、または、移動してきたスレッドが存在しない場合（ステップＳ１９０８：Ｎｏ）、ＣＰＵ１０２＃０は、図２０で示すフローチャートに移行する。
【０１４３】
図２０は、負荷分散設定部１３０６による移動対象スレッド選択・移動処理を示すフローチャート（その２）である。図２０で示すフローチャートでは、過去に移動してきたスレッドが無い場合、現在実行中のスレッドの中から、移動対象スレッドを選択し、移動する処理を示している。
【０１４４】
ＣＰＵ１０２＃０は、負荷監視部１３０４から目標負荷量との差分を取得する（ステップＳ２００１）。取得後、ＣＰＵ１０２＃０は、目標負荷量との差分から負荷増加時間の許容閾値を算出する（ステップＳ２００２）。算出後、ＣＰＵ１０２＃０は、自ＣＰＵに割り当てられるスレッドの中からアクセス頻度の最も低いスレッドを選択する（ステップＳ２００３）。選択後、ＣＰＵ１０２＃０は、選択されたスレッドの移動による通信増加時間を算出する（ステップＳ２００４）。なお、通信増加時間の算出方法は、（２）式で算出することができる。
【０１４５】
算出後、ＣＰＵ１０２＃０は、タスク管理部１３０３から選択されたスレッドの負荷量を取得する（ステップＳ２００５）。取得後、ＣＰＵ１０２＃０は、取得した負荷量から選択されたスレッドの処理時間を算出する（ステップＳ２００６）。算出後、ＣＰＵ１０２＃０は、移動コストを、選択されたスレッドの処理時間および算出した通信増加時間の合計値に設定する（ステップＳ２００７）。
【０１４６】
移動コストを設定後、ＣＰＵ１０２＃０は、負荷増加時間の許容閾値が移動コスト以上であるかを判断する（ステップＳ２００８）。負荷増加時間の許容閾値が移動コスト以上である場合（ステップＳ２００８：Ｙｅｓ）、ＣＰＵ１０２＃０は、選択されたスレッドを移動対象スレッドに設定する（ステップＳ２００９）。続けて、ＣＰＵ１０２＃０は、スレッド移動部４０５に移動対象スレッドの移動を指示し（ステップＳ２０１０）、移動対象スレッド選択・移動処理を終了する。
【０１４７】
なお、移動対象スレッドの移動方法については、第２の移動方法によって移動先のＣＰＵ１０２に移動する。また、移動対象スレッドを移動する際、ＣＰＵ１０２＃０は、移動対象スレッドと同じプロセスに属する残余のスレッドの割当ＣＰＵを確認してもよい。確認した結果、残余のスレッドの割当ＣＰＵが全て移動先のＣＰＵ１０２となっていた場合、ＣＰＵ１０２＃０は、第１の移動方法によって、移動対象スレッドが属するプロセスを、移動先のＣＰＵ１０２に移動してもよい。
【０１４８】
負荷増加時間の許容閾値が移動コストより小さい場合（ステップＳ２００８：Ｎｏ）、ＣＰＵ１０２＃０は、次にアクセス頻度の低いスレッドを選択する（ステップＳ２０１１）。ＣＰＵ１０２＃０は、選択可能なスレッドが存在したかを判断する（ステップＳ２０１２）。選択可能なスレッドが存在した場合（ステップＳ２０１２：Ｙｅｓ）、ＣＰＵ１０２＃０は、ステップＳ２００４の処理に移行する。
【０１４９】
自ＣＰＵに割り当てられている全てのスレッドを選択し終え、選択可能なスレッドが存在しなかった場合（ステップＳ２０１２：Ｎｏ）、ＣＰＵ１０２＃０は、移動対象プロセス選択・移動処理を実行し（ステップＳ２０１３）、移動対象スレッド選択・移動処理を終了する。なお、ステップＳ２０１２：Ｎｏのルートでは、有線接続状態において、移動を行っても負荷を減少することができるスレッドが存在しなかったことを示している。
【０１５０】
図２１は、負荷分散設定部１３０６による移動対象プロセス選択・移動処理を示すフローチャートである。図２１に示すフローチャートは、移動対象プロセス選択・移動処理の有線接続状態で適切なスレッドが見つからなかった場合、または、無線接続状態の場合に実行される。
【０１５１】
ＣＰＵ１０２＃０は、負荷監視部１３０４から目標負荷量との差分を取得する（ステップＳ２１０１）。取得後、ＣＰＵ１０２＃０は、目標負荷量との差分から移動時間の許容閾値を算出する（ステップＳ２１０２）。算出後、ＣＰＵ１０２＃０は、タスク管理部１３０３から自ＣＰＵに割り当てられているプロセスを取得する（ステップＳ２１０３）。取得後、ＣＰＵ１０２＃０は、メモリ使用量が最も小さなプロセスを選択する（ステップＳ２１０４）。
【０１５２】
選択後、ＣＰＵ１０２＃０は、タスク管理部１３０３から選択されたプロセスに属する全スレッドの負荷量を取得する（ステップＳ２１０５）。取得後、ＣＰＵ１０２＃０は、全スレッドの負荷量を足したプロセスの総負荷量を算出する（ステップＳ２１０６）。算出後、ＣＰＵ１０２＃０は、目標負荷量との差分がプロセスの総負荷量以上か否かを判断する（ステップＳ２１０７）。目標負荷量との差分がプロセスの総負荷量以上である場合（ステップＳ２１０７：Ｙｅｓ）、ＣＰＵ１０２＃０は、メモリ使用量からプロセスの移動コストを算出する（ステップＳ２１０８）。なお、移動コストの算出方法は、（１）式で算出することができる。
【０１５３】
算出後、ＣＰＵ１０２＃０は、移動時間の許容閾値が移動コスト以上か否かを判断する（ステップＳ２１０９）。移動時間の許容閾値が移動コスト以上である場合（ステップＳ２１０９：Ｙｅｓ）、ＣＰＵ１０２＃０は、選択されたプロセスを移動対象プロセスに設定する（ステップＳ２１１０）。設定後、ＣＰＵ１０２＃０は、プロセス移動部４０４に移動対象プロセスの移動を指示し（ステップＳ２１１１）、移動対象プロセス選択・移動処理を終了する。なお、移動対象プロセスの移動方法については、第１の移動方法によって移動対象プロセスを移動する。
【０１５４】
目標負荷量との差分がプロセスの総負荷量より小さい場合（ステップＳ２１０７：Ｎｏ）、ＣＰＵ１０２＃０は、次にメモリ使用量が小さなプロセスを選択する（ステップＳ２１１２）。移動時間の許容閾値が移動コストより小さい場合も（ステップＳ２１０９：Ｎｏ）、ＣＰＵ１０２＃０は、ステップＳ２１１２の処理に移行する。ＣＰＵ１０２＃０は、選択可能なプロセスが存在したかを判断する（ステップＳ２１１３）。選択可能なプロセスが存在した場合（ステップＳ２１１３：Ｙｅｓ）、ＣＰＵ１０２＃０は、ステップＳ２１０５の処理に移行する。自ＣＰＵに割り当てられているプロセスを全て選択し終え、選択可能なプロセスが存在しなかった場合（ステップＳ２１１３：Ｎｏ）、ＣＰＵ１０２＃０は、移動対象プロセス選択・移動処理を終了する。
【０１５５】
図２２は、負荷分散設定部１３０６による、有線通信から無線通信に遷移した際の第２負荷分散から第１負荷分散への切替処理を示すフローチャートである。ＣＰＵ１０２＃０は、無線接続状態への変更通知を受信する（ステップＳ２２０１）。受信を契機に、ＣＰＵ１０２＃０は、タスク管理部１３０３へ自ＣＰＵに割り当てられている全スレッドを問い合わせる（ステップＳ２２０２）。問い合わせ後、ＣＰＵ１０２＃０は、自ＣＰＵに割り当てられたスレッドから未選択のスレッドを選択する（ステップＳ２２０３）。選択後、ＣＰＵ１０２＃０は、選択可能なスレッドが存在したかを判断する（ステップＳ２２０４）。
【０１５６】
選択可能なスレッドが存在した場合（ステップＳ２２０４：Ｙｅｓ）、ＣＰＵ１０２＃０は、選択されたスレッドが属するプロセス管理情報１３１１を取得する（ステップＳ２２０５）。取得後、選択されたスレッドが属するプロセスと選択されたスレッドの割当ＣＰＵを比較する（ステップＳ２２０６）。比較結果から、ＣＰＵ１０２＃０は、割当ＣＰＵが一致したかを判断する（ステップＳ２２０７）。割当ＣＰＵが一致しなかった場合（ステップＳ２２０７：Ｎｏ）、ＣＰＵ１０２＃０は、選択されたスレッドを移動対象スレッドに設定する（ステップＳ２２０８）。
【０１５７】
設定後、ＣＰＵ１０２＃０は、スレッド移動部４０５に、移動対象スレッドを移動対象スレッドが属するプロセスと同じＣＰＵに移動するように指示する（ステップＳ２２０９）。指示後、ＣＰＵ１０２＃０は、ステップＳ２２０３の処理に移行する。割当ＣＰＵが一致した場合（ステップＳ２２０７：Ｙｅｓ）、ＣＰＵ１０２＃０は、ステップＳ２２０３の処理に移行する。自ＣＰＵに割り当てているスレッドを全て選択し終え、選択可能なスレッドが存在しなかった場合（ステップＳ２２０４：Ｎｏ）、ＣＰＵ１０２＃０は、切替処理を終了する。
【０１５８】
図１５〜図２２のフローチャートでは、通信装置１０１が２つである場合を想定していた。もし通信装置１０１が３つ以上ある場合でも、負荷分散設定は１対１の通信装置１０１間で行われる。このとき、図１９と図２２でのフローチャートにて、移動してきたスレッドを戻す判定を、プロセスの割当先ＣＰＵをみて現在対象としている通信装置１０１から移動してきたスレッドに限定するように変更すれば対応することができる。具体的には、ステップＳ１９０１、ステップＳ２２０２の処理にて、「全スレッドを問い合わせる」処理を、「プロセスの割当ＣＰＵが負荷分散設定を行っているＣＰＵとなるスレッドを問い合わせる」処理に置き換える。
【０１５９】
また、通信装置１０１が３つ以上ある場合の負荷監視部１３０４は、後述する図２３のように、複数ある通信装置１０１から負荷分散設定を行う通信装置１０１を決定する処理が追加される。図２３で示すフローチャートでは、バッテリ残量が多い通信装置１０１を、優先的に負荷分散設定を行う対象とするような処理となっている。
【０１６０】
図２３は、通信装置１０１が３つ以上ある場合の負荷監視部１３０４の処理を示すフローチャートである。図２３のフローチャートを実行するＣＰＵは、通信装置１０１＃０内のＣＰＵ１０２＃０を想定して説明するが、他の通信装置１０１内のＣＰＵ１０２も等しい処理を行う。また、図２３におけるステップＳ２３０１〜ステップＳ２３０３は、ステップＳ１５０１〜ステップＳ１５０３と等しい処理を行うため、説明を省略する。
【０１６１】
ステップＳ２３０３の処理終了後、ＣＰＵ１０２＃０は、他の全通信装置１０１と通信して、他の通信装置１０１の負荷量とバッテリ残量を取得する（ステップＳ２３０４）。取得後、ＣＰＵ１０２＃０は、バッテリ残量が最も多いＣＰＵを選択する（ステップＳ２３０５）。ステップＳ２３０５の処理にて選択されたＣＰＵが、負荷分散設定を行う対象の通信装置１０１の候補となる。選択後、ＣＰＵ１０２＃０は、自ＣＰＵの目標負荷量を算出する（ステップＳ２３０６）。算出後、ＣＰＵ１０２＃０は、負荷量−目標負荷量が所定値以上か否かを判断する（ステップＳ２３０７）。
【０１６２】
負荷量−目標負荷量が所定値以上である場合（ステップＳ２３０７：Ｙｅｓ）、ＣＰＵ１０２＃０は、選択された通信装置１０１が移動処理中かを判断する（ステップＳ２３０８）。移動処理中である場合（ステップＳ２３０８：Ｙｅｓ）、ＣＰＵ１０２＃０は、移動処理が終了するまで待機し（ステップＳ２３０９）、移動処理の完了後、ステップＳ２３０４の処理に移行する。移動が完了すると、負荷量が変化するため、ＣＰＵ１０２＃０は、ステップＳ２３０４を実行することで、再度移動による負荷量の変化を確認して、対象の通信装置１０１を決定することになる。
【０１６３】
移動処理中でない場合（ステップＳ２３０８：Ｎｏ）、ＣＰＵ１０２＃０は、負荷量−目標負荷量の値を目標負荷量との差分として記録する（ステップＳ２３１０）。記録後、ＣＰＵ１０２＃０は、負荷分散設定部１３０６に負荷分散設定の開始を指示し（ステップＳ２３１１）、負荷監視部１３０４の処理を終了する。負荷量−目標負荷量が所定値より小さい場合（ステップＳ２３０７：Ｎｏ）、ＣＰＵ１０２＃０は、次にバッテリ残量が多い通信装置１０１を選択する（ステップＳ２３１２）。
【０１６４】
選択後、ＣＰＵ１０２＃０は、選択可能な通信装置１０１が存在したかを判断する（ステップＳ２３１３）。選択可能な通信装置１０１が存在した場合（ステップＳ２３１３：Ｙｅｓ）、ＣＰＵ１０２＃０は、ステップＳ２３０６の処理に移行する。全ての通信装置１０１を選択し終え、選択可能な通信装置１０１が存在しなかった場合（ステップＳ２３１３：Ｎｏ）、ＣＰＵ１０２＃０は、負荷監視部１３０４の処理を終了する。
【０１６５】
以上説明したように、実施の形態１にかかる通信装置、負荷分散方法、および記録媒体によれば、通信システムの通信状態に応じて、無線接続状態には第１負荷分散を行い、高速な有線接続状態には通信量が大きいが装置の負荷がより均等になる第２負荷分散を行う。これにより、通信システムは、通信状態に適した負荷分散を行うことで、処理効率を向上することができる。また、通信システム内の負荷バランスを均等に近づけることで、消費電力を削減することができる。
【０１６６】
また、通信システムは、第１負荷分散において、第１通信装置のＣＰＵが実行するプロセスのプログラムコードおよびデータを第２通信装置に転送してもよい。これにより、通信システムは、プロセス単位の移動が行えるため、プロセス単位での負荷分散を実現することができる。
【０１６７】
また、通信システムは、第２負荷分散において、第１通信装置のＣＰＵが実行するプロセスに含まれるスレッドを第２通信装置に転送してもよい。これにより、通信システムは、スレッド単位の移動が行えるため、スレッド単位での負荷分散を実現することができる。
【０１６８】
また、通信システムは、第１通信装置の負荷量と第２通信装置の負荷量の差分が所定値以上であるときに、負荷分散を実行することを決定してもよい。これにより、通信システムは、負荷分散の実行が過剰に行われることを防ぐことができる。
【０１６９】
また、通信システムは、タイマーからの通知に基づいて、負荷分散を実行するか否かを決定してもよい。これにより、通信システムは、周期的に負荷分散を実行でき、負荷分散の実行が過剰に行われることを防ぐことができる。
【０１７０】
また、通信システムは、第１通信装置のメモリから第２通信装置のメモリへの転送時間に基づいて、第２通信装置に移動する移動対象プロセスを選択してもよい。プロセスの中には、負荷量が小さくても、メモリ使用量が大きいプロセスも存在しており、このようなプロセスが移動すると移動コストが大きくなり、通信システムの処理効率が低下する。したがって、メモリの転送時間に基づいて移動対象プロセスを決定することにより、通信システムは、移動に伴う負荷量を最小にしつつ、負荷バランスをよくし、消費電力を削減することができる。
【０１７１】
また、通信システムは、第１通信装置のメモリへのアクセス頻度または過去のスレッドの転送履歴に基づいて、第２通信装置に移動する移動対象スレッドを選択してもよい。スレッド単位の負荷分散は通信量が増大するため、通信量が最小となる移動対象スレッドを選択することで、移動に伴う負荷量を最小にしつつ、負荷バランスをよくすることができる。
【０１７２】
また、負荷量が大きくなった通信装置に過去に他の通信装置から移動してきたスレッドがある場合、移動してきたスレッドを戻すことで、通信装置間の通信量が減少する。したがって、通信システムは、過去に移動してきたスレッドを戻すことで、負荷量を減少しつつ、負荷バランスをよくすることができる。
【０１７３】
（実施の形態２の概要説明）
実施の形態１にかかるプロセス移動部４０４では、プロセス用データ領域１３０７全体を、移動元のＲＡＭ１０４から移動先のＲＡＭ１０４にコピーしていた。しかしながら、プロセス用データ領域１３０７の一部のデータに関して、移動先のＣＰＵ１０２が、移動先の記憶領域に同じデータを保有している場合も存在する。この場合、プロセス用データ領域１３０７のうち、移動先のＣＰＵ１０２にて既に保有しているデータについてはコピーしないようにすることで、プロセス移動処理に伴う通信量を削減することができる。以下、図２４〜図２６を参照して、実施の形態２にかかるプロセス移動部４０４の動作について説明を行う。
【０１７４】
また、実施の形態２にかかる通信システム１００のハードウェアは、実施の形態１にかかる通信システム１００のハードウェアと等しく、実施の形態２にかかる通信システム１００の機能は、実施の形態１にかかる通信システム１００の機能とほぼ等しい。以下、実施の形態１と異なる機能を有するプロセス移動部４０４の動作について説明を行う。
【０１７５】
図２４は、実施の形態２における移動対象プロセスの移動における動作を示す説明図である。図２４で示す通信システム１００は、通信装置１０１＃０で実行中である移動対象プロセスを、通信装置１０１＃１に移動させる場合を想定している。
【０１７６】
ＲＯＭ１０３＃０には、移動対象プロセスの生成元となる実行オブジェクト２４０１＃０が格納されている。実行オブジェクト２４０１＃０には、プログラムコード２４０２＃０、初期値データ２４０３＃０、識別情報２４０４＃０が格納されている。プログラムコード２４０２＃０は、移動対象プロセスのプログラムソースを機械語に変換したデータである。初期値データ２４０３＃０は、移動対象プロセス、または移動対象プロセスに属するスレッドが使用するデータの初期値である。また、図２４では、実行オブジェクト２４０１＃０と同一の実行オブジェクトである実行オブジェクト２４０１＃１がＲＯＭ１０３＃１に格納されていることを想定する。
【０１７７】
識別情報２４０４＃０は、実行オブジェクト２４０１を一意に特定する情報である。移動対象プロセスのプログラムソースが設計者などによって変更された後、ビルドツールが再度ビルドし、実行オブジェクト２４０１が再生成された場合、識別情報２４０４＃０は、プログラムソース変更前の値とは異なる値となるように設定される。これにより、識別情報２４０４が等しい実行オブジェクト２４０１は、内容が同一であると保証でき、実施の形態２の特徴である同じデータを保持しているか否かが判定できるようになる。
【０１７８】
なお、識別情報２４０４の具体例としては、実行オブジェクト２４０１の名称と、ビルドするたびに値がインクリメントされるようなＩＤと、を結合したデータであってもよい。また別の具体例として、識別情報２４０４は、移動対象プロセスの名称と、プログラムコード２４０２および初期値データ２４０３から生成されるハッシュ値と、を結合したデータであってもよい。
【０１７９】
なお、ハッシュ値が結合される例である場合に、通信装置１０１が、識別情報２４０４が存在しない実行オブジェクト２４０１を無線通信Ｉ／Ｆ１１１等によってダウンロードした状態を想定する。このとき、通信装置１０１は、ダウンロードした実行オブジェクト２４０１を参照してハッシュ値を生成し、識別情報２４０４を生成してもよい。これにより、識別情報２４０４が存在しなかった実行オブジェクト２４０１であっても、通信システム１００は実施の形態２による通信量の削減を適用できるようになる。
【０１８０】
通信装置１０１＃０は、実行オブジェクト２４０１＃０を移動対象プロセス起動時にロードし、ＲＡＭ１０４＃０にプロセス用データ領域２４０５＃０を展開する。プロセス用データ領域２４０５＃０には、プログラムコード２４０６＃０、データ２４０７＃０、識別情報２４０８＃０が格納されている。なお、図２４では図示していないが、図１３、図１４で説明したプロセス管理情報１３１１、スレッド管理情報１３１２も、プロセス用データ領域２４０５＃０に存在する。
【０１８１】
プログラムコード２４０６＃０と識別情報２４０８＃０は、それぞれ、プログラムコード２４０２＃０と識別情報２４０４＃０と同一の内容が展開されている。データ２４０７＃０は、初期値データ２４０３＃０と同一の内容が展開された後、移動対象プロセスに伴って内容の更新・追加が行われる。
【０１８２】
移動対象プロセスの移動指示が発生した場合、プログラムコード２４０６＃０については、移動対象プロセスの実行中に変更されることが無いため、通信装置１０１＃０は、通信装置１０１＃０にプログラムコード２４０６＃０を送信しなくてよい。データ２４０７＃０については、移動対象プロセスの実行中に変更されることがあるため、通信装置１０１＃０は、データ２４０７＃０と初期値データ２４０３＃０との差分を生成する。差分生成後、通信装置１０１＃０は、通信装置１０１＃１に差分を送信する。
【０１８３】
通信装置１０１＃１に実行オブジェクト２４０１＃０と等しい実行オブジェクト２４０１＃１が存在するか否かの判断方法については、初めに、通信装置１０１＃０が識別情報２４０８＃０を通信装置１０１＃１に通知する。次に、通信装置１０１＃１が、識別情報２４０８＃０と一致する識別情報２４０８＃１を含む実行オブジェクト２４０１＃１が存在するかを検索することで、等しい実行オブジェクト２４０１＃１が存在するかを判断することができる。
【０１８４】
差分を受信する通信装置１０１＃１は、ＲＯＭ１０３＃１に格納されている実行オブジェクト２４０１＃１をあらかじめＲＡＭ１０４＃１に展開しておく。差分を受信後、通信装置１０１＃１は、差分をデータ２４０７＃１に適用する。
【０１８５】
以下、図２５、図２６に示すフローチャートにて、移動元および移動先の通信装置１０１のプロセス移動部４０４の処理を示す。図２５、図２６に示すフローチャートでは、移動元の通信装置１０１を通信装置１０１＃０と想定し、移動先の通信装置１０１を通信装置１０１＃１と想定して説明を行う。また、通信システム１００の運用中にて、通信装置１０１＃１が移動元の通信装置１０１、通信装置１０１＃０が移動先の通信装置１０１となってもよい。
【０１８６】
図２５は、実施の形態２における移動元の通信装置１０１＃０でのプロセス移動部４０４の移動元処理を示すフローチャートである。ＣＰＵ１０２＃０は、ＲＡＭ１０４＃０から移動対象プロセスの識別情報２４０８＃０を取得する（ステップＳ２５０１）。取得後、ＣＰＵ１０２＃０は、通信装置１０１＃１に識別情報２４０８＃０を通知し、実行オブジェクト２４０１＃０と同一の実行オブジェクト２４０１＃１が存在するかを問い合わせる（ステップＳ２５０２）。問い合わせの応答結果によって、ＣＰＵ１０２＃０は、移動先の通信装置１０１＃１に実行オブジェクト２４０１＃１が存在したかを判断する（ステップＳ２５０３）。
【０１８７】
実行オブジェクト２４０１＃１が存在した場合（ステップＳ２５０３：Ｙｅｓ）、ＣＰＵ１０２＃０は、移動元の通信装置１０１＃０に、実行オブジェクト２４０１＃０が存在するかを判断する（ステップＳ２５０４）。実行オブジェクト２４０１＃０が存在する場合（ステップＳ２５０４：Ｙｅｓ）、ＣＰＵ１０２＃０は、実行オブジェクト２４０１＃０の初期値データ２４０３＃０とデータ２４０７＃０を比較して差分情報を生成する（ステップＳ２５０５）。差分情報を生成後、ＣＰＵ１０２＃０は、差分情報と識別情報２４０８＃０とプロセス管理情報１３１１＃０とスレッド管理情報１３１２＃０とを、移動情報として設定する（ステップＳ２５０６）。
【０１８８】
実行オブジェクト２４０１＃０が存在しない場合（ステップＳ２５０４：Ｎｏ）、ＣＰＵ１０２＃０は、データ２４０７＃０と識別情報２４０８＃０とプロセス管理情報１３１１＃０とスレッド管理情報１３１２＃０と、を移動情報として設定する（ステップＳ２５０７）。なお、実行オブジェクト２４０１＃０が存在しない状態となる具体例としては、移動対象プロセスが一旦移動した際に再度移動元の通信装置１０１に戻る場合、または、実行オブジェクトをロードした後に対応する実行オブジェクトが更新された場合等である。
【０１８９】
同一の実行オブジェクトが存在しなかった場合（ステップＳ２５０３：Ｎｏ）、ＣＰＵ１０２＃０は、プロセス用データ領域２４０５＃０全体を移動情報として設定する（ステップＳ２５０８）。ステップＳ２５０６、ステップＳ２５０７、ステップＳ２５０８の終了後、ＣＰＵ１０２＃０は、移動先の通信装置１０１＃１に設定された移動情報を送信し（ステップＳ２５０９）、送信後、ＣＰＵ１０２＃０は、プロセス移動部４０４の移動元処理を終了する。
【０１９０】
なお、図２５のフローチャートを適用することにより、通信量が減少するため、図２１のステップＳ２１０８の処理で実行される移動コストの算出方法を、メモリ使用量に基づく算出方法から、実際に送信するデータ量に基づく算出方法に変更してもよい。
【０１９１】
図２６は、実施の形態２における移動先の通信装置１０１＃１でのプロセス移動部４０４の移動先処理を示すフローチャートである。ＣＰＵ１０２＃１は、移動情報を受信する（ステップＳ２６０１）。受信後、ＣＰＵ１０２＃１は、移動情報がプロセス用データ領域２４０５＃０全体かを判断する（ステップＳ２６０２）。移動情報がプロセス用データ領域２４０５＃０全体である場合（ステップＳ２６０２：Ｙｅｓ）、ＣＰＵ１０２＃１は、移動情報をプロセス用データ領域２４０５＃１としてＲＡＭ１０４＃１に展開する（ステップＳ２６０３）。
【０１９２】
展開後、ＣＰＵ１０２＃１は、展開されたプロセス管理情報１３１１＃１とスレッド管理情報１３１２＃１に基づいて、移動対象プロセスと移動対象プロセスに含まれるスレッドをＯＳ２０３＃１に登録する（ステップＳ２６０８）。登録後、ＣＰＵ１０２＃１は、プロセス移動部４０４の移動先処理を終了する。
【０１９３】
移動情報がプロセス用データ領域２４０５全体でない場合（ステップＳ２６０２：Ｎｏ）、ＣＰＵ１０２＃１は、識別情報２４０８＃０に対応する実行オブジェクト２４０１＃１をＲＡＭ１０４＃１に展開する（ステップＳ２６０４）。なお、ステップＳ２６０４の処理について、ＣＰＵ１０２＃１は、ステップＳ２６０１の処理による受信を待たず、移動元の通信装置１０１＃０からの問い合わせを受けた直後に、事前に実行しておいてもよい。展開後、ＣＰＵ１０２＃１は、移動情報に差分情報が含まれているか否かを判断する（ステップＳ２６０５）。
【０１９４】
差分情報が含まれていない場合（ステップＳ２６０５：Ｎｏ）、ＣＰＵ１０２＃１は、受信したデータ２４０７＃０を、データ２４０７＃１へ上書きし（ステップＳ２６０６）、ステップＳ２６０８の処理に移行する。差分情報が含まれている場合（ステップＳ２６０５：Ｙｅｓ）、ＣＰＵ１０２＃１は、受信した差分情報をデータ２４０７＃１に適用し（ステップＳ２６０７）、ステップＳ２６０８の処理に移行する。
【０１９５】
以上説明したように、実施の形態２にかかる通信装置、負荷分散方法、および記録媒体によれば、プロセスを移動する際に、移動先の通信装置に実行オブジェクトが存在する場合、プログラムコードを除いたデータを送信する。これにより、通信システムは、負荷分散の実行に伴う通信量を減少させることができ、処理効率を高めることができる。
【０１９６】
また、通信システムは、移動元の通信装置に実行オブジェクトが存在する場合、データ部分の差分を生成し、差分を移動先の通信装置に送信してもよい。これにより、通信システムは、負荷分散の実行に伴う通信量をさらに減少させることができ、処理効率を高めることができる。
【０１９７】
（実施の形態３の概要説明）
実施の形態２にかかる通信システム１００では、識別情報２４０８を用いて移動先の通信装置１０１に実行オブジェクト２４０１が存在するかを判断し、判断結果に基づいて実行オブジェクトの差分をコピーしていた。しかしながら、差分を取るのに時間がかかるため、通信装置１０１間の通信速度が十分に速い場合は差分を取らずに全データをコピーした方が効率がよくなる場合がある。したがって、実施の形態３にかかる通信システム１００では、実施の形態２におけるプロセス移動部４０４の移動元処理にて、コピー内容となる移動情報を設定する際に通信状態を確認する。
【０１９８】
通信状態が有線接続状態の場合、通信システム１００は、プログラムコード２４０６のコピーは行わないようにし、データ２４０７は差分を取らずに全てコピーする。通信状態が無線接続状態の場合、通信システム１００は、データ２４０７の差分を取りコピーを行う。以下、図２７を参照して、実施の形態３にかかるプロセス移動部４０４の動作について説明を行う。また、実施の形態３にかかる通信システム１００のハードウェアは、実施の形態２にかかる通信システム１００のハードウェアと等しく、実施の形態３にかかる通信システム１００の機能は、実施の形態２にかかる通信システム１００の機能とほぼ等しい。以下、実施の形態２と異なる機能を有するプロセス移動部４０４の移動元の処理について説明を行う。
【０１９９】
図２７は、実施の形態３における移動元の通信装置１０１＃０でのプロセス移動部４０４の移動元処理を示すフローチャートである。図２７に示すフローチャートでも、図２５に示したフローチャートと同様に、移動元の通信装置１０１を通信装置１０１＃０と想定し、移動先の通信装置１０１を通信装置１０１＃１と想定して説明を行う。また、図２７で示すステップＳ２７０１〜ステップＳ２７０４、ステップＳ２７０６〜ステップＳ２７１０の各処理は、ステップＳ２５０１〜ステップＳ２５０４、ステップＳ２５０５〜ステップＳ２５０９の各処理と等しいため、説明を省略する。
【０２００】
ステップＳ２７０４の処理後、ＣＰＵ１０２＃０は、通信状態が無線接続状態か否かを判断する（ステップＳ２７０５）。通信状態が無線接続状態である場合（ステップＳ２７０５：Ｙｅｓ）、ＣＰＵ１０２＃０は、ステップＳ２７０６の処理に移行する。通信状態が有線接続状態である場合（ステップＳ２７０５：Ｎｏ）、ＣＰＵ１０２＃０は、ステップＳ２７０８の処理に移行する。
【０２０１】
以上説明したように、実施の形態３にかかる通信装置、負荷分散方法、および記録媒体によれば、プロセス移動時に、有線接続状態であればデータの差分を生成せず、そのままデータを移動先の通信装置に転送する。これにより、通信システムは、高速な有線接続を活用して差分の生成に伴う時間を省くことができ、処理効率をさらに高めることができる。
【０２０２】
また、実施の形態１〜実施の形態３にかかる通信システム１００は、通信状態が有線接続状態と無線接続状態という２つの状態を前提として説明を行っていた。また、図１８において、通信状態が無線接続状態の場合スレッド単位の負荷分散を検討しない理由は、無線接続状態で図１９、図２０のフローチャートを実行しても、移動コストが非常に大きくなり、負荷バランスが向上するスレッドが存在しないためである。したがって、通信速度の異なる３つ以上の状態が存在する場合、低速の通信速度の状態に関しては、図１９、図２０のフローチャートを実行しないようにしてもよい。または、どの通信速度であっても図１９、図２０のフローチャートを実行するようにしておいてもよい。
【０２０３】
また、通信速度が遅い方に変化した場合、通信システム１００は、一旦移動してきたスレッドを移動元の通信装置１０１に戻して再度負荷分散を検討する。通信速度が速い方に変化した場合、通信システム１００は、移動してきたスレッドをそのままの状態にして、再度負荷分散を検討する。
【０２０４】
なお、本実施の形態で説明した負荷分散方法は、あらかじめ用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。負荷分散方法を実行するプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ、半導体メモリ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また負荷分散方法を実行するプログラムは、インターネット等のネットワークを介して配布してもよい。
【符号の説明】
【０２０５】
１００  通信システム
１０１  通信装置
１０２  ＣＰＵ
１０７  タイマー
１１０  有線通信Ｉ／Ｆ
１１１  無線通信Ｉ／Ｆ
１１２  バス
４０１  決定部
４０２  選択部
４０３  設定部
４０４  プロセス移動部
４０５  スレッド移動部
【図１】
2012066633.tif 000003
【図２】
2012066633.tif 000004
【図３】
2012066633.tif 000005
【図４】
2012066633.tif 000006
【図５】
2012066633.tif 000007
【図６】
2012066633.tif 000008
【図７】
2012066633.tif 000009
【図８】
2012066633.tif 000010
【図９】
2012066633.tif 000011
【図１０】
2012066633.tif 000012
【図１１】
2012066633.tif 000013
【図１２】
2012066633.tif 000014
【図１３】
2012066633.tif 000015
【図１４】
2012066633.tif 000016
【図１５】
2012066633.tif 000017
【図１６】
2012066633.tif 000018
【図１７】
2012066633.tif 000019
【図１８】
2012066633.tif 000020
【図１９】
2012066633.tif 000021
【図２０】
2012066633.tif 000022
【図２１】
2012066633.tif 000023
【図２２】
2012066633.tif 000024
【図２３】
2012066633.tif 000025
【図２４】
2012066633.tif 000026
【図２５】
2012066633.tif 000027
【図２６】
2012066633.tif 000028
【図２７】
2012066633.tif 000029
【国際調査報告】
2012066633.tif 000030
2012066633.tif 000031
2012066633.tif 000032
2012066633.tif 000033