(57)【特許請求の範囲】
【請求項１】
自スレッドに対応付けられたタスクキューに蓄積されたタスクをそれぞれ処理する複数のスレッドを所定数並列実行させる情報処理装置において、
前記複数のスレッドのそれぞれが、
１つの処理要求に対する一連のプログラム処理が分割された複数のタスクのうちの１つのタスクを生成するタスク生成部と、
前記複数のスレッドのうちいずれか１つに対応付けられたタスクキューを選択し、該選択したタスクキューに、前記タスク生成部により生成されたタスクをエンキューするエンキュー部と、
自スレッドに対応付けられたタスクキューにエンキューされたタスクをデキューするデキュー部と、
前記デキュー部によりデキューされたタスクを実行するタスク実行部と
を備えた情報処理装置。
【請求項２】
前記エンキュー部は、最もキュー長が短いタスクキューを選択する請求項１記載の情報処理装置。
【請求項３】
前記複数のスレッドのそれぞれに対応付けられたタスクキューにエンキューされたタスクのうち、同一機能を有するタスク同士の紐付けを行うタスク紐付け部と、
前記タスク実行部が実行したタスクに、次に実行するタスクが紐付けされているときには、該紐付けされたタスクを、前記タスク実行部が実行したタスクに連続させて実行する紐付けタスク実行部と
を備えた請求項１又は２に記載の情報処理装置。
【請求項４】
前記タスク紐付け部は、前記エンキュー部によりタスクが新たにエンキューされたときに、該新たにエンキューされたタスクと、前記複数のスレッドのそれぞれに対応付けられたタスクキューにすでにエンキューされているタスクのうち、前記新たにエンキューされたタスクと同一機能を有するタスクとの紐付けを行う請求項３記載の情報処理装置。
【請求項５】
前記複数のスレッドの数が、情報処理装置のＣＰＵコアの数と一致している請求項１〜４のいずれか１つに記載の情報処理装置。
【請求項６】
自スレッドに対応付けられたタスクキューに蓄積されたタスクをそれぞれ処理する複数のスレッドを所定数並列実行させる情報処理装置において、
前記複数のスレッドのそれぞれが、
１つの処理要求に対する一連のプログラム処理が分割された複数のタスクのうちの１つのタスクを生成し、
前記複数のスレッドのうちいずれか１つに対応付けられたタスクキューを選択し、該選択したタスクキューに、前記生成したタスクをエンキューし、
自スレッドに対応付けられたタスクキューにエンキューされたタスクをデキューし、
前記デキューしたタスクを実行する
処理を実行する情報処理方法。
【請求項７】
自スレッドに対応付けられたタスクキューに蓄積されたタスクをそれぞれ処理する複数のスレッドを所定数並列実行させる情報処理装置において、
前記複数のスレッドのそれぞれに、
１つの処理要求に対する一連のプログラム処理が分割された複数のタスクのうちの１つのタスクを生成し、
前記複数のスレッドのうちいずれか１つに対応付けられたタスクキューを選択し、該選
択したタスクキューに、前記生成したタスクをエンキューし、
自スレッドに対応付けられたタスクキューにエンキューされたタスクをデキューし、
前記デキューしたタスクを実行する
処理を実行させる情報処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置において、マルチスレッド方式でプログラム処理を実行する技術に関する。
【背景技術】
【０００２】
情報処理装置において、複数のスレッドでプログラム処理を行うマルチスレッド方式が広く用いられている。マルチスレッド方式を用いることによって並行処理が可能となるため、情報処理装置の処理性能の向上を図ることができる。そして、かかるマルチスレッド方式においてさらなる処理性能の向上を図った技術が提案されている。その一例として、スレッド及びキューの数を、メッセージの受信負荷状況により可変制御する技術がある。また、他の一例として、多重プロセッサシステムにおいて、タスク状態情報に、タスクを効果的に実行できる特定のプロセッサを表示し、当該タスクを優先的に選択できるようにした技術が提案されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平９−６９０５３号公報
【特許文献２】特開昭５４−４７５４５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ところで、マルチスレッド方式においては、同時に起動したスレッド群は、ＯＳ（Operating System）のスケジューリングによって順次実行機会を与えられることとなる。このとき、スレッドの数が増加すると、ＯＳのスケジューリングによるスレッド切り換えの処理コストが増加するという問題がある。また、スレッドの生成及び廃棄処理が多発すると、さらにオーバーヘッドが増加してしまうという問題もある。このような状態が発生すると、情報処理装置の処理性能は低下する。
【０００５】
そこで、本技術は、１つの側面において、マルチスレッド方式を適用した情報処理装置において、情報処理装置の処理性能を向上させることを目的とする。
【課題を解決するための手段】
【０００６】
本技術における１つの側面では、自スレッドに対応付けられたタスクキューに蓄積されたタスクをそれぞれ処理する複数のスレッドを所定数並列実行させる情報処理装置において、複数のスレッドのそれぞれが、次の処理を実行する。すなわち、複数のスレッドのそれぞれは、１つの処理要求に対する一連のプログラム処理が分割された複数のタスクのうちの１つのタスクを生成する。さらに、複数のスレッドのうちいずれか１つに対応付けられたタスクキューを選択し、該選択したタスクキューに、生成したタスクをエンキューする。また、自スレッドに対応付けられたタスクキューにエンキューされたタスクをデキューし、デキューしたタスクを実行する。
【発明の効果】
【０００７】
本技術における１つの側面によれば、マルチスレッド方式を適用した情報処理装置において、情報処理装置の処理性能を向上させることが可能となる。
【図面の簡単な説明】
【０００８】
【図１】情報処理装置においてプログラム処理を実行するスレッドを並列実行させた状態の一例を示す説明図である。
【図２】メッセージ中継装置を含んだ全体のシステム構成の一例の説明図である。
【図３】メッセージ中継装置の一例の機能ブロック図である。
【図４】タスク実行順定義の一例の説明図である。
【図５】タスクデータの一例の説明図である。
【図６】タスクキューテーブルの一例の説明図である。
【図７】コネクション情報の一例の説明図である。
【図８】メッセージに関連するデータの一例の説明図であり、（Ａ）はメッセージ情報の一例の説明図、（Ｂ）はメッセージ本体の具体例の説明図である。
【図９】識別ルールの一例の説明図である。
【図１０】転送ルールテーブルの一例の説明図である。
【図１１】メッセージ中継装置のハードウェア構成の一例の説明図である。
【図１２】各スレッドが実行する処理全体の流れの一例を示すフローチャートである。
【図１３】コネクション受付処理の一例を示すフローチャートである。
【図１４】タスク実行処理の一例を示すフローチャートである。
【図１５】第２実施形態の処理の具体例を示す説明図である。
【図１６】メッセージ中継装置の一例の機能ブロック図である。
【図１７】紐付けタスク管理データの一例の説明図である。
【図１８】タスクキュー、タスク管理データ及びタスクデータの関係の一例について示す説明図である。
【図１９】各スレッドが実行する処理全体の流れの一例を示すフローチャートである。
【図２０】タスク紐付け処理の一例を示すフローチャートである。
【図２１】タスク実行処理の一例を示すフローチャートである。
【図２２】タスク実行処理の一例を示すフローチャートである。
【図２３】第２実施形態の処理の具体例を示す説明図である。
【図２４】メッセージ中継装置の一例の機能ブロック図である。
【図２５】紐付けタスク管理データの一例の説明図である。
【図２６】各スレッドが実行する処理全体の流れの一例を示すフローチャートである。
【発明を実施するための形態】
【０００９】
［１．実施形態の概要］
本明細書で示す実施形態で説明する技術は、マルチスレッド方式を適用した情報処理装置において、プログラム処理を行う際の処理効率を向上させるものである。
【００１０】
通常、情報処理装置においてマルチスレッド方式でプログラム処理を行う場合、ＯＳ（Operating System）は、スケジューリングを行い、同時に起動されている各スレッドを順次実行する。かかるマルチスレッド方式では、スレッドの数が増加すると、ＯＳのスケジューリングによるスレッド切り換え（コンテキストスイッチ）の処理コストが増加するという問題がある。また、スレッドの生成及び廃棄処理が多発すると、さらにオーバーヘッドが増加してしまうという問題もある。
【００１１】
そこで、本明細書で示す実施形態では、情報処理装置において、プログラム処理を実行する複数のスレッドを所定数並列実行（常駐）させておく。ここでいう所定数のスレッドの並列実行とは、少なくとも、スレッド切り替えをせずに、複数のプロセッサによってそれぞれスレッドを同時に実行することを含む。ここで、本明細書で示す実施形態では、プログラム処理を複数のタスクに分割する。そして、分割したタスクを、それぞれ、並列実行されているスレッドのうちの１つに対応付けられたタスクキューにエンキューし、逐次
実行する。
【００１２】
図１は、情報処理装置においてプログラム処理を実行するスレッドを並列実行させた状態の一例を示す説明図である。この例では、ＣＰＵ（Central Processing Unit）で動作しているＯＳ上で、プログラム処理を実行する複数のスレッドが並列実行されている。また、処理Ａ、処理Ｂ及び処理Ｃの３つのプログラム処理が、それぞれ複数のタスクに分割されている。各スレッドには、それぞれ、処理Ａ、処理Ｂ及び処理Ｃのプログラム処理が分割されたタスクのうち、いずれかのタスクがタスクキューにエンキューされて割当てられる。そして、各スレッドは、自身に割当てられたタスクを順次デキューして実行していく。なお、図１に示す例では、情報処理装置がＣＰＵコアを複数有する構成であり、スレッドの数がＣＰＵコアの数と一致しているが、本技術はかかる構成に限って適用されるものではない。
【００１３】
このように、本明細書で示す実施形態で説明する技術では、プログラム処理を実行するスレッドが所定数並列実行されているため、スレッドの切り替えの発生や、スレッドの生成・廃棄のオーバーヘッドを抑制させることが可能である。また、このとき、一連のプログラム処理を複数のタスクに分割して複数のスレッドのいずれかに振り分けてエンキューし、各スレッドが、それぞれ、エンキューされたタスクをデキューして実行する。このため、並列実行されているスレッドの一部に処理負荷が偏ることを防ぐことができ、プログラム処理によって遅延時間（処理待ち時間）に差が生じることを抑制することができる。したがって、一部のプログラム処理において著しい処理遅延が生じることを回避することができる。このように、本技術によれば、情報処理装置において、スレッドの切り替えの発生や、スレッドの生成・廃棄のオーバーヘッドを抑制しつつ、プログラム処理を行う際の処理効率を向上させることが可能となる。
【００１４】
［２．第１実施形態］
第１実施形態では、前述の概要で説明した技術を、メッセージ中継装置に適用した例を用いて説明する。
【００１５】
＜２．１  全体システム構成＞
図２は、第１実施形態に係るメッセージ中継装置を含んだ全体のシステム構成を示す。本システムでは、メッセージ中継装置１が、クライアント２及びサーバ３と通信可能にネットワーク接続されている。このネットワークは、例えばＬＡＮ（Local Area Network）やＷＡＮ（Wide Area Network）等であり、本実施形態では、少なくともＴＣＰ（Transmission Control Protocol）プロトコルを用いた通信を実現する。
【００１６】
メッセージ中継装置１、クライアント２及びサーバ３間のデータ通信のシーケンスは、次のとおりである。
（１）クライアント２は、サーバ３で所定の処理を実行するためのリクエストメッセージを、メッセージ中継装置１に対して送信する。
（２）メッセージ中継装置１は、クライアント２から受信したメッセージに含まれる情報から、当該メッセージの転送先のサーバ３を特定し、特定したサーバ３に対してリクエストメッセージを転送する。
（３）サーバ３は、メッセージ中継装置１からリクエストメッセージを受信すると、所定の処理を実行する。そして、サーバ３は、クライアント２宛てのレスポンスメッセージを、メッセージ中継装置１に対して送信する。
（４）メッセージ中継装置１は、サーバ３から受信したレスポンスメッセージを、リクエストメッセージの送信元のクライアント２に転送する。
【００１７】
＜２．２  メッセージ中継装置の機能構成＞
図３は、メッセージ中継装置１の一例の機能ブロック図である。メッセージ中継装置１は、ＣＰＵによって実行されプログラム処理を行うスレッド１１（スレッド＃１）及びスレッド１２（スレッド＃２）を有している。スレッド１１は、コネクション受付部１１Ａ、タスク生成部１１Ｂ、エンキュー部１１Ｃ、デキュー部１１Ｄ、タスク実行部１１Ｅを備える。また、図示を省略しているが、スレッド１２もスレッド１１と同様の構成要素を備えている。なお、本実施形態ではスレッドの数を２つとして説明するが、スレッドの数はいくつであってもよい。また、メッセージ中継装置１が備える記憶手段には、タスク実行順定義２１、タスクキューテーブル２２、コネクション情報２３、メッセージ情報２４、識別ルール２５及び転送ルールテーブル２６が格納される。なお、本明細書において記憶手段とは、メモリ等の揮発性記憶装置及びストレージ等の不揮発性記憶装置のいずれか一方又は両方を示す。
【００１８】
まず、スレッド１１（スレッド１２も同様）が備える各機能について説明する。
コネクション受付部１１Ａは、メッセージの通信におけるコネクションの受付処理を行う。
【００１９】
タスク生成部１１Ｂは、１つの処理要求に対する一連のプログラム処理が分割された複数のタスクのうちの１つのタスクを生成する。本実施形態のメッセージ中継装置１では、１つの処理要求に対する一連のプログラム処理とは、すなわち、クライアント２から１つのリクエストメッセージを受信したときにおける、クライアント２及びサーバ３間におけるメッセージの中継処理のことである。タスク生成部１１Ｂは、コネクション受付部１１Ａがコネクションの受付処理を行ったとき、又は、タスク実行部１１Ｅが１つのタスクの実行を終了したとき、タスク実行順定義２１に従って、メッセージ中継処理における次のタスクを生成し、生成したタスクをエンキュー部１１Ｃに渡す。
【００２０】
エンキュー部１１Ｃは、タスク生成部１１Ｂが生成したタスクを、スレッド１１のタスクキュー３１又はスレッド１２のタスクキュー３２のいずれかにエンキューする。このとき、エンキュー部１１Ｃは、メッセージ中継装置１が実行する全てのスレッドのタスクキューのキュー長を調査し、最もキュー長の短いタスクキューを選択する。そして、選択したタスクキューに、タスクをエンキューする。
【００２１】
デキュー部１１Ｄは、スレッド１１に対応付けられたタスクキュー３１にエンキューされたタスクをデキューし、デキューしたタスクをタスク実行部１１Ｅに渡す。
タスク実行部１１Ｅは、デキューしたタスクを実行し、受信メッセージのメッセージ情報２４及び後述するシーケンス番号をタスク生成部１１Ｂに渡す。
【００２２】
次に、記憶手段に格納される各種データについて説明する。
タスク実行順定義２１は、プログラム処理に含まれるタスクが、実行順のシーケンス番号とともに定義されたデータである。図４に示すタスク実行順定義の一例は、メッセージ中継処理に含まれるタスクの実行順を示している。本実施形態における各タスクの具体的内容については後述する。
【００２３】
タスクキュー３１は、スレッド１１においてタスクを実行するために必要な情報が含まれたタスクデータが蓄積されるキューである。図５に示すタスクデータの一例は、メッセージ中継処理に含まれるタスクを実行するために必要な情報が含まれたタスクデータを示している。当該タスクデータは、タスクの処理を実行する関数を示す関数ポインタ、処理対象（引数）であるメッセージ情報２４がメモリ上に格納されているアドレスを示すポインタを含む。そして、このタスクデータは、さらに、タスク実行順定義のうち、現在実行しているタスクを表すシーケンス番号（換言すれば、当該タスクが何番目のタスクであり、次に実行するべきタスクが何番目のタスクであるかを特定する番号）を含む。スレッド
１２に対応するタスクキュー３２にも、同様のタスクデータが蓄積される。
【００２４】
タスクキューテーブル２２は、メッセージ中継装置１が実行している全てのスレッドに対応付けられたタスクキューの状態を管理するテーブルである。図６に示すタスクキューテーブル２２の一例は、キュー番号、担当スレッド、readインデックス、writeインデックス、最大要素数及びキューの先頭アドレスのカラムを有する。キュー番号は、タスクキューを一意に特定する番号である。担当スレッドは、タスクキューに蓄積されたデータを処理するスレッドを示す。readインデックス及びwriteインデックスは、タスクキューにおける現在の読出位置のインデックス及び書込位置のインデックスを示す。最大要素数は、タスクキューに蓄積可能な処理要素数を示す。タスクキューの先頭アドレスは、メッセージ中継装置１の記憶手段上における各タスクキューの先頭アドレスを示す。
【００２５】
コネクション情報２３は、コネクション受付部１１Ａがコネクションを確立したときに生成する、コネクションを特定する情報である。図７に示すコネクション情報２３の一例は、メッセージ受信時におけるソケットを識別する識別子、送信元ＩＰアドレス、送信元ポート、宛先ＩＰアドレス及び宛先ポートを含む。
【００２６】
メッセージ情報２４は、コネクション受付部１１Ａがコネクションを確立したときに生成する、メッセージ中継処理に必要な情報やメッセージ本体等に関連する情報である。図８（Ａ）に示すメッセージ情報２４の一例は、メッセージのデータサイズ、受信コネクション情報のポインタ、送信コネクション情報のポインタ、メッセージデータ本体の先頭アドレス、ソケットを識別する識別子及びメッセージの宛先のＩＰアドレス及びポートを含む。なお、図８（Ｂ）には、メッセージデータ本体の具体例を示している。この具体例では、メッセージデータは、レイヤ７プロトコルヘッダ（例えば、ＨＴＴＰ（HyperText Transfer Protocol）ヘッダ）と、メッセージコンテンツ（例えば、ＳＯＡＰ（Simple Object Access Protocol）エンベロープ）を含んでいる。
【００２７】
識別ルール２５は、メッセージデータ本体のメッセージコンテンツの内容のうち、識別子が記載されている箇所を特定するためのデータである。図９に示すメッセージ情報２４の一例は、識別子抽出箇所及び抽出箇所の書式を含む。なお、図９の識別ルール２５のデータ例は、図８（Ｂ）に示したメッセージデータの例に対応している。すなわち、この識別ルール２５は、メッセージコンテンツのうち、ＸＭＬ（EXtensible Markup Language）タグの<Presentity>に、Xpath形式で識別子が記載されていることを示しており、図８（Ｂ）のメッセージコンテンツにおいては、識別子は「sip:bob@example.com」である。
【００２８】
転送ルールテーブル２６は、メッセージデータの転送先となるサーバ３を特定する情報を有するテーブルである。図１０に示す転送ルールテーブル２６の一例は、識別子、及び、当該識別子で特定されるソケットで通信されるメッセージデータの転送先の宛先サーバのＩＰアドレスを含む。例えば、識別子が「sip:bob@example.com」である場合、宛先サーバのＩＰアドレスは、「10.10.10.11:8080」である。
【００２９】
＜２．３  メッセージ中継装置のハードウェア構成＞
図１１は、メッセージ中継装置１が具現化された情報処理装置のハードウェア構成の一例を示す。本情報処理装置は、プロセッサ９０１、メモリ９０２、ストレージ９０３、可搬記憶媒体駆動装置９０４、入出力装置９０５及び通信インタフェース９０６を備える。
【００３０】
プロセッサ９０１は、制御ユニット、演算ユニット及び命令デコーダ等を含み、実行ユニットが、命令デコーダで解読されたプログラムの命令に従い、制御ユニットより出力される制御信号に応じ、演算ユニットを用いて算術・論理演算を実行する。かかるプロセッサ９０１は、制御に用いる各種情報が格納される制御レジスタ、既にアクセスしたメモリ
２等の内容を一時的に格納可能なキャッシュ、及び、仮想記憶のページテーブルのキャッシュとしての機能を果たすＴＬＢを備える。なお、プロセッサ９０１は、ＣＰＵ（Central Processing Unit）コアが複数設けられている構成でもよい。
【００３１】
メモリ９０２は、例えばＲＡＭ（Random Access Memory）等の記憶装置であり、プロセッサ９０１で実行されるプログラムがロードされるとともに、プロセッサ９０１の処理に用いるデータが格納されるメインメモリである。また、ストレージ９０３は、例えばＨＤＤ（Hard Disk Drive）やフラッシュメモリ等の記憶装置であり、プログラムや各種データが格納される。可搬記憶媒体駆動装置９０４は、可搬記憶媒体９０７に記憶されたデータやプログラムを読み出す装置である。可搬記憶媒体９０７は、例えば磁気ディスク、光ディスク、光磁気ディスク又はフラッシュメモリ等である。なお、プロセッサ９０１は、メモリ９０２やストレージ９０３と協働しつつ、ストレージ９０３や可搬記憶媒体９０７に格納されたプログラムを実行する。なお、プロセッサ９０１が実行するプログラムや、アクセス対象となるデータは、当該情報処理装置と通信可能な他の装置に格納されていてもよい。前述したメッセージ中継装置１の記憶手段は、メモリ９０２、ストレージ９０３及び可搬記憶媒体９０７の少なくともいずれか１つである。
【００３２】
入出力装置９０５は例えばキーボード等やディスプレイ等であり、ユーザ操作等による動作命令を受け付ける一方、情報処理装置による処理結果を出力する。通信インタフェース９０６は例えばＬＡＮ（Local Area Network）カード等であり、外部とのデータ通信を可能にする。前述した情報処理装置の各構成要素は、バス９０８で接続されている。
【００３３】
なお、上述した各実施形態において、記憶装置に格納されたデータは、当該情報処理装置とは異なる他の装置に含まれる記憶装置に含まれていてもよい。この場合、当該情報処理装置と当該他の装置とが通信可能にネットワーク接続され、当該情報処理装置は、ネットワークを介して当該他の装置の記憶装置にアクセスすることとなる。
【００３４】
＜２．４  タスク実行順定義の具体例＞
ここで、図４に示した、メッセージ中継処理におけるタスク実行順定義の一例につき、各タスクの具体的内容について説明する。
【００３５】
（タスク１）リクエスト受信
リクエスト受信タスクは、メッセージ情報２４の受信コネクション情報に基づき、当該コネクションによって、クライアント２からリクエストメッセージを受信する。そして、受信したデータの先頭アドレスおよびデータサイズをメッセージ情報２４に設定する。
（タスク２）識別子抽出
識別子抽出タスクは、識別ルール２５を参照し、メッセージデータ本体から識別子を抽出するタスクである。このとき、識別子抽出タスクは、抽出した識別子をメッセージ情報２４に設定する。
（タスク３）宛先決定
宛先決定タスクは、メッセージ情報２４の識別子をキーとして転送ルールテーブル２６を検索し、メッセージの宛先となるサーバ３を決定する。このとき、宛先決定タスクは、決定したサーバ３のＩＰアドレス及びポートを、メッセージ情報２４の宛先ＩＰアドレス及びポートに設定する。
（タスク４）リクエスト送信
リクエスト送信タスクは、メッセージ情報２４の宛先ＩＰアドレス及びポートに基づいて、サーバ３との間にコネクションを確立する。このとき、リクエスト送信タスクは、送信コネクション情報を生成し、メッセージ情報２４に設定する。そして、リクエスト送信タスクは、送信コネクションを用いて、リクエストメッセージをサーバ３に送信する。
（タスク５）レスポンス受信
レスポンス受信タスクは、メッセージ情報２４の送信コネクション情報に基づき、当該コネクションによって、サーバ３からレスポンスメッセージを受信する。なお、この段階では、メッセージ情報２４のうち受信コネクション情報以外は一旦解放済みであるため、レスポンス受信タスクは、受信したデータの先頭アドレスおよびデータサイズをメッセージ情報２４に設定する。
（タスク６）レスポンス送信
レスポンス送信タスクは、メッセージ情報２４の受信コネクション情報に基づき、当該コネクションを用いて、サーバ３から受信したレスポンスメッセージをクライアント２に送信する。
【００３６】
＜２．５  メッセージ中継装置で実行される処理＞
次に、本実施形態に係るメッセージ中継装置において実行される処理について説明する。
【００３７】
図１２は、各スレッドが実行する処理全体の流れの一例を示すフローチャートである。Ｓ１及びＳ２は、所定時間ごとに繰り返し実行される（ループＡ）。
Ｓ１では、コネクション受付部１１Ａ、タスク生成部１１Ｂ及びエンキュー部１１Ｃが、コネクション受付処理を実行する。
さらに、Ｓ２は、所定回数分だけ繰り返し実行される（ループＢ）。
【００３８】
Ｓ２では、デキュー部１１Ｄ、タスク実行部１１Ｅ、タスク生成部１１Ｂ及びエンキュー部１１Ｃが、タスク実行処理を実行する。
【００３９】
図１３は、コネクション受付部１１Ａ、タスク生成部１１Ｂ及びエンキュー部１１Ｃが実行する、コネクション受付処理を示す。
Ｓ１１では、コネクション受付部１１Ａが、ＴＣＰコネクションの受付けを行う。
【００４０】
Ｓ１２では、コネクション受付部１１Ａは、ＴＣＰコネクションの受付けに成功したか否かを判定する。成功したときには（Ｙｅｓ）、Ｓ１３に進む。このとき、コネクション受付部１１Ａは、コネクション情報２３及びメッセージ情報２４を生成し、メッセージ情報２４をタスク生成部１１Ｂに渡す。一方、成功しなかったときには、処理を終了する。
【００４１】
Ｓ１３では、タスク生成部１１Ｂが、コネクション受付部１１Ａからメッセージ情報２４を受信すると、タスク実行順定義２１を参照して、先頭のタスク（シーケンス番号が１のタスク）を生成する。そして、生成したタスクをエンキュー部１１Ｃに送信する。具体的には、タスク生成部１１Ｂは、タスクデータを生成し、生成したタスクデータをエンキュー部１１Ｃに渡す。
【００４２】
Ｓ１４では、エンキュー部１１Ｃが、タスクキューテーブル２２を参照し、すべてのスレッドに対応する各タスクキューのキュー長を調査する。そして、エンキュー部１１Ｃは、最もキュー長の短いタスクキューを選択し、選択したタスクキューに対して、タスク生成部１１Ｂが生成したタスクのエンキューを行う。
【００４３】
なお、例えば、各タスクキューの状態が図６に示したタスクキューテーブル２２のデータ例のようになっている場合、このエンキュー処理は次のようになる。すなわち、エンキュー部１１Ｃは、最大１０００個のタスクをエンキュー可能なタスクキュー３１（＃１）、タスクキュー３２（＃２）について、readインデックスおよびwriteインデックスの差分を調査する。すると、タスクキュー３１は差が０であるためキュー長０となり、タスクキュー３２は差が２５２であるためキュー長２５２となる。したがって、エンキュー部１１Ｃは、タスクキュー３１にタスクをエンキューすることになる。ここで、エンキュー部
１１Ｃは、タスクキュー３１の先頭アドレスよりwriteインデックス分先のアドレスにタスクデータを格納し、writeインデックスを１つ増やす。なお、writeインデックスを１つ増やした結果、writeインデックスが最大要素数１０００と等しくなった場合、エンキュー部１１Ｃは、writeインデックスを０にする。
【００４４】
図１４は、デキュー部１１Ｄ、タスク実行部１１Ｅ、タスク生成部１１Ｂ及びエンキュー部１１Ｃが実行する、タスク実行処理を示す。
【００４５】
Ｓ２１では、デキュー部１１Ｄが、タスクキュー３１に蓄積されたタスクのデキューを行う。具体的には、デキュー部１１Ｄは、タスクキューテーブル２２を参照し、自スレッドに対応付けられたタスクキュー３１のキュー長を調査する。このとき、タスクキューのキュー長が０より大きい場合、デキューが成功する一方、キュー長が０の場合、デキュー失敗となる。ここで、デキュー部１１Ｄは、キュー先頭アドレスからreadインデックス分先のタスクデータに係るタスクのデキューを行う。また、デキュー部１１Ｄは、デキューに成功すると、取得したタスクデータが登録されていた領域をクリアし、タスクキューテーブル２２のreadインデックスを１つ増やす一方で、タスク実行部１１Ｅにタスクを送信する。なお、デキュー部１１Ｄは、readインデックスを１つ増やした結果、最大要素数と等しくなった場合、readインデックスを０にする。
【００４６】
Ｓ２２では、デキュー部１１Ｄは、Ｓ２１のデキューが成功したか否かを判定する。成功した場合（Ｙｅｓ）、Ｓ２３に進む一方、失敗した場合（Ｎｏ）、デキュー失敗として処理を終了する。この場合、処理の終了とは、図１２で示した全体処理におけるループＢを抜けることを意味する。
【００４７】
Ｓ２３では、タスク実行部１１Ｅが、デキュー部１１Ｄによりデキューされたタスクの実行を行う。すなわち、タスク実行部１１Ｅは、タスクデータに含まれる、メッセージ情報２４のポインタを引数として、関数ポインタで特定された関数を実行する。例えば、デキューされたタスクが、図５に示したタスクデータに係るタスクである場合、タスク実行部１１Ｅは、メッセージ情報２４のポインタを引数として、リクエスト受信関数の関数ポインタを実行することになる。そして、タスク実行部１１Ｅは、タスクの実行が終わると、タスクデータのシーケンス番号を１つ増やし、当該シーケンス番号とメッセージ情報２４をタスク生成部１１Ｂに渡す。
【００４８】
Ｓ２４では、タスク生成部１１Ｂが、タスク実行部１１Ｅより渡されたシーケンス番号に基づき、該当するシーケンス番号の処理のタスクを生成する。タスク生成部１１Ｂは、生成したタスクをエンキュー部１１Ｃに渡す。
【００４９】
Ｓ２５では、エンキュー部１１Ｃが、タスクキューテーブル２２を参照し、すべてのスレッドに対応する各タスクキューのキュー長を調査する。そして、最もキュー長の短いタスクキューを選択し、選択したタスクキューに対して、タスク生成部１１Ｂが生成したタスクのエンキューを行う。
【００５０】
＜２．６  第１実施形態による効果、変形例等＞
かかる第１実施形態によれば、スレッドが所定数並列実行されているため、スレッドの切り替えや、スレッドの生成・廃棄のオーバーヘッドを低減させることが可能である。また、１つのプログラム処理を、タスク実行順定義に基づき複数のタスクに分割して各スレッドのタスクキューにエンキューし、各スレッドがそれぞれエンキューされたタスクをデキューして実行する。このため、並列実行されているスレッドの一部に処理負荷が偏ることを防ぐことができ、プログラム処理によって遅延時間に差が生じることを抑制することができる。したがって、一部のプログラム処理において特に大きな処理遅延が生じること
を回避することができる。このように、第１実施形態で説明する技術によれば、スレッドの切り替えの発生や、スレッドの生成・廃棄のオーバーヘッドを抑制しつつ、プログラム処理を行う際の処理効率を向上させることが可能となる。
【００５１】
また、エンキュー先のタスクキューを、最もキュー長が短いキューにすることにより、各スレッドの処理負荷がさらに調整され、より効率的にＣＰＵを利用することが可能となっている。
【００５２】
ここで、スレッド数は、メッセージ中継装置１が備えるＣＰＵコアの数に一致していてもよい。そうすることにより、ＣＰＵにおいてスレッドを切り替える処理コストをさらに削減することができる。
【００５３】
なお、このメッセージ中継装置１におけるコネクション受付処理は、全てのスレッドにおいて実行するのではなく、例えば、一部の特定のスレッドのみが実行してもよい。
【００５４】
［３．第２実施形態］
＜３．１  第２実施形態の概要＞
第２実施形態のメッセージ中継装置では、第１実施形態のメッセージ中継装置における処理に加え、さらに、同一機能のタスクの紐付けを行い、同一機能のタスクを連続実行するようにする。一般に、同一機能のタスクは同一のデータを参照することが多い（メッセージ中継処理のタスクの具体例で説明すると、例えば、宛先決定タスクは、いずれのスレッドで実行されるときにも、同一の転送ルールテーブルを参照する）。このように、同一機能のタスクを連続実行することにより、ＣＰＵにおけるキャッシュのヒット率が向上する。このため、さらなる処理効率の向上を図ることができる。なお、第２実施形態の説明においては、第１実施形態と同じ部分について説明を適宜省略する。
【００５５】
ここで、第２実施形態で実現する処理の具体例について、図１５を参照しながら説明する。
例えば、スレッド＃１及びスレッド＃２のタスクキューが、それぞれ図１５に示す状態であるとする。具体的には、スレッド１のタスクキューには、タスクＡ＃１、Ｂ＃１、Ｃ＃１、Ａ＃２のタスクデータが存在している。また、スレッド２のタスクキューには、タスクＤ＃１、Ｃ＃２、Ａ＃３、Ｂ＃２のタスクデータが存在している。なお、タスクＡ、Ｂ、Ｃ、Ｄは、それぞれ同一機能のタスクのグループ（具体的には、タスク実行順定義における各タスク（例えば、図４の例におけるリクエスト受信、識別子抽出等））を表しているものとする。このとき、第２実施形態では、同一機能のタスク同士を紐付けする。例えば、タスクＡに着目すると、タスクＡ＃１、Ａ＃２、Ａ＃３を紐付けする。このとき、例えば、紐付け順として、タスクＡ＃１、Ａ＃２、Ａ＃３の順に紐付けがなされたものとする。
【００５６】
この場合、第２実施形態では、スレッド＃１は、まずタスクＡ＃１を実行した後、次にタスクキューに蓄積されているタスクＢ＃１ではなく、タスクＡ＃１に紐付けされたタスクＡ＃２を実行する。さらに、スレッド＃１は、タスクＡ＃２を実行すると、さらにタスクＡ＃２に紐付けされた、スレッド＃２のタスクキューのタスクＡ＃３を実行する。このように、第２実施形態では、タスクに紐付けがなされているときには、同一機能のタスクを連続実行する。なお、一方で、紐付けがなされていないときには、通常通り、タスクキューに蓄積されたタスクを順次実行することとなる。例えば、図１５の例において、スレッド＃２は、タスクＤ＃１から順次タスクを実行していく。このとき、例えばすでにタスクＡ＃３がスレッド＃１により実行済みであった場合には、スレッド＃２は、タスクＣ＃２の次に、タスクＢ＃２を実行することとなる。
【００５７】
＜３．２  メッセージ中継装置の機能構成＞
図１６は、第２実施形態に係るメッセージ中継装置の一例の機能ブロック図である。第２実施形態に係るメッセージ中継装置は、第１実施形態に係るメッセージ中継装置に加え、スレッドが、タスク紐付け部１１Ｆ及び紐付けタスク実行部１１Ｇを備える。さらに、第２実施形態に係るメッセージ中継装置１は、記憶手段において、紐付けタスク管理データ２７を備える。また、タスクキューにおいては、タスクデータをラッピングするタスク管理データを備える。
【００５８】
タスク紐付け部１１Ｆは、同一機能のタスクの紐付けを行う。
紐付けタスク実行部１１Ｇは、紐付けられたタスクを辿りながら、同一機能のタスクの連続実行を行う。
【００５９】
紐付けタスク管理データ２７は、同一機能のタスクごとに、タスクキューに蓄積されたタスクをどこまで紐付けしたかを管理するためのデータである。図１７に示す紐付けタスク管理データの一例は、同一機能である紐付け対象のタスク（すなわち、タスク実行順定義で定義されたタスクごと）の関数、紐付け済みの最終タスク及び調査済タスクのタスクキュー内最終位置を含む。紐付け済みの最終タスクは、当該タスクのメモリ上のアドレスと、どのスレッドのタスクキューに属しているかを示す情報を含む。また、調査済タスクとは、紐付けできるか否かの調査が済んでいるタスクのことである。調査済タスクのタスクキュー内最終位置は、タスクキューごとにそれぞれ保持される。
【００６０】
図１８は、タスクキュー、タスク管理データ及びタスクデータの関係について示す説明図である。タスクキューには、タスク管理データによってラッピングされたタスクデータが蓄積されている。より具体的に説明すると、タスクキューには、タスク管理データへのポインタが蓄積されている。タスク管理データは、タスクを実行してよいか否かを示す実行フラグ、タスクデータへのポインタ、紐付け先ポインタ及び紐付け元ポインタを含んでいる。紐付け先ポインタとは、自タスクの次に実行するタスクのタスク管理データへのポインタであり、紐付け元ポインタとは、自タスクの前に実行するタスクのタスク管理データへのポインタである。タスクデータ自体の構造は、図５に示した構造と同じであるため、説明を省略する。
【００６１】
＜３．３  メッセージ中継装置で実行される処理＞
次に、本実施形態に係るメッセージ中継装置１において実行される処理について説明する。
【００６２】
図１９は、各スレッドが実行する処理全体の流れの一例を示すフローチャートである。Ｓ３１、Ｓ３２及びＳ３３は、所定時間ごとに繰り返し実行される（ループＣ）。
Ｓ３１では、コネクション受付部１１Ａ、タスク生成部１１Ｂ及びエンキュー部１１Ｃが、コネクション受付処理を実行する。
さらに、Ｓ３２は、所定回数分だけ繰り返し実行される（ループＤ）。
【００６３】
Ｓ３２では、デキュー部１１Ｄ、タスク実行部１１Ｅ、タスク生成部１１Ｂ、エンキュー部１１Ｃ及び紐付けタスク実行部１１Ｇが、タスク実行処理を実行する。
Ｓ３３では、タスク紐付け部１１Ｆが、タスク紐付け処理を実行する。
【００６４】
図２０は、タスク紐付け部１１Ｆが実行する、タスク紐付け処理を示す。
Ｓ４１では、タスク紐付け部１１Ｆは、紐付けタスク管理データ２７より、紐付け対象のタスクの関数、紐付け済みの最終タスク及び調査済みタスクのタスクキュー内最終位置を読み出す。
【００６５】
Ｓ４２〜Ｓ４５は、各タスクキューにつきそれぞれ実行され（ループＥ）、かつ、各タスクキューの未調査のタスク数だけ繰り返し実行される（ループＦ）。
Ｓ４２では、タスク紐付け部１１Ｆは、現在調査中のタスクキューの、調査済みタスクのキュー内最終位置の次にあるタスク管理データを取得する。
【００６６】
Ｓ４３では、タスク紐付け部１１Ｆは、取得したタスク管理データからタスクデータを取得する。
Ｓ４４では、タスク紐付け部１１Ｆは、紐付けタスク管理データ２７の紐付け対象タスクの関数のアドレスと、取得したタスクデータに含まれる関数ポインタのアドレスとを比較する。両者が一致する場合には（Ｙｅｓ）、Ｓ４５に進み、一致しない場合には（Ｎｏ）、Ｓ４６へ進む。
【００６７】
Ｓ４５では、タスク紐付け部１１Ｆは、取得したタスク管理データと、紐付け済みの最終タスクのタスク管理データとの紐付けを行う。具体的には、タスク紐付け部１１Ｆは、紐付けタスク管理データ２７の紐付け済みの最終タスクのタスク管理データの紐付け先ポインタに、タスク管理データのアドレスを設定する一方、取得したタスク管理データの紐付け元ポインタに、紐付けタスク管理データ２７の紐付け済みの最終タスクのタスク管理データのアドレスを設定する。こうすることで、双方向リンクを作成することができる。ここで、タスク紐付け部１１Ｆは、タスクの紐付けが完了すると、紐付けタスク管理データ２７の紐付け済みの最終タスクに、取得したタスク管理データのタスクがエンキューされているタスクキュー及びその設定アドレスを設定する。
【００６８】
Ｓ４５では、タスク紐付け部１１Ｆは、紐付けタスク管理データ２７の調査済みタスクを、Ｓ４２で取得したタスク管理データのインデックスで更新する。
コネクション受付処理については、第１実施形態と同様であるため、説明を省略する。
【００６９】
図２１及び図２２は、デキュー部１１Ｄ、タスク実行部１１Ｅ、タスク生成部１１Ｂ、エンキュー部１１Ｃ及び紐付けタスク実行部１１Ｇが実行する、タスク実行処理を示す。
Ｓ５１では、デキュー部１１Ｄが、タスクキュー３１に蓄積されたタスク管理データを取得する。具体的には、デキュー部１１Ｄは、タスクキューテーブル２２を参照し、自スレッドが担当するタスクキュー３１のキュー長を調査する。このとき、タスクキューのキュー長が０より大きく、かつ、取得したタスク管理データの実行フラグがＯＦＦであるときに、タスク管理データの取得が成功するものとする。一方、タスクキューのキュー長が０であるときには、タスク管理データの取得は失敗である。なお、タスクキューのキュー長が０より大きいとしても、実行フラグがＯＮであるときには、デキュー部１１Ｄは、当該タスク管理データをスキップし、次のインデックスのタスク管理データの調査を行う。
【００７０】
Ｓ５２では、デキュー部１１Ｄは、Ｓ５１のタスク管理データの取得が成功したか否かを判定する。成功した場合（Ｙｅｓ）、Ｓ５３に進む一方、失敗した場合（Ｎｏ）、処理を終了する。この場合、処理の終了とは、図１９で示した全体処理におけるループＤを抜けることを意味する。
【００７１】
Ｓ５３では、デキュー部１１Ｄは、取得したタスク管理データの実行フラグをＯＮに変更する。
Ｓ５４では、デキュー部１１Ｄは、取得したタスク管理データの紐付け元ポインタを調査する。
【００７２】
Ｓ５５では、デキュー部１１Ｄは、紐付け元ポインタにアドレスが登録されているか否かを判定する。アドレスが登録されている場合には（Ｙｅｓ）、Ｓ５６に進み、アドレスが登録されていない場合は（Ｎｏ）、Ｓ５７に進む。
【００７３】
Ｓ５６では、デキュー部１１Ｄは、紐付け元ポインタが指すアドレスのタスク管理データの紐付け先ポインタをクリアする。
Ｓ５７では、デキュー部１１Ｄは、取得したタスク管理データの紐付け先ポインタを調査する。
【００７４】
Ｓ５８では、デキュー部１１Ｄは、紐付け先ポインタにアドレスが登録されているか否かを判定する。アドレスが登録されている場合は（Ｙｅｓ）、Ｓ５９に進み、アドレスが登録されていない場合は（Ｎｏ）、Ｓ６０に進む。
【００７５】
Ｓ５９では、デキュー部１１Ｄは、取得したタスク管理データの紐付け先ポインタが指すアドレスのタスク管理データの紐付け元ポインタをクリアする。
Ｓ６０では、デキュー部１１Ｄは、取得したタスク管理データのタスクデータに係るタスクのデキューを行う。デキュー部１１Ｄは、デキューに成功すると、取得したタスク管理データが登録されていた領域をクリアし、readインデックスを増やす一方で、タスク実行部１１Ｅにタスクを送信する。なお、デキュー部１１Ｄは、readインデックスを増やした結果、最大要素数と等しくなった場合、readインデックスを０にする。
【００７６】
Ｓ６１では、タスク実行部１１Ｅが、デキュー部１１Ｄによりデキューされたタスクの実行を行う。すなわち、タスク実行部１１Ｅは、タスクデータに含まれる、メッセージ情報２４のポインタを引数として、関数ポインタで特定された関数を実行する。そして、タスク実行部１１Ｅは、タスクの実行が終わると、タスクデータのシーケンス番号を１つ増やし、当該シーケンス番号及びメッセージ情報２４、並びに、当該タスクデータに対応するタスク管理データをタスク生成部１１Ｂに渡す。
【００７７】
Ｓ６２では、タスク生成部１１Ｂが、タスク実行部１１Ｅより渡されたシーケンス番号に基づいてタスクを生成する。具体的には、タスク生成部１１Ｂは、該当するシーケンス番号のタスクの処理を行う関数のアドレスを設定したタスクデータを生成するとともに、当該タスクデータに対応するタスク管理データを生成する。タスク生成部１１Ｂは、生成したタスク管理データ、及び、タスク実行部１１Ｅから渡されたタスク管理データをエンキュー部１１Ｃに渡す。
【００７８】
Ｓ６３では、エンキュー部１１Ｃが、タスクキューテーブル２２を参照し、すべてのタスクキューのキュー長を調査する。そして、最もキュー長の短いタスクキューを選択し、選択したタスクキューに対して、タスク生成部１１Ｂが生成したタスクのエンキューを行う。
【００７９】
Ｓ６４では、エンキュー部１１Ｃは、タスク実行部１１Ｅから渡されたタスク管理データを調査し、実行したタスクが登録されているタスク管理データに紐付け先ポインタが登録されているか否かを判定する。紐付け先ポインタが登録されている場合（Ｙｅｓ）、エンキュー部１１Ｃは、紐付けタスク実行部１１Ｇに、紐付け先ポインタが指すタスク管理データを渡し、Ｓ６５へ進む。一方、紐付け先ポインタが登録されていない場合（Ｎｏ）、処理を終了する（すなわち、ループＤによってＳ５１へ戻り、次のキュー順のタスク管理データの処理が行われる）。
【００８０】
Ｓ６５では、紐付けタスク実行部１１Ｇが、エンキュー部１１Ｃから渡されたタスク管理データの実行フラグを調査する。
Ｓ６６では、紐付けタスク実行部１１Ｇは、実行フラグがＯＦＦであるか否かを判定する。実行フラグがＯＦＦである場合（Ｙｅｓ）、紐付けタスク実行部１１Ｇは、エンキュー部１１Ｃから取得したタスク管理データにつき、Ｓ５３〜Ｓ６６の処理を行う。一方、
実行フラグがＯＮである場合（Ｎｏ）、処理を終了する（すなわち、ループＤによってＳ５１へ戻り、次のキュー順のタスク管理データの処理が行われる）。
【００８１】
＜３．４  第２実施形態による効果、変形例等＞
かかる第２実施形態によれば、第１実施形態に加え、同一機能のタスクの紐付け処理を行って連続実行することにより、同一のデータを参照する処理が連続実行される。このため、ＣＰＵにおけるキャッシュのヒット率が向上し、さらなる処理効率の向上を図ることができる。
【００８２】
なお、例えば、同一機能のタスクを連続実行する方法として、同一機能のタスクを一つのタスクキューにのみエンキューし、連続実行するという方法が考えられる。しかし、かかる方法では、各スレッドの処理量のバランスが崩れ、結果的にＣＰＵを効率的に使えなくなってしまうという問題がある。
【００８３】
これに対し、第２実施形態では、各スレッドに対応するキュー長が均等になるようにエンキューを行い、紐付けられたタスクの連続実行を分散的に行う。このため、各スレッドの処理量のバランスが崩れないというメリットがある。
【００８４】
例えば、図２３に示すように、スレッド＃１〜スレッド＃３の３つのスレッドが実行されている場合を想定する。そして、図２３に示す第１段階として、スレッド１のタスクキューには、タスクＡ＃１、Ｂ＃１、Ｃ＃１、Ａ＃２のタスクデータが存在しているとする。また、スレッド２のタスクキューに、タスクＡ＃３、Ｃ＃２、Ａ＃４、Ｂ＃２のタスクデータが存在しているとする。さらに、スレッド３のタスクキューには、Ｃ＃３、Ｄ＃２、Ａ＃５、Ｂ＃３のタスクデータが存在しているとする。このとき、タスクＡ＃１、Ａ＃２、Ａ＃３、Ａ＃４、Ａ＃５が紐付けされることとなるが、スレッド２は、タスクＡ＃３がキューの実行順になったときに、紐付けに関係なく、タスクＡ＃３を実行する。このように、Ａ＃３が実行済みとなった場合、図２３で第２段階に示すように、タスクＡ＃２からＡ＃３への紐付けが無効となる。一方で、スレッド２は、タスクＡ＃３を実行した後、続けてスレッド３のタスクキューのタスクＡ＃４を実行することになる。すなわち、各スレッドは、タスクの実行順がきたときには、そのタスクが他のタスクから紐付けられているか否かに関わらず実行する。このため、かりに紐付けられたタスクが多数となったとしても、特定のスレッドの処理量が著しく偏って増加するということはない。また、このように、スレッドがタスクキューの実行順に従ってタスクを実行した結果、一部の紐付けが無効になったとしても、当該実行したタスクの後にさらに他のタスクが紐付けられている場合には、そのタスクを実行したスレッドは、その紐付けをさらに辿ってタスクを連続実行していくこととなる。このため、このような第２実施形態によれば、特定のスレッドの処理量が著しく偏って増加することを防ぎつつも、同一機能のタスクの連続実行を確実に実現することができる。
【００８５】
［４．第３実施形態］
＜４．１  第３実施形態の概要＞
第３実施形態のメッセージ中継装置では、第２実施形態のメッセージ中継装置における同一機能のタスクの紐付け処理を、各タスクのエンキュー時に行う。なお、第３実施形態の説明においては、第１実施形態や第２実施形態と同じ部分について説明を適宜省略する。
【００８６】
＜４．２  メッセージ中継装置の機能構成＞
図２４は、第３実施形態に係るメッセージ中継装置の一例の機能ブロック図である。第３実施形態に係るメッセージ中継装置は、第２実施形態に係るメッセージ中継装置と異なり、タスク紐付け部１１Ｆが、エンキュー部１１Ｃと一体となり、エンキュー及びタスク
紐付け部１１Ｈとなっている。
【００８７】
エンキュー及びタスク紐付け部１１Ｈは、第２実施形態におけるエンキュー部１１Ｃの機能に加え、タスク管理データの紐付けを行う機能を有する。すなわち、エンキュー及びタスク紐付け部１１Ｈは、タスクキューのキュー長を調査し、最もキュー長の短いタスクキューにタスクをエンキューする。このとき、エンキュー及びタスク紐付け部１１Ｈは、エンキューを行うタスクのタスク管理データの紐付けを行う。なお、図２４及び以下の説明では、第２実施形態との相違を明確にするべく、エンキュー及びタスク紐付け部を１つの機能ブロックとして説明しているが、エンキューに続けてタスク紐付けを行う処理順序であれば、エンキュー部及びタスク紐付け部の別々の機能ブロックで実現してもよい。
【００８８】
図２５は、第３実施形態における紐付けタスク管理データ２７の一例を示す。第３実施形態では、タスクをエンキューするごとに、そのエンキュー対象のタスクについてのみ紐付けを行うため、少なくとも、調査済みタスクキュー内最終位置を管理する必要がない。このため、紐付けタスク管理データ２７は、図２５に示すように、紐付け対象となるタスクの関数、及び、紐付け済みの最終タスクを含んだデータとなっている。
【００８９】
＜４．３  メッセージ中継装置で実行される処理＞
次に、本実施形態に係るメッセージ中継装置１において実行される処理について説明する。
【００９０】
図２６は、各スレッドが実行する処理全体の流れの一例を示すフローチャートである。Ｓ７１及びＳ７２は、所定時間ごとに繰り返し実行される（ループＧ）。
Ｓ７１では、コネクション受付部１１Ａ、タスク生成部１１Ｂ並びにエンキュー及びタスク紐付け部１１Ｈが、コネクション受付処理を実行する。
【００９１】
さらに、Ｓ７２は、所定回数分だけ繰り返し実行される（ループＨ）。
Ｓ７２では、デキュー部１１Ｄ、タスク実行部１１Ｅ、タスク生成部１１Ｂ、エンキュー及びタスク紐付け部１１Ｈ並びに紐付けタスク実行部１１Ｇが、タスク実行処理を実行する。
【００９２】
コネクション受付処理及びタスク実行処理の内訳は、原則として第２実施形態と同様である（ただし、エンキュー部の代わりに、エンキュー及びタスク紐付け部１１Ｈが処理主体となる）。ただし、タスク実行処理のＳ６３においては、第２実施形態の処理に加え、エンキュー及びタスク紐付け部１１Ｈは、次の処理を行う。
【００９３】
すなわち、エンキュー及びタスク紐付け部１１Ｈは、第２実施形態と同様に、タスクキューテーブル２２を参照し、すべてのタスクキューのキュー長を調査する。そして、最もキュー長の短いタスクキューを選択し、選択したタスクキューに対して、タスク生成部１１Ｂが生成したタスクのエンキューを行う。
【００９４】
このとき、エンキュー及びタスク紐付け部１１Ｈは、さらに、紐付けタスク管理データ２７を参照し、紐付け対象タスクの関数のアドレスと、エンキュー対象のタスクのタスクデータに含まれる関数ポインタのアドレスとを比較する。両者が一致する場合には、エンキュー及びタスク紐付け部１１Ｈは、エンキュー対象のタスク管理データと、紐付けタスク管理データ２７の紐付け済みの最終タスクのタスク管理データとの紐付けを行う。ここで、エンキュー及びタスク紐付け部１１Ｈは、タスクの紐付けが完了すると、紐付けタスク管理データ２７の紐付け済みの最終タスクに、エンキュー対象のタスクをエンキューしたタスクキュー及びその設定アドレスを設定する。
【００９５】
＜４．４  第３実施形態による効果、変形例等＞
かかる第３実施形態によれば、各タスクのタスク管理データの紐付けが、タスクをエンキューするタイミングで行われる。このため、原則として、タスクキューにすでにエンキューされ、実行対象となり得るタスクにつき、より確実に紐付け済みの状態とすることができる。
【００９６】
なお、エンキュー及びタスク紐付け部１１Ｈは、コネクション受付処理の段階においても、エンキュー対象のタスクの紐付け処理を行ってもよい。
【００９７】
［５．その他］
本技術の適用対象として、前述した実施形態で記載したメッセージ中継装置は一例に過ぎない。本技術は、複数のスレッドが、それぞれに対応付けられたタスクキューにエンキューされたタスクを処理する情報処理装置であれば、いかなる情報処理装置にも適用することができる。
【００９８】
また、本明細書で説明した情報処理装置の機能的構成及び物理的構成は、上述の態様に限るものではなく、例えば、各機能や物理資源を統合して実装したり、逆に、さらに分散して実装したりすることも可能である。
【符号の説明】
【００９９】
１…メッセージ中継装置、２…クライアント、３…サーバ、１１，１２…スレッド、１１Ａ…コネクション受付部、１１Ｂ…タスク生成部、１１Ｃ…エンキュー部、１１Ｄ…デキュー部、１１Ｅ…タスク実行部、１１Ｆ…タスク紐付け部、１１Ｇ…紐付けタスク実行部、１１Ｈ…エンキュー及びタスク紐付け部、２１…タスク実行順定義、２２…タスクキューテーブル、２３…コネクション情報、２４…メッセージ情報、２５…識別ルール、２６…転送ルールテーブル、２７…紐付けタスク管理データ、３１，３２…タスクキュー
【図１】
0005672199.tif 000002
【図２】
0005672199.tif 000003
【図４】
0005672199.tif 000004
【図５】
0005672199.tif 000005
【図６】
0005672199.tif 000006
【図７】
0005672199.tif 000007
【図８】
0005672199.tif 000008
【図９】
0005672199.tif 000009
【図１０】
0005672199.tif 000010
【図１１】
0005672199.tif 000011
【図１２】
0005672199.tif 000012
【図１３】
0005672199.tif 000013
【図１４】
0005672199.tif 000014
【図１５】
0005672199.tif 000015
【図１７】
0005672199.tif 000016
【図１８】
0005672199.tif 000017
【図１９】
0005672199.tif 000018
【図２０】
0005672199.tif 000019
【図２１】
0005672199.tif 000020
【図２２】
0005672199.tif 000021
【図２３】
0005672199.tif 000022
【図２５】
0005672199.tif 000023
【図２６】
0005672199.tif 000024
【図３】
0005672199.tif 000025
【図１６】
0005672199.tif 000026
【図２４】
0005672199.tif 000027