(57)【特許請求の範囲】
【請求項１】
第１のモジュールと第２のモジュールとの間でデータを交換する方法において、
バッファビンの表示を含む「生産者」状態を生成する「生産者」状態生成工程であって、前記バッファビンが「利用可能」として印が付けられた複数のバッファビンの１つである、前記「生産者」状態生成工程と、
前記第１のモジュールでデータを表示された前記バッファビン内に生成し、前記バッファビンを「不可能可能」として印をつけるデータ生成工程であって、前記第１のモジュールは、この第１のモジュールが生成したデータに前記第２のモジュールが連続的にアクセスできるように構成されてる、前記データ生成工程と、
前記第２のモジュールの消費サイクルを示す「消費者」状態を生成する工程と、
前記第２のモジュールで前記「生産者」状態を読み取って、前記第２のモジュールが前記データを読み取る前記バッファビンを決定する工程と、
前記第２のモジュールで、表示された前記バッファビンから前記データを読み取る工程であって、前記第２のモジュールは、前記第１のモジュールをして連続的にデータを生成せしめるように構成されている、前記読み取る工程と、
前記データを読み取った時に前記第１のモジュールと前記第２のモジュールとの間で前記データを交換する工程、
とを具備し、
前記データ生成工程は、
前記第１のモジュールの第１の作成サイクルの間にデータを生成する工程と、
第２の作成サイクルで作成データを書き込む場所を判定するために前記「消費者」状態を読み取る工程、
「消費者」サイクル値が変更されていた場合、前記第１のモジュールが、次の作成サイクルに向けて「生産者」のビンセレクタを切り換え（２３６）、現在のバッファ指標及び以前のバッファ指標を除くバッファビンを「利用可能」として印をつける工程（２４０）と、
を含むことを特徴とする方法。
【請求項２】
前記第２のモジュールの第１の「消費者」サイクルの間にデータを読み取る工程と、
第２の「消費者」サイクルで新たな作成データが利用可能であるか否かを判定するために作成サイクルを示す「生産者」状態を読み取る工程、
とを更に含むことを特徴とする請求項１記載の方法。
【請求項３】
前記第１の「消費者」サイクルの間に複数のバッファビンのうち第１のバッファビンからデータを読み取る工程と、
前記第２の「消費者」イクルの間に前記複数のバッファビンのうち第２のバッファビンからデータを読み取る工程、
とを更に含むことを特徴とする請求項２記載の方法。
【請求項４】
第１のモジュールと第２のモジュールとの間でデータを交換する方法において、
前記第１のモジュールが、現在利用可能なバッファにバッファ指標値を保存する行程（２１６）と、
前記第１のモジュールが、共用メモリの現在のバッファオフセット場所に新たな作成データを書き込む工程（２２０）と、
前記第１のモジュールが、現在のバッファ値及びロック済みバッファ値を現在のビンセレクタのバッファビンに設定することにより、新たな「生産者」状態を作成する工程（２２４）と、
前記第１のモジュールが、共用メモリに「生産者」状態を書き込む工程（２２５）と、
前記第１のモジュールが、共用メモリから「消費者」状態を読み取る工程（２２６）と、
前記第１のモジュールが、直前の作成サイクルの後で「消費者」サイクル値が変更されたか否かを判定する工程と（２２８）、
「消費者」サイクル値が変更されていた場合、前記第１のモジュールが、次の作成サイクルに向けて「生産者」のビンセレクタを切り換え（２３６）、現在のバッファ指標及び以前のバッファ指標を除く作成バッファを「利用可能」として印をつける工程（２４０）と、
「消費者」サイクル値が変更されていた場合、前記第１のモジュールが、新たな「消費者」ロック済みバッファ値を保存するために、ロック済みバッファ値は現在のバッファ値と等しくなるように設定する工程（２４４）と、
「消費者」サイクル値が変更されていない場合、前記第１のモジュールが、先のバッファ指標を「利用可能」として印をつける工程（２５２）と、
「消費者」サイクル値が変更されていない場合、前記第１のモジュールが、現在のバッファ指標を「利用不可能」として印をつける工程（２５６）と、
前記第１のモジュールが、次の作成サイクルに向けて、以前のバッファ値を現在のバッファ値と等しくなるように設定する工程（２６０）と、
前記第２のモジュールが、「利用可能」な「消費者」サイクル値を発見し（２６４）、その値を現在のサイクル変数に保存する工程と、
前記第２のモジュールが、新たな「消費者」状態を共用メモリに新たな「消費者」サイクル値によって書き込む工程（２６８）と、
前記第２のモジュールが、共用メモリから「生産者」状態を読み取る工程（２７２）と、
前記第２のモジュールが、新たな「消費者」サイクル値が「生産者」状態の直前の「消費者」サイクル値と等しいか否かを判定する工程（２７６）と、
新たな「消費者」サイクル値が直前の「消費者」サイクル値と等しくない場合（２８０）、前記第２のモジュールが、現在の「生産者」ビンセレクタにより示されるバッファビンからバッファ指標を検索する工程（２８４）と、
新たな「消費者」サイクル値が直前の「消費者」サイクル値と等しい場合（２８８）、前記第２のモジュールが、現在の「生産者」ビンセレクタにより示されないバッファビンからバッファ指標を検索する工程（２９２）と、
前記第２のモジュールが、バッファ指標により示される適切な共用メモリバッファオフセットから「生産者」データを読み取る工程（２９６）と、
前記第２のモジュールが、直前の「消費者」サイクルの後に「生産者」サイクルが発生したか否かを判定する工程（３００）と、
「生産者」サイクルが発生した場合（３０４）、前記第２のモジュールが、現在のサイクル、以前のサイクル及び直前の「消費者」サイクルの値に「利用不可能」として印をつける工程（３０８）と、
「生産者」サイクルが発生した場合（３０４）、前記第２のモジュールが、その他のサイクル値を「利用可能」として印をつける工程（３１２）と、
「生産者」サイクルが発生した場合（３０４）、前記第２のモジュールが、ロック済みサイクル値は現在のサイクル値と等しくなるように設定する工程と、
「生産者」サイクルが発生しておらず（３２０）、以前のサイクルがロック済みサイクルと等しくない時、前記第２のモジュールが、以前のサイクル値に「利用可能」として印をつける工程（３２４）と、
「生産者」サイクルが発生していない場合（３０４）、前記第２のモジュールが、現在サイクル値を「利用不可能」として印をつける工程（３２８）と、
前記第２のモジュールが、以前のサイクル値を現在のサイクル値と等しくなるように設定する工程（３３２）と、
とを具備することを特徴とする方法。
【請求項５】
コントローラと；
共用メモリインタフェースを介して前記コントローラとの間でデータを交換するように構成された入出力モジュールとを具備し、
第１のモジュール及び第２のモジュールのうち少なくとも一方のモジュールのサイクルを示す状態であって、「利用可能」として印が付けられた複数のバッファビンの１つである、特定のバッファビンの示す前記状態を生成し、
前記第１のモジュールによって前記データを前記特定のバッファビン内に生成し、前記特定のバッファビンを「不可能可能」として印をつけ；
前記第２のモジュールで前記データを前記特定のバッファビンから読み取り；且つ
前記データを読み取った時に前記第１のモジュールから前記第２のモジュールに対して前記データを交換することにより、前記データは交換され、前記第１のモジュールは、前記第２のモジュールが連続的に前記データにアクセスすることを可能にするように構成され、且つ前記第２のモジュールは、前記第１のモジュールが連続的に前記データを生成することを可能にするように構成され、
前記データは、
前記第１のモジュールの第１の作成サイクルの間にデータを書き込み、
第２の作成サイクルで作成データを書き込む場所を判定するために前記第２のモジュールの「消費者」サイクルを示す「消費者」状態を読み取り、
「消費者」サイクル値が変更されていた場合、前記第１のモジュールが、次の作成サイクルに向けて「生産者」のビンセレクタを切り換え（２３６）、現在のバッファ指標及び以前のバッファ指標を除くバッファビンを「利用可能」として印をつけることにより、
交換されるシステム。
【請求項６】
前記データは、
前記第２のモジュールがデータを読み取れる第１のバッファビン及び前記第１のモジュールがデータを生成できる第２のバッファビンのうち少なくとも一方のバッファビンを示す前記状態を読み取ることにより、
交換されることを特徴とする請求項５記載のシステム。
【請求項７】
前記データは更に、
前記第２のモジュールの第１の「消費者」サイクルの間にデータを読み取り；且つ
第２の「消費者」サイクルで新たな作成データが利用可能であるか否かを判定するために作成サイクルの状態を示す「生産者」状態を読み取ることにより、
交換されることを特徴とする請求項５記載のシステム。
【請求項８】
前記データは更に、
前記第１の「消費者」サイクルの間に複数のバッファビンのうち第１のバッファビンからデータを読み取り；且つ
前記第２の「消費者」サイクルの間に複数のバッファビンのうち第２のバッファビンからデータを読み取ることにより、
交換されることを特徴とする請求項７に記載のシステム。
【請求項９】
コントローラと；
共用メモリインタフェースを介して前記コントローラとの間でデータを交換するように構成された第１のモジュール及び第２のモジュールとを具備し、
前記第１のモジュールが、現在利用可能なバッファにバッファ指標値を保存し（２１６）、
前記第１のモジュールが、共用メモリの現在のバッファオフセット場所に新たな作成データを書き込み（２２０）、
前記第１のモジュールが、現在のバッファ値及びロック済みバッファ値を現在のビンセレクタのバッファビンに設定することにより、新たな「生産者」状態を作成し（２２４）、
前記第１のモジュールが、共用メモリに「生産者」状態を書き込み（２２５）、
前記第１のモジュールが、共用メモリから「消費者」状態を読み取り（２２６）、
前記第１のモジュールが、直前の作成サイクルの後で「消費者」サイクル値が変更されたか否かを判定し（２２８）、
「消費者」サイクル値が変更されていた場合、前記第１のモジュールが、次の作成サイクルに向けて「生産者」のビンセレクタを切り換え（２３６）、現在のバッファ指標及び以前のバッファ指標を除く作成バッファを「利用可能」として印をつけ（２４０）、
「消費者」サイクル値が変更されていた場合、前記第１のモジュールが、新たな「消費者」ロック済みバッファ値を保存するために、ロック済みバッファ値は現在のバッファ値と等しくなるように設定し（２４４）、
「消費者」サイクル値が変更されていない場合、前記第１のモジュールが、先のバッファ指標を「利用可能」として印をつけ（２５２）、
「消費者」サイクル値が変更されていない場合、前記第１のモジュールが、現在のバッファ指標を「利用不可能」として印をつけ（２５６）、
前記第１のモジュールが、次の作成サイクルに向けて、以前のバッファ値を現在のバッファ値と等しくなるように設定し（２６０）、
前記第２のモジュールが、「利用可能」な「消費者」サイクル値を発見し（２６４）、その値を現在のサイクル変数に保存し、
前記第２のモジュールが、新たな「消費者」状態を共用メモリに新たな「消費者」サイクル値によって書き込み（２６８）、
前記第２のモジュールが、共用メモリから「生産者」状態を読み取り（２７２）、
前記第２のモジュールが、新たな「消費者」サイクル値が「生産者」状態の直前の「消費者」サイクル値と等しいか否かを判定し（２７６）、
新たな「消費者」サイクル値が直前の「消費者」サイクル値と等しくない場合（２８０）、前記第２のモジュールが、現在の「生産者」ビンセレクタにより示されるバッファビンからバッファ指標を検索し（２８４）、
新たな「消費者」サイクル値が直前の「消費者」サイクル値と等しい場合（２８８）、前記第２のモジュールが、現在の「生産者」ビンセレクタにより示されないバッファビンからバッファ指標を検索し（２９２）、
前記第２のモジュールが、バッファ指標により示される適切な共用メモリバッファオフセットから「生産者」データを読み取り（２９６）、
前記第２のモジュールが、直前の「消費者」サイクルの後に「生産者」サイクルが発生したか否かを判定し（３００）、
「生産者」サイクルが発生した場合（３０４）、前記第２のモジュールが、現在のサイクル、以前のサイクル及び直前の「消費者」サイクルの値に「利用不可能」として印をつけ（３０８）、
「生産者」サイクルが発生した場合（３０４）、前記第２のモジュールが、その他のサイクル値を「利用可能」として印をつけ（３１２）、
「生産者」サイクルが発生した場合（３０４）、前記第２のモジュールが、ロック済みサイクル値は現在のサイクル値と等しくなるように設定し、
「生産者」サイクルが発生しておらず（３２０）、以前のサイクルがロック済みサイクルと等しくない時、前記第２のモジュールが、以前のサイクル値に「利用可能」として印をつけ（３２４）、
「生産者」サイクルが発生していない場合（３０４）、前記第２のモジュールが、現在サイクル値を「利用不可能」として印をつけ（３２８）、
前記第２のモジュールが、以前のサイクル値を現在のサイクル値と等しくなるように設定する（３３２）、
ことを可能にするように構成されるシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般に「生産者」／「消費者」ソフトウェアに関し、特に、「生産者」と「消費者」との間でデータを交換する方法及びシステムに関する。
【背景技術】
【０００２】
一般に、Ｉ／Ｏ走査機構は、共用メモリバッファを使用してモジュールを介してデータを交換するように構成された「生産者」及び「消費者」を含むソフトウェア実行を利用する。更に、データの交換には、データアクセスを可能にするためにバックプレーンを介するハンドシェーク機構が通常必要である。特に、「生産者」は共用メモリバッファにデータを書き込むためにアクセスを要求し、「消費者」は共用メモリバッファからデータを読み取るためにアクセスを要求する。従って、周知の走査機構のうち少なくともいくつかの機構において、データの交換中、「生産者」及び／又は「消費者」はデータをアクセスできるようになるまで待機していなければならない。特に、ハンドシェーク機構は複数回の読み取りアクセス又は書き込みアクセスを要求する場合がある。共用メモリデータバッファへの一貫性のあるアクセスを確保するために、例えばピーターソンアルゴリズムなどの共用メモリセマフォが一般に実現される。しかし、多くの場合、そのようなセマフォはアクセス権を獲得しようとする試みを繰り返し実行しなければならない。更に、周知の走査機構の中には、「生産者」及び／又は「消費者」の一方が最新データを捕らえるまでに危険領域又はタイムアウトを必要とするものがある。そのような待機時間又はタイムアウトの計算は困難であり、誤りを生じやすい。
【０００３】
従って、少なくともいくつかの周知の走査機構は、コントローラアクセスを準備するために走査モジュールにコマンドを送出する。しかし、この機構は、コマンドを読み取るためにモジュールに通常の処理を遅らせるように要求することが多く、そのためデータの交換に遅延が発生する。更に、少なくともいくつかの周知の走査機構は、アクセス制御を補助するためにハードウェア機構を使用する。しかし、ハードウェア機構のインストール及び保守にはコスト及び／又は時間がかかる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】米国特許第７，２４３，３５４号公報
【発明の概要】
【０００５】
１つの態様において、第１のモジュールと第２のモジュールとの間でデータを交換する方法が提供される。方法は、第１のモジュールでデータを生成することを含み、第１のモジュールは、第２のモジュールがほぼ連続的にデータにアクセスすることを可能にするように構成される。方法は、第２のモジュールでデータを読み取ることを更に含み、第２のモジュールは、第１のモジュールがほぼ連続的にデータを生成することを可能にするように構成される。最後に方法は、データを読み取ると第１のモジュールと第２のモジュールとの間でデータを交換することを含む。
【０００６】
別の態様において、システムが提供される。システムはコントローラと、共用メモリインタフェースを介してコントローラとの間でデータを交換するように構成された入出力モジュールとを含む。第１のモジュールでデータを生成し、第２のモジュールでデータを読み取り且つデータを読み取った時に第１のモジュールから第２のモジュールに対してデータを交換することにより、データが交換される。第１のモジュールは、第２のモジュールがほぼ連続的にデータにアクセスすることを可能にするように構成され、且つ第２のモジュールは、第１のモジュールがほぼ連続的にデータを生成することを可能にするように構成される。
【０００７】
更に別の態様において、入出力モジュールにインストールされるコンピュータプログラムが提供される。コンピュータプログラムは、第１のモジュールと第２のモジュールとの間でデータを交換することを入出力モジュールに命令するように構成された少なくとも１つのコードセグメントを含む。第２のモジュールがほぼ連続的にデータにアクセスすることを可能にするように構成された第１のモジュールでデータを生成し、第１のモジュールがほぼ連続的にデータを生成することを可能にするように構成された第２のモジュールでデータを読み取り且つデータを読み取った時に第１のモジュールと第２のモジュールとの間でデータを交換することにより、データが交換される。
【図面の簡単な説明】
【０００８】
【図１】図１は、コントローラ及び入出力モジュールを含む走査機構の例示的な一実施形態を示した図である。
【図２】図２は、図１に示される走査機構を使用してデータを交換するために使用されてもよい例示的なアルゴリズムを示したフローチャートである。
【図３】図３は、図１に示される走査機構を使用してデータを交換するために使用されてもよい例示的なアルゴリズムを示したフローチャートである。
【発明を実施するための形態】
【０００９】
本発明は、コントローラと、共用メモリインタフェースを介してコントローラとの間でデータを交換するように構成された入出力（Ｉ／Ｏ）モジュールとを含むシステムを提供する。一実施形態において、システムは、Ｉ／Ｏモジュールに入力され且つデータを交換するためのアルゴリズムを含むコンピュータプログラムを含む。システムは、コンピュータプログラムを読み取り且つ実行するプロセッサを更に含んでもよい。アルゴリズムは、コントローラとＩ／Ｏモジュールとの間のデータの交換を容易にするために「生産者」及び「消費者」を制御するという技術的効果を有する。このアルゴリズムにより、「生産者」は「消費者」によるアクセスを阻止することなく且つ「消費者」によるアクセスを調整するために待機することなく新たなデータを非同期的に一貫性をもって書き込むことができる。「消費者」も、「生産者」においてデータアクセスを阻止又は待機することなく最新の「生産者」データを非同期的に読み取る。例示的な実施形態において、システムは専用ハードウェアを必要としない。
【００１０】
更に、「生産者」／「消費者」間の交換のためのデータ構造は「生産者」状態バイト、「消費者」状態バイト及び４つの異なるデータバッファビンなどの複数の異なるデータバッファビンのみを含む。「生産者」が「消費者」に対するアクセスを実行するために待機することがないように、アルゴリズムは、「生産者」に関して最新「生産者」データ書き込みのためにバッファビンのうち少なくとも１つが常に利用可能な状態であることを確保する。「消費者」に関しては、アルゴリズムにより、「消費者」はデータ読み取りのために最近作成されたデータバッファを瞬時にロックできる。例示的な実施形態において、適切なデータバッファビンへのアクセスを交渉するためにアルゴリズムが要求するのは２回の共用メモリ読み取り／書き込み動作のみである。これにより、バックプレーンを介して走査する場合の性能は向上する。
【００１１】
尚、本発明は走査機構に関して説明されるが、当業者には理解されるように、「生産者」と「消費者」との間でデータを交換する任意のシステム及び／又は機器にも本発明が適用されてもよい。更に、本発明はプロセッサ及びコンピュータプログラムに関して説明されるが、当業者には理解されるように、「生産者」と「消費者」との間でデータを交換するように構成された任意のシステム及び／又はプログラムにも適用されてもよい。本発明において使用される場合の用語「プロセッサ」は、当該技術分野でプロセッサと呼ばれている集積回路のみに限定されず、広い意味でコンピュータ、プロセッサ、マイクロコントローラ、マイクロコンピュータ、プログラマブル論理コントローラ、特定用途向け集積回路及び他のプログラマブル回路を示す。プロセッサは、フロッピー（登録商標）ディスク、コンパクトディスク読み取り専用メモリ（ＣＤ‐ＲＯＭ）、磁気光ディスク（ＭＯＤ）又はデジタルバーサタイルディスク（ＤＶＤ）などのコンピュータ可読媒体からデータを読み取るフロッピー（登録商標）ディスクドライブ又はＣＤ‐ＲＯＭドライブなどの装置を含むコンピュータの一部であってもよい。
【００１２】
図１は、コントローラ１０４及びＩ／Ｏモジュール１０８を含む走査機構１００の例示的な一実施形態を示す。例示的な実施形態において、Ｉ／Ｏモジュール１０８は多数の遠隔モジュール１１２に対するＩ／Ｏデータを制御する。特に、Ｉ／Ｏモジュール１０８は共用メモリインタフェースを実現し、構成される遠隔モジュール１１２ごとに１つの４バッファ「生産者」／「消費者」データセットを含む。例えばユーザが５０個の遠隔モジュール１１２を含むようにネットワークを構成する場合、Ｉ／Ｏモジュール１０８は入力データの交換のために５０個の「生産者」／「消費者」データセットを提供し、各遠隔モジュール１１２への出力データの交換のために更に５０個の「生産者」／「消費者」データセットを提供する。各「生産者」／「消費者」データセットは「生産者」状態バイト、「消費者」状態バイト及び４つのデータバッファビンを含む。
【００１３】
例示的な実施形態において、走査機構はコンピュータプログラムにおいて実現されるアルゴリズムを含む。このアルゴリズムは、「生産者」に新たなデータを生成させると共に、「消費者」に最近生成された「生産者」データを閲覧させ且つ／又は読み取らせることができ、いずれの場合にもアクセスの交渉をするために待機する必要はない。従って、「生産者」及び「消費者」は、非同期的に任意の時間間隔で動作できる。一実施形態において、「生産者」サイクルは「消費者」サイクルより高速である。別の実施形態において、「消費者」サイクルは「生産者」サイクルより高速である。更なる実施形態において、「消費者」サイクルと「生産者」サイクルは交互に実行される。どの実施形態においても、「生産者」及び「消費者」は共に危険領域又はタイムアウトを必要としない。特に、「生産者」状態及び「消費者」状態の共用メモリ読み取り／書き込み制御値は原子値である必要がない。従って、「生産者」及び「消費者」からのそれらの値に対するアクセスは同時であってもよく且つ重複していてもよい。アルゴリズムは共用メモリアクセスを最小限に抑えることにより、性能を最適化する。更に、アルゴリズムは、バッファアクセスを交渉するために共用メモリの１バイト書き込み及び１バイト読み取りのみを要求する。
【００１４】
一般に、４バッファ走査の場合、「生産者」／「消費者」の組み合わせごとに４つの異なる共用メモリバッファビンが必要である。従って、入力走査は４つのバッファビンを必要とし、出力走査は更に４つのバッファビンを必要とする。モジュール起動／構成中にバッファのオフセット場所を判定できるので、実際の走査動作中、単純にバッファ指標値０、１、２又は３によりバッファを参照できる。例えば、１２バイトの入力走査データを有するモジュールは、共用メモリにおいて４バッファセットをオフセット０×１００００の場所に規定してもよい。この例において、各入力バッファは０×０Ｃのデータサイズを有するので、４つのバッファは０×１００００、０×１０００Ｃ、０×１００１８及び０×１００２４の場所に規定される。それらのオフセットは構成中に判定され、４バッファ走査指標値０、１、２及び３がマッピングされる。
【００１５】
基本４バッファ走査動作を制御するには、共用メモリに少なくとも５つの制御サブフィールドが必要である。特に、制御サブフィールドのうち４つは直前のサイクル値、ビンセレクタ、ビン０サブフィールド及びビン１サブフィールドを含めて「生産者」によってのみ書き込まれる。残る１つの制御サブフィールドはサイクル値であり、「消費者」によってのみ書き込まれる。Ｉ／Ｏ走査動作を改善するために追加のフィールドが規定されてもよい。
【００１６】
一般に、「生産者」及び「消費者」はビン０とビン１とを交互に使用する。従って、動作中、「消費者」は一方のバッファビンのロック済みバッファ値を使用するが、「生産者」は新たに作成されたバッファによって他方のバッファビンを更新する。作成サイクルごとに、「生産者」は利用可能なＩ／Ｏ走査バッファを発見し、そのＩ／Ｏ走査バッファに作成データを書き込み、共用メモリにおけるそのバッファの指標値を提示する。一実施形態において、「生産者」は、「消費者」により現在ロックされていないバッファビンフィールドに新たに作成されたバッファ指標値を書き込む。更に、「生産者」は作成サイクルごとに、「消費者」サイクル値を読み取り且つ保存する。「消費者」サイクル値が以前の「生産者」サイクルから変更されたことを「生産者」が認識した場合、「生産者」は次の作成サイクルで他方のバッファビンに切り替えなければならない。従って、「生産者」がビン０に対して作成している間に「消費者」サイクル値が変更された場合、次の作成はビン１に対して実行される。ビン１がアクティブであった場合、「生産者」はビン０に切り替える。現在どちらのバッファビンが使用中であるか（ビン０又はビン１）を示すために、「生産者」はビンセレクタを書き込む。アルゴリズムにより、「生産者」は観察される「消費者」サイクル毎にバッファビン及びビンセレクタ状態を常に切り替えられる。「消費者」は「生産者」状態を観察し、ロック済みバッファビンから最新の作成バッファを取り出す。
【００１７】
４バッファハンドシェークアルゴリズムが次の作成／消費バッファを交渉するために要求する共用メモリアクセスは２回のみである。実際のデータを読み取るか又は書き込むために、３回目の共用メモリアクセスも必要とされる。従って、「生産者」は空いているバッファ場所に新たなデータを書き込み、新たなバッファ指標を「生産者」状態フィールドに書き込み、且つ「消費者」状態フィールドを読み取って次の作成サイクルの動作を判定しなければならない。「消費者」は新たな「消費者」状態フィールドを書き込むことにより消費サイクルを開始し、「生産者」状態を読み取って消費バッファを識別し、且つ消費バッファからデータを読み取る。
【００１８】
必要とされる制御サブフィールドが５つだけである場合、「生産者」状態フィールド及び「消費者」状態フィールドは状態フィールドごとに１バイトに縮小されてもよい。更に大きなＤＷＯＲＤサイズを使用すると、特定のロック済みバッファに対してバッファ有効指示を与えるためのバッファビンレディビットの空間が提供される。特定のバッファに関連する詳細が不要である場合、「生産者」の準備が整っていないことを示すためにビン０値をビン１値と等しくなるように設定する機構がレディビットの代わりに使用されてもよい。ＤＷＯＲＤ状態サイズを使用すると、将来の性能向上に備えた予備ビットも提供される。
【００１９】
図２及び図３は、「生産者」と「消費者」との間の４バッファ走査に使用されるアルゴリズムを示したフローチャートである。例示的な実施形態において、アルゴリズムは「生産者」ルゴリズム２０８（図２に示される）及び「消費者」ルゴリズム２１２（図３に示される）を含む。「生産者」ルゴリズム２０８の実行中、現在のバッファ、以前のバッファ及びロック済みバッファの変数は「生産者」のローカルインスタンス変数であり、共用メモリフィールドではない。それらの変数は４つの走査バッファ指標値のうち１つの指標０、１、２又は３を記録する。「生産者」のローカルインスタンスデータは各走査バッファの現在の使用中状態を更に記録する。第１の作成サイクルより以前の時点では、４つの走査バッファ全てが利用可能である（使用中ではない）。
【００２０】
従って、例示的な実施形態において、「生産者」は利用可能な（使用中ではない）走査バッファを発見し、現在利用可能なバッファにバッファ指標値を保存する（ステップ２１６）。次に、「生産者」は共用メモリの現在のバッファオフセット場所に新たな作成データを書き込む（ステップ２２０）。現在のバッファ値及びロック済みバッファ値を現在のビンセレクタの適切なバッファビンに設定することにより、新たな「生産者」状態が作成される（ステップ２２４）。適切な直前の「消費者」サイクル値フィールドも設定される。「生産者」ルゴリズム２０８は、共用メモリに「生産者」状態を書き込むこと（ステップ２２５）及び共用メモリから「消費者」状態を読み取ること（ステップ２２６）を更に含む。
【００２１】
例示的な実施形態において、「生産者」ルゴリズム２０８は、直前の作成サイクルの後で「消費者」サイクル値が変更されたか否かを判定する（ステップ２２８）。「消費者」サイクル値が変更されていた（これは現在のバッファビンがロック状態であることを示す）場合（２３２）、次の作成サイクルに向けて「生産者」のビンセレクタが切り換えられる（ステップ２３６）。従って、現在のバッファ指標及び以前のバッファ指標を除いて全ての作成バッファが「利用可能」として印をつけられる（ステップ２４０）。更に、新たな「消費者」ロック済みバッファ値を保存するために、ロック済みバッファ値は現在のバッファ値と等しくなるように設定される（ステップ２４４）。直前の作成サイクル以来、「消費者」サイクルの開始が検出されなかった場合（２４８）（すなわち以前のバッファの値がロック済みバッファの値と等しい場合）、先のバッファ指標が「利用可能」として印をつけられ（ステップ２５２）、このバッファ指標は次の作成サイクルで利用可能である。更に、現在のバッファ指標は「利用不可能」（使用中）として印をつけられ（ステップ２５６）、次の作成サイクルではこのバッファ指標を使用できない。また、次の作成サイクルに向けて、以前のバッファ値は現在のバッファ値と等しくなるように設定される（ステップ２６０）。
【００２２】
「消費者」ルゴリズム２１２の実行中、現在のサイクル、以前のサイクル及びロック済みサイクルの変数は「消費者」のローカルインスタンス変数であり、共用メモリフィールドではない。それらの変数は５つのサイクル値のうち１つの値１、２、３、４又は５を記録する。「消費者」のローカルインスタンスデータは各サイクル値の現在の使用中状態を更に記録する。第１の消費サイクルより以前の時点では、５つのサイクル値すべてが利用可能である（使用中ではない）。
【００２３】
従って、例示的な実施形態において、「消費者」は「利用可能」な（使用中ではない）「消費者」サイクル値を発見し（ステップ２６４）、その値を現在のサイクル変数に保存する。更に、「消費者」は新たな「消費者」状態を共用メモリに新たな「消費者」サイクル値によって書き込み（ステップ２６８）且つ共用メモリから「生産者」状態を読み取る（ステップ２７２）。次に、「消費者」ルゴリズム２１２は、新たな「消費者」サイクル値が「生産者」状態の直前の「消費者」サイクル値と等しいか否かを判定する（ステップ２７６）。新たな「消費者」サイクル値が直前の「消費者」サイクル値と等しくない場合（２８０）、「消費者」は、現在の「生産者」ビンセレクタにより示されるバッファビンからバッファ指標を検索する（ステップ２８４）。新たな「消費者」サイクル値が直前の「消費者」サイクル値と等しい場合（２８８）、「生産者」は新たな「消費者」サイクルを既に認識しており、それに従ってビンセレクタを切り換えている。従って、「消費者」は、現在の「生産者」ビンセレクタにより示されないバッファビンからバッファ指標を検索する（ステップ２９２）。
【００２４】
次に、「消費者」は、バッファ指標により示される適切な共用メモリバッファオフセットから「生産者」データを読み取る（ステップ２９６）。「消費者」ルゴリズム２１２は、直前の「消費者」サイクルの後に「生産者」サイクル（「生産者」状態の変更により示される）が発生したか否かを判定する（ステップ３００）。「生産者」サイクルが発生した場合（３０４）、「消費者」は現在のサイクル、以前のサイクル及び直前の「消費者」サイクルの値に「利用不可能」として印をつける（ステップ３０８）。更に、「消費者」はその他のサイクル値を「利用可能」（使用中ではない）として印をつける（ステップ３１２）。また、新たなロック済みサイクル値を保存するために、ロック済みサイクル値は現在のサイクル値と等しくなるように設定される。以前の「生産者」状態値が現在の「生産者」状態と等しい場合（「生産者」サイクルが発生していない場合（３２０））、以前のサイクルがロック済みサイクルと等しくない時、「消費者」は以前のサイクル値に「利用可能」として印をつけられ（ステップ３２４）。更に、現在サイクル値は「利用不可能」（使用中）として印をつける（ステップ３２８）、次の消費サイクルではこのサイクル値を使用できない。また、次の消費サイクルに向けて以前のサイクル値は現在のサイクル値と等しくなるように設定される（ステップ３３２）。
【００２５】
従って、「生産者」ルゴリズム２０８及び「消費者」ルゴリズム２１２は、走査ハンドシェークを実行するために必要とされるバックプレーン読み取り／書き込みアクセスを最小限に抑える。特に、「生産者」及び「消費者」の双方は、１回の４バッファバックプレーンハンドシェークに際して１回の書き込み及び１回の読み取りを要求するだけであり、実際のＩ／Ｏ走査データの読み取り又は書き込みが更に要求される。更に、アルゴリズムはソフトウェア実行においてタイムアウト及び／又は危険領域を必要としない。
【００２６】
例示的な実施形態において、作成サイクル中、「生産者」は４つの走査バッファの可用性又は使用中状態の管理を負う。この管理は、消費のために利用可能な状態にされているバッファに対する現在使用中ではない作成用走査バッファの可用性を参照する。この管理を実行するために、「生産者」は、「消費者」がどのバッファを現在ロックしているか及び直前の作成サイクルでどのバッファが使用されたかを知っていなければならない。次に、「生産者」は、現在の作成サイクルに使用するために残るバッファのうち１つのバッファを選択しなければならない。「生産者」と「消費者」との間で起こる競争状態により、この選択の実行はわずかに複雑になる。競争状態は、「生産者」が現在の作成バッファビンと予測されるバッファビンに新たなバッファ値を書き込む場合に起こる。この作成書き込みを実行している間、「消費者」は、「生産者」が書き込んでいるのと同一のバッファビンを同時にロックし、更にこのロック済みバッファビンのバッファ値を読み取ってもよい。「生産者」には、「消費者」がバッファビンにおいてどのバッファ値を実際に認識したかがわからない。「生産者」は、それが書き込まれたばかりの新たな作成バッファであるか又は以前の作成バッファであるかを知っているにすぎない。この競争状態があるため、４バッファアルゴリズムは、双方のバッファが使用中である（現在の作成バッファ及び以前の作成バッファは共に使用中として印をつけられているが、残る２つのバッファは黙示的に利用可能である）ことを「生産者」が仮定することを要求する。
【００２７】
例えば、「生産者」が先にバッファ１で新たなデータを作成し且つ現在はバッファ２でデータを作成している場合、現在のバッファビンを値２によって更新した後、「生産者」は「消費者」サイクル値をチェックし、「消費者」が先に同一のバッファビンをロックしていたことを認識する。そこで、「生産者」は、バッファ１及びバッファ２の双方が使用中であり且つ潜在的に消費されていることを仮定しなければならない。続く作成サイクルにおいて、「生産者」は新たな「生産者」データに対してバッファ０又はバッファ３を使用できる。
【００２８】
例示的な実施形態において、「消費者」状態の「消費者」サイクル値フィールドは、消費サイクルの発生を示すことが意図される。消費サイクルの開始時に「消費者」サイクル値を変更することにより、新たな消費サイクルが示される。「生産者」は次の作成サイクルで値の変更を認識し、消費サイクルが発生したこと又は進行中であることを知る。「消費者」は、「消費者」サイクル値の変更に伴う諸問題に対処しなければならない。第１に、「消費者」は消費サイクルごとにサイクル値を変更する必要があるが、以前の作成サイクル中に「生産者」が認識した可能性がある値を繰り返し使用してはならない。従って、「消費者」は、直前のサイクルの間にどのような「消費者」サイクル値が提示されたかを追跡していなければならない。
【００２９】
第２に、「消費者」は、「生産者」状態の直前「消費者」サイクル値フィールドに現在提示されているサイクル値を使用してはならない。後の「消費者」サイクルにおいて「消費者」が「生産者」サイクル値と「消費者」サイクル値とを正確に比較できるように、このサイクル値は回避されなければならない。この値が使用され、「消費者」が直前の「消費者」サイクル値を再利用する前に「生産者」がその同じ値を変更するように切り替えなければ、「消費者」は「消費者」ビン選択サブアルゴリズムによって誤ったバッファビンを選択することになるだろう。
【００３０】
最後に、「消費者」が新たな「消費者」サイクル値を書き込み且つ「生産者」状態を読み取るのと同時に「生産者」が新たな「生産者」状態を書き込んでいる場合、競争状態が処理されなければならない。この場合、「消費者」は「生産者」により認識された「消費者」サイクル値について確かではない。従って、「消費者」は、現在のサイクル値及び以前のサイクル値が共に使用中であり、次の「消費者」サイクルには利用不可能であると仮定しなければならない。本質的には、これは先に説明した「生産者」が処理しなければならない競争状態と同一である。
【００３１】
「消費者」サイクル値に関して、サイクルごとに固有の値を提示するために必要とされる値は４つだけである。しかし、「生産者」の直前の「消費者」サイクル値を回避すべきであるという条件があるため、「消費者」サイクル値選択サブアルゴリズムは５つのサイクル値（１〜５の範囲の値）を必要とする。尚、「消費者」サイクル値１、２、３、４及び５はバッファビンとは関係がなく、単に新たな「消費者」サイクルが発生したことを「生産者」に示す。
【００３２】
例示的な実施形態において、作成サイクルごとに、「生産者」は認識した最新の「消費者」サイクル値を「生産者」状態フィールドの直前の「消費者」サイクル値にコピーすることを要求される。「消費者」はこの値を使用して、どのバッファビンから読み取るべきかを判定する。「消費者」が「生産者」状態を読み取る前に「生産者」がビンセレクタを切り換えている場合もある。従って、「消費者」サイクル中に適正なバッファビン選択を実行するために、「消費者」は「生産者」状態の直前の「消費者」サイクル値の値を現在の「消費者」サイクル値と比較する。それらの値が等しくない場合、「消費者」は、「生産者」状態ビンセレクタ値により示されるバッファビンを使用する。しかし、サイクル値が等しい場合、「消費者」は、「消費者」が「生産者」状態値を読み取る前に「生産者」が別のサイクルを完了していたことを知る。従って、「生産者」のビンセレクタは予期した位置から切り換えられているので、「消費者」は他方ののバッファビンのロック済みバッファを使用しなければならない。
【００３３】
従って、システムは、作成データを定期的に更新し且つ最新の作成バッファを「消費者」に対して示す「生産者」を提供する。更に、「消費者」は、すべてのデータをコヒーレントに読み取り可能であるように作成バッファを定期的にロックする。「生産者」は、共用メモリの２つのバッファビンのうち一方のバッファビンを使用して最新の作成バッファ指標値（バッファ０〜３）を示す。「生産者」は新たな作成バッファ値を一度に１つのビンに書き込むだけであり、「生産者」ビンセレクタフィールドを使用してどのビンが現在アクティブであるかを示す。「消費者」が最近作成されたバッファにアクセスしたい場合、「消費者」は新たな消費サイクルの開始を示すために新たな「消費者」サイクル値を書き込む。この動作によって、「消費者」は、現在のビンに新たな作成バッファを書き込むことを停止し且つ次の作成サイクルで他方のビンに切り替えることを「生産者」に指令する。これにより、更なる作成サイクルの更新が実行されないように選択されたビンはロックされ、「消費者」は選択されたビンを読み取り、そのバッファ値を消費に使用できる。
【００３４】
従って、本アルゴリズムは、過去のソフトウェアによる実行例より高速のＩ／Ｏ走査機構を提供する。これは以前のアルゴリズムと比較して技術的に優れているだけでなく、より高速であり且つより多くの一貫した走査が行われる製品が得られる。
【００３５】
更に、例示的な実施形態において、基本４バッファアルゴリズムを走査機構１００と組み合わせて使用すると、いくつかの点で改善が見られる。それらの改善により、多数の遠隔モジュールの支援及び性能の向上が容易になる。特に、モジュールが多数のＩ／Ｏバッファセットを必要とする場合、多数のセットが共用メモリにおいて実現可能である。各バッファセットは、１回の「生産者」／「消費者」交換に必要な基本フィールド、すなわち「消費者」状態、「生産者」状態及び４つのバッファビンを含む。この基本セットは、データの交換に必要な回数だけ共用メモリにおいて反復される。「生産者」／「消費者」制御状態フィールドは４つの共用メモリアレイ、すなわち入力「消費者」状態アレイ、入力「生産者」状態アレイ、出力「消費者」状態アレイ及び出力「生産者」状態アレイに配置されてもよい。
【００３６】
例示的な実施形態において、「走査指標値」という用語は、１つのＩ／Ｏバッファセットに対して特定の制御状態フィールドのセットが配置される場所であるアレイ指標を表す。例えば走査指標値５は、対応する「生産者」／「消費者」の状態フラグが、アレイ指標５に配置されていることを意味し、４つの制御アレイはそれぞれ次の通りである。
【００３７】
入力「消費者」状態＝入力「消費者」オフセット［５］
入力「生産者」状態＝入力「生産者」オフセット［５］
出力「消費者」状態＝出力「消費者」オフセット［５］
出力「生産者」状態＝出力「生産者」オフセット［５］
例示的な実施形態において、システムは多数の遠隔Ｉ／Ｏモジュールを制御し且つマスタコントローラから走査を分割するように機能する。従って、遠隔モジュールごとに「生産者」状態制御フィールド及び「消費者」状態制御フィールドのセットが必要とされる。特に、構成中、モジュールは、「消費者」入力、「生産者」入力、「消費者」出力及び「生産者」出力に対して共用メモリにおいて４つのＩ／Ｏ制御アレイから成るセットを作成しなければならない。
【００３８】
構成中、モジュールは各遠隔Ｉ／Ｏモジュールの入力データバッファオフセット及び出力データバッファオフセットを更に識別しなければならない。１つのバッファオフセット値は４バッファ走査中に使用される４バッファアレイを指示する。データサイズ値は各走査バッファの大きさを示すと共に、アレイ中の各走査バッファに対するオフセットを示唆する。例えばモジュールの入力データサイズが１２バイトである場合、入力バッファオフセットはバッファアレイ内のオフセット０、１２、２４及び３６にそれぞれ配置された１２バイトの４つのバッファを指示しなければならない。それらのバッファは４バッファ走査アルゴリズムにおける走査バッファ指標０、１、２及び３に対応する。走査アルゴリズム及び状態フィールドを使用して、使用すべき走査バッファを識別できる。
【００３９】
スレーブモジュールが構成（例えば、遠隔モジュールＩ／Ｏ走査データ）に基づいて動的に割り当てられる多数のＩ／Ｏバッファセットを支援する場合、システムは４つの制御状態アレイに対して走査指標値を適正に割り当て且つ提示する役割を果たす。Ｉ／Ｏデータセットは構成ごとに変更される場合があるので、構成が変更されるたびに、制御状態フィールド及び対応する走査指標値は廃棄又は追加されてもよい。システムは、制御状態フィールドに対する走査指標値の割り当てを適正に処理する役割を果たす。従って、システムは低い範囲の指標値にパックされた割り当て走査指標値を保持しようとする。そのため、構成が新たなＩ／Ｏデータ領域を追加する場合、システムは、状態アレイの終端で新たな場所を割り当てる前に先に割り当てを解除された走査指標場所を再利用する。この場合、どの走査指標場所が割り当て済みであり、どの走査指標場所が空いているかを判定するために、モジュールは内部走査指標割り当てアレイ又は専用走査指標割り当てアレイを保持することを要求されてもよい。
【００４０】
例示的な実施形態において、「消費者」が準備完了状態にあるか否かを示すために、「消費者」状態の中に「消費者」レディビットが存在する。「生産者」は各バッファビン（ビン０又はビン１）のバッファビンレディビットを使用して実行可能状態を指示できる。「生産者」は作成サイクルごとに、バッファビンのバッファビンレディビットを有効データによって設定する。準備が整っていない状態に「生産者」が入った場合、「生産者」はバッファビンレディビットを設定せずに別の作成サイクルを実行しなければならないか、又は単純に以前の作成サイクルのバッファビンのバッファビンレディビットをクリアしなければならない。「消費者」は、消費のためにロックしたバッファビンにおけるバッファビンレディビットに基づいて、「消費者」が消費している作成データが有効であるか否かを判定する。
【００４１】
マスタコントローラは、１回目の入力走査中に入力「消費者」状態において準備完了状態であることを示し且つ１回目の出力走査中に出力「生産者」状態によって出力準備完了を示す。出力が無効化された場合、無効出力データを適切に示すために、マスタコントローラは出力「生産者」状態の最近作成されたバッファビンのバッファビンレディビットをクリアしなければならない。ＲＸ３ｉシステムを利用する一実施形態において、マスタコントローラはバックプレーンＲＵＮラインを更にデアサートする。
【００４２】
同様に、スレーブモジュールは、１回目の作成サイクルの間に入力「生産者」状態によって入力データが有効であることを示す。スレーブモジュールは、出力「消費者」状態の「消費者」レディビットによって出力を消費する準備が完了していることを更に示せる。
【００４３】
例示的な実施形態において、スレーブモジュールはスレーブモジュールの起動シーケンス中に特定のフィールドを初期設定する。モジュール構成の直後、Ｉ／Ｏ走査セットアップブロックのその他のフィールドはマスタモジュールによりサンプリングされる。これにより、構成中にＩ／Ｏ走査データの大きさ及び場所を変更する融通性がモジュールに与えられる。マスタモジュールが構成によって変化しない固定データサイズを有する場合、起動シーケンス中にＩ／Ｏ走査セットアップブロック全体が一度初期設定される。
【００４４】
例示的な実施形態は、第１のモジュールの作成サイクルを示す「生産者」状態を生成することと、第２のモジュールがデータを読み取り可能であるバッファビンを示すために「生産者」状態を書き込むこととを更に含む。例示的な実施形態は、第２のモジュールの消費サイクルを示す「消費者」状態を生成することと、第１のモジュールがデータを書き込み可能であるバッファビンを示すために「消費者」状態を書き込むこととを更に含む。
【００４５】
一実施形態において、方法は、第１のモジュールの第１の作成サイクル中にデータを生成することと、第２の作成サイクルで作成データを書き込む場所を判定するために第２のモジュールの消費サイクルを示す「消費者」状態を読み取ることとを含む。本実施形態において、方法は、第１の作成サイクル中に複数のバッファビンのうち第１のバッファビンに対してデータを生成することと、第２の作成サイクルの間に複数のバッファビンのうち第２のバッファビンに対してデータを生成することとを更に含む。
【００４６】
更なる実施形態において、方法は、第２のモジュールの第１の「消費者」サイクル中にデータを読み取ることと、第２の「消費者」サイクルで新たな作成データが利用可能であるか否かを判定するために作成サイクルを示す「生産者」状態を読み取ることとを含む。本実施形態において、方法は、第１の消費サイクル中に複数のバッファビンのうち第１のバッファビンからデータを読み取ることと、第２の消費サイクル中に複数のバッファビンのうち第２のバッファビンからデータを読み取ることとを更に含む。
【００４７】
本明細書において、明示的に指示されない限り、単数形で表される要素又はステップは、その要素又はステップが複数存在する状況を除外しないと理解されるべきである。更に、本発明の一実施形態を参照する場合、そこに挙げられている特徴を同様に含む追加の実施形態の存在が除外されないと解釈することが意図される。
【００４８】
「生産者」と「消費者」との間でデータを交換するシステム及び方法の例示的な実施形態が提供される。例示されるシステム及び方法は本明細書において説明される特定の実施形態に限定されず、システムの構成要素は本明細書において説明される他の構成要素とは無関係に且つ別個に利用されてもよい。更に、説明される方法のステップは本明細書において説明される他のステップとは無関係に且つ別個に利用されてもよい。
【００４９】
種々の特定の実施形態に関して本発明を説明したが、特許請求の範囲の趣旨の範囲内で本発明を変形して実施してもよいことは当業者には認識されるだろう。
【符号の説明】
【００５０】
１００    走査機構
１０４    コントローラ
１０８    Ｉ／Ｏモジュール
１１２    遠隔モジュール
【図１】
0005469066.tif 000002
【図２】
0005469066.tif 000003
【図３】
0005469066.tif 000004