(57)【要約】【課題】  効率の良いマルチプロセッサシステムを実現する。【解決手段】    バッファ２０に対して先行ポインタ４４と追尾ポインタ４８を設け、使用中、書込完了、読出完了のいずれの状態にあるかを各ブロックに２ビットを割り当てたビットマップを更新しながら保持する。２つのポインタが同じ方向に進行し、かつ互いに追い抜かない制約の下で、先行ポインタ４４により示されるブロックに対する書込の開始後、次のブロックが読出完了状態にある場合に限り、先行ポインタ４４を次のブロックに進め、追尾ポインタ４８により示されるブロックに対する読出の開始後、次のブロックが書込完了状態にある場合に限り、追尾ポインタ４８を次のブロックに進める。  【選択図】  図２
2007052510.tif 000002
【特許請求の範囲】
【請求項１】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理する方法であって、
使用中、書込完了、読出完了のいずれの状態にあるかをブロックに対応づけて示すブロック状態情報を更新しながら保持し、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す先行ポインタと追尾ポインタを設け、
２つのポインタが同じ方向に進行し、かつ互いに追い抜かない制約の下で、
先行ポインタにより示されるブロックに対する書込の開始後、次のブロックが読出完了状態にある場合に限り、先行ポインタを次のブロックに進め、
追尾ポインタにより示されるブロックに対する読出の開始後、次のブロックが書込完了状態にある場合に限り、追尾ポインタを次のブロックに進めることを特徴とするバッファ管理方法。
【請求項２】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理する方法であって、
書込完了かそれ以外かをブロックに対応づけて示す書込完否情報と、読出完了かそれ以外かをブロックに対応づけて示す読出完否情報とを含むブロック状態情報を更新しながら保持し、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタを設け、  すべてのポインタの進行方向が同じであり、かつ第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタの順で互いに追い抜かない制約の下で、
ブロックに対する書込の開始後、該ブロックを示す第１の先行ポインタを次のブロックに進め、
第２の先行ポインタにより示されるブロックの書込の完了後、第２の先行ポインタにより示されるブロックから連続し、かつ書込完了状態にあるブロックのうち、第２の先行ポインタから最も離れたブロックの次のブロックに第２の先行ポインタを進め、
ブロックに対する読出の開始後、該ブロックを示す第１の追尾ポインタを次のブロックに進め、
第２の追尾ポインタにより示されるブロックの読出の完了後、第２の追尾ポインタにより示されるブロックから連続し、かつ読出完了状態にあるブロックのうち、第２の追尾ポインタから最も離れたブロックの次のブロックに第２の追尾ポインタを進めることを特徴とするバッファ管理方法。
【請求項３】
書込完否情報を、バッファに同時にアクセス可能なプロデューサの分の、第２の先行ポインタにより示されるブロックを起点として連続したブロックのみに対して持ち、
読出完否情報を、バッファに同時にアクセス可能なコンシューマの分の、第２の追尾ポインタにより示されるブロックを起点として連続したブロックのみに対して持つことを特徴とする請求項２記載のバッファ管理方法。
【請求項４】
前記処理主体は、プロセッサであり、
ブロック状態情報の更新および／またはポインタの進行は、書込または読出を行うプロセッサ、あるいは書込または読出を行ったプロセッサにより行われることを特徴とする請求項１から３のいずれか１項記載のバッファ管理方法。
【請求項５】
ブロック状態情報を、各ブロックについて２ビットを割り当てたビットマップとして保持し、
不可分操作によってビットマップの更新を行うことを特徴とする請求項１から４のいずれか１項記載のバッファ管理方法。
【請求項６】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理する装置であって、
使用中、書込完了、読出完了のいずれの状態にあるかをブロックに対応づけて示すブロック状態情報を保持するブロック状態情報保持部と、
ブロック状態情報を、書込と読出の進行に伴って更新するブロック状態更新部と、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す先行ポインタと追尾ポインタを設けるポインタ設置部と、
２つのポインタが同じ方向に進行し、かつ互いに追い抜かない制約の下で、
先行ポインタにより示されるブロックに対する書込の開始後、次のブロックが読出完了状態にある場合に限り、先行ポインタを次のブロックに進め、
追尾ポインタにより示されるブロックに対する読出の開始後、次のブロックが書込完了状態にある場合に限り、追尾ポインタを次のブロックに進めるポインタ進行部とを有することを特徴とするバッファ管理装置。
【請求項７】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理する装置であって、
書込完了かそれ以外かをブロックに対応づけて示す書込完否情報と、読出完了かそれ以外かをブロックに対応づけて示す読出完否情報とを含むブロック状態情報を保持するブロック状態情報保持部と、
ブロック状態情報を更新するブロック状態情報更新部と、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタを設けるポインタ設置部と、
すべてのポインタの進行方向が同じであり、かつ第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタの順で互いに追い抜かない制約の下で、
ブロックに対する書込の開始後、該ブロックを示す第１の先行ポインタを次のブロックに進め、
第２の先行ポインタにより示されるブロックの書込の完了後、第２の先行ポインタにより示されるブロックから連続し、かつ書込完了状態にあるブロックのうち、第２の先行ポインタから最も離れたブロックの次のブロックに第２の先行ポインタを進め、
ブロックに対する読出の開始後、該ブロックを示す第１の追尾ポインタを次のブロックに進め、
第２の追尾ポインタにより示されるブロックの読出の完了後、第２の追尾ポインタにより示されるブロックから連続し、かつ読出完了状態にあるブロックのうち、第２の追尾ポインタから最も離れたブロックの次のブロックに第２の追尾ポインタを進めるポインタ進行部とを有することを特徴とするバッファ管理装置。
【請求項８】
書込状態情報情報保持部は、バッファに同時にアクセス可能なプロデューサの分の、第２の先行ポインタにより示されるブロックを起点として連続したブロックのみに対して書込完否情報を保持し、
バッファに同時にアクセス可能なコンシューマの分の、第２の追尾ポインタにより示されるブロックを起点として連続したブロックのみに対して読出完否情報を保持することを特徴とする請求項７記載のバッファ管理装置。
【請求項９】
前記処理主体は、プロセッサであり、
ブロック状態情報更新部および／またはポインタ進行部は、書込または読出を行うプロセッサ、あるいは書込または読出を行ったプロセッサにより構成されることを特徴とする請求項６から８のいずれか１項記載のバッファ管理装置。
【請求項１０】
ブロック状態情報保持部は、ブロック状態情報として、各ブロックについて２ビットを割り当てたビットマップ保持し、
ブロック状態更新部は、不可分操作によってビットマップの更新を行うことを特徴とする請求項６から９のいずれか１項記載のバッファ管理装置。
【請求項１１】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理するためのプログラムであって、
使用中、書込完了、読出完了のいずれの状態にあるかをブロックに対応づけてなり、書込と読出の進行に伴って更新されるブロック状態情報を保持する機能と、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す先行ポインタと追尾ポインタを設ける機能と、
２つのポインタが同じ方向に進行し、かつ互いに追い抜かない制約の下で、
先行ポインタにより示されるブロックに対する書込の開始後、次のブロックが読出完了状態にある場合に限り、先行ポインタを次のブロックに進め、
追尾ポインタにより示されるブロックに対する読出の開始後、次のブロックが書込完了状態にある場合に限り、追尾ポインタを次のブロックに進める機能とをコンピュータに実行せしめることを特徴とするプログラム。
【請求項１２】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理するためのプログラムであって、
読出完了かそれ以外かをブロックに対応づけてなり、書込と読出の進行に伴って更新されるブロック状態情報を保持する機能と、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタを設ける機能と、
すべてのポインタの進行方向が同じであり、かつ第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタの順で互いに追い抜かない制約の下で、
ブロックに対する書込の開始後、該ブロックを示す第１の先行ポインタを次のブロックに進め、
第２の先行ポインタにより示されるブロックの書込の完了後、第２の先行ポインタにより示されるブロックから連続し、かつ書込完了状態にあるブロックのうち、第２の先行ポインタから最も離れたブロックの次のブロックに第２の先行ポインタを進め、
ブロックに対する読出の開始後、該ブロックを示す第１の追尾ポインタを次のブロックに進め、
第２の追尾ポインタにより示されるブロックの読出の完了後、第２の追尾ポインタにより示されるブロックから連続し、かつ読出完了状態にあるブロックのうち、第２の追尾ポインタから最も離れたブロックの次のブロックに第２の追尾ポインタを進める機能とをコンピュータ実行せしめることを特徴とするプログラム。
【請求項１３】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理するためのプログラムを記憶した記憶媒体であって、
前記プログラムは、
使用中、書込完了、読出完了のいずれの状態にあるかをブロックに対応づけてなり、書込と読出の進行に伴って更新されるブロック状態情報を保持する機能と、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す先行ポインタと追尾ポインタを設ける機能と、
２つのポインタが同じ方向に進行し、かつ互いに追い抜かない制約の下で、
先行ポインタにより示されるブロックに対する書込の開始後、次のブロックが読出完了状態にある場合に限り、先行ポインタを次のブロックに進め、
追尾ポインタにより示されるブロックに対する読出の開始後、次のブロックが書込完了状態にある場合に限り、追尾ポインタを次のブロックに進める機能とをコンピュータに実行せしめることを特徴とする記憶媒体。
【請求項１４】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理するためのプログラムを記憶した記憶媒体であって、
前記プログラムは、
書込完了かそれ以外か、読出完了かそれ以外かをブロックに対応づけてなり、書込と読出の進行に伴って更新されるブロック状態情報を保持する機能と、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタを設ける機能と、
すべてのポインタの進行方向が同じであり、かつ第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタの順で互いに追い抜かない制約の下で、
ブロックに対する書込の開始後、該ブロックを示す第１の先行ポインタを次のブロックに進め、
第２の先行ポインタにより示されるブロックの書込の完了後、第２の先行ポインタにより示されるブロックから連続し、かつ書込完了状態にあるブロックのうち、第２の先行ポインタから最も離れたブロックの次のブロックに第２の先行ポインタを進め、
ブロックに対する読出の開始後、該ブロックを示す第１の追尾ポインタを次のブロックに進め、
第２の追尾ポインタにより示されるブロックの読出の完了後、第２の追尾ポインタにより示されるブロックから連続し、かつ読出完了状態にあるブロックのうち、第２の追尾ポインタから最も離れたブロックの次のブロックに第２の追尾ポインタを進める機能とをコンピュータ実行せしめることを特徴とする記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数の処理主体を有しうるシステムにおける各処理主体間でデータを授受するためのバッファを管理する方法およびバッファ管理装置に関する。
【背景技術】
【０００２】
１つのシステムに複数のプロセッサを搭載したマルチプロセッサシステムは、並列に、あるいは協調して処理を実行して処理全体の高速化を図ることができる。並列協調処理にはプロセッサ間のデータの授受が伴い、プロデューサと呼ばれるプロセッサにより生成されたデータは、コンシューマと呼ばれるプロセッサに渡され、コンシューマにより処理される。プロデューサとコンシューマとの間のデータの授受の工夫次第、システム全体の効率が変わってくる。
【０００３】
また、マルチプロセッサシステムに限らず、マルチタスク（プロセス、スレッドなどを含む）環境において、タスク間でデータの授受が行われる。本明細書では、以下の説明において、互いにデータの授受が行われるプロセッサ、タスクなどを処理主体という。マルチタスクの場合おいて、タスクがプロデューサかコンシューマになる。プロセッサ間のデータ授受と同じように、タスク間のデータ授受の工夫次第、システム全体の効率が変わってくる。
【発明の開示】
【発明が解決しようとする課題】
【０００４】
本発明は上記事情に鑑みてなされたものであり、その目的は、複数の処理主体を有しうるシステムにおいて、処理主体間でデータを授受するためのバッファを管理して処理効率を向上させることができるバッファ管理技術を提供することにある。
【課題を解決するための手段】
【０００５】
本発明にかかる第１の態様は、複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理する方法である。この方法は、最も先に書込がなされるブロックに対して、該ブロックを示す先行ポインタと追尾ポインタを設け、使用中、書込完了、読出完了のいずれの状態にあるかをブロックに対応づけて示すブロック状態情報を保持する。そして、最も先に書込がなされるブロックに対する書込の開始後、書込と読出の進行にしたがって、ポインタの位置と、ブロック状態情報を更新する。
【０００６】
ポインタの進行については、２つのポインタが同じ方向に進行し、かつ互いに追い抜かない制約の下で、先行ポインタにより示されるブロックに対する書込の開始後、次のブロックが読出完了状態にある場合に限り、先行ポインタを次のブロックに進める。追尾ポインタにより示されるブロックに対する読出の開始後、次のブロックが書込完了状態にある場合に限り、追尾ポインタを次のブロックに進める。
【０００７】
なお、本発明において、「処理主体」とは、データを処理する主体を意味し、一時的な格納場所からデータを読み出して処理することが可能なもの、または処理したデータを一時的な格納場所に書き込むことが可能なものである。この処理主体は、マルチプロセッサシステムにおける各々のプロセッサに限らず、タスク、プロセス、スレッドなどを含むものである。
【０００８】
以下の説明において、この方法を第１の方法という。
【０００９】
複数の処理主体を有しうるシステムにおいて、各処理主体間のデータ授受にバッファを利用する方法が考えられる。バッファを用いれば、プロデューサは、処理が完了したデータをバッファに書き込み、コンシューマは、バッファからデータを読み出して処理することができるため、システム全体の処理効率の向上を図れる。
【００１０】
このようなバッファの管理において、データを保護するために、１つの処理主体がバッファを使用しているとき、バッファはほかの処理主体により修正されることがないように、バッファをロックする方法が考えられる。しかし、バッファがロックされてしまっては、バッファの中には、プロデューサによる書込が完了したデータがある場合でも、コンシューマはロックが解除されるまでそのデータを読み出すことができない。プロデューサについても同じく、バッファがロックされているときに、バッファの中には、データを書込ことができるブロックがある場合においても、このプロデューサはロックが解除されるまで待たなければならない。複数の処理主体が同時にバッファを使用すること、すなわちマルチアクセスができれば、システムの処理効率が一層向上すると考えられる。
【００１１】
本発明の第１の方法は、所定の順序で循環使用される複数のブロックを有するバッファに対して、安全なマルチアクセスを実現する。この方法は、使用中か、書込完了か、読出完了かのいずれかを示すブロック状態情報を更新しながら保持するとともに、先行ポインタと追尾ポインタが同じ方向に進行し、かつ互いに追い抜かない制約の下で先行ポインタと追尾ポインタを進める。
【００１２】
ここで、ブロック状態情報の保持は、マルチアクセスを実現するうえで大きな利益をもたらす。
【００１３】
先行ポインタについては、先行ポインタにより示されているブロックに対する書込の開始後、次のブロックが読出完了状態にある場合に限り、先行ポインタを次のブロックに進める。ここで、先行ポインタを進行するタイミングは、システムの設計に委ねる。
【００１４】
たとえば、先行ポインタにより示されているブロックに対する書込の開始時に、次のブロックが既に読出完了状態にあれば、書込の開始と共に先行ポインタを次のブロックに進める。その一方、先行ポインタにより示されているブロックに対する書込の開始時に、次のブロックがまだ読出完了状態ではなければ、書込の開始後に、次のブロックが読出完了状態になった時点で先行ポインタを次のブロックに進めるシステムが考えられる。この場合、先行ポインタにより示されるブロックが、読出完了状態と、最後に書込が開始されたブロックが書込中であることを示す使用中状態と、このブロックの書込が完了したことを示す書込完了状態のいずれかにある。次のプロデューサが先行ポインタを見い出して、このブロックが読出完了状態にあるか否かを確認し、読出完了状態にあれば書込を行うことができる。
【００１５】
これに対してより単純なシステムとして、先行ポインタは最後に書込が開始されたブロックを示すようにし、次のプロデューサが先行ポインタを見い出すとともに、先行ポインタにより示されるブロックの次のブロックが読出完了状態にあるか否かを確認し、読出完了状態にあれば、先行ポインタを次のブロックに進めるとともに、次のブロックに対する書込を開始するシステムが考えられる。
【００１６】
いずれのシステムでも、プロデューサによる書込中であっても、他のプロデューサは、先行ポインタと、ブロック状態情報とに基づいて、ほかのブロックの安全な書込を行うことができる。
【００１７】
コンシューマについて同じ状況であり、追尾ポインタとブロック状態情報の併用によって、バッファをロックせずに複数のコンシューマの同時読出が安全にできる。
【００１８】
これによって、処理主体による安全なマルチアクセスを実現することができる。
【００１９】
本発明にかかる第２の態様も、複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理する方法である。この方法も、安全なマルチアクセスを実現するものであり、以下において、この方法を第２の方法という。
【００２０】
この第２の方法は、プロデューサが書込を行うべきブロックの指定、コンシューマが読出を行うべきブロックの指定については、第１の方法と同じように、先行ポインタと追尾ポインタを用いる。ここで、後述する第２の先行ポインタと第２の追尾ポインタとを区別するために、第１の方法における先行ポインタと追尾ポインタと同じ役割を担う先行ポインタと追尾ポインタを、それぞれ第１の先行ポインタと第１の追尾ポインタと呼ぶ。
【００２１】
第２の方法は、最も先に書込がなされるブロックに対して、該ブロックを示す第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタを設け、書込完了かそれ以外か、読出完了かそれ以外かをブロックに対応づけて示すブロック状態情報を保持する。そして、最も先に書込がなされるブロックに対する書込の開始後、書込と読出の進行にしたがって、ポインタの位置と、ブロック状態情報を更新する。
【００２２】
第２の先行ポインタは、第１の先行ポインタに追従し、それにより示されるブロックに対する書込が終了した後、先に進めるポインタである。
【００２３】
第２の追尾ポインタは、第１の追尾ポインタに追従し、それにより示されるブロックに対する読出が完了した後、先に進めるポインタである。
【００２４】
また、第２の方法において、この４つのポインタは、第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタの順で、進行方向が同じ、かつ互いに追い抜かない制約の下で進められる。
【００２５】
すなわち、この第２の方法によれば、ポインタの進行方向に沿って、第１の追尾ポインタと第２の先行ポインタとの間のブロックは、書込完了状態にあるブロックであり、第１の先行ポインタと第２の追尾ポインタとの間のブロックは、読出完了状態にあるブロックである。
【００２６】
これによって、第１の先行ポインタを先に進める際に、第２の追尾ポインタまでのブロックが書込完了状態にあるブロックであるので、進め先のブロックが書込完了しているか否かを確認する必要がない。同じように、第１の追尾ポインタを先に進める際に、第２の先行ポインタまでのブロックが読出完了状態にあるブロックであるので、進め先のブロックが読出完了しているか否かを確認する必要がない。
【００２７】
すなわち、第１の先行ポインタ、第２の追尾ポインタを用いることによって、書込を行うべきブロックを示すとともに、バッファをロックせずに、読出中のデータを保護することができる。
【００２８】
コンシューマについても同じ状況であり、第１の追尾ポインタ、第２の先行ポインタを用いることによって、コンシューマが読出を行うべきブロックを示すとともに、バッファをロックせずに、書込中のデータを保護することができる。
【００２９】
ここで、第２の先行ポインタと第２の追尾ポインタの進め先について考える。
【００３０】
第２の先行ポインタは、それによって示されるブロックに対する書込の完了後に進められるポインタである。第２の先行ポインタから第１の先行ポインタまでの間、書込中のブロックと、書込が完了したブロックがあり、第１の先行ポインタから離れたブロックほど、書込が早く開始されている。第２の先行ポインタと第１の先行ポインタにより示されるブロックがそれぞれＡブロックとＦブロックであり、その間には、ポインタの進行方向に沿って配列されているＢ、Ｃ、Ｄ、Ｅの４つのブロックがある場合を例にする。この６つのブロックの書込開始順は、Ａ、Ｂ、Ｃ、Ｄ、Ｅ、Ｆとなっている。
【００３１】
先に書込が開始されたブロックは、先に書込が完了されるとは限らない。たとえば、第２の先行ポインタにより示されるＡブロックの書込中に、ＢブロックとＣブロックの書込が完了する場合がある。Ａブロックの書込が完了したとき、第２の先行ポインタを次にブロック（Ｂブロック）に進むだけでは、Ｃブロックは既に書込が完了したのに、コンシューマによる使用ができない。
【００３２】
そこで、本発明の第２の方法は、ブロック状態情報に含まれ、書込完了か否かを示す情報を保持することによって、Ａブロックの書込が完了したとき、書込完了か否かを示す情報を参照して、第２の先行ポインタにより示されるブロック（ここの例ではＡブロック）から連続し、かつ読出完了状態にあるブロック（ここの例ではＢブロックとＣブロック）のうち、第２の追尾ポインタから最も離れたブロック（Ｃブロック）の次のブロック（Ｄブロック）に進める。これによって、ブロックの書込が開始順通りに完了しない場合においても、第２の先行ポインタを、進めることが可能な範囲内の最も先のブロックに進めることができるので、書込が完了したブロックを早くコンシューマに供することができる。
【００３３】
第２の追尾ポインタにおいても同じであり、読出完了か否かを示す情報を保持することによって、ブロックの読出が開始順通りに完了しない場合においても、第２の追尾ポインタを最も先のブロックに進めることができるので、読出が完了したブロックを早くプロデューサに供することができる。
【００３４】
さらに、書込完了したか否かを示す情報がなければ、プロデューサは、書込が完了しても、処理を終了することができない場合がある。たとえば、上記の例ではＢブロックに対する書込を行うプロデューサは、書込が完了しても、第２の先行ポインタを進めるために、Ａブロックの書込が完了し、第２の先行ポインタがＢブロックに進められてくるまで、処理を終了することができない。Ｃブロックのプロデューサも同じである。これでは、Ｂブロック、Ｃブロックのプロデューサは、書込が完了しても処理済みのデータを手放すことができないので、システムの処理効率が低下する。
【００３５】
ここで、本発明の第２の方法のように、書込完了したか否かを示す情報を設けることによって、書込が完了したプロデューサたとえばＢブロックのプロデューサが、書込完了時にこの情報を更新すれば、Ａブロックのプロデューサは、情報を参照して第２の先頭ポインタを進めることができるので、Ｂブロックのプロデューサは、Ａブロックの書込完了を待つ必要がなく、書込が完了次第、処理を終了することができる。
【００３６】
読出についても同じ状況である。
【００３７】
以上の説明の通り、本発明の第２の方法も、安全なマルチアクセスを実現することができる。また、書込または読出が開始順通りに完了しなくても、システムの処理効率の低下を防ぐことができる。
【００３８】
なお、以上の構成要素の任意の組合せ、本発明をシステム、プログラム、プログラムを記憶した記憶媒体として表現したものも、本発明の態様としては有効である。
【発明の効果】
【００３９】
本発明は、マルチプロセッサや、マルチタスクなど、複数の処理主体を有しうるシステムにおける処理主体間のデータの授受において有利である。
【発明を実施するための最良の形態】
【００４０】
図１は、本発明の第１の実施形態となるマルチプロセッサシステム１００の構成を示す。マルチプロセッサシステム１００は、複数の処理ユニット１０Ａ、複数の処理ユニット１０Ｂと、共有メモリ５０と有し、各処理ユニットは、共有メモリ５０に接続されている。
【００４１】
マルチプロセッサシステムにおいて、各々のプロセッサがそれぞれの処理ユニットに含まれる形で存在する。これらの処理ユニットは主処理ユニットとサブ処理ユニットとに分けることができる。サブ処理ユニットのすべてが同一のアーキテクチャを用いて実現されてもよく、それぞれ異なる構成を有してもよい。主処理ユニットは、サブ処理ユニットに対してローカルに、たとえばサブ処理ユニットと同一のチップ、同一のパッケージ、同一の回路基板、同一の製品に位置してもよいし、サブ処理ユニットに対してリモートに、たとえばバスやインターネットなどの通信ネットワークを介して接続可能な異なる製品に位置してもよい。同様に、サブ処理ユニットは、互いにローカルにまたはリモートに位置してもよい。
【００４２】
図１に示すマルチプロセッサシステム１００における複数の処理ユニット１０Ａ、処理ユニット１０Ｂには、主処理ユニットが含まれてもよい。
【００４３】
各処理ユニット１０Ａは、プロセッサ１２Ａ、ローカルメモリ１４Ａを有し、各処理ユニット１０Ｂは、プロセッサ１２Ｂ、ローカルメモリ１４Ｂを有する。プロセッサ１２Ａは、ローカルメモリ１４Ａに対してデータを読み書きすることができ、プロセッサ１２Ｂは、ローカルメモリ１４Ｂに対してデータを読み書きすることができる。
【００４４】
マルチプロセッサシステム１００は、ストリームデータの転送に関するシステムであり、各処理ユニット１０Ａは、所定の転送単位のストリームデータ（以下、単にデータという）を、共有メモリ５０に設けられた、後述するバッファ２０に書き込む。各処理ユニット１０Ｂは、処理ユニット１０Ａにより書き込まれたデータを読み出して転送する。ここで、処理ユニット１０Ａは、データをバッファ２０に書き込む側であるので、プロセッサ１２Ａはプロデューサとなる。処理ユニット１０Ｂは、データを読み出す側になるので、プロセッサ１２Ｂは、コンシューマである。
【００４５】
処理ユニット１０Ａまたは処理ユニット１０Ｂのうちのいずれか１つは、バッファ２０の使用に関して他の処理ユニットに対するサービスユニットの役割を担う。サービスユニットの役割としては、たとえばバッファ２０の初期状態の設定や、後述するポインタの初期設置などである。なお、このサービスユニットは、いずれの処理ユニットによって担当されてもよい。処理ユニット１０Ａまたは処理ユニット１０Ｂのうちに主処理ユニットがある場合には、このサービスユニットは、主処理ユニットによって担当されることが好ましいが、それに限定することがない。
【００４６】
図２は、共有メモリ５０を示す。共有メモリ５０は、バッファ２０と、ビットマップ３０を有し、バッファ２０に対して、先行ポインタ４４と追尾ポインタ４８が設けられている。
【００４７】
図３は、バッファ２０を示す。バッファ２０は、連続した複数のブロックに分けられており、それぞれのブロックは所定の順序たとえば図中矢印Ｌにより示される順序で順次循環使用される。ここで、最も先に書込がなされるブロックは図３に示す０番のブロックであり、先行ポインタ４４と追尾ポインタ４８は、各ブロックが循環使用されるときに、０番のブロックより１つ先に使用されるブロック（図中ｎ番のブロック）を初期位置とする。
【００４８】
なお、最も先にどのブロックから書込を開始するか、ポインタの設置、ポインタの初期位置の決定などは、サービスユニットによって行われる。
【００４９】
図４は、初期状態におけるビットマップ３０を示す。図示のように、ビットマップ３０は、それぞれバッファ２０の各ブロックに１ビットを割り当てたビット列３０ａとビット列３０ｂとを有し、ブロックが使用中（書込中または読出中）か、書込完了か、読出完了かを示すブロック状態情報である。
【００５０】
また、図４に示すように、ビット列３０ａの各ビットの初期値が１であり、ビット列３０ｂの各ビットの初期値が０である。
【００５１】
図５は、いずれかのプロデューサ１２Ａは、ストリームデータをバッファ２０に書き込むのに当たり、先行ポインタ４４を移動する処理を示す図である。このプロデューサ１２Ａは、まず、バッファ２０における先行ポインタ４４を検索する。先行ポインタ４４は、ｎ番のブロックを示しているので、プロデューサ１２Ａは、ビット列３０ａを参照し、ｎ番のブロックの次のブロック、すなわち０番のブロックに対応するブロックの値を確認する。ここで、０番のブロックに対応するビットの値が初期値の１であるので、プロデューサ１２Ａは、先行ポインタ４４を０番のブロックに進めて、０番に対する書込を開始するとともに、ビット列３０番における、０番のブロックに対応するビットの値を０に変更する。
【００５２】
このとき、ほかのいずれかのプロデューサ１２Ａは、書込を行う準備ができた場合、このプロデューサ１２Ａも、まずバッファ２０における先行ポインタ４４を検索する。０番目のブロックの位置に先行ポインタ４４があるので、このプロデューサは、ビット列３０ａを参照し、１番目のブロックに対応するビットの値が１であるので、先行ポインタ４４を１番目のブロックに進め、１番目のブロックに対して書込を開始するとともに、ビット列３０ａにおける、１番目のブロックに対応するビットの値を０に変更する。
【００５３】
同じように、書込を行う準備ができたほかののプロデューサ１２Ａも、先行ポインタ４４を２番目のブロックに進め、２番目のブロックに対して書込を開始するとともに、ビット列３０ａにおける、２番目のブロックに対応するビットの値を０に変更する処理を行うことができる。
【００５４】
また、いずれかのブロックに対する書込が完了すれば、この書込を行ったプロデューサ１２Ａは、ビット３０列における、このブロックに対応するビットの値を１に変更する。ここで、０番と２番のブロックに対する書込が完了し、ビット列３０ｂにおける、０番と２番のブロックに対応するビットの値が１に変更されたとする。
【００５５】
いずれかのコンシューマ１２Ｂは、読出を開始するのに当たり、まず、バッファ２０における追尾ポインタ４８を検索する。初期状態では、追尾先行ポインタ４８は、ｎ番のブロックを示しているので、コンシューマ１２Ｂは、ビット列３０ｂを参照し、ｎ番のブロックの次のブロック、すなわち０番のブロックに対応するブロックの値を確認する。ここで、０番のブロックに対応するビットの値が０であれば、０番のブロックがまだ書込がなされていない初期状態か書込中かを示し、ビットの値が１であれば、０番のブロックが書込が完了されていることを示す。コンシューマ１２Ｂは、ビット列３０ｂにおける、０番のブロックに対応するビットの値が１である場合に限り、追尾ポインタ４８を０番ブロックに進め、０番のブロックに対する読出を開始するとともに、ビット列３０ｂにおける、０番のブロックに対応するビットの値を０に変更する。
【００５６】
図６は、このときのバッファ２０の状態およびビット列３０ａと３０ｂを示す。図示のように、この時点において、先行ポインタ４４は最後に書込を開始した２番のブロックを示し、追尾ポインタ４８は、最後に読出を開始した０番のブロックを示す。０番、１番のブロックは使用中であり、２番のブロックは書込完了状態にある。この状態は、ビット列３０ａとビット列３０ｂから読み取ることができ、これについては後述する。
【００５７】
その後、プロデューサ１２Ａとコンシューマ１２Ｂによる書込と読出が繰り返され、書込と読出の進行にしたがって、先行ポインタ４４と追尾ポインタ４８の位置、ビット列３０ａとビット列３０ｂは更新される。
【００５８】
ビット列３０ａの更新について、具体的には、ブロックに対する読出が完了すれば、このブロックのビット値は、読出を行ったコンシューマ１２Ｂにより１にセットされる。そして、このブロックに対する書込が開始すれば、そのビット値は、書込を開始したプロデューサ１２Ａにより０にリセットされる。
【００５９】
ビット列３０ｂの更新について、具体的には、ブロックに対する書込が完了すれば、このブロックのビット値は、書込を行ったプロデューサ１２Ａにより１にセットされる。そして、このブロックに対する読出が開始すれば、そのビット値は、読出を開始したプロデューサにより０にリセットされる。
【００６０】
これによって、ビット列３０ａのビット値とビット列３０ｂのビット値により、図７に示すように、ビットに対応するブロックは、使用中、書込完了、読出完了のいずれの状態にあるかを示すことができる。
【００６１】
また、先行ポインタ４４は、最後に書込が開始されたブロックを示し、プロデューサ１２Ａは、書込をするのにあたって、バッファ２０から先行ポインタ４４を検索するとともに、ビット列３０ａを参照して、先行ポインタ４４により示されるブロックの次のブロックが読出完了状態にあるか否かを確認する。ビット列３０ａにおけるこのブロックのビットの値が１であり、すなわちこのブロックが読出完了状態にあれば、先行ポインタ４４をこのブロックに進めて書込を開始するとともに、ビット列３０ａにこのブロックに対応するビットの値を０にリセットする。
【００６２】
追尾ポインタ４８は、最後に読出が開始されたブロックを示し、コンシューマ１２Ｂは、読出をするのにあたって、バッファ２０から追尾ポインタ４８を検索するとともに、ビット列３０ｂを参照し、追尾ポインタ４８により示されるブロックの次のブロックが書込完了状態にあるか否かを確認する。ビット列３０ｂにおけるこのブロックのビットの値が１であり、すなわちこのブロックが書込完了状態にあれば、追尾ポインタをこのブロックに進めて読出を開始するとともに、ビット列３０ｂにこのブロックに対応するビットの値を０にリセットする。
【００６３】
なお、プロデューサ１２Ａとコンシューマ１２Ｂは、２つのポインタが同じ方向に進行し、互いに追いぬかないという制約の下でポインタの進行を行う。
【００６４】
このように、図１に示すマルチプロセッサシステム１００によれば、ビットマップ３０と２つのポインタとを併用することによって、安全なマルチアクセスを実現することができる。
【００６５】
図８は、発明の第２の実施形態となるマルチプロセッサシステム２００の構成を示す。  マルチプロセッサシステム２００は、複数の処理ユニット１１０と、共有メモリ５０と有し、各処理ユニット１１０は、共有メモリ１５０に接続されている。マルチプロセッサシステム２００における複数の処理ユニット１１０には、主処理ユニットが含まれてもよい。
【００６６】
各処理ユニット１１０は、プロセッサ１１２、ローカルメモリ１１４を有する。プロセッサ１１２は、ローカルメモリ１１４に対してデータを読み書きすることができる。
【００６７】
マルチプロセッサシステム２００は、各処理ユニット１１０が並列に処理を行い、それぞれのプロセッサ１１２は、処理したデータを、後述するバッファ１２０に書き込むとともに、書き込んだ後には、バッファ１２０から、ほかの処理ユニット１１０により書き込まれたデータを自分のローカルメモリ１１４にコピーして処理を行う。すなわち、処理ユニット１１０に含まれるプロセッサ１１２は、プロデューサとコンシューマのいずれにもなりうる。以下の説明において、同じプロセッサでも、データを書き込む側であるか読み出す側であるかによって、それをプロデューサまたはコンシューマという。
【００６８】
処理ユニット１１０うちのいずれか１つは、バッファ１２０の使用に関して他の処理ユニットに対するサービスユニットの役割を担う。サービスユニットの役割としては、たとえばバッファ１２０の初期状態の設定や、後述するポインタの初期設置などである。なお、このサービスユニットは、いずれの処理ユニットによって担当されてもよい。処理ユニット１１０のうちに主処理ユニットがある場合には、このサービスユニットは、主処理ユニットによって担当されることが好ましいが、それに限定することがない。
【００６９】
図９は、共有メモリ１５０を示す。共有メモリ１５０は、バッファ１２０と、ビット列１３０ａおよびビット列１３０ｂを有し、バッファ１２０に対して、第１の先行ポインタ１４４、第２の先行ポインタ１４５、第１の追尾ポインタ１４８、第２の追尾ポインタ１４９が設けられている。なお、ビット列１３０ａは、同時にアクセス可能なプロデューサの数の分のビット幅を有し、ビット列１３０ｂは、同時にアクセス可能なコンシューマの数の分のビット幅を有する。ここで、例として、８つの処理ユニット１１０があるとする。それぞれのプロセッサ１１２はプロデューサとコンシューマのいずれにもなりうるので、ここで、ビット列１３０ａとビット列１３０ｂのビット幅は８ビットとなる。
【００７０】
図１０は、バッファ１２０を示す。バッファ１２０は、連続した複数のブロックに分けられており、それぞれのブロックは所定の順序たとえば図中矢印Ｌにより示される順序で順次循環使用される。ここで、最も先に書込がなされるブロックは図１０に示す０番のブロックであり、すべてのポインタは、各ブロックが循環使用されるときに、０番のブロックより１つ先に使用されるブロック（図中ｎ番のブロック）を初期位置とする。
【００７１】
なお、最も先にどのブロックから書込を開始するか、ポインタの設置、ポインタの初期位置の決定などは、サービスユニットによって行われる。
【００７２】
ビット列１３０ａの各ビットは、その値が１であるときに、該ビットに対応するブロックが書込完了状態にあることを示し、その値が０であるときに、該ビットに対応するブロックが書込完了状態以外の状態にあることを示す。
【００７３】
ビット列１３０ｂの各ビットは、その値が１であるときに、該ビットに対応するブロックが読出完了状態にあることを示し、その値が０であるときに、該ビットに対応するブロックが読出完了状態以外の状態にあることを示す。
【００７４】
図１１は、初期状態におけるビット列１３０ａとビット列１３０ｂを示す。図示のように、２つのビット列とも、初期状態において各ビットの値が０となっている。
【００７５】
図１２は、いずれかの処理ユニット１１０により書込を開始する前に、サービスユニットが行う処理を示す図である。図示のように、サービスユニットは、いずれかの処理ユニットがデータをバッファ１２０に書き込むのに先立って、第１の先行ポインタ１４４と第２の先行ポインタ１４５を初期位置のｎ番ブロックから、先頭の０番のブロックに移動するとともに、ビット列１３０ａの各ビットは、０番のブロックから７番のブロックまで計８個のブロックに割り当てる。
【００７６】
ここで、いずれかのプロデューサ１１２は、データの書込を行うために、まず、バッファ１２０における第１の先行ポインタ１４４を検索する。この場合、第１の先行ポインタ１４４が０番のブロックを示しているので、プロデューサ１１２は、自分のローカルメモリ１１４から０番のブロックにデータをコピーすることによって、書込を行う。また、０番のブロックに対する書込の開始に伴って、このプロデューサ１１２は、第１の先行ポインタ１４４を次のブロック、すなわち１番のブロックに進める。
【００７７】
このとき、ほかのいずれかのプロデューサ１１２は、書込を行う準備ができた場合、このプロデューサ１１２も、まずバッファ１２０における第１の先行ポインタ１４４を検索する。１番目のブロックの位置に第１の先行ポインタ１４４があるので、このプロデューサ１１２は１番目のブロックに対して書込を開始するとともに、第１の先行ポインタ１４４を次のブロック、すなわち２番のブロックに進める。このときの各ポインタの位置、ビット列１３０ａの各ビットの値は、図１３に示す。第１の先行ポインタ１４４は、２番のブロックにあり、第２の先行ポインタ１４５は、０番のブロックにある。ビット列１３０ａの各ビットの値は、０のままであり、０番のブロックから７番のブロックまで、書込が完了したブロックがないことを示している。
【００７８】
０番のブロックに対する書込が完了した際に、書込を行ったプロデューサ１１２は、第２の先行ポインタ１４５を進める。その進め先については後述する。また、第２の先行ポインタ１４５を進めるとともに、ビット列１３０ａを、進め先のブロックから連続した８個のブロックに割り当てる。
【００７９】
サービスユニットは、ビット列１３０ａにおいて、０番のブロックのビットの値が１にセットされると、第１の追尾ポインタ１４８と第２の追尾ポインタ１４９を０番のブロックに移動するとともに、ビット列１３０ｂの各ビットは、０番のブロックから７番のブロックまで計８個のブロックに割り当てる。これをもって、バッファ１２０の管理は各処理ユニットに任せられる。
【００８０】
その後、プロデューサ１１２とコンシューマ１１２による書込と読出が繰り返され、書込と読出の進行にしたがって、４つのポインタの位置、ビット列１３０ａとビット列１３０ｂは更新される。なお、以下の説明において、プロデューサ１１２とコンシューマ１１２は、４つのポインタの進行方向が同じであり、第１の先行ポインタ１４４、第２の先行ポインタ１４５，第１の追尾ポインタ１４８、第２の追尾ポインタ１４９の順で互いに追い抜かない制約の下でポインタを進めるようにしている。
【００８１】
プロデューサ１１２は、データの書込を行うのにあたって、バッファ１２０において第１の先行ポインタ１４４を検索して、第１の先行ポインタ１４４により示されるブロックに対して書込を行う。また、書込の開始に伴って、第１の先行ポインタ１４４を次のブロックに進める。
【００８２】
第２の先行ポインタ１４５により示されるブロック以外のブロックに対する書込が終了したとき、この書込を行ったプロデューサ１１２は、ビット列１３０ａにおいて、対応するビットの値を１にセットして処理を終了する。
【００８３】
コンシューマ１１２は、データの読出を行うのにあたって、バッファ１２０において第１の追尾ポインタ１４８を検索して、第１の追尾ポインタ１４８により示されるブロックに対して読出を行う。また、読出の開始に伴って、第１の追尾ポインタ１４８を次のブロックに進める。
【００８４】
第２の追尾ポインタ１４９により示されるブロック以外のブロックに対する読出が終了したとき、この読出を行ったコンシューマ１１２は、ビット列１３０ｂにおいて、対応するビットの値を１にセットして処理を終了する。
【００８５】
第２の先行ポインタ１４５は、このポインタにより示されるブロックの書込の終了後に進められるポインタであり、第２の追尾ポインタ１４９は、このポインタにより示されるブロックの読出の終了後に進められるポインタである。ここで、図１４の状態を例にして、第２の追尾ポインタ１４９により示されるブロックの読出が終了時に、コンシューマ１１２が行う処理について説明する。
【００８６】
図１４の例では、第１の先行ポインタ１４４は、９番のブロックまでに進められており、第２の先行ポインタ１４５は、１７番のブロックまでに進められている。第１の追尾ポインタ１４８は、１５番のブロックまでに進められており、１４番までのブロックに対して読出が開始されていることを示す。第２の追尾ポインタ１４９は、１１番のブロックまでに進められており、１０番までのブロックの読出が完了されていることを示す。
【００８７】
ここで、１１番から１４番までの４つのブロックは、既に読出が開始されているが、いずれもまだ完了していないとする。ビット列１３０ｂは、１１番からの８つのブロックに対して割り当てられており、すべてのビットの値が０である。ビット列１３０ｂは、第２の追尾ポインタ１４９の進め先を決定するためのものであり、第２の追尾ポインタは第１の追尾ポインタ１４８を追い抜くことがないので、第１の追尾ポインタより先のブロックのビットについては値を全部０にする。
【００８８】
１１番から１４番までの４つのブロックは、読出の開始順が１１、１２、１３、１４となっている。しかし、終了順は必ずしも開始順通りではない。ここで、読出の終了順を１３、１２、１１、１４に仮定する。
【００８９】
１１番、１２番、１４番のブロックの読出中に、１３番のブロックに対する読出が完了すると、読出を行ったコンシューマ１１２は、ビット列１３０ｂにおける、１３番のブロックに対応するビット（この例では３番のビット）の値を１にセットして処理を終了する。
【００９０】
１２番のブロックのコンシューマ１１２も、読出が完了すると、ビット列１３０ｂにおける、１２番のブロックに対応するビット（ここでは２番のビット）の値を１にセットして処理を終了する。
【００９１】
その後、１１番のブロックの読出が完了する。１１番のブロックが第２の追尾ポインタ１４９により示されているので、１１番の読出を行ったコンシューマ１１２は、ビット列１３０ｂにおける、１１番に対応するビット（１番のビット）の値を１にセットするとともに、第２の先行ポインタの進め先を決めて進める。
【００９２】
このときのビット列１３０ｂの各ビットは、図１５に示すように、読出が完了したブロック、１１番、１２番、１３番の３つのブロックに対応するビットの値は１であり、そのほかのビットの値は０である。
【００９３】
進め先を決めるのにあたって、コンシューマ１１２は、アトミックコマンドたとえばｃｌｚを用いて、ビット列１３０ｂの先頭ビットを起点として、１の値が続いたビットの数を求める。図１５に示す例では、３という結果が得られる。コンシューマ１１２は、得られた結果の分、第２の追尾ポインタ１４９を進める。図１４に示す例では、第２の追尾ポインタ１４９は、１１番のブロックから１４番のブロックに進められる。
【００９４】
さらに、このコンシューマ１１２は、第２の追尾ポインタ１４９を進めた後に、ビット列１３０ｂを、第２の追尾ポインタ１４９の現在位置からの８個のブロックに割り当て、処理を終了する。
【００９５】
すなわち、第２の追尾ポインタ１４９により示されるブロックの読出の完了時、読出を行ったコンシューマ１１２は、ビット列１３２ｂにおける、このブロックに対応するビットの値を１にセットするとともに、第２の追尾ポインタ１４９により示されるブロックから連続し、かつ読出完了状態にあるブロックのうち、第２の追尾ポインタから最も離れたブロックの次のブロックに第２の追尾ポインタ１４９を進める。そして、ビット列１３０ｂを、第２の追尾ポインタ１４９の現在位置からの８個のブロックに割り当てる。
【００９６】
図１６は、このときにおけるポインタの位置、ビット列１３０ｂを示している。第２の追尾ポインタ１４９は１４番のブロックに進められており、ビット列１３０ｂは、１４番からの８つのブロックに対して割り当てられている。
【００９７】
第２の先行ポインタ１４５についても同じである。第２の先行ポインタ１４５により示されるブロックの書込の完了時、書込を行ったプロデューサ１１２は、ビット列１３２ａにおける、このブロックに対応するビットの値を１にセットするとともに、第２の先行ポインタ１４５により示されるブロックから連続し、かつ書込完了状態にあるブロックのうち、第２の先行ポインタ１４５から最も離れたブロックの次のブロックに第２の先行ポインタ１４５を進める。そして、ビット列１３０ａを、第２の先行ポインタ１４５の現在位置からの８個のブロックに割り当てて処理を終了する。
【００９８】
このように、図８に示すマルチプロセッサシステム２００によれば、４つのポインタと２つのビット列を用い、書込と読出の進行にしたがって、ポインタの位置とビット列を更新する。これによって、バッファをロックせずに、安全なマルチアクセスを実現している。さらに、書込または読出の完了順は開始順通りに完了しない場合でも、システムの効率低下を防ぐことができる。
【００９９】
また、書込が完了したかそれ以外かを示す情報（ビット列１３０ａ）を、第２の先行ポインタ１４５から連続した８個のブロックに対してのみ保持することによって、第２の先行ポインタ１４５を進める際に必要な情報を提供することができるとともに、ビット列１３０ａのビット幅を減らすことができる。ビット列１３０ｂについても同じである。これも、システムの処理効率の向上に貢献する。
【０１００】
さらに、第２の先行ポインタ１４５を進める際に、ビット列１３０ａのみを必要とし、第２の追尾ポインタ１４９を進める際に、ビット列１３０ｂのみを必要とする。ここで、ビット列１３０ａとビット列１３０ｂとを別々に保持することによって、第２の先行ポインタ１４５を進める際に、プロデューサは、ビット列１３０ａのみを有する領域を参照し、第２の追尾ポインタ１４９を進める際に、コンシューマは、ビット列１３０ｂのみを有する領域を参照することになるので、処理が簡単である。
【０１０１】
なお、この第２の実施形態に用いられたバッファの管理方法は、図８に示すようなマルチプロセッサシステムにのみならず、図１に示すようなストリームデータを転送するためのマルチプロセッサシステムなど、プロセッサ間でデータを授受するいかなるマルチプロセッサシステムに適用してもよい。
【０１０２】
図１７は、本発明の第３の実施形態となるマルチプロセッサシステム３００を示す。
【０１０３】
マルチプロセッサシステム３００は、複数の処理ユニット２１０と、共有メモリ２５０と有し、各処理ユニット２１０は、共有メモリ２５０に接続されている。マルチプロセッサシステム３００における複数の処理ユニット２１０には、主処理ユニットが含まれてもよい。
【０１０４】
各処理ユニット２１０は、プロセッサ２１２、ローカルメモリ２１４を有する。プロセッサ２１２は、ローカルメモリ２１４に対してデータを読み書きすることができる。
【０１０５】
マルチプロセッサシステム３００は、各処理ユニット２１０が並列に処理を行い、それぞれのプロセッサ２１２は、処理したデータを、後述するバッファ２２０に書き込むとともに、書き込んだ後には、バッファ２２０から、ほかの処理ユニット２１０により書き込まれたデータを自分のローカルメモリ２１４にコピーして処理を行う。すなわち、処理ユニット２１０に含まれるプロセッサ２１２は、プロデューサとコンシューマのいずれにもなりうる。以下の説明において、同じプロセッサでも、データを書き込む側であるか読み出す側であるかによって、それをプロデューサまたはコンシューマという。
【０１０６】
処理ユニット２１０うちのいずれか１つは、バッファ２２０の使用に関して他の処理ユニットに対するサービスユニットの役割を担う。サービスユニットの役割としては、たとえばバッファ２２０の初期状態の設定や、後述するビット列のの初期設置などである。なお、このサービスユニットは、いずれの処理ユニットによって担当されてもよい。処理ユニット２１０のうちに主処理ユニットがある場合には、このサービスユニットは、主処理ユニットによって担当されることが好ましいが、それに限定することがない。
【０１０７】
図１８は、共有メモリ２５０を示す。共有メモリ２５０は、バッファ２２０と、ビット列２３０と、ポインタキュー２４０とを有する。
【０１０８】
バッファ２２０は、連続した複数のブロックに分けられており、各ブロックに対して識別子（ここではブロック番号）が付与されている。
【０１０９】
ビット列２３０は、バッファ２２０に含まれるブロックの数の分のビット幅を有し、各ビットは、それぞれのブロックに対応している。なお、すべてのビットの初期値が０である。
【０１１０】
ポインタキュー２４０は、書込が完了したブロックの番号を、書込完了順に保持する。初期状態では、空になっている。
【０１１１】
いずれかのプロデューサ２１２は、書込を開始したいときに、書込をしてもいいブロックとして、ビット列２３０のうち、値が０であるビットに対応するブロックを選出し、このブロックに対して書込を開始する。ブロックに対する書込の開始に伴って、プロデューサ２１２は、ビット列２３０における、このブロックに対応するビットの値を１にセットする。
【０１１２】
書込が終了すると、プロデューサ２１２は、書込が終了したブロックの番号をポインタキュー２４０に入れて、処理を終了する。
【０１１３】
コンシューマ２１２は、読出を開始したいときに、ポインタキュー２４０を参照し、最も先に書込が完了したブロックの番号を、ポインタキュー２４０から削除するとともに、この番号に対応するブロックからデータを読み出す。読出が完了すると、ビット列２３０における、このブロックに対応するビットの値を０にリセットする。
【０１１４】
すなわち、ビット列２３０は、各ブロックが読出完了状態にあるかそれ以外の状態にあるかを示し、ポインタキュー２４０にあるか否かは、書込完了状態にあるかそれ以外の状態にあるかを示しており、書込完了状態にあるブロックが複数ある場合には完了順も示す。
【０１１５】
このように、マルチプロセッサシステム３００も、安全なマルチアクセスを実現している。
【０１１６】
もちろん、第３の実施形態に用いられたバッファの管理方法も、図１７に示すようなマルチプロセッサシステムにのみならず、図１に示すようなストリームデータを転送するためのマルチプロセッサシステムなど、プロセッサ間でデータを授受するいかなるマルチプロセッサシステムに適用してもよい。
【０１１７】
以上、本発明を実施の形態をもとに説明した。実施の形態は例示であり、本発明の主旨から逸脱しない限り、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。
【０１１８】
たとえば、図１および図８に示す実施形態のマルチプロセッサシステムにおいて、各ビット列を共有メモリ上のアトミック領域に更新しながら保持することによって、同じく共有メモリ上のバッファの同期を行うするようにしているが、これらのビット列の機能をライブラリとして実装し、バッファを、プロデューサ側のローカルメモリに実装したり、コンシューマ側のローカルメモリに実装するようにしてもよい。
【０１１９】
さらに、プロデューサが必要とする情報と、コンシューマが必要とする情報とは異なることに着目し、共有メモリを用いない実装形態を実現してもよい。たとえば、図１に示す実施形態のシステムにおいて、プロデューサが必要とする情報は、読出が完了したか否かを示す情報（図１に示す実施形態においてはビット列３０ａ）と、先行ポインタであり、コンシューマが必要とする情報は、書込が完了したか否かを示す情報（図１に示す実施形態においてはビット列３０ｂ）と、追尾ポインタである。そのため、先行ポインタと追尾ポインタは、プロデューサとコンシューマ間で共有する必要がない。プロデューサとコンシューマはひとつずつ存在する場合において、共有する必要のある情報について、プロデューサ、コンシューマのそれぞれがメッセージパッシングの手法を用いて他者に必要な情報を互いに送信しあうことによって共有することができる。具体的には、プロデューサは、書込が完了すれば、書込完了情報を更新してコンシューマに送信し、コンシューマは、受信した情報と、自分が保持している書込完了情報とをたとえばビット列にＯＲしていくことで蓄積するように更新する。読出完了情報についても同じであり、読出が完了したコンシューマは、読出完了情報を更新してプロデューサに送信し、プロデューサは、受信した情報と、自分が保持している読出完了情報とをたとえばＯＲコマンドによって更新する。このような実装態様によって、ビット列の保持に共有メモリを用いずにバッファの同期を実現することができる。
【０１２０】
また、上述した実施形態において、例としてプロセッサを処理主体とし、システムとしてはマルチプロセッサシステムとなっているが、本発明によるバッファ管理技術は、処理主体をタスク（プロセス、スレッドなどを含む）としたいかなるマルチタスクシステムにも適用することができる。
【図面の簡単な説明】
【０１２１】
【図１】本発明にかかる第１の実施形態のマルチプロセッサシステムを示す図である。
【図２】図１に示すマルチプロセッサシステムの共有メモリを示す図である。
【図３】図２に示す共有メモリに設けられたバッファの初期状態を示す図である。
【図４】図２に示す共有メモリに保持されているビットマップの初期状態を示す図である。
【図５】ポインタの進行を説明するための図である。
【図６】ポインタの進行およびビットマップ情報の更新を説明するための図である。
【図７】ビットマップの各ビットのビット値とブロック状態の関係を示す図である。
【図８】本発明にかかる第２の実施形態のマルチプロセッサシステムを示す図である。
【図９】図８に示すマルチプロセッサシステムの共有メモリを示す図である。
【図１０】図９に示す共有メモリに設けられたバッファの初期状態を示す図である。
【図１１】図９に示す共有メモリに保持されている２つのビット列の初期状態を示す図である。
【図１２】ポインタの進行およびビット列の更新を説明するための図（その１）
【図１３】ポインタの進行およびビット列の更新を説明するための図（その２）
【図１４】第２の追尾ポインタにより示されるブロックの読出の完了後、第２の追尾ポインタの進め先の決定、およびビット列の更新を説明するための図である。
【図１５】第２の追尾ポインタにより示されるブロックの読出の完了後に更新されたビット列を示す図である。
【図１６】第２の追尾ポインタが進められた後のバッファの状態とビット列を示す図である。
【図１７】本発明の第３の実施形態のマルチプロセッサシステムを示す図である。
【図１８】図１７に示すマルチプロセッサシステムの共有メモリを示す図である。
【符号の説明】
【０１２２】
１０Ａ  処理ユニット、  １０Ｂ  処理ユニット、  １２Ａ  プロデューサ、  １２Ｂ  コンシューマ、  １４Ａ  ローカルメモリ、  １４Ｂ  ローカルメモリ  ２０  バッファ、  ３０  ビットマップ、  ４４  先行ポインタ、  ４８  追尾ポインタ、  ５０  共有メモリ、  １００  マルチプロセッサシステム、  １１０  処理ユニット、  １１２  プロセッサ、  １１４  ローカルメモリ、  １２０  バッファ、  １３０ａ  ビット列、  １３０ｂ  ビット列、  １４４  第１の先行ポインタ、  １４５  第２の先行ポインタ、  １４８  第１の追尾ポインタ、  １４９  第２の追尾ポインタ、  １５０  共有メモリ、  ２００  マルチプロセッサシステム、  ２１０  処理ユニット、  ２１２  プロセッサ、  ２１４  ローカルメモリ、  ２２０  バッファ、  ２３０  ビット列、  ２４０  ポインタキュー、  ２５０  共有メモリ。
【図１】
2007052510.tif 000003
【図２】
2007052510.tif 000004
【図３】
2007052510.tif 000005
【図４】
2007052510.tif 000006
【図５】
2007052510.tif 000007
【図６】
2007052510.tif 000008
【図７】
2007052510.tif 000009
【図８】
2007052510.tif 000010
【図９】
2007052510.tif 000011
【図１０】
2007052510.tif 000012
【図１１】
2007052510.tif 000013
【図１２】
2007052510.tif 000014
【図１３】
2007052510.tif 000015
【図１４】
2007052510.tif 000016
【図１５】
2007052510.tif 000017
【図１６】
2007052510.tif 000018
【図１７】
2007052510.tif 000019
【図１８】
2007052510.tif 000020
【手続補正書】
【提出日】平成18年6月2日(2006.6.2)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】請求項１２
【補正方法】変更
【補正の内容】
【請求項１２】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理するためのプログラムであって、
書込完了かそれ以外か、読出完了かそれ以外かをブロックに対応づけてなり、書込と読出の進行に伴って更新されるブロック状態情報を保持する機能と、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタを設ける機能と、
すべてのポインタの進行方向が同じであり、かつ第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタの順で互いに追い抜かない制約の下で、
ブロックに対する書込の開始後、該ブロックを示す第１の先行ポインタを次のブロックに進め、
第２の先行ポインタにより示されるブロックの書込の完了後、第２の先行ポインタにより示されるブロックから連続し、かつ書込完了状態にあるブロックのうち、第２の先行ポインタから最も離れたブロックの次のブロックに第２の先行ポインタを進め、
ブロックに対する読出の開始後、該ブロックを示す第１の追尾ポインタを次のブロックに進め、
第２の追尾ポインタにより示されるブロックの読出の完了後、第２の追尾ポインタにより示されるブロックから連続し、かつ読出完了状態にあるブロックのうち、第２の追尾ポインタから最も離れたブロックの次のブロックに第２の追尾ポインタを進める機能とをコンピュータ実行せしめることを特徴とするプログラム。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】００６５
【補正方法】変更
【補正の内容】
【００６５】
図８は、発明の第２の実施形態となるマルチプロセッサシステム２００の構成を示す。  マルチプロセッサシステム２００は、複数の処理ユニット１１０と、共有メモリ１５０と有し、各処理ユニット１１０は、共有メモリ１５０に接続されている。マルチプロセッサシステム２００における複数の処理ユニット１１０には、主処理ユニットが含まれてもよい。
【手続補正書】
【提出日】平成18年10月31日(2006.10.31)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序でブロック単位で循環使用されるバッファを管理する方法であって、
前記プロデューサによる書込中、書込完了、前記コンシューマによる読出中、読出完了のいずれの状態にあるかを各ブロックに対応づけて示すブロック状態情報を更新しながら保持し、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す先行ポインタと追尾ポインタを設け、
２つのポインタが同じ方向に進行し、かつ互いに追い抜かない制約の下で、
先行ポインタにより示されるブロックに対する書込の開始後、次のブロックが読出完了状態にある場合に限り、先行ポインタを次のブロックに進め、
追尾ポインタにより示されるブロックに対する読出の開始後、次のブロックが書込完了状態にある場合に限り、追尾ポインタを次のブロックに進め、
前記プロデューサは前記先行ポインタに基づきデータの書込を行うブロックを決定し、前記コンシューマは前記追尾ポインタに基づきデータの読出を行うブロックを決定することを特徴とするバッファ管理方法。
【請求項２】
前記プロデューサは必要に応じて前記先行ポインタを参照して、前記バッファに含まれ他のプロデューサが書込み中のブロックと異なるブロックに書込みを行い、前記コンシューマは必要に応じて前記追尾ポインタを参照して、前記バッファに含まれ他のコンシューマが読出し中のブロックと異なるブロックから読出しを行うことを特徴とする請求項１に記載のバッファ管理方法。
【請求項３】
前記先行ポインタおよび前記追尾ポインタを、前記プロデューサおよび前記コンシューマがアクセス可能な共有メモリに保持せしめることを特徴とする請求項１または２に記載のバッファ管理方法。
【請求項４】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理する方法であって、
書込完了かそれ以外かをブロックに対応づけて示す書込完否情報と、読出完了かそれ以外かをブロックに対応づけて示す読出完否情報とを含むブロック状態情報を更新しながら保持し、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタを設け、  すべてのポインタの進行方向が同じであり、かつ第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタの順で互いに追い抜かない制約の下で、
ブロックに対する書込の開始後、該ブロックを示す第１の先行ポインタを次のブロックに進め、
第２の先行ポインタにより示されるブロックの書込の完了後、第２の先行ポインタにより示されるブロックから連続し、かつ書込完了状態にあるブロックのうち、第２の先行ポインタから最も離れたブロックの次のブロックに第２の先行ポインタを進め、
ブロックに対する読出の開始後、該ブロックを示す第１の追尾ポインタを次のブロックに進め、
第２の追尾ポインタにより示されるブロックの読出の完了後、第２の追尾ポインタにより示されるブロックから連続し、かつ読出完了状態にあるブロックのうち、第２の追尾ポインタから最も離れたブロックの次のブロックに第２の追尾ポインタを進めることを特徴とするバッファ管理方法。
【請求項５】
書込完否情報を、バッファに同時にアクセス可能なプロデューサの分の、第２の先行ポインタにより示されるブロックを起点として連続したブロックのみに対して持ち、
読出完否情報を、バッファに同時にアクセス可能なコンシューマの分の、第２の追尾ポインタにより示されるブロックを起点として連続したブロックのみに対して持つことを特徴とする請求項４記載のバッファ管理方法。
【請求項６】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理する方法であって、
書込完了かそれ以外かをブロックに対応づけて示す書込完否情報と、読出完了かそれ以外かをブロックに対応づけて示す読出完否情報とを含むブロック状態情報を更新しながら保持し、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタを設け、  すべてのポインタの進行方向が同じであり、かつ第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタの順で互いに追い抜かない制約の下で、
前記第１の先行ポインタにより示されるブロックに対する書込の開始後、前記第１の先行ポインタを次のブロックに進め、
前記第２の先行ポインタにより示されるブロックに対する書込の完了後、前記第２の先行ポインタを先のブロックに進め、
前記第１の追尾ポインタにより示されるブロックに対する読出の開始後、前記第１の追尾ポインタを次のブロックに進め、
前記第２の追尾ポインタにより示されるブロックに対する読出の完了後、前記第２の追尾ポインタを先のブロックに進めることを特徴とするバッファ管理方法。
【請求項７】
前記処理主体は、プロセッサであり、
ブロック状態情報の更新および／またはポインタの進行は、書込または読出を行うプロセッサ、あるいは書込または読出を行ったプロセッサにより行われることを特徴とする請求項１から６のいずれか１項記載のバッファ管理方法。
【請求項８】
ブロック状態情報を、各ブロックについて２ビットを割り当てたビットマップとして保持し、
不可分操作によってビットマップの更新を行うことを特徴とする請求項１から７のいずれか１項記載のバッファ管理方法。
【請求項９】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序でブロック単位で循環使用されるバッファを管理する装置であって、
前記プロデューサによる書込中、書込完了、前記コンシューマによる読出中、読出完了のいずれの状態にあるかを各ブロックに対応づけて示すブロック状態情報を保持するブロック状態情報保持部と、
ブロック状態情報を、書込と読出の進行に伴って更新するブロック状態更新部と、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す先行ポインタと追尾ポインタを設けるポインタ設置部と、
２つのポインタが同じ方向に進行し、かつ互いに追い抜かない制約の下で、
先行ポインタにより示されるブロックに対する書込の開始後、次のブロックが読出完了状態にある場合に限り、先行ポインタを次のブロックに進め、
追尾ポインタにより示されるブロックに対する読出の開始後、次のブロックが書込完了状態にある場合に限り、追尾ポインタを次のブロックに進めるポインタ進行部と、
前記先行ポインタに基づき前記プロデューサによってデータの書込が行われるブロックを決定し、前記追尾ポインタに基づき前記コンシューマによってデータの読出が行われるブロックを決定するブロック決定部と、を有することを特徴とするバッファ管理装置。
【請求項１０】
前記ブロック決定部は、前記バッファに含まれ他のプロデューサが書込中のブロックと異なるブロックを、書込を行うブロックとして決定し、前記バッファに含まれ他のコンシューマが読出し中のブロックと異なるブロックを、読出を行うブロックとして決定することを特徴とする請求項９に記載のバッファ管理装置。
【請求項１１】
前記先行ポインタおよび前記追尾ポインタは前記プロデューサおよび前記コンシューマがアクセス可能な共有メモリに保持されることを特徴とする請求項９または１０に記載のバッファ管理装置。
【請求項１２】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理する装置であって、
書込完了かそれ以外かをブロックに対応づけて示す書込完否情報と、読出完了かそれ以外かをブロックに対応づけて示す読出完否情報とを含むブロック状態情報を保持するブロック状態情報保持部と、
ブロック状態情報を更新するブロック状態情報更新部と、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタを設けるポインタ設置部と、
すべてのポインタの進行方向が同じであり、かつ第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタの順で互いに追い抜かない制約の下で、
ブロックに対する書込の開始後、該ブロックを示す第１の先行ポインタを次のブロックに進め、
第２の先行ポインタにより示されるブロックの書込の完了後、第２の先行ポインタにより示されるブロックから連続し、かつ書込完了状態にあるブロックのうち、第２の先行ポインタから最も離れたブロックの次のブロックに第２の先行ポインタを進め、
ブロックに対する読出の開始後、該ブロックを示す第１の追尾ポインタを次のブロックに進め、
第２の追尾ポインタにより示されるブロックの読出の完了後、第２の追尾ポインタにより示されるブロックから連続し、かつ読出完了状態にあるブロックのうち、第２の追尾ポインタから最も離れたブロックの次のブロックに第２の追尾ポインタを進めるポインタ進行部とを有することを特徴とするバッファ管理装置。
【請求項１３】
前記ブロック状態情報保持部は、バッファに同時にアクセス可能なプロデューサの分の、第２の先行ポインタにより示されるブロックを起点として連続したブロックのみに対して書込完否情報を保持し、
バッファに同時にアクセス可能なコンシューマの分の、第２の追尾ポインタにより示されるブロックを起点として連続したブロックのみに対して読出完否情報を保持することを特徴とする請求項１２に記載のバッファ管理装置。
【請求項１４】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理する装置であって、
書込完了かそれ以外かをブロックに対応づけて示す書込完否情報と、読出完了かそれ以外かをブロックに対応づけて示す読出完否情報とを含むブロック状態情報を保持するブロック状態情報保持部と、
ブロック状態情報を更新するブロック状態情報更新部と、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタを設けるポインタ設置部と、
すべてのポインタの進行方向が同じであり、かつ第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタの順で互いに追い抜かない制約の下で、
前記第１の先行ポインタにより示されるブロックに対する書込の開始後、前記第１の先行ポインタを次のブロックに進め、
前記第２の先行ポインタにより示されるブロックに対する書込の完了後、前記第２の先行ポインタを先のブロックに進め、
前記第１の追尾ポインタにより示されるブロックに対する読出の開始後、前記第１の追尾ポインタを次のブロックに進め、
前記第２の追尾ポインタにより示されるブロックに対する読出の完了後、前記第２の追尾ポインタを先のブロックに進めるポインタ進行部と、を有することを特徴とするバッファ管理装置。
【請求項１５】
前記処理主体は、プロセッサであり、
前記ブロック状態情報更新部および／または前記ポインタ進行部は、書込または読出を行うプロセッサ、あるいは書込または読出を行ったプロセッサにより構成されることを特徴とする請求項９から１４のいずれか１項記載のバッファ管理装置。
【請求項１６】
前記ブロック状態情報保持部は、ブロック状態情報として、各ブロックについて２ビットを割り当てたビットマップ保持し、
前記ブロック状態更新部は、不可分操作によってビットマップの更新を行うことを特徴とする請求項９から１５のいずれか１項記載のバッファ管理装置。
【請求項１７】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序でブロック単位で循環使用されるバッファを管理するためのプログラムであって、
前記プロデューサによる書込中、書込完了、前記コンシューマによる読出中、読出完了のいずれの状態にあるかを各ブロックに対応づけてなり、書込と読出の進行に伴って更新されるブロック状態情報を保持する機能と、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す先行ポインタと追尾ポインタを設ける機能と、
２つのポインタが同じ方向に進行し、かつ互いに追い抜かない制約の下で、
先行ポインタにより示されるブロックに対する書込の開始後、次のブロックが読出完了状態にある場合に限り、先行ポインタを次のブロックに進め、
追尾ポインタにより示されるブロックに対する読出の開始後、次のブロックが書込完了状態にある場合に限り、追尾ポインタを次のブロックに進める機能と、
前記先行ポインタに基づき前記プロデューサによってデータの書込が行われるブロックを決定し、前記追尾ポインタに基づき前記コンシューマによってデータの読出が行われるブロックを決定する機能と、
をコンピュータに実行せしめることを特徴とするプログラム。
【請求項１８】
前記決定する機能は、前記バッファに含まれ他のプロデューサが書込中のブロックと異なるブロックを、書込を行うブロックとして決定し、前記バッファに含まれ他のコンシューマが読出し中のブロックと異なるブロックを、読出を行うブロックとして決定することを特徴とする請求項１７に記載のプログラム。
【請求項１９】
前記先行ポインタおよび前記追尾ポインタを保持するメモリへの、前記プロデューサおよび前記コンシューマからのアクセスを受け付ける機能をさらにコンピュータに実行せしめることを特徴とする請求項１７または１８に記載のプログラム。
【請求項２０】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理するためのプログラムであって、
書込完了かそれ以外か、読出完了かそれ以外かをブロックに対応づけてなり、書込と読出の進行に伴って更新されるブロック状態情報を保持する機能と、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタを設ける機能と、
すべてのポインタの進行方向が同じであり、かつ第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタの順で互いに追い抜かない制約の下で、
ブロックに対する書込の開始後、該ブロックを示す第１の先行ポインタを次のブロックに進め、
第２の先行ポインタにより示されるブロックの書込の完了後、第２の先行ポインタにより示されるブロックから連続し、かつ書込完了状態にあるブロックのうち、第２の先行ポインタから最も離れたブロックの次のブロックに第２の先行ポインタを進め、
ブロックに対する読出の開始後、該ブロックを示す第１の追尾ポインタを次のブロックに進め、
第２の追尾ポインタにより示されるブロックの読出の完了後、第２の追尾ポインタにより示されるブロックから連続し、かつ読出完了状態にあるブロックのうち、第２の追尾ポインタから最も離れたブロックの次のブロックに第２の追尾ポインタを進める機能とをコンピュータ実行せしめることを特徴とするプログラム。
【請求項２１】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理するためのプログラムであって、
書込完了かそれ以外か、読出完了かそれ以外かをブロックに対応づけてなり、書込と読出の進行に伴って更新されるブロック状態情報を保持する機能と、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタを設ける機能と、
すべてのポインタの進行方向が同じであり、かつ第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタの順で互いに追い抜かない制約の下で、
前記第１の先行ポインタにより示されるブロックに対する書込の開始後、前記第１の先行ポインタを次のブロックに進め、
前記第２の先行ポインタにより示されるブロックに対する書込の完了後、前記第２の先行ポインタを先のブロックに進め、
前記第１の追尾ポインタにより示されるブロックに対する読出の開始後、前記第１の追尾ポインタを次のブロックに進め、
前記第２の追尾ポインタにより示されるブロックに対する読出の完了後、前記第２の追尾ポインタを先のブロックに進める機能とをコンピュータ実行せしめることを特徴とするプログラム。
【請求項２２】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序でブロック単位で循環使用されるバッファを管理するためのプログラムを記憶した記憶媒体であって、
前記プログラムは、
前記プロデューサによる書込中、書込完了、前記コンシューマによる読出中、読出完了のいずれの状態にあるかを各ブロックに対応づけてなり、書込と読出の進行に伴って更新されるブロック状態情報を保持する機能と、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す先行ポインタと追尾ポインタを設ける機能と、
２つのポインタが同じ方向に進行し、かつ互いに追い抜かない制約の下で、
先行ポインタにより示されるブロックに対する書込の開始後、次のブロックが読出完了状態にある場合に限り、先行ポインタを次のブロックに進め、
追尾ポインタにより示されるブロックに対する読出の開始後、次のブロックが書込完了状態にある場合に限り、追尾ポインタを次のブロックに進める機能と、
前記先行ポインタに基づき前記プロデューサによってデータの書込が行われるブロックを決定し、前記追尾ポインタに基づき前記コンシューマによってデータの読出が行われるブロックを決定する機能と、をコンピュータに実行せしめることを特徴とする記憶媒体。
【請求項２３】
前記決定する機能は、前記バッファに含まれ他のプロデューサが書込中のブロックと異なるブロックを、書込を行うブロックとして決定し、前記バッファに含まれ他のコンシューマが読出し中のブロックと異なるブロックを、読出を行うブロックとして決定することを特徴とする請求項２２に記載の記憶媒体。
【請求項２４】
前記先行ポインタおよび前記追尾ポインタを保持するメモリへの、前記プロデューサおよび前記コンシューマからのアクセスを受け付ける機能をさらにコンピュータに実行せしめることを特徴とする請求項２２または２３に記載の記憶媒体。
【請求項２５】
複数のブロックに分けられ、それぞれのブロックが各処理主体間で転送されるデータの一時的な格納場所として、データを書き込む側の処理主体であるプロデューサと、プロデューサにより書き込まれたデータを読み出す側の処理主体であるコンシューマとによって所定の順序で循環使用されるバッファを管理するためのプログラムを記憶した記憶媒体であって、
前記プログラムは、
書込完了かそれ以外か、読出完了かそれ以外かをブロックに対応づけてなり、書込と読出の進行に伴って更新されるブロック状態情報を保持する機能と、
前記所定の順序で最も先に書込がなされるブロックに対して、該ブロックを示す第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタを設ける機能と、
すべてのポインタの進行方向が同じであり、かつ第１の先行ポインタ、第２の先行ポインタ、第１の追尾ポインタ、第２の追尾ポインタの順で互いに追い抜かない制約の下で、
ブロックに対する書込の開始後、該ブロックを示す第１の先行ポインタを次のブロックに進め、
第２の先行ポインタにより示されるブロックの書込の完了後、第２の先行ポインタにより示されるブロックから連続し、かつ書込完了状態にあるブロックのうち、第２の先行ポインタから最も離れたブロックの次のブロックに第２の先行ポインタを進め、
ブロックに対する読出の開始後、該ブロックを示す第１の追尾ポインタを次のブロックに進め、
第２の追尾ポインタにより示されるブロックの読出の完了後、第２の追尾ポインタにより示されるブロックから連続し、かつ読出完了状態にあるブロックのうち、第２の追尾ポインタから最も離れたブロックの次のブロックに第２の追尾ポインタを進める機能とをコンピュータ実行せしめることを特徴とする記憶媒体。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】００３２
【補正方法】変更
【補正の内容】
【００３２】
そこで、本発明の第２の方法は、ブロック状態情報に含まれ、書込完了か否かを示す情報を保持することによって、Ａブロックの書込が完了したとき、書込完了か否かを示す情報を参照して、第２の先行ポインタにより示されるブロック（ここの例ではＡブロック）から連続し、かつ書込完了状態にあるブロック（ここの例ではＢブロックとＣブロック）のうち、第２の先行ポインタから最も離れたブロック（Ｃブロック）の次のブロック（Ｄブロック）に進める。これによって、ブロックの書込が開始順通りに完了しない場合においても、第２の先行ポインタを、進めることが可能な範囲内の最も先のブロックに進めることができるので、書込が完了したブロックを早くコンシューマに供することができる。
【手続補正３】
【補正対象書類名】明細書
【補正対象項目名】００９１
【補正方法】変更
【補正の内容】
【００９１】
その後、１１番のブロックの読出が完了する。１１番のブロックが第２の追尾ポインタ１４９により示されているので、１１番の読出を行ったコンシューマ１１２は、ビット列１３０ｂにおける、１１番に対応するビット（１番のビット）の値を１にセットするとともに、第２の追尾ポインタの進め先を決めて進める。