自スレッドに対応付けられたタスクキューに蓄積されたタスクをそれぞれ処理する複数のスレッドを所定数並列実行させる情報処理装置において、前記複数のスレッドのそれぞれが、1つの処理要求に対する一連のプログラム処理が分割された複数のタスクのうちの1つのタスクを生成するタスク生成部と、前記複数のスレッドのうちいずれか1つに対応付けられたタスクキューを選択し、該選択したタスクキューに、前記タスク生成部により生成されたタスクをエンキューするエンキュー部と、自スレッドに対応付けられたタスクキューにエンキューされたタスクをデキューするデキュー部と、前記デキュー部によりデキューされたタスクを実行するタスク実行部とを備えた情報処理装置。前記エンキュー部は、最もキュー長が短いタスクキューを選択する請求項1記載の情報処理装置。前記複数のスレッドのそれぞれに対応付けられたタスクキューにエンキューされたタスクのうち、同一機能を有するタスク同士の紐付けを行うタスク紐付け部と、前記タスク実行部が実行したタスクに、次に実行するタスクが紐付けされているときには、該紐付けされたタスクを、前記タスク実行部が実行したタスクに連続させて実行する紐付けタスク実行部とを備えた請求項1又は2に記載の情報処理装置。前記タスク紐付け部は、前記エンキュー部によりタスクが新たにエンキューされたときに、該新たにエンキューされたタスクと、前記複数のスレッドのそれぞれに対応付けられたタスクキューにすでにエンキューされているタスクのうち、前記新たにエンキューされたタスクと同一機能を有するタスクとの紐付けを行う請求項3記載の情報処理装置。前記複数のスレッドの数が、情報処理装置のCPUコアの数と一致している請求項1~4のいずれか1つに記載の情報処理装置。自スレッドに対応付けられたタスクキューに蓄積されたタスクをそれぞれ処理する複数のスレッドを所定数並列実行させる情報処理装置において、前記複数のスレッドのそれぞれが、1つの処理要求に対する一連のプログラム処理が分割された複数のタスクのうちの1つのタスクを生成し、前記複数のスレッドのうちいずれか1つに対応付けられたタスクキューを選択し、該選択したタスクキューに、前記生成したタスクをエンキューし、自スレッドに対応付けられたタスクキューにエンキューされたタスクをデキューし、前記デキューしたタスクを実行する処理を実行する情報処理方法。自スレッドに対応付けられたタスクキューに蓄積されたタスクをそれぞれ処理する複数のスレッドを所定数並列実行させる情報処理装置において、前記複数のスレッドのそれぞれに、1つの処理要求に対する一連のプログラム処理が分割された複数のタスクのうちの1つのタスクを生成し、前記複数のスレッドのうちいずれか1つに対応付けられたタスクキューを選択し、該選択したタスクキューに、前記生成したタスクをエンキューし、自スレッドに対応付けられたタスクキューにエンキューされたタスクをデキューし、前記デキューしたタスクを実行する処理を実行させる情報処理プログラム。ところで、マルチスレッド方式においては、同時に起動したスレッド群は、OSOperatingSystemのスケジューリングによって順次実行機会を与えられることとなる。このとき、スレッドの数が増加すると、OSのスケジューリングによるスレッド切り換えの処理コストが増加するという問題がある。また、スレッドの生成及び廃棄処理が多発すると、さらにオーバーヘッドが増加してしまうという問題もある。このような状態が発生すると、情報処理装置の処理性能は低下する。そこで、本技術は、1つの側面において、マルチスレッド方式を適用した情報処理装置において、情報処理装置の処理性能を向上させることを目的とする。本技術における1つの側面では、自スレッドに対応付けられたタスクキューに蓄積されたタスクをそれぞれ処理する複数のスレッドを所定数並列実行させる情報処理装置において、複数のスレッドのそれぞれが、次の処理を実行する。すなわち、複数のスレッドのそれぞれは、1つの処理要求に対する一連のプログラム処理が分割された複数のタスクのうちの1つのタスクを生成する。さらに、複数のスレッドのうちいずれか1つに対応付けられたタスクキューを選択し、該選択したタスクキューに、生成したタスクをエンキューする。また、自スレッドに対応付けられたタスクキューにエンキューされたタスクをデキューし、デキューしたタスクを実行する。本技術における1つの側面によれば、マルチスレッド方式を適用した情報処理装置において、情報処理装置の処理性能を向上させることが可能となる。[1.実施形態の概要]本明細書で示す実施形態で説明する技術は、マルチスレッド方式を適用した情報処理装置において、プログラム処理を行う際の処理効率を向上させるものである。通常、情報処理装置においてマルチスレッド方式でプログラム処理を行う場合、OSOperatingSystemは、スケジューリングを行い、同時に起動されている各スレッドを順次実行する。かかるマルチスレッド方式では、スレッドの数が増加すると、OSのスケジューリングによるスレッド切り換えコンテキストスイッチの処理コストが増加するという問題がある。また、スレッドの生成及び廃棄処理が多発すると、さらにオーバーヘッドが増加してしまうという問題もある。そこで、本明細書で示す実施形態では、情報処理装置において、プログラム処理を実行する複数のスレッドを所定数並列実行常駐させておく。ここでいう所定数のスレッドの並列実行とは、少なくとも、スレッド切り替えをせずに、複数のプロセッサによってそれぞれスレッドを同時に実行することを含む。ここで、本明細書で示す実施形態では、プログラム処理を複数のタスクに分割する。そして、分割したタスクを、それぞれ、並列実行されているスレッドのうちの1つに対応付けられたタスクキューにエンキューし、逐次実行する。図1は、情報処理装置においてプログラム処理を実行するスレッドを並列実行させた状態の一例を示す説明図である。この例では、CPUCentralProcessingUnitで動作しているOS上で、プログラム処理を実行する複数のスレッドが並列実行されている。また、処理A、処理B及び処理Cの3つのプログラム処理が、それぞれ複数のタスクに分割されている。各スレッドには、それぞれ、処理A、処理B及び処理Cのプログラム処理が分割されたタスクのうち、いずれかのタスクがタスクキューにエンキューされて割当てられる。そして、各スレッドは、自身に割当てられたタスクを順次デキューして実行していく。なお、図1に示す例では、情報処理装置がCPUコアを複数有する構成であり、スレッドの数がCPUコアの数と一致しているが、本技術はかかる構成に限って適用されるものではない。このように、本明細書で示す実施形態で説明する技術では、プログラム処理を実行するスレッドが所定数並列実行されているため、スレッドの切り替えの発生や、スレッドの生成廃棄のオーバーヘッドを抑制させることが可能である。また、このとき、一連のプログラム処理を複数のタスクに分割して複数のスレッドのいずれかに振り分けてエンキューし、各スレッドが、それぞれ、エンキューされたタスクをデキューして実行する。このため、並列実行されているスレッドの一部に処理負荷が偏ることを防ぐことができ、プログラム処理によって遅延時間処理待ち時間に差が生じることを抑制することができる。したがって、一部のプログラム処理において著しい処理遅延が生じることを回避することができる。このように、本技術によれば、情報処理装置において、スレッドの切り替えの発生や、スレッドの生成廃棄のオーバーヘッドを抑制しつつ、プログラム処理を行う際の処理効率を向上させることが可能となる。[2.第1実施形態]第1実施形態では、前述の概要で説明した技術を、メッセージ中継装置に適用した例を用いて説明する。<2.1全体システム構成>図2は、第1実施形態に係るメッセージ中継装置を含んだ全体のシステム構成を示す。本システムでは、メッセージ中継装置1が、クライアント2及びサーバ3と通信可能にネットワーク接続されている。このネットワークは、例えばLANLocalAreaNetworkやWANWideAreaNetwork等であり、本実施形態では、少なくともTCPTransmissionControlProtocolプロトコルを用いた通信を実現する。メッセージ中継装置1、クライアント2及びサーバ3間のデータ通信のシーケンスは、次のとおりである。1クライアント2は、サーバ3で所定の処理を実行するためのリクエストメッセージを、メッセージ中継装置1に対して送信する。2メッセージ中継装置1は、クライアント2から受信したメッセージに含まれる情報から、当該メッセージの転送先のサーバ3を特定し、特定したサーバ3に対してリクエストメッセージを転送する。3サーバ3は、メッセージ中継装置1からリクエストメッセージを受信すると、所定の処理を実行する。そして、サーバ3は、クライアント2宛てのレスポンスメッセージを、メッセージ中継装置1に対して送信する。4メッセージ中継装置1は、サーバ3から受信したレスポンスメッセージを、リクエストメッセージの送信元のクライアント2に転送する。<2.2メッセージ中継装置の機能構成>図3は、メッセージ中継装置1の一例の機能ブロック図である。メッセージ中継装置1は、CPUによって実行されプログラム処理を行うスレッド11スレッド1及びスレッド12スレッド2を有している。スレッド11は、コネクション受付部11A、タスク生成部11B、エンキュー部11C、デキュー部11D、タスク実行部11Eを備える。また、図示を省略しているが、スレッド12もスレッド11と同様の構成要素を備えている。なお、本実施形態ではスレッドの数を2つとして説明するが、スレッドの数はいくつであってもよい。また、メッセージ中継装置1が備える記憶手段には、タスク実行順定義21、タスクキューテーブル22、コネクション情報23、メッセージ情報24、識別ルール25及び転送ルールテーブル26が格納される。なお、本明細書において記憶手段とは、メモリ等の揮発性記憶装置及びストレージ等の不揮発性記憶装置のいずれか一方又は両方を示す。まず、スレッド11スレッド12も同様が備える各機能について説明する。コネクション受付部11Aは、メッセージの通信におけるコネクションの受付処理を行う。タスク生成部11Bは、1つの処理要求に対する一連のプログラム処理が分割された複数のタスクのうちの1つのタスクを生成する。本実施形態のメッセージ中継装置1では、1つの処理要求に対する一連のプログラム処理とは、すなわち、クライアント2から1つのリクエストメッセージを受信したときにおける、クライアント2及びサーバ3間におけるメッセージの中継処理のことである。タスク生成部11Bは、コネクション受付部11Aがコネクションの受付処理を行ったとき、又は、タスク実行部11Eが1つのタスクの実行を終了したとき、タスク実行順定義21に従って、メッセージ中継処理における次のタスクを生成し、生成したタスクをエンキュー部11Cに渡す。エンキュー部11Cは、タスク生成部11Bが生成したタスクを、スレッド11のタスクキュー31又はスレッド12のタスクキュー32のいずれかにエンキューする。このとき、エンキュー部11Cは、メッセージ中継装置1が実行する全てのスレッドのタスクキューのキュー長を調査し、最もキュー長の短いタスクキューを選択する。そして、選択したタスクキューに、タスクをエンキューする。デキュー部11Dは、スレッド11に対応付けられたタスクキュー31にエンキューされたタスクをデキューし、デキューしたタスクをタスク実行部11Eに渡す。タスク実行部11Eは、デキューしたタスクを実行し、受信メッセージのメッセージ情報24及び後述するシーケンス番号をタスク生成部11Bに渡す。次に、記憶手段に格納される各種データについて説明する。タスク実行順定義21は、プログラム処理に含まれるタスクが、実行順のシーケンス番号とともに定義されたデータである。図4に示すタスク実行順定義の一例は、メッセージ中継処理に含まれるタスクの実行順を示している。本実施形態における各タスクの具体的内容については後述する。タスクキュー31は、スレッド11においてタスクを実行するために必要な情報が含まれたタスクデータが蓄積されるキューである。図5に示すタスクデータの一例は、メッセージ中継処理に含まれるタスクを実行するために必要な情報が含まれたタスクデータを示している。当該タスクデータは、タスクの処理を実行する関数を示す関数ポインタ、処理対象引数であるメッセージ情報24がメモリ上に格納されているアドレスを示すポインタを含む。そして、このタスクデータは、さらに、タスク実行順定義のうち、現在実行しているタスクを表すシーケンス番号換言すれば、当該タスクが何番目のタスクであり、次に実行するべきタスクが何番目のタスクであるかを特定する番号を含む。スレッド12に対応するタスクキュー32にも、同様のタスクデータが蓄積される。タスクキューテーブル22は、メッセージ中継装置1が実行している全てのスレッドに対応付けられたタスクキューの状態を管理するテーブルである。図6に示すタスクキューテーブル22の一例は、キュー番号、担当スレッド、readインデックス、writeインデックス、最大要素数及びキューの先頭アドレスのカラムを有する。キュー番号は、タスクキューを一意に特定する番号である。担当スレッドは、タスクキューに蓄積されたデータを処理するスレッドを示す。readインデックス及びwriteインデックスは、タスクキューにおける現在の読出位置のインデックス及び書込位置のインデックスを示す。最大要素数は、タスクキューに蓄積可能な処理要素数を示す。タスクキューの先頭アドレスは、メッセージ中継装置1の記憶手段上における各タスクキューの先頭アドレスを示す。コネクション情報23は、コネクション受付部11Aがコネクションを確立したときに生成する、コネクションを特定する情報である。図7に示すコネクション情報23の一例は、メッセージ受信時におけるソケットを識別する識別子、送信元IPアドレス、送信元ポート、宛先IPアドレス及び宛先ポートを含む。メッセージ情報24は、コネクション受付部11Aがコネクションを確立したときに生成する、メッセージ中継処理に必要な情報やメッセージ本体等に関連する情報である。図8Aに示すメッセージ情報24の一例は、メッセージのデータサイズ、受信コネクション情報のポインタ、送信コネクション情報のポインタ、メッセージデータ本体の先頭アドレス、ソケットを識別する識別子及びメッセージの宛先のIPアドレス及びポートを含む。なお、図8Bには、メッセージデータ本体の具体例を示している。この具体例では、メッセージデータは、レイヤ7プロトコルヘッダ例えば、HTTPHyperTextTransferProtocolヘッダと、メッセージコンテンツ例えば、SOAPSimpleObjectAccessProtocolエンベロープを含んでいる。識別ルール25は、メッセージデータ本体のメッセージコンテンツの内容のうち、識別子が記載されている箇所を特定するためのデータである。図9に示すメッセージ情報24の一例は、識別子抽出箇所及び抽出箇所の書式を含む。なお、図9の識別ルール25のデータ例は、図8Bに示したメッセージデータの例に対応している。すなわち、この識別ルール25は、メッセージコンテンツのうち、XMLEXtensibleMarkupLanguageタグのに、Xpath形式で識別子が記載されていることを示しており、図8Bのメッセージコンテンツにおいては、識別子はsipbobexamplecomである。転送ルールテーブル26は、メッセージデータの転送先となるサーバ3を特定する情報を有するテーブルである。図10に示す転送ルールテーブル26の一例は、識別子、及び、当該識別子で特定されるソケットで通信されるメッセージデータの転送先の宛先サーバのIPアドレスを含む。例えば、識別子がsipbobexamplecomである場合、宛先サーバのIPアドレスは、101010118080である。<2.3メッセージ中継装置のハードウェア構成>図11は、メッセージ中継装置1が具現化された情報処理装置のハードウェア構成の一例を示す。本情報処理装置は、プロセッサ901、メモリ902、ストレージ903、可搬記憶媒体駆動装置904、入出力装置905及び通信インタフェース906を備える。プロセッサ901は、制御ユニット、演算ユニット及び命令デコーダ等を含み、実行ユニットが、命令デコーダで解読されたプログラムの命令に従い、制御ユニットより出力される制御信号に応じ、演算ユニットを用いて算術論理演算を実行する。かかるプロセッサ901は、制御に用いる各種情報が格納される制御レジスタ、既にアクセスしたメモリ2等の内容を一時的に格納可能なキャッシュ、及び、仮想記憶のページテーブルのキャッシュとしての機能を果たすTLBを備える。なお、プロセッサ901は、CPUCentralProcessingUnitコアが複数設けられている構成でもよい。メモリ902は、例えばRAMRandomAccessMemory等の記憶装置であり、プロセッサ901で実行されるプログラムがロードされるとともに、プロセッサ901の処理に用いるデータが格納されるメインメモリである。また、ストレージ903は、例えばHDDHardDiskDriveやフラッシュメモリ等の記憶装置であり、プログラムや各種データが格納される。可搬記憶媒体駆動装置904は、可搬記憶媒体907に記憶されたデータやプログラムを読み出す装置である。可搬記憶媒体907は、例えば磁気ディスク、光ディスク、光磁気ディスク又はフラッシュメモリ等である。なお、プロセッサ901は、メモリ902やストレージ903と協働しつつ、ストレージ903や可搬記憶媒体907に格納されたプログラムを実行する。なお、プロセッサ901が実行するプログラムや、アクセス対象となるデータは、当該情報処理装置と通信可能な他の装置に格納されていてもよい。前述したメッセージ中継装置1の記憶手段は、メモリ902、ストレージ903及び可搬記憶媒体907の少なくともいずれか1つである。入出力装置905は例えばキーボード等やディスプレイ等であり、ユーザ操作等による動作命令を受け付ける一方、情報処理装置による処理結果を出力する。通信インタフェース906は例えばLANLocalAreaNetworkカード等であり、外部とのデータ通信を可能にする。前述した情報処理装置の各構成要素は、バス908で接続されている。なお、上述した各実施形態において、記憶装置に格納されたデータは、当該情報処理装置とは異なる他の装置に含まれる記憶装置に含まれていてもよい。この場合、当該情報処理装置と当該他の装置とが通信可能にネットワーク接続され、当該情報処理装置は、ネットワークを介して当該他の装置の記憶装置にアクセスすることとなる。<2.4タスク実行順定義の具体例>ここで、図4に示した、メッセージ中継処理におけるタスク実行順定義の一例につき、各タスクの具体的内容について説明する。タスク1リクエスト受信リクエスト受信タスクは、メッセージ情報24の受信コネクション情報に基づき、当該コネクションによって、クライアント2からリクエストメッセージを受信する。そして、受信したデータの先頭アドレスおよびデータサイズをメッセージ情報24に設定する。タスク2識別子抽出識別子抽出タスクは、識別ルール25を参照し、メッセージデータ本体から識別子を抽出するタスクである。このとき、識別子抽出タスクは、抽出した識別子をメッセージ情報24に設定する。タスク3宛先決定宛先決定タスクは、メッセージ情報24の識別子をキーとして転送ルールテーブル26を検索し、メッセージの宛先となるサーバ3を決定する。このとき、宛先決定タスクは、決定したサーバ3のIPアドレス及びポートを、メッセージ情報24の宛先IPアドレス及びポートに設定する。タスク4リクエスト送信リクエスト送信タスクは、メッセージ情報24の宛先IPアドレス及びポートに基づいて、サーバ3との間にコネクションを確立する。このとき、リクエスト送信タスクは、送信コネクション情報を生成し、メッセージ情報24に設定する。そして、リクエスト送信タスクは、送信コネクションを用いて、リクエストメッセージをサーバ3に送信する。タスク5レスポンス受信レスポンス受信タスクは、メッセージ情報24の送信コネクション情報に基づき、当該コネクションによって、サーバ3からレスポンスメッセージを受信する。なお、この段階では、メッセージ情報24のうち受信コネクション情報以外は一旦解放済みであるため、レスポンス受信タスクは、受信したデータの先頭アドレスおよびデータサイズをメッセージ情報24に設定する。タスク6レスポンス送信レスポンス送信タスクは、メッセージ情報24の受信コネクション情報に基づき、当該コネクションを用いて、サーバ3から受信したレスポンスメッセージをクライアント2に送信する。<2.5メッセージ中継装置で実行される処理>次に、本実施形態に係るメッセージ中継装置において実行される処理について説明する。図12は、各スレッドが実行する処理全体の流れの一例を示すフローチャートである。S1及びS2は、所定時間ごとに繰り返し実行されるループA。S1では、コネクション受付部11A、タスク生成部11B及びエンキュー部11Cが、コネクション受付処理を実行する。さらに、S2は、所定回数分だけ繰り返し実行されるループB。S2では、デキュー部11D、タスク実行部11E、タスク生成部11B及びエンキュー部11Cが、タスク実行処理を実行する。図13は、コネクション受付部11A、タスク生成部11B及びエンキュー部11Cが実行する、コネクション受付処理を示す。S11では、コネクション受付部11Aが、TCPコネクションの受付けを行う。S12では、コネクション受付部11Aは、TCPコネクションの受付けに成功したか否かを判定する。成功したときにはYes、S13に進む。このとき、コネクション受付部11Aは、コネクション情報23及びメッセージ情報24を生成し、メッセージ情報24をタスク生成部11Bに渡す。一方、成功しなかったときには、処理を終了する。S13では、タスク生成部11Bが、コネクション受付部11Aからメッセージ情報24を受信すると、タスク実行順定義21を参照して、先頭のタスクシーケンス番号が1のタスクを生成する。そして、生成したタスクをエンキュー部11Cに送信する。具体的には、タスク生成部11Bは、タスクデータを生成し、生成したタスクデータをエンキュー部11Cに渡す。S14では、エンキュー部11Cが、タスクキューテーブル22を参照し、すべてのスレッドに対応する各タスクキューのキュー長を調査する。そして、エンキュー部11Cは、最もキュー長の短いタスクキューを選択し、選択したタスクキューに対して、タスク生成部11Bが生成したタスクのエンキューを行う。なお、例えば、各タスクキューの状態が図6に示したタスクキューテーブル22のデータ例のようになっている場合、このエンキュー処理は次のようになる。すなわち、エンキュー部11Cは、最大1000個のタスクをエンキュー可能なタスクキュー311、タスクキュー322について、readインデックスおよびwriteインデックスの差分を調査する。すると、タスクキュー31は差が0であるためキュー長0となり、タスクキュー32は差が252であるためキュー長252となる。したがって、エンキュー部11Cは、タスクキュー31にタスクをエンキューすることになる。ここで、エンキュー部11Cは、タスクキュー31の先頭アドレスよりwriteインデックス分先のアドレスにタスクデータを格納し、writeインデックスを1つ増やす。なお、writeインデックスを1つ増やした結果、writeインデックスが最大要素数1000と等しくなった場合、エンキュー部11Cは、writeインデックスを0にする。図14は、デキュー部11D、タスク実行部11E、タスク生成部11B及びエンキュー部11Cが実行する、タスク実行処理を示す。S21では、デキュー部11Dが、タスクキュー31に蓄積されたタスクのデキューを行う。具体的には、デキュー部11Dは、タスクキューテーブル22を参照し、自スレッドに対応付けられたタスクキュー31のキュー長を調査する。このとき、タスクキューのキュー長が0より大きい場合、デキューが成功する一方、キュー長が0の場合、デキュー失敗となる。ここで、デキュー部11Dは、キュー先頭アドレスからreadインデックス分先のタスクデータに係るタスクのデキューを行う。また、デキュー部11Dは、デキューに成功すると、取得したタスクデータが登録されていた領域をクリアし、タスクキューテーブル22のreadインデックスを1つ増やす一方で、タスク実行部11Eにタスクを送信する。なお、デキュー部11Dは、readインデックスを1つ増やした結果、最大要素数と等しくなった場合、readインデックスを0にする。S22では、デキュー部11Dは、S21のデキューが成功したか否かを判定する。成功した場合Yes、S23に進む一方、失敗した場合No、デキュー失敗として処理を終了する。この場合、処理の終了とは、図12で示した全体処理におけるループBを抜けることを意味する。S23では、タスク実行部11Eが、デキュー部11Dによりデキューされたタスクの実行を行う。すなわち、タスク実行部11Eは、タスクデータに含まれる、メッセージ情報24のポインタを引数として、関数ポインタで特定された関数を実行する。例えば、デキューされたタスクが、図5に示したタスクデータに係るタスクである場合、タスク実行部11Eは、メッセージ情報24のポインタを引数として、リクエスト受信関数の関数ポインタを実行することになる。そして、タスク実行部11Eは、タスクの実行が終わると、タスクデータのシーケンス番号を1つ増やし、当該シーケンス番号とメッセージ情報24をタスク生成部11Bに渡す。S24では、タスク生成部11Bが、タスク実行部11Eより渡されたシーケンス番号に基づき、該当するシーケンス番号の処理のタスクを生成する。タスク生成部11Bは、生成したタスクをエンキュー部11Cに渡す。S25では、エンキュー部11Cが、タスクキューテーブル22を参照し、すべてのスレッドに対応する各タスクキューのキュー長を調査する。そして、最もキュー長の短いタスクキューを選択し、選択したタスクキューに対して、タスク生成部11Bが生成したタスクのエンキューを行う。<2.6第1実施形態による効果、変形例等>かかる第1実施形態によれば、スレッドが所定数並列実行されているため、スレッドの切り替えや、スレッドの生成廃棄のオーバーヘッドを低減させることが可能である。また、1つのプログラム処理を、タスク実行順定義に基づき複数のタスクに分割して各スレッドのタスクキューにエンキューし、各スレッドがそれぞれエンキューされたタスクをデキューして実行する。このため、並列実行されているスレッドの一部に処理負荷が偏ることを防ぐことができ、プログラム処理によって遅延時間に差が生じることを抑制することができる。したがって、一部のプログラム処理において特に大きな処理遅延が生じることを回避することができる。このように、第1実施形態で説明する技術によれば、スレッドの切り替えの発生や、スレッドの生成廃棄のオーバーヘッドを抑制しつつ、プログラム処理を行う際の処理効率を向上させることが可能となる。また、エンキュー先のタスクキューを、最もキュー長が短いキューにすることにより、各スレッドの処理負荷がさらに調整され、より効率的にCPUを利用することが可能となっている。ここで、スレッド数は、メッセージ中継装置1が備えるCPUコアの数に一致していてもよい。そうすることにより、CPUにおいてスレッドを切り替える処理コストをさらに削減することができる。なお、このメッセージ中継装置1におけるコネクション受付処理は、全てのスレッドにおいて実行するのではなく、例えば、一部の特定のスレッドのみが実行してもよい。[3.第2実施形態]<3.1第2実施形態の概要>第2実施形態のメッセージ中継装置では、第1実施形態のメッセージ中継装置における処理に加え、さらに、同一機能のタスクの紐付けを行い、同一機能のタスクを連続実行するようにする。一般に、同一機能のタスクは同一のデータを参照することが多いメッセージ中継処理のタスクの具体例で説明すると、例えば、宛先決定タスクは、いずれのスレッドで実行されるときにも、同一の転送ルールテーブルを参照する。このように、同一機能のタスクを連続実行することにより、CPUにおけるキャッシュのヒット率が向上する。このため、さらなる処理効率の向上を図ることができる。なお、第2実施形態の説明においては、第1実施形態と同じ部分について説明を適宜省略する。ここで、第2実施形態で実現する処理の具体例について、図15を参照しながら説明する。例えば、スレッド1及びスレッド2のタスクキューが、それぞれ図15に示す状態であるとする。具体的には、スレッド1のタスクキューには、タスクA1、B1、C1、A2のタスクデータが存在している。また、スレッド2のタスクキューには、タスクD1、C2、A3、B2のタスクデータが存在している。なお、タスクA、B、C、Dは、それぞれ同一機能のタスクのグループ具体的には、タスク実行順定義における各タスク例えば、図4の例におけるリクエスト受信、識別子抽出等を表しているものとする。このとき、第2実施形態では、同一機能のタスク同士を紐付けする。例えば、タスクAに着目すると、タスクA1、A2、A3を紐付けする。このとき、例えば、紐付け順として、タスクA1、A2、A3の順に紐付けがなされたものとする。この場合、第2実施形態では、スレッド1は、まずタスクA1を実行した後、次にタスクキューに蓄積されているタスクB1ではなく、タスクA1に紐付けされたタスクA2を実行する。さらに、スレッド1は、タスクA2を実行すると、さらにタスクA2に紐付けされた、スレッド2のタスクキューのタスクA3を実行する。このように、第2実施形態では、タスクに紐付けがなされているときには、同一機能のタスクを連続実行する。なお、一方で、紐付けがなされていないときには、通常通り、タスクキューに蓄積されたタスクを順次実行することとなる。例えば、図15の例において、スレッド2は、タスクD1から順次タスクを実行していく。このとき、例えばすでにタスクA3がスレッド1により実行済みであった場合には、スレッド2は、タスクC2の次に、タスクB2を実行することとなる。<3.2メッセージ中継装置の機能構成>図16は、第2実施形態に係るメッセージ中継装置の一例の機能ブロック図である。第2実施形態に係るメッセージ中継装置は、第1実施形態に係るメッセージ中継装置に加え、スレッドが、タスク紐付け部11F及び紐付けタスク実行部11Gを備える。さらに、第2実施形態に係るメッセージ中継装置1は、記憶手段において、紐付けタスク管理データ27を備える。また、タスクキューにおいては、タスクデータをラッピングするタスク管理データを備える。タスク紐付け部11Fは、同一機能のタスクの紐付けを行う。紐付けタスク実行部11Gは、紐付けられたタスクを辿りながら、同一機能のタスクの連続実行を行う。紐付けタスク管理データ27は、同一機能のタスクごとに、タスクキューに蓄積されたタスクをどこまで紐付けしたかを管理するためのデータである。図17に示す紐付けタスク管理データの一例は、同一機能である紐付け対象のタスクすなわち、タスク実行順定義で定義されたタスクごとの関数、紐付け済みの最終タスク及び調査済タスクのタスクキュー内最終位置を含む。紐付け済みの最終タスクは、当該タスクのメモリ上のアドレスと、どのスレッドのタスクキューに属しているかを示す情報を含む。また、調査済タスクとは、紐付けできるか否かの調査が済んでいるタスクのことである。調査済タスクのタスクキュー内最終位置は、タスクキューごとにそれぞれ保持される。図18は、タスクキュー、タスク管理データ及びタスクデータの関係について示す説明図である。タスクキューには、タスク管理データによってラッピングされたタスクデータが蓄積されている。より具体的に説明すると、タスクキューには、タスク管理データへのポインタが蓄積されている。タスク管理データは、タスクを実行してよいか否かを示す実行フラグ、タスクデータへのポインタ、紐付け先ポインタ及び紐付け元ポインタを含んでいる。紐付け先ポインタとは、自タスクの次に実行するタスクのタスク管理データへのポインタであり、紐付け元ポインタとは、自タスクの前に実行するタスクのタスク管理データへのポインタである。タスクデータ自体の構造は、図5に示した構造と同じであるため、説明を省略する。<3.3メッセージ中継装置で実行される処理>次に、本実施形態に係るメッセージ中継装置1において実行される処理について説明する。図19は、各スレッドが実行する処理全体の流れの一例を示すフローチャートである。S31、S32及びS33は、所定時間ごとに繰り返し実行されるループC。S31では、コネクション受付部11A、タスク生成部11B及びエンキュー部11Cが、コネクション受付処理を実行する。さらに、S32は、所定回数分だけ繰り返し実行されるループD。S32では、デキュー部11D、タスク実行部11E、タスク生成部11B、エンキュー部11C及び紐付けタスク実行部11Gが、タスク実行処理を実行する。S33では、タスク紐付け部11Fが、タスク紐付け処理を実行する。図20は、タスク紐付け部11Fが実行する、タスク紐付け処理を示す。S41では、タスク紐付け部11Fは、紐付けタスク管理データ27より、紐付け対象のタスクの関数、紐付け済みの最終タスク及び調査済みタスクのタスクキュー内最終位置を読み出す。S42~S45は、各タスクキューにつきそれぞれ実行されループE、かつ、各タスクキューの未調査のタスク数だけ繰り返し実行されるループF。S42では、タスク紐付け部11Fは、現在調査中のタスクキューの、調査済みタスクのキュー内最終位置の次にあるタスク管理データを取得する。S43では、タスク紐付け部11Fは、取得したタスク管理データからタスクデータを取得する。S44では、タスク紐付け部11Fは、紐付けタスク管理データ27の紐付け対象タスクの関数のアドレスと、取得したタスクデータに含まれる関数ポインタのアドレスとを比較する。両者が一致する場合にはYes、S45に進み、一致しない場合にはNo、S46へ進む。S45では、タスク紐付け部11Fは、取得したタスク管理データと、紐付け済みの最終タスクのタスク管理データとの紐付けを行う。具体的には、タスク紐付け部11Fは、紐付けタスク管理データ27の紐付け済みの最終タスクのタスク管理データの紐付け先ポインタに、タスク管理データのアドレスを設定する一方、取得したタスク管理データの紐付け元ポインタに、紐付けタスク管理データ27の紐付け済みの最終タスクのタスク管理データのアドレスを設定する。こうすることで、双方向リンクを作成することができる。ここで、タスク紐付け部11Fは、タスクの紐付けが完了すると、紐付けタスク管理データ27の紐付け済みの最終タスクに、取得したタスク管理データのタスクがエンキューされているタスクキュー及びその設定アドレスを設定する。S45では、タスク紐付け部11Fは、紐付けタスク管理データ27の調査済みタスクを、S42で取得したタスク管理データのインデックスで更新する。コネクション受付処理については、第1実施形態と同様であるため、説明を省略する。図21及び図22は、デキュー部11D、タスク実行部11E、タスク生成部11B、エンキュー部11C及び紐付けタスク実行部11Gが実行する、タスク実行処理を示す。S51では、デキュー部11Dが、タスクキュー31に蓄積されたタスク管理データを取得する。具体的には、デキュー部11Dは、タスクキューテーブル22を参照し、自スレッドが担当するタスクキュー31のキュー長を調査する。このとき、タスクキューのキュー長が0より大きく、かつ、取得したタスク管理データの実行フラグがOFFであるときに、タスク管理データの取得が成功するものとする。一方、タスクキューのキュー長が0であるときには、タスク管理データの取得は失敗である。なお、タスクキューのキュー長が0より大きいとしても、実行フラグがONであるときには、デキュー部11Dは、当該タスク管理データをスキップし、次のインデックスのタスク管理データの調査を行う。S52では、デキュー部11Dは、S51のタスク管理データの取得が成功したか否かを判定する。成功した場合Yes、S53に進む一方、失敗した場合No、処理を終了する。この場合、処理の終了とは、図19で示した全体処理におけるループDを抜けることを意味する。S53では、デキュー部11Dは、取得したタスク管理データの実行フラグをONに変更する。S54では、デキュー部11Dは、取得したタスク管理データの紐付け元ポインタを調査する。S55では、デキュー部11Dは、紐付け元ポインタにアドレスが登録されているか否かを判定する。アドレスが登録されている場合にはYes、S56に進み、アドレスが登録されていない場合はNo、S57に進む。S56では、デキュー部11Dは、紐付け元ポインタが指すアドレスのタスク管理データの紐付け先ポインタをクリアする。S57では、デキュー部11Dは、取得したタスク管理データの紐付け先ポインタを調査する。S58では、デキュー部11Dは、紐付け先ポインタにアドレスが登録されているか否かを判定する。アドレスが登録されている場合はYes、S59に進み、アドレスが登録されていない場合はNo、S60に進む。S59では、デキュー部11Dは、取得したタスク管理データの紐付け先ポインタが指すアドレスのタスク管理データの紐付け元ポインタをクリアする。S60では、デキュー部11Dは、取得したタスク管理データのタスクデータに係るタスクのデキューを行う。デキュー部11Dは、デキューに成功すると、取得したタスク管理データが登録されていた領域をクリアし、readインデックスを増やす一方で、タスク実行部11Eにタスクを送信する。なお、デキュー部11Dは、readインデックスを増やした結果、最大要素数と等しくなった場合、readインデックスを0にする。S61では、タスク実行部11Eが、デキュー部11Dによりデキューされたタスクの実行を行う。すなわち、タスク実行部11Eは、タスクデータに含まれる、メッセージ情報24のポインタを引数として、関数ポインタで特定された関数を実行する。そして、タスク実行部11Eは、タスクの実行が終わると、タスクデータのシーケンス番号を1つ増やし、当該シーケンス番号及びメッセージ情報24、並びに、当該タスクデータに対応するタスク管理データをタスク生成部11Bに渡す。S62では、タスク生成部11Bが、タスク実行部11Eより渡されたシーケンス番号に基づいてタスクを生成する。具体的には、タスク生成部11Bは、該当するシーケンス番号のタスクの処理を行う関数のアドレスを設定したタスクデータを生成するとともに、当該タスクデータに対応するタスク管理データを生成する。タスク生成部11Bは、生成したタスク管理データ、及び、タスク実行部11Eから渡されたタスク管理データをエンキュー部11Cに渡す。S63では、エンキュー部11Cが、タスクキューテーブル22を参照し、すべてのタスクキューのキュー長を調査する。そして、最もキュー長の短いタスクキューを選択し、選択したタスクキューに対して、タスク生成部11Bが生成したタスクのエンキューを行う。S64では、エンキュー部11Cは、タスク実行部11Eから渡されたタスク管理データを調査し、実行したタスクが登録されているタスク管理データに紐付け先ポインタが登録されているか否かを判定する。紐付け先ポインタが登録されている場合Yes、エンキュー部11Cは、紐付けタスク実行部11Gに、紐付け先ポインタが指すタスク管理データを渡し、S65へ進む。一方、紐付け先ポインタが登録されていない場合No、処理を終了するすなわち、ループDによってS51へ戻り、次のキュー順のタスク管理データの処理が行われる。S65では、紐付けタスク実行部11Gが、エンキュー部11Cから渡されたタスク管理データの実行フラグを調査する。S66では、紐付けタスク実行部11Gは、実行フラグがOFFであるか否かを判定する。実行フラグがOFFである場合Yes、紐付けタスク実行部11Gは、エンキュー部11Cから取得したタスク管理データにつき、S53~S66の処理を行う。一方、実行フラグがONである場合No、処理を終了するすなわち、ループDによってS51へ戻り、次のキュー順のタスク管理データの処理が行われる。<3.4第2実施形態による効果、変形例等>かかる第2実施形態によれば、第1実施形態に加え、同一機能のタスクの紐付け処理を行って連続実行することにより、同一のデータを参照する処理が連続実行される。このため、CPUにおけるキャッシュのヒット率が向上し、さらなる処理効率の向上を図ることができる。なお、例えば、同一機能のタスクを連続実行する方法として、同一機能のタスクを一つのタスクキューにのみエンキューし、連続実行するという方法が考えられる。しかし、かかる方法では、各スレッドの処理量のバランスが崩れ、結果的にCPUを効率的に使えなくなってしまうという問題がある。これに対し、第2実施形態では、各スレッドに対応するキュー長が均等になるようにエンキューを行い、紐付けられたタスクの連続実行を分散的に行う。このため、各スレッドの処理量のバランスが崩れないというメリットがある。例えば、図23に示すように、スレッド1~スレッド3の3つのスレッドが実行されている場合を想定する。そして、図23に示す第1段階として、スレッド1のタスクキューには、タスクA1、B1、C1、A2のタスクデータが存在しているとする。また、スレッド2のタスクキューに、タスクA3、C2、A4、B2のタスクデータが存在しているとする。さらに、スレッド3のタスクキューには、C3、D2、A5、B3のタスクデータが存在しているとする。このとき、タスクA1、A2、A3、A4、A5が紐付けされることとなるが、スレッド2は、タスクA3がキューの実行順になったときに、紐付けに関係なく、タスクA3を実行する。このように、A3が実行済みとなった場合、図23で第2段階に示すように、タスクA2からA3への紐付けが無効となる。一方で、スレッド2は、タスクA3を実行した後、続けてスレッド3のタスクキューのタスクA4を実行することになる。すなわち、各スレッドは、タスクの実行順がきたときには、そのタスクが他のタスクから紐付けられているか否かに関わらず実行する。このため、かりに紐付けられたタスクが多数となったとしても、特定のスレッドの処理量が著しく偏って増加するということはない。また、このように、スレッドがタスクキューの実行順に従ってタスクを実行した結果、一部の紐付けが無効になったとしても、当該実行したタスクの後にさらに他のタスクが紐付けられている場合には、そのタスクを実行したスレッドは、その紐付けをさらに辿ってタスクを連続実行していくこととなる。このため、このような第2実施形態によれば、特定のスレッドの処理量が著しく偏って増加することを防ぎつつも、同一機能のタスクの連続実行を確実に実現することができる。[4.第3実施形態]<4.1第3実施形態の概要>第3実施形態のメッセージ中継装置では、第2実施形態のメッセージ中継装置における同一機能のタスクの紐付け処理を、各タスクのエンキュー時に行う。なお、第3実施形態の説明においては、第1実施形態や第2実施形態と同じ部分について説明を適宜省略する。<4.2メッセージ中継装置の機能構成>図24は、第3実施形態に係るメッセージ中継装置の一例の機能ブロック図である。第3実施形態に係るメッセージ中継装置は、第2実施形態に係るメッセージ中継装置と異なり、タスク紐付け部11Fが、エンキュー部11Cと一体となり、エンキュー及びタスク紐付け部11Hとなっている。エンキュー及びタスク紐付け部11Hは、第2実施形態におけるエンキュー部11Cの機能に加え、タスク管理データの紐付けを行う機能を有する。すなわち、エンキュー及びタスク紐付け部11Hは、タスクキューのキュー長を調査し、最もキュー長の短いタスクキューにタスクをエンキューする。このとき、エンキュー及びタスク紐付け部11Hは、エンキューを行うタスクのタスク管理データの紐付けを行う。なお、図24及び以下の説明では、第2実施形態との相違を明確にするべく、エンキュー及びタスク紐付け部を1つの機能ブロックとして説明しているが、エンキューに続けてタスク紐付けを行う処理順序であれば、エンキュー部及びタスク紐付け部の別々の機能ブロックで実現してもよい。図25は、第3実施形態における紐付けタスク管理データ27の一例を示す。第3実施形態では、タスクをエンキューするごとに、そのエンキュー対象のタスクについてのみ紐付けを行うため、少なくとも、調査済みタスクキュー内最終位置を管理する必要がない。このため、紐付けタスク管理データ27は、図25に示すように、紐付け対象となるタスクの関数、及び、紐付け済みの最終タスクを含んだデータとなっている。<4.3メッセージ中継装置で実行される処理>次に、本実施形態に係るメッセージ中継装置1において実行される処理について説明する。図26は、各スレッドが実行する処理全体の流れの一例を示すフローチャートである。S71及びS72は、所定時間ごとに繰り返し実行されるループG。S71では、コネクション受付部11A、タスク生成部11B並びにエンキュー及びタスク紐付け部11Hが、コネクション受付処理を実行する。さらに、S72は、所定回数分だけ繰り返し実行されるループH。S72では、デキュー部11D、タスク実行部11E、タスク生成部11B、エンキュー及びタスク紐付け部11H並びに紐付けタスク実行部11Gが、タスク実行処理を実行する。コネクション受付処理及びタスク実行処理の内訳は、原則として第2実施形態と同様であるただし、エンキュー部の代わりに、エンキュー及びタスク紐付け部11Hが処理主体となる。ただし、タスク実行処理のS63においては、第2実施形態の処理に加え、エンキュー及びタスク紐付け部11Hは、次の処理を行う。すなわち、エンキュー及びタスク紐付け部11Hは、第2実施形態と同様に、タスクキューテーブル22を参照し、すべてのタスクキューのキュー長を調査する。そして、最もキュー長の短いタスクキューを選択し、選択したタスクキューに対して、タスク生成部11Bが生成したタスクのエンキューを行う。このとき、エンキュー及びタスク紐付け部11Hは、さらに、紐付けタスク管理データ27を参照し、紐付け対象タスクの関数のアドレスと、エンキュー対象のタスクのタスクデータに含まれる関数ポインタのアドレスとを比較する。両者が一致する場合には、エンキュー及びタスク紐付け部11Hは、エンキュー対象のタスク管理データと、紐付けタスク管理データ27の紐付け済みの最終タスクのタスク管理データとの紐付けを行う。ここで、エンキュー及びタスク紐付け部11Hは、タスクの紐付けが完了すると、紐付けタスク管理データ27の紐付け済みの最終タスクに、エンキュー対象のタスクをエンキューしたタスクキュー及びその設定アドレスを設定する。<4.4第3実施形態による効果、変形例等>かかる第3実施形態によれば、各タスクのタスク管理データの紐付けが、タスクをエンキューするタイミングで行われる。このため、原則として、タスクキューにすでにエンキューされ、実行対象となり得るタスクにつき、より確実に紐付け済みの状態とすることができる。なお、エンキュー及びタスク紐付け部11Hは、コネクション受付処理の段階においても、エンキュー対象のタスクの紐付け処理を行ってもよい。[5.その他]本技術の適用対象として、前述した実施形態で記載したメッセージ中継装置は一例に過ぎない。本技術は、複数のスレッドが、それぞれに対応付けられたタスクキューにエンキューされたタスクを処理する情報処理装置であれば、いかなる情報処理装置にも適用することができる。また、本明細書で説明した情報処理装置の機能的構成及び物理的構成は、上述の態様に限るものではなく、例えば、各機能や物理資源を統合して実装したり、逆に、さらに分散して実装したりすることも可能である。