(57)【要約】【課題】バッファ本体のエントリ数が増加した場合でも、必要なチェインバッファのエントリ数の増加を抑えることができるバッファ装置を提供する。【解決手段】バッファ本体１１の１６個のエントリは、４つのエントリごとに、４つのグループにグループ分けされる。チェインバッファ１２は、バッファ本体１１の４つのグループに対応して、各グループに後続するグループの先頭のエントリ番号を記憶する。バッファ本体１１では、グループ内については、エントリ番号順にデータのつながりを管理する。また、グループ間については、チェインバッファ１２を用いて、データのつながりを管理する。【選択図】図１
2007257398.tif 000002
【特許請求の範囲】
【請求項１】
複数のエントリを有するバッファ本体と、
前記複数のエントリを、それぞれが複数のエントリを含む複数のグループにグループ化し、各グループに対応して、当該グループに後続するグループに属する複数のエントリのうちで先頭のエントリを示す情報を記憶するチェインバッファとを備え、
前記グループ内では、エントリ番号に従ってチェインが構成されると共に、前記グループ間では、前記チェインバッファが記憶する情報に従ってチェインが構成されることを特徴とするバッファ装置。
【請求項２】
前記チェインごとに、該チェインの先頭のエントリ及び最後尾のエントリを示す情報を記憶するチェイン情報記憶部を備えている、請求項１に記載のバッファ装置。
【請求項３】
前記チェインが、データの宛先ごとに構成されている、請求項２に記載にバッファ装置。
【請求項４】
前記グループに属するエントリの何れにもデータが格納されていないグループうちの先頭グループ及び最後尾グループを示す情報を記憶する空きバッファ情報記憶部を備えている、請求項１〜３の何れか一に記載のバッファ装置。
【請求項５】
複数のエントリを有し、該複数のエントリをそれぞれが複数のエントリを含むグループにグループ化し、該グループ間の順序関係が管理されるバッファを制御する方法であって、
入力データがあると、該入力データが属するチェインを判断して、当該チェインに属するデータが既に格納されているか否かを判断し、
既に記憶されていると判断すると、前記チェインの最後尾のデータを格納するエントリが属するグループ内に空きエントリがあるか否かを判断し、
前記グループ内に空きエントリがあると判断すると、前記最後尾のデータを格納するエントリに後続するエントリに前記入力データを格納し、
前記グループ内に空きエントリがないと判断すると、空きエントリのみで構成されるグループに属するグループのうちで先頭のエントリに前記入力データを格納すると共に、前記最後尾のデータを格納していたエントリが属するグループに、前記入力データを格納したエントリが属するグループが後続する旨の情報を記憶することを特徴とするバッファの制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、バッファ装置及びバッファ制御方法に関し、更に詳しくは、格納されたデータのチェインを定義可能なバッファ装置、及び、そのようなバッファ装置の制御方法に関する。
【背景技術】
【０００２】
バッファ装置は、例えば情報処理装置に装備され、データの入出力を制御するためのデータの緩衝を行う。バッファの制御方式としては、先にエントリに格納したデータを先に出力する方式、つまり、データをバッファに入ってきた順番に出力するＦＩＦＯ(First In First Out)方式と、エントリ間のつながりを意識したデータの出し入れを行うチェイン方式とがある。なお、本明細書では、データを格納するバッファ本体と、このデータのバッファへの入出力を制御する制御部を含めたひとまとまりをバッファ（バッファ装置）と呼ぶものとする。
【０００３】
ＦＩＦＯ方式では、各エントリ間のつながりは、エントリ番号順（＃０→＃１→＃２→．．．→＃１５→＃０）に確保されており、一般的なカウンタを用いて、エントリに対する書き込み、及び、読み出しを制御できる。一方、チェイン方式では、エントリ番号とは無関係にエントリを使用して、データの入出力を、エントリの並び順にしばられずに自由に行うようにするために、エントリ間のつながりを記憶する必要がある。一般に、チェイン方式では、エントリ数と同数のチェインバッファを用意し、チェインバッファに、エントリ間のつながりを記憶する。
【０００４】
図１１は、従来の一般的なチェイン方式のバッファの構成を示す。このバッファ装置５０は、バッファ本体５１、チェインバッファ５２、及び、チェイン情報記憶部５３を有する。バッファ本体５１は、例えば１６個のエントリ（＃０〜＃１５）を有する。エントリとは、バッファを構成する最小単位であり、各エントリには、１つのデータが格納される。チェインバッファ５２は、バッファ本体５１の各エントリに対応しており、各エントリに後続するエントリのエントリ番号を記憶する。このようなチェインバッファ５２を用いることにより、バッファ本体５１のエントリ間のつながり（チェイン）を自由に組み替えることができる。
【０００５】
チェイン方式のバッファでは、複数のチェインを定義することができ、例えばデータの出力先（宛先とも呼ぶ）ごとにチェインを定義する。チェイン情報記憶部５３は、各チェインの先頭エントリ番号と最後尾エントリ番号との組を記憶する。チェイン情報記憶部５３の宛先Ａの先頭エントリ番号５４及び最後尾エントリ番号５５には、それぞれ宛先Ａに対応するチェインの先頭及び最後尾のエントリ番号が格納される。また、宛先Ｂの先頭エントリ番号５６及び最後尾エントリ番号５７には、それぞれ宛先Ｂに対応するチェインの先頭及び最後尾のエントリ番号が格納される。空きエントリの管理にもチェインが用いられ、空きエントリの先頭エントリ番号５８及び最後尾エントリ番号５９には、それぞれ空きエントリのチェインの先頭及び最後尾のエントリ番号が格納される。
【０００６】
図１２は、図１１に示すバッファ装置５０の動作状態における各部が記憶する情報の例を示している。この例では、バッファ本体５１には、６つのデータ（＃０〜＃５）が格納されている。これらデータには、宛先Ａのデータと、宛先Ｂのデータとが混在している。宛先Ａの先頭エントリ番号５４を参照すると、宛先Ａのチェインの先頭データは、バッファ本体５１のエントリ＃０に格納されたデータ０であることがわかる。バッファ本体５１のエントリ＃０に対応するチェインバッファ５２のエントリ＃０は、「エントリ番号＃１」であり、データ０に、エントリ＃１に格納されたデータ１が後続することがわかる。同様に、チェインバッファ５２を参照することで、データ１にデータ３（エントリ番号＃３）が後続し、データ３にデータ５（エントリ番号＃５）が後続することがわかる。宛先Ａの最後尾エントリ番号５５は、「エントリ番号＃５」であり、データ５が最終データであることがわかる。
【０００７】
宛先Ｂについては、先頭エントリ番号５６は、「エントリ番号＃２」であり、宛先Ｂのチェインの先頭データは、データ２であることがわかる。チェインバッファ５２のエントリ＃２は、「エントリ番号＃４」であり、また、宛先Ｂの最後尾エントリ番号５７は「エントリ番号＃４」であるので、データ２に後続するデータ４が最終データであることがわかる。空きエントリについては、先頭エントリ番号５８を参照すると、空きエントリの先頭はエントリ番号＃６であり、チェインバッファ５２を参照すると、エントリ＃６から、エントリ＃７、８、９、・・・の順に空きバッファのチェインが構成されていることがわかる。また、空きエントリの最終エントリ番号５９は「エントリ番号＃１５」であるから、このエントリ＃１５が空きバッファの最終エントリであることがわかる。
【０００８】
図１３は、データ読み出し後のバッファ装置５０の各部が記憶する情報の例を示している。図１２に示す状態で、宛先Ｂに対して、エントリ番号＃２から、データ２が出力された場合について考える。この場合、データ２を出力したことに伴い、宛先Ｂの先頭エントリ番号５６は、エントリ番号＃４に書き換えられる。また、エントリ番号＃２は、空き領域となるため、空きエントリの最後尾であったエントリ番号＃１５の後ろに、エントリ番号＃２がつながれる。詳細には、チェインバッファ５２のエントリ＃１５にエントリ番号＃２が格納され、空きエントリの最後尾エントリ番号５９に、エントリ番号＃２が格納される。
【０００９】
ここで、バッファ装置に関して、空きバッファの管理を行う技術としては、特許文献１に記載された技術がある。特許文献１では、複数のバッファ（エントリ）を、それぞれが複数のバッファからなる複数個のバッファ群に分割し、空きバッファのチェインを、分割したバッファ群ごとに独立した空きバッファチェインとして管理する。特許文献１では、このようにすることで、バッファの２重開放などによって空きバッファのチェインが破壊されたときでも、その破壊の影響を一部にとどめることができるとしている。
【特許文献１】特開２０００−２８５０１１号公報
【発明の開示】
【発明が解決しようとする課題】
【００１０】
従来のチェイン方式のバッファ（図１１）では、エントリ間のつながりを保持するために、エントリ数と同数のエントリを持つチェインバッファを用意している。このため、特に、バッファ本体のエントリ数が多い場合には、それに伴ってチェインバッファのエントリ数が増加し、ハードウェア量が増加するという問題がある。特許文献１では、分割されたエントリ群内では、空きエントリのチェインを、各エントリに対応したチェインバッファ（リンクポインタ）を用いて管理している。従って、特許文献１に記載の技術では、チェインバッファのハードウェア量を削減する効果は得られない。
【００１１】
本発明は、上記従来技術の問題点を解消し、バッファ本体のエントリ数が増加した場合でも、必要なチェインバッファのエントリ数の増加を抑えることができるバッファ装置及びバッファ制御方法を提供することを特徴とする。
【課題を解決するための手段】
【００１２】
上記目的を達成するために、本発明のバッファ装置は、複数のエントリを有するバッファ本体と、前記複数のエントリを、それぞれが複数のエントリを含む複数のグループにグループ化し、各グループに対応して、当該グループに後続するグループに属する複数のエントリのうちで先頭のエントリを示す情報を記憶するチェインバッファとを備え、前記グループ内では、エントリ番号に従ってチェインが構成されると共に、前記グループ間では、前記チェインバッファが記憶する情報に従ってチェインが構成されることを特徴とする。
【００１３】
本発明のバッファ装置では、バッファ本体のエントリを、それぞれが複数のエントリを含む複数のグループにグループ化し、チェインバッファにより、グループ間のつながりを定義する。また、グループ内では、エントリ番号に従って、格納されたデータ間のつながりを定義する。このようにすることで、データ間のつながりをある程度自由に定義することを可能としつつ、バッファ本体の各エントリに対応してエントリ間のつながりを記憶する従来のバッファ装置に比して、必要なチェインバッファの量（エントリ数）を削減できる。
【００１４】
本発明のバッファ装置は、前記チェインごとに、該チェインの先頭のエントリ及び最後尾のエントリを示す情報を記憶するチェイン情報記憶部を備える構成を採用できる。チェインは、例えばデータの宛先（出力先）に応じて、出力先ごとに定義できる。例えば、宛先Ａへのデータのチェインと、宛先Ｂへのデータのチェインとを考える場合、そのそれぞれのチェインについて、先頭のデータを格納するエントリを示す情報と、最後尾のデータを格納するエントリを示す情報とをチェイン情報記憶部に記憶することで、データ出力先ごとにチェインを管理できる。
【００１５】
本発明のバッファ装置は、前記グループに属するエントリの何れにもデータが格納されていないグループうちの先頭グループ及び最後尾グループを示す情報を記憶する空きバッファ情報記憶部を備える構成を採用できる。グループ内では、エントリ番号に従ってチェインが構成されるため、あるチェインのデータが格納されたグループに属するエントリは、そのチェインのデータを格納するためのエントリとして確保されたことになる。従って、データ未格納のエントリのみで構成されるグループの先頭のエントリを空きエントリの先頭エントリとして、空きエントリを管理すればよい。
【００１６】
本発明のバッファ制御方法は、複数のエントリを有し、該複数のエントリをそれぞれが複数のエントリを含むグループにグループ化し、該グループ間の順序関係が管理されるバッファを制御する方法であって、入力データがあると、該入力データが属するチェインを判断して、当該チェインに属するデータが既に格納されているか否かを判断し、既に記憶されていると判断すると、前記チェインの最後尾のデータを格納するエントリが属するグループ内に空きエントリがあるか否かを判断し、前記グループ内に空きエントリがあると判断すると、前記最後尾のデータを格納するエントリに後続するエントリに前記入力データを格納し、前記グループ内に空きエントリがないと判断すると、空きエントリのみで構成されるグループに属するグループのうちで先頭のエントリに前記入力データを格納すると共に、前記最後尾のデータを格納していたエントリが属するグループに、前記入力データを格納したエントリが属するグループが後続する旨の情報を記憶することを特徴とする。
【００１７】
本発明のバッファ制御方法では、同じチェインのデータが既に格納されているときには、そのチェインの最後尾のデータが格納されたエントリが属するグループ内にデータ未格納の空きエントリがあるか否かを調べ、あるときには、最後尾のデータが格納されたエントリに後続するエントリに入力データを格納する。グループ内に空きエントリがないときには、データ未格納のエントリのみで構成されるグループの先頭のエントリに、入力データを格納する。また、入力データを格納したエントリが属するグループが、格納済みデータのチェインの最後尾のデータを格納するエントリが属するグループに後続する旨の順序情報を記憶する。バッファを、このように制御することで、データ間のつながりをある程度自由に定義することを可能としつつ、エントリごとに、後続するエントリがどのエントリであるかを記憶する従来に比して、順序関係を記憶するための記憶領域を削減できる。
【発明の効果】
【００１８】
本発明のバッファ装置では、バッファ本体のエントリを、それぞれが複数のエントリを含む複数のグループにグループ化し、チェインバッファにより、グループ間のつながりを定義する。また、グループ内では、エントリ番号に従って、格納されたデータ間のつながりを定義する。このようにすることで、データ間のつながりをある程度自由に定義することを可能としつつ、バッファ本体の各エントリに対応してエントリ間のつながりを記憶する従来のバッファ装置に比して、必要なチェインバッファの量（エントリ数）を削減できる。
【００１９】
本発明のバッファ制御方法では、同じチェインのデータが既に格納されているときには、そのチェインの最後尾のデータが格納されたエントリが属するグループ内にデータ未格納の空きエントリがあるか否かを調べ、あるときには、最後尾のデータが格納されたエントリに後続するエントリに入力データを格納する。グループ内に空きエントリがないときには、データ未格納のエントリのみで構成されるグループの先頭のエントリに、入力データを格納する。また、入力データを格納したエントリが属するグループが、格納済みデータのチェインの最後尾のデータを格納するエントリが属するグループに後続する旨の順序情報を記憶する。これにより、データ間のつながりをある程度自由に定義することを可能としつつ、エントリごとに、後続するエントリがどのエントリであるかを記憶する従来に比して、順序関係を記憶するための記憶領域を削減できる。
【発明を実施するための最良の形態】
【００２０】
以下、図面を参照し、本発明の実施の形態を詳細に説明する。図１は、本発明の一実施形態のバッファ装置の構成を示している。バッファ装置１０は、バッファ本体１１と、チェインバッファ１２と、チェイン情報記憶部１３とを有する。なお、同図では、図面の簡略化のために、データのバッファ装置１０に対する入出力を制御する制御部については、図示を省略している。バッファ装置１０は、例えば複数の宛先に対してデータを出力する情報処理装置に装備される。
【００２１】
バッファ本体１１は、複数のエントリを有し、図１の例では、１６個のエントリ（＃０〜＃１５）を有する。バッファ本体１１の各エントリには、１つのデータが格納される。本実施形態では、バッファ本体１１のエントリを、複数のグループに分けて管理する。図１の例では、１６個のエントリは、４つのエントリごとに、４つのグループに分けて管理される。
【００２２】
チェインバッファ１２は、バッファ本体１１のグループ間のつながり情報を保持する。図１では、バッファ本体１１のエントリは、グループ＃０〜＃３の４つのグループに分かれており、チェインバッファ１２は、その４つのグループに対応して、４つのエントリを有する。チェインバッファ１２のエントリ＃０は、バッファ本体１１のエントリ＃０〜＃３のグループ＃０に対応し、エントリ＃１は、バッファ本体１１のグループ＃１に対応する。また、チェインバッファ１２のエントリ＃２は、バッファ本体１１のグループ＃２に対応し、エントリ＃３は、バッファ本体１１のグループ＃３に対応する。
【００２３】
一般に、チェイン方式のバッファでは、エントリ間のつながり（以下、チェインとも呼ぶ）を自由に組みかえられるように、チェインバッファを用いて、エントリ間のつながりを管理している。本実施形態では、バッファ本体１１のエントリを複数のグループに分け、グループ内ではエントリ番号順にエントリ間をつなげ、グループ間のつながりは、チェインバッファ１２を用いて管理する。また、同じグループ内には、同一チェインを構成するデータを格納する。
【００２４】
チェインバッファ１２の各エントリには、対応するグループに後続するグループの先頭エントリの番号が格納される。例えば、バッファ本体１１のグループ＃０に後続するグループが“＃２”であれば、グループ＃０に対応するチェインバッファ１２のエントリ＃０には、そのグループ＃２の先頭エントリのエントリ番号＃８が格納される。
【００２５】
チェインバッファ１２を用いたエントリ間のつながりは、複数定義することができ、例えば、データの出力先（宛先）ごとにチェインを定義する。チェイン情報記憶部１３は、チェインごとに、先頭のエントリ番号と、最後尾のエントリ番号との組を記憶する。先頭エントリ番号と最後尾エントリ番号とでチェインの初めと終わりを定義し、チェインバッファ１２によってチェイン内のエントリのつながりを表すことでチェインを構成し、このチェインを複数装備することで、バッファの出力効率を向上させることができる。
【００２６】
図１では、宛先Ａに対応するチェインと、宛先Ｂに対応するチェインとの２つのチェインを考えており、チェイン情報記憶部１３は、宛先Ａに対応する先頭エントリ番号１４及び最後尾エントリ番号１５と、宛先Ｂに対応する先頭エントリ番号１６及び最後尾エントリ番号１７とを記憶する。また、空きエントリの管理にもチェインが用いられ、チェイン情報記憶部１３は、現在未使用の空きエントリを管理するための空きエントリの先頭エントリ番号１８及び最後尾エントリ番号１９を記憶する。
【００２７】
宛先Ａの先頭エントリ番号１４には、宛先Ａのチェインの先頭となるデータが格納されたエントリのエントリ番号が格納される。また、最後尾エントリ番号１５には、宛先Ａのチェインの最後尾となるデータが格納されたエントリのエントリ番号が格納される。同様に、宛先Ｂの先頭エントリ番号１６には、宛先Ｂのチェインの先頭のデータが格納されたエントリのエントリ番号が格納され、最後尾エントリ番号１７には、最後尾のデータが格納されたエントリのエントリ番号が格納される。また、空きエントリの先頭エントリ番号１８には、バッファ本体１１の空きグループのうちの先頭のグループの先頭エントリ番号が格納され、最後尾エントリ番号１９には、空きグループのうちの最後尾のグループの先頭エントリ番号が格納される。
【００２８】
図２は、バッファ装置１０のデータ格納時の動作手順を示している。バッファ装置１０に対してデータが入力されると（ステップＳ１）、図示しない制御部は、入力データが属するチェインを判別し、チェイン情報記憶部１３を参照して、同一チェインのデータがバッファ本体１１に既に格納されているか否かを判断する（ステップＳ２）。例えば、ステップＳ１で入力されたデータの宛先が「宛先Ａ」であれば、宛先Ａの先頭エントリ番号１４を参照して、宛先Ａのデータがバッファ本体１１に格納されているか否かを判断する。
【００２９】
制御部は、同一チェインのデータが格納済みであると判断すると、そのチェインの最後尾のデータを格納するエントリを調べ、最後尾のデータを格納するエントリが属するグループ内に、空きエントリがあるか否かを判断する（ステップＳ３）。例えば、宛先Ａの最後尾エントリ番号１５が「エントリ番号＃０」であれば、エントリ＃０が属するグループ＃０のエントリ＃１〜＃３は空きエントリであるので、空きエントリがあると判断する。また、最後尾エントリ番号１５が「エントリ番号＃３」であれば、グループ＃０には空きエントリがないと判断する。
【００３０】
制御部は、ステップＳ３で空きエントリがあると判断すると、最後尾のデータが格納されたエントリに後続する番号のエントリに、ステップＳ１で入力されたデータを格納する（ステップＳ４）。その後、対応するチェインの最後尾エントリ番号を、ステップＳ４でデータを格納したエントリのエントリ番号で更新する（ステップＳ５）。例えば、ステップＳ４で、宛先Ａのデータをエントリ＃１に格納した場合には、宛先Ａの最後尾エントリ番号１５を「エントリ番号＃０」から「エントリ番号＃１」に更新する。
【００３１】
ステップＳ２で同一チェインのデータがまだ格納さていないと判断した場合、又は、ステップＳ３で同一グループ内に空きエントリがないと判断した場合には、空きエントリの先頭エントリ番号１８を参照して、その先頭エントリ番号１８が示すエントリに、ステップＳ１で入力されたデータを格納する（ステップＳ６）。その後、ステップＳ３からステップＳ６へ進んだ場合には、格納済みデータと、ステップＳ５で新たに格納されたデータとのチェインをつなげるために、チェインバッファ１２を更新する（ステップＳ７）。ステップＳ２からステップＳ６へ進んだ場合には、ステップＳ６で格納されたデータは、チェインの先頭となるデータであるから、チェインバッファ１２の更新は行われない。
【００３２】
例えば、入力データを格納する前の宛先Ａの最後尾エントリ番号１５が「エントリ番号＃３」であり、ステップＳ６でエントリ＃８に宛先Ａへのデータを格納した場合には、ステップＳ７では、エントリ＃３が属するグループ＃０と、エントリ＃８が属するグループ＃２とをつなげるために、グループ＃０に対応するチェインバッファ１２のエントリ＃０に、グループ＃２の先頭エントリである「エントリ番号＃８」を格納する。その後、ステップＳ５へ進んで、対応するチェインの最後尾エントリ番号を、ステップＳ６でデータを格納したエントリのエントリ番号で更新する。また、ステップＳ５でデータを格納したエントリが属するグループを、同一チェインのデータを格納するためのエントリとして確保し、空きエントリの先頭エントリ番号１８を、データ未格納のグループの先頭エントリ番号で更新する。
【００３３】
以下、バッファ装置１０のデータ格納時の動作について、具体例を用いて説明する。図３〜図８は、データが格納される際のバッファ装置１０の各部に記憶された情報を示している。図３は、初期状態、つまり、バッファ本体１１に何もデータが格納されていない状態でのバッファ装置１０の各部に記憶された情報を示している。チェインバッファ１２のエントリ＃０には、バッファ本体１１のグループ＃１の先頭であるエントリ番号＃４が格納され、エントリ＃１には、グループ＃２の先頭のエントリ番号＃８が格納され、エントリ＃２には、グループ＃３の先頭のエントリ番号＃１２が格納される。これにより、グループ＃０にグループ＃１が後続し、グループ＃１にグループ＃２が、グループ＃２にグループ＃３が後続するチェインが定義される。なお、グループ＃３は最終グループであり、これに後続するグループはないので、チェインバッファ１２のエントリ＃３には、有効な情報が格納されない（以下では、有効な情報が格納されない状態を“−”で表現する）。
【００３４】
図３に示す状態では、バッファ本体１１にはデータが格納されておらず、全てのエントリが空きエントリである。従って、空きエントリの先頭エントリ番号１８には、チェインの先頭であるグループ＃０の先頭エントリ番号＃０が格納される。また、空きエントリの最後尾エントリ番号１９には、チェインの最後尾であるグループ＃３の先頭エントリ番号＃１２が格納される。宛先Ａの先頭エントリ番号１４及び最後尾エントリ番号１５と、宛先Ｂの先頭エントリ番号１６及び最後尾エントリ番号１７については、バッファ本体１１にデータが格納されていないため、有効な情報が格納されていない。
【００３５】
図３に示す初期状態で、バッファ装置１０に、宛先Ａへのデータ０が入力されると、空きエントリの先頭エントリ番号１８は“エントリ番号＃０”であるので、バッファ装置１０は、バッファ本体１１のエントリ＃０に、データ０を格納する（図４）。バッファ装置１０は、データ０が、宛先Ａへの先頭かつ最後尾のデータであるため、宛先Ａの先頭エントリ番号１４及び最後尾エントリ番号１５に、それぞれエントリ番号＃０を格納する。宛先Ｂについては、データがないので、宛先Ｂの先頭エントリ番号１６及び最後尾エントリ番号１７は変化しない。
【００３６】
バッファ装置１０は、バッファ本体１１の空きエントリの先頭であったエントリ＃０にデータ０を格納したことに伴い、空きエントリの先頭エントリ番号１８を更新する。この更新では、データを格納したバッファ本体１１のエントリ番号＃０を含むグループ＃０を、データ０の宛先である“宛先Ａ”用として確保し、グループ＃０に後続するグループ＃１の先頭のエントリ番号＃４を、空きエントリの先頭エントリ番号１８に格納する。
【００３７】
バッファ本体１１のグループ＃０に対応するチェインバッファ１２のエントリ＃０については、データ０に続くデータがないために変化しない。これは、宛先Ａへのデータは１つであり、グループ内ではエントリ番号に従ってチェインが定義されるため、チェインバッファ１２を用いてチェインを定義する必要がないからである。図４では、無効であることを示す“−”としているが、実際には、初期値であるエントリ＃４が格納されたままとなっている。
【００３８】
図４に示す状態で、バッファ装置１０に、宛先Ｂへのデータが入力されると、宛先Ｂへのデータはバッファ本体１１にはまだ格納されていないことから、バッファ装置１０は、空きエントリの先頭エントリ番号１８が示す、バッファ本体１１のエントリ＃４に、データ１を格納する（図５）。また、データ１が、宛先Ｂへの先頭かつ最後尾のデータであるため、宛先Ｂの先頭エントリ番号１６及び最後尾エントリ番号１７に、それぞれエントリ番号＃４を格納する。宛先Ａについては、データに変化がないため、宛先Ａの先頭エントリ番号１４及び最後尾エントリ番号１５は変化しない。
【００３９】
バッファ装置１０は、バッファ本体１１の空きエントリの先頭であったエントリ＃４にデータ１を格納したことに伴い、空きエントリの先頭エントリ番号１８を更新する。この更新では、データを格納したバッファ本体１１のエントリ番号＃４を含むグループ＃１を、データ１の宛先である“宛先Ｂ”用として確保し、グループ＃１に後続するグループ＃２の先頭のエントリ番号＃８を、空きエントリの先頭エントリ番号１８に格納する。バッファ本体１１のグループ＃１に対応するチェインバッファ１２のエントリ＃１については、データ１に続くデータがないために変化しない。図５では、無効であることを示す“−”としているが、実際には、初期値であるエントリ＃８が格納されたままとなっている。
【００４０】
図５に示す状態で、バッファ装置１０に、宛先Ａへのデータ２が入力された場合について考える。この場合、空きエントリの先頭エントリ番号１８はエントリ番号＃４であるが、宛先Ａの先頭エントリ番号１４及び最後尾エントリ番号１５が共にエントリ番号＃０であることから、宛先Ａ用に確保されたグループ＃０にはまだ空きがあり、エントリ＃０に後続するエントリ＃１が使用可能とわかる。このため、バッファ装置１０は、バッファ本体１１のエントリ＃１に、データ２を格納する（図６）。その際、宛先Ａの最後尾エントリ番号１５を、エントリ番号＃１に更新する。宛先Ｂの先頭エントリ番号１６及び最後尾エントリ番号１７と、空きエントリの先頭エントリ番号１８及び最後尾エントリ番号１９とについては、変更がない。
【００４１】
図６に示す状態から、宛先Ａへのデータ３、５と、宛先Ｂへのデータ４とがバッファ本体１１に格納され、更に、バッファ装置１０に、宛先Ａへのデータ６が入力される場合について考える。この場合には、宛先Ａ用に確保されたグループ＃０に属するエントリ＃０〜＃３は、既に宛先Ａへのデータを格納していることから、バッファ装置１０は、空きエントリの先頭エントリ番号１８を参照して、エントリ＃８にデータ６を格納する（図７）。その際、グループ＃０の最後尾であるエントリ＃３に後続するエントリが、グループ＃２の先頭エントリであることを定義するために、グループ＃０に対応するチェインバッファ１２のエントリ＃０に、エントリ番号＃８を格納する。これにより、データ５（エントリ番号＃３）から、データ６（エントリ番号＃８）へのチェインが定義される。
【００４２】
バッファ装置１０は、宛先Ａの最後尾エントリ番号１５に、データ６を格納したエントリ番号＃８を格納する。また、バッファ装置１０は、エントリ＃８に宛先Ａへのデータ６を格納したことで、エントリ番号＃８を含むグループ＃２を宛先Ａ用として確保し、グループ＃２に後続するグループ＃３の先頭のエントリ番号＃１２を、空きエントリの先頭エントリ番号１８に格納する。バッファ本体１１のグループ＃２に対応するチェインバッファ１２のエントリ＃２については、データ６に続くデータがないために変化しない。図７では、無効であることを示す“−”としているが、実際には、初期値であるエントリ＃１２が格納されたままとなっている。
【００４３】
図７に示す状態から、宛先Ｂへのデータ７、８と、宛先Ａへのデータ９とがバッファ本体１１に格納された状態を、図８に示す。宛先Ｂへのデータ７、＃８は、宛先Ｂの最後尾エントリ番号１７を参照して、宛先Ｂ用に確保されたグループ＃１に属するエントリ番号＃６、＃７にそれぞれ格納される。また、宛先Ａへのデータ９については、宛先Ａの最後尾エントリ番号１５を参照して、宛先Ａ用に確保されたグループ＃２に属するエントリ＃９に格納される。
【００４４】
図８に示す状態では、宛先Ａの先頭エントリ番号１４に格納されたエントリ番号＃０から、同じグループ＃０内のエントリ番号＃１、＃２、＃３へとたどり、更に、チェインバッファ１２に格納されたエントリ番号＃８から、エントリ番号＃９へとたどることで、宛先Ａについて、エントリ番号＃０（先頭エントリ番号１４）から、＃１、＃２、＃３、＃８、＃９（最終エントリ番号１５）に至るチェインが構成されていることがわかる。また、宛先Ｂについては、エントリ番号＃４（先頭エントリ番号１６）から、＃５、＃６、＃７（最終エントリ番号１７）へ至るチェインが構成されていることがわかる。
【００４５】
次に、バッファ装置１０のデータ読み出し時の動作について説明する。図９、図１０は、データが出力される際のバッファ装置１０の各部に記憶された情報を示している。図８に示す状態で、宛先Ｂにデータを出力する場合には、宛先Ｂの先頭エントリ番号１６を参照すると、図８では、先頭データを格納するエントリは、エントリ番号＃４であるので、そのエントリに格納されたデータ１が出力され、エントリ＃４はデータ未格納となる（図９）。データ１の出力後、宛先Ｂの先頭エントリ番号１６は、エントリ番号＃４に後続するエントリ番号＃５に更新される。この時点では、グループ＃１に属するエントリが全てデータ未格納とはなっていないため、空きエントリの先頭エントリ番号１８及び最後尾エントリ番号１９には変化がない。
【００４６】
図９に示す状態から、宛先Ｂへ、データ４、７、８が出力されると、エントリ＃５〜＃７は、それぞれデータ未格納となる（図１０）。この場合、バッファ本体１１には、宛先Ｂへのデータが格納されないことから、宛先Ｂの先頭エントリ番号１６及び最後尾エントリ番号１７は、それぞれ無効な値となる。また、グループ＃１に属するエントリ＃４〜＃７が全て空き状態となったことで、グループ＃１が空きエントリのチェインに接続される。その際には、空きエントリの最後尾エントリ番号１９を参照して、空き状態となったグループ＃１の各エントリが、最後尾エントリ番号１９が示すエントリ番号＃１２（図９）が属するグループ＃３に後続するように、チェインバッファ１２のエントリ＃３に、エントリ番号＃４を格納する。また、空きエントリの最後尾エントリ番号１９を、エントリ番号＃４で更新する。このようにすることで、グループ＃１の各エントリは、新たに空きエントリとして使用可能となる。以上のような手順で、宛先ごとのチェインと空きエントリのチェインとを、それぞれつないでいくことにより、バッファへのデータ入出力が制御される。
【００４７】
本実施形態では、複数のエントリをまとめてグループ化し、各グループを、１つのエントリに見立ててチェインバッファ１２で、そのつながりを管理する。また、グループ内では、エントリ番号に従って、そのつながりを管理する。このようにすることにより、チェイン方式のバッファ制御機能を損なわずに、チェインバッファ１２のエントリ数を、バッファ本体１１の総エントリ数の１／（グループ数）まで削減することができ、各エントリに対応してチェインバッファのエントリを用意する場合に比して、ハードウェア量を削減できる。
【００４８】
なお、上記実施形態では、バッファ本体１１のエントリの総数を１６としたが、これには限定されない。また、バッファ本体１１のエントリを、４つのエントリごとにグループ分けしたが、グループ分けの条件は、これには限定されず、任意の手法により、グループ分けを行うことができる。上記実施形態では、バッファ装置１０のデータ出力先を、宛先Ａ及び宛先Ｂとしたが、これには限定されない。また、宛先ごとにチェインを構成するのに代えて、又は、加えて、他の要因によってチェインを構成してもよい。
【００４９】
以上、本発明をその好適な実施形態に基づいて説明したが、本発明のバッファ装置及びバッファの制御方法は、上記実施形態にのみ限定されるものではなく、上記実施形態の構成から種々の修正及び変更を施したものも、本発明の範囲に含まれる。
【図面の簡単な説明】
【００５０】
【図１】本発明の一実施形態のバッファ装置の構成を示すブロック図。
【図２】バッファ装置のデータ格納時の動作手順を示すフローチャート。
【図３】データ格納時におけるバッファ装置の各部に記憶された情報を示す図。
【図４】データ格納時におけるバッファ装置の各部に記憶された情報を示す図。
【図５】データ格納時におけるバッファ装置の各部に記憶された情報を示す図。
【図６】データ格納時におけるバッファ装置の各部に記憶された情報を示す図。
【図７】データ格納時におけるバッファ装置の各部に記憶された情報を示す図。
【図８】データ格納時におけるバッファ装置の各部に記憶された情報を示す図。
【図９】データ出力時におけるバッファ装置の各部に記憶された情報を示す図。
【図１０】データ出力時におけるバッファ装置の各部に記憶された情報を示す図。
【図１１】従来の一般的なチェイン方式のバッファの構成を示すブロック図。
【図１２】従来のバッファ装置の動作状態における各部が記憶する情報を示す図。
【図１３】データ読み出し後の従来のバッファ装置の各部が記憶する情報の例を示す図。
【００５１】
１０：バッファ装置
１１：バッファ本体
１２：チェインバッファ
１３：チェイン情報記憶部
１４、１６：先頭エントリ番号
１５、１７：最後尾エントリ番号
１８：空き先頭エントリ番号
１９：空き最後尾エントリ番号
【図１】
2007257398.tif 000003
【図２】
2007257398.tif 000004
【図３】
2007257398.tif 000005
【図４】
2007257398.tif 000006
【図５】
2007257398.tif 000007
【図６】
2007257398.tif 000008
【図７】
2007257398.tif 000009
【図８】
2007257398.tif 000010
【図９】
2007257398.tif 000011
【図１０】
2007257398.tif 000012
【図１１】
2007257398.tif 000013
【図１２】
2007257398.tif 000014
【図１３】
2007257398.tif 000015