(57)【特許請求の範囲】
【請求項１】
送信すべき１又は複数のメッセージを格納するバッファと、
前記バッファからメッセージを取り出し、取り出した当該メッセージを送信する処理を各々が実行する１又は複数の通信部と、
前記バッファに格納されているメッセージの数が、前記通信部の数より多いか判定し、前記バッファに格納されているメッセージの数が前記通信部の数より多い場合に、前記バッファに格納されているメッセージのうち、前記バッファから取り出される順番が前記通信部の数＋１番目以降のメッセージであって、新たに生成されたメッセージと宛先が同じであるメッセージを特定し、特定された前記メッセージと前記新たに生成されたメッセージとを統合する実行部と、
を有する情報処理装置。
【請求項２】
前記実行部は、
前記バッファに格納されているメッセージの数が前記通信部の数以下である場合に、前記メッセージを特定する処理を行わない
請求項１記載の情報処理装置。
【請求項３】
前記バッファは複数の領域を有し、
前記実行部は、
宛先が異なる２以上のメッセージが１の領域に格納されないように前記バッファに格納されているメッセージを前記複数の領域に分類する
請求項１又は２記載の情報処理装置。
【請求項４】
宛先の識別情報に対応付けて、当該宛先に送信すべきメッセージが格納された領域を特定するための情報と当該領域の空容量の情報とを格納する管理データ格納部
をさらに有し、
前記実行部は、
前記管理データ格納部を用いて、前記新たに生成されたメッセージのデータ量が、前記新たに生成されたメッセージの宛先に送信すべき他のメッセージが格納された領域である第１の領域の空容量より多いか判定し、
前記新たに生成されたメッセージのデータ量が前記第１の領域の空容量以下であり且つ前記他のメッセージが前記バッファから取り出される順番が前記通信部の数＋１番目以降のメッセージである場合に、前記他のメッセージを特定する
請求項３記載の情報処理装置。
【請求項５】
前記実行部は、
前記新たに生成されたメッセージのデータ量が前記第１の領域の空容量より多く且つ前記他のメッセージが前記バッファから取り出される順番が前記通信部の数＋１番目以降のメッセージである場合に、前記第１の領域の空容量が無くなるように、前記新たに生成されたメッセージの一部を前記第１の領域に格納し、
前記複数の領域のうちメッセージが格納されていない領域である第２の領域に、前記新たに生成されたメッセージのうち前記第１の領域に格納された部分以外の部分を格納する
請求項４記載の情報処理装置。
【請求項６】
前記管理データ格納部に格納されている、前記宛先に送信すべきメッセージが格納された領域を特定するための情報は、当該宛先に送信すべきメッセージのうち前記バッファに格納された時点が最も後であるメッセージが格納された領域を特定するための情報である
請求項４又は５記載の情報処理装置。
【請求項７】
前記複数の領域の各々に格納される１又は複数のメッセージの総データ量は、前記複数の通信部の各々が一度に送信できるデータ量以下である
請求項３乃至６のいずれか１つ記載の情報処理装置。
【請求項８】
送信すべき１又は複数のメッセージを格納するバッファに格納されているメッセージの数が、前記バッファからメッセージを取り出し且つ取り出した当該メッセージを送信する処理を実行する通信部の数より多いか判定し、
前記バッファに格納されているメッセージの数が前記通信部の数より多い場合に、前記バッファに格納されているメッセージのうち、前記バッファから取り出される順番が前記通信部の数＋１番目以降のメッセージであって、新たに生成されたメッセージと宛先が同じであるメッセージを特定し、
特定された前記メッセージと前記新たに生成されたメッセージとを統合する
処理を、コンピュータが実行する通信制御方法。
【請求項９】
送信すべき１又は複数のメッセージを格納するバッファに格納されているメッセージの数が、前記バッファからメッセージを取り出し且つ取り出した当該メッセージを送信する処理を実行する通信部の数より多いか判定し、
前記バッファに格納されているメッセージの数が前記通信部の数より多い場合に、前記バッファに格納されているメッセージのうち、前記バッファから取り出される順番が前記通信部の数＋１番目以降のメッセージであって、新たに生成されたメッセージと宛先が同じであるメッセージを特定し、
特定された前記メッセージと前記新たに生成されたメッセージとを統合する
処理を、コンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、サーバの通信制御技術に関する。
【背景技術】
【０００２】
ミッションクリティカルなオンラインシステム（例えば、株式の取引或いは外国為替証拠金取引等のオンラインシステム）は、システムの安定稼動に重要な信頼性及び可用性を備えるだけでなく、利用者端末が処理要求を送信してから処理結果を受信するまでの応答時間が可能な限り短くなるように構築される。また、或る特定の期間に取引が集中するような事態に対処するため、多数の処理要求を同時並行で処理することができるスループットを備えるように構築される。
【０００３】
サーバが実行する処理に関して、或る文献は以下のような技術を開示している。具体的には、受信した処理要求に基づきサーバが処理を実行し、処理結果であるメッセージを宛先毎に用意されたキューに分類する。そして、サーバは、キューに格納されたメッセージの数が所定の数以上になった場合に、キューに格納された複数のメッセージをまとめ、処理要求の送信元の装置に送信する。又は、サーバは、メッセージがキューに格納されてから所定の時間が経過すると、キューに格納された複数のメッセージをまとめ、処理要求の送信元の装置に送信する。このように、宛先が同じである複数のメッセージをまとめて送信することで、ネットワークのトラフィック量が減らすことができ、また、サーバの処理負荷を減らすことができる。
【０００４】
但し、上記の文献の技術を用いると、送信の回数を減らすことができても、応答時間が長くなってしまう場合が生じる。例えばサーバが受信する処理要求の数が比較的少ない場合、キューに処理結果が蓄積されにくい。従って、キューに格納された処理結果は、サーバの処理負荷が比較的少ないのにもかかわらず、所定の時間が経過するまでは送信されない場合が生じる。また、処理結果の宛先に偏りが無い場合にも、キューに処理結果が蓄積されにくい。すなわち、上記の文献の技術は、処理結果を統合することで応答性能を劣化させてしまう場合がある。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００６−３１２３８号公報
【特許文献２】特開平５−１６０８５５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
従って、本発明の目的は、１つの側面では、処理結果を統合する処理が原因で応答性能が劣化するのを抑制するための技術を提供することである。
【課題を解決するための手段】
【０００７】
本発明に係る情報処理装置は、送信すべき１又は複数のメッセージを格納するバッファと、バッファからメッセージを取り出し、取り出した当該メッセージを送信する処理を各々が実行する１又は複数の通信部と、バッファに格納されているメッセージの数と通信部の数との比較結果に基づき、バッファに格納されているメッセージの中から、宛先が同じである２以上のメッセージを統合する処理である統合処理の対象であるメッセージを特定し、特定された当該メッセージについて統合処理を実行する実行部とを有する。
【発明の効果】
【０００８】
１つの側面では、処理結果を統合する処理が原因で応答性能が劣化するのを抑制できるようになる。
【図面の簡単な説明】
【０００９】
【図１】図１は、本実施の形態の概要を説明するための図である。
【図２】図２は、本実施の形態の概要を説明するための図である。
【図３】図３は、本実施の形態の概要を説明するための図である。
【図４】図４は、本実施の形態の概要を説明するための図である。
【図５】図５は、本実施の形態の概要を説明するための図である。
【図６】図６は、本実施の形態の概要を説明するための図である。
【図７】図７は、本実施の形態のシステム概要を示す図である。
【図８】図８は、サーバの機能ブロック図である。
【図９】図９は、クライアント端末の機能ブロック図である。
【図１０】図１０は、サーバの定義ファイル格納部に格納されるデータの一例を示す図である。
【図１１】図１１は、クライアント端末の定義ファイル格納部に格納されるデータの一例を示す図である。
【図１２】図１２は、初期化処理の処理フローを示す図である。
【図１３】図１３は、サーバの管理テーブルの一例を示す図である。
【図１４】図１４は、生成されるセマフォの一例を示す図である。
【図１５】図１５は、コマンド受付処理の処理フローを示す図である。
【図１６】図１６は、受信処理の処理フローを示す図である。
【図１７】図１７は、処理要求の一例を示す図である。
【図１８】図１８は、サーバの要求管理テーブルに格納されるデータの一例を示す図である。
【図１９】図１９は、受信処理の処理フローを示す図である。
【図２０】図２０は、受信処理の処理フローを示す図である。
【図２１】図２１は、処理要求格納部に格納されるデータの一例を示す図である。
【図２２】図２２は、受信処理の処理フローを示す図である。
【図２３】図２３は、データ処理の処理フローを示す図である。
【図２４】図２４は、データ処理の処理フローを示す図である。
【図２５】図２５は、データ処理の処理フローを示す図である。
【図２６】図２６は、データ処理の処理フローを示す図である。
【図２７】図２７は、結果管理テーブルに格納されるデータの一例を示す図である。
【図２８】図２８は、データ処理の処理フローを示す図である。
【図２９】図２９は、データ処理の処理フローを示す図である。
【図３０】図３０は、データ処理の処理フローを示す図である。
【図３１】図３１は、データ処理の処理フローを示す図である。
【図３２】図３２は、データ処理の処理フローを示す図である。
【図３３】図３３は、処理結果格納部に格納されるデータの一例を示す図である。
【図３４】図３４は、データ処理の処理フローを示す図である。
【図３５】図３５は、データ処理の処理フローを示す図である。
【図３６】図３６は、データ処理の処理フローを示す図である。
【図３７】図３７は、データ処理の処理フローを示す図である。
【図３８】図３８は、データ処理の処理フローを示す図である。
【図３９】図３９は、送信処理の処理フローを示す図である。
【図４０】図４０は、送信処理の処理フローを示す図である。
【図４１】図４１は、処理結果の一例を示す図である。
【図４２】図４２は、送信処理の処理フローを示す図である。
【図４３】図４３は、クライアント端末が実行する処理の処理フローを示す図である。
【図４４】図４４は、クライアント端末の管理テーブルに格納されるデータの一例を示す図である。
【図４５】図４５は、クライアント端末の要求管理テーブルに格納されるデータの一例を示す図である。
【図４６】図４６は、クライアント端末が実行する処理の処理フローを示す図である。
【図４７】図４７は、コンピュータの機能ブロック図である。
【発明を実施するための形態】
【００１０】
図１乃至図６を用いて、本実施の形態の概要について説明する。
【００１１】
例えば図１に示すような状況を考える。図１においては、サーバがバッファ１０００を有しており、サーバにおいては送信処理用スレッド１００１及び１００２が実行される。送信処理用スレッド１００１及び１００２は、バッファ１０００から処理結果を取り出して送信する。実線で描かれた丸の図形は処理結果を表し、丸の内側にある文字列は宛先及びその宛先に送信される処理結果の番号を表す。例えば処理結果Ｒ１は、宛先Ａに送信される１番目の処理結果であり、全体では１番目の処理結果である。太線で描かれた丸の図形は、複数の処理結果が統合されて１つの処理結果になったことを表す。例えば処理結果Ｒ４は、宛先Ｂに送信される２番目の処理結果及び３番目の処理結果を含み、全体では４番目の処理結果である。バッファ１０００は５つの領域に分けられている。図１において左の領域にある処理結果ほど先に送信される。
【００１２】
本実施の形態においては、処理結果の数Ｘと、送信処理用スレッドの数Ｙとの比較結果に基づき、宛先が同じである複数の処理結果を統合する処理（以下、統合処理と呼ぶ）の対象になる処理結果を特定する。例えば図１においては、送信処理用スレッドの数Ｙは２である。統合された複数の処理結果は１つの処理結果としてカウントされるので、処理結果の数Ｘは５である。このように処理結果の数が送信処理用スレッドの数より多い場合には、（Ｙ＋１）番目以降の処理結果が統合処理の対象になり、それ以外の処理結果は統合処理の対象から除外される。図１においては、処理結果Ｒ３、Ｒ４及びＲ５が統合処理の対象になり、処理結果Ｒ１及びＲ２は統合処理の対象から除外される。このようにすれば、処理結果に対して統合処理を実行していることが原因で処理結果の送信を待たなければならなくなる可能性が低い。
【００１３】
また、本実施の形態においては、図２に示すようなデータをバッファ１０００とは別に管理する。図２においては、宛先の識別情報と、最終番号と、空領域のサイズとが管理されている。最終番号とは、或る宛先についての処理結果の番号のうち最も大きい番号である。例えば図１の例では、宛先Ａについての複数の処理結果（処理結果Ｒ１及びＲ３）のうち処理結果Ｒ３の番号が最も大きいので、最終番号は３である。空領域のサイズは、最終番号についての処理結果が格納された領域の空領域のサイズである。例えば図１の例では、処理結果Ｒ３が格納された領域の空領域のサイズは０である。本実施の形態においては、（Ｙ＋１）番目以降の処理結果のうち、最終番号についての処理結果を統合処理の対象にすることにする。これにより、空領域を探すためにバッファ１０００をチェックすることが無くなり、送信処理用スレッド１００１及び１００２がバッファ１０００の排他を獲得するために待つことを抑制できる。
【００１４】
そこで、例えば図３に示すように、新たに処理結果が生成されたとする。新たに生成された処理結果は宛先がＢであり、サイズは５００バイトである。本実施の形態においては、たとえ処理結果Ｒ２が格納された領域に十分な空領域があったとしても、処理結果Ｒ２は統合処理の対象ではないので、処理結果Ｒ２と統合されることは無い。また、最終番号についての処理結果を統合処理の対象にするので、処理結果Ｒ４も統合処理の対象ではない。この例では、図２に示したデータにおいて、処理結果Ｒ５が格納された領域の空領域のサイズが６００バイトであることが示されているので、新たに生成された処理結果と処理結果Ｒ５とが統合される。
【００１５】
次に、図４に示すような状況を考える。図４においては、送信処理用スレッド１００１乃至１００３が実行されているので、送信処理用スレッドの数Ｙが３である。バッファ１０００には、宛先Ａに送信される１番目の処理結果である処理結果Ｒ１と、宛先Ｂに送信される１番目の処理結果である処理結果Ｒ２とが格納されている。よって処理結果の数Ｘは２である。このように、送信処理用スレッドの数Ｙが処理結果の数Ｘ以上である場合には、処理結果に対して統合処理を実行していることが原因で処理結果の送信を待つことになる可能性が有る。従って送信処理用スレッドの数が処理結果の数以上である場合には統合処理は実行されない。図４の例では、処理結果Ｒ１及びＲ２は統合処理の対象から除外される。
【００１６】
図４に示した状況においては、サーバは例えば図５に示すようなデータをバッファ１０００とは別に管理する。図５においては、宛先Ａについての処理結果である処理結果Ｒ１が格納された領域の空領域のサイズは５００バイトであり、宛先Ｂについての処理結果である処理結果Ｒ２が格納された領域の空領域のサイズは５５０バイトである。
【００１７】
ここで、例えば図６に示すように、新たに処理結果が生成されたとする。新たに生成された処理結果は宛先がＡであり、サイズは３００バイトである。この場合、新たに生成された処理結果は、処理結果Ｒ１が格納された領域の空領域のサイズが５００バイトであるにもかかわらず、処理結果Ｒ１とは統合されない。新たに生成された処理結果は、処理結果Ｒ１及びＲ２が格納された領域とは別の領域に格納される。これにより、宛先Ａについて統合処理を実行することが原因で、処理結果Ｒ１を送信するタイミングが遅れてしまうことを防ぐことができる。
【００１８】
以上のように、統合処理を実行することで送信処理の回数を少なくすることができるので、ネットワークのトラフィック量を減らすとともに、サーバの処理負荷を減らすことができる。一方、統合処理を実行するのが好ましくない場合には統合処理を実行しないので、統合処理が原因で応答性能を劣化させるのを抑制できるようになる。
【００１９】
以下では、本実施の形態についてより具体的に説明する。
【００２０】
図７に、本実施の形態のシステム概要を示す。例えばインターネットであるネットワーク５には、処理要求を送信するクライアント端末３０及び３１と、受信した処理要求に基づきデータ処理を実行するサーバ１０乃至１２とが接続される。クライアント端末３０及び３１から送信された処理要求は、ネットワーク５に設置された中継装置（図示せず）によってサーバ１０乃至１２のいずれかに中継される。受信した処理要求に基づきデータ処理を実行したサーバは、データ処理の処理結果を、処理要求の送信元のクライアント端末に送り返す。
【００２１】
図８に、サーバ１０の機能ブロック図を示す。サーバ１０は、定義ファイル格納部１００と、管理データ格納部１０５と、処理結要求格納部１０６と、処理結果格納部１０７と、データ格納部１０８とを有する。サーバ１０においては、初期化処理部１０１と、受信処理用スレッド１０２と、データ処理用スレッド１０３と、送信処理用スレッド１０４とが実行される。図８においては、受信処理用スレッド１０２、データ処理用スレッド１０３及び送信処理用スレッド１０４の数は複数であるが、単数であってもよい。また、受信処理用スレッド１０２、データ処理用スレッド１０３及び送信処理用スレッドは、スレッドではなくプロセスであってもよい。なお、サーバ１１及び１２の機能ブロック図はサーバ１０の機能ブロック図と同じであるので、説明を省略する。
【００２２】
初期化処理部１０１は、定義ファイル格納部１００に格納されたデータに基づき、初期化処理を実行する。受信処理用スレッド１０２は、処理要求をクライアント端末３０及び３１から受信し、処理要求格納部１０６に格納する。また、受信処理用スレッド１０２は、管理データ格納部１０５に格納されたデータを更新する。データ処理用スレッド１０３は、処理要求格納部１０６に格納された処理要求に基づき、データ格納部１０８に格納されたデータに対してデータ処理を実行し、処理結果を処理結果格納部１０７に格納する。また、データ処理用スレッド１０３は、管理データ格納部１０５に格納されたデータを更新する。送信処理用スレッド１０４は、処理結果格納部１０７に格納された処理結果を取り出し、処理結果に対応する処理要求の送信元のクライアント端末に送信する。また、送信処理用スレッド１０４は、管理データ格納部１０５に格納されたデータを更新する。
【００２３】
図９に、クライアント端末３０の機能ブロック図を示す。クライアント端末３０は、定義ファイル格納部３０３と、管理データ格納部３０４とを有する。クライアント端末３０においては、管理部３０１と、アプリケーションプログラムのプロセスであるクライアントプロセス３０２とが実行される。なお、クライアント端末３１の機能ブロック図はクライアント端末３０の機能ブロック図と同様であるので、説明を省略する。
【００２４】
クライアントプロセス３０２は、データ処理を要求するデータである要求本体を生成し、管理部３０１に出力する。管理部３０１は、クライアントプロセス３０２から受け取った要求本体を含む処理要求を生成し、サーバ１０乃至１２に送信する。管理部３０１は、サーバ１０乃至１２から受信した処理結果から結果本体を取り出し、クライアントプロセス３０２に出力する。管理部３０１は、定義ファイル格納部３０３に格納されたデータに基づき初期化処理を実行する。管理部３０１は、管理データ格納部３０４に格納されたデータを更新する。
【００２５】
図１０に、サーバ１０の定義ファイル格納部１００に格納されるデータの一例を示す。図１０の例では、サーバ１０の処理に使用されるパラメタの値が格納される。１行目のパラメタは、受信処理用スレッド１０２の数及び送信処理用スレッド１０４の数を規定するパラメタである。２行目のパラメタは、データ処理用スレッド１０３の数を規定するパラメタである。３行目のパラメタは、処理要求を受信してから処理結果を送り返すまでの時間の上限を規定するパラメタである。単位は、例えば秒である。４行目のパラメタは、処理要求格納部１０６内に設けられるバッファの数及び処理結果格納部１０７内に設けられるバッファの数を規定するパラメタである。５行目のパラメタは、登録できるクライアントＩＤの数の最大値を規定するパラメタである。６行目のパラメタは、処理要求格納部１０６における１つのバッファのサイズ及び処理結果格納部１０７における１つのバッファのサイズを規定するパラメタである。単位は、例えばバイトである。なお、受信処理用スレッド１０２の数と送信処理用スレッド１０４の数とは同じでなくてもよい。
【００２６】
図１１に、クライアント端末３０の定義ファイル格納部３０３に格納されるデータの一例を示す。図１１の例では、クライアント端末３０の処理に使用されるパラメタの値が格納される。１行目のパラメタは、処理要求を送信してから処理結果を受信するまでの時間の上限を規定するパラメタである。２行目のパラメタは、クライアント端末３０のクライアントＩＤを規定するパラメタである。３行目のパラメタは、送信先のサーバの識別情報（例えば、名称又はＩＰアドレス）を規定するパラメタである。４行目のパラメタは、送信先のサーバのポート番号を規定するパラメタである。５行目のパラメタは、クライアント端末３０において使用されるポート番号である。
【００２７】
次に、図１２乃至図４２を用いて、サーバ１０が実行する処理について説明する。まず、図１２乃至図１５を用いて、初期化処理部１０１が実行する初期化処理について説明する。なお、初期化処理の開始時点においては、受信処理用スレッド１０２、データ処理用スレッド１０３、及び送信処理用スレッド１０４は生成されていない。
【００２８】
サーバ１０の初期化処理部１０１は、定義ファイル格納部１００からパラメタの値を読み出し、管理データ格納部１０５に格納された管理テーブルに格納する（図１２：ステップＳ１）。
【００２９】
図１３に、サーバ１０の管理テーブルの一例を示す。図１３の例では、データ処理用スレッドの数と、通信処理用スレッドの数と、最大バッファ数と、サーバタイムアウトの時間と、バッファサイズと、プロセス停止フラグとが格納される。プロセス停止フラグは、サーバ１０のプロセスを停止するか否か判定するためのフラグである。バッファサイズは、送信処理用スレッド１０４が一度に送信可能なデータ量以下になるように設定される。
【００３０】
図１２の説明に戻り、初期化処理部１０１は、管理データ格納部１０５における要求管理テーブル及び結果管理テーブル、処理要求格納部１０６並びに処理結果格納部１０７の内容を初期化する（ステップＳ３）。
【００３１】
初期化処理部１０１は、受信処理用セマフォ、データ処理用セマフォ、及び送信処理用セマフォを生成し、管理データ格納部１０５に格納する（ステップＳ５）。
【００３２】
図１４に、ステップＳ５において生成されるセマフォの一例を示す。図１４の例では、受信処理用セマフォ、データ処理用セマフォ、及び送信処理用セマフォの各々について、ロック（ＬＯＣＫ）を表す値又はアンロック（ＵＮＬＯＣＫ）を表す値が格納される。受信処理用セマフォは、受信処理用スレッド１０２の動作を制御するためのセマフォである。データ処理用セマフォは、データ処理用スレッド１０３の動作を制御するためのセマフォである。送信処理用セマフォは、送信処理用スレッド１０４の動作を制御するためのセマフォである。
【００３３】
図１２の説明に戻り、初期化処理部１０１は、管理テーブルにおけるプロセス停止フラグを”ＯＦＦ”に設定する（ステップＳ７）。
【００３４】
初期化処理部１０１は、データ処理用スレッド１０３を、管理テーブルに格納されたデータ処理用スレッドの数だけ生成する（ステップＳ９）。初期化処理部１０１は、送信処理用スレッド１０４を、管理テーブルに格納された通信処理用スレッドの数だけ生成する（ステップＳ１１）。初期化処理部１０１は、受信処理用スレッド１０２を、管理テーブルに格納された通信処理用スレッドの数だけ生成する（ステップＳ１３）。
【００３５】
初期化処理部１０１は、コマンド受付処理を実行する（ステップＳ１５）。コマンド受付処理については、図１５を用いて説明する。
【００３６】
まず、初期化処理部１０１は、受信イベントが発生したか判断する（図１５：ステップＳ２１）。受信イベントとは、例えば管理者等からコマンドの入力を受け付けるというイベントである。受信イベントが発生していない場合（ステップＳ２１：Ｎｏルート）、ステップＳ２１の処理に戻る。一方、受信イベントが発生した場合（ステップＳ２１：Ｙｅｓルート）、初期化処理部１０１は、プロセス停止コマンドを受信したか判断する（ステップＳ２３）。
【００３７】
プロセス停止コマンドを受信していない場合（ステップＳ２３：Ｎｏルート）、ステップＳ２１の処理に戻る。一方、プロセス停止コマンドを受信した場合（ステップＳ２３：Ｙｅｓルート）、初期化処理部１０１は、管理テーブルにおけるプロセス停止フラグに”ＯＮ”を設定する（ステップＳ２５）。
【００３８】
初期化処理部１０１は、サーバ１０のプロセスを停止するための処理を実行する（ステップＳ２７）。そして呼び出し元の処理に戻り、処理を終了する。
【００３９】
以上のような処理を実行すれば初期化が完了し、クライアント端末３０及び３１から受信した処理要求に対して処理を行えるようになる。
【００４０】
次に、図１６乃至図２２を用いて、受信処理用スレッド１０２が実行する受信処理について説明する。まず、受信処理用スレッド１０２は、ローカル変数「結果コード」に”正常”を設定（図１６：ステップＳ３１）し、変数「処理番号」に０を設定する（ステップＳ３３）。以下ではローカル変数を変数「＊＊＊」のように表す。テーブル等の値及びグローバル変数については括弧を付さない。
【００４１】
受信処理用スレッド１０２は、クライアント端末３０又は３１から処理要求を受信したか判断する（ステップＳ３５）。処理要求を受信していない場合（ステップＳ３５：Ｎｏルート）、処理は端子Ａを介して図２２のステップＳ７５の処理に移行する。端子Ａ以降については後で説明する。
【００４２】
図１７に、処理要求の一例を示す。図１７の例では、処理要求は、制御データと要求本体とを含む。制御データは、サーバのＩＰアドレスと、サーバのポート番号と、クライアントＩＤと、要求番号と、クライアント端末のＩＰアドレスと、クライアント端末のポート番号と、クライアント端末において実行されているプロセスのプロセスＩＤと、クライアント端末において実行されているスレッドのスレッドＩＤと、セッションＩＤと、処理要求の送信時刻とを含む。要求本体は、処理種別と、処理要求の対象と、入力情報と、出力情報とを含む。セッションＩＤは、コネクションの確立時にサーバからクライアント端末に通知されるＩＤである。入力情報は、データ処理の実行に用いる情報である。出力情報は、データ処理の対象となる部分を指定する情報である。
【００４３】
図１６の説明に戻り、処理要求を受信した場合（ステップＳ３５：Ｙｅｓルート）、受信処理用スレッド１０２は、例えばシステム時計等から現在時刻を取得し、変数「受信時刻」に設定する（ステップＳ３７）。
【００４４】
受信処理用スレッド１０２は、管理データ格納部１０５に格納された要求管理テーブルの排他を獲得する（ステップＳ３９）。
【００４５】
図１８に、要求管理テーブルに格納されるデータの一例を示す。図１８の例では、排他情報と、要求番号と、予約番号と、実行番号と、実行済番号とが格納される。ステップＳ３９においては、例えば、要求管理テーブルにおける排他情報に排他を獲得したことを表す値を設定する。排他を獲得した受信処理用スレッド１０２は、要求管理テーブルの参照及び更新を行えるようになる。
【００４６】
図１６の説明に戻り、受信処理用スレッド１０２は、変数「処理番号」が０であるか判断する（ステップＳ４１）。変数「処理番号」が０ではない場合（ステップＳ４１：Ｎｏルート）、ステップＳ４５の処理に移行する。変数「処理番号」が０である場合（ステップＳ４１：Ｙｅｓルート）、受信処理用スレッド１０２は、要求管理テーブルにおける予約番号を１インクリメントし、予約番号を変数「処理番号」に設定する（ステップＳ４３）。
【００４７】
受信処理用スレッド１０２は、要求管理テーブルにおける実行済番号を、変数「実行済番号」に設定する（ステップＳ４５）。
【００４８】
受信処理用スレッド１０２は、要求管理テーブルの排他を解除する（ステップＳ４７）。ステップＳ４７においては、例えば、要求管理テーブルにおける排他情報に、排他が解除されていることを表す値を設定する。処理は端子Ｂを介して図１９のステップＳ４９の処理に移行する。
【００４９】
図１９の説明に移行し、受信処理用スレッド１０２は、（変数「処理番号」の値−変数「実行済番号」の値）＞（管理テーブルにおける最大バッファ数）が成立するか判断する（ステップＳ４９）。成立しない場合（ステップＳ４９：Ｎｏルート）、処理は端子Ｃを介して図２０のステップＳ６３の処理に移行する。成立する場合（ステップＳ４９：Ｙｅｓルート）、受信処理用スレッド１０２は、管理データ格納部１０５に格納された受信処理用のセマフォに、ロックを表す値を設定する（ステップＳ５１）。
【００５０】
受信処理用スレッド１０２は、所定時間（例えば、１００ミリ秒）が経過したか又は受信処理用のセマフォにアンロックを表す値が設定されるまで休止する（ステップＳ５３）。後で説明するが、受信処理用のセマフォにはデータ処理においてアンロックを表す値が設定される。
【００５１】
所定時間が経過したか又は受信処理用のセマフォにアンロックを表す値が設定された場合、受信処理用スレッド１０２は、例えばシステム時計等から現在時刻を取得し、変数「現在時刻」に設定する（ステップＳ５５）。
【００５２】
受信処理用スレッド１０２は、変数「受信時刻」の値から変数「現在時刻」の値までの時間を算出する（ステップＳ５７）。
【００５３】
受信処理用スレッド１０２は、タイムアウトしたか判断する（ステップＳ５９）。ステップＳ５９においては、ステップＳ５７において算出された時間が管理テーブルにおけるサーバタイムアウトまでの時間より長いか判断する。タイムアウトしていない場合（ステップＳ５９：Ｎｏルート）、処理は端子Ｄを介して図１６のステップＳ３９の処理に戻る。
【００５４】
一方、タイムアウトした場合（ステップＳ５９：Ｙｅｓルート）、受信処理用スレッド１０２は、変数「結果コード」に”タイムアウト”を設定する（ステップＳ６１）。処理は端子Ｄを介して図１６のステップＳ３９の処理に戻る。
【００５５】
図２０の端子Ｃ以降の処理について説明する。受信処理用スレッド１０２は、処理要求格納部１０６における１乃至Ｎ（Ｎは最大バッファ数）の番号に対応する領域のうち、変数「処理番号」の値％最大バッファ数に対応する領域について排他を獲得する（図２０：ステップＳ６３）。ここで「％」は剰余を求める演算子である。例えば変数「処理番号」の値が１０２であり、最大バッファ数が１００である場合、剰余である２に１を加えた「３」に対応する領域について排他を獲得する。
【００５６】
図２１に、処理要求格納部１０６に格納されるデータの一例を示す。図２１の例では、排他情報の領域と、受付時刻の領域と、結果コードの領域と、クライアントＩＤの領域と、バッファの領域とがそれぞれＮ個設けられている。結果コードについては、０は”正常”を表し１は”タイムアウト”を表す。
【００５７】
図２０の説明に戻り、受信処理用スレッド１０２は、ステップＳ６３において排他を獲得したバッファに処理要求を格納する（ステップＳ６５）。受信処理用スレッド１０２は、ステップＳ６３において排他を獲得した領域に変数「受付時刻」の値を格納する（ステップＳ６７）。受信処理用スレッド１０２は、ステップＳ６３において排他を獲得した領域に、処理要求の送信元のクライアントＩＤを格納する（ステップＳ６９）。受信処理用スレッド１０２は、ステップＳ６３において排他を獲得した領域に、変数「結果コード」の値を格納する（ステップＳ７１）。
【００５８】
受信処理用スレッド１０２は、処理要求格納部１０６の排他を解除する（ステップＳ７３）。処理は端子Ａを介して図２２のステップＳ７５の処理に移行する。
【００５９】
図２２の説明に移行し、受信処理用スレッド１０２は、要求管理テーブルの排他を獲得し（図２２：ステップＳ７５）、要求管理テーブルにおける要求番号を１インクリメントする（ステップＳ７７）。そして、受信処理用スレッド１０２は、要求管理テーブルの排他を解除する（ステップＳ７９）。
【００６０】
受信処理用スレッド１０２は、管理データ格納部１０５におけるデータ処理用のセマフォにアンロックを表す値を設定する（ステップＳ８１）。
【００６１】
受信処理用スレッド１０２は、管理テーブルにおけるプロセス停止フラグに”ＯＦＦ”が設定されているか判断する（ステップＳ８３）。プロセス停止フラグに”ＯＮ”が設定されている場合（ステップＳ８３：Ｎｏルート）、プロセス停止コマンドを受信したので、受信処理を終了する。
【００６２】
一方、プロセス停止フラグに”ＯＦＦ”が設定されている場合（ステップＳ８３：Ｙｅｓルート）、受信処理用スレッド１０２は、変数「処理番号」の値が０であるか判断する（ステップＳ８５）。
【００６３】
変数「処理番号」の値が０ではない場合（ステップＳ８５：Ｎｏルート）、処理は端子Ｅを介して図１６のステップＳ３１に戻る。一方、変数「処理番号」の値が０である場合（ステップＳ８５：Ｙｅｓルート）、受信処理用スレッド１０２は、所定時間（例えば、１００ミリ秒）が経過したか又は処理要求を受信するまで待機する（ステップＳ８７）。
【００６４】
所定時間が経過したか又は処理要求を受信した場合、処理は端子Ｅを介して図１６のステップＳ３１に戻る。
【００６５】
以上のような処理を実行すれば、処理要求格納部１０６のバッファに格納された処理要求に対してデータ処理を行えるようになる。また、処理要求格納部１０６をサイクリックに使用できるようになる。
【００６６】
次に、図２３乃至図３８を用いて、データ処理用スレッド１０３が実行するデータ処理について説明する。
【００６７】
まず、データ処理用スレッド１０３は、ローカル変数の値の初期化を行う（図２３：ステップＳ９１）。具体的には、データ処理において使用するローカル変数に０を設定する。但し、変数「制御データサイズ」については所定の値を設定し、変数「ブロックサイズ」については変数「ブロックサイズ」の値＝管理テーブルに格納されたバッファサイズ−変数「制御データサイズ」の値−共通制御データのサイズとする。共通制御データとは、複数の処理結果を統合した際に処理結果に付加される制御データである。
【００６８】
データ処理用スレッド１０３は、要求管理テーブルの排他を獲得する（ステップＳ９３）。
【００６９】
データ処理用スレッド１０３は、要求管理テーブルにおける要求番号が要求管理テーブルにおける実行番号より大きいか判断する（ステップＳ９５）。要求管理テーブルにおける要求番号が要求管理テーブルにおける実行番号以下である場合（ステップＳ９５：Ｎｏルート）、ステップＳ９９の処理に移行する。
【００７０】
一方、要求管理テーブルにおける要求番号が要求管理テーブルにおける実行番号より大きい場合（ステップＳ９５：Ｙｅｓルート）、次の処理要求について処理するため、データ処理用スレッド１０３は、要求管理テーブルにおける実行番号を１インクリメントし、変数「処理番号」に設定する（ステップＳ９７）。
【００７１】
データ処理用スレッド１０３は、要求管理テーブルの排他を解除する（ステップＳ９９）。
【００７２】
データ処理用スレッド１０３は、変数「処理番号」の値が０であるか判断する（ステップＳ１０１）。変数「処理番号」の値が０である場合（ステップＳ１０１：Ｙｅｓルート）、処理は端子Ｆを介して図３８のステップＳ２６５の処理に移行する。
【００７３】
一方、変数「処理番号」の値が０ではない場合（ステップＳ１０１：Ｎｏルート）、処理は端子Ｇを介して図２４のステップＳ１０３の処理に移行する。
【００７４】
図２４の説明に移行し、データ処理用スレッド１０３は、処理要求格納部１０６における１乃至Ｎ（Ｎは最大バッファ数）の番号に対応する領域のうち、変数「処理番号」の値％最大バッファ数に対応する領域の排他を獲得する（図２４：ステップＳ１０３）。
【００７５】
データ処理用スレッド１０３は、排他が獲得された領域における処理要求を変数「処理要求」に設定する（ステップＳ１０５）。データ処理用スレッド１０３は、排他が獲得された領域における結果コードを変数「結果コード」に設定する（ステップＳ１０７）。データ処理用スレッド１０３は、排他が獲得された領域におけるクライアントＩＤを変数「クライアントＩＤ」に設定する（ステップＳ１０９）。
【００７６】
データ処理用スレッド１０３は、処理要求格納部１０６の排他を解除する（ステップＳ１１１）。処理は端子Ｈを介して図２５のＳ１１３の処理に移行する。
【００７７】
図２５の説明に移行し、データ処理用スレッド１０３は、変数「結果コード」の値は”タイムアウト”であるか判断する（図２５：ステップＳ１１３）。
【００７８】
変数「結果コード」の値は”タイムアウト”である場合（ステップＳ１１３：Ｙｅｓルート）、データ処理用スレッド１０３は、タイムアウトを表す値を変数「結果本体」に設定する（ステップＳ１１５）。そしてステップＳ１２１の処理に移行する。
【００７９】
変数「結果コード」の値は”タイムアウト”ではない場合（ステップＳ１１３：Ｎｏルート）、データ処理用スレッド１０３は、変数「処理要求」の値に基づき、データ格納部１０８に格納されたデータに対する処理を実行する（ステップＳ１１７）。
【００８０】
データ処理用スレッド１０３は、ステップＳ１１７における実行により得られたデータを、変数「結果本体」に設定する（ステップＳ１１９）。
【００８１】
データ処理用スレッド１０３は、変数「結果本体」に設定されたデータサイズを、変数「結果サイズ」に設定する（ステップＳ１２１）。データ処理用スレッド１０３は、変数「処理要求」に含まれる処理種別を変数「処理種別」に設定する（ステップＳ１２３）。
【００８２】
データ処理用スレッド１０３は、要求管理テーブルの排他を獲得し（ステップＳ１２５）、要求管理テーブルにおける実行済番号を１インクリメントする（ステップＳ１２７）。そして、データ処理用スレッド１０３は、要求管理テーブルの排他を解除する（ステップＳ１２９）。
【００８３】
データ処理用スレッド１０３は、管理データ格納部１０５における受信処理用のセマフォに、アンロックを表す値を設定する（ステップＳ１３１）。処理は端子Ｉを介して図２６のステップＳ１３３の処理に移行する。
【００８４】
図２６の説明に移行し、データ処理用スレッド１０３は、管理データ格納部１０５に格納されたデータ結果管理テーブルの排他を獲得する（図２６：ステップＳ１３３）。
【００８５】
図２７に、結果管理テーブルの一例を示す。図２７の例では、排他情報と、送信済番号と、結果番号と、予約番号とが格納される。また、各宛先について、クライアントＩＤと、最終番号と、空領域のサイズとが格納される。最終番号は、或る宛先についての処理結果のうち最後にバッファに格納された処理結果の番号であり、空領域のサイズとは、そのバッファの空領域のサイズである。
【００８６】
図２６の説明に戻り、データ処理用スレッド１０３は、変数「処理種別」の値は、処理要求が接続要求であることを表すか判断する（ステップＳ１３５）。変数「処理種別」の値は処理要求が接続要求であることを表していない場合（ステップＳ１３５：Ｎｏルート）、ステップＳ１４５の処理に移行する。
【００８７】
変数「処理種別」の値は処理要求が接続要求であることを表す場合（ステップＳ１３５：Ｙｅｓルート）、データ処理用スレッド１０３は、変数「クライアントＩＤ」の値を結果管理テーブルに登録済みであるか判断する（ステップＳ１３７）。登録済みである場合（ステップＳ１３７：Ｙｅｓルート）、ステップＳ１４５の処理に移行する。
【００８８】
変数「クライアントＩＤ」の値を結果管理テーブルに登録済みではない場合（ステップＳ１３７：Ｎｏルート）、データ処理用スレッド１０３は、変数「クライアントＩＤ」の値を結果管理テーブルに登録する（ステップＳ１３９）。
【００８９】
データ処理用スレッド１０３は、変数「クライアントＩＤ」の値に対応する最終番号に０を設定する（ステップＳ１４１）。データ処理用スレッド１０３は、変数「クライアントＩＤ」の値に対応する空領域サイズに０を設定する（ステップＳ１４３）。
【００９０】
データ処理用スレッド１０３は、変数「クライアントＩＤ」の値に対応する最終番号を、変数「最終番号」に設定する（ステップＳ１４５）。データ処理用スレッド１０３は、変数「クライアントＩＤ」に対応する空領域サイズを、変数「空領域サイズ」に設定する（ステップＳ１４７）。処理は端子Ｊを介して図２８のステップＳ１４９の処理に移行する。
【００９１】
図２８の説明に移行し、データ処理用スレッド１０３は、変数「最終番号」の値≠０且つ変数「空領域サイズ」の値≠０が成立するか判断する（ステップＳ１４９）。変数「最終番号」の値≠０且つ変数「空領域サイズ」の値≠０が成立しない場合（ステップＳ１４９：Ｎｏルート）、処理は端子Ｎを介して図３１のステップＳ１７７の処理に移行する。
【００９２】
変数「最終番号」の値≠０且つ変数「空領域サイズ」の値≠０が成立する場合（ステップＳ１４９：Ｙｅｓルート）、データ処理用スレッド１０３は、結果管理テーブルから送信済番号を読み出し、管理テーブルから通信スレッドの数を読み出す。そして、データ処理用スレッド１０３は、（変数「最終番号」の値−送信済番号）＞通信スレッドの数が成立するか判断する（ステップＳ１５１）。
【００９３】
（変数「最終番号」の値−送信済番号）＞通信スレッドの数が成立しない場合（ステップＳ１５１：Ｎｏルート）、統合処理を実行しないので、処理は端子Ｎを介して図３１のステップＳ１７７の処理に移行する。
【００９４】
（変数「最終番号」の値−送信済番号）＞通信スレッドの数が成立する場合（ステップＳ１５１：Ｙｅｓルート）、統合処理を実行するので、データ処理用スレッド１０３は、変数「更新番号」に変数「最終番号」の値を設定する（ステップＳ１５３）。
【００９５】
データ処理用スレッド１０３は、変数「空領域サイズ」の値≧（変数「結果サイズ」の値＋変数「制御データサイズ」の値）が成立するか判断する（ステップＳ１５５）。変数「空領域サイズ」の値≧（変数「結果サイズ」の値＋変数「制御データサイズ」の値）が成立する場合（ステップＳ１５５：Ｙｅｓルート）、処理は端子Ｋを介して図２９のステップＳ１５７の処理に移行する。一方、変数「空領域サイズ」の値≧（変数「結果サイズ」の値＋変数「制御データサイズ」の値）が成立しない場合（ステップＳ１５５：Ｎｏルート）、処理は端子Ｌを介して図３０のステップＳ１６５の処理に移行する。
【００９６】
図２９の説明に移行し、データ処理用スレッド１０３は、変数「更新サイズ」に、変数「結果サイズ」の値と変数「制御データサイズ」の値との和を設定する（図２９：ステップＳ１５７）。
【００９７】
データ処理用スレッド１０３は、変数「更新位置」に、管理テーブルに格納されたバッファサイズから変数「空領域サイズ」の値を引いた値を設定する（ステップＳ１５９）。
【００９８】
データ処理用スレッド１０３は、変数「クライアントＩＤ」の値に対応する空領域サイズから、変数「結果サイズ」の値と変数「制御データサイズ」の値との和を差し引く（ステップＳ１６１）。
【００９９】
データ処理用スレッド１０３は、変数「結果サイズ」に０を設定する（ステップＳ１６３）。処理は端子Ｍを介して図３１のステップＳ１８５の処理に移行する。
【０１００】
図３０の端子Ｌ以降の処理について説明する。データ処理用スレッド１０３は、変数「結果サイズ」の値≦変数「制御データサイズ」の値が成立するか判断する（図３０：ステップＳ１６５）。
【０１０１】
変数「結果サイズ」の値≦変数「制御データサイズ」の値が成立する場合（ステップＳ１６５：Ｙｅｓルート）、データ処理用スレッド１０３は、変数「更新番号」に０を設定する（ステップＳ１６７）。処理は端子Ｎを介して図３１のステップＳ１７７の処理に移行する。
【０１０２】
変数「結果サイズ」の値≦変数「制御データサイズ」の値が成立しない場合（ステップＳ１６５：Ｎｏルート）、データ処理用スレッド１０３は、変数「更新サイズ」に変数「空領域サイズ」の値を設定する（ステップＳ１６９）。
【０１０３】
データ処理用スレッド１０３は、変数「更新位置」に、管理テーブルに格納されたバッファサイズ−変数「空領域サイズ」の値を設定する（ステップＳ１７１）。
【０１０４】
データ処理用スレッド１０３は、結果管理テーブルにおいて変数「クライアントＩＤ」の値に対応付けられている空領域サイズに０を設定する（ステップＳ１７３）。
【０１０５】
データ処理用スレッド１０３は、変数「結果サイズ」に、（変数「結果サイズ」の値−変数「更新サイズ」の値＋変数「制御データサイズ」の値）を設定する（ステップＳ１７５）。処理は端子Ｎを介して図３１のステップＳ１７７の処理に移行する。
【０１０６】
図３１の説明に移行し、データ処理用スレッド１０３は、変数「追加ブロック数」に、（変数「結果サイズ」の値÷変数「ブロックサイズ」の値）の整数部分を設定する（図３１：ステップＳ１７７）。
【０１０７】
データ処理用スレッド１０３は、変数「最終ブロックサイズ」に、（変数「結果サイズ」の値％変数「ブロックサイズ」の値）を設定する（ステップＳ１７９）。
【０１０８】
データ処理用スレッド１０３は、変数「最終ブロックサイズ」の値が０であるか判断する（ステップＳ１８１）。変数「最終ブロックサイズ」の値が０である場合（ステップＳ１８１：Ｙｅｓルート）、ステップＳ１８５の処理に移行する。
【０１０９】
変数「最終ブロックサイズ」の値が０ではない場合（ステップＳ１８１：Ｎｏルート）、データ処理用スレッド１０３は、変数「追加ブロック数」の値を１インクリメントする（ステップＳ１８３）。
【０１１０】
データ処理用スレッド１０３は、結果管理テーブルの排他を解除する（ステップＳ１８５）。処理は端子Ｏを介して図３２のステップＳ１８７の処理に移行する。
【０１１１】
図３２の説明に移行し、データ処理用スレッド１０３は、変数「更新番号」の値が０であるか判断する（図３２：ステップＳ１８７）。
【０１１２】
変数「更新番号」の値が０である場合（ステップＳ１８７：Ｙｅｓルート）、処理は端子Ｐを介して図３４のステップＳ２０３の処理に移行する。
【０１１３】
変数「更新番号」の値が０ではない場合（ステップＳ１８７：Ｎｏルート）、データ処理用スレッド１０３は、処理結果格納部１０７における１乃至Ｎ（Ｎは最大バッファ数）の番号に対応する領域のうち、変数「更新番号」の値％最大バッファ数に対応する領域の排他を獲得する（ステップＳ１８９）。
【０１１４】
図３３に、処理結果格納部１０７に格納されるデータの一例を示す。図３３の例では、排他情報の領域と、受付時刻の領域と、結果コードの領域と、クライアントＩＤの領域と、バッファの領域とがそれぞれＮ個設けられている。結果コードについては、０は”正常”を表し１は”タイムアウト”を表す。
【０１１５】
図３２の説明に戻り、データ処理用スレッド１０３は、排他が獲得されたバッファにおいて、変数「更新位置」の値が表す位置を特定する（ステップＳ１９１）。
【０１１６】
データ処理用スレッド１０３は、ステップＳ１９１において特定された位置に、処理結果に対応する処理要求に基づく制御データを格納する（ステップＳ１９３）。ここで、もし変数「追加ブロック数」の値が１以上である場合、制御データに含まれる「状態」の項目に未完了を表す値（例えば１）を設定する。
【０１１７】
データ処理用スレッド１０３は、ステップＳ１９３において設定された制御データの後に、変数「結果本体」の値を（変数「更新サイズ」の値−変数「制御データサイズ」の値）の分だけ格納する（ステップＳ１９５）。
【０１１８】
データ処理用スレッド１０３は、処理結果格納部１０７の排他を解除する（ステップＳ１９７）。
【０１１９】
データ処理用スレッド１０３は、変数「更新位置」に０を設定する（ステップＳ１９９）。データ処理用スレッド１０３は、変数「オフセット」に変数「更新サイズ」の値を設定する（ステップ２０１）。処理は端子Ｐを介して図３４のステップＳ２０３の処理に移行する。
【０１２０】
図３４の説明に移行し、データ処理用スレッド１０３は、変数「カウンタ」の値に０を設定する（図３４：ステップＳ２０３）。データ処理用スレッド１０３は、変数「追加番号」に０を設定する（ステップＳ２０５）。
【０１２１】
データ処理用スレッド１０３は、変数「カウンタ」の値＜変数「追加ブロック数」の値が成立するか判断する（ステップＳ２０７）。変数「カウンタ」の値＜変数「追加ブロック数」の値が成立しない場合（ステップＳ２０７：Ｎｏルート）、処理は端子Ｆを介して図３８のステップＳ２６５の処理に移行する。
【０１２２】
変数「カウンタ」の値＜変数「追加ブロック数」の値が成立する場合（ステップＳ２０７：Ｙｅｓルート）、データ処理用スレッド１０３は、結果管理テーブルの排他を獲得する（ステップＳ２０９）。
【０１２３】
データ処理用スレッド１０３は、変数「追加ブロック数」の値が０であるか判断する（ステップＳ２１１）。変数「追加ブロック数」の値が０ではない場合（ステップＳ２１１：Ｎｏルート）、ステップＳ２１５の処理に移行する。
【０１２４】
変数「追加ブロック数」の値が０である場合（ステップＳ２１１：Ｙｅｓルート）、データ処理用スレッド１０３は、結果管理テーブルにおける予約番号を１インクリメントし、変数「追加番号」に設定する（ステップＳ２１３）。
【０１２５】
データ処理用スレッド１０３は、変数「送信済番号」に、結果管理テーブルにおける送信済番号を設定する（ステップＳ２１５）。処理は端子Ｑを介して図３５のステップＳ２１７の処理に移行する。
【０１２６】
図３５の説明に移行し、データ処理用スレッド１０３は、（変数「追加番号」の値−変数「送信済番号」の値）≦最大バッファ数が成立するか判断する（図３５：ステップＳ２１７）。
【０１２７】
（変数「追加番号」の値−変数「送信済番号」の値）≦最大バッファ数が成立しない場合（ステップＳ２１７：Ｎｏルート）、ステップＳ２２７の処理に移行する。
【０１２８】
（変数「追加番号」の値−変数「送信済番号」の値）≦最大バッファ数が成立する場合（ステップＳ２１７：Ｙｅｓルート）、データ処理用スレッド１０３は、結果管理テーブルにおける、変数「クライアントＩＤ」の値に対応する最終番号に、結果管理テーブルにおける予約番号を設定する（ステップＳ２１９）。
【０１２９】
データ処理用スレッド１０３は、変数「カウンタ」の値が、（変数「追加ブロック数」の値−１）であるか判断する（ステップＳ２２１）。
【０１３０】
変数「カウンタ」の値が（変数「追加ブロック数」の値−１）である場合（ステップＳ２２１：Ｙｅｓルート）、データ処理用スレッド１０３は、変数「クライアントＩＤ」の値に対応する空領域サイズに、（変数「ブロックサイズ」の値−変数「最終ブロックサイズ」の値）を設定する（ステップＳ２２３）。そしてステップＳ２２７の処理に移行する。
【０１３１】
変数「カウンタ」の値が（変数「追加ブロック数」の値−１）ではない場合（ステップＳ２２１：Ｎｏルート）、データ処理用スレッド１０３は、変数「クライアントＩＤ」の値に対応する空領域サイズに０を設定する（ステップＳ２２５）。そして、データ処理用スレッド１０３は、結果管理テーブルの排他を解除する（ステップＳ２２７）。
【０１３２】
データ処理用スレッド１０３は、変数「追加番号」の値−変数「送信済番号」の値≦最大バッファ数が成立するか判断する（ステップＳ２２９）。
【０１３３】
変数「追加番号」の値−変数「送信済番号」の値≦最大バッファ数が成立する場合（ステップＳ２２９：Ｙｅｓルート）、処理は端子Ｒを介して図３６のステップＳ２３１の処理に移行する。変数「追加番号」の値−変数「送信済番号」の値≦最大バッファ数が成立しない場合（ステップＳ２２９：Ｎｏルート）、処理は端子Ｓを介して図３４のステップＳ２０９の処理に戻る。
【０１３４】
図３６の説明に移行し、データ処理用スレッド１０３は、処理結果格納部１０７における１乃至Ｎ（Ｎは最大バッファ数）の番号に対応する領域のうち、変数「追加番号」の値％最大バッファ数に対応する領域の排他を獲得する（図３６：ステップＳ２３１）。そして、データ処理用スレッド１０３は、ステップＳ２３１において排他が獲得されたバッファに、共通制御データを設定する（ステップＳ２３３）。
【０１３５】
データ処理用スレッド１０３は、変数「カウンタ」の値が、（変数「追加ブロック数」の値−１）であるか判断する（ステップＳ２３５）。
【０１３６】
変数「カウンタ」の値が（変数「追加ブロック数」の値−１）である場合（ステップＳ２３５：Ｙｅｓルート）、データ処理用スレッド１０３は、共通制御データの後に、「状態」の項目に完了を表す値が設定された、処理要求に基づく制御データを格納する（ステップＳ２３９）。
【０１３７】
データ処理用スレッド１０３は、制御データの後に、変数「結果本体」の値を、変数「オフセット」の値が示す位置から変数「最終ブロックサイズ」の値の分だけ格納する（ステップＳ２４１）。
【０１３８】
データ処理用スレッド１０３は、変数「オフセット」に、変数「オフセット」の値と変数「最終ブロックサイズ」の値との和を設定する（ステップＳ２４３）。そしてステップＳ２５３の処理に移行する。
【０１３９】
一方、変数「カウンタ」の値が（変数「追加ブロック数」の値−１）ではない場合（ステップＳ２３５：Ｎｏルート）、データ処理用スレッド１０３は、共通制御データの後に、「状態」の項目に未完了を表す値が設定された、処理要求に基づく制御データを格納する（ステップＳ２４７）。
【０１４０】
データ処理用スレッド１０３は、制御データの後に、変数「結果本体」の値を、変数「オフセット」の値が示す位置から変数「ブロックサイズ」の値の分だけ格納する（ステップＳ２４９）。
【０１４１】
データ処理用スレッド１０３は、変数「オフセット」に、変数「オフセット」の値と変数「ブロックサイズ」の値との和を設定する（ステップＳ２５１）。
【０１４２】
データ処理用スレッド１０３は、処理結果格納部１０７の排他を解除する（ステップＳ２５３）。処理は端子Ｔを介して図３７のステップＳ２５５の処理に移行する。
【０１４３】
図３７の説明に移行し、データ処理用スレッド１０３は、結果管理テーブルの排他を獲得し（ステップＳ２５５）、結果管理テーブルにおける結果番号を１インクリメントする（ステップＳ２５７）。そして、データ処理用スレッド１０３は、結果管理テーブルの排他を解除する（ステップＳ２５９）。
【０１４４】
データ処理用スレッド１０３は、管理データ格納部１０５に格納された送信処理用のセマフォに、アンロックを表す値を設定する（ステップＳ２６１）。
【０１４５】
データ処理用スレッド１０３は、変数「カウンタ」の値を１インクリメントする（ステップＳ２６３）。処理は端子Ｕを介して図３４のステップＳ２０５の処理に戻る。
【０１４６】
図３８の端子Ｆ以降の処理について説明する。データ処理用スレッド１０３は、管理テーブルにおけるプロセス停止フラグに”ＯＦＦ”が設定されているか判断する（ステップＳ２６５）。プロセス停止フラグに”ＯＮ”が設定されている場合（ステップＳ２６５：Ｎｏルート）、プロセス停止コマンドを受信したので、データ処理を終了する。
【０１４７】
一方、プロセス停止フラグに”ＯＦＦ”が設定されている場合（ステップＳ２６５：Ｙｅｓルート）、データ処理用スレッド１０３は、変数「更新番号」の値＝０且つ変数「追加番号」の値＝０が成立するか判断する（ステップＳ２６７）。
【０１４８】
変数「更新番号」の値＝０且つ変数「追加番号」の値＝０が成立しない場合（ステップＳ２６７：Ｎｏルート）、処理は端子Ｖを介して図２３のステップＳ９１に戻る。一方、変数「更新番号」の値＝０且つ変数「追加番号」の値＝０が成立する場合（ステップＳ２６７：Ｙｅｓルート）、データ処理用スレッド１０３は、データ処理用のセマフォにロックを表す値を設定する（ステップＳ２６９）。
【０１４９】
データ処理用スレッド１０３は、所定時間（例えば、１００ミリ秒）が経過したか又はデータ処理用のセマフォにアンロックを表す値が設定されるまで休止する（ステップＳ２７１）。
【０１５０】
所定時間が経過したか又はデータ処理用のセマフォにアンロックを表す値が設定された場合、処理は端子Ｖを介して図２３のステップＳ９１に戻る。
【０１５１】
以上のような処理を実行すれば、送信処理用スレッドの処理状況に応じて統合処理の対象である処理結果が決定されるので、統合処理が原因で応答性能が劣化するのを抑制できるようになる。
【０１５２】
また、最終番号についての処理結果が格納された領域の空領域のサイズを管理するので、空領域のチェックのために使用する記憶領域のサイズが小さくなる。また、空領域を探すためにバッファ全体をチェックすることが無いので、送信処理用スレッド１０４が排他の獲得のために待つことになるのを抑制できる。さらに、送信処理用スレッド１０４の数を上回る分の処理結果のうち最終番号についての処理結果を統合処理の対象としているので、統合処理が送信処理用スレッド１０４の処理の邪魔をしてしまう可能性が低くくなる。
【０１５３】
次に、図３９乃至図４２を用いて、送信処理用スレッド１０４が実行する送信処理について説明する。
【０１５４】
まず、送信処理用スレッド１０４は、変数「処理番号」に０を設定する（図３９：ステップＳ２８１）。
【０１５５】
送信処理用スレッド１０４は、管理データ格納部１０５に格納された結果管理テーブルの排他を獲得する（ステップＳ２８３）。そして、送信処理用スレッド１０４は、結果管理テーブルにおいて、結果番号＞予約番号が成立するか判断する（ステップＳ２８５）。
【０１５６】
結果番号＞予約番号が成立しない場合（ステップＳ２８５：Ｎｏルート）、ステップＳ２８９の処理に移行する。結果番号＞予約番号が成立する場合（ステップＳ２８５：Ｙｅｓルート）、送信処理用スレッド１０４は、結果管理テーブルにおける予約番号を１インクリメントし、変数「処理番号」に設定する（ステップＳ２８７）。
【０１５７】
送信処理用スレッド１０４は、結果管理テーブルの排他を解除する（ステップＳ２８９）。処理は端子Ｗを介して図４０のステップＳ２９１の処理に移行する。
【０１５８】
図４０の説明に移行し、送信処理用スレッド１０４は、変数「処理番号」の値は０であるか判断する（図４０：ステップＳ２９１）。変数「処理番号」の値が０である場合（ステップＳ２９１：Ｙｅｓルート）、処理は端子Ｘを介して図４２のステップＳ３０９の処理に移行する。
【０１５９】
変数「処理番号」の値が０ではない場合（ステップＳ２９１：Ｎｏルート）、送信処理用スレッド１０４は、処理結果格納部１０７における１乃至Ｎ（Ｎは最大バッファ数）の番号に対応する領域のうち、変数「処理番号」の値％最大バッファ数に対応する領域の排他を獲得する（ステップＳ２９３）。
【０１６０】
送信処理用スレッド１０４は、排他が獲得された領域のバッファから処理結果を取り出し（ステップＳ２９５）、処理結果格納部１０７の排他を解除する（ステップＳ２９７）。
【０１６１】
送信処理用スレッド１０４は、ステップＳ２９５において取り出された処理結果を、宛先のクライアント端末に送信する（ステップＳ２９９）。
【０１６２】
図４１に、処理結果の一例を示す。図４１の例では、統合された複数の処理結果に、共通制御データが付加されている。処理結果は、制御データと、結果本体とを含む。制御データは、結果番号と、要求番号と、クライアント端末において実行されているプロセスのプロセスＩＤと、クライアント端末において実行されているスレッドのスレッドＩＤと、セッションＩＤと、処理要求の送信時刻と、処理結果の送信時刻と、状態に関する値とを含む。結果本体は、結果本体のサイズの情報と、結果とを含む。共通制御データは、クライアント端末のＩＰアドレスと、クライアント端末のポート番号と、クライアントＩＤと、クライアント端末のＩＰアドレスと、処理結果の数とを含む。処理結果の送信時刻は、例えば、送信処理用スレッド１０４が実際に処理結果を送信する際に設定される。
【０１６３】
送信処理用スレッド１０４は、結果管理テーブルの排他を獲得し（ステップＳ３０１）、送信済番号を１インクリメントする（ステップＳ３０３）。そして、送信処理用スレッド１０４は、結果管理テーブルの排他を解除する（ステップＳ３０５）。
【０１６４】
送信処理用スレッド１０４は、送信処理用のセマフォに、アンロックを表す値を設定する（ステップＳ３０７）。処理は端子Ｘを介して図４２のステップＳ３０９の処理に移行する。
【０１６５】
図４２の説明に移行し、送信処理用スレッド１０４は、管理テーブルにおけるプロセス停止フラグに”ＯＦＦ”が設定されているか判断する（ステップＳ３０９）。プロセス停止フラグに”ＯＮ”が設定されている場合（ステップＳ３０９：Ｎｏルート）、プロセス停止コマンドを受信したので、送信処理を終了する。
【０１６６】
一方、プロセス停止フラグに”ＯＦＦ”が設定されている場合（ステップＳ３０９：Ｙｅｓルート）、データ処理用スレッド１０３は、変数「処理番号」の値は０であるか判断する（ステップＳ３１１）。
【０１６７】
変数「処理番号」の値は０ではない場合（ステップＳ３１１：Ｎｏルート）、処理は端子Ｙを介して図３９のステップＳ２８１の処理に戻る。一方、変数「処理番号」の値が０である場合（ステップＳ３１１：Ｙｅｓルート）、送信処理用スレッド１０４は、送信処理用のセマフォにロックを表す値を設定する（ステップＳ３１３）。
【０１６８】
送信処理用スレッド１０４は、所定時間（例えば、１００ミリ秒）が経過したか又は送信処理用のセマフォにアンロックを表す値が設定されるまで休止する（ステップＳ３１５）。
【０１６９】
所定時間が経過したか又は送信処理用のセマフォにアンロックを表す値が設定された場合、処理は端子Ｙを介して図３９のステップＳ２８１の処理に戻る。
【０１７０】
以上のような処理を実行すれば、処理要求の送信元のクライアント端末に処理結果を送り返せるようになる。
【０１７１】
なお、本実施の形態においてはセマフォを用いているので、格納場所に空きを生じさせたスレッド等が、データの格納を行うスレッド等に、格納場所が空いたことを伝えることができる。従って、格納場所に空きができたタイミングとデータが格納されるタイミングとの間のタイムラグが生じにくい。もしセマフォを用いない場合には、データの格納を行うスレッド等が、格納場所が空いているか否か定期的にチェックすることになる。そのため、格納場所が空いてから実際にデータが格納されるまでの時間が本実施の形態と比較して長くなる。
【０１７２】
また、処理要求格納部１０６及び処理結果格納部１０７はＮ個に分けられているため、排他の対象となる領域を最小限にすることができる。従って、排他制御によりスレッドの処理が滞ることを抑制できる。
【０１７３】
さらに、宛先が同じである複数の処理結果の合計のデータ量は、送信処理用スレッド１０４が一度に送信可能なデータ量以下になるので、送信処理用スレッド１０４は効率的に送信処理を行うことができるようになる。
【０１７４】
なお、サーバ１１及び１２が実行する処理はサーバ１０が実行する処理と同様であるので、説明を省略する。
【０１７５】
次に、図４３乃至図４６を用いて、クライアント端末３０が実行する処理について説明する。
【０１７６】
まず、クライアント端末３０の管理部３０１は、定義ファイル格納部３０３からパラメタの値を読み出し、管理データ格納部３０４に格納された管理テーブルに格納する（図４３：ステップＳ３２１）。
【０１７７】
管理部３０１は、クライアント端末３０のＩＰアドレス又はマシン名を取得し、管理データ格納部３０４に格納された管理テーブルに格納する（ステップＳ３２３）。
【０１７８】
なお、ステップＳ３２１及びＳ３２３は初回のみ実行される処理であるため、ステップＳ３２１及びＳ３２３のブロックは点線で示されている。
【０１７９】
図４４に、クライアント端末３０の管理テーブルに格納されるデータの一例を示す。図４４の例では、クライアントＩＤと、送信先のサーバのＩＰアドレスと、送信先のサーバのポート番号と、クライアントタイムアウトの時間と、クライアント端末３０のＩＰアドレスと、クライアント端末３０において使用されるポート番号とが格納される。なお、ＩＰアドレスの代わりにホスト名が格納されてもよい。
【０１８０】
図４３の説明に戻り、管理部３０１は、例えばシステム時計等から現在時刻を取得し、変数「開始時刻」に設定する（ステップＳ３２５）。
【０１８１】
管理部３０１は、管理データ格納部３０４に格納された要求管理テーブルの排他を獲得する（ステップＳ３２７）。図４５に、クライアント端末３０の要求管理テーブルに格納されるデータの一例を示す。図４５の例では、排他情報と、要求番号とが格納される。
【０１８２】
管理部３０１は、要求管理テーブルにおける要求番号を１インクリメントし、変数「要求番号」に設定する（ステップＳ３２９）。
【０１８３】
管理部３０１は、要求管理テーブルの排他を解除する（ステップＳ３３１）。
【０１８４】
管理部３０１は、クライアントプロセス３２から受け取った要求本体と制御データとを含む処理要求を生成し、宛先のサーバに送信する（ステップＳ３３３）。制御データは、管理テーブルに格納されたクライアントＩＤ、サーバのマシン名又はＩＰアドレス、サーバのポート番号、クライアント端末３０のマシン名又はＩＰアドレス、クライアント端末３０において使用されるポート番号、及び変数「要求番号」等を含む。処理要求は、図１７に示したとおりである。
【０１８５】
管理部３０１は、所定の時間（例えば、クライアントタイムアウトの時間の１０分の１）が経過したか又はデータを受信するまで休止する（ステップＳ３３５）。所定の時間が経過したか又はデータを受信した場合、処理は端子Ｚを介して図４６のステップＳ３３７に移行する。
【０１８６】
図４６の説明に移行し、管理部３０１は、受信したデータが、処理要求の宛先のサーバからの処理結果であるか判断する（図４６：ステップＳ３３７）。処理結果である場合（ステップＳ３３７：Ｙｅｓルート）、管理部３０１は、処理結果から結果本体を取り出し、返却域に追加で格納する（ステップＳ３３９）。返却域とは、クライアントプロセス３２にデータを渡すための領域である。
【０１８７】
管理部３０１は、処理結果に含まれる制御データが「未完了」を表すか判断する（ステップＳ３４１）。処理結果に含まれる制御データは、「未完了」又は「完了」のいずれかを表す値を含む。処理結果に含まれる制御データが「未完了」を表す場合（ステップＳ３４１：Ｙｅｓルート）、後続の処理結果があるため、ステップＳ３３７の処理に戻る。
【０１８８】
処理結果に含まれる制御データが「完了」を表す場合（ステップＳ３４１：Ｎｏルート）、後続のデータが無いため、管理部３０１は、結果本体が表す結果を表す値を復帰値に設定する（ステップＳ３４３）。そしてクライアントプロセス３２に復帰し、処理を終了する。
【０１８９】
一方、処理結果ではない場合（ステップＳ３３７：Ｎｏルート）、管理部３０１は、例えばシステム時計から現在時刻を取得し、変数「現在時刻」に設定する（ステップＳ３４５）。
【０１９０】
管理部３０１は、変数「開始時刻」の値から変数「現在時刻」の値までの時間を算出する（ステップＳ３４７）。
【０１９１】
管理部３０１は、タイムアウトしたか判断する（ステップＳ３４９）。ステップＳ３４９においては、ステップＳ３４７において算出された時間が管理テーブルにおけるクライアントタイムアウトまでの時間より長いか判断する。タイムアウトしていない場合（ステップＳ３４９：Ｎｏルート）、ステップＳ３３７の処理に戻る。
【０１９２】
一方、タイムアウトした場合（ステップＳ３４９：Ｙｅｓルート）、管理部３０１は、タイムアウトを表す値を復帰値に設定する（ステップＳ３５１）。そしてクライアントプロセス３２に復帰し、処理を終了する。
【０１９３】
以上のような処理を実行すれば、処理結果を複数回に分けて受信する場合であっても、クライアントプロセス３２に適切に結果本体を渡せるようになる。
【０１９４】
なお、クライアント端末３１が実行する処理はクライアント端末３０が実行する処理と同様であるので、説明を省略する。
【０１９５】
以上本発明の一実施の形態を説明したが、本発明はこれに限定されるものではない。例えば、上で説明したサーバ１０及びクライアント端末３０の機能ブロック構成は実際のプログラムモジュール構成に一致しない場合もある。
【０１９６】
また、上で説明したデータ保持構成は一例であって、上記のような構成でなければならないわけではない。さらに、処理フローにおいても、処理結果が変わらなければ処理の順番を入れ替えることも可能である。さらに、並列に実行させるようにしても良い。
【０１９７】
なお、クライアントＩＤは、処理要求が接続要求である場合に動的に生成しても良いし、定義ファイルにおけるパラメタ”ＭａｘＣｌｉｅｎｔＩＤ”の値に基づき静的に生成してもよい。
【０１９８】
また、クライアントＩＤから最終番号及び空領域サイズを特定するのを高速化するため、クライアントＩＤをキーとし最終番号及び空領域サイズを値とした、ハッシュテーブル又はＢ−Ｔｒｅｅを利用してもよい。
【０１９９】
また、時間の情報を管理テーブルに予め格納しておき、上記の「所定時間」として使用してもよい。
【０２００】
なお、上で述べたサーバ１０乃至１２並びにクライアント端末３０及び３１は、コンピュータ装置であって、図４７に示すように、メモリ２５０１とＣＰＵ（Central Processing Unit）２５０３とハードディスク・ドライブ（ＨＤＤ：Hard Disk Drive）２５０５と表示装置２５０９に接続される表示制御部２５０７とリムーバブル・ディスク２５１１用のドライブ装置２５１３と入力装置２５１５とネットワークに接続するための通信制御部２５１７とがバス２５１９で接続されている。オペレーティング・システム（ＯＳ：Operating System）及び本実施例における処理を実施するためのアプリケーションプログラムは、ＨＤＤ２５０５に格納されており、ＣＰＵ２５０３により実行される際にはＨＤＤ２５０５からメモリ２５０１に読み出される。ＣＰＵ２５０３は、アプリケーションプログラムの処理内容に応じて表示制御部２５０７、通信制御部２５１７、ドライブ装置２５１３を制御して、所定の動作を行わせる。また、処理途中のデータについては、主としてメモリ２５０１に格納されるが、ＨＤＤ２５０５に格納されるようにしてもよい。本発明の実施例では、上で述べた処理を実施するためのアプリケーションプログラムはコンピュータ読み取り可能なリムーバブル・ディスク２５１１に格納されて頒布され、ドライブ装置２５１３からＨＤＤ２５０５にインストールされる。インターネットなどのネットワーク及び通信制御部２５１７を経由して、ＨＤＤ２５０５にインストールされる場合もある。このようなコンピュータ装置は、上で述べたＣＰＵ２５０３、メモリ２５０１などのハードウエアとＯＳ及びアプリケーションプログラムなどのプログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
【０２０１】
以上述べた本発明の実施の形態をまとめると、以下のようになる。
【０２０２】
本実施の形態の第１の態様に係る情報処理装置は、（Ａ）送信すべき１又は複数のメッセージを格納するバッファと、（Ｂ）バッファからメッセージを取り出し、取り出した当該メッセージを送信する処理を各々が実行する１又は複数の通信部と、（Ｃ）バッファに格納されているメッセージの数と通信部の数との比較結果に基づき、バッファに格納されているメッセージの中から、宛先が同じである２以上のメッセージを統合する処理である統合処理の対象であるメッセージを特定し、特定された当該メッセージについて統合処理を実行する実行部とを有する。
【０２０３】
このようにすれば、通信部の処理状況に応じて統合処理の対象であるメッセージを特定できるので、メッセージの統合処理が原因で送信性能が低下するのを抑制できるようになる。
【０２０４】
また、上で述べた実行部は、（ｃ１）バッファに格納されているメッセージの数が、通信部の数より多いか判定し、（ｃ２）バッファに格納されているメッセージの数が通信部の数より多い場合に、バッファに格納されているメッセージのうち、通信部の数のメッセージを統合処理の対象から除外する処理を実行する。そして、統合処理の対象から除外されるメッセージは、バッファに格納されているメッセージのうち統合処理の対象であるメッセージより先にバッファから取り出されるメッセージであってもよい。このようにすれば、直ちに送信される可能性が低いメッセージについて統合処理を行えるようになる。
【０２０５】
また、上で述べた実行部は、（ｃ３）バッファに格納されているメッセージの数が、通信部の数以下である場合に、バッファに格納されているメッセージを統合処理の対象から除外してもよい。このようにすれば、直ちに送信される可能性が高いメッセージについては統合処理の対象から除外できるようになる。
【０２０６】
また、上で述べたバッファは複数の領域を有してもよい。そして、上で述べた実行部は、（ｃ４）宛先が異なる２以上のメッセージが１の領域に格納されないようにバッファに格納されているメッセージを複数の領域に分類してもよい。このようにすれば、バッファにおいてメッセージの統合を適切に行えるようになる。
【０２０７】
また、本情報処理装置は、（Ｄ）宛先の識別情報に対応付けて、当該宛先に送信すべきメッセージが格納された領域を特定するための情報と当該領域の空容量の情報とを格納する管理データ格納部をさらに有してもよい。そして、上で述べた実行部は、（ｃ５）管理データ格納部を用いて、新たに生成された第１のメッセージのデータ量が、第１のメッセージの宛先に送信すべき第２のメッセージが格納された領域である第１の領域の空容量より多いか判定し、（ｃ６）第１のメッセージのデータ量が第１の領域の空容量以下であり且つ第２のメッセージが統合処理の対象である場合に、第１のメッセージと第２のメッセージとを統合してもよい。このようにすれば、領域の容量に上限がある場合においてもメッセージの統合を適切に行えるようになる。
【０２０８】
また、上で述べた実行部は、（ｃ７）第１のメッセージのデータ量が第１の領域の空容量より多く且つ第２のメッセージが統合処理の対象である場合に、第１の領域の空容量が無くなるように、第１のメッセージの一部を第１の領域に格納し、（ｃ８）複数の領域のうちメッセージが格納されていない領域である第２の領域に、第１のメッセージのうち第１の領域に格納された部分以外の部分を格納してもよい。このようにすれば、領域の容量の上限に達した場合においてもメッセージを適切に処理できるようになる。
【０２０９】
また、（ｄ１）管理データ格納部に格納されている、宛先に送信すべきメッセージが格納された領域を特定するための情報は、当該宛先に送信すべきメッセージのうちバッファに格納された時点が最も後であるメッセージが格納された領域を特定するための情報であってもよい。このようにすれば、処理を高速化できるようになる。また、管理すべき情報の量を減らせるようになる。
【０２１０】
また、複数の領域の各々に格納される１又は複数のメッセージの総データ量は、複数の通信部の各々が一度に送信できるデータ量以下であってもよい。このようにすれば、通信部は効率的に送信を行えるようになる。
【０２１１】
また、上で述べた実行部は、（ｃ９）第１のメッセージのうち第１の領域に格納された部分に、後続の部分があることを表す情報を設定し、第１のメッセージのうち第２の領域に格納された部分に、最後の部分であることを表す情報を設定してもよい。このようにすれば、メッセージを受信した装置がメッセージから情報を適切に抽出できるようになる。
【０２１２】
本実施の形態の第２の態様に係る通信制御方法は、（Ｅ）送信すべきメッセージの数と、送信すべきメッセージを格納するバッファからメッセージを取り出して取り出した当該メッセージを送信する処理を各々が実行する１又は複数の通信部の数とを比較する比較処理と、比較処理の結果に基づき、バッファに格納されているメッセージの中から、宛先が同じである２以上のメッセージを統合する処理である統合処理の対象であるメッセージを特定し、特定された当該メッセージについて統合処理を実行する処理とを含む。
【０２１３】
なお、上記方法による処理をコンピュータに行わせるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブルディスク、ＣＤ−ＲＯＭ、光磁気ディスク、半導体メモリ、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。尚、中間的な処理結果はメインメモリ等の記憶装置に一時保管される。
【０２１４】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【０２１５】
（付記１）
送信すべき１又は複数のメッセージを格納するバッファと、
前記バッファからメッセージを取り出し、取り出した当該メッセージを送信する処理を各々が実行する１又は複数の通信部と、
前記バッファに格納されているメッセージの数と前記通信部の数との比較結果に基づき、前記バッファに格納されているメッセージの中から、宛先が同じである２以上のメッセージを統合する処理である統合処理の対象であるメッセージを特定し、特定された当該メッセージについて前記統合処理を実行する実行部と、
を有する情報処理装置。
【０２１６】
（付記２）
前記実行部は、
前記バッファに格納されているメッセージの数が、前記通信部の数より多いか判定し、
前記バッファに格納されているメッセージの数が前記通信部の数より多い場合に、前記バッファに格納されているメッセージのうち、前記通信部の数のメッセージを前記統合処理の対象から除外する
処理を実行し、
前記統合処理の対象から除外されるメッセージは、前記バッファに格納されているメッセージのうち前記統合処理の対象であるメッセージより先に前記バッファから取り出されるメッセージである
付記１記載の情報処理装置。
【０２１７】
（付記３）
前記実行部は、
前記バッファに格納されているメッセージの数が、前記通信部の数以下である場合に、前記バッファに格納されているメッセージを前記統合処理の対象から除外する
付記２記載の情報処理装置。
【０２１８】
（付記４）
前記バッファは複数の領域を有し、
前記実行部は、
宛先が異なる２以上のメッセージが１の領域に格納されないように前記バッファに格納されているメッセージを前記複数の領域に分類する
付記１乃至３のいずれか１つ記載の情報処理装置。
【０２１９】
（付記５）
宛先の識別情報に対応付けて、当該宛先に送信すべきメッセージが格納された領域を特定するための情報と当該領域の空容量の情報とを格納する管理データ格納部
をさらに有し、
前記実行部は、
前記管理データ格納部を用いて、新たに生成された第１のメッセージのデータ量が、前記第１のメッセージの宛先に送信すべき第２のメッセージが格納された領域である第１の領域の空容量より多いか判定し、
前記第１のメッセージのデータ量が前記第１の領域の空容量以下であり且つ前記第２のメッセージが前記統合処理の対象である場合に、前記第１のメッセージと前記第２のメッセージとを統合する
付記４記載の情報処理装置。
【０２２０】
（付記６）
前記実行部は、
前記第１のメッセージのデータ量が前記第１の領域の空容量より多く且つ前記第２のメッセージが前記統合処理の対象である場合に、前記第１の領域の空容量が無くなるように、前記第１のメッセージの一部を前記第１の領域に格納し、
前記複数の領域のうちメッセージが格納されていない領域である第２の領域に、前記第１のメッセージのうち前記第１の領域に格納された部分以外の部分を格納する
付記５記載の情報処理装置。
【０２２１】
（付記７）
前記管理データ格納部に格納されている、前記宛先に送信すべきメッセージが格納された領域を特定するための情報は、当該宛先に送信すべきメッセージのうち前記バッファに格納された時点が最も後であるメッセージが格納された領域を特定するための情報である
付記５又は６記載の情報処理装置。
【０２２２】
（付記８）
前記複数の領域の各々に格納される１又は複数のメッセージの総データ量は、前記複数の通信部の各々が一度に送信できるデータ量以下である
付記４乃至７のいずれか１つ記載の情報処理装置。
【０２２３】
（付記９）
前記実行部は、
前記第１のメッセージのうち前記第１の領域に格納された部分に、後続の部分があることを表す情報を設定し、前記第１のメッセージのうち前記第２の領域に格納された部分に、最後の部分であることを表す情報を設定する
付記６記載の情報処理装置。
【０２２４】
（付記１０）
送信すべきメッセージの数と、前記送信すべきメッセージを格納するバッファからメッセージを取り出して取り出した当該メッセージを送信する処理を各々が実行する１又は複数の通信部の数とを比較する比較処理と、
前記比較処理の結果に基づき、前記バッファに格納されているメッセージの中から、宛先が同じである２以上のメッセージを統合する処理である統合処理の対象であるメッセージを特定し、特定された当該メッセージについて前記統合処理を実行する処理と、
をコンピュータが実行する通信制御方法。
【０２２５】
（付記１１）
送信すべきメッセージの数と、前記送信すべきメッセージを格納するバッファからメッセージを取り出して取り出した当該メッセージを送信する処理を各々が実行する１又は複数の通信部の数とを比較する比較処理と、
前記比較処理の結果に基づき、前記バッファに格納されているメッセージの中から、宛先が同じである２以上のメッセージを統合する処理である統合処理の対象であるメッセージを特定し、特定された当該メッセージについて前記統合処理を実行する処理と、
をコンピュータに実行させるためのプログラム。
【符号の説明】
【０２２６】
１０，１１，１２  サーバ    ３０，３１  クライアント端末
５  ネットワーク
１００  定義ファイル格納部    １０１  初期化処理部
１０２  受信処理用スレッド    １０３  データ処理用スレッド
１０４，１００１，１００２，１００３  送信処理用スレッド
１０５  管理データ格納部    １０６  処理要求格納部
１０７  処理結果格納部    １０８  データ格納部
３０１  管理部    ３０２  クライアントプロセス
３０３  定義ファイル格納部    ３０４  管理データ格納部
１０００  バッファ
【図１】
0006369176.tif 000002
【図２】
0006369176.tif 000003
【図３】
0006369176.tif 000004
【図４】
0006369176.tif 000005
【図５】
0006369176.tif 000006
【図６】
0006369176.tif 000007
【図７】
0006369176.tif 000008
【図８】
0006369176.tif 000009
【図９】
0006369176.tif 000010
【図１０】
0006369176.tif 000011
【図１１】
0006369176.tif 000012
【図１２】
0006369176.tif 000013
【図１３】
0006369176.tif 000014
【図１４】
0006369176.tif 000015
【図１５】
0006369176.tif 000016
【図１６】
0006369176.tif 000017
【図１７】
0006369176.tif 000018
【図１８】
0006369176.tif 000019
【図１９】
0006369176.tif 000020
【図２０】
0006369176.tif 000021
【図２１】
0006369176.tif 000022
【図２２】
0006369176.tif 000023
【図２３】
0006369176.tif 000024
【図２４】
0006369176.tif 000025
【図２５】
0006369176.tif 000026
【図２６】
0006369176.tif 000027
【図２７】
0006369176.tif 000028
【図２８】
0006369176.tif 000029
【図２９】
0006369176.tif 000030
【図３０】
0006369176.tif 000031
【図３１】
0006369176.tif 000032
【図３２】
0006369176.tif 000033
【図３３】
0006369176.tif 000034
【図３４】
0006369176.tif 000035
【図３５】
0006369176.tif 000036
【図３６】
0006369176.tif 000037
【図３７】
0006369176.tif 000038
【図３８】
0006369176.tif 000039
【図３９】
0006369176.tif 000040
【図４０】
0006369176.tif 000041
【図４１】
0006369176.tif 000042
【図４２】
0006369176.tif 000043
【図４３】
0006369176.tif 000044
【図４４】
0006369176.tif 000045
【図４５】
0006369176.tif 000046
【図４６】
0006369176.tif 000047
【図４７】
0006369176.tif 000048