IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 株式会社ソフトギアの特許一覧

特開2023-85797情報処理プログラム、情報処理装置及び情報処理方法
<>
  • 特開-情報処理プログラム、情報処理装置及び情報処理方法 図1
  • 特開-情報処理プログラム、情報処理装置及び情報処理方法 図2
  • 特開-情報処理プログラム、情報処理装置及び情報処理方法 図3
  • 特開-情報処理プログラム、情報処理装置及び情報処理方法 図4
  • 特開-情報処理プログラム、情報処理装置及び情報処理方法 図5
  • 特開-情報処理プログラム、情報処理装置及び情報処理方法 図6
  • 特開-情報処理プログラム、情報処理装置及び情報処理方法 図7
  • 特開-情報処理プログラム、情報処理装置及び情報処理方法 図8
  • 特開-情報処理プログラム、情報処理装置及び情報処理方法 図9
  • 特開-情報処理プログラム、情報処理装置及び情報処理方法 図10
  • 特開-情報処理プログラム、情報処理装置及び情報処理方法 図11
  • 特開-情報処理プログラム、情報処理装置及び情報処理方法 図12
  • 特開-情報処理プログラム、情報処理装置及び情報処理方法 図13
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2023085797
(43)【公開日】2023-06-21
(54)【発明の名称】情報処理プログラム、情報処理装置及び情報処理方法
(51)【国際特許分類】
   H04L 49/9005 20220101AFI20230614BHJP
   G06F 13/10 20060101ALI20230614BHJP
   H04L 47/50 20220101ALI20230614BHJP
【FI】
H04L49/9005
G06F13/10 330A
H04L47/50
【審査請求】有
【請求項の数】16
【出願形態】OL
(21)【出願番号】P 2021200032
(22)【出願日】2021-12-09
(11)【特許番号】
(45)【特許公報発行日】2022-04-28
(71)【出願人】
【識別番号】308020799
【氏名又は名称】株式会社ソフトギア
(74)【代理人】
【識別番号】100180758
【弁理士】
【氏名又は名称】荒木 利之
(72)【発明者】
【氏名】宮永 直樹
【テーマコード(参考)】
5K030
【Fターム(参考)】
5K030GA01
5K030JL01
5K030JT09
5K030LD01
5K030LE01
5K030MA13
5K030MB15
(57)【要約】      (修正有)
【課題】アプリケーション処理及びデータの送信をノンブロッキングに実行して通信を高速化する情報処理プログラム、情報処理装置及び情報処理方法を提供する。
【解決手段】サーバ装置1は、イベントを蓄積するバッファリング手段106と、イベントを処理するソケット書込手段102と、排他的にフラグを立てるフラグ管理手段107とを有する。ソケット書込手段102は、ソケット書込要求手段102aと、コールバック処理手段102bとを含む。フラグ管理手段107は、ソケット書込要求手段102aがイベントの処理の開始前のタイミングで排他的にフラグを立て、コールバック処理手段102bの処理の終了後のタイミングでフラグを解除する。ソケット書込要求手段102aは、呼び出しを受け付けて、当該フラグが立てられた場合は、バッファリング手段106が蓄積したイベントを処理する。
【選択図】図2
【特許請求の範囲】
【請求項1】
コンピュータを、
処理対象とするイベントを蓄積するイベント蓄積手段と、
前記イベントを蓄積するバッファリング手段と、
前記蓄積したイベントを処理する処理手段と、
呼び出しを受け付けて排他的にフラグを立てるフラグ管理手段として機能させ、
前記処理手段は、イベントの処理を要求する処理要求手段と、イベントの処理を完了し
た場合に完了通知を受けて実行するコールバック処理手段とを含み、
前記フラグ管理手段は、前記イベント処理要求手段がイベントの処理の開始前のタイミングで排他的にフラグを立て、前記コールバック処理手段の処理の終了後のタイミングでフラグを解除し、
前記処理要求手段は、前記イベント蓄積手段の前記バッファリング手段へのイベント蓄積終了後のタイミング及び前記コールバック処理手段のイベント処理終了後のタイミングで呼び出しを受け付けて、前記フラグ管理手段のフラグに応じて当該フラグが、立てられなかった場合は処理をせずに終了し、立てられた場合は前記バッファリング手段が蓄積した前記イベントを処理する情報処理プログラム。
【請求項2】
前記バッファリング手段は、イベントを蓄積する第1のバッファリング手段と、前記第1のバッファリング手段に蓄積された前記イベントを蓄積する第2のバッファリング手段とを有し、
前記処理要求手段は、フラグが立てられた場合に、前記第1のバッファリング手段から前記第2のバッファリング手段に前記イベントを移動して蓄積し、前記第2のバッファリング手段が蓄積している前記イベントの全て又は一部を処理する請求項1に記載の情報処理プログラム。
【請求項3】
前記第1のバッファリング手段と前記第2のバッファリング手段の間、前記第1のバッファリング手段の前段又は前記第2のバッファリング手段の後段に、さらに1以上のバッファリング手段を有する請求項2に記載の情報処理プログラム。
【請求項4】
前記バッファリング手段間の移動において、データブロックのサイズ、個数、タイプ、イベント保持形式の少なくとも1つを変更する請求項2又は3に記載の情報処理プログラム。
【請求項5】
前記バッファリング手段間の移動において、移動イベントの数やサイズを予め定めた条件で制限する請求項2から4のいずれか1項に記載の情報処理プログラム。
【請求項6】
前記バッファリング手段は、イベント蓄積手段のイベント蓄積動作と、前記処理手段の処理動作とが、非同期に実行される請求項1から5のいずれか1項に記載の情報処理プログラム。
【請求項7】
前記バッファリング手段は、並列動作する複数のイベント生成元が実行するそれぞれのイベントの蓄積手段が非同期にイベントを蓄積する請求項1から6のいずれか1項に記載の情報処理プログラム。
【請求項8】
前記バッファリング手段は、リングバッファである請求項1から7のいずれか1項に記載の情報処理プログラム。
【請求項9】
前記バッファリング手段は、前記イベントそのものをメモリ領域に順次蓄積するリングバッファである請求項1に記載の情報処理プログラム。
【請求項10】
前記バッファリング手段は、2段リングバッファ構成であり、第1段のリングバッファは並列動作するイベント蓄積手段のイベントを蓄積し、第2段のリングバッファは前記処理手段の処理に応じて定められたサイズに当該イベントを連結および分割するとともに前記処理手段に応じて定められた個数保持する請求項2、6又は7に記載の情報処理プログラム。
【請求項11】
前記バッファリング手段は、ダイレクトバッファに前記イベントを格納することを特徴とする請求項1、2又は6から10のいずれか1項に記載の情報処理プログラム。
【請求項12】
前記バッファリング手段は、バッファプールのバッファに前記イベントを蓄積する請求項1、2又は6から10のいずれか1項に記載の情報処理プログラム。
【請求項13】
前記バッファリング手段は、前記第1段のリングバッファと前記第2段のリングバッファとで、異なるバッファサイズを保持するバッファプールのバッファにイベントを蓄積する請求項10に記載の情報処理プログラム。
【請求項14】
前記処理手段は、蓄積されている前記イベントをすべて処理してからイベント処理を終了する請求項1から請求項13のいずれか1項に記載の情報処理プログラム。
【請求項15】
処理対象とするイベントを蓄積するイベント蓄積手段と、
前記イベントを蓄積するバッファリング手段と、
前記蓄積したイベントを処理する処理手段と、
呼び出しを受け付けて排他的にフラグを立てるフラグ管理手段とを有し、
前記処理手段は、イベントの処理を要求する処理要求手段と、イベントの処理を完了し
た場合に完了通知を受けて実行するコールバック処理手段とを含み、
前記フラグ管理手段は、前記イベント処理要求手段がイベントの処理の開始前のタイミングで排他的にフラグを立て、前記コールバック処理手段の処理の終了後のタイミングでフラグを解除し、
前記処理要求手段は、前記イベント蓄積手段の前記バッファリング手段へのイベント蓄積終了後のタイミング及び前記コールバック処理手段のイベント処理終了後のタイミングで呼び出しを受け付けて、前記フラグ管理手段のフラグに応じて当該フラグが、立てられなかった場合は処理をせずに終了し、立てられた場合は前記バッファリング手段が蓄積した前記イベントを処理する情報処理装置。
【請求項16】
コンピュータを、
処理対象とするイベントを蓄積するイベント蓄積ステップと、
前記イベントを蓄積するバッファリングステップと、
前記蓄積したイベントを処理する処理ステップと、
呼び出しを受け付けて排他的にフラグを立てるフラグ管理ステップとを有し、
前記処理ステップは、イベントの処理を要求する処理要求ステップと、イベントの処理を完了した場合に完了通知を受けて実行するコールバック処理ステップとを含み、
前記フラグ管理ステップは、前記イベント処理要求ステップにおけるイベントの処理の開始前のタイミングで排他的にフラグを立て、前記コールバック処理ステップにおける処理の終了後のタイミングでフラグを解除し、
前記処理要求ステップは、前記イベント蓄積ステップにおけるイベント蓄積終了後のタイミング及び前記コールバック処理ステップにおけるイベント処理終了後のタイミングで呼び出しを受け付けて、前記フラグが、立てられなかった場合は処理をせずに終了し、立てられた場合は蓄積した前記イベントを処理する情報処理方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、情報処理プログラム、情報処理装置及び情報処理方法に関する。
【背景技術】
【0002】
従来の技術として、データの大きさに応じて使用するバッファを変更してデータを送信する情報処理装置が提案されている(例えば、特許文献1参照)。
【0003】
特許文献1に開示された情報処理装置のCPU(Central Processing Unit)は、アプリケーションバッファエリアを占有するアプリケーションタスクとリングバッファエリアを占有するTCP(Transmission Control Protocol)/IP(Internet Protocol)タスクとを並列的に実行する。アプリケーションタスクは、データ生成処理によってアプリケーションバッファエリアに格納されたデータのサイズが閾値以下であるか否かを判別し、判別結果が肯定的であるときアプリケーションバッファエリア上のデータをリングバッファエリアに複製してデータ送信指示を発行する一方、判別結果が否定的であるときアプリケーションバッファエリアの占有権をTCP/IPタスクに一時的に付与してデータ送信指示を発行する。TCP/IPタスクは、自ら占有するメモリエリア上の送信データをデータ送信指示に応答して送信する。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特開2010-55214号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
しかし、特許文献1の情報処理装置は、送信するデータ量が少ない場合はリングバッファを用いてデータを送信して、アプリケーションタスクを並列して行い、送信するデータ量が多い場合はTCP/IPタスクを専有的に処理することで通信速度の高速化を図るものの、送信するデータ量が多い場合はアプリケーションタスクがブロッキングされて処理されない、という問題がある。
【0006】
従って本発明の目的は、アプリケーション処理及びデータの送信をノンブロッキングに実行して通信を高速化する情報処理プログラム、情報処理装置及び情報処理方法を提供することにある。
【課題を解決するための手段】
【0007】
本発明の一態様は、上記目的を達成するため、以下の情報処理プログラム、情報処理装置及び情報処理方法を提供する。
【0008】
[1]コンピュータを、
処理対象とするイベントを蓄積するイベント蓄積手段と、
前記イベントを蓄積するバッファリング手段と、
前記蓄積したイベントを処理する処理手段と、
呼び出しを受け付けて排他的にフラグを立てるフラグ管理手段として機能させ、
前記処理手段は、イベントの処理を要求する処理要求手段と、イベントの処理を完了し
た場合に完了通知を受けて実行するコールバック処理手段とを含み、
前記フラグ管理手段は、前記イベント処理要求手段がイベントの処理の開始前のタイミングで排他的にフラグを立て、前記コールバック処理手段の処理の終了後のタイミングでフラグを解除し、
前記処理要求手段は、前記イベント蓄積手段の前記バッファリング手段へのイベント蓄積終了後のタイミング及び前記コールバック処理手段のイベント処理終了後のタイミングで呼び出しを受け付けて、前記フラグ管理手段のフラグに応じて当該フラグが、立てられなかった場合は処理をせずに終了し、立てられた場合は前記バッファリング手段が蓄積した前記イベントを処理する情報処理プログラム。
[2]前記バッファリング手段は、イベントを蓄積する第1のバッファリング手段と、前記第1のバッファリング手段に蓄積された前記イベントを蓄積する第2のバッファリング手段とを有し、
前記処理要求手段は、フラグが立てられた場合に、前記第1のバッファリング手段から前記第2のバッファリング手段に前記イベントを移動して蓄積し、前記第2のバッファリング手段が蓄積している前記イベントの全て又は一部を処理する前記[1]に記載の情報処理プログラム。
[3]前記第1のバッファリング手段と前記第2のバッファリング手段の間、前記第1のバッファリング手段の前段又は前記第2のバッファリング手段の後段に、さらに1以上のバッファリング手段を有する前記[2]に記載の情報処理プログラム。
[4]前記バッファリング手段間の移動において、データブロックのサイズ、個数、タイプ、イベント保持形式の少なくとも1つを変更する前記[2]又は[3]に記載の情報処理プログラム。
[5]前記バッファリング手段間の移動において、移動イベントの数やサイズを予め定めた条件で制限する前記[2]~[4]のいずれかに記載の情報処理プログラム。
[6]前記バッファリング手段は、イベント蓄積手段のイベント蓄積動作と、前記処理手段の処理動作とが、非同期に実行される前記[1]から[5]のいずれかに記載の情報処理プログラム。
[7]前記バッファリング手段は、並列動作する複数のイベント生成元が実行するそれぞれのイベントの蓄積手段が非同期にイベントを蓄積する前記[1]から[6]のいずれかに記載の情報処理プログラム。
[8]前記バッファリング手段は、リングバッファである前記[1]から[7]のいずれかに記載の情報処理プログラム。
[9]前記バッファリング手段は、前記イベントそのものをメモリ領域に順次蓄積するリングバッファである前記[1]に記載の情報処理プログラム。
[10]前記バッファリング手段は、2段リングバッファ構成であり、第1段のリングバッファは並列動作するイベント蓄積手段のイベントを蓄積し、第2段のリングバッファは前記処理手段の処理に応じて定められたサイズに当該イベントを連結および分割するとともに前記処理手段に応じて定められた個数保持する前記[2]、[6]又は[7]に記載の情報処理プログラム。
[11]前記バッファリング手段は、ダイレクトバッファに前記イベントを格納することを特徴とする前記[1]、[2]又は[6]から[10]のいずれかに記載の情報処理プログラム。
[12]前記バッファリング手段は、バッファプールのバッファに前記イベントを蓄積する前記[1]、[2]又は[6]から[10]のいずれかに記載の情報処理プログラム。
[13]前記バッファリング手段は、前記第1段のリングバッファと前記第2段のリングバッファとで、異なるバッファサイズを保持するバッファプールのバッファにイベントを蓄積する前記[10]に記載の情報処理プログラム。
[14]前記処理手段は、蓄積されている前記イベントをすべて処理してからイベント処理を終了する前記[1]から[13]のいずれかに記載の情報処理プログラム。
[15]処理対象とするイベントを蓄積するイベント蓄積手段と、
前記イベントを蓄積するバッファリング手段と、
前記蓄積したイベントを処理する処理手段と、
呼び出しを受け付けて排他的にフラグを立てるフラグ管理手段とを有し、
前記処理手段は、イベントの処理を要求する処理要求手段と、イベントの処理を完了し
た場合に完了通知を受けて実行するコールバック処理手段とを含み、
前記フラグ管理手段は、前記イベント処理要求手段がイベントの処理の開始前のタイミングで排他的にフラグを立て、前記コールバック処理手段の処理の終了後のタイミングでフラグを解除し、
前記処理要求手段は、前記イベント蓄積手段の前記バッファリング手段へのイベント蓄積終了後のタイミング及び前記コールバック処理手段のイベント処理終了後のタイミングで呼び出しを受け付けて、前記フラグ管理手段のフラグに応じて当該フラグが、立てられなかった場合は処理をせずに終了し、立てられた場合は前記バッファリング手段が蓄積した前記イベントを処理する情報処理装置。
[16]コンピュータを、
処理対象とするイベントを蓄積するイベント蓄積ステップと、
前記イベントを蓄積するバッファリングステップと、
前記蓄積したイベントを処理する処理ステップと、
呼び出しを受け付けて排他的にフラグを立てるフラグ管理ステップとを有し、
前記処理ステップは、イベントの処理を要求する処理要求ステップと、イベントの処理を完了した場合に完了通知を受けて実行するコールバック処理ステップとを含み、
前記フラグ管理ステップは、前記イベント処理要求ステップにおけるイベントの処理の開始前のタイミングで排他的にフラグを立て、前記コールバック処理ステップにおける処理の終了後のタイミングでフラグを解除し、
前記処理要求ステップは、前記イベント蓄積ステップにおけるイベント蓄積終了後のタイミング及び前記コールバック処理ステップにおけるイベント処理終了後のタイミングで呼び出しを受け付けて、前記フラグが、立てられなかった場合は処理をせずに終了し、立てられた場合は蓄積した前記イベントを処理する情報処理方法。
【発明の効果】
【0009】
請求項1、15、16に係る発明によれば、アプリケーション処理及びデータの送信をノンブロッキングに実行して通信を高速化することができる。
【図面の簡単な説明】
【0010】
図1図1は、実施の形態に係る通信管理システムの構成の一例を示す概略図である。
図2図2は、実施の形態に係るサーバ装置の構成例を示すブロック図である。
図3図3は、データ送受信の動作の一例を説明するための概略図である。
図4図4は、データ送信動作の一例を説明するための概略図である。
図5図5は、レイヤ構成の変形例を示す概略図である。
図6図6は、ソケット書込要求手段の動作例を説明するためのフローチャートである。
図7図7は、コールバック処理手段の動作例を説明するためのフローチャートである。
図8図8は、ソケット書込要求手段の動作例を説明するためのフローチャートである。
図9図9は、データ送受信の動作の別の一例を説明するための概略図である。
図10図10は、データ送信動作の別の一例を説明するための概略図である。
図11図11は、ソケット書込要求手段の別の動作例を説明するためのフローチャートである。
図12図12は、コールバック処理手段の別の動作例を説明するためのフローチャートである。
図13図13は、ソケット書込要求手段の別の動作例を説明するためのフローチャートである。
【0011】
[第1の実施の形態]
(通信管理システムの構成)
図1は、実施の形態に係る通信管理システムの構成の一例を示す概略図である。
【0012】
この通信管理システムは、情報処理装置としてのサーバ装置1と、当該サーバ装置1のクライアントとしての端末装置2a、2b、2cとをネットワークによって互いに通信可能に接続することで構成される。通信管理システムに含まれる装置は、パソコン、ゲーム端末、クラウド、仮想マシンであってもよい。ネットワークは、LANやインターネットであってもよいし、仮想ネットワークなどであってもよい。
【0013】
サーバ装置1は、サーバ型の情報処理装置であり、操作者の操作する端末装置2a、2b、2cの要求に応じて動作するものであって、本体内に情報を処理するための機能を有するCPU(Central Processing Unit)やHDD(Hard Disk Drive)又はフラッシュメモリ、揮発性メモリ、LANボード(無線/有線)等の電子部品を備える。サーバ装置1は、端末装置2a、2b、2cと通信し、データの送受信を行うことで端末装置2a、2b、2c上で扱うデータの同期を行うものであって、例えば、ゲームサーバ等である。サーバ装置1は、同期動作を行う場合は容量の小さいデータを頻繁にやりとりするものであるが、これに限られるものではない。なお、サーバ装置1は、複数のクラスタによって構成してもよく、分散処理を実行するよう構成してもよい。あるいは、クラウド環境において仮想マシンとして構成してもよい。
【0014】
端末装置2a、2b、2cは、端末型の情報処理装置であり、プログラムに基づいて動作するものであって、本体内に情報を処理するための機能を有するCPUやHDD又はフラッシュメモリ等の電子部品を備える。端末装置2a、2b、2cは、例えば、MMOG(Massively Multiplayer Online Game)等のプログラムに基づいて動作し、動作の結果としてデータをサーバ装置1に対して逐次出力するとともに、サーバ装置1から他の端末の動作の結果としてのデータを受信して各端末装置2a、2b、2c間で高頻度にゲームオブジェクトを同期するものである。なお、端末装置2a、2b、2cは3つの装置で描かれているが単一あるいは2個の装置であってもよいし、4以上の装置で構成してもよく、好ましくは、1000台オーダーの端末装置が接続されるような場合であっても通信可能な構成を提供する。
【0015】
ネットワーク4は、高速通信が可能な通信ネットワークであり、例えば、イントラネットやLAN(Local Area Network)等の有線又は無線の通信網である。
【0016】
一例として、第1の実施の形態における通信管理システムにおいて、複数の参加者が共通の仮想空間における活動、例えばゲームを行う多人数参加型ゲームが実行される。サーバ装置1及び端末装置2a、2b、2cは、ゲームの進行に伴い各装置内でオブジェクトとして保持している情報(同期対象オブジェクト)を、各装置間で同期するために動作し、特にサーバ装置1は、データ通信を高速化すべくアプリケーションとNIC(Network Interface Card)との間にバッファを設けてアプリケーションとNIC間のデータ授受の動作を制御する。言い換えれば、マルチプロセス、マルチスレッドが、共有リソース(ソケットやNIC)に非同期に書き込む要求が大量に発生する場合、データが混ざらないようにシリアライズするには、排他制御が必要となるため、送信通信路を効率よく使用(特に、送信通路がデータで混雑してからのスループット向上)するために、バッファにバッファリングして、当該バッファへの書込で排他制御(ブロッキング)を行い、当該バッファからの共有リソースへの書込はCAS(Compare and Swap)等でロックフリー(ノンブロッキング)な制御をする。動作の詳細について、実施の形態において具体的に説明する。
【0017】
また、第1の実施の形態において使用する「オブジェクト」等の語句は、例えば、Java(登録商標)、C++、C#、Python、JavaScript(登録商標)、Ruby等で用いられる同語句と同義で用いられるが、以降、クラス、及びインスタンス化されたクラス(インスタンス)のことを総称して「オブジェクト」と言う場合がある。
【0018】
(サーバ装置の構成)
図2は、第1の実施の形態に係るサーバ装置1の構成例を示すブロック図である。以下にサーバ装置1での実装について記述するが、端末装置2a、2b、2cも同様な構成としてもよい。
【0019】
サーバ装置1は、CPU(Central Processing Unit)等から構成され、各部を制御するとともに、各種のプログラムを実行する制御部10と、フラッシュメモリ等の記憶媒体から構成され情報を記憶する記憶部11と、揮発性記録媒体から構成され一時的に情報を記憶するメモリ12と、ネットワークを介して外部と通信する通信部13とを備える。
【0020】
制御部10は、OS(Operating System)110を実行することで、OS実行手段100(Javaの場合はJVMも含む)として機能し、アプリケーション112を実行することで、アプリケーション実行手段103、アプリケーション読出手段104、アプリケーション書込手段105として機能し、情報処理プログラムとしての通信管理プログラム111を実行することで、ソケット読出手段101、ソケット書込手段102、バッファリング手段106(受信バッファ106aと送信バッファ106bを含む)、フラグ管理手段107等として機能する。
【0021】
OS実行手段100(OSカーネル)は、OS110を実行し、OS110が有する各機能を提供する。OS実行手段100は、特に通信部13(NIC)を制御してネットワークにデータを送信し、ネットワークからデータを受信する。なお、JAVAを利用している場合は、Java VMもOSの一部とみなし、OS実行手段100によって実行されるものとする。
【0022】
アプリケーション実行手段103は、処理手段としてアプリケーション112を実行し、アプリケーション112が有する各機能を提供するものであり、実行に伴い単一又は複数のスレッドを処理する。典型的には、それぞれのスレッドは、単一又は複数の端末装置とそれぞれ対応する単一又は複数のソケット(端末装置2a、2b、又は、2cの通信対象プログラムのIPアドレス及びポート番号)を介してネットワーク通信(送受信)を行う。
【0023】
アプリケーション読出手段104は、アプリケーション112が有する機能として特に、スレッドの受信処理のために受信対象となるソケット(端末装置2a、2b、又は、2c)に対応する受信バッファ106aのデータを読み出す。
【0024】
アプリケーション書込手段105は、スレッドの処理の結果生成されたデータを送信対象となるソケット(端末装置2a、2b、又は、2c)に対応する送信処理のために送信バッファに書き込む。書き込まれたデータは通常は書き込まれた順に送信バッファ121bに追加される。例えば、ゲームサーバがゲームオブジェクトの同期処理のため、同期情報のリレー処理を行う場合、アプリケーション書込手段105は、端末装置2aから同期情報のデータ受信し、スレッドで受信データを処理した結果、端末装置2b、及び、2cに同期情報データを送信する。アプリケーション書込手段105は、それぞれの端末装置に対応する2個のソケットに対応する2個の送信バッファ121bにデータを書き込む。アプリケーション書込手段105は、送信バッファ121bにデータを追加した後、ソケット書込要求手段102aを呼び出す。
【0025】
ソケット読出手段101は、OS110が有する機能として特に、ネットワークとの通信においてソケットによって受信したデータを後述する受信バッファ106aに読み出す。
【0026】
処理手段としてのソケット書込手段102は、処理要求手段としてのソケット書込要求手段102aとコールバック処理手段102bとして機能する。
【0027】
図6及び図8は、ソケット書込要求手段102aの動作例を説明するためのフローチャートである。また、図7は、コールバック処理手段102bの動作例を説明するためのフローチャートである。
【0028】
図6に示すように、ソケット書込要求手段102aは、まず、フラグ管理手段107に依頼して、フラグ管理手段107の管理するフラグの状態を確認し(S10)、フラグが解除されている場合(S11;Yes)、フラグを立てる(S12)。ソケット書込要求手段102aは、アプリケーション書込手段105がイベントをリングバッファ121bに書き込み処理を終了する直前、及びソケット書込要求手段102aの完了後に実行される対応するコールバック処理手段102bの完了直前のいずれかから非同期に呼び出される。呼び出しは通常のメソッドあるいは関数の呼び出しでもよいし、あるいは、OS機能を使い待機しているスレッドへのシグナリングによる起動でもよい。フラグが立てられると、次に、ソケット書込要求手段102aは、ネットワークとの通信により送信するデータを送信バッファ106bからソケットに書き込んで、OS実行手段100にイベントの処理を要求する(S13)。もし、フラグ管理手段107の管理しているフラグがすでに立っている場合は(S11;No)、処理を直ちに終了する。なお、ここでは理解の容易性のため、フラグの検査S10/S11とフラグの変更S12を3個の別ブロックとして説明したが、マルチスレッド環境では、フラグの検査S10とフラグのセットS12の間に別スレッドがスイッチされて割り込むと、複数のスレッドそれぞれがフラグを立てた状態にして(S12)、自分のスレッドがフラグを立てたつもりになってイベント処理(S13)を実行するので、同時時期に、イベント処理(S13)を複数回実行してしまう可能性があり不都合である。この問題を解決するために、本発明では、ブロッキングによってソケット書込手段102a実行を排他制御するかわりに、後述するようなフラグ管理手段107が提供するCAS(Compare and swap)の機能を利用して、フラグの検査(S10/S11)と変更設定(S12)を単一のCPU命令で実行し、S10・S11・S12の処理の間に他のスレッドが実行されない工夫を行っている。
【0029】
また、図8に示すように、ソケット書込要求手段102aは、ステップS13において送信バッファ106bに送信対象のデータがあるか確認し(S30)、送信対象のデータがある場合(S30;Yes)、OS実行手段100にOS非同期送信要求を行ってイベントの処理を要求する(S31)。また、ソケット書込要求手段102aは、送信対象のデータがない場合(S30;No)、フラグ管理手段107に依頼して、フラグを解除する(S32)。
【0030】
図7に示すように、コールバック処理手段102bは、OS実行手段100がソケット書込要求手段102aにより依頼された書込イベントの処理(図8のS31)を完了した場合に、OS実行手段100から完了通知を受け付けて(非同期に)実行する。OS実行手段100が実行したネットワーク送信結果を受け取る(S20)。送信結果が正常の場合は(S21;Yes)、コールバック処理手段102bは、送信完了分を送信バッファから除外する(S22)。引き続き、コールバック処理手段102bは、フラグ管理手段107に依頼して、フラグを解除する(S23)。引き続き、コールバック処理手段102bは、送信バッファに送信対象データが存在することを確認する(S24)。確認結果が肯定的であれば(送信バッファにデータがあれば)(S24;Yes)、コールバック処理手段102bは、ソケット書込要求手段102aに呼び出しを行う(S25)。確認結果が否定的であれば(S24;No)、コールバック処理手段102bは、処理を終了する。送信結果が異常の場合は(S21;No)、コールバック処理手段102bは、通信断、タイムアウトなどの例外処理(接続の切断など)を行う(S26)。
【0031】
ソケット書込要求手段102a及びコールバック処理手段102bの他の実装としては、以下のように構成してもよい。例えば、コールバック処理手段102bは、OS実行手段100がソケット書込要求手段102aの書込イベントの処理を完了した場合に完了通知を受け付けて(非同期に)実行された送信結果を受け取る。送信結果が異常の場合は、通信断、タイムアウトなどの例外処理(接続の切断など)を行い、終了する。送信結果が正常の場合は、送信完了分を送信バッファから削除する。引き続き、コールバック処理手段102bは、送信バッファに送信対象データが存在することを確認し、確認結果が肯定的であれば、ソケット書込要求手段102aに呼び出しを行う。確認結果が否定的であれば、フラグ管理手段107に依頼して、フラグを解除して処理を終了する。
【0032】
バッファリング手段106は、メモリ12に2種類のバッファ領域、受信バッファ106aと送信バッファ106bを用意し、どちらも読み出し及び書き出しの対象を提供するとともに、読み出し及び書き出しをするデータを管理する。バッファを介することでバッファに対する読み出しと書き出しとを非同期に行うことができる。受信バッファ106aは、ソケット読出手段101が書き込み、アプリケーション読出手段104が読み出す。送信バッファ106bは、アプリケーション書込手段105が書き込み、ソケット書込手段102が読み出す。なお、バッファリング手段106(106a及び106b)は、データをノンブロッキングに読み書きする。バッファに必要なメモリを都度実行時に割り当てるのはCPUの効率が悪いので、事前に大きなメモリ領域(1個以上のブロック)を確保して、それを細分化したメモリチャンクをバッファプールに追加してバッファプールを用いた独自のメモリ管理をし、確保済のメモリブロックを再利用して使い回し、実行時の処理効率を向上させるのは一般的である。また、これらのメモリチャンクを組合せて、論理的にリングバッファを構成することも一般的である。ここでは、バッファ領域はバッファプールの一種であるリングバッファ121(受信バッファ106aとして受信リングバッファ121a、及び、送信バッファ106bとして送信リングバッファ121b)を用いた場合について説明するが、必ずしもリングバッファである必要はなく、論理的に無限長のバッファを提供できるバッファであればよく、好ましくはOSカーネルでの処理に好適なダイレクトバッファ等のヒープ領域外のメモリ領域に作成される高速に入出力が可能な一時記憶領域を用いる。
【0033】
ダイレクトバッファは、実メモリ空間に存在するため、OSの処理実行においては、ダイレクトバッファ上のデータ処理は、仮想メモリ空間に存在する通常の非ダイレクトバッファ上のデータ処理に比べて、内部的なメモリ操作回数を削減し、処理時間を短くできることが知られている。なお、ダイレクトバッファは、非ダイレクトバッファに比べて、アプリケーションにとっては、メモリの割当・解放にOSの処理時間がかかることが知られている。特にダイレクトバッファの場合は、アプリケーションがメモリの割当・解放を高頻度に実行するのは適切ではなく、後述のバッファプールなどを活用して、事前に確保したメモリを使い回すことが望ましい。また、ダイレクトバッファはOSの処理対象としては好適であるが、一方で、アプリケーションの処理対象において、ダイレクトバッファのメモリアクセス(メモリ読取及びメモリ書込)は非ダイレクトバッファのメモリアクセスに比べて時間がかかるため、通常の処理のためにダイレクトバッファを利用することは不適切であることも知られている。ダイレクトバッファは濫用せずに、OSに処理要求をするデータの格納に特化した使用に限定するのが好適である。また、ダイレクトバッファは、当該アプリケーションだけでなく、当該情報装置で実行する他のアプリケーションも利用する共用のリソースであり、濫用すると当該情報装置の他のアプリケーションの稼働に影響を与える可能性もあり、適切に使用量を節約することが望ましい。以上に第1の実施形態を念頭に好適な利用方法を例として示したが、本発明の利用方法を限定するものではない。
【0034】
次に、バッファプールとは、アプリケーションの実行時に素早く動的に必要なメモリ領域を確保するために、アプリケーションの起動時などにメインメモリの空き領域からある程度大きな領域を一括して、複数のメモリブロックとして確保したものとする。バッファプールは、メモリ管理をOSに依頼せず、アプリケーションとして実装し、メモリが必要になったときに、確保されているメモリブロックから適切なサイズのメモリ(メモリチャンク)を借り出し(メモリ割当)、使い終わって不要になったメモリはバッファプールに返却して再利用する(メモリ解放)。バッファプールは様々実装が知られている。通常、メモリブロックはページサイズなど大きなサイズなので、ここでは、アプリケーションで使いやすい1種類あるいは2種類以上の規格化されたサイズのメモリチャンクにあらかじめ分割して、バッファプールに登録する。チャンクサイズは、通常、ページサイズの2の累乗数分の1となるように調整する。2の累乗数分の1とすることで、メモリブロックを無駄なく分割できる。また、規格化されたチャンクサイズのメモリブロックを再利用することで、メモリフラグメンテーションの発生を回避できる。また、メモリをアプリケーションでバッファプールとして管理することは、必要な都度OSにメモリの割当、解放を利用する場合に比べて、個々のメモリ割当・解放に、OS呼出のオーバヘッドなどが発生しないので、メモリ割当・解放の処理が効率化されることが知られている。バッファプールを採用する場合、プールに登録するメモリチャンクのサイズ、種類、数は用途に応じてさまざまな設計方針が考えられる。以上に第1の実施形態を念頭に好適な利用方法を例として示したが、本発明の利用方法を限定するものではない。
【0035】
さて、第1の実施の形態では、バッファプールを用いる場合、メモリチャンクのサイズとして、OSの処理に適したサイズに規格化されたチャンクサイズ(例えば、ページサイズとしてメモリブロックそのまま、あるいは、その半分など)を利用し、メモリの種類としては、OSの処理に適したダイレクトバッファのメモリを利用する。OSの処理に適した大きなサイズ(例えば、ページサイズ)のメモリチャンクに、イベントデータをぎっしりと詰め込むことにより、非常に小さいサイズのイベントデータをそれぞれ別のチャンクに保持する場合に比べて、OSが提供する非同期送信機能としてAsynchronousSocketChannel.write() の集約書込(gathering write)に指定するメモリチャンクの数を効果的に削減し、また、OSでの処理効率はよくなる。OSは同じバイト数のデータを処理する場合、格納するチャンクの数が少ないほうが、内部的処理が速くなることが知られている。例えば、チャンクサイズは、ページサイズあるいはその半分など、より具体的には1KBや2KBなどの単一のサイズを採用する。また、OSの処理のために確保するメモリブロックの種類としては、ヒープに確保される通常のメモリ(非ダイレクトバッファ)ではなく、OSの処理に適したダイレクトバッファを使うとさらにOSでの処理効率がよい。ダイレクトバッファの採用は、バッファプールと組み合わせても、バッファプールを使わずにその都度メモリ割当・解放を行う場合でも使える技術であるが、バッファプールと組み合わせて使うことで、OSでの処理により適した技術となる。以上に第1の実施形態を念頭に好適な利用方法を例として示したが、本発明の利用方法を限定するものではない。
【0036】
フラグ管理手段107は、例えば、CAS(Compare and Swap)等の手段により、フラグをアトミックに管理する。ここでアトミックとは、不可分操作を指し、具体的には、あるメモリ位置の内容と指定された値を比較し、等しければそのメモリ位置に別の指定された値を格納することを1命令で行うCPUの特別な命令を指す。フラグ管理手段107は、ソケット書込要求手段102aの要求によりOS実行手段100がイベント処理を開始するタイミングで排他的にフラグを立て(図6、S12)、イベントの処理の完了のタイミング(コールバック処理手段102bの処理)でフラグを解除する(図7のS23)。ちなみに、図8のS32でもフラグを解除しているがイベント処理を開始するタイミングでフラグをたてたが、イベント処理するデータが全くなかった場合の(例外)処理である。前述のように、図6に示す動作をするので、フラグ管理手段107の機能により、ソケット書込要求手段102a及びコールバック処理手段102bは、ひとつのソケットについては、両手段あわせて高々1個しか同時には実行しないように制御され、ソケットへの書込操作の整合性が保証される。フラグを立てたソケット書込要求手段102a、又は、当該ソケット書込要求手段102aに対応するコールバック処理手段102bが処理中の場合は、2個目以降のソケット書込要求手段102aの呼び出しは、フラグが立っている間は、フラグを自らが立てることができないので、処理を中断し、OS実行手段100への書き込みを行わずに終了(図6のS11;No)する。このため、ソケット書込要求手段102aは必ずしも自らのイベントについてOSに非同期送信呼び出しを実行できるとは限らないが、ノンブロッキングに実行し、イベントが送信できるようになるまで待たずに処理を終了する。ソケット書込要求手段102a自身が非同期送信呼び出しを実行できなかった場合でも、近い将来、実行中のソケット書込手段102(ソケット書込要求手段102aあるいはコールバック処理手段102b)が非同期送信呼び出しを結果的に実行する。すなわち、非同期送信呼び出しが実行されずにソケット書込要求手段102aが処理終了してしまっていたイベントについては、当該イベントが第1のバッファ121bに蓄積されたタイミングに依存して、すでにフラグを立てて排他的に実行中であるソケット書込要求手段102a自身、あるいは当該ソケット書込要求手段102aに対応するコールバック処理手段102bが、後に送信バッファが空でない場合に呼び出すソケット書込要求手段102aにより、非同期送信呼び出しがなされる。なお、前述のように、点線で囲まれたフラグの操作(状態確認や設定のステップS10,S11,S12)はマルチスレッド環境下で他スレッドによる割り込みによる影響がないようにアトミックに実行される必要があり、フラグ管理手段107が提供する(Compare and Swap)の機能を利用する。
【0037】
記憶部11は、制御部10を上述した各手段100-107として動作させるOS110、通信管理プログラム111、アプリケーション112等を記憶する。なお、各手段100~107として機能させるための対象は、OS110、通信管理プログラム111、アプリケーション112を適宜入れ替えて行うものであってもよい。また、記憶部は、リレーショナル・データベースやファイルシステムなどを用いる。なお、高速化のために、Redisなどインメモリデータベースを利用、あるいは、併用してもよい。
【0038】
メモリ12は、バッファリング手段106及びその他図示しない手段により制御され、情報を一時的に記憶する。
【0039】
なお、端末装置2a、2b、2cは、サーバ装置1と同様の構成に加え、操作部及び表示部を備える。サーバ装置1と構成が共通する部分については説明を省略する。
【0040】
(情報処理装置の動作)
次に、第1の実施形態の作用を、(1)基本動作、(2)データ送信動作に分けて説明する。
【0041】
(1)基本動作
一例として、複数のユーザが、複数のゲームオブジェクトを同期させて同一の仮想空間(ルーム)での体験(ゲームプレイ)を共有するために、同じ仮想空間に参加する。ゲームの進行は各端末装置2a、2b、2cで行い、サーバ装置1は、ゲームの進行は行わず、オブジェクトの同期動作のみを行ってもよいし、サーバ装置1がゲームの進行も行ってもよい。
【0042】
サーバ装置1の図示しない参加者管理手段は、ルームへの参加要求を受信すると、参加者に対してユーザID、ユーザ名、ソケットID、参加日時とともに記憶部11の当該ルームIDに関連付けられた参加者管理情報に記録する。
【0043】
端末装置2a、2b、2cは、ゲームのプレイ中は、アプリケーションの実行に伴い複数のオブジェクト(キャラクター、武器、アイテム等)を逐次生成、更新、削除して処理する。サーバ装置1は、ゲームの進行を行う場合、端末装置2a、2b、2cによるオブジェクトの操作要求を受け付けて、処理し、その処理結果を端末装置2a、2b、2cに通知することで、オブジェクトを同期させる。サーバ装置1は、ゲームの進行を行わない場合、端末装置2a、2b、2cにおけるオブジェクトの同期のためのリレー動作を行う。当該リレー動作において、サーバ装置1は、複数のオブジェクトの送受信を行う。いずれの場合でも、サーバ装置は、端末装置2a、2b、2cより、それぞれが操作する複数のオブジェクトの操作に関する情報を受信し、同期対象の端末装置に対応する複数のオブジェクト操作に関する情報を送信する。個々のオブジェクト操作情報のサイズは小さいが、各端末装置2a、2b、2cにおいて、なめらかなオブジェクトの描画を実現するには他頻度なデータ同期(少なくても秒20回から30回程度)が必要となり、洗練されたゲームで同期対象のオブジェクトの数が多い場合、MMOGなど同期対象の端末装置が多い場合、サーバが処理する同期のための送受信パケット数は組み合わせ爆発でストリーミング送受信のように莫大となりうる。近年CPUやメモリの高速化は著しいが、ネットワークの帯域幅、個々の端末とのスループットやレイテンシは、物理的・距離的制約や、モバイルからの利用形態などのトレンドもあり、高速化はよりゆるやかである。そのため、ネットワーク送受信はサーバでの処理において、ボトルネックとなりやすい。本発明では、ネットワーク送信の効率的な利用、NICレベルで常に処理中で空き時間のなるべくないような利用方法、特に、Javaを用いた実装で送信時のソケットの利用率の向上を実現する。以下、サーバ装置1の送受信の動作詳細について説明する。
【0044】
図3は、データ送受信の動作の一例を説明するための概略図である。
【0045】
まず、ネットワーク4からサーバ装置1がデータを受信する場合、ネットワーク4のソース131からあるチャネル130を介し、ソケット読出手段101がチャネルに対応するソケット(受信元端末装置に対応するあるIPアドレスのあるポート)によって受信したデータを読み出して受信リングバッファ121aの書込ポインタの位置に書き込む。データは受信リングバッファ121aに追加される。なお、バッファはチャネルあるいはソケットごとに別々に用意する。また、チャネル/ソケットは送受信共用で、対応する端末装置(端末装置の通信相手となる特定のプログラム)ごとに1つ用意する。アプリバッファは、1つで図示しているが、実際は送受信別に管理する。また、リングバッファは、プールとしては、全チャネルで1つとして管理されており、1つで図示しているが、リングバッファ121は、チャネルごと、送受信別々に、それぞれ独立なポインタの管理があり、チャネルごとに、別々の受信リングバッファ121a、送信リングバッファ121bとして区別する。
【0046】
次に、アプリケーション読出手段104は、受信元端末装置に対応(チャネルあるいはソケット)した受信リングバッファ121aのデータを読出ポインタの位置から読み出してアプリバッファ120に書き込む。データは受信リングバッファ121aから取り出され、受信リングバッファ121aから除外される。ここでアプリバッファ120はアプリケーションが独自に管理するもので、バッファリング手段106が提供するものではない。アプリバッファは、別のバッファリング手段が提供する。たとえば、OS機能(通常のメモリ割当、メモリ解放)がアプリバッファを提供してもよい。メモリを再利用してメモリ管理を効率化するためには、バッファリング手段106同等の機能が提供するように別のバッファリング手段を構成して、アプリバッファを提供してもよい。
【0047】
アプリケーション実行手段103は、アプリバッファ120のデータを読み出してスレッドにて処理する。
【0048】
また、アプリケーション実行手段103のスレッドで処理されたデータをネットワーク4に送信する場合、アプリケーション実行手段103は、スレッドで処理されたデータをアプリバッファ120に書き込む。
【0049】
次に、アプリケーション書込手段105は、アプリバッファ120のデータを意図する送信先端末装置に応じて、送信先端末装置、より厳密には、チャネルあるいはソケットに対応する送信リングバッファ121bの書込ポインタの位置に書き込む。この結果、データは送信リングバッファ121bに追加される。データを書き込み終わると、書込ポインタを進めて、書込終了位置の次に移動する。次回、アプリケーション書込手段105がデータを書き込む時は、移動後の書込ポインタを使用するので、次回書き込むデータは、今回書き込んだデータの後ろに追加される。一方で、アプリバッファ120のデータは、送信リングバッファ121にコピーされた後は不要なり、アプリケーション実行手段103はこのバッファ領域を再利用できる。なお、送信リングバッファ121bはチャネルあるいはソケットごとに用意する。
【0050】
次に、ソケット書込手段102は、送信リングバッファ121bの読出ポインタの位置から書き出しポインタの位置の手前までのデータを読み出し、ソケットによってチャネル130に書き込む。データは、チャネル130を介してソース131に送信される。読出ポインタは、送信に成功したバイト数だけ進めて、送信が完了したデータの次の位置に移動する。この時、データは送信リングバッファ121bから取り出され、送信対象としてOS実行手段100が送信処理をし、送信が完了したデータ(取り出したデータの全部あるいは一部)については、送信リングバッファ121bから除外される。送信が完了しなかったデータについては、引き続き送信リングバッファ121bにとどまる。ここでは、送信リングバッファ121bに蓄積されたデータを全部一度に送信するものとしたが、送信リングバッファ121bに蓄積されているデータが巨大になった場合は、OS送信機能呼出の制限を考慮するなど、全部一度に読み出さず、一部だけを読み出して送信する制御をしてもよい。
【0051】
なお、上記したようにリングバッファ121は、メモリ領域(あるいは、仮想的に連続なメモリ領域)にデータ(イベント)を順次書込み(蓄積)し、読み出しするデータを直接格納するリングバッファであり、格納するデータを順番にメモリ領域に配置・格納(管理するデータを直接的に格納)するものである。このリングバッファ121は、格納したメモリへのポインタをメモリ領域(あるいは、仮想的に連続なメモリ領域)に書込又は読出ポインタとして順番に格納(管理するデータを間接的に格納)するものではない。また、このリングバッファ121は、書込みによりデータ(イベント)の書込単位の境界はなくなるため、データ(イベント)単位で処理する必要がある場合は、境界情報を別途管理しなければならない。第1の実施の形態では、データ処理(イベント処理)は、OSカーネルによるネットワーク送信であるので、データ(イベント)の境界にかかわらずバイトストリームとして送信するので、データ(イベント)の境界は管理しなくてよい。また、第1の実施の形態と同様の効果が得られるようなケースの場合は、他の仮想的なリングバッファの使用を妨げるものではない。
【0052】
以下、アプリケーション実行手段103のスレッドで処理されたデータをOS実行手段100からネットワーク4に送信する場合について詳細に説明する。
【0053】
(2)データ送信動作
図4は、データ送信動作の一例を説明するための概略図である。
【0054】
アプリケーション実行手段103は、例えば、複数のスレッド1、スレッド2によりデータを処理し、処理結果のデータA、データBを同一の端末装置(より厳密には、同一のソケットあるいはチャネル)に送信するために、アプリケーション書込手段105により送信先端末へ通信するソケットに対応する送信リングバッファ121bに書き込まれる。複数のチャネルへ送信するためには、それぞれのチャネルごとに本発明の各手段が必要となる。スレッド1、スレッド2の処理はマルチスレッドの環境下で非同期に発生するものとする。アプリケーション書込手段105は、データA、データBをチャネル毎に最大1つのデータ書込だけ実行するようブロッキング制御し、アプリケーション書込手段105がスレッド1のデータAを送信リングバッファ121bに書き込んでいる間、スレッド2のデータBの書込処理を待機させる。同様にアプリケーション書込手段105がスレッド2のデータBを送信リングバッファ121bに書き込んでいる間、スレッド1はデータCの書込処理を待機させる。送信リングバッファ121bへの書込は、書込ポインタの位置から開始し、書込終了時には書込ポインタを書込終了位置の次に移動させる。ここでは説明の簡単のために、スレッド間の書込操作が送信リングバッファ121bで混ざらないようにブロッキング制御を行う、送信バッファ106bとして、ノンブロッキングなバッファを採用すれば、さらにアプリケーション書込手段105は効率的に機能する。つまり、送信リングバッファ121bの書込ポインタと読込ポインタは、それぞれがある一時期には高々1個だけがアクティブであるような書込用のスレッド(アプリケーション書込手段105)及び読込用のスレッド(ソケット書込手段102)が排他的に操作するため、ノンブロッキング、かつ非同期に、書込(アプリケーション書込手段105)と読出(ソケット書込手段102)を実行できる。
【0055】
次に、ソケット書込要求手段102aは、フラグ管理手段107のCASフラグを参照し、フラグが立っていない場合、フラグを立てて、OSシステムコール(例えばJAVAのAsynchronousSocketChannel.write())呼び出しを行い、送信リングバッファ121bに蓄積されているデータ(読出しポインタから呼出時点での書込ポインタの一つ前までのデータ)を送信する。この時点では送信リングバッファ121bにはデータAのみ蓄積されている。ソケット書込要求手段102aは、送信リングバッファ121のデータAをOS実行手段100(OSカーネル)に書き込み要求をして終了する(1)。
【0056】
次に、OSカーネル100は、データAを適切なサイズ(サイズは、例えば、ネットワーク依存の送信可能な最大パケットサイズMTU(Maximum Transmission Unit、イーサネットならMTUは1500バイト)と各種プロトコルヘッダに応じて決定する。典型的には、イーサネットでTCP/IPであれば、TCPヘッダ20バイトとIPヘッダ20バイトを差し引いたMSS(Maximum Segment Size)1460バイト)に分割してデータA1、A2としてネットワーク4に送信する。OSカーネル100のイベント処理中に、アプリケーション書込手段105から送信リングバッファ121bにデータBを書き込むと送信リングバッファ121bは、OSカーネル100が読取処理をしている最中ではあっても、データBをノンブロッキングに蓄積する。アプリケーション書込手段105は、引き続きソケット書込要求手段102aを呼び出すが、ソケット書込要求手段102aはデータAの処理中でフラグ管理手段107のCASフラグが立っているのでソケット書込要求手段102aはデータBの送信処理をせずに、ノンブロッキングに直ちに終了する(2)。スレッド2は、比較的長時間のネットワーク送信処理(OSカーネル100のイベント処理)の完了を待たずに次の処理を実行できる。この時点で、送信リングバッファ121bには、データBが追加され、データAとデータBが存在する。
【0057】
次に、OSカーネル100は、データAの送信を完了するとコールバック処理手段102bを起動して、送信完了を通知する。コールバック処理手段102bは、送信完了したバイト数を確認し、この場合はデータA全体が送信完了しているので、送信リングバッファ121bの読出ポインタをデータAの直後へ移動し、データAを送信リングバッファ121bから除外する。次に、コールバック処理手段102bは、フラグ管理手段107のCASフラグを解除する。この時点で、送信リングバッファ121bは、データAが除外され、データBのみが存在する。次に、コールバック処理手段102bは、送信リングバッファ121bにまだ送信すべきデータがあるか(読出ポインタと書込ポインタが一致していれば送信すべきデータはない)を判定する。送信すべきデータがある場合は、ソケット書込要求手段102aを呼び出す。送信すべきデータがない場合は終了する。この場合はすでに、データBが送信リングバッファ121bに存在しているので、ソケット書込要求手段102aを呼び出す(3)。
【0058】
次に、ソケット書込要求手段102aは、フラグ管理手段107に依頼して、CASフラグを参照し、フラグが立っていないので、フラグを立てて、OSシステムコール(AsynchronousSocketChannel.write())呼び出しを行い、送信リングバッファ121bに蓄積されているデータ(読出しポインタから呼出時点での書込ポインタの一つ前までのデータ)を送信する。この時点では送信リングバッファ121bにデータBのみ蓄積されている。ソケット書込要求手段102aは、送信リングバッファ121bのデータBをOSカーネル100に書き込み要求をして終了する。
【0059】
次に、OSカーネル100は、データBを適切なサイズに分割してデータB1、B2、B3としてネットワーク4に送信する。OSカーネル100のイベント処理中に、アプリケーション書込手段105から送信リングバッファ121bにデータCを書き込むと送信リングバッファ121bはデータCをノンブロッキングに蓄積し、ソケット書込要求手段102aを呼び出すが、ソケット書込手段102は、直前のソケット書込要求手段102aがOSに依頼したデータBの処理中で、フラグ管理手段107のCASフラグが立っているのでソケット書込要求手段102aはデータCの送信処理をOSカーネル100に依頼せずに直ちに終了する(4)。また、同様にして、アプリケーション書込手段105からリングバッファ121にデータDを書き込むとリングバッファ121はデータDをノンブロッキングに蓄積し、ソケット書込要求手段102aを呼び出すが、ソケット書込手段102はデータBの処理中でフラグ管理手段107のCASフラグが立っているのでソケット書込要求手段102aはデータDの送信処理をせずに直ちに終了する(5)。この時点では送信リングバッファ121bにデータB、データC、データDが順番に蓄積されている。
【0060】
次に、OSカーネル100は、データBの送信を完了するとコールバック処理手段102bを起動して、送信完了を通知する。コールバック処理手段102bは、まず、送信完了バイト数がデータB全体であることを確認した上で、送信リングバッファ121bの読出ポインタをデータBの次の位置(この場合はデータCの先頭)に移動する。この時点では送信リングバッファ121bは、データBが除外されて、データCとデータDを蓄積している。コールバック処理手段102bは、次に、フラグ管理手段107のCASフラグを解除して、その次に、送信リングバッファ121bは空でない(この場合はデータC及びデータDが蓄積されている)ことを確認して、ソケット書込要求手段102aを呼び出す。
【0061】
次に、ソケット書込要求手段102aは、フラグ管理手段107のCASフラグを参照し、フラグが立っていないので、フラグを立てて、OSシステムコール(AsynchronousSocketChannel.write())呼び出しを行い、送信リングバッファ121bのデータCとデータDをOSカーネル100に書き込む(6)。
【0062】
次に、OSカーネル100は、データC及びデータDを適切なサイズに分割してデータC1、C2、C3、…としてネットワーク4に送信する。OSカーネル100のイベント処理中に、アプリケーション書込手段105から送信リングバッファ121bにデータEを書き込むと、送信リングバッファ121bはデータEをノンブロッキングに蓄積するが、ソケット書込要求手段102aの呼出はフラグ管理手段107のCASフラグが立っているのでソケット書込要求手段102aはデータEの送信処理をせずに終了する(7)。また、同様にしてアプリケーション書込手段105から送信リングバッファ121bにデータFを書き込むと、送信リングバッファ121bはデータFをノンブロッキングに蓄積する(8)。この時点で送信リングバッファ121bはデータC、データD、データE、データFを蓄積している。
【0063】
次に、OSカーネル100は、データCの送信を完了すると、今回はたまたまDの処理を実行せずに、コールバック処理手段102bを起動して、送信完了を通知する。一般にOSシステムコール(AsynchronousSocketChannel.write())は必ずしも要求したデータすべての送信を完了することを保証しない。OSやネットワークの負荷などの理由で要求したデータの一部のみ送信されることがある。したがって、送信完了したバイト数の確認は必須である。また、このシステムコールは、複数のバッファ(メモリチャンク)を指定することで、それらをまとめて1回のシステムコールで送る集約送信(集約書込、gathering write)の機能を提供する。したがって、CとDとは連続した単一のメモリチャンクではなく、2個以上のメモリチャンクであっても1回のシステムコールで送信要求が可能である。この例では、偶然データCの全体の送信終了を通知したが、OSカーネル100にとってはデータCとデータDは集約された連続した送信対象のデータで、別のデータであるかどうかの区別はしていないので、データCを送りきったのは全くの偶然で、データCの送信中、データCの一部を残して送信を終了する場合もある。集約送信では複数のメモリチャンクを指定できるので、CやDはそれぞれが複数のメモリチャンクに分割されて指定されてもよいし、CとDをまとめた一つのメモリチャンクで指定してもよいし、あるいは、部分的にCとDが交じるような複数個のメモリチャンク(例えば、Cの前半、Cの後半とDの前半、Dの後半などの3個)に分割されて指定されてもよい。一方でOSの集約送信は、指定されたチャンクを順に送信しようとするが、OSの都合により、指定されたチャンクすべて送信することもあれば、指定されたチャンクの一部のチャンクのみを送信することもある。ここで一部のチャンクとは、複数チャンクの一部のチャンクの全体であることもあれば、最後のチャンクはチャンクの最初の部分だけで送り残しのある場合があることもある。送信指定したチャンクの含むすべてのバイト数すべてが送信に成功するわけではなく、コールバックルーチンで送信成功したバイト数を確認し、送り残したチャンクあるいはチャンクの一部は、次回の集約送信の対象とする必要がある。(例えば、C1とC2を送信完了して、C3を残す場合とか、C1とC2に加えてC3の前半まで送信完了して、C3の後半を残す場合とかも考えられる。コールバック処理手段102bは、まず、送信完了したバイト数を確認し、この場合は、データCのみが全部送信完了であるので、送信リングバッファ121bの読出ポインタをデータCの次の位置(この場合はデータDの先頭位置)に移動する。この時点で、送信リングバッファ121bは、データCが除外されるが、データC送信処理中にデータEとデータFが追加されているので、送信リングバッファ121bは、データD、データE、データFを蓄積している。コールバック処理手段102bは、次に、フラグ管理手段107のCASフラグを解除する。コールバック処理手段102bは、この場合は、送信リングバッファ121bに送信対象のデータ(この場合は、データD、データE、データF)が存在するので、ソケット書込要求手段102aを呼び出す。
【0064】
次に、ソケット書込要求手段102aは、フラグ管理手段107のCASフラグを参照し、フラグが立っていないので、フラグを立てて、OSシステムコール(AsynchronousSocketChannel.write())呼び出しを行い、送信リングバッファ121bのすべてのデータDEFをOSカーネル100に書き込み要求する(9)。
【0065】
次に、OSカーネル100は、データDEFを適切なサイズに分割してデータD1、D2、…としてネットワーク4に送信する。
【0066】
次に、OSカーネル100は、たまたまデータDだけの送信を完了するとコールバック処理手段102bを起動して、送信完了を通知する。コールバック処理手段102bは、送信済バイト数を確認すると、偶然データDだけが送信完了となっていたので、送信リングバッファ121bの読出ポインタをデータEの先頭に移動し、フラグ管理手段107のCASフラグを解除して、送信リングバッファが空ではないので、ソケット書込要求手段102aを呼び出す。
【0067】
次に、ソケット書込要求手段102aは、フラグ管理手段107のCASフラグを参照し、フラグが立っていないので、フラグを立てて、OSシステムコール(AsynchronousSocketChannel.write())呼び出しを行い、リングバッファ121のデータEFをOSカーネル100に書き込み要求する(10)。
【0068】
次に、OSカーネル100は、データEFを適切なサイズに分割してデータE、F1、F2としてネットワーク4に送信する。
【0069】
次に、OSカーネル100は、データE、Fの送信をするとコールバック処理手段102bを起動して、送信完了を通知する。コールバック処理手段102bは、送信完了バイト数を確認し、送信リングバッファ121bの読出ポインタをデータFの次に移動させ、フラグ管理手段107のCASフラグを解除する。コールバック処理手段102bは、送信リングバッファ121bが空(読出ポインタと書込ポインタが一致)になり、処理を終了する
【0070】
以上の例では、説明しやすいように、データA-Fはそれぞれが1個以上のネットワークパケットとして送信されるような大きなデータとして図示した。ゲームサーバでオブジェクトの同期情報をストリーミングのように送受信する際には、個々のデータのサイズはネットワークの送信パケットサイズにくらべて非常に小さく、データが蓄積されれば、多数のデータがひとつのネットワーク送信パケットとして送信される。したがって、CASによるノンブロッキングなソケット書込手段は、OSのロック機能を使用する場合に比べて、著しくオーバヘッドが小さくなり、また、複数のデータをまとめて連続なブロックに配置したり、複数のデータをまとめて1回のOS送信要求で送ったりすることにより、送信チャネルを切れ目なく効率よく稼働させることができ、特にストリーミングのような利用形態では有用である。
【0071】
(第1の実施の形態の効果)
上記した実施の形態によれば、アプリケーション書込手段105とソケット書込手段102の間に送信リングバッファ121bを設け、送信リングバッファ121bはアプリケーション書込手段105の書込データをノンブロッキングに蓄積して、ソケット書込要求手段102aの書込動作をCASフラグに応じて実行し、CASフラグをフラグ管理手段107によって管理し、ソケット書込要求手段102aの書込開始でフラグを立て、OS実行手段100のイベント処理完了の通知を受けたコールバック処理手段102bがフラグを解除するようにしたため、アプリケーション書込手段105の書き込み動作がOS実行手段100の送信イベント処理の動作に直接影響を及ぼさないようになり(アプリケーション書込手段105、OS実行手段100がそれぞれに対応するための待ち時間がなくなり、また、それぞれの呼出回数が削減され)、アプリケーション処理及びデータの送信をノンブロッキングに実行して通信を高速化することができる。特に、所要時間の比較的長いネットワークへの送信処理を、ウェイト時間(レイテンシ)短く、なるべく連続処理、かつ、ノンブロッキングに実行することで、ネットワーク送信処理を優先し、送信スループットを上げ、非同期送信(NIO)の処理待ちの間の時間にアプリ処理を実行することができる。
【0072】
また、アプリケーションが消費するOSリソース(総メモリ量、スレッド数、OS機能呼び出し回数)を削減し、処理の高速化を実現できる。また、レンタルサーバやクラウドサービスなどで運用する場合は、よりコンパクトなサーバ仕様で動作させることができ、運用コストが削減される。
【0073】
(第2の実施の形態)
第2の実施の形態は、送信バッファとしての中間バッファが2種類存在する点、アプリケーション書込手段105がマルチスレッド時にノンブロッキングである点で第1の実施の形態と異なる。アプリケーション書込手段105がノンブロッキングで並行処理が可能となり、第1の実施の形態に比べて、アプリケーションの処理効率が改善される。なお、第1の実施の形態と共通の構成、動作については記載を省略する場合がある。まず、第2の実施の形態における通信管理システムの構成、及びサーバ装置の構成については、それぞれ、第1の実施の形態で示した図1及び図2と同じなので記載を省略する。図1及び図2の説明の記載で、第1の実施の形態に特化した動作や機能については、第1の実施の形態とのちがいも含めて、以下に説明する。
【0074】
図9及び図10に示すように、構成において、第1の実施の形態(図3及び図4)と比較して、第2の実施の形態では、リングバッファ121(図3参照。)が中間バッファ121B(図9参照。)に置き換えられる点、バッファリング手段106がメモリ12に送信バッファとして、リングバッファ121b(図4参照。)だけでなく、第1のバッファ121bと第2のバッファ121bを用意する点(図10参照。)で第1の実施の形態と構成が異なる。
【0075】
図10に示すように、第1のバッファ121bは、アプリケーション書込手段105により、スレッド103の処理の結果生成されたイベントの書き込みを受け付け、第2のバッファ121bは、ソケット書込手段102aにより、第1のバッファ121bにスレッド毎に書き込まれたデータの集合の書込を受け付ける。イベントを規格化されたメモリチャンクに保持する場合、第1のバッファ121bでは、一例として、標準的なイベントサイズを考慮し、イベントをチャンクに格納した場合にチャンクの使い残しがあまり発生しないように、既存の各種最適化アルゴリズムなどを用いてチャンクサイズを計算・設計するものとし、ここでは256バイトの規格化されたチャンクにイベントを保持(イベントサイズが256バイトより大きければ複数チャンクに保持)したものを複数保持するものとする。チャンクはバッファプールで管理し、バッファプールを複数のチャネルで共有すると想定して、初期値として4096個用意すると合計1MBである。バッファプールは不足した場合は、追加でメモリチャンクを割り当てて、拡張できる構成が望ましい。また、ここでバッファプールを複数チャネルで共有するとは、異なる送信先ごとに異なるチャネル、異なるソケットを使うため、本発明は単一のチャネルの動作を中心に記述するが、他チャネルでもそれぞれが同様に独立したバッファリング手段106を保持するが、それぞれのバッファリング手段にメモリチャンクを提供するバッファプールは一元的に管理すれば、各チャネルで個別にバッファプールを保持する場合に比べて、バッファプールのメモリ確保の重複を排除して、チャネル間でメモリを融通できるため、バッファプールとして確保する総メモリを節約できる。一方で、第2のバッファ121bはOSでのイベント処理に使用される。第2のバッファ121bは、一例として、OSの好適なデータ処理サイズであるページサイズを考慮し、ここでは2048バイトの規格化されたチャンクをに処理すべき送信データを保持するものとする。チャンクをバッファプールで管理し、バッファプールを複数のチャネルで共有すると想定して、初期値として4096個用意すると合計8MBである。第1のバッファ121bのバッファプールと同様に、バッファプールは不足した場合は、追加でメモリチャンクを割り当てて、拡張できる構成が望ましい。なお、第1のバッファ121bと第2のバッファ121bのそれぞれのチャンク容量及びチャンク数は通信環境やシステムの仕様に合わせて適宜設定するため、例として示した値に限定されるものではない。ただし、バッファプールのメモリチャンクは、あらかじめまとめて取得した大きなメモリを分割して使用するので、メモリチャンクのサイズは、メモリ境界を考慮して、サーバ装置1のページサイズ、又は、ページサイズの2の累乗数分の1から選ぶことがメモリシステムの効率上望ましく、50バイトや100バイトのような任意のバイト数を選択すべきではない。また、第2のバッファは、OSでの処理に適したダイレクトバッファを使用するとOSでの送信処理効率がよくなる。
【0076】
また、図11図12図13に示すように、第2の実施の形態は、第1の実施の形態(図6図7図9)と比べると、フラグ管理手段107の使い方において、処理手段としてのソケット書込手段102、処理要求手段としてのソケット書込要求手段102aとコールバック処理手段102bが第1の実施の形態の同手段と異なる動作をする点で、第1の実施の形態と構成が異なる。ソケット書込要求手段102a及びコールバック処理手段102bの動作について以下説明する。このフラグ管理手段107の変更は、第2の実施形態では、アプリケーション書込手段105がノンブロッキングで並行処理が可能となったため、アプリケーション書込手段105が連続的多頻度に実行されている間に限り、アプリケーション書込手段105がソケット書込要求手段を呼び出さずに、中間バッファ121Bにイベントを書き込むだけの少ない処理で終了するためである。その代わり、アプリケーション書込手段105が連続的多頻度に実行されている間は、すでに実行中のソケット書込手段102のコールバック処理手段は、中間バッファ121Bが保持するイベントがなくなるまで連続してソケット書込手段を呼び出す。このことにより、アプリケーション書込手段105の平均処理速度が短くなり、アプリケーションのスレッド103の並行処理の効率がよくなる。なお、第1の実施例でも第2の実施例で示すアプリケーションの送信スレッドの並列動作効率を重視したフラグ管理手段107の使い方(ソケット書込要求手段102a及びコールバック処理手段102bの動作)を適用することは可能であるし、逆に、第2の実施例でも第1の実施例で示したOSの送信処理効率を重視したフラグ管理手段107の使い方(ソケット書込要求手段102a及びコールバック処理手段102bの動作)を適用することも可能である。また、一方で、フラグ管理方法をこの2種類の手法に限定するものではなく、イベント追加とイベント処理をノンブロッキングかつ非同期に行うための他の手法を用いてもよい。
【0077】
図11及び図13は、ソケット書込要求手段102aの動作例を説明するためのフローチャートである。また、図12は、コールバック処理手段102bの動作例を説明するためのフローチャートである。
【0078】
まず、図11に示すように、ソケット書込要求手段102aは、呼出元を確認し(S40)、呼出元がアプリケーション書込手段105(第1のバッファにイベント追加後の呼出)の場合(S40;Yes)、フラグ管理手段107に依頼して、フラグ管理手段107の管理するフラグの状態を確認し(S41)、フラグが解除されている場合(S42;Yes)、フラグを立てる(S43)。ソケット書込要求手段102aは、アプリケーション書込手段105がイベントをリングバッファ121bに書き込み処理を終了する直前、及びソケット書込要求手段102aの終了後に実行される対応するコールバック処理手段102bの終了直前のいずれかから非同期に呼出される。呼び出しは通常のメソッドあるいは関数の呼び出しでもよいし、あるいは、OS機能を使い待機しているスレッドへのシグナリングによる起動でもよい。前者の場合のみフラグ管理手段を利用して、OS実行手段にイベント処理を要求できる状態であるかどうかを判断する。後者の場合はすでにフラグを立てて後、1回以上OS実行手段にイベント処理を実行している最中であるので、フラグを再び立てることなく、OS実行手段にイベントの処理を要求しようとする。呼び出し元を通知する一番簡単な方法は、呼び出しパラメータに呼び出し元識別子を含めることであるが、他のどんな方法でもよい。前者の場合でフラグが立てられると、次に、ソケット書込要求手段102aは、OS実行手段100にイベントの処理を要求する(S44)。一方、前者の場合で、もし、フラグ管理手段107の管理しているフラグがすでに立っている場合は(S42;No)、処理を直ちに終了する。また、ソケット書込要求手段102aは、後者の場合、すなわち、呼出元がアプリケーション書込手段105ではなくコールバック処理手段102bの場合(S40;No)、このコールバック処理手段102bの実行に対応する直前のソケット書込要求手段102aの実行時にすでにフラグを立てているので、フラグの状態に関わらずOS実行手段100にイベントの処理を要求する(S44)。なお、前述のように、図6同様に、点線で囲まれたフラグの操作(状態確認や設定S41,S42,S43はマルチスレッド環境下で他スレッドによる割り込みによる影響がないようにアトミックに実行される必要があり、フラグ管理手段107が提供する(Compare and Swap)の機能を利用する。
【0079】
また、図13にOS実行手段100の動作を示す。ソケット書込要求手段102aは、ステップS44(図11)において第1のバッファ121bに送信対象のデータがあるか確認し(S60)、送信対象のデータがある場合(S60;Yes)、第1のバッファ121b上のイベントを第2のバッファ121bに必要に応じて移動する(S61)。単に移動するだけならば、このステップは省略して、第1のバッファのデータを対象として、いきなりOS非同期送信呼出S63を実行すればよく、移動を省く分だけ処理の効率はよくなる。移動するからには、移動操作においてなんらかの性能の向上が期待される操作、例えば、バッファのメモリタイプの変更、バッファのメモリサイズの変更、バッファ内のデータの配置の変更、移動個数(移動イベント数、あるいは、移動バイト数)の制御などを行い、第1のバッファのメモリチャンクに保持されているイベントを、第2のバッファの新たに割り当てたメモリチャンクにコピーし、第1のバッファのコピー終了後の不要なメモリチャンクを解放する。
【0080】
なお、バッファが保持するメモリチャンクの割当や解放はバッファプールを用いると効率がよい。以下の各種バリエーションではバッファプールを仮定し、規格化されたサイズのメモリチャンクを用いたバッファを念頭に記述するが、本発明は、それらのすべての操作、あるいは、一部の操作だけと限定せず、通常に都度割当解放するメモリチャンクであっても、また、チャンクのサイズがばらばらであっても、以下の各種バリエーション、及び、その他の有用な操作を除外するものではない。
【0081】
まず、メモリチャンクのタイプは、第2のバッファを後述するようにOSが処理で使用(S63)するので、OSの処理に適したダイレクトバッファを使用するとよい。
【0082】
次にバッファのサイズやデータの配置を検討する。OSは同じサイズのデータでも、大きなメモリチャンク1個で処理をする方が、小さなチャンクを数多く処理するより効率がよい。そこで、大きなメモリチャンクを用意し、複数のイベントをひとつのメモリチャンクに順番に配置することで、OSが処理するメモリチャンクの個数を削減するとよい。
【0083】
次に移動について検討する。移動のタイミングで、ごく単純に、第1のバッファ121bが保持すすべてのイベントを第2のバッファ121bに移動してしまってもよい。しかし、第2のバッファはOS処理に使うダイレクトバッファを使用すること、OS処理要求が一度に処理できるメモリチャンクの数や総バイト数には上限があることを考慮すると、ダイレクトバッファの使用量を抑制するためには、移動するイベントの数は、受け入れる第2のバッファが保持するメモリチャンクが、OS処理要求に適切な分量以下になるように制御するとよい。たとえば、第2のバッファの保持するダイレクトバッファのメモリチャンクの数に対して、例えば32個程度などの上限を設定し、OSの処理が滞るなどの原因で、第2のバッファがすでに相当量のメモリチャンク(この例では32個に近い数のメモリチャンク)を保持している場合、移動を上限の範囲(この例では例えば32個、あるいは33個などの予め定める上限値)で停止する、あるいは、すでに上限を超えていれば移動を行わない(0個の移動を行う)。このように、第2バッファ121bが保持するメモリチャンク数に上限などの制限を設けることで、通信不調などで滞ったイベントは、第1のバッファ121bに蓄積され、サーバ装置1全体で共有するダイレクトバッファリソースを使う第2のバッファ121bを肥大化させることはない。逆に第2のバッファが保持するチャンクがほとんどない健全な状態では、第1のバッファ121bのイベントすべてを移動できる。
【0084】
第1のバッファ121bから第2のバッファ121bへのイベントの移動は、このようなメモリチャンクのタイプの変更やメモリチャンクのサイズの変更やメモリチャンク内のデータ配置の変更や移動個数の制御あるいはその他の性能向上の工夫の全部あるいは一部だけを実施して、後段のOSでのイベント処理効率をよくするために行う。
【0085】
以上、2個のバッファ(第1のバッファ121b1と第2のバッファ121b2)の例を記載したが、バッファの個数を2個に限定するものではない。メモリチャンクのタイプの変更やメモリチャンクのサイズの変更やメモリチャンク内のデータ配置の変更や移動個数の制御あるいはその他の性能向上の工夫は、2個のバッファ間の1回の移動ですべて実施する必要はなく、3個以上のバッファを用いて、多段に順次実行してもよい。
【0086】
また、イベント単位の移動の例を記載したが、移動をイベント単位に限定するものではない。ネットワーク送信などOS処理システムが、個々のイベントの境界にとらわれず、蓄積されたバイト単位に処理をする場合、バッファ間のイベントの移動はイベント単位(0個以上の複数個のイベント)に限定されない。あるイベントの一部分だけでもよいし、連続するイベントの部分を結合したもの(例えば、イベントA,イベントB、イベントCが順番に蓄積されていた時に、イベントAの前半が移動した後は、イベントAの後半の一部(イベントAの残りの後半)、イベントB全部、イベントCの前半の一部を連続するイベントの部分を結合したもの)でもよい。
【0087】
また、第1のバッファ121bに送信対象のデータがない場合(S60;No)、ステップS62へと進む。
【0088】
なお、第1のバッファ121bへイベントを追加するのは、アプリケーション書込手段105である。アプリケーション書込手段105は、第1のバッファ121bへイベントを追加後(図10)に、ソケット書込要求手段102aを呼び出す。アプリケーション書込手段105は、並行動作する複数スレッド103から非同期に呼出され、ノンブロッキングで第1のバッファ121bにイベントを蓄積する。バッファとしては、たとえば、Javaが提供するキュー(java.util.concurrent.ConcurrentLinkedQueue)を、メモリチャンクへのポインタを管理するFIFOバッファを利用する。バッファプールが管理する、メモリチャンクを再利用することで、効率のよいリングバッファを実現できる。バッファプールのメモリチャンクは典型的なイベントサイズより少し大きめのメモリサイズで規格化するとよい。メモリチャンクにはいりきらない大きなイベントは複数のチャンクに保管する。チャンクサイズは、ページサイズの2の累乗数分の1となるように調整する。第2のバッファ121bも、第1のバッファ121b同様に、イベント情報格納したメモリチャンクへのポインタを保持するFIFOキュー(例えば、java.util.concurrent.ConcurrentLinkedQueue)が使用できる。
【0089】
次に、ソケット書込要求手段102aは、第2のバッファ121bに送信対象のデータがある場合(S62;Yes)、OS実行手段100にOS非同期送信要求を行ってイベントの処理を要求する(S63)。例えば、JavaのAsynchronousSocketChannel.write()の集約書込(gathering write)を呼び出して、複数メモリチャンクを送信対象として、1回の呼び出しで複数のイベントの処理を要求する。また、ソケット書込要求手段102aは、第2のバッファ121bに送信対象のデータがない場合(S62;No)、フラグ管理手段107に依頼して、フラグを解除する(S64)。第1のバッファ121bにデータがないことを確認(S60)後、第2のバッファ121bにもデータがないことを確認(S62)したので、中間バッファ121B(第1のバッファ121b及び第2のバッファ121b)が保持するデータをすべて送信し終わったとみなして、フラグを解除して、場合によってはフラグをたてたまま複数回連続的に行ってきたOS非同期送信呼び出しを終了する。送信し終わったとみなした後、フラグを解除するまでの間に、第1のバッファ121b1にイベントが追加された場合は、次のイベントとともにOS処理が実行される。
【0090】
図12に示すコールバック処理手段102bは、OS実行手段100がソケット書込要求手段102aの書込イベントの処理を完了した場合に、OS実行手段100から完了通知を受け付けて、対応するソケット書込要求手段102aとは非同期に実行する。コールバック処理手段102bは、OS実行手段100が実行したネットワーク送信結果を受け取る(S50)。送信結果が正常の場合は(S51;Yes)、コールバック処理手段102bは、送信完了分を第2のバッファ121bから削除し(S52)、ソケット書込要求手段102aに呼び出しを行う(S53)。また、送信結果が異常の場合は(S51;No)、コールバック処理手段102bは、通信断、タイムアウトなどの例外処理(接続の切断など)を行う(S54)。
【0091】
(情報処理装置の動作)
第2の実施の形態の作用を、(1)基本動作、(2)データ送信動作に分けて説明する。
【0092】
図9は、第2の実施の形態のデータ送受信の動作の一例を説明するための概略図である。
【0093】
(1)基本動作
まず、ネットワーク4からサーバ装置1がデータを受信する場合、ネットワーク4のソース131からあるチャネル130を介し、ソケット読出手段101がチャネルに対応するソケット(受信元端末装置に対応するあるIPアドレスのあるポート)によって受信したデータを読み出して中間バッファ121Bに書き込む。データは中間バッファ121Bに追加される。なお、バッファはチャネルあるいはソケットごとに別々に用意する。また、チャネル/ソケットは送受信共用で、対応する端末装置(端末装置の通信相手となる特定のプログラム)ごとに1つ用意する。アプリバッファは、1つで図示しているが、実際は送受信別に管理する。また、中間バッファ121Bは、バッファプールとしては、全チャネルで1つとして管理されており、1つで図示しているが、チャネルごと、送受信別々に管理され、チャネルごとに、別々の受信中間バッファ、送信中間バッファとして区別する。
【0094】
以降のアプリバッファ120への書込動作は第1の実施の形態と共通するため省略する。
【0095】
次に、アプリケーション実行手段103は、アプリバッファ120のデータを読み出してスレッドにて処理する。
【0096】
また、アプリケーション実行手段103のスレッドで処理されたデータをネットワーク4に送信する場合、アプリケーション実行手段103は、スレッドで処理されたデータをアプリバッファ120に書き込む。第2の実施の形態ではアプリケーション書込手段105がマルチスレッドで並行処理される場合をメインに説明する。
【0097】
アプリケーション書込手段105は、アプリバッファ120のデータを意図する送信先端末装置に応じて、送信先端末装置、より厳密には、チャネルあるいはソケットに対応する中間バッファ121B、特に第1のバッファ121bにスレッド毎に書き込む。第1のバッファ121bには、スレッド毎に用意された領域に順次データが書き込まれる。アプリケーション書込手段105の並行処理の効率をよくするために、アプリケーション書込手段105はノンブロキングに中間バッファ121Bにデータ(処理結果のイベント)を書き込む。
【0098】
次に、ソケット書込手段102は、任意のタイミングで第1のバッファ121bから第2のバッファ121bへ順次データを移動する。移動とは、データを保持するメモリチャンクを第1のバッファ121bから第2のバッファ121bへと文字通りバッファ間で移動する場合だけでなく、対象データを第2のバッファへコピーした後に、第1のバッファからは削除する場合を含む。また、移動とは、単なる1対1の移動にとどまらず、移動によりバッファのタイプ、メモリチャンクのサイズ、メモリチャンク内での配置方法を変更したり、移動するイベント個数の調整をしたり、OS実行手段が処理しやすいデータ保持形態に変換したりすることも含む。これらの変換を段階的に実施するためには、第3のバッファ、第4のバッファなどさらにバッファ個数(バッファの段数)を増やしてもよい。また、バッファの利用都度に発生するメモリの割当・解放の負荷を軽減するために、データを保持するメモリチャンクはあらかじめまとめて割り当てたメモリを再利用するバッファプールで管理することができる。第1のバッファ、第2のバッファでバッファプールを共有することもできる。また、複数チャネルでそれぞれのバッファ管理を行う場合でも、単一のバッファプールを共有することもできる。バッファプールでは、多くの場合、規格化されたサイズのメモリチャンクを1種類あるいは複数種類保持する。バッファプールは通信管理プログラム起動時にシステムから確保したメモリを使い回すため、バッファプールのメモリを使ったメモリの割当・解放はシステムコールを伴わず処理が軽い、頻繁で複雑なメモリ利用をしても、システムメモリのフラグメンテーションを引き起こさないなどの効果がある。バッファプールは起動時に適切量を確保するが、実行時に不足が起きてしまった場合は、その時点、あるいは、不足が予測された時点で、OSに負荷を与えてしまうので、可能であればある適当なタイミングを見計らって、OSにリクエストして追加のメモリを確保し、バッファプールを拡張することが望ましい。バッファプールが確保するメモリチャンクのメモリの種類やチャンクのサイズは利用形態で適切にチューニングする。第1のバッファで扱うメモリチャンクとしては、通常のヒープが管理する非ダイレクトバッファから平均的なイベントサイズより少し大きな単一サイズ(例えば256バイト)を選択する。第2のバッファで扱うメモリチャンクとしては、OSが扱いやすいサイズとタイプ、例えばページサイズ、あるいはページサイズの半分(例えば2KB)のダイレクトバッファを選択する。メモリプールのサイズは、OSからまとめて取得したバッファを小分けにして使うので、ページサイズやメモリ境界を意識して、ページサイズ、あるいは、ページサイズの2の累乗数分の1の値を採用し、25バイトや50バイトのような任意の値を採用しない。
【0099】
次に第1のバッファから第2のバッファへ移動するタイミングは、予め定めた時間間隔毎であってもよいし、第1のバッファ121b又は第1のバッファ121b内のチャンクに蓄積されたデータ量が予め定めた量になった場合であってもよいし、第1のバッファ121b又は第1のバッファ121b内のチャンク蓄積されたイベントの数が予め定めた数になった場合であってもよい。
【0100】
ソケット書込手段102の起動のトリガ、あるいは、第1のバッファ121bから第2のバッファ121bへのデータの移動のトリガは、ポーリングやタイマなどであってもよいし、すべてあるいは一部のアプリケーション書込手段105の実行直後であってもよい。
【0101】
なお、3段以上のバッファを使用する場合において、格段のバッファ間のデータの移動のタイミング、トリガ、移動方法などは、それぞれの段間で、上記記載の第1バッファと第2バッファについて記述した方法をそれぞれの段で独立に採用することができる。上記の例では移動の際に複数の操作(チャンクのメモリタイプの変更、チャンクサイズの変更、移動量の制限など)を同時に行ったが、操作を分割して、途中結果を追加のバッファとして保持することが考えられる。その場合には、移動のタイミング、トリガはすべての段で同じであってもよい。
【0102】
次に、ソケット書込手段102は、第2のバッファ121bのデータを読み出し、ソケットによってチャネル130に書き込む。データは、チャネル130を介してソース131に送信される。この時、データは第2のバッファ121bから取り出され、送信対象としてOS実行手段100が送信処理をし、送信が完了したデータ(取り出したデータの全部あるいは一部)については、第2のバッファ121bから削除される。送信が完了しなかったデータについては、引き続き第2のバッファ121bにとどまる。ここでは、第2のバッファ121bに蓄積されたデータを全部一度に送信するものとしたが、第2のバッファ121bに蓄積されているデータが巨大になった場合は、OS送信機能呼出の制限を考慮するなど、全部一度に読み出さず、一部だけを読み出して送信する制御をしてもよい。あるいは、第2のバッファ121bが蓄積するデータが巨大にならないように、第1のバッファ121bから第2のバッファ121bへ移動するイベントの数やバイト数を移動の際にあらかじめ制限してもよい。
【0103】
以下、アプリケーション実行手段103のスレッドで処理されたデータをOS実行手段100からネットワーク4に送信する場合について詳細に説明する。
【0104】
(2)データ送信動作
図10は、データ送信動作の一例を説明するための概略図である。スレッド1とスレッド2が、非同期にそれぞれイベントA,C,F,及びイベントB,D,Eを順次生成し、アプリケーション書込手段105、ソケット書込要求手段102aを呼び出し、それぞれのイベントA-Fをネットワーク4に送信する。アプリケーション書込手段105は、スレッド1及びスレッド2が生成したイベント1個を第1のバッファ121bに追加し、ソケット書込手段102aを呼び出す。ソケット書込手段102aは、OSカーネル100がすでにイベント処理を実行中の場合は処理を行わないで終了するが、OSカーネル100がイベント処理を実行中でない場合は、第1のバッファ121bが保持する0個以上のイベントを第2のバッファ121bへ移動し、第2のバッファ121bが保持するイベントについて、OSカーネル100にイベントの処理を依頼する。OSカーネル100がイベントの処理中であるかどうかの状態は、フラグ管理手段107が提供するCASフラグにより管理される。OSカーネル100は要求されたイベントの処理を完了すると、コールバックスレッド(スレッド1のコールバックスレッド)で、コールバック処理手段102bを、スレッド1及びスレッド2とも非同期に実行する。コールバックスレッドは、イベント処理の進捗状況を確認して、第2のバッファ121bを調整後(処理済のイベントを第2のバッファから削除したり、第1のバッファから第2のバッファへイベントを移動したりして)、ソケット書込手段aを再帰的かつ排他的に呼び出し、OSカーネル100が処理中に第1のバッファ121bに蓄積されたイベントについても、イベント処理を行う。コールバックスレッドは、ソケット書込要求手段102a及びコールバック処理手段102bの処理を繰り返して、中間バッファ121B(すなわち、第1のバッファ121b及び第2のバッファ121b)が保持するイベントがなくなるまで稼働する。
【0105】
アプリケーション実行手段103は、例えば、複数のスレッド1、スレッド2によりデータを処理し、処理結果のイベントA、イベントBを同一の端末装置(より厳密には、同一のソケットあるいはチャネル)に送信するために、当該イベントA、イベントBはアプリケーション書込手段105により送信先端末へ通信するソケットに対応する第1のバッファ121bに書き込まれる。スレッド1、スレッド2の処理は非同期に発生するものとする。第1のバッファ121bは、例えばスレッドセーフでノンブロッキングなリングバッファ(例えば、ノンブロッキングでスレッドセーフなFIFOキュー java.util.ConcurrentLinkedQueue にイベントを格納するメモリチャンクのポインタを登録することで実現可能)である。アプリケーション書込手段105は、イベントA、イベントBをスレッド毎に異なる領域(チャンク)にノンブロッキングにイベントを書き込む(1)(2)。特に、イベントのサイズのメモリチャンクの代わりに、規格化されたサイズのメモリチャンクを用いる場合は、メモリチャンクは、例えば、java.nio.ByteBufferを用いて、保管しているイベントの開始位置と終了位置も管理する。また、規格化されたサイズのメモリチャンクにイベントを保管する場合、チャンクサイズより大きなイベントについては、イベントを複数チャンクにわたるチャンクグループに保管し、チャンクグループへのポインタをリングバッファに追加してもよい。
【0106】
さて、まず、スレッド1のイベントAについては、アプリケーション書込手段105は第1のバッファ121bのイベントAの処理を要求すべくソケット書込要求手段102aを呼び出す(3)。ソケット書込要求手段102aは、呼出元がアプリケーション書込手段105なので、フラグ管理手段107のCASフラグを参照し、フラグが立っていないので、フラグを立てて(4)、第1のバッファ121bにイベントが蓄積されているか確認し、イベントがあるので第1のバッファ121bのイベントAを第2のバッファ121bへ移動する(5)。ここで、第2のバッファ121bも、第1のバッファ121b同様に、例えばノンブロッキングなリングバッファ(例えば、ノンブロッキングでスレッドセーフなFIFOキュー java.util.ConcurrentLinkedQueue にイベントを格納するメモリチャンクのポインタを登録することで実現可能)であってもよい。ただし、第2のバッファの操作を行うスレッドは、フラグ管理手段107により、高々1個に制御されているので、スレッドセーフでなくてもよい。また、ソケット書込要求手段102aは、イベントAを第2のバッファ121bへ移動した後、スレッド1に次の処理を進めるよう呼び出しを行い、処理はOSカーネル100にまかせて(6)、OSカーネル100の処理の完了をまたずに終了し、スレッド1の処理に戻る(7)。
【0107】
一方で、スレッド2のイベントBについては、アプリケーション書込手段105は第1のバッファ121bのイベントBの処理を要求すべくソケット書込要求手段102aを呼び出す(8)。ソケット書込要求手段102aは、呼出元がアプリケーション書込手段105なので、フラグ管理手段107のCASフラグを参照し(9)、この場合は先のイベントAの処理のためにすでにフラグが立っている(4)ため、もはやフラグをたてられない。ソケット書込要求手段102aは、処理ができるようになるまで待たず、ノンブロッキングで処理を終了してスレッド2の処理に戻る(10)。
【0108】
スレッド1については、アプリケーション実行手段103は、引き続きデータを処理し、アプリケーション書込手段105は処理結果のイベントCを第1のバッファ121bに書き込む(11)。第1のバッファ121bは、未処理のイベントBとイベントCを保持している(11)。スレッド1のイベントCについては、アプリケーション書込手段105は第1のバッファ121b1のデータ(追加したデータCだけでなく、すでに追加されているデータBも)の処理を要求すべくソケット書込要求手段102aを呼び出す(50)。ソケット書込要求手段102aは、呼出元がアプリケーション書込手段105なので、フラグ管理手段107のCASフラグを参照し、この場合は先のデータAの処理のためにすでにフラグが立っている(4)ため、もはやフラグをたてられない。ソケット書込要求手段102aは、処理ができるようになるまで待たず、ノンブロッキングでソケット書込要求手段102aの処理を終了してスレッド1の処理に戻る。
【0109】
スレッド1のイベントAのネットワーク送信については、具体的には、ソケット書込要求手段102aが、OSカーネル100に処理をまかせる(6)際には、OSシステムコール(例えばJAVAのAsynchronousSocketChannel.write())呼び出しを行い、第2のバッファ121bに存在するイベントA(12)を指定して送信要求する。ソケット書込要求手段102aは、第2のバッファ121bのイベントAをOS実行手段100(OSカーネル)に書き込み要求をして終了し、スレッド1の処理に戻る(7)。
【0110】
スレッド1のイベントAのネットワーク送信については、送信依頼されたOSカーネル100は、第1の実施の形態と同様に、イベントAを適切なサイズに分割してイベントA1、A2を送信する(13)。分割のサイズ、分割の個数、送信間隔はOSやネットワークの負荷などに依存する。
【0111】
また、一方で、スレッド2のイベントBについて、OSカーネル100がイベントAの処理中に、アプリケーション書込手段105は、第1のバッファ121bのイベントBを処理すべく、引き続きソケット書込要求手段102aを呼び出す(8)が、ソケット書込要求手段102aは、まだイベントAが処理中(4)でフラグ管理手段107のCASフラグが立っている(9)のでソケット書込要求手段102aは第1のバッファ121bのイベントBを第2のバッファ121bへ移動せず、アプリケーション書込手段105は処理を終了し、スレッド2は次の処理を進める(10)。この時点では、第1のバッファ121bには、イベントB、Cが蓄積されており、まだイベントDは生成されていない(11)。アプリケーション実行手段103は、スレッド2によりデータを処理して、後のタイミングでイベントDを生成する。
【0112】
次に、スレッド1よりイベントAの送信依頼されたOSカーネル100は、イベントAの送信を完了すると、コールバック処理手段102bをスレッド1のコールバックスレッドとして起動して(14)、コールバック処理手段102bは送信完了したバイト数を確認し、この場合はイベントA全体が送信完了しているので、第1のバッファ121bからイベントAを削除する(15)。この時点で第1のバッファ121bにはイベントB、Cが存在する(11)。その後、コールバック処理手段102bは、ソケット書込要求手段102aを呼び出す(16)。
【0113】
引き続き、コールバックスレッドにおいて、ソケット書込要求手段102aは、第1のバッファ121bにイベントが蓄積されているか確認し、イベントがあるので第1のバッファ121bのイベントB、Cを第2のバッファ121bへ移動する(17)。ここでは、第2のバッファ121b2の容量に十分余裕があるので、第1のバッファ121b1のイベントすべてを移動したが、第2のバッファ121b2の容量などを考慮して、第1のバッファ121b1が蓄積するイベントの一部だけ(例えばイベントBだけ)を移動してもよい。たまたま、この後のタイミングで、スレッド2のイベントDについて、アプリケーション書込手段105は処理結果のイベントDを第1のバッファ121bに書き込む(18)。この時点では、第1のバッファ121b1はイベントDだけを保持している。
【0114】
さて、スレッド1のイベントCについては、引き続きソケット書込要求手段102aを呼び出すが、フラグ管理手段107のCASフラグが立っているので、ソケット書込要求手段102aは第1のバッファ121bのイベントB、イベントCを第2のバッファ121bへ移動せず、アプリケーション書込手段105は処理を終了し、スレッド1に戻り処理を進める(19)。アプリケーション実行手段103は、スレッド1によりデータを処理し、後のタイミングでイベントFを生成する(20)。また、この第1バッファ121b1のイベントBとイベントCについては、前述したように、後のタイミングで、コールバックスレッドによりイベント処理が行われることになる。
【0115】
次に、コールバックスレッドにおいて、ソケット書込要求手段102aは、呼出元がコールバック処理手段102bの場合なので、引き続きOSシステムコール呼び出しを行い、第2のバッファ121bのイベントBとイベントCを送信要求する(21)。ソケット書込要求手段102aは、第2のバッファ121bのイベントBをOS実行手段100(OSカーネル)に書き込み要求をしてコールバックスレッドを終了する。
【0116】
次に、コールバックスレッドよりイベントB、Cの送信依頼をされたOSカーネル100は、イベントB及びイベントCを適切なサイズに分割してネットワークに送信する。まずイベントBを3分割してイベントB1、B2、B3と送信して、終了(OSカーネルは処理を完了)する。イベントBのみ送信してイベントCを送信しない理由、あるいはイベントBの一部でなくイベントB全体を送信した理由は、OSの都合であり、サーバ装置1又はネットワーク4の負荷などの状況による(22)。
【0117】
また、スレッド2のイベントDについて、スレッド1のコールバックスレッドに依頼されたOSカーネル100のイベント処理中に、アプリケーション書込手段105は、第1のバッファ121bのイベントDを処理すべく、引き続きソケット書込要求手段102aを呼び出す(23)が、ソケット書込要求手段102aはイベントB、Cの処理中(16)でフラグ管理手段107のCASフラグが立っている(24)のでソケット書込要求手段102aは第1のバッファ121bのイベントDを第2のバッファ121bへ移動せず、アプリケーション書込手段105は終了し、スレッド2に戻り次の処理を進める(25)。アプリケーション実行手段103は、引き続きスレッド2によりデータを処理して、後のタイミングでイベントEを生成する(26)。この時点で、第1のバッファ121bには、イベントDが蓄積(18)されており、まだイベントEは生成されていない。
【0118】
次に、コールバックスレッドよりイベントB、Cの送信依頼をされたOSカーネル100は、イベントBの送信を完了すると、コールバック処理手段102bを起動して(27)、コールバック処理手段102bは送信完了したバイト数を確認し、この場合はイベントB全体が送信完了しているので、第1のバッファ121bからイベントBを削除する。
【0119】
この時点で、スレッド2は、イベントEを生成し、アプリケーション書込手段105によりイベントEを第1のバッファ121bに書き込む。第1のバッファ121bにはイベントD、Eが存在する(28)。スレッド2において、イベントEを生成(26)したアプリケーション書込手段105は、ソケット書込要求手段102aを呼び出す(30)。ソケット書込要求手段102aは、まだイベントC及びイベントDの処理中(27)でフラグ管理手段107のCASフラグが立っている(31)のでソケット書込要求手段102aは第1のバッファ121bのイベントD及びEを第2のバッファ121bへ移動せず、アプリケーション書込手段105は処理を終了しスレッド2に戻り、スレッド2は次の処理を進める(32)。
【0120】
スレッド1のコールバックスレッドよりイベントB、Cの送信依頼をされたOSカーネル100が、イベントBの送信を完了後に、再び、スレッド1のコールバックスレッドを起動し、起動したコールバック処理手段102bは、再び、ソケット読み込み要求手段102aを呼び出す(29)。ソケット書込要求手段102aは、第1のバッファ121bにイベントが蓄積されているか確認し、イベントがあるので第1のバッファ121bのイベントD、E(28)を第2のバッファ121bへイベントを移動する(33)。この時点で、第2のバッファ121b2はイベントC、D、Eを保持する。
【0121】
次に、スレッド1のコールバックスレッドにおいて、ソケット書込要求手段102aは、呼出元がコールバック処理手段102bなので、OSシステムコール呼び出しを行い、第2のバッファ121bのイベントC、D、EをOSに送信要求してコールバックスレッドを終了(34)する。
【0122】
次に、OSカーネル100は、イベントC,D,Eを送信しようとする。まずイベントCを適切なサイズに分割(C1,C2,C3)してイベントC1、C2を送信して終了(OSカーネルは処理を完了)する(35)。イベントCの一部(C1,C2)のみを送信(35)して、残りのイベントC(C3)、イベントD、イベントEを送信しない理由は、前述したようにOSの都合である。この時点で、第1のバッファ121bには、イベントFが蓄積されている。
【0123】
次に、OSカーネル100は、イベントCの一部の送信を完了すると、再び、スレッド1のコールバックスレッドとして、コールバック処理手段102bを起動(36)して、コールバック処理手段102bは送信完了したバイト数を確認し、この場合はイベントCのうちC1、C2が送信完了しているので、第2のバッファ121bからイベントCのうちC1、C2に相当する部分を削除する。Cが単一のチャンクに格納されている場合、C3の送信が完了するまではチャンク全体のメモリ解放はできない。例えば、java.nio.ByteBufferを用いて送信開始位置と送信終了位置を管理する場合、C全体の解放はC3の処理終了後とし、C1,C2の完了は、送信開始位置をC1からC3に移動すればよい。そして再び、ソケット書込要求手段102aを呼び出す(37)。
【0124】
次に、コールバックスレッドにおいて、ソケット書込要求手段102aは、呼出元がコールバック処理手段102bなので、第1のバッファ121bにイベントが蓄積されているか確認するが、イベントFが蓄積されていたので、イベントFを第2のバッファ121b2へ移動する。イベントFは第1のバッファ121b1から第2のバッファ121b2へ移動し、第1のバッファはイベントがなくなり(38)、第2のバッファはイベントC3、D、E、F(39)を保持する。ソケット書込要求手段102aは、引き続き、OSシステムコール呼び出しを行い、第2のバッファ121bのイベントC3、D、E、F(39)をOS実行手段100(OSカーネル)に書き込み要求をしてコールバックスレッドを終了する(40)。
【0125】
次に、イベントC3、D、E、Fの送信依頼されたOSカーネル100は、イベントC、Dを適切なサイズに分割してイベントC3、D1、D2を送信する(41)。イベントC3とDのみ送信してイベントE、Fを送信しない理由は、前述したようにOSの都合である。
【0126】
次に、イベントC3、D、E、Fの送信依頼されたOSカーネル100は、イベントC、Dの送信を完了すると、コールバックスレッドとして、コールバック処理手段102bを起動して(42)、コールバック処理手段102bは送信完了したバイト数を確認し、この場合はイベントCのうちC3が、イベントDのすべてが送信完了しているので、第2のバッファ121bからイベントC3(あるいはイベントC全体)およびイベントDを削除する。そして再び、ソケット書込要求手段102aを呼び出す(43)。
【0127】
次に、コールバックスレッドにおいて、ソケット書込要求手段102aは、呼出元がコールバック処理手段102bなので、まず第1のバッファ121bにイベントが蓄積されているか確認し、イベントがない(38)ので第2のバッファ121bにイベントを移動せず、OSシステムコール呼び出しを行い、第2のバッファ121bのイベントE、F(44)をOS実行手段100(OSカーネル)に書き込み要求をしてコールバックスレッドを終了する(45)。
【0128】
次に、イベントE、Fの送信依頼されたOSカーネル100は、イベントE、Fを適切なサイズに分割してイベントE1、E2、Fを送信する(46)。
【0129】
次に、イベントE、Fの送信依頼されたOSカーネル100は、イベントE、Fの送信を完了すると、コールバックスレッドとして、コールバック処理手段102bを起動して(47)、コールバック処理手段102bは送信完了したバイト数を確認し、この場合はイベントE、Fのすべてが送信完了しているので、第2のバッファ121bからイベントE、Fを削除する。そして再び、ソケット書込要求手段102aを呼び出す(48)。
【0130】
その後、コールバックスレッドにおいて、ソケット書込要求手段102aは、呼出元がコールバック処理手段102bなので、第1のバッファ121b及び第2のバッファ121bを順に確認するが、第1のバッファ121b及び第2のバッファ121bのいずれにもイベントがなくなっているので、フラグ管理手段107のCASフラグを解除(49)し、コールバックスレッドを終了する。
【0131】
(第2の実施の形態の効果)
上記した第2の実施の形態によれば、アプリケーション書込手段105とソケット書込手段102の間に中間バッファ121Bを設け、中間バッファ121Bの第1のバッファ121bはアプリケーション書込手段105の書込データをスレッド毎にノンブロッキングに蓄積して、ソケット書込要求手段102aの書込動作をCASフラグに応じて実行し、CASフラグをフラグ管理手段107によって管理し、ソケット書込要求手段102aの書込開始でフラグを立て、OS実行手段100のイベント処理完了の通知を受けたコールバック処理手段102bがフラグを解除するとともに、第1のバッファ121bにイベントが存在する場合は第2のバッファ121bにイベントをまとめるなどOS実行手段の処理に適した形式に変換した上で移動してからOS実行手段100により第2のバッファ121bのイベントを処理するようにしたため、アプリケーション書込手段105の書き込み動作がOS実行手段100の送信イベント処理の動作に直接影響を及ぼさないようになり(アプリケーション書込手段105、OS実行手段100がそれぞれに対応するための待ち時間がなくなり、また、イベントごとにOS実行手段100を呼び出す場合に比べてOS実行手段100の呼出回数が削減され)、アプリケーション処理及びデータの送信をノンブロッキングに実行して通信を高速化することができる。特に、所要時間の比較的長いネットワークへの送信処理を、ウェイト時間(レイテンシ)短く、なるべく連続処理、かつ、ノンブロッキングに実行することで、ネットワーク送信処理を優先し、送信スループットを上げつつ、非同期送信(NIO)の処理待ちの間の時間にアプリ処理をノンブロッキングに並列実行することができる。
【0132】
(変形例)
上記した第2の実施の形態において、ソケット書込要求手段102aを、アプリケーション書込手段105からの呼び出しにのみ応じてOS実行手段100にイベント処理を要求するソケット書込要求手段102aと、コールバック処理手段102bの呼び出しにのみ応じてOS実行手段100にイベント処理を要求するソケットフラッシュ書込手段102aとに分けてもよい。この場合、図11のステップS40が不要となり、図12のステップS53が「OS実行手段100にイベント処理を要求する」に変わり、図13の動作をソケットフラッシュ書込手段102aが担うこととなる。このように実装した場合についても第2の実施の形態と同様の上記効果を奏する。
【0133】
[他の実施の形態]
なお、本発明は、上記実施の形態に限定されず、本発明の趣旨を逸脱しない範囲で種々な変形や組み合わせが可能である。
(A)CASによるノンブロッキングな排他制御
本発明の基本は、CASによるノンブロッキングなOS実行手段100の呼び出しである。ネットワーク送信処理において、OS実行手段100の呼び出しは、送信要求したデータの一部のみを送信することがあるなど、送信バッファのセットアップ、送信処理、送信完了後の済送信バッファの調整など、同一チャネルへの送信は並行処理することができない。そのためなんらかの排他制御が必要である。そこで、OSの機能を利用して、Synchronizedメソッドなどで実装し、同時に単一のスレッドしか実行できず、他のスレッドは実行中のスレッドの終了を待ち、暫時、ひとつずつ実行が再開されるような、排他制御を行うことが一般的である。ただ、ネットワークゲームでゲームオブジェクトの変化を大量多頻度に中継するようなゲームサーバのような用途では、小さなデータを大量多頻度に送受信することになり、OSの機能を用いた排他制御も多頻度となるため、OS機能呼び出しのオーバヘッドが無視できなくなり、サーバ機能の処理性能を低下させる。そこで本発明は、アトミックなインストラクションで実行されるノンブロッキングなCASを用いて排他制御を行う。イベントをOS機能処理中に、別のイベントのためにOS機能呼び出しを行おうとしてもCASの排他制御によって、実行されることなく、待つこともなく終了してしまう。イベントごとに逐次に処理することはできないので、イベントは一旦、バッファへ蓄積し、OS機能処理実行中のスレッドは、起動時に想定していたイベントだけでなく、起動前に蓄積されていたイベント、あるいは、OS機能処理実行中に蓄積されたイベントも、処理するように工夫している。一般に、OSの機能呼び出しは通常のメモリ処理に比べて、処理時間が長いので、ゲームサーバのような用途では、OS機能呼び出し中に新たなイベントが蓄積される可能性が高い。第1の実施例と第2の実施例で典型的な2種類のCASによるノンブロッキング排他制御方法を示したが、この2個の実施例に限定するものではない。
(B)イベント蓄積の仮想的なリングバッファの形式
OSの機能呼び出しに時間がかかる場合、機能呼び出し実行中に別の処理を非同期に実行できるように、OSは機能呼び出しとコールバックとに分けて処理する仕組みを提供する。そのため、イベント処理後のコールバックは、イベント処理のための機能呼び出しとは非同期に発生する。また、アプリケーションのイベントの生成も非同期である。これらを調停するために、イベントはリングバッファに蓄積し、FIFOでイベント処理できるように、蓄積と処理を完全に非同期に実行できるようにする必要がある。リングバッファにはさまざまなバリエーションがあり、第1の実施例ではイベントデータをバイトシーケンスで蓄積するリングバッファを示し、第2の実施例ではイベントデータを蓄積するメモリチャンクのポインタを蓄積するリングバッファを示したが、開示した2個の方法及びその変形だけに限定するものではない。
(C)イベントの蓄積とOSの機能呼び出しの非同期処理
イベントの蓄積はイベントの発生に同期できる。一方で蓄積しているイベントの処理はイベント処理完了のコールバックから起動すればよい。ただ、イベント処理が全く動作していない、例えば最初の1個目のイベント処理を起動するには別の機構が必要である。第1の実施例及び第2の実施例では、イベント処理が停止している場合に限り、イベント蓄積をトリガとする方式を開示した。しかし、前述しているように、このトリガは、タイマなどで完全に非同期であってもよいし、毎回あるいは数回に一度のイベント蓄積と同期であってもよい。また、トリガとしては、機能呼び出し(メッソッドや関数の呼び出し)であってもよいし、OS機能を用いたシグナリングでもよいし、それ以外の方法でもよい。第2の実施例では、アプリケーションのイベント処理の効率を考慮して、トリガとしてコールバックからのメソッド呼び出しを優先する方式を示した。適用するアプリケーションにより適切な方法を選択するものであり、実施例及びその変形として開示した手法のみに限定するものではない。
(D)メモリの再利用
頻繁にメモリの割当解放を繰り返す場合は、その都度OS機能呼び出しを行うのはオーバヘッドとなるので、事前にまとまったメモリを確保し、メモリの割当解放はOSに依頼するのではなく、確保済のメモリを再利用するバッファプールは一般的である。メモリのフラグメンテーションやそれに伴うガベージコレクションを回避し、メモリの再利用を促進するには、バッファプールは、規格化したメモリチャンクの集合として管理し、アプリケーションが使用するメモリサイズに応じて、必要個数のチャンクを結合して使うのも一般的である。仮想的にリングバッファを実現するには、メモリのバファプールを用いるのがよい。チャンクのサイズや個数、また、使用するメモリの種類(ダイレクトバファであるか非ダイレクトバッファであるか)は適用するアプリケーションにより適切に選択するものであり、実施例及びその変形として開示した手法による選択に限定されるものではない。
【0134】
図5は、レイヤ構成の変形例を示す概略図である。
【0135】
例えば、本願は、OSI(Open Systems Interconnection)参照モデルの7層のうち、アプリケーション層(アプリケーション112)とプレゼンテーション層及びセッション層(通信管理プログラム111)との間にバッファ(a)を設けた例を説明したが、イ~オの異なる層構成で、異なる位置にバッファ(b)~(e)を設けてもよい。
【0136】
ここで、送信スループットを上げるためには、下位の送信に関するレイヤで待ち、下位のレイヤでレイテンシが発生しないためには、上位のアプリは下位への依頼・呼出はロックフリー(ノンブロッキング)であることが望ましい。上位から下位へはなんらかの集約が発生するので、マルチタスク環境では各スレッドのデータが混ざらないように通常はなんらかの排他制御が必要となる。排他制御にOSの「ロック(Mutex)」を使用すると処理負荷が重くなるため、ロックフリーなアルゴリズムが望ましい。特にゲームサーバのように、同期のためのパケットをストリーミングのように大量に他頻度に送信するような場合は、パケット送信単位でロックがかかるのは望ましくない。ウ~オではOSの排他制御は使えないため、アプリケーションによる排他制御を独自に行う必要がある。
【0137】
ア(第1の実施の形態および第2の実施の形態)の場合、Java VM(仮想OS)によって作成されたTCP又はUDP(User Datagram Protocol)チャネルにデータを順次送信する。同一チャネルを複数スレッドで利用する場合には排他制御が必要となる。RUDP(Reliable User Datagram Protocol)の場合は、UDPソケットを使うアプリがACK(肯定応答)や再送などの信頼性保証のレイヤを独自に作成する必要がある。
【0138】
イの場合、アとの相違点は仮想OSかNative OSかの違いであるため、アとほぼ同じ構成、動作で実現可能である。
【0139】
ウの場合、ステートレス(コネクションレス)なUDPで実現可能性がある。OSの内部のレイヤを直接呼び出すことは、通常できないため実現可能性は低いが、直接呼び出す構成があれば可能となる。複数のアプリケーション及びスレッドが、NICを共用する複数の送信先(端末装置)に対する通信全てについて集約が必要となる。
【0140】
エの場合、OSのプロトコルスタックをバイパスして高速化することができる。プロトコルスタックを独自に制作する必要がある。(例えばDPDK(Data Plane Development Kit)等を用いることができる。https://www.dpdk.org/)。NICドライバは、NDISではなく特殊となり、通常は特定のNICプロダクト依存となる。UDPの場合、データグラムとして、ソケットを介さずに直接送信が可能な場合もある。OSの内部のレイヤを直接呼び出すことは、通常できないため実現可能性は低いが、DPDKのように専用のNICドライバがあれば可能となる。ウ同様に、複数のアプリケーション及びスレッドが、NICを共用する複数の送信先(端末装置)に対する通信全てについて集約が必要となる。
【0141】
オの場合、アプリケーションが完全にハードウェア依存となるため、組込みシステムなど特殊用途以外で用いられる。ウ同様に、複数のアプリケーション及びスレッドが、NICを共用する複数の送信先(端末装置)に対する通信全てについて集約が必要となる。
【0142】
次に、各バッファ(a)~(e)について説明する。
【0143】
(a)の場合、一般的用法としてはJAVA限定、OS非依存のものとなり、ソケット単位でのマルチスレッドのアプリパケット(アプリ送信単位)が混ざらないように集約するものとなる。
【0144】
(b)の場合、一般的用法としては言語依存、OSに依存することもあり、(a)と同様となる。(a)経由の場合はそのままパラメータのパススルーで引き渡してもよいし、分散書込の場合は、送信バイトバッファが連続領域にあれば一つの送信バッファにまとめるなどの最適化をしてもよい。ここで、分散書込とは、例えばJavaのAsynchronousSocketChannel.write()の機能で、1つ以上の可変長のデータブロックをグループ化した複数のバッファを指定して送信要求するものを指す。
【0145】
(c)の場合、通常はOS内部、OSカーネルの作業となり、アプリは横断的に対応してプロトコルごとに集約する。なお、プロトコルヘッダの追加が必要となる。TCPソケットに書かれた時点でコネクションごとのデータストリーム状態、アプリパケットの送信単位の境界は問題としない。適当な大きさに分割して、プロトコルドライバに渡す。その際に、データのコピーや詰替えが発生する可能性がある。UDPソケットの場合は、コネクションレスのため、ソケットに書きまれればバッファリングされずに送信され、まとめて送ることはない。RUDPで複数のデータをまとめて送る場合には、UDPソケットに書き込む前にまとめてから書き込む。
【0146】
(d)の場合、通常はOS内部、プロトコルドライバの作業となり、アプリは横断的に対応して、各種プロトコルをNICごとに集約する。なお、プロトコルヘッダの追加が必要となる。各パケットの結合、分割、プロトコルヘッダを追加した、全データをNICごとに集約する。
【0147】
(e)の場合、NIC内部の作業となる。ネットワークタイプに応じた分割、結合、圧縮などの加工、ヘッダなどの追加をして、ビット列に対応する電気信号に変換して、通信回線に送信する。
【0148】
上記実施の形態では制御部10の各手段100~107の機能をプログラムで実現したが、各手段の全て又は一部をASIC等のハードウェアによって実現してもよい。また、上記実施の形態で用いたプログラムをCD-ROM等の記録媒体に記憶して提供することもできる。また、上記実施の形態で説明した上記ステップの入れ替え、削除、追加等は本発明の要旨を変更しない範囲内で可能である。また、各手段の機能は適宜他の手段に結合してもよいし、複数の手段に分離してもよい。
【0149】
上記実施の形態では、主にネットワークの送信イベントの処理について記述したが、本発明は、処理する対象のイベントをネットワーク送信イベントのみに限定するものではない。本発明の各手段のすべて又は一部は、ネットワークの送信以外のイベント処理、特にOS機能に処理操作を依頼する比較的長時間を要する処理(OS機能が非同期処理を可能とするために処理要求手段とコールバック手段とを提供する処理、典型的には各種I/O操作)、より具体的には、ネットワークやディスクなど各種メディアなどに対する出力操作に、対応する要求手段とコールバック手段を差し替えることで、適用できる。また、OS機能を順次複数回呼び出してイベント処理するには、本発明のイベント処理の仕組みを複数段組み合わせることができる。
【符号の説明】
【0150】
1 :サーバ装置
2a、2b、2c:端末装置
4 :ネットワーク
10 :制御部
11 :記憶部
12 :メモリ
13 :通信部
100 :OS実行手段(OSカーネル)
101 :ソケット読出手段
102 :ソケット書込手段
102a :ソケット書込要求手段
102b :コールバック処理手段
103 :アプリケーション実行手段
104 :アプリケーション読出手段
105 :アプリケーション書込手段
106 :バッファリング手段
107 :フラグ管理手段
111 :通信管理プログラム
112 :アプリケーション
120 :アプリバッファ
121 :リングバッファ
121B :中間バッファ
121b :第1のバッファ
121b :第2のバッファ
130 :チャネル
131 :ソース
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
【手続補正書】
【提出日】2022-03-17
【手続補正1】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項1】
コンピュータを、
処理対象とするイベントを蓄積するイベント蓄積手段と、
前記イベントを蓄積するバッファリング手段と、
前記蓄積したイベントを処理する処理手段と、
呼び出しを受け付けて排他的にフラグを立てるフラグ管理手段として機能させ、
前記処理手段は、イベントの処理を要求する処理要求手段と、イベントの処理を完了した場合に完了通知を受けて実行するコールバック処理手段とを含み、
前記フラグ管理手段は、前記処理要求手段がイベントの処理の開始前のタイミングで排他的にフラグを立て、前記コールバック処理手段の処理の終了後のタイミングでフラグを解除し、
前記処理要求手段は、前記イベント蓄積手段の前記バッファリング手段へのイベント蓄積終了後のタイミング及び前記コールバック処理手段のイベント処理終了後のタイミングで呼び出しを受け付けて、前記フラグ管理手段のフラグに応じて当該フラグが、立てられなかった場合は処理をせずに終了し、立てられた場合は前記バッファリング手段が蓄積した前記イベントを処理する情報処理プログラム。
【請求項2】
前記バッファリング手段は、イベントを蓄積する第1のバッファリング手段と、前記第1のバッファリング手段に蓄積された前記イベントを蓄積する第2のバッファリング手段とを有し、
前記処理要求手段は、フラグが立てられた場合に、前記第1のバッファリング手段から前記第2のバッファリング手段に前記イベントを移動して蓄積し、前記第2のバッファリング手段が蓄積している前記イベントの全て又は一部を処理する請求項1に記載の情報処理プログラム。
【請求項3】
前記第1のバッファリング手段と前記第2のバッファリング手段の間、前記第1のバッファリング手段の前段又は前記第2のバッファリング手段の後段に、さらに1以上のバッファリング手段を有する請求項2に記載の情報処理プログラム。
【請求項4】
前記バッファリング手段間の移動において、データブロックのサイズ、個数、タイプ、イベント保持形式の少なくとも1つを変更する請求項2又は3に記載の情報処理プログラム。
【請求項5】
前記バッファリング手段間の移動において、移動イベントの数やサイズを予め定めた条件で制限する請求項2から4のいずれか1項に記載の情報処理プログラム。
【請求項6】
前記バッファリング手段は、イベント蓄積手段のイベント蓄積動作と、前記処理手段の処理動作とが、非同期に実行される請求項1から5のいずれか1項に記載の情報処理プログラム。
【請求項7】
前記バッファリング手段は、並列動作する複数のイベント生成元が実行するそれぞれのイベントの蓄積手段が非同期にイベントを蓄積する請求項1から6のいずれか1項に記載の情報処理プログラム。
【請求項8】
前記バッファリング手段は、リングバッファである請求項1から7のいずれか1項に記載の情報処理プログラム。
【請求項9】
前記バッファリング手段は、前記イベントそのものをメモリ領域に順次蓄積するリングバッファである請求項1に記載の情報処理プログラム。
【請求項10】
前記バッファリング手段は、2段リングバッファ構成であり、第1段のリングバッファは並列動作するイベント蓄積手段のイベントを蓄積し、第2段のリングバッファは前記処理手段の処理に応じて定められたサイズに当該イベントを連結および分割するとともに前記処理手段に応じて定められた個数保持する請求項2、6又は7に記載の情報処理プログラム。
【請求項11】
前記バッファリング手段は、ダイレクトバッファに前記イベントを格納することを特徴とする請求項1、2又は6から10のいずれか1項に記載の情報処理プログラム。
【請求項12】
前記バッファリング手段は、バッファプールのバッファに前記イベントを蓄積する請求項1、2又は6から10のいずれか1項に記載の情報処理プログラム。
【請求項13】
前記バッファリング手段は、前記第1段のリングバッファと前記第2段のリングバッファとで、異なるバッファサイズを保持するバッファプールのバッファにイベントを蓄積する請求項10に記載の情報処理プログラム。
【請求項14】
前記処理手段は、蓄積されている前記イベントをすべて処理してからイベント処理を終了する請求項1から請求項13のいずれか1項に記載の情報処理プログラム。
【請求項15】
処理対象とするイベントを蓄積するイベント蓄積手段と、
前記イベントを蓄積するバッファリング手段と、
前記蓄積したイベントを処理する処理手段と、
呼び出しを受け付けて排他的にフラグを立てるフラグ管理手段とを有し、
前記処理手段は、イベントの処理を要求する処理要求手段と、イベントの処理を完了した場合に完了通知を受けて実行するコールバック処理手段とを含み、
前記フラグ管理手段は、前記処理要求手段がイベントの処理の開始前のタイミングで排他的にフラグを立て、前記コールバック処理手段の処理の終了後のタイミングでフラグを解除し、
前記処理要求手段は、前記イベント蓄積手段の前記バッファリング手段へのイベント蓄積終了後のタイミング及び前記コールバック処理手段のイベント処理終了後のタイミングで呼び出しを受け付けて、前記フラグ管理手段のフラグに応じて当該フラグが、立てられなかった場合は処理をせずに終了し、立てられた場合は前記バッファリング手段が蓄積した前記イベントを処理する情報処理装置。
【請求項16】
コンピュータにおいて実行される情報処理方法であって
処理対象とするイベントを蓄積するイベント蓄積ステップと、
前記イベントを蓄積するバッファリングステップと、
前記蓄積したイベントを処理する処理ステップと、
呼び出しを受け付けて排他的にフラグを立てるフラグ管理ステップとを有し、
前記処理ステップは、イベントの処理を要求する処理要求ステップと、イベントの処理を完了した場合に完了通知を受けて実行するコールバック処理ステップとを含み、
前記フラグ管理ステップは、前記処理要求ステップにおけるイベントの処理の開始前のタイミングで排他的にフラグを立て、前記コールバック処理ステップにおける処理の終了後のタイミングでフラグを解除し、
前記処理要求ステップは、前記イベント蓄積ステップにおけるイベント蓄積終了後のタイミング及び前記コールバック処理ステップにおけるイベント処理終了後のタイミングで呼び出しを受け付けて、前記フラグが、立てられなかった場合は処理をせずに終了し、立てられた場合は蓄積した前記イベントを処理する情報処理方法。

【手続補正2】
【補正対象書類名】明細書
【補正対象項目名】0008
【補正方法】変更
【補正の内容】
【0008】
[1]コンピュータを、
処理対象とするイベントを蓄積するイベント蓄積手段と、
前記イベントを蓄積するバッファリング手段と、
前記蓄積したイベントを処理する処理手段と、
呼び出しを受け付けて排他的にフラグを立てるフラグ管理手段として機能させ、
前記処理手段は、イベントの処理を要求する処理要求手段と、イベントの処理を完了した場合に完了通知を受けて実行するコールバック処理手段とを含み、
前記フラグ管理手段は、前記処理要求手段がイベントの処理の開始前のタイミングで排他的にフラグを立て、前記コールバック処理手段の処理の終了後のタイミングでフラグを解除し、
前記処理要求手段は、前記イベント蓄積手段の前記バッファリング手段へのイベント蓄積終了後のタイミング及び前記コールバック処理手段のイベント処理終了後のタイミングで呼び出しを受け付けて、前記フラグ管理手段のフラグに応じて当該フラグが、立てられなかった場合は処理をせずに終了し、立てられた場合は前記バッファリング手段が蓄積した前記イベントを処理する情報処理プログラム。
[2]前記バッファリング手段は、イベントを蓄積する第1のバッファリング手段と、前記第1のバッファリング手段に蓄積された前記イベントを蓄積する第2のバッファリング手段とを有し、
前記処理要求手段は、フラグが立てられた場合に、前記第1のバッファリング手段から前記第2のバッファリング手段に前記イベントを移動して蓄積し、前記第2のバッファリング手段が蓄積している前記イベントの全て又は一部を処理する前記[1]に記載の情報処理プログラム。
[3]前記第1のバッファリング手段と前記第2のバッファリング手段の間、前記第1のバッファリング手段の前段又は前記第2のバッファリング手段の後段に、さらに1以上のバッファリング手段を有する前記[2]に記載の情報処理プログラム。
[4]前記バッファリング手段間の移動において、データブロックのサイズ、個数、タイプ、イベント保持形式の少なくとも1つを変更する前記[2]又は[3]に記載の情報処理プログラム。
[5]前記バッファリング手段間の移動において、移動イベントの数やサイズを予め定めた条件で制限する前記[2]から[4]のいずれか1項に記載の情報処理プログラム。
[6]前記バッファリング手段は、イベント蓄積手段のイベント蓄積動作と、前記処理手段の処理動作とが、非同期に実行される前記[1]から[5]のいずれか1項に記載の情報処理プログラム。
[7]前記バッファリング手段は、並列動作する複数のイベント生成元が実行するそれぞれのイベントの蓄積手段が非同期にイベントを蓄積する前記[1]から[6]のいずれか1項に記載の情報処理プログラム。
[8]前記バッファリング手段は、リングバッファである前記[1]から[7]のいずれか1項に記載の情報処理プログラム。
[9]前記バッファリング手段は、前記イベントそのものをメモリ領域に順次蓄積するリングバッファである前記[1]に記載の情報処理プログラム。
[10]前記バッファリング手段は、2段リングバッファ構成であり、第1段のリングバッファは並列動作するイベント蓄積手段のイベントを蓄積し、第2段のリングバッファは前記処理手段の処理に応じて定められたサイズに当該イベントを連結および分割するとともに前記処理手段に応じて定められた個数保持する前記[2]、[6]又は[7]に記載の情報処理プログラム。
[11]前記バッファリング手段は、ダイレクトバッファに前記イベントを格納することを特徴とする前記[1]、[2]又は[6]から[10]のいずれか1項に記載の情報処理プログラム。
[12]前記バッファリング手段は、バッファプールのバッファに前記イベントを蓄積する前記[1]、[2]又は[6]から[10]のいずれか1項に記載の情報処理プログラム。
[13]前記バッファリング手段は、前記第1段のリングバッファと前記第2段のリングバッファとで、異なるバッファサイズを保持するバッファプールのバッファにイベントを蓄積する前記[10]に記載の情報処理プログラム。
[14]前記処理手段は、蓄積されている前記イベントをすべて処理してからイベント処理を終了する前記[1]から[13]のいずれか1項に記載の情報処理プログラム。
[15]処理対象とするイベントを蓄積するイベント蓄積手段と、
前記イベントを蓄積するバッファリング手段と、
前記蓄積したイベントを処理する処理手段と、
呼び出しを受け付けて排他的にフラグを立てるフラグ管理手段とを有し、
前記処理手段は、イベントの処理を要求する処理要求手段と、イベントの処理を完了した場合に完了通知を受けて実行するコールバック処理手段とを含み、
前記フラグ管理手段は、前記処理要求手段がイベントの処理の開始前のタイミングで排他的にフラグを立て、前記コールバック処理手段の処理の終了後のタイミングでフラグを解除し、
前記処理要求手段は、前記イベント蓄積手段の前記バッファリング手段へのイベント蓄積終了後のタイミング及び前記コールバック処理手段のイベント処理終了後のタイミングで呼び出しを受け付けて、前記フラグ管理手段のフラグに応じて当該フラグが、立てられなかった場合は処理をせずに終了し、立てられた場合は前記バッファリング手段が蓄積した前記イベントを処理する情報処理装置。
[16]コンピュータにおいて実行される情報処理方法であって
処理対象とするイベントを蓄積するイベント蓄積ステップと、
前記イベントを蓄積するバッファリングステップと、
前記蓄積したイベントを処理する処理ステップと、
呼び出しを受け付けて排他的にフラグを立てるフラグ管理ステップとを有し、
前記処理ステップは、イベントの処理を要求する処理要求ステップと、イベントの処理を完了した場合に完了通知を受けて実行するコールバック処理ステップとを含み、
前記フラグ管理ステップは、前記処理要求ステップにおけるイベントの処理の開始前のタイミングで排他的にフラグを立て、前記コールバック処理ステップにおける処理の終了後のタイミングでフラグを解除し、
前記処理要求ステップは、前記イベント蓄積ステップにおけるイベント蓄積終了後のタイミング及び前記コールバック処理ステップにおけるイベント処理終了後のタイミングで呼び出しを受け付けて、前記フラグが、立てられなかった場合は処理をせずに終了し、立てられた場合は蓄積した前記イベントを処理する情報処理方法。