(57)【要約】【課題】複数のオブジェクトが非同期メッセージによって連携した処理を行うシステムにおいて、システムの処理効率の低下をできるだけ抑えつつ、処理順序を保障する。【解決手段】アプリケーションオブジェクト１００は、非同期メッセージを発行することにより、オブジェクト１０に処理要求を行う。メッセージ受信部１２は、非同期メッセージを受信して、順にキュー１３に登録する。メッセージディスパッチャ１４は、非同期メッセージで依頼された処理の実行中でない場合に、キュー１３に登録された順に非同期メッセージを取り出し、非同期メッセージで依頼された処理の実行中である場合には、処理の終了を待ち、処理終了後にキュー１３から非同期メッセージを取り出す。オブジェクト１０は、非同期メッセージにしたがってシングルスレッドで処理を実行する。メッセージ制御装置は、オブジェクト１０，２０，３０毎に設けられている。【選択図】図１
2008027344.tif 000002
【特許請求の範囲】
【請求項１】
複数のオブジェクトが非同期メッセージによって連携した処理を行うシステムにおけるオブジェクト間の非同期メッセージを管理する非同期メッセージ管理方式であって、
各オブジェクトに対応して、
そのオブジェクトを宛先とするメッセージが格納されるキューと、
前記キューに非同期メッセージのみを登録する非同期メッセージ登録手段と、
非同期メッセージで要求された処理をシングルスレッドでオブジェクトに実行させるシングルスレッド制約手段とが設けられている
ことを特徴とするオブジェクト間の非同期メッセージ管理方式。
【請求項２】
シングルスレッド制約手段は、キューに非同期メッセージが登録されている場合に、オブジェクトの処理が完了していることを条件に、前記キューから非同期メッセージを取り出す
請求項１記載のオブジェクト間の非同期メッセージ管理方式。
【請求項３】
シングルスレッド制約手段は、オブジェクトの処理が完了していることを条件にキューから非同期メッセージを取り出す処理を連続的に実行する
請求項２記載のオブジェクト間の非同期メッセージ管理方式。
【請求項４】
複数のオブジェクトが非同期メッセージによって連携した処理を行うシステムにおけるオブジェクト間の非同期メッセージを管理する非同期メッセージ管理方法であって、
各オブジェクトに対応して、そのオブジェクトを宛先とするメッセージが格納されるキューを設定し、
各オブジェクトに対応して、前記キューに非同期メッセージのみを登録し、
非同期メッセージで要求された処理をシングルスレッドでオブジェクトに実行させる
ことを特徴とするオブジェクト間の非同期メッセージ管理方法。
【請求項５】
キューに非同期メッセージが登録されている場合に、オブジェクトの処理が完了していることを条件に、前記キューから非同期メッセージを取り出す処理を連続的に実行する
請求項４記載のオブジェクト間の非同期メッセージ管理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のオブジェクトが非同期メッセージによって連携した処理を行うシステムにおけるオブジェクト間の非同期メッセージを管理する非同期メッセージ管理方式および非同期メッセージ管理方法に関する。
【背景技術】
【０００２】
ソフトウェアの設計や開発における考え方の１つとして、オブジェクト指向プログラミングが知られている。オブジェクト指向プログラミングでは、プログラムコードとそれに付随するデータとを１つのオブジェクトとして管理する。オブジェクト指向によるアプリケーションプログラムにおいては、アプリケーションプログラム自体がオブジェクトとして管理される。また、例えば、あるオブジェクトＡが他のオブジェクトＢに処理を依頼する場合、オブジェクトＡのプログラムコードに、オブジェクトＢに処理を依頼する形でプログラムが記載される。オブジェクト指向の概念において、オブジェクトＡがオブジェクトＢに処理を依頼することや、オブジェクトＢが処理結果をオブジェクトＡに返すことは、「メッセージ通信」と表現される。「メッセージ」は、相手方のオブジェクトを特定可能な情報や、メッセージ種別等を含む情報である。
【０００３】
オブジェクト間のメッセージ通信には、同期式と非同期式とがある。同期式は、オブジェクトＡがオブジェクトＢに同期メッセージを送信した場合に、オブジェクトＡが、オブジェクトＢがメッセージに応じた処理を終了するまで待つ方式である。非同期式は、オブジェクトＡがオブジェクトＢに非同期メッセージを送信した後、オブジェクトＢからの応答を待たずに、オブジェクトＡが処理を継続する方式である。
【０００４】
非同期メッセージ通信方式として、メッセージを格納する１つのキューに、メッセージ送信元のオブジェクトからの非同期メッセージが格納され、メッセージディスパッチャと呼ばれるプログラムが宛先のオブジェクトに非同期メッセージを振り分ける方式がある。非同期メッセージを受信したオブジェクトは、非同期メッセージに応じた処理を実行する。
【０００５】
また、１つのプロセスに複数のオブジェクトが設けられ、各オブジェクトの処理が、１つ以上のプログラム単位（スレッド）で実現されるように構成されることがある。オブジェクトの処理において１つのスレッドのみが動作しうる動作環境がシングルスレッドであり、オブジェクトの処理において複数のスレッドが動作しうる動作環境がマルチスレッドである。
【０００６】
図３および図４は、オブジェクトＡ，Ｂが連携して処理を行う様子を示すシーケンス図である。オブジェクトＡ，Ｂ間の連携を目的とし、それを実現するための手段としてキューとスレッドを用いる場合を考える。また、メッセージディスパッチャがシステム内で発生する非同期メッセージを１つのキューで管理する場合であって、各々のオブジェクト宛の非同期メッセージを管理するメッセージディスパッチャがシングルスレッドで処理を実行することを考える。図３は、メッセージディスパッチャがシングルスレッドで処理を実行する場合のメッセージディスパッチャおよびオブジェクトの動作を示すシーケンス図である。処理Ａ１，Ａ２はオブジェクトＡの処理であり、初期値としてキューに登録されている。処理Ａ１ではオブジェクトＢの処理Ｂ１に非同期メッセージが送信される。処理Ａ２ではオブジェクトＢの処理Ｂ２に非同期メッセージが送信される。また、処理Ｂ１は、処理Ｂ２よりも前に実行されるべき処理であるとする。図３に示す例では、メッセージディスパッチャを実現するスレッド１が処理Ａ１を起動させると、オブジェクトＡの処理Ａ１によってオブジェクトＢの処理Ｂ１への非同期メッセージがキューに登録される。処理Ａ１の実行後、スレッド１が処理Ａ２を起動させると、オブジェクトＡの処理Ａ２によってオブジェクトＢの処理Ｂ２への非同期メッセージがキューに登録される。
【０００７】
メッセージディスパッチャでは、スレッド１が、キューに先に格納された処理Ｂ１への非同期メッセージを取り出してオブジェクトＢの処理Ｂ１を実行させる。その後、スレッド１が処理Ｂ２への非同期メッセージを取り出してオブジェクトＢの処理Ｂ２を実行させる。処理Ｂ１の実行後に処理Ｂ２が実行されることから、処理順は保障される。この場合、オブジェクトＢは、実質的にシングルスレッド環境で動作する。
【０００８】
次に、メッセージディスパッチャがマルチスレッドで処理を実行することを考える。図４は、メッセージディスパッチャがマルチスレッドで処理を実行する場合のメッセージディスパッチャおよびオブジェクトの動作を示すシーケンス図である。図４に示す例では、図３に示す例と同様に、スレッド１が処理Ａ１を起動させると、オブジェクトＡの処理Ａ１によってオブジェクトＢの処理Ｂ１への非同期メッセージがキューに登録される。処理Ａ１の実行後、スレッド１が処理Ａ２を起動させると、オブジェクトＡの処理Ａ２によってオブジェクトＢの処理Ｂ２への非同期メッセージがキューに登録される。
【０００９】
メッセージディスパッチャでは、スレッド１が、キューに先に格納された処理Ｂ１への非同期メッセージを取り出してオブジェクトＢの処理Ｂ１を実行させるのと並行して、スレッド２が、処理Ｂ２への非同期メッセージを取り出してオブジェクトＢの処理Ｂ２を実行させる。なお、図面を見やすくするために、図４では、スレッド２の処理がスレッド１の処理よりも遅れて実行されるように示されているが、スレッド２の処理とスレッド１の処理とは同時実行可能である。処理Ｂ１と処理Ｂ２が並行に処理されると、処理Ｂ２が先に処理を終了する可能性がある。したがって、マルチスレッドで動作させる場合には、処理順が保証されない可能性がある。なお、この場合、オブジェクトＢは、実質的にマルチスレッド環境で動作する。
【００１０】
図５は、各々のオブジェクト宛の非同期メッセージを管理するメッセージディスパッチャ９００が設けられたメッセージ制御システムにおいてオブジェクトが消滅する場合の処理を説明するための説明図である。図５に示すメッセージ制御システムは、メッセージディスパッチャ９００と、キュー９０１と、オブジェクト９１０と、オブジェクト９２０と、オブジェクト９３０とを備える。図５に示す例では、キュー９０１に、オブジェクト９１０，９２０，９３０宛の非同期メッセージが混在している。以下の説明では、オブジェクト９２０が消滅する場合を例にする。
【００１１】
オブジェクト９２０が消滅する場合には、オブジェクト９２０を宛先とした非同期メッセージを破棄する必要がある。したがって、キュー９０１から、オブジェクト９２０を宛先とした非同期メッセージを検索しなければならない。キュー９０１には、オブジェクト９２０を宛先とした非同期メッセージだけでなく、その他のオブジェクトを宛先とした非同期メッセージも登録されていることから、検索にかかる負荷が大きくなってしまう。
【００１２】
メッセージを格納するキューをオブジェクト毎に設けるメッセージ制御システムがある（例えば、特許文献１，２参照。）。オブジェクト毎にキューが設けられている場合には、オブジェクトＢの処理Ｂ１，Ｂ２の処理順は保障される。
【００１３】
【特許文献１】特開２０００−１５５６９３号公報（段落００１５−００１６、図１）
【特許文献２】特開２００１−１５４８６２号公報（段落００７２−００７６、図６）
【発明の開示】
【発明が解決しようとする課題】
【００１４】
しかし、特許文献１に記載された方式では、メッセージディスパッチャに相当する１つのメッセージ制御装置が設けられている。メッセージ制御装置において、少なくとも各々のキューにメッセージを格納する処理とキューからメッセージを取り出す処理とは排他的に実行される必要がある。メッセージ制御装置において全てのオブジェクトに対応するキューが管理されているので、メッセージ制御装置では、いずれかのオブジェクトに対するメッセージが到着する度に排他制御が実行される。その結果、メッセージ制御装置の処理効率が低下し、システムの処理効率が低下するおそれがある。特許文献２に記載された方式でも、メッセージディスパッチャに相当する１つのメッセージハンドラが設けられているので、メッセージハンドラの処理効率が低下するおそれがある。
【００１５】
また、特許文献１，２に記載された方式では、プロセスまたはオブジェクトはマルチスレッドであり、かつ、プロセスまたはオブジェクトにおける全てのスレッドを一元的に管理したり、プロセス単位でメッセージ通信を管理することによって処理の効率化が図られている。よって、メッセージ制御装置やメッセージハンドラをオブジェクト単位で設けると、特許文献１，２に記載された方式では、所望の効果が得られなくなるおそれがある。さらに、マルチスレッドでプロセスまたはオブジェクトを実行する場合には、スレッド管理が複雑になり、スレッド管理のためのオーバヘッドが大きい。
【００１６】
本発明は、複数のオブジェクトが非同期メッセージによって連携した処理を行うシステムにおいて、システムの処理効率の低下をできるだけ抑えつつ、処理順序を保障することができるオブジェクト間の非同期メッセージ管理方式および非同期メッセージ管理方法を提供することを目的とする。
【課題を解決するための手段】
【００１７】
本発明によるオブジェクト間の非同期メッセージ管理方式は、各オブジェクトに対応して、そのオブジェクトを宛先とするメッセージが格納されるキューと、キューに非同期メッセージのみを登録する非同期メッセージ登録手段と、非同期メッセージで要求された処理をシングルスレッドでオブジェクトに実行させるシングルスレッド制約手段とが設けられていることを特徴とする。
【００１８】
シングルスレッド制約手段は、例えば、キューに非同期メッセージが登録されている場合に、オブジェクトの処理が完了していることを条件に、キューから非同期メッセージを取り出すように構成されている。
【００１９】
シングルスレッド制約手段は、オブジェクトの処理が完了していることを条件にキューから非同期メッセージを取り出す処理を連続的に実行することが好ましい。
【００２０】
本発明によるオブジェクト間の非同期メッセージ管理方法は、各オブジェクトに対応して、そのオブジェクトを宛先とするメッセージが格納されるキューを設定し、各オブジェクトに対応して、キューに非同期メッセージのみを登録し、非同期メッセージで要求された処理をシングルスレッドでオブジェクトに実行させることを特徴とする。
【００２１】
キューに非同期メッセージが登録されている場合に、オブジェクトの処理が完了していることを条件に、キューから非同期メッセージを取り出す処理を連続的に実行することが好ましい。
【発明の効果】
【００２２】
本発明によれば、システムの処理効率の低下をできるだけ抑えつつ、処理順序を保障することができる。
【発明を実施するための最良の形態】
【００２３】
以下、本発明の実施の一形態を図面を参照して説明する。図１は、本発明による非同期メッセージ管理方式の実施の一形態を示すブロック図である。図１に示す非同期メッセージ管理方式は、オブジェクト１０と、オブジェクト２０と、オブジェクト３０と、アプリケーションオブジェクト１００とを備える。
【００２４】
本実施の形態では、オブジェクト１０を、オブジェクトの処理を実行する部分とオブジェクトに関するデータの他に、メッセージ制御装置１１を含むものとして捉える。メッセージ制御装置１１は、メッセージ受信部１２と、キュー１３と、メッセージディスパッチャ１４とを有する。なお、図１には、オブジェクト１０がメッセージ制御装置１１を含む場合を例示するが、オブジェクト２０，３０も同様の構成である。
【００２５】
オブジェクト１０，２０，３０およびアプリケーションオブジェクト１００は、連携して処理を行うよう構成されているオブジェクトであって、他のオブジェクトに処理を依頼する場合に、非同期メッセージを発行する。例えば、アプリケーションオブジェクト１００は、オペレーションシステムによって起動されるオブジェクトであり、オブジェクト１０は、アプリケーションオブジェクト１００によって起動されるオブジェクトであり、オブジェクト２０，３０は、オブジェクト１０によって起動されるオブジェクトである。
【００２６】
メッセージ受信部１２は、アプリケーションオブジェクト１００によって発行された非同期メッセージを受信して、キュー１３に登録する機能を有する。メッセージ受信部１２は、オブジェクト１０に対応付けて設けられている。
【００２７】
キュー１３は、非同期メッセージを発行順に登録するメモリ等の記憶部であって、オブジェクト１０に対応付けて設けられている。キュー１３に登録された非同期メッセージは、メッセージディスパッチャ１４によって取り出されて処理される。
【００２８】
次に、図面を参照して本実施の形態の動作について説明する。図２は、本実施の形態におけるメッセージ制御システムの動作を示すシーケンス図である。
【００２９】
アプリケーションオブジェクト１００は、非同期メッセージを発行することにより、オブジェクト１０に処理要求を行う（ステップＳ１）。
【００３０】
メッセージ受信部１２は、非同期メッセージを受信すると、受信した非同期メッセージを順にキュー１３に登録する（ステップＳ１１）。
【００３１】
メッセージディスパッチャ１４は、例えば、非同期メッセージで依頼された処理の実行中でない場合に、キュー１３に登録された順に非同期メッセージを取り出す（ステップＳ１２）。非同期メッセージで依頼された処理の実行中である場合、メッセージディスパッチャ１４は、処理の終了を待ち、処理終了後にキュー１３から非同期メッセージを取り出す。
【００３２】
オブジェクト１０は、メッセージディスパッチャ１４によって取り出された非同期メッセージにしたがって処理を実行する（ステップＳ１３）。
【００３３】
すなわち、メッセージディスパッチャ１４は、キュー１３から非同期メッセージを取り出す処理において、排他制御を行う。オブジェクト１０が非同期メッセージを処理中の場合に、メッセージディスパッチャ１４が処理の終了を待つことにより、シングルスレッドで動作させることができる。
【００３４】
取り出した非同期メッセージで依頼された処理を実行するときに、オブジェクト２０，３０にサブタスクとしての処理を依頼することが必要である場合には、オブジェクト１０は、該当するオブジェクトに処理要求を行う（ステップＳ１４）。
【００３５】
例えば、図１に例示するように、キュー１３から取り出された非同期メッセージで依頼された「１０−１処理」が、オブジェクト３０に処理を依頼する必要がある処理である場合、オブジェクト１０は、非同期メッセージをオブジェクト３０に送信する。また、キュー１３から取り出された非同期メッセージで依頼された「１０−２処理」が、オブジェクト２０に処理を依頼する必要がある処理である場合、オブジェクト１０は、非同期メッセージをオブジェクト２０に送信する。
【００３６】
上述したように、オブジェクト１０は、キュー１３に非同期メッセージが複数登録されている場合、非同期メッセージを逐次処理する。すなわち、シングルスレッドで処理を実行する。そのため、処理順が保障され、インプットに対する正しいアウトプットが得られる。すなわち、システム全体としてはマルチスレッドで動作する場合であっても、アプリケーションオブジェクト１００が要求した処理を実現するための各処理の処理順が保障される。
【００３７】
また、各処理の処理順は保障されているので、システム全体としてオブジェクトの数と同数のスレッドを起こすことができる。よって、システム全体として処理の並列性を高めることができる。
【００３８】
また、各オブジェクトにおける処理はシングルスレッドに制約されるのであるが、その制約を守るために、メッセージディスパッチャ１４は、オブジェクトの処理が実行されているときには、キュー１３から非同期メッセージを取り出さない。すなわち、メッセージディスパッチャ１４は、非同期メッセージで要求された処理をシングルスレッドでオブジェクトに実行させるシングルスレッド制約手段を実現する。例えば、アプリケーションオブジェクト１００がオブジェクト１０に非同期メッセージを発行し、オブジェクト１０が、その非同期メッセージで要求された処理を実行しているとする。そのときに、他のオブジェクトがオブジェクト１０に非同期メッセージを送信した場合には、オブジェクト１０がアプリケーションオブジェクト１００からの非同期メッセージについての処理を処理中であるため、他のオブジェクトからの非同期メッセージはキュー１３に登録される。その後、アプリケーションオブジェクト１００からの非同期メッセージについての処理が終了したら、メッセージディスパッチャ１４は、キュー１３から非同期メッセージを取り出し、オブジェクト１０で実行させる。非同期メッセージについての処理の実行が完了したらキュー１３から非同期メッセージを取り出す処理が、キュー１３が空になるまで連続的に実行される。すなわち、シングルスレッドでオブジェクト１０の処理が実行される。また、マルチスレッドにはしないので、最小限のスレッド数で処理を行うことができる。
【００３９】
なお、各オブジェクトが扱うメモリ領域に他のオブジェクトがアクセス可能にすると、メモリ領域は他のオブジェクトの動作による影響を受ける。したがって、メモリ領域に、異なるオブジェクトがアクセスすることは禁止される。
【００４０】
次に、オブジェクトが消滅する場合について説明する。オブジェクトが消滅する場合には、消滅するオブジェクトを宛先とした非同期メッセージを破棄する必要がある。
【００４１】
本実施の形態では、図１に示すように、オブジェクト毎にキューが割り当てられることから、例えば、オブジェクト１０を宛先とした非同期メッセージを破棄する場合には、キュー１３に登録されている非同期メッセージをすべて破棄すればよい。したがって、オブジェクト破棄のための処理が軽減され、システムの性能を向上させることができる。
【００４２】
以上に説明したように、本実施の形態では、オブジェクト毎に、メッセージ受信部、キューおよびメッセージディスパッチャを有するため、受信したメッセージをキューに登録する際に、図５に示されたように受信順に１つずつ登録するのではなく、異なるキューに並列的に登録することができ、処理の並列性を高めることができる。
【００４３】
また、オブジェクトがシングルスレッドで処理を実行するように制約されるため、処理順を保障することができる。また、オブジェクトの数と同数のスレッドを起こすことが可能になる。すなわち、オブジェクトの数と同数の並列処理が可能となることから、処理の並列度が上がり、システムの性能を向上させることができる。
【００４４】
なお、オブジェクト毎にスレッドを作成することなく、アプリケーションオブジェクト等のスレッドを使用することにより、最小限のスレッド数で処理を行うことができる。したがって、スレッド管理にかかる負荷を削減することができ、システムの性能を向上させることができる。
【００４５】
また、上記の実施の形態では、オブジェクト間で非同期メッセージの送受信が行われる場合を例にしたが、同期メッセージも使用される場合には、メッセージ制御装置１１において、受信した同期メッセージはキュー１３に登録されない。例えば、メッセージ制御装置１１は、受信した同期メッセージを他のキューに登録したり、非同期メッセージについての処理を中断させて同期メッセージについての処理をオブジェクトに実行させたりする。
【産業上の利用可能性】
【００４６】
本発明を、システム全体としてはマルチスレッドプログラム実行環境であり、複数のオブジェクト間の処理を連携するメッセージ制御システムに効果的に適用できる。
【図面の簡単な説明】
【００４７】
【図１】本発明によるメッセージ制御システムの実施の一形態を示すブロック図である。
【図２】図１に示すメッセージ制御システムの動作を示すシーケンス図である。
【図３】シングルスレッドにおけるオブジェクトの動作を示すシーケンス図である。
【図４】マルチスレッドにおけるオブジェクトの動作を示すシーケンス図である。
【図５】各々のオブジェクト宛の非同期メッセージを管理するメッセージディスパッチャが設けられたメッセージ制御システムにおいてオブジェクトが消滅する場合の処理を説明するための説明図である。
【符号の説明】
【００４８】
１０，２０，３０  オブジェクト
１１              メッセージ制御装置
１２              メッセージ受信部
１３              キュー
１４              メッセージディスパッチャ
１００            アプリケーションオブジェクト
【図１】
2008027344.tif 000003
【図２】
2008027344.tif 000004
【図３】
2008027344.tif 000005
【図４】
2008027344.tif 000006
【図５】
2008027344.tif 000007