(57)【特許請求の範囲】
【請求項１】
複数のデータ系列のいずれかに属する複数のデータの入力を１つずつ受け付け、該受け付けたデータを前記複数のデータ系列毎に先入れ先出し方式で出力するデータ入出力装置であって、
前記受け付けた複数のデータを１つずつ記憶する複数の記憶領域からなるデータメモリと、
前記記憶領域を特定するアドレス毎に、当該記憶領域に記憶されたデータと同じデータ系列に属する１つ後に受け付けたデータがある場合は、当該１つ後に受け付けたデータが記憶された記憶領域を特定するアドレスを表す値を対応付けて記憶し、当該１つ後に受け付けたデータがない場合は、当該データ系列におけるデータの終了を表す終了値を対応付けて記憶するポインタリストメモリと、
前記データ系列毎に、当該データ系列に属するデータが前記データメモリに記憶されている場合は、当該データ系列に属する最初に受け付けたデータが記憶された前記記憶領域を特定するアドレスを表す値を対応付けて記憶する先頭ポインタ表と、
前記データ系列毎に、当該データ系列に属するデータが前記データメモリに記憶されている場合は、当該データ系列に属する最後に受け付けたデータが記憶された前記記憶領域を特定するアドレスを表す値を対応付けて記憶する末尾ポインタ表と、
前記データメモリにデータを記憶させる動作、または前記データメモリに記憶されたデータを読み出して出力する動作を制御する制御部と、を有し、
前記制御部は、
前記複数の記憶領域のうち、前記データが記憶されていない記憶領域を空き記憶領域として設定し、
前記データを受け付けた場合に、
前記末尾ポインタ表に基づいて、当該データと同じデータ系列に属するデータが前記データメモリに記憶されているか否かを判断し、
当該データと同じデータ系列に属するデータが前記データメモリに記憶されていなければ、
前記データメモリにおいて、前記空き記憶領域の１つに当該データを記憶させ、
前記ポインタリストメモリにおいて、当該データを記憶させた記憶領域を特定するアドレスに対応付けて、前記終了値を記憶させ、
前記先頭ポインタ表および前記末尾ポインタ表において、当該データ系列に対応付けて、当該データを記憶させた記憶領域を特定するアドレスを表す値を記憶させ、
当該データと同じデータ系列に属するデータが前記データメモリに記憶されていれば、
前記ポインタリストメモリにおいて、当該データ系列に属する当該データの１つ前に受け付けたデータが記憶された記憶領域を特定するアドレスに対応付けて、前記空き記憶領域の１つを特定するアドレスの値を記憶させ、当該空き記憶領域を特定するアドレスに対応付けて、前記終了値を記憶させ、
前記末尾ポインタ表において、当該データ系列に対応付けて、当該空き記憶領域を特定するアドレスを表す値を記憶させ、
前記データメモリにおいて、当該空き記憶領域に当該データを記憶させる、データ入出力装置。
【請求項２】
請求項１に記載のデータ入出力装置において、
前記制御部は、
前記データを出力する場合に、
前記先頭ポインタ表において、当該データが属するデータ系列に対応付けられた値を抽出し、
前記データメモリにおいて、前記先頭ポインタ表で抽出された値が表すアドレスが特定する前記記憶領域から当該データを読み出して出力するとともに、当該記憶領域を前記空き記憶領域として設定し、
前記ポインタリストメモリにおいて、前記先頭ポインタ表で抽出された値が表すアドレスに対応付けられた値を抽出するとともに、当該アドレスに対応付けられた値を前記終了値に更新し、
前記先頭ポインタ表において、当該データ系列に対応付けられた値を前記ポインタリストメモリで抽出された値に更新する、データ入出力装置。
【請求項３】
複数の記憶領域からなるデータメモリと、ポインタリストメモリと、先頭ポインタ表と、末尾ポインタ表と、制御部とを有し、複数のデータ系列のいずれかに属する複数のデータの入力を１つずつ受け付け、前記制御部の制御に従って、該受け付けた複数のデータを前記複数の記憶領域に１つずつ記憶させ、該記憶されたデータを前記複数のデータ系列毎に先入れ先出し方式で出力するデータ入出力装置におけるデータ記憶方法であって、
前記ポインタリストメモリが、前記記憶領域を特定するアドレス毎に、当該記憶領域に記憶されたデータと同じデータ系列に属する１つ後に受け付けたデータがある場合は、当該１つ後に受け付けたデータが記憶された記憶領域を特定するアドレスを表す値を対応付けて記憶し、当該１つ後に受け付けたデータがない場合は、当該データ系列におけるデータの終了を表す終了値を対応付けて記憶し、
前記先頭ポインタ表が、前記データ系列毎に、当該データ系列に属するデータが前記データメモリに記憶されている場合は、当該データ系列に属する最初に受け付けたデータが記憶された前記記憶領域を特定するアドレスを表す値を対応付けて記憶し、
前記末尾ポインタ表が、前記データ系列毎に、当該データ系列に属するデータが前記データメモリに記憶されている場合は、当該データ系列に属する最後に受け付けたデータが記憶された前記記憶領域を特定するアドレスを表す値を対応付けて記憶し、
前記制御部が、
前記複数の記憶領域のうち、前記データが記憶されていない記憶領域を空き記憶領域として設定する処理と、
前記データを受け付けた場合に、
前記末尾ポインタ表に基づいて、当該データと同じデータ系列に属するデータが前記データメモリに記憶されているか否かを判断する処理と、
当該データと同じデータ系列に属するデータが前記データメモリに記憶されていなければ、
前記データメモリにおいて、前記空き記憶領域の１つに当該データを記憶させる処理と、
前記ポインタリストメモリにおいて、当該データを記憶させた記憶領域を特定するアドレスに対応付けて、前記終了値を記憶させる処理と、
前記先頭ポインタ表および前記末尾ポインタ表において、当該データ系列に対応付けて、当該データを記憶させた記憶領域を特定するアドレスを表す値を記憶させる処理と、
当該データと同じデータ系列に属するデータが前記データメモリに記憶されていれば、
前記ポインタリストメモリにおいて、当該データ系列に属する当該データの１つ前に受け付けたデータが記憶された記憶領域を特定するアドレスに対応付けて、前記空き記憶領域の１つを特定するアドレスの値を記憶させ、当該空き記憶領域を特定するアドレスに対応付けて、前記終了値を記憶させる処理と、
前記末尾ポインタ表において、当該データ系列に対応付けて、当該空き記憶領域を特定するアドレスを表す値を記憶させる処理と、
前記データメモリにおいて、当該空き記憶領域に当該データを記憶させる処理と、を実行するデータ記憶方法。
【請求項４】
請求項３に記載のデータ記憶方法において、
前記制御部が、
前記データを出力する場合に、
前記先頭ポインタ表において、当該データが属するデータ系列に対応付けられた値を抽出する処理と、
前記データメモリにおいて、前記先頭ポインタ表で抽出された値が表すアドレスが特定する前記記憶領域から当該データを読み出して出力するとともに、当該記憶領域を前記空き記憶領域として設定する処理と、
前記ポインタリストメモリにおいて、前記先頭ポインタ表で抽出された値が表すアドレスに対応付けられた値を抽出するとともに、当該アドレスに対応付けられた値を前記終了値に更新する処理と、
前記先頭ポインタ表において、当該データ系列に対応付けられた値を前記ポインタリストメモリで抽出された値に更新する処理と、を実行するデータ記憶方法。
【請求項５】
複数の記憶領域からなるデータメモリと、ポインタリストメモリと、先頭ポインタ表と、末尾ポインタ表と、制御部とを有するコンピュータを、複数のデータ系列のいずれかに属する複数のデータの入力を１つずつ受け付け、前記制御部の制御に従って、該受け付けた複数のデータを前記複数の記憶領域に１つずつ記憶させ、該記憶されたデータを前記複数のデータ系列毎に先入れ先出し方式で出力するデータ入出力装置として機能させるためのプログラムであって、
前記ポインタリストメモリに、前記記憶領域を特定するアドレス毎に、当該記憶領域に記憶されたデータと同じデータ系列に属する１つ後に受け付けたデータがある場合は、当該１つ後に受け付けたデータが記憶された記憶領域を特定するアドレスを表す値を対応付けて記憶させ、当該１つ後に受け付けたデータがない場合は、当該データ系列におけるデータの終了を表す終了値を対応付けて記憶させ、
前記先頭ポインタ表に、前記データ系列毎に、当該データ系列に属するデータが前記データメモリに記憶されている場合は、当該データ系列に属する最初に受け付けたデータが記憶された前記記憶領域を特定するアドレスを表す値を対応付けて記憶させ、
前記末尾ポインタ表に、前記データ系列毎に、当該データ系列に属するデータが前記データメモリに記憶されている場合は、当該データ系列に属する最後に受け付けたデータが記憶された前記記憶領域を特定するアドレスを表す値を対応付けて記憶させ、
前記制御部に、請求項３または請求項４に記載の各処理を実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、先入れ先出し（ＦＩＦＯ：Ｆｉｒｓｔ  Ｉｎ  Ｆｉｒｓｔ  Ｏｕｔ）方式のデータ入出力装置、データ記憶方法及びプログラムに関する。
【背景技術】
【０００２】
低速かつ等時性のない複数のデータ系列のいずれかに属する複数のデータのそれぞれを、データ系列毎に所定のデータ量になるまで記憶し、記憶されたデータに対して一度に高速な処理を施すためには、データの先入れ先出しを複数のデータ系列毎に実現する必要がある。
【０００３】
図１５は、データの先入れ先出しを複数のデータ系列毎に実現するデータ入出力装置の構成を説明するための図である。
【０００４】
入力バッファ１１３は、複数のデータの入力を１つずつ受け付ける。なお、入力バッファ１１３にて受け付けられる複数のデータのそれぞれは、複数のデータ系列のいずれかに属している。複数のデータのそれぞれには、データ系列を識別するための系列番号が付与されている。
【０００５】
キュー１１２−１〜１１２−ｎのそれぞれは、複数のデータ系列のそれぞれと固定的に対応付けられ、入力バッファ１１３にて受け付けられた複数のデータをデータ系列毎に記憶する。例えば、データ系列の数がＮ個であれば、キューの数もＮ個必要となる。
【０００６】
制御部１１１は、入力バッファ１１３にて受け付けられた複数のデータのそれぞれに付与された系列番号を抽出し、キュー１１２−１〜１１２−ｎのうち、抽出した系列番号のデータ系列に対応するキューに、そのデータを記憶させる。記憶されたデータは、例えば記憶されたデータのデータ量が所定の量になるというような条件を満足するまで読み出されず、キューに記憶されていく。そして、上述したような条件が満足されると、キューに記憶されたデータのうちの所定の一部分が出力される。
【０００７】
なお、先入れ先だしの仕様に関する技術が例えば、非特許文献１に開示されている。
【先行技術文献】
【非特許文献】
【０００８】
【非特許文献１】http://www.okisemi.com/jp/semicon/videomemory/ms81v32322.htm
【発明の概要】
【発明が解決しようとする課題】
【０００９】
上述したように、図１５に示したようなデータ入出力装置においては、データの先入れ先出しを複数のデータ系列毎に実現するために、複数のキューのそれぞれが複数のデータ系列のそれぞれと固定的に対応付けられている。
【００１０】
このとき、例えば所定の条件において、ある１つのデータ系列に属するデータが、受け付けられるデータの大部分を占める場合であったとしても、そのデータ系列に属するデータを他のデータ系列に対応付けられたキューに記憶させることはできない。
【００１１】
また、ある１つのデータ系列に対応付けられたキューに記憶されたデータの出力が完了した後でも、そのキューに他のデータ系列に属するデータを記憶させることはできない。
【００１２】
従って、データ系列の数をＮ個とし、それぞれのキューに記憶される可能性のあるデータ量の最大値をＭとすると、キュー全体として、(Ｍ×Ｎ)程度の記憶容量を確保しておく必要がある。
【００１３】
この場合、データ系列の数が多くなればなるほど、データを記憶するために必要な記憶容量が増大してしまうという問題点がある。
【００１４】
本発明は、データを記憶するための記憶容量の増大を抑制しつつ、データの先入れ先出しをデータ系列毎に実現することができるデータ入出力装置、データ記憶方法及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１５】
上記目的を達成するために本発明のデータ入出力装置は、複数のデータ系列のいずれかに属する複数のデータの入力を１つずつ受け付け、該受け付けたデータを前記複数のデータ系列毎に先入れ先出し方式で出力するデータ入出力装置であって、
前記受け付けた複数のデータを１つずつ記憶する複数の記憶領域と、
前記複数の記憶領域のうち、前記データが記憶されていない記憶領域を空き記憶領域として設定し、前記受け付けたデータと同じデータ系列に属するデータが前記複数の記憶領域に記憶されていない場合、前記空き記憶領域として設定された記憶領域の１つに当該データを記憶させるとともに、当該記憶領域を、当該データ系列において最初に受け付けたデータが記憶された先頭記憶領域として設定し、前記受け付けたデータと同じデータ系列に属するデータが前記複数の記憶領域に記憶されている場合、当該データ系列において当該データの１つ前に受け付けたデータが記憶された記憶領域と、前記空き記憶領域として設定された記憶領域の１つとを対応付け、当該記憶領域に当該データを記憶させる制御部と、を有する。
【００１６】
また、上記目的を達成するために本発明のデータ記憶方法は、複数の記憶領域を有し、複数のデータ系列のいずれかに属する複数のデータの入力を１つずつ受け付け、該受け付けた複数のデータを前記複数の記憶領域に１つずつ記憶させ、該記憶されたデータを前記複数のデータ系列毎に先入れ先出し方式で出力するデータ入出力装置におけるデータ記憶方法であって、
前記複数の記憶領域のうち、前記データが記憶されていない記憶領域を空き記憶領域として設定する処理と、
前記受け付けたデータと同じデータ系列に属するデータが前記複数の記憶領域に記憶されていない場合、前記空き記憶領域として設定された記憶領域の１つに当該データを記憶させるとともに、当該記憶領域を、当該データ系列において最初に受け付けたデータが記憶された先頭記憶領域として設定する処理と、
前記受け付けたデータと同じデータ系列に属するデータが前記複数の記憶領域に記憶されている場合、当該データ系列において当該データの１つ前に受け付けたデータが記憶された記憶領域と、前記空き記憶領域として設定された記憶領域の１つとを対応付け、当該記憶領域に当該データを記憶させる処理と、を有する。
【００１７】
また、上記目的を達成するために本発明のプログラムは、複数の記憶領域を有し、複数のデータ系列のいずれかに属する複数のデータの入力を１つずつ受け付け、該受け付けた複数のデータを前記複数の記憶領域に１つずつ記憶させ、該記憶されたデータを前記複数のデータ系列毎に先入れ先出し方式で出力するコンピュータに、
前記複数の記憶領域のうち、前記データが記憶されていない記憶領域を空き記憶領域として設定する機能と、
前記受け付けたデータと同じデータ系列に属するデータが前記複数の記憶領域に記憶されていない場合、前記空き記憶領域として設定された記憶領域の１つに当該データを記憶させるとともに、当該記憶領域を、当該データ系列において最初に受け付けたデータが記憶された先頭記憶領域として設定する機能と、
前記受け付けたデータと同じデータ系列に属するデータが前記複数の記憶領域に記憶されている場合、当該データ系列において当該データの１つ前に受け付けたデータが記憶された記憶領域と、前記空き記憶領域として設定された記憶領域の１つとを対応付け、当該記憶領域に当該データを記憶させる機能と、を実現させる。
【発明の効果】
【００１８】
本発明は以上説明したように構成されているので、データの先入れ先だしをデータ系列毎に実現するために、複数のデータ系列のそれぞれと複数のキューのそれぞれとを固定的に対応付ける必要がない。
【００１９】
従って、データを記憶するための記憶容量の増大を抑制しつつ、データの先入れ先出しをデータ系列毎に実現することができる。
【図面の簡単な説明】
【００２０】
【図１】本発明のデータ入出力装置の実施の一形態の構成を示すブロック図である。
【図２】図１に示したポインタリストメモリとデータメモリとの間の対応関係の一例を示す図である。
【図３】図１に示したポインタリストメモリとデータメモリとの間の対応関係の他の例を示す図である。
【図４】図１に示したポインタリストメモリと先頭ポインタ表との間の対応関係の一例を示す図である。
【図５】図１に示したポインタリストメモリと末尾ポインタ表との間の対応関係の一例を説明するための図である。
【図６】図１に示したポインタリストメモリとデータメモリとの間の対応関係の他の例を示す図である。
【図７】図１に示したデータメモリが初期化されたときの状態の一例を示す図であり、（ａ）はポインタリストメモリを示す図、（ｂ）は先頭ポインタ表及び末尾ポインタ表を示す図である。
【図８】図１に示したデータ入出力装置においてデータを記憶する動作を説明するためのフローチャートである。
【図９】図７に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリを示す図、（ｂ）は先頭ポインタ表及び末尾ポインタ表を示す図である。
【図１０】図９に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリを示す図、（ｂ）は先頭ポインタ表及び末尾ポインタ表を示す図である。
【図１１】図１に示したデータメモリにデータが記憶された状態の一例を示す図であり、（ａ）はポインタリストメモリを示す図、（ｂ）は先頭ポインタ表及び末尾ポインタ表５２を示す図である。
【図１２】図１に示したデータ入出力装置１０において、記憶されたデータを出力する動作を説明するためのフローチャートである。
【図１３】図１１に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリを示す図、（ｂ）は先頭ポインタ表及び末尾ポインタ表を示す図である。
【図１４】図１３に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリを示す図、（ｂ）は先頭ポインタ表及び末尾ポインタ表を示す図である。
【図１５】データの先入れ先出しを複数のデータ系列毎に実現するデータ入出力装置の構成を説明するための図である。
【発明を実施するための形態】
【００２１】
以下に、本発明の実施の形態について図面を参照して説明する。
【００２２】
図１は、本発明のデータ入出力装置の実施の一形態の構成を示すブロック図である。
【００２３】
本実施形態のデータ入出力装置１０は図１に示すように、制御部１１と、データメモリ１２と、入力バッファ１３と、ポインタリストメモリ１４と、先頭ポインタ表５１と、末尾ポインタ表５２とを備えている。
【００２４】
入力バッファ１３は、複数のデータの入力を１つずつ受け付ける。なお、入力バッファ１３にて受け付けられる複数のデータのそれぞれは、複数のデータ系列のいずれかに属している。複数のデータのそれぞれには、データ系列を識別するための系列番号が付与されている。ここでは、系列番号は１以上の整数とする。
【００２５】
データメモリ１２は、所定の長さの連続する複数の記憶領域から構成される。
【００２６】
制御部１１は、ポインタリストメモリ１４と、先頭ポインタ表５１及び末尾ポインタ表５２とを用い、データメモリ１２の複数の記憶領域のうちデータが記憶されていない記憶領域である空き記憶領域に、入力バッファ１３にて受け付けられた複数のデータのそれぞれを記憶させる（書き込む）。また、制御部１１は、ポインタリストメモリ１４と、先頭ポインタ表５１及び末尾ポインタ表５２とを用い、データメモリ１２の複数の記憶領域のそれぞれに記憶されたデータのうち、出力対象のデータ系列のデータを読み出して出力する。なお、制御部１１が、データメモリ１２の複数の記憶領域にデータを記憶させる動作、及び、記憶されたデータを読み出して出力する動作の詳細については、後述する動作フローにおいて説明する。
【００２７】
ここで、図１に示したポインタリストメモリ１４とデータメモリ１２との間の対応関係について説明する。
【００２８】
図２は、図１に示したポインタリストメモリ１４とデータメモリ１２との間の対応関係の一例を示す図である。
【００２９】
データメモリ１２とポインタリストメモリ１４との間の対応関係は系列番号毎に存在する。図２は、ある１つの系列番号における対応関係を示している。また、ポインタリストメモリ１４においては、系列番号を識別するための見出し付けがされている。図２においては、図中の黒丸が系列番号を識別するための見出しを表している。
【００３０】
データメモリ１２とポインタリストメモリ１４とは、ポインタリストメモリ１４のアドレス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;
次に、データ入出力装置１０においてデータを記憶する動作について説明する。ここでは、複数のデータが同時に入力されることはないものとする。また、データの長さは一定である必要はないが、ここでは、説明を簡単にするため、データの長さを一定とし、データメモリの複数の記憶領域のそれぞれは、データの長さと同じ長さであるものとする。
【００６４】
図８は、図１に示したデータ入出力装置１０においてデータを記憶する動作を説明するためのフローチャートである。
【００６５】
まず、入力バッファ１３がデータの入力を受け付ける（ステップＳ１）。
【００６６】
制御部１１は、ステップＳ１にて受け付けたデータに付与された系列番号jを抽出する（ステップＳ２）。
【００６７】
次に、制御部１１は、抽出した系列番号jの末尾ポインタの値（P_tail(j)）を末尾ポインタ表５２から取得する（ステップＳ３）。
【００６８】
そして、制御部１１は、ステップＳ３にて取得した値が“empty”であるかどうかを判定する（ステップＳ４）。
【００６９】
ステップＳ４における判定の結果、ステップＳ３にて取得した値が“empty”でない場合、制御部１１は、ステップＳ３にて取得した値が示すポインタリストメモリ１４のアドレスに記憶された値を、空き系列の先頭ポインタの値に更新する（ステップＳ５）。
【００７０】
次に、制御部１１は、ステップＳ２にて抽出した系列番号jの末尾ポインタの値を、空き系列の先頭ポインタの値に更新する（ステップＳ６）。
【００７１】
次に、制御部１１は、空き系列の先頭ポインタの値が示すポインタリストのアドレスに記憶された値を取得する（ステップＳ７）
次に、制御部１１は、空き系列の先頭ポインタの値が示すポインタリストメモリ１４のアドレスに記憶された値を“END”に更新する（ステップＳ８）。
【００７２】
そして、制御部１１は、空き系列の先頭ポインタの値をステップＳ７にて取得した値に更新する（ステップＳ９）。
【００７３】
なお、上述したステップＳ５〜Ｓ９の動作を疑似コードで表すと以下のようになる。
if(not(P_tail(j==empty)) L(P_tail(j))=P_head(0);
P_tail(j)=P_head(0);
swap=L(P_head(0));
L(P_head(0))=END
P_head(0)=swap
そして、制御部１１は、データメモリ上の複数の記憶領域のうち、ステップＳ２にて抽出した系列番号jの末尾ポインタの値が示すアドレスに対応するデータメモリ１２の記憶領域に、ステップＳ１にて受け付けたデータを記憶させる（ステップＳ１０）。
【００７４】
なお、ステップＳ４における判定の結果、取得した値が“empty”である場合には、制御部１１は、抽出した系列番号jの先頭ポインタの値を、“empty”から、空き系列の先頭ポインタの値に更新し（ステップＳ１１）、ステップＳ６の動作へ遷移する。つまり、空き系列の先頭ポインタが示すポインタリストメモリ１４のアドレスに対応する記憶領域が、ステップＳ２にて抽出した系列番号のデータ系列における先頭記憶領域として設定されたこととなる。
【００７５】
図９は、図７に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリ１４を示す図、（ｂ）は先頭ポインタ表５１及び末尾ポインタ表５２を示す図である。なお、図９は、図７に示した状態の後、系列番号１の最初のデータが記憶されたときの状態を示している。
【００７６】
図９（ｂ）に示すように、系列番号１の先頭ポインタ及び末尾ポインタの値は共に“０”となっている。さらに、空き系列の先頭ポインタの値が“１”となっており、ポインタリストメモリ１４のアドレス１を示している。また、ポインタリストメモリ１４では図９（ａ）に示すように、アドレス０に記憶されている値が“END”となっている。
【００７７】
図１０は、図９に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリ１４を示す図、（ｂ）は先頭ポインタ表５１及び末尾ポインタ表５２を示す図である。なお、図１０は、図９に示した状態の後、系列番号２の最初のデータが記憶され、その後、系列番号１の２番目のデータの記憶が記憶されたときの状態を示している。
【００７８】
図１０（ｂ）に示すように、系列番号０の先頭ポインタの値は、“３”となっており、系列番号１の末尾ポインタの値は“２”となっている。また、ポインタリストメモリ１４では図１０（ａ）に示すように、アドレス０に記憶された値が“２”となっており、アドレス２に記憶された値が“END”となっている。
【００７９】
ここで、空き系列の先頭ポインタの値が“END”になっている場合、データメモリ１２に空き記憶領域がないことを意味する。ここまでの説明では、データメモリ１２に記憶されたデータが出力されることによって記憶領域に空きができることを想定していなかった。そのため、図７〜図１０を参照しながら説明した例では、ポインタリストメモリ１４のアドレス７にある“END”が、空き系列の先頭ポインタの値としてセットされると、受け付けたデータをデータメモリ１２に記憶させることができない状態となる。
【００８０】
但し、データメモリにデータを記憶させることができなくなる前に、データメモリ１２に記憶されたデータが出力されれば、出力されたデータが記憶されていた記憶領域を空き記憶領域とすることができる。
【００８１】
そこで、次に、データ入出力装置１０において記憶されたデータを出力する動作について説明する。
【００８２】
図１１は、図１に示したデータメモリ１２にデータが記憶された状態の一例を示す図であり、（ａ）はポインタリストメモリ１４を示す図、（ｂ）は先頭ポインタ表５１及び末尾ポインタ表５２を示す図である。また、図１２は、図１に示したデータ入出力装置１０において、記憶されたデータを出力する動作を説明するためのフローチャートである。
【００８３】
先頭ポインタ及び末尾ポインタの値が“empty”でないデータ系列では、データがデータメモリ１２に記憶されており、記憶されたデータを出力することができる。ここでは、出力対象のデータ系列は別途決定されるものとして、図１１に示す状態から系列番号１のデータが出力される場合の動作について説明する。
【００８４】
制御部１１は、出力対象となるデータ系列の先頭ポインタの値を抽出する(ステップＳ２１)。図１１（ｂ）に示すように系列番号１の先頭ポインタの値は“０”である。従って、ここでは、“０”が抽出される。
【００８５】
そして、制御部１１は、ステップＳ２１にて抽出した値が示すポインタリストメモリ１４のアドレスに対応する記憶領域からデータを読み出して出力する（ステップＳ２２）。ここでは、データメモリ１２の複数の記憶領域のうち、ポインタリストメモリ１４のアドレス０に対応する記憶領域からデータが読み出されて出力される。
【００８６】
次に、制御部１１は、出力対象のデータ系列の先頭ポインタの値を、ステップＳ２１にて抽出した値が示すアドレスに記憶された値に更新する（ステップＳ２３）。ここでは、系列番号１の先頭ポインタの値が“０”から“２”に更新される。
【００８７】
次に、制御部１１は、ステップＳ２１にて抽出した値が示すアドレスに記憶された値を“END”に更新する（ステップＳ２４）。ここでは、ポインタリストメモリ１４のアドレス０に記憶された値が“２”から“END”に更新される。
【００８８】
次に、制御部１１は、空き系列の末尾ポインタの値が示すアドレスに記憶された値を“END”から、ステップＳ２１にて抽出した値に更新する（ステップＳ２５）。ここでは、ポインタリストメモリ１４のアドレス７に記憶された値が“END”から“０”に更新される。
【００８９】
次に、制御部１１は、空き系列の末尾ポインタの値を、ステップＳ２１にて抽出した値に更新する（ステップＳ２６）。ここでは、空き系列の末尾ポインタの値が“７”から“０”に更新される。
【００９０】
なお、上述したステップＳ２３〜Ｓ２６の動作は、データが出力される度に実行される。
【００９１】
また、上述したステップＳ２１〜Ｓ２６の動作のうち、ステップＳ２２以外の動作を擬似コードで示すと以下のようになる。
// j=1;
swap=P_head(j);         /* swap=0 */
P_head(j)=L(P_head(j)); /* P_head(1)=2 <- 0 */
L(P_head(j))=END;       /* L(0)=END <- 2 */
L(P_tail(0))=swap;      /* L(7)=0 <- END */
P_tail(0)=swap;         /* P_tail(0)=0   */
なお、ここでは、系列番号１のデータを出力した場合について説明したが、他のデータ系列のデータを出力した場合でも、上述したのと同様の動作により、出力されたデータが記憶されていた記憶領域を空き記憶領域として設定することができる。
【００９２】
図１３は、図１１に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリ１４を示す図、（ｂ）は先頭ポインタ表５１及び末尾ポインタ表５２を示す図である。図１３は、図１１に示した状態の後、系列番号１の最初のデータが出力されたときの状態を示している。つまり、図１３は、図１１に示した状態の後、図１２を参照しながら説明した動作が行われた後の状態を示している。
【００９３】
図１３と図１１とを比較すると、系列番号０の末尾ポインタの値が“７”から“０”に更新されている。つまり、アドレス０に対応する記憶領域が空き記憶領域として設定されたことになる。
【００９４】
ここで、任意のデータ系列において、記憶された全てのデータの出力を完了した後には、そのデータ系列の先頭ポインタ及び末尾ポインタの値が“empty”になっている必要がある。
【００９５】
図１３に示した状態において系列番号５のデータ系列に属するデータは、ポインタリストメモリ１４のアドレス３に対応する記憶領域にだけ記憶されている。この場合、系列番号５のデータ系列に属するデータを出力した後に、系列番号５の先頭ポインタ及び末尾ポインタの値を“empty”とするためには、出力されたデータが記憶されていた記憶領域に対応するアドレスに記憶されている値が“END”であるかどうかを判定する動作を、上述した動作に追加すればよい。
【００９６】
出力されたデータが記憶されていた記憶領域に対応するアドレスに記憶されている値が“END”であるかどうかを判定する動作を、上述した動作に追加した動作を擬似コードで示すと以下のようになる。ここでは、図１３に示した状態において、系列番号５のデータ系列に属するデータが出力される場合を一例として示している。
// i=5;
swap=P_head(i);                         /* swap=3 */
tmp=L(P_head(i));                       /* tmp=END */
if(tmp==END){
P_head(i)=empty;
P_tail(i)=empty;
}                                                 /* P_head(5)=END <- END */
else{
P_head(i)=tmp;
L(P_head(i))=END;             /* L(P_head(i))=END <- END */
}                                                 /* P_head(5)=END <- END */
L(P_tail(0))=swap;            /* L(7)=0 <- END */
P_tail(0)=swap;               /* P_tail(0)=0   */
図１４は、図１３に示した状態の後の状態の一例を示す図であり、（ａ）はポインタリストメモリ１４を示す図、（ｂ）は先頭ポインタ表５１及び末尾ポインタ表５２を示す図である。図１４は、図１３に示した状態の後、系列番号５のデータが出力されたときの状態を示している。
【００９７】
図１４と図１３とを比較すると、ポインタリストメモリ１４のアドレス３に記憶された値は“END”のままであるが、アドレス０に記憶された値が“END”から“３”へ変更されている。また、空き系列の末尾ポインタの値が“７”から“３”に更新されている。つまり、ポインタリストメモリ１４のアドレス３に対応する記憶領域が空き記憶領域として設定されている。また、図１４においては、系列番号５の先頭ポインタ及び末尾ポインタの値が“３”から“empty”に更新されている。
【００９８】
このように本実施形態においては、受け付けられたデータが属するデータ系列のデータがデータメモリ１２に記憶されていない場合、空き記憶領域の１つに当該データが記憶されるとともに、当該記憶領域が、当該データ系列において最初に受け付けられたデータが記憶された先頭記憶領域として設定される。一方、受け付けられたデータが属するデータ系列のデータがデータメモリ１２に記憶されている場合、当該データ系列において当該データの１つ前に受け付けられたデータが記憶された記憶領域と、空き記憶領域の１つとが対応付けられ、当該空き記憶領域に当該データが記憶される。
【００９９】
これにより、データの先入れ先だしをデータ系列毎に実現するために、複数のデータ系列のそれぞれと複数のキューのそれぞれとを固定的に対応付ける必要がない。
【０１００】
従って、データを記憶するための記憶容量の増大を抑制しつつ、データの先入れ先出しをデータ系列毎に実現することができる。
【０１０１】
なお、本実施形態においては、ポインタリストメモリ１４とデータメモリ１２とが別々のメモリとして実装されている場合について説明したが、これらは、１つのメモリに組み合わせて実装されていてもよい。
【０１０２】
また、本発明においては、データ入出力装置内の処理は上述の専用のハードウェアにより実現されるもの以外に、その機能を実現するためのプログラムをデータ入出力装置にて読取可能な記録媒体に記録し、この記録媒体に記録されたプログラムをデータ入出力装置に読み込ませ、実行するものであっても良い。データ入出力装置にて読取可能な記録媒体とは、フレキシブルディスク、光磁気ディスク、ＤＶＤ、ＣＤなどの移設可能な記録媒体の他、データ入出力装置に内蔵されたＨＤＤなどを指す。また、この記録媒体に記録されたプログラムをネットワークを介して提供することも可能である。
【符号の説明】
【０１０３】
１０    データ入出力装置
１１    制御部
１２    データメモリ
１３    入力バッファ
１４    ポインタリストメモリ
５１    先頭ポインタ表
５２    末尾ポインタ表
【図１】
0005491282.tif 000002
【図２】
0005491282.tif 000003
【図３】
0005491282.tif 000004
【図４】
0005491282.tif 000005
【図５】
0005491282.tif 000006
【図６】
0005491282.tif 000007
【図７】
0005491282.tif 000008
【図８】
0005491282.tif 000009
【図９】
0005491282.tif 000010
【図１０】
0005491282.tif 000011
【図１１】
0005491282.tif 000012
【図１２】
0005491282.tif 000013
【図１３】
0005491282.tif 000014
【図１４】
0005491282.tif 000015
【図１５】
0005491282.tif 000016