(57)【要約】【課題】データを記憶するための記憶容量の増大を抑制しつつ、データの先入れ先出しをデータ系列毎に実現するとともに、出力したデータの再出力を行う。【解決手段】複数のデータ系列のいずれかに属する複数のデータの入力を１つずつ受け付け、受け付けたデータを複数のデータ系列毎に先入れ先出し方式で出力し、出力したデータを再出力可能なデータ入出力装置であって、複数の記憶領域と、受け付けたデータと同じデータ系列に属するデータが記憶されていないと、データが記憶されていない空き記憶領域の１つに当該データを記憶させ、当該空き記憶領域を当該データ系列における先頭記憶領域として設定し、出力の対象となるデータ系列における先頭記憶領域からデータを読み出して出力し、出力したデータに対する受信確認を受け付けた場合、当該データが記憶された記憶領域を空き先頭記憶領域として設定する制御部とを有するデータ入出力装置。【選択図】図１
2011248585.tif 000002
【特許請求の範囲】
【請求項１】
複数のデータ系列のいずれかに属する複数のデータの入力を１つずつ受け付け、該受け付けたデータを前記複数のデータ系列毎に先入れ先出し方式で出力し、該出力したデータを再出力可能なデータ入出力装置であって、
前記受け付けた複数のデータを１つずつ記憶する複数の記憶領域と、
前記複数の記憶領域のうち、前記データが記憶されていない記憶領域を空き記憶領域として設定し、前記受け付けたデータと同じデータ系列に属するデータが前記複数の記憶領域に記憶されていない場合、前記空き記憶領域として設定された記憶領域の１つに当該データを記憶させ、当該記憶領域を、当該データ系列において最初に受け付けたデータが記憶された先頭記憶領域として設定し、前記受け付けたデータと同じデータ系列に属するデータが前記複数の記憶領域に記憶されている場合、当該データ系列において当該データの１つ前に受け付けたデータが記憶された記憶領域と、前記空き記憶領域として設定された記憶領域の１つとを対応付け、当該記憶領域に当該データを記憶させ、前記複数のデータ系列のうち、出力の対象となるデータ系列において前記先頭記憶領域として設定された記憶領域からデータを読み出して出力し、当該記憶領域と対応付けられた記憶領域を当該データ系列における新たな前記先頭記憶領域として設定する制御部と、を有し、
前記制御部は、前記出力されたデータを受け付けたことを示す受信確認を受け付けた場合、当該データが記憶された記憶領域を前記空き記憶領域として設定するデータ入出力装置。
【請求項２】
請求項１に記載のデータ入出力装置において、
前記制御部は、前記受信確認を受け付けない場合、当該データが記憶された記憶領域を、当該データが属するデータ系列における新たな前記先頭記憶領域として設定するデータ入出力装置。
【請求項３】
複数の記憶領域を有し、複数のデータ系列のいずれかに属する複数のデータの入力を１つずつ受け付け、該受け付けた複数のデータを前記複数の記憶領域に１つずつ記憶させ、該記憶されたデータを前記複数のデータ系列毎に先入れ先出し方式で出力し、該出力したデータを再出力可能なデータ入出力装置におけるデータ記憶方法であって、
前記複数の記憶領域のうち、前記データが記憶されていない記憶領域を空き記憶領域として設定する処理と、
前記受け付けたデータと同じデータ系列に属するデータが前記複数の記憶領域に記憶されていない場合、前記空き記憶領域として設定された記憶領域の１つに当該データを記憶させ、当該記憶領域を、当該データ系列において最初に受け付けたデータが記憶された先頭記憶領域として設定する処理と、
前記受け付けたデータと同じデータ系列に属するデータが前記複数の記憶領域に記憶されている場合、当該データ系列において当該データの１つ前に受け付けたデータが記憶された記憶領域と、前記空き記憶領域として設定された記憶領域の１つとを対応付け、当該記憶領域に当該データを記憶させる処理と、
前記複数のデータ系列のうち、出力の対象となるデータ系列において前記先頭記憶領域として設定された記憶領域からデータを読み出して出力する処理と、
当該記憶領域と対応付けられた記憶領域を当該データ系列における新たな前記先頭記憶領域として設定する処理と、
前記出力されたデータを受け付けたことを示す受信確認を受け付けた場合、当該データが記憶された記憶領域を前記空き記憶領域として設定する処理と、を有するデータ記憶方法。
【請求項４】
請求項３に記載のデータ記憶方法において、
前記受信確認を受け付けない場合、当該データが記憶された記憶領域を、当該データが属するデータ系列における新たな前記先頭記憶領域として設定する処理をさらに有するデータ記憶方法。
【請求項５】
複数の記憶領域を有し、複数のデータ系列のいずれかに属する複数のデータの入力を１つずつ受け付け、該受け付けた複数のデータを前記複数の記憶領域に１つずつ記憶させ、該記憶されたデータを前記複数のデータ系列毎に先入れ先出し方式で出力し、該出力したデータを再出力可能なコンピュータを、請求項１または請求項２に記載のデータ入出力装置として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、出力したデータを再出力することが可能なデータ入出力装置、データ記憶方法及びプログラムに関する。
【背景技術】
【０００２】
高信頼性を確保しつつ、データの入出力を行うためには、データの出力元は、データの出力先がそのデータを正しく受け付けたことを確認できない場合、そのデータを再出力する必要がある。
【０００３】
一方、低速かつ等時性のない複数のデータ系列のいずれかに属する複数のデータのそれぞれを、データ系列毎に所定のデータ量になるまで記憶し、記憶されたデータに対して一度に高速な処理を施すためには、データの先入れ先出しを複数のデータ系列毎に実現する必要がある。
【０００４】
図１６は、データの先入れ先出しを複数のデータ系列毎に実現するとともに、出力したデータの再出力が可能なデータ入出力装置の構成を説明するための図である。
【０００５】
入力バッファ１１４は、複数のデータの入力を１つずつ受け付ける。なお、入力バッファ１１４にて受け付けられる複数のデータのそれぞれは、複数のデータ系列のいずれかに属している。複数のデータのそれぞれには、データ系列を識別するための系列番号が付与されている。
【０００６】
キュー１１２−１〜１１２−ｎのそれぞれは、複数のデータ系列のそれぞれと固定的に対応付けられ、入力バッファ１１４にて受け付けられた複数のデータのそれぞれをデータ系列毎に記憶する。例えば、データ系列の数がＮ個であれば、キューもＮ個必要となる。
【０００７】
再出力用キュー１１３−１〜１１３−ｎのそれぞれは、キューと同様に、複数のデータ系列のそれぞれと固定的に対応付けられ、キュー１１２−１〜１１２−ｎのそれぞれから出力されたデータを、所定の条件が満足されるまで記憶する。所定の条件とは例えば、データの出力先から、そのデータを受け付けたことを示す受信確認が受け付けられた場合等である。再出力用キューもキューと同様に、例えば、データ系列の数がＮ個であれば、Ｎ個必要となる。
【０００８】
制御部１１１は、入力バッファ１１４にて受け付けられた複数のデータのそれぞれに付与された系列番号を抽出し、キュー１１２−１〜１１２−ｎのうち、抽出した系列番号のデータ系列に対応するキューに、そのデータを記憶させる。そして、制御部１１１は、キュー１１２−１〜１１２−ｎのうち、出力対象のデータ系列に対応するキューに記憶されたデータを読み出して出力する。そして、制御部１１１は、再出力用キュー１１３−１〜１１３−ｎのうち、出力したデータが属するデータ系列に対応する再出力用キューに、上述したような所定の条件が満足されるまで、出力したデータを記憶させる。
【０００９】
なお、データの再出力に関する技術が例えば、非特許文献１に開示されている。
【先行技術文献】
【非特許文献】
【００１０】
【非特許文献１】http://www.atmarkit.co.jp/fwin2k/network/baswinlan014/baswinlan014_03.html
【発明の概要】
【発明が解決しようとする課題】
【００１１】
上述したように、図１６に示したようなデータ入出力装置においては、データの先入れ先出しをデータ系列毎に実現するとともに、出力したデータの再出力を可能とするために、複数のキュー及び再出力用キューのそれぞれが複数のデータ系列のそれぞれと固定的に対応付けられている。
【００１２】
このとき、例えば所定の条件において、ある１つのデータ系列に属するデータが、受け付けられるデータの大部分を占める場合であったとしても、そのデータ系列に属するデータを他のデータ系列に対応付けられたキューに記憶させることはできない。
【００１３】
また、ある１つのデータ系列に対応付けられたキューに記憶されたデータの出力が完了した後でも、そのキューに他のデータ系列に属するデータを記憶させることはできない。
【００１４】
同様に、ある１つのデータ系列に対応付けられた再出力用キューに記憶されたデータを記憶する必要がなくなった場合でも、その再出力用キューに他のデータ系列に属するデータを記憶させることはできない。
【００１５】
この場合、データ系列の数が多くなればなるほど、データを記憶するために必要な記憶容量が増大してしまうという問題点がある。
【００１６】
本発明は、データを記憶するための記憶容量の増大を抑制しつつ、データの先入れ先出しをデータ系列毎に実現するとともに、出力したデータの再出力が可能なデータ入出力装置、データ記憶方法及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１７】
上記目的を達成するために本発明のデータ入出力装置は、複数のデータ系列のいずれかに属する複数のデータの入力を１つずつ受け付け、該受け付けたデータを前記複数のデータ系列毎に先入れ先出し方式で出力し、該出力したデータを再出力可能なデータ入出力装置であって、
前記受け付けた複数のデータを１つずつ記憶する複数の記憶領域と、
前記複数の記憶領域のうち、前記データが記憶されていない記憶領域を空き記憶領域として設定し、前記受け付けたデータと同じデータ系列に属するデータが前記複数の記憶領域に記憶されていない場合、前記空き記憶領域として設定された記憶領域の１つに当該データを記憶させ、当該記憶領域を、当該データ系列において最初に受け付けたデータが記憶された先頭記憶領域として設定し、前記受け付けたデータと同じデータ系列に属するデータが前記複数の記憶領域に記憶されている場合、当該データ系列において当該データの１つ前に受け付けたデータが記憶された記憶領域と、前記空き記憶領域として設定された記憶領域の１つとを対応付け、当該記憶領域に当該データを記憶させ、前記複数のデータ系列のうち、出力の対象となるデータ系列において前記先頭記憶領域として設定された記憶領域からデータを読み出して出力し、当該記憶領域と対応付けられた記憶領域を当該データ系列における新たな前記先頭記憶領域として設定する制御部と、を有し、
前記制御部は、前記出力されたデータを受け付けたことを示す受信確認を受け付けた場合、当該データが記憶された記憶領域を前記空き記憶領域として設定する。
【００１８】
また、上記目的を達成するために本発明のデータ記憶方法は、複数の記憶領域を有し、複数のデータ系列のいずれかに属する複数のデータの入力を１つずつ受け付け、該受け付けた複数のデータを前記複数の記憶領域に１つずつ記憶させ、該記憶されたデータを前記複数のデータ系列毎に先入れ先出し方式で出力し、該出力したデータを再出力可能なデータ入出力装置におけるデータ記憶方法であって、
前記複数の記憶領域のうち、前記データが記憶されていない記憶領域を空き記憶領域として設定する処理と、
前記受け付けたデータと同じデータ系列に属するデータが前記複数の記憶領域に記憶されていない場合、前記空き記憶領域として設定された記憶領域の１つに当該データを記憶させ、当該記憶領域を、当該データ系列において最初に受け付けたデータが記憶された先頭記憶領域として設定する処理と、
前記受け付けたデータと同じデータ系列に属するデータが前記複数の記憶領域に記憶されている場合、当該データ系列において当該データの１つ前に受け付けたデータが記憶された記憶領域と、前記空き記憶領域として設定された記憶領域の１つとを対応付け、当該記憶領域に当該データを記憶させる処理と、
前記複数のデータ系列のうち、出力の対象となるデータ系列において前記先頭記憶領域として設定された記憶領域からデータを読み出して出力する処理と、
当該記憶領域と対応付けられた記憶領域を当該データ系列における新たな前記先頭記憶領域として設定する処理と、
前記出力されたデータを受け付けたことを示す受信確認を受け付けた場合、当該データが記憶された記憶領域を前記空き記憶領域として設定する処理と、を有する。
【００１９】
また、上記目的を達成するために本発明のプログラムは、複数の記憶領域を有し、複数のデータ系列のいずれかに属する複数のデータの入力を１つずつ受け付け、該受け付けた複数のデータを前記複数の記憶領域に１つずつ記憶させ、該記憶されたデータを前記複数のデータ系列毎に先入れ先出し方式で出力し、該出力したデータを再出力可能なコンピュータに、
前記複数の記憶領域のうち、前記データが記憶されていない記憶領域を空き記憶領域として設定する機能と、
前記受け付けたデータと同じデータ系列に属するデータが前記複数の記憶領域に記憶されていない場合、前記空き記憶領域として設定された記憶領域の１つに当該データを記憶させ、当該記憶領域を、当該データ系列において最初に受け付けたデータが記憶された先頭記憶領域として設定する機能と、
前記受け付けたデータと同じデータ系列に属するデータが前記複数の記憶領域に記憶されている場合、当該データ系列において当該データの１つ前に受け付けたデータが記憶された記憶領域と、前記空き記憶領域として設定された記憶領域の１つとを対応付け、当該記憶領域に当該データを記憶させる機能と、
前記複数のデータ系列のうち、出力の対象となるデータ系列において前記先頭記憶領域として設定された記憶領域からデータを読み出して出力する機能と、
当該記憶領域と対応付けられた記憶領域を当該データ系列における新たな前記先頭記憶領域として設定する機能と、
前記出力されたデータを受け付けたことを示す受信確認を受け付けた場合、当該データが記憶された記憶領域を前記空き記憶領域として設定する機能と、を実現させる。
【発明の効果】
【００２０】
本発明は以上説明したように構成されているので、データの先入れ先出しをデータ系列毎に実現するとともに、出力したデータの再出力を可能とするために、複数のデータ系列のそれぞれと複数のキュー及び再出力用キューのそれぞれとを固定的に対応付ける必要がない。
【００２１】
従って、データを記憶するための記憶容量の増大を抑制しつつ、データの先入れ先出しをデータ系列毎に実現するとともに、出力したデータの再出力が可能となる。
【図面の簡単な説明】
【００２２】
【図１】本発明のデータ入出力装置の実施の一形態の構成を示すブロック図である。
【図２】図１に示したポインタリストメモリとデータメモリとの間の対応関係の一例を示す図である。
【図３】図１に示したポインタリストメモリと先頭ポインタ表との間の対応関係の一例を示す図である。
【図４】図１に示したポインタリストメモリと末尾ポインタ表との間の対応関係の一例を説明するための図である。
【図５】図１に示したポインタリストメモリとデータメモリとの間の対応関係の他の例を示す図である。
【図６】図１に示したデータメモリが初期化されたときの状態の一例を示す図であり、（ａ）はポインタリストメモリを示す図、（ｂ）は再出力可能ポインタ表、再出力可能番号表及び先頭番号表を示す図、（ｃ）は先頭ポインタ表及び末尾ポインタ表を示す図である。
【図７】図１に示したデータ入出力装置においてデータを記憶する動作を説明するためのフローチャートである。
【図８】図６に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリを示す図、（ｂ）は再出力可能ポインタ表、再出力可能番号表及び先頭番号表を示す図、（ｃ）は先頭ポインタ表及び末尾ポインタ表を示す図である。
【図９】図８に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリを示す図、（ｂ）は再出力可能ポインタ表、再出力可能番号表及び先頭番号表を示す図、（ｃ）は先頭ポインタ表及び末尾ポインタ表を示す図である。
【図１０】図９に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリを示す図、（ｂ）は再出力可能ポインタ表、再出力可能番号表及び先頭番号表を示す図、（ｃ）は先頭ポインタ表及び末尾ポインタ表を示す図である。
【図１１】図１に示したデータ入出力装置において記憶されたデータを出力する動作を説明するためのフローチャートである。
【図１２】図１０に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリを示す図、（ｂ）は再出力可能ポインタ表、再出力可能番号表及び先頭番号表を示す図、（ｃ）は先頭ポインタ表及び末尾ポインタ表を示す図である。
【図１３】図１に示したデータ入出力装置の動作を説明するためのフローチャートであり、（ａ）は受信確認を受け付けた場合の動作を示すフローチャート、（ｂ）は受信確認を受け付けない場合の動作を示すフローチャートである。
【図１４】図１２に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリを示す図、（ｂ）は再出力可能ポインタ表、再出力可能番号表及び先頭番号表を示す図、（ｃ）は先頭ポインタ表及び末尾ポインタ表を示す図である。
【図１５】図１２に示した状態の後の状態の他の例を示す図であり、（ａ）はポインタリストメモリを示す図、（ｂ）は再出力可能ポインタ表、再出力可能番号表及び先頭番号表を示す図、（ｃ）は先頭ポインタ表及び末尾ポインタ表を示す図である。
【図１６】データの先入れ先出しを複数のデータ系列毎に実現するとともに、出力したデータの再出力が可能なデータ入出力装置の構成を説明するための図である。
【発明を実施するための形態】
【００２３】
以下に、本発明の実施の形態について図面を参照して説明する。
【００２４】
図１は、本発明のデータ入出力装置の実施の一形態の構成を示すブロック図である。
【００２５】
本実施形態のデータ入出力装置１０は図１に示すように、制御部１１と、データメモリ１２と、入力バッファ１３と、ポインタリストメモリ１４と、先頭ポインタ表５１と、末尾ポインタ表５２と、先頭番号表５３と、再出力可能ポインタ表５４と、再出力可能番号表５５とを備えている。
【００２６】
入力バッファ１３は、複数のデータの入力を１つずつ受け付ける。なお、入力バッファ１３にて受け付けられる複数のデータのそれぞれは、複数のデータ系列のいずれかに属している。複数のデータのそれぞれには、データ系列を識別するための系列番号が付与されている。ここでは、系列番号は１以上の整数とする。
【００２７】
データメモリ１２は、所定の長さの連続する複数の記憶領域から構成される。
【００２８】
制御部１１は、ポインタリストメモリ１４と、先頭ポインタ表５１及び末尾ポインタ表５２とを用い、データメモリ１２の複数の記憶領域のうちデータが記憶されていない記憶領域である空き記憶領域に、入力バッファ１３にて受け付けられた複数のデータのそれぞれを記憶させる（書き込む）。また、制御部１１は、ポインタリストメモリ１４と、先頭ポインタ表５１及び末尾ポインタ表５２とを用い、データメモリ１２の複数の記憶領域のそれぞれに記憶されたデータのうち、出力対象のデータ系列のデータを読み出して出力する。また、制御部１１は、出力したデータを受け付けたことを示す受信確認を、そのデータの出力先から受け付けた場合、受け付けた受信確認が示す内容に応じて再出力可能ポインタ表５４等の設定内容を更新する。一方、制御部１１は、受信確認を受け付けない場合には、そのデータを再出力するための動作を行う。制御部１１が、データメモリ１２の複数の記憶領域にデータを記憶させる動作、及び、記憶されたデータを読み出して出力する動作の詳細については、後述する動作フローにおいて説明する。また、制御部１１が、受信確認を受け付けた場合、及び、受け付けない場合の動作の詳細についても、後述する動作フローにおいて説明する。
【００２９】
ここで、図１に示したポインタリストメモリ１４とデータメモリ１２との間の対応関係について説明する。
【００３０】
図２は、図１に示したポインタリストメモリ１４とデータメモリ１２との間の対応関係の一例を示す図である。
【００３１】
データメモリ１２とポインタリストメモリ１４との間の対応関係は系列番号毎に存在する。図２は、ある１つの系列番号における対応関係を示している。また、ポインタリストメモリ１４においては、系列番号を識別するための見出し付けがされている。図２においては、図中の黒丸が系列番号を識別するための見出しを表している。
【００３２】
データメモリ１２とポインタリストメモリ１４とは、ポインタリストメモリ１４のアドレスaから、１つのｘに対して値が１つに定まる関数ｆ（ｘ）を用いることにより、データメモリ１２の複数の記憶領域のいずれかを特定するポインタｆ（ａ）を得るという対応関係にある。
【００３３】
つまり、ポインタリストメモリ１４のアドレスのそれぞれとデータメモリ１２の複数の記憶領域のそれぞれとが１対１で対応付けられていることとなる。なお、ポインタｆ（ａ）は例えば、データメモリ１２の複数の記憶領域のいずれかの先頭アドレスである。また、関数ｆ（ｘ）の一例としては、ｘを２５６倍する（８ビットシフトする）関数がある。
【００３４】
図２では例えば、ポインタリストメモリ１４のアドレス「０１００」が、データメモリ１２の複数の記憶領域のうち、先頭アドレスが「０１００００」の記憶領域と対応付けられている。
【００３５】
また、図２に示すように、ポインタリストメモリ１４のそれぞれのアドレスには値が記憶されている。ポインタリストメモリ１４のアドレスａに記憶された値をｂとした場合、ｆ（ａ）が特定する記憶領域に記憶されたデータは、ｆ（ｂ）が特定する記憶領域に記憶されたデータと同じデータ系列に属し、ｆ（ｂ）が特定する記憶領域に記憶されたデータの１つ前に受け付けられたデータである。つまり、ポインタリストメモリ１４により、受け付けられたデータと、そのデータが属するデータ系列に属し、そのデータの１つ前に受け付けられたデータとが対応付けられることとなる。
【００３６】
図２においては、ポインタリストメモリ１４のアドレス「０１００」に記憶されたデータは「０１２０」である。ここで、「０１００」及び「０１２０」から関数ｆ（ｘ）を用いて得られる値が「０１００００」及び「０１２０００」である場合、データメモリ１２の「０１００００」を先頭アドレスとする記憶領域に記憶されたデータは、データメモリ１２の「０１２０００」を先頭アドレスとする記憶領域に記憶されたデータと同じデータ系列に属し、そのデータの１つ前に受け付けられたデータである。
【００３７】
このように、ポインタリストメモリ１４では、データメモリ１２においてデータが記憶された記憶領域を特定するポインタが、複数のデータ系列毎に連鎖（片方向リスト）を構成している。
【００３８】
なお、複数のデータ系列のそれぞれにおいて最後に受け付けられたデータが記憶された記憶領域に対応するアドレスに記憶される値は、そのデータ系列におけるデータの終了を表す特殊な値であり、ここではその値を“END”とする。
【００３９】
上記の説明においては、関数ｆ（ｘ）を用いることにより、ポインタリストメモリ１４のアドレスと、データメモリ１２の複数の記憶領域のそれぞれとを１対１に対応付けた。しかし、ポインタリストメモリ１４のアドレスと、データメモリ１２の複数の記憶領域のそれぞれとを１対１に対応付けられれば、必ずしも関数ｆ（ｘ）を用いる必要はない。
【００４０】
次に、ポインタリストメモリ１４と先頭ポインタ表５１及び末尾ポインタ表５２との間の対応関係について説明する。
【００４１】
まず、ポインタリストメモリ１４と先頭ポインタ表５１との間の対応関係について説明する。
【００４２】
図３は、図１に示したポインタリストメモリ１４と先頭ポインタ表５１との間の対応関係の一例を示す図である。
【００４３】
先頭ポインタ表５１では、系列番号を識別するための見出し付けがされている。図３においては、図中の黒丸及び黒三角が見出しを表している。
【００４４】
先頭ポインタ表５１には、見出しによって識別された系列番号のデータ系列のポインタリストメモリ１４のアドレスを示す値が記憶される。図３の図中の黒丸及び黒三角の右側の値が、当該系列番号のデータ系列におけるポインタリストメモリ１４のアドレスを示している。以降、この値のことを先頭ポインタの値という。先頭ポインタの値は、当該系列番号のデータ系列において最初に受け付けられたデータが記憶されたデータメモリ１２の記憶領域である先頭記憶領域に対応するアドレスを示す。
【００４５】
なお、データメモリ１２の複数の記憶領域にデータが１つも記憶されていないデータ系列については、先頭ポインタの値は、特別な値“empty”をとるものとする。
【００４６】
次に、ポインタリストメモリ１４と末尾ポインタ表５２メモリとの間の対応関係について説明する。
【００４７】
図４は、図１に示したポインタリストメモリ１４と末尾ポインタ表５２との間の対応関係の一例を説明するための図である。
【００４８】
末尾ポインタ表５２では、先頭ポインタ表５１と同様に、系列番号を識別するための見出し付けがされている。図４においては、図中の黒丸及び黒三角が見出しを表している。
【００４９】
末尾ポインタ表５２には、先頭ポインタ表５１と同様に、見出しによって識別された系列番号のデータ系列のポインタリストメモリ１４のアドレスを示す値が記憶される。図４の図中の黒丸及び黒三角の右側の値が、当該系列番号のデータ系列におけるポインタリストメモリ１４のアドレスを示している。以降、この値のことを末尾ポインタの値という。末尾ポインタの値は、当該系列番号のデータ系列において最後に受け付けられたデータが記憶されたデータメモリ１２の記憶領域に対応するアドレスを示す。
【００５０】
なお、データメモリ１２の複数の記憶領域にデータが１つも記憶されていないデータ系列については、末尾ポインタの値は、先頭ポインタの値と同様に、特別な値“empty”をとるものとする。
【００５１】
ここで、上述したように、データメモリ１２の複数の記憶領域のうちデータが記憶された記憶領域は、ポインタリストメモリ１４のアドレスと対応付けられる。そのため、制御部１１は、データメモリに記憶されたデータをデータ系列毎に認識することができる。しかし、データメモリ１２の複数の記憶領域のうち、空き記憶領域を特定できなければ、制御部１１は、入力バッファ１３にて受け付けられたデータをデータメモリ１２のどの記憶領域に記憶させればよいかがわからない。
【００５２】
図５は、図１に示したポインタリストメモリ１４とデータメモリ１２との間の対応関係の他の例を示す図である。
【００５３】
図５に示すポインタリストメモリ１４では、図２に示したデータ系列毎のポインタリストメモリ１４と同様に、ポインタリストメモリ１４のアドレスと記憶領域とが対応付けられている。但し、図５では、ポインタメモリのアドレスと、データメモリ１２の複数の記憶領域のうちの空き記憶領域とが対応付けられている。そして、空き記憶領域を特定するポインタが連鎖（片方向リスト）を構成している。
【００５４】
以降、空き記憶領域には系列番号０のデータが記憶されているとみなし、系列番号０のデータ系列のことを空き系列という。
【００５５】
なお、ポインタリストメモリ１４のアドレスが、空き系列（系列番号０）に属するデータが記憶された記憶領域に対応付けられることと、いずれかのデータ系列（系列番号１〜）に属するデータが記憶された記憶領域に対応付けられることとは排他的事象である。従って、空き系列のためにポインタリストメモリを別途用意する必要はない。
【００５６】
また、図３及び図４に示した先頭ポインタ表５１及び末尾ポインタ表５２に空き系列の先頭ポインタ及び末尾ポインタの値を記憶させることができる。
【００５７】
次に、図１に示した再出力可能ポインタ表５４、先頭番号表５３及び再出力可能番号表５５について説明する。
【００５８】
再出力可能ポインタ表５４の構成は、図３に示した先頭ポインタ表及び図４に示した末尾ポインタ表と同様の構成である。そのため、ここでは図示を省略するが、再出力可能ポインタ表５４には、見出しによって識別された系列番号のデータ系列のポインタリストメモリ１４のアドレスを示す値が記憶される。以降、この値のことを再出力可能ポインタの値という。再出力可能ポインタの値は、当該系列番号のデータ系列に属する再出力可能なデータのうち、入力バッファ１３にて最も早く受け付けられたデータが記憶されたデータメモリ１２の記憶領域に対応するポインタリストメモリ１４のアドレスを示す。
【００５９】
先頭番号表５３には、系列番号毎に値が記憶される。この値は、当該系列番号のデータ系列において次に出力されるデータが入力バッファ１３にて受け付けられた順番を示している。従って、先頭番号は１以上の整数となる。
【００６０】
再出力可能番号表５５には、系列番号毎に値が記憶される。この値は、当該系列番号のデータ系列に属する再出力可能なデータのうち、入力バッファ１３にて最も早く受け付けられたデータが受け付けられた順番を示している。従って、再出力可能番号は１以上の整数となる。
【００６１】
以下に、上記のように構成されたデータ入出力装置１０の動作について説明する。
【００６２】
まず、データ入出力装置１０においてデータを記憶する動作について説明するが、その前にデータメモリ１２が初期化されたときの状態について説明する。
【００６３】
図６は、図１に示したデータメモリ１２が初期化されたときの状態の一例を示す図であり、（ａ）はポインタリストメモリ１４を示す図、（ｂ）は再出力可能ポインタ表５４、再出力可能番号表５５及び先頭番号表５３を示す図、（ｃ）は先頭ポインタ表５１及び末尾ポインタ表５２を示す図である。なお、ここでは、データ系列の数が８つあり、それぞれのデータ系列の系列番号を０〜７とする。系列番号０のデータ系列は、上述したように空き系列である。
【００６４】
データメモリ１２が初期化された直後には、データメモリ１２の複数の記憶領域には１つもデータが記憶されていない。つまり、複数の記憶領域の全てに、系列番号０のデータが記憶されているとみなされる。
【００６５】
従って、制御部１１は、ポインタリストメモリ１４の全てのアドレスを単一のリストとなるように連鎖させる。これは、例えば図６（ａ）に示すように、ポインタリストメモリ１４の全てのアドレスに記憶される値を、次のアドレスを示す値とすることによって実現できる。これを、擬似コードで表すと以下のようになる。
# for(i=0; i++; i<(n-1)) L(i)=i+1;
# L(n-1)=END
上記の擬似コードにおいて、ｉはポインタリストメモリ１４のアドレスを示し、L(i)はポインタリストメモリ１４のアドレスｉに記憶された値を示す。これらは、以降の説明においても同様である。
【００６６】
また、制御部１１は、空き系列（系列番号０）の先頭ポインタの値としてポインタリストメモリ１４の最初のアドレスを先頭ポインタ表５１に設定する。ここでは、図６（ｃ）に示すように、空き系列の先頭ポインタの値として“０”が先頭ポインタ表５１に設定される。さらに、制御部１１は、空き系列の末尾ポインタの値としてポインタリストメモリ１４の最後のアドレスを末尾ポインタ表５２に設定する。ここでは、図６（ｃ）に示すように、空き系列の末尾ポインタの値として“７”が末尾ポインタ表５２に設定される。これらを擬似コードで示すと以下のようになる。なお、以下に示す擬似コードにおいて、P_head(j)は系列番号jの先頭ポインタの値であり、P_tail(j)は系列番号jの末尾ポインタの値である。これらは、以降の説明においても同様である。
# P_head(0)=0;
# P_tail(0)=n-1;
また、制御部１１は、空き系列以外のデータ系列（系列番号１〜７）の先頭ポインタ及び末尾ポインタの値として“empty”を先頭ポインタ表５１及び末尾ポインタ表５２に設定する。これを擬似コードで示すと以下のようになる。
# for(j=1; j++; j<n) P_head(j)=empty;
# for(j=1; j++; i<n) P_tail(j)=empty;
さらに、制御部１１は、再出力可能ポインタ表５４、再出力可能番号表５５及び先頭番号表５３において、全てのデータ系列（系列番号０〜７）の値を“null”という特殊な値に設定する。
【００６７】
次に、データ入出力装置１０においてデータを記憶する動作について説明する。ここでは、複数のデータが同時に入力されることはないものとする。また、データの長さは一定である必要はないが、ここでは、説明を簡単にするため、データの長さを一定とし、データメモリの複数の記憶領域のそれぞれは、データの長さと同じ長さであるものとする。
【００６８】
図７は、図１に示したデータ入出力装置１０においてデータを記憶する動作を説明するためのフローチャートである。ここでは、図６に示した状態の後、系列番号１のデータ系列に属する最初のデータを受け付けた場合について説明する。
【００６９】
まず、入力バッファ１３がデータの入力を受け付ける（ステップＳ１）。
【００７０】
制御部１１は、ステップＳ１にて受け付けたデータに付与された系列番号jを抽出する（ステップＳ２）。ここでは、“１”が抽出される。
【００７１】
次に、制御部１１は、抽出した系列番号jの末尾ポインタの値（P_tail(j)）を末尾ポインタ表５２から取得する（ステップＳ３）。ここでは、“empty”が抽出されるため、系列番号１のデータがデータメモリ１２に記憶されていないことがわかる。
【００７２】
次に、制御部１１は、抽出した系列番号jの先頭ポインタの値を、空き系列の先頭ポインタの値に更新する（ステップＳ４）。ここでは、系列番号１の先頭ポインタの値が、“empty”から“０”に更新される。つまり、空き系列の先頭ポインタが示すポインタリストメモリ１４のアドレスに対応する記憶領域が、系列番号１のデータ系列における先頭記憶領域として設定されたこととなる。
【００７３】
次に、制御部１１は、抽出した系列番号jの末尾ポインタの値を、空き系列の先頭ポインタの値に更新する（ステップＳ５）。ここでは、系列番号１の末尾ポインタの値が、“empty”から“０”に更新される。
【００７４】
次に、制御部１１は、空き系列の先頭ポインタの値が示すポインタリストメモリ１４のアドレスに記憶された値を抽出する（ステップＳ６）。ここでは、“１”が抽出される。
【００７５】
次に、制御部１１は、空き系列の先頭ポインタの値が示すポインタリストメモリ１４のアドレスに記憶された値を“END”に更新する（ステップＳ７）。
【００７６】
次に、制御部１１は、空き系列の先頭ポインタの値をステップＳ６にて抽出した値に更新する（ステップＳ８）。ここでは、空き系列の先頭ポインタの値が、“０”から“１”に変更される。
【００７７】
次に、制御部１１は、抽出した系列番号jの再出力可能ポインタの値を、当該系列番号jの先頭ポインタの値で更新する（ステップＳ９）。ここでは、系列番号１の再出力可能ポインタの値が、“null”から“０”に更新される。
【００７８】
そして、制御部１１は、抽出した系列番号jの再出力可能番号及び先頭番号を更新する（ステップＳ１０）。ここでは、系列番号１の再出力可能番号及び先頭番号が“null”から“１”に更新される。これは、ステップＳ１にて受け付けたデータが、系列番号１のデータ系列において最初に受け付けられたデータであるからである。
【００７９】
なお、上述したステップＳ４、ステップＳ９及びステップＳ１０の動作を擬似コードで表すと以下のようになる。なお、以下に示す擬似コードにおいて、P_ret(j)は系列番号jの再出力可能ポインタの値である。また、S_head(j)は系列番号jの先頭番号であり、S_ret(j)は系列番号jの再出力可能番号である。これらは、以降の説明においても同様である。
j=1
P_head(j)=0           /* P_head(0) */
P_ret(j)=0            /* P_head(0) */
S_head(j)=1
S_ret(j)=1
そして、制御部１１は、データメモリ１２の複数の記憶領域のうち、抽出した系列番号jの末尾ポインタの値が示すアドレスに対応するデータメモリ１２の記憶領域に、ステップＳ１にて受け付けたデータを記憶させる（ステップＳ１１）。ここでは、ポインタリストメモリ１４のアドレス０に対応するデータメモリ１２の記憶領域に、系列番号１のデータが記憶される。
【００８０】
図８は、図６に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリ１４を示す図、（ｂ）は再出力可能ポインタ表５４、再出力可能番号表５５及び先頭番号表５３を示す図、（ｃ）は先頭ポインタ表５１及び末尾ポインタ表５２を示す図である。なお、図８は、図６に示した状態の後、図７を参照しながら説明した動作が行われた後の状態を示している。
【００８１】
図８（ｃ）に示すように、系列番号１の先頭ポインタ及び末尾ポインタの値は共に“０”となっている。さらに、先頭ポインタ表５１においては、空き系列の先頭ポインタの値が“１”となっており、ポインタリストメモリ１４のアドレス１を示している。また、ポインタリストメモリ１４では図８（ａ）に示すように、アドレス０に記憶されている値が“END”となっている。また、図８（ｂ）に示すように、系列番号１の再出力可能ポインタの値は、系列番号１の先頭ポインタの値と同じ“０”であり、系列番号１の再出力可能番号及び先頭番号はともに“１”となっている。
【００８２】
図９は、図８に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリ１４を示す図、（ｂ）は再出力可能ポインタ表５４、再出力可能番号表５５及び先頭番号表５３を示す図、（ｃ）は先頭ポインタ表５１及び末尾ポインタ表５２を示す図である。なお、図９は、図８に示した状態の後、系列番号２の最初のデータが記憶され、その後、系列番号１の２番目のデータの記憶が記憶されたときの状態を示している。
【００８３】
図８と図９とを比較すると、系列番号１の先頭ポインタの値は、“０”のまま変化していない。また、図９（ｂ）に示すように、系列番号１の先頭番号は、“１”のまま変化していない。これらは、系列番号１のデータは未だ１つも出力されていないためである。
【００８４】
また、図９に示す状態では系列番号２の最初のデータが記憶されているため、系列番号２の先頭ポインタの値が“empty”から“１”に更新されている。そのため、系列番号２の再出力可能ポインタの値も“null”から“１”に更新されている。また、系列番号２の再出力可能番号及び先頭番号も“nullから“１”に更新されている。これらの更新は、制御部１１にて実行されるが、擬似コードで表すと以下のようになる。
j=2
P_head(j)=1           /* P_head(0) */
P_ret(j)=1            /* P_head(0) */
S_head(j)=1
S_ret(j)=1
図１０は、図９に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリ１４を示す図、（ｂ）は再出力可能ポインタ表５４、再出力可能番号表５５及び先頭番号表５３を示す図、（ｃ）は先頭ポインタ表５１及び末尾ポインタ表５２を示す図である。なお、図１０は、図９に示した状態の後、系列番号５の最初のデータが記憶されたときの状態を示している。
【００８５】
図９と図１０とを比較すると、図１０に示す状態では系列番号５の最初のデータが記憶されているため、系列番号５の先頭ポインタの値に値が“empty”から“３”に更新されている。そのため、系列番号５の再出力可能ポインタの値も“null”から“３”に更新されている。また、系列番号５の再出力可能番号及び先頭番号は“nullから“１”に更新されている。これらの更新は、制御部１１にて実行されるが、擬似コードで表すと以下のようになる。
j=5
P_head(j)=3           /* P_head(0) */
P_ret(j)=3            /* P_head(0) */
S_head(j)=1
S_ret(j)=1
次に、データ入出力装置１０において記憶されたデータを出力する動作について説明する。なお、出力対象のデータ系列は別途決定されるものとして、ここでは、図１０に示す状態から系列番号１のデータが出力される場合の動作について説明する。
【００８６】
図１１は、図１に示したデータ入出力装置１０において記憶されたデータを出力する動作を説明するためのフローチャートである。
【００８７】
制御部１１は、出力対象のデータ系列の系列番号jの先頭ポインタの値を抽出する(ステップＳ２１)。ここでは、系列番号１の先頭ポインタの値が抽出される。図１０（ｃ）に示すように系列番号１の先頭ポインタの値は“０”である。従って、ここでは、“０”が抽出される。
【００８８】
次に、制御部１１は、当該系列番号jの先頭番号を抽出する（ステップＳ２２）。ここでは、“１”が抽出される。
【００８９】
次に、制御部１１は、ステップＳ２１にて抽出した値が示すポインタリストメモリ１４のアドレスに対応する記憶領域に記憶されたデータを読み出す（ステップＳ２３）。ここでは、データメモリ１２の複数の記憶領域のうち、ポインタリストメモリ１４のアドレス０に対応する記憶領域からデータが読み出される。
【００９０】
次に、制御部１１は、ステップＳ２３にて読み出したデータに、ステップＳ２２にて抽出した先頭番号をシーケンス番号として付与するとともに当該系列番号jを付与する。なお、シーケンス番号は、データの出力先がデータの順序を認識するための番号である。ここでは、シーケンス番号として“１”が付与され、系列番号として“１”が付与される。
【００９１】
そして、制御部１１は、シーケンス番号及び系列番号jが付与されたデータを出力する（ステップＳ２４）。
【００９２】
次に、制御部１１は、当該系列番号jの先頭ポインタの値を、ステップＳ２１にて抽出した値が示すアドレスに記憶された値に更新する（ステップＳ２５）。ここでは、系列番号１の先頭ポインタの値が“０”から“２”に更新される。つまり、ポインタリストメモリ１４のアドレス２に対応する記憶領域が、系列番号１のデータ系列における新たな先頭記憶領域として設定されたこととなる。
【００９３】
そして、制御部１１は、当該系列番号jの先頭番号を更新する（ステップＳ２６）。ここでは、系列番号１の先頭番号が“１”から“２”に更新される。
【００９４】
このように、データを出力した場合には、先頭ポインタの値及び先頭番号は更新されるが、再出力可能ポインタの値及び再出力可能番号は更新されない。
【００９５】
なお、上述したデータを出力する動作のうち、先頭ポインタの値、再出力可能ポインタの値、先頭番号及び再出力可能番号の更新を擬似コードで表すと以下のようになる。
j=1 
P_head(j)=2           /* L(P_head(j)) */
S_head(j)=2           /* 1++ */
/* P_ret(j)更新しない */
/* S_ret(j)更新しない */
図１２は、図１０に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリ１４を示す図、（ｂ）は再出力可能ポインタ表５４、再出力可能番号表５５及び先頭番号表５３を示す図、（ｃ）は先頭ポインタ表５１及び末尾ポインタ表５２を示す図である。なお、図１２は、図１０に示した状態の後、図１１を参照しながら説明した動作が行われた後の状態を示している。
【００９６】
図１０と図１２とを比較すると、系列番号１の先頭ポインタの値及び先頭番号が更新されていることがわかる。
【００９７】
次に、データ入出力装置１０が、出力したデータの受信確認を受け付けた場合の動作と、受け付けない場合の動作とについて説明する。
【００９８】
図１３は、図１に示したデータ入出力装置１０の動作を説明するためのフローチャートであり、（ａ）は受信確認を受け付けた場合の動作を示すフローチャート、（ｂ）は受信確認を受け付けない場合の動作を示すフローチャートである。
【００９９】
まず、図１３（ａ）を参照しながら、図１２に示した状態の後、出力したデータに対する受信確認を受け付けた場合について説明する。なお、受信確認には、系列番号が付与されている。
【０１００】
制御部１１は、受け付けた受信確認に付与された系列番号jを抽出する（ステップＳ４１）。図１２の状態において出力されたデータは、系列番号１のデータなので、ここでは、“１”が抽出される。
【０１０１】
次に、制御部１１は、抽出した系列番号jのデータ系列の再出力可能ポインタの値を抽出する（ステップＳ４２）。ここでは、“０”が抽出される。
【０１０２】
次に、制御部１１は、ステップＳ４２にて抽出した値が示すアドレスに記憶された値を“END”に更新する（ステップＳ４３）。ここでは、ポインタリストメモリ１４のアドレス０に記憶された値が“２”から“END”に更新される。
【０１０３】
次に、制御部１１は、空き系列の末尾ポインタの値が示すアドレスに記憶された値を“END”から、ステップＳ４２にて抽出した値に更新する（ステップＳ４４）。ここでは、ポインタリストメモリのアドレス７に記憶された値が“END”から“０”に更新される。
【０１０４】
次に、制御部１１は、空き系列の末尾ポインタの値を、ステップＳ４２にて抽出した値に更新する（ステップＳ４５）。ここでは、空き系列の末尾ポインタの値が“７”から“０”に更新される。
【０１０５】
次に、制御部１１は、抽出した系列番号jの先頭ポインタの値で、当該系列番号jの再出力可能ポインタの値を更新する（ステップＳ４６）。ここでは、系列番号１の再出力可能ポインタの値が“０”から“２”に更新される。
【０１０６】
そして、制御部１１は、抽出した系列番号jの先頭番号で、当該系列番号jの再出力可能番号を更新する（ステップＳ４７）。ここでは、系列番号１の再出力可能番号が“１”から“２”に更新される。
【０１０７】
上述した動作により、ポインタリストメモリ１４のアドレス０に対応する記憶領域が空き記憶領域として設定されたこととなる。
【０１０８】
なお、上述した動作のうちステップＳ４６及びステップＳ４７の動作を擬似コードで表すと以下のようになる。
j=1 
P_ret(j)=P_head(j)
S_ret(j)=S_head(j)
図１４は、図１２に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリ１４を示す図、（ｂ）は再出力可能ポインタ表５４、再出力可能番号表５５及び先頭番号表５３を示す図、（ｃ）は先頭ポインタ表５１及び末尾ポインタ表５２を示す図である。図１４は、図１２に示した状態の後、図１３（ａ）を参照しながら説明した動作が行われた後の状態を示している。
【０１０９】
図１２と図１４とを比較すると、系列番号１の再出力可能ポインタの値及び再出力可能番号が更新されていることがわかる。また、空き系列の末尾ポインタの値が更新されていることもわかる。
【０１１０】
次に、図１３（ｂ）を参照しながら、図１２に示した状態の後、出力したデータの受信確認を受け付けない場合について説明する。なお、出力したデータの受信確認を受け付けない場合とは例えば、データの出力後、所定の時間が経過しても受信確認を受け付けない場合である。この場合、制御部１１は、タイマーを備え、データを出力すると、そのタイマーを起動させる。そして、制御部１１は、タイマーの経過時間が所定の時間となった場合に、「受信確認を受け付けない」と判断することとなる。
【０１１１】
制御部１１は、出力したデータが属するデータ系列の系列番号jの再出力可能ポインタの値で、当該系列番号jの先頭ポインタの値を更新する（ステップＳ６１）。図１２の状態において出力されたデータは、系列番号１のデータなので、ここでは、系列番号１の先頭ポインタの値が“２”から“０”に更新される。これにより、ポインタリストメモリ１４のアドレス０に対応する記憶領域が、系列番号１のデータ系列における新たな先頭記憶領域として設定されたこととなる。
【０１１２】
そして、制御部１１は、当該系列番号の再出力可能番号で、当該系列番号の先頭番号を更新する（ステップＳ６２）。ここでは、系列番号１の先頭番号が“２”から“１”に変更される。
【０１１３】
上述したステップＳ６２及びステップＳ６３の動作を擬似コードで表すと以下のようになる。
j=1 
P_head(j)=P_ret(j)
S_head(j)=S_ret(j)
図１５は、図１２に示した状態の後の状態の他の例を示す図であり、（ａ）はポインタリストメモリ１４を示す図、（ｂ）は再出力可能ポインタ表５４、再出力可能番号表５５及び先頭番号表５３を示す図、（ｃ）は先頭ポインタ表５１及び末尾ポインタ表５２を示す図である。図１５は、図１２に示した状態の後、図１３（ｂ）を参照しながら説明した動作が行われた後の状態を示している。
【０１１４】
図１２と図１５とを比較すると、系列番号１の先頭ポインタの値及び先頭番号が更新されていることがわかる。また、系列番号１の先頭ポインタの値が更新されていることもわかる。
【０１１５】
なお、系列番号jのデータ系列において入力バッファ１３にてk番目に受け付けられたデータを再出力する場合に、そのデータがデータメモリ１２に記憶されているかどうかは、系列番号jの再出力可能番号と先頭番号との間にkが含まれているかどうかを確認すればよい。
【０１１６】
また、図１３（ｂ）を参照しながら説明した動作フローにおいては、再出力可能ポインタの値で先頭ポインタの値を更新した。つまり、系列番号jのデータ系列に属するデータを再出力する際、系列番号jのデータ系列において再出力可能なデータの全てを再出力する場合を想定していた。
【０１１７】
ここで、系列番号jのデータ系列において入力バッファ１３にてk番目以降に受け付けられたデータだけを再出力する場合を考えてみる。これは、制御部１１が、系列番号jとともに、（k-1）を示す受信済番号が付与された受信確認を受け付けた場合を想定している。受信済番号とは、制御部１１がデータを出力する際に付与したシーケンス番号に対応する番号である。例えば、データ入出力装置１０が複数のデータを出力した場合、それらのデータの出力先が、その複数のデータのうち、シーケンス番号として（k-1）が付与されたデータまでを受け付けると、データの出力先は、受信済番号として（k-1）が付与された受信確認を出力する。
【０１１８】
制御部１１は、受信済番号として（k-1）が付与された受信確認を受け付けると、以下の擬似コードで表される動作を行う。なお、以下の擬似コードは、系列番号１のデータ系列の場合を表している。
j=1;
S_head(j)=k;
P=P_ret(j);
for(t ; t<(k-S_ret(j)) ; t++)P=L(P);
P_head(j)=P;
P_ret(j)=P;
S_ret(j)=k;
制御部１１が系列番号１においてシーケンス番号として１〜５を付与した５つのデータを出力し、その後、制御部１１が受信済番号として１〜３が付与された受信確認を受け付けた場合（k＝４の場合）を一例として、上記の擬似コードを説明する。なお、この場合、制御部１１が受信確認を受け付ける直前において、系列番号１の再出力可能番号(S_ret(j))は“１”である。
【０１１９】
まず、制御部１１は、系列番号１の先頭番号を“４”に設定する。
【０１２０】
次に、制御部１１は、系列番号１の再出力可能ポインタの値を“Ｐ”とし、“Ｐ”が示すポインタリストメモリ１４のアドレスに記憶された値を新たな“Ｐ”とする。これを２回繰り返す。２回繰り返すのは、kとS_ret(j)との差が３であるためである。
【０１２１】
そして、制御部１１は、系列番号１の先頭ポインタの値及び再出力可能ポインタの値を上記の繰り返し後のＰとする。また、制御部１１は、系列番号１の再出力可能番号を４に設定する。
【０１２２】
これにより、系列番号１のデータ系列において入力バッファ１３にて４番目に受け付けられたデータが記憶された記憶領域が、系列番号１のデータ系列における新たな先頭記憶領域として設定されたこととなる。
【０１２３】
このように本実施形態においては、受け付けられたデータが属するデータ系列のデータがデータメモリ１２に記憶されていない場合、空き記憶領域の１つに当該データが記憶されるとともに、当該記憶領域が、当該データ系列において最初に受け付けられたデータが記憶された先頭記憶領域として設定される。一方、受け付けられたデータが属するデータ系列のデータがデータメモリ１２に記憶されている場合、当該データ系列において当該データの１つ前に受け付けられたデータが記憶された記憶領域と、空き記憶領域の１つとが対応付けられ、当該空き記憶領域に当該データが記憶される。
【０１２４】
そして、複数のデータ系列のうち、出力の対象となるデータ系列において先頭記憶領域として設定された記憶領域からデータが読み出されて出力され、当該記憶領域と対応付けられた記憶領域が当該データ系列における新たな先頭記憶領域として設定される。その後、出力されたデータを受け付けたことを示す受信確認を受け付けた場合、当該データが記憶された記憶領域が空き記憶領域として設定される。
【０１２５】
これにより、データの先入れ先出しをデータ系列毎に実現するとともに、出力したデータの再出力を可能とするために、複数のデータ系列のそれぞれと複数のキュー及び再出力用キューのそれぞれとを固定的に対応付ける必要がない。
【０１２６】
また、任意のデータ系列において大量のデータの再出力が必要となった場合であっても、先頭ポインタ表等の少数の変数を書き換えるだけで対応できるため、再出力の対象となるデータを速やかに準備することが可能となる。
【０１２７】
なお、本実施形態においては、ポインタリストメモリ１４とデータメモリ１２とが別々のメモリとして実装されている場合について説明したが、これらは、１つのメモリに組み合わせて実装されていてもよい。
【０１２８】
また、本発明においては、データ入出力装置内の処理は上述の専用のハードウェアにより実現されるもの以外に、その機能を実現するためのプログラムをデータ入出力装置にて読取可能な記録媒体に記録し、この記録媒体に記録されたプログラムをデータ入出力装置に読み込ませ、実行するものであっても良い。データ入出力装置にて読取可能な記録媒体とは、フレキシブルディスク、光磁気ディスク、ＤＶＤ、ＣＤなどの移設可能な記録媒体の他、データ入出力装置に内蔵されたＨＤＤなどを指す。また、この記録媒体に記録されたプログラムをネットワークを介して提供することも可能である。
【符号の説明】
【０１２９】
１０    データ入出力装置
１１    制御部
１２    データメモリ
１３    入力バッファ
１４    ポインタリストメモリ
５１    先頭ポインタ表
５２    末尾ポインタ表
５３    先頭番号表
５４    再出力可能ポインタ表
５５    再出力可能番号表
【図１】
2011248585.tif 000003
【図２】
2011248585.tif 000004
【図３】
2011248585.tif 000005
【図４】
2011248585.tif 000006
【図５】
2011248585.tif 000007
【図６】
2011248585.tif 000008
【図７】
2011248585.tif 000009
【図８】
2011248585.tif 000010
【図９】
2011248585.tif 000011
【図１０】
2011248585.tif 000012
【図１１】
2011248585.tif 000013
【図１２】
2011248585.tif 000014
【図１３】
2011248585.tif 000015
【図１４】
2011248585.tif 000016
【図１５】
2011248585.tif 000017
【図１６】
2011248585.tif 000018