(57)【要約】【課題】  キューのオーバフローを防止する情報蓄積制御方法を提案する。【解決手段】    処理要求を順次記憶する第１の記憶手段と、前記第１の記憶手段に記憶可能な処理要求の数を超えない値に設定されたセマフォ変数を記憶する第２の記憶手段と、前記第１の記憶手段に記憶された処理要求についての処理完了に応じて処理結果に関するデータを順次記憶する記憶手段であって、前記第１の記憶手段に記憶可能な処理要求の数以上の数の前記データを格納可能な第３の記憶手段と、前記処理要求の前記第１の記憶手段への記憶に応じて、前記セマフォ変数を１減少させ、前記第３の記憶手段からの前記データの読み出しに応じて前記セマフォ変数を１増加させる処理を行う処理手段とを備え、前記第１の記憶手段への更なる処理要求の記憶は、前記セマフォ変数の値が正であることを条件に行われる、ことを特長とする情報処理装置。【選択図】  図２
2010157254.tif 000002
【特許請求の範囲】
【請求項１】
処理要求を順次記憶する第１の記憶手段と、
前記第１の記憶手段に記憶可能な処理要求の数を超えない値に設定されたセマフォ変数を記憶する第２の記憶手段と、
前記第１の記憶手段に記憶された処理要求についての処理完了に応じて処理結果に関するデータを順次記憶する記憶手段であって、前記第１の記憶手段に記憶可能な処理要求の数以上の数の前記データを格納可能な第３の記憶手段と、
前記処理要求の前記第１の記憶手段への記憶に応じて、前記セマフォ変数を１減少させ、前記第３の記憶手段からの前記データの読み出しに応じて前記セマフォ変数を１増加させる処理を行う処理手段とを備え、
前記第１の記憶手段への更なる処理要求の記憶は、前記セマフォ変数の値が正であることを条件に行われる、
ことを特長とする情報処理装置。
【請求項２】
第１の記憶手段に、処理要求を順次記憶する第１の工程と、
前記第１の記憶手段に記憶可能な処理要求の数を超えない値に設定されたセマフォ変数を、第２の記憶手段に記憶する第２の工程と、
前記第１の記憶手段に記憶可能な処理要求の数以上の数の前記データを格納可能な第３の記憶手段に、前記第１の記憶手段に記憶された処理要求についての処理完了に応じて処理結果に関するデータを順次記憶する第３の工程と、
前記処理要求の前記第１の記憶手段への記憶に応じて、前記セマフォ変数を１減少させ、前記第３の記憶手段からの前記データの読み出しに応じて前記セマフォ変数を１増加させる第４の工程を備え、
前記第１の記憶手段への更なる処理要求の記憶は、前記セマフォ変数の値が正であることを条件に行われる、
ことを特長とする情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、キューに蓄積された処理要求を実行する際の制御方法およびプログラム、またこれらを利用したシステムに関する。
【背景技術】
【０００２】
処理要求を含む処理要求情報を発行する発行側装置とその処理要求情報を受信し、処理要求を実行し、実行結果を発行側装置に送信する受信側装置とのインタフェースとして、２種類のキューが使用されることがある。一方のキューには、処理要求情報が待ち行列として蓄積され、キューの先頭の処理要求から順に受信側装置により実行される。
【０００３】
他方のキューには、処理要求が完了したことを示す情報（処理完了情報）が待ち行列として蓄積され、キューの先頭の処理完了情報から順に発行側装置により回収され、処理完了時のステータス確認等が行われる。例えば、コンピュータと周辺機器を接続するための次世代の入出力(I/O)技術として提案されるインフィニバンド（Infiniband）（非特許文献１参照）やVIA（Virtual Interface Architecture）（非特許文献２参照）などのアーキテクチャにおいて、前述した２種類のキューを用いた処理要求の実行が行われる。
【先行技術文献】
【非特許文献】
【０００４】
【非特許文献１】Infiniband(SM) Trade Association、"Infiniband(TM) Architecture Specification Volume 1 Release 1.1"、P.80、3.2.1節Queuing、[online]、Final, November 6,2002、[平成１５年１月２１日検索]、インターネット＜http://www.infinibandta.org/specs/＞
【非特許文献２】Compaq Computer Corp., Intel Corporation, Microsoft Corporation、"Virtual Interface Architecture Specification"、P.11、2.1.節 VI Architecture Components、[online]、Draft Revision 1.0, December 4, 1997、[平成１５年１月２１日検索]、インターネット＜fttp://download.intel.com/design/servers/vi/san_10.pdf＞
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、前述した２種類のキューをインタフェースとして処理要求を実行する場合、各キューへ処理要求情報あるいは処理完了情報を蓄積する際に、そのキューに蓄積された処理要求情報あるいは処理完了情報の蓄積状況が判断されないことが多い。そのため、各キューの蓄積可能データ数を超えてしまい、キューが溢れる（オーバフローする）場合があった。
【０００６】
キューがオーバフローすると、処理要求の実行が停止し、前述の発行側装置あるいは受信側装置に復旧処理という新たな処理をさせることになり、装置全体としての性能低下が避けられず問題である。当然のことながら、復旧処理をさせるには、ソフトウエアまたはハードウエアによる実装を必要とする。また、蓄積可能データ数を大きくするために、より大きな蓄積領域を確保して各キューのサイズを大きくすることも可能だが、むやみに大きく取られたキューは通常時その一部しか使用されず無駄が発生していた。
【０００７】
そこで、本発明は、以上に述べた課題に鑑み、２種類のキューをインタフェースとして介在させキューに蓄積された処理要求を実行する場合に各キューを溢れさせないための情報蓄積制御方法を提供することを目的とする。また、両者を組み合わせて使用することにより、両キューを共に溢れさせないことも可能である。またハードウエアは実装コストの低減と高性能を実現するために実装を単純化する必要があり、そのためソフトウエアによる実装で実現できることが望ましい。
【課題を解決するための手段】
【０００８】
上記課題を解決するため、処理要求情報が蓄積される第一の領域を設定する工程と、処理要求の完了を示す情報である処理完了情報が蓄積される第二の領域を設定する工程と、前記第一の領域に対応するセマフォ変数の初期値を前記第一の領域に蓄積可能な情報数の最大数として設定する工程と、前記第一の領域に対応するセマフォ変数の値から１を減算した値が正の値か判定し、正の値であれば、前記第一の領域に前記処理要求情報を追加し、前記第一の領域に対応するセマフォ変数の値から１を減算した値を前記第一の領域に対応するセマフォ変数として更新する工程と、前記要求された処理が完了した場合、該処理要求を特定する情報と前記処理完了情報を対応付けて前記第二の領域に蓄積する工程と、前記第二の領域に前記処理完了情報が蓄積されているか判定し、蓄積されていれば、前記第一の領域に対応するセマフォ変数に１を加算した値を前記第一の領域に対応するセマフォ変数として更新し、前記処理完了情報を１つ削除する工程を有することを特徴とする情報蓄積制御方法を提供する。
【０００９】
この場合において、前記第二の領域に蓄積可能な情報数の最大数を前記第一の領域に蓄積可能な情報数の最大数以上に設定することも可能である。また、前記第一の領域、前記第二の領域に共にセマフォ変数を設定することも可能である。
【００１０】
また、上記課題は、処理要求情報が蓄積される複数の第一の領域を設定する工程と、処理要求の完了を示す情報である処理完了情報が蓄積される第二の領域を設定する工程と、前記複数の第一の領域にそれぞれ対応するセマフォ変数の初期値を前記複数の第一の領域にそれぞれ蓄積可能な情報数の最大数として設定する工程と、前記複数の第一の領域のうち１つを選択し、前記選択された第一の領域に対応するセマフォ変数の値から１を減算した値が正の値か判定し、正の値であれば、前記選択された第一の領域に処理要求情報を追加し、前記選択された第一の領域と前記処理要求を特定する情報を対応付けて対応表に蓄積し、前記選択された第一の領域に対応するセマフォ変数の値から１を減算した値を前記選択された第一の領域に対応するセマフォ変数として更新する工程と、前記処理要求が完了した場合、該処理要求を特定する情報を前記処理完了情報と対応付けて前記第二の領域に蓄積する工程と、前記第二の領域に前記処理完了情報が蓄積されているか判定し、蓄積されていれば、前記処理完了情報を１つ読み出し、前記読み出された処理完了情報に対応する前記処理要求を特定し、前記対応表を参照して該特定された処理要求が蓄積された前記第一の領域を特定し、該特定された第一の領域に対応するセマフォ変数に１を加算した値を前記特定された第一の領域に対応するセマフォ変数として更新し、前記読み出された処理完了情報を削除する工程を有することを特徴とする情報蓄積制御方法を提供することにより解決される。
【００１１】
この場合において、前記第二の領域に蓄積可能な情報数の最大数を各第一の領域に蓄積可能な情報数の最大数の総和以上に設定することも可能である。さらに、複数の第一の領域のそれぞれと前記第二の領域にそれぞれセマフォ変数を設定することも可能である。
【００１２】
また、上記課題は、処理要求情報が蓄積される第一の領域と、処理要求の完了を示す情報である処理完了情報が前記処理要求を特定する情報と対応付けられ蓄積される第二の領域と、前記第一の領域を特定する情報とセマフォ変数が対応付けられ蓄積されるセマフォ変数表とが格納される蓄積部と、前記蓄積部を制御する制御部とを有する装置において実行されるプログラムであって、前記制御部に、前記第一の領域に対応するセマフォ変数の初期値を前記第一の領域に蓄積可能な情報数の最大数として設定させる工程と、前記第一の領域に対応するセマフォ変数の値から１を減算した値が正の値か判定させ、正の値であれば、前記第一の領域に対応するセマフォ変数の値から１を減算した値を前記第一の領域に対応するセマフォ変数として前記セマフォ変数表を更新させ、前記第一の領域へ前記処理要求情報を追加させる工程と、前記第二の領域に前記処理完了情報が蓄積されているか判定させ、蓄積されていれば、前記第一の領域に対応するセマフォ変数に１を加算した値を前記第一の領域に対応するセマフォ変数として前記セマフォ変数表を更新させ、前記処理完了情報を１つ削除させる工程を実行させるためのプログラムを提供することにより解決される。
【００１３】
また、上記課題は、処理要求情報が蓄積される第一の領域と、処理要求の完了を示す情報である処理完了情報が前記処理要求を特定する情報と対応付けられ蓄積される第二の領域とが格納される蓄積部と、前記蓄積部を制御し、前記処理要求を実行する制御部を有する第一の装置と、前記第一の装置に接続され、前記第一の領域を特定する情報とセマフォ変数が対応付けられ蓄積されるセマフォ変数表とが格納される蓄積部と、前記蓄積部を制御し、前記処理要求情報を前記第一の装置へ送信する制御部を有する第二の装置とを備え、前記第二の装置における制御部は、予め前記第一の領域に対するセマフォ変数の初期値を前記第一の領域に蓄積可能な情報数の最大数として設定し、特定のタイミングで前記第一の領域に対応するセマフォ変数から１を減算した値が正の値か判定し、正の値であれば、前記第一の領域に対応するセマフォ変数から１を減算した値を前記第一の領域に対応するセマフォ変数として更新し、前記第一の装置に新たな処理要求情報を送信し、前記第一の装置における制御部は、前記新たな処理要求情報を受信して前記第一の領域に追加し、特定のタイミングで前記第一の領域に蓄積された処理要求を実行し、該処理要求に対応する処理完了情報を作成して前記第二の装置に領域に蓄積し、前記第二の装置における制御部は、特定のタイミングで前記第二の領域に前記処理完了情報が蓄積されているか判定し、蓄積されていれば、前記第一の領域に対応するセマフォ変数に１を加算した値を前記第一の領域に対応するセマフォ変数として更新し、前記第二の領域に蓄積された前記処理完了情報を１つ削除することを特徴とするシステムを提供することにより解決される。
【発明の効果】
【００１４】
以上に説明したように、本発明によれば、２種類のキューをインタフェースとして介在させ処理要求を実行する場合、各キューがオーバフローすることなくキューに処理要求に関するデータを蓄積することができ、キューがオーバフローすることによる処理停止や処理遅延を防止することができる。また、本発明は処理要求の発行側装置における実装だけで済み、発行側装置がプログラムを実行可能な装置であれば、ソフトウエアによる実装が可能となる。
【図面の簡単な説明】
【００１５】
【図１】本発明の第一の実施形態に用いる情報処理装置の構成例を示す図である。
【図２】本発明の第一の実施形態においてCPUが周辺機器に格納されたデータにアクセスする際の動作を示す図である。
【図３】ワークキューに蓄積されるワークリクエストのデータ構成例を示す図である。
【図４】コンプリーションキューに蓄積されるワークコンプリーションのデータ構成例を示す図である。
【図５】メモリに格納されるセマフォ変数表である。
【図６】本発明の第一の実施形態におけるワークリクエスト蓄積処理を説明するフローチャートである。
【図７】本発明の第一の実施形態におけるワークコンプリーション回収処理を説明するフローチャートである。
【図８】第一の実施形態の変形例におけるワークリクエスト蓄積処理を説明するフローチャートである。
【図９】第一の実施形態の変形例におけるワークコンプリーション回収処理を説明するフローチャートである。
【図１０】本発明の第二の実施形態においてCPUが周辺機器に格納されたデータにアクセスする際の動作を示す図である。
【図１１】メモリに格納されるワークキュー対ワークリクエスト対応表である。
【図１２】本発明の第二の実施形態におけるワークリクエスト蓄積処理を説明するフローチャートである。
【図１３】本発明の第二の実施形態におけるワークコンプリーション回収処理を説明するフローチャートである。
【発明を実施するための形態】
【００１６】
以下、本発明の実施形態について図面に従って説明する。しかしながら、本発明の技術的範囲はかかる実施形態に限定されるものではなく、特許請求の範囲に記載された発明とその均等物に及ぶものである。
【００１７】
図１は、本発明の第一の実施形態に用いる情報処理装置の構成例を示す図である。本発明の適用はインフィニバンドに限定されるものではないが、本発明の実施形態においてはメモリに格納されたOSの指令を実行するCPUが処理要求の発行側装置として処理要求を含むデータ（ワークリクエスト）を送信し、同一筐体内のインフィニバンド用ホストチャネルアダプタが受信側装置としてワークリクエストを受信する場合に、本発明が適用される様子を説明する。
【００１８】
メモリ５には、コンピュータを動作させるための基本ソフトウエアであるオペレーティングシステム(OS、Operating System)や、OS上で動作するアプリケーションプログラムが蓄積される。CPU２は、OSやアプリケーションプログラムからの処理要求に基づき、システムバス３を介して、メモリ５や各種周辺機器（図示されないハードディスクや、SCSIやファイバチャネルを介して外部に接続された図示されないストレージ、LANを介して接続された図示されない他のコンピュータ等）に格納されたデータにアクセスし、コンピュータ１内の装置を制御するための処理を実行する。
【００１９】
CPU２がメモリ５に格納されたデータにアクセスする場合、メモリコントローラ４は、CPU２が指定する仮想メモリ上のアドレスを実際の物理メモリアドレスに変換し、対応するデータをシステムバス３を介してCPU２に送信する。CPU２が周辺機器に格納されたデータにアクセスする場合、CPU２は処理要求を含むデータ（以下ワークリクエストと呼ぶ）をホストチャネルアダプタ(HCA)６のメモリ７に確保されたワークキュー（図示せず）に蓄積する。コプロセッサ８は、HCA内の制御に関する演算を実行する処理装置であり、特定のタイミングでワークキューに蓄積されたワークリクエストを処理し、処理結果のデータをメモリ７に確保されたコンプリーションキュー（図示せず）に格納する。CPU２は特定のタイミングでコンプリーションキューをチェックし、処理結果のデータを回収、削除する。
【００２０】
インフィニバンドスイッチ９は、チャネルアダプタ間を接続し、チャネルアダプタ同士のポイントトゥポイント(point-to-point)のデータ伝送を可能にする。図１では、HCA６が、インフィニバンドスイッチ９を介して、コンピュータ１をネットワークに接続するためのネットワークインタフェースカード(NIC)１１、コンピュータ１にSCSI機器を接続するためのSCSIカード１３、ファイバチャネル(Fiber Channel)機器を接続するためのFCカード１４のそれぞれに備えられたターゲットチャネルアダプタ(TCA)１１、１３、１５と接続されている。また、インフィニバンドスイッチ９を介して他のHCAと直接接続することも可能である。これは、例えば、複数のコンピュータ１が同一筐体内に存在するブレードサーバ（この場合各コンピュータ１をブレードと呼ぶ）のような装置において、ブレード間を接続するバックプレーンと呼ばれる内部バスを介した接続がある。
【００２１】
図２は、本発明の第一の実施形態においてCPU２が周辺機器に格納されたデータにアクセスする際の動作を示す図である。本発明の第一の実施形態においては、メモリ上にワークキュー２４およびコンプリーションキュー２８が１つずつ確保され、ワークキュー２４に蓄積可能なワークリクエスト２６の個数を示すセマフォ変数を設定することで、ワークキュー２４が溢れることが防止される。
【００２２】
セマフォ変数はワークリクエスト２６がワークキュー２４に１つ蓄積されると値が１減算され、ワークコンプリーション３０が１つ回収されると値が１加算される。セマフォ変数の初期値をワークキュー２４に蓄積可能なデータの最大数と設定することで、ワークキュー２４のセマフォ変数が正の値であれば、ワークキュー２４にデータを追加蓄積可能であることがわかる。
【００２３】
また、セマフォ変数として、ワークキュー２４に蓄積可能なデータの最大量(例えば、確保された領域のサイズ)を設定し、ワークリクエスト２６の蓄積の度にそのワークリクエスト２６のサイズが減算され、ワークコンプリーション３０の回収により、ワークリクエスト２６のサイズが加算されることによっても同じ効果を得ることができる。後者は、各ワークリクエスト２６のサイズが一定でない場合等に有効な手段となる。
【００２４】
図２のCPU２は、OSやアプリケーションプログラムからの処理要求を含むデータをワークリクエスト２６として、開始番地と終了番地により特定される領域としてメモリ７に確保された、キュー番号WQ1のワークキュー２４に蓄積する。CPU２はワークキュー２４に対応して設定されるセマフォ変数が格納されたメモリ５のセマフォ変数表２２を参照し、ワークリクエスト２６の蓄積が可能か判定する。
【００２５】
ワークリクエスト２６の蓄積が可能であれば、ワークリクエスト２６がワークキュー２４の末尾に追加される。そしてCPU２はセマフォ変数表２２を更新する。このワークリクエスト蓄積処理の詳細については後述する。
【００２６】
コプロセッサ８は、特定のタイミングでワークキュー２４から先頭のワークリクエスト２６を取り出し、処理要求を実行する。ワークリクエスト２６には、データの送信、受信といった処理要求内容と、データ送信先や送信するデータあるいは受信したデータの格納先等の情報が格納されており、コプロセッサ８は処理要求内容に沿った処理を実行する。
【００２７】
コプロセッサ８は、処理要求内容に沿ってインフィニバンドスイッチ９を介して接続されたTCAとデータ伝送を行い、ワークリクエスト２６を完了する。ワークリクエスト２６を処理し終えたら、コプロセッサ８は処理されたワークリクエスト２６に対応するワークコンプリーション３０を作成し、開始番地と終了番地により特定される領域としてメモリ７に確保された、キュー番号CQ1のコンプリーションキュー２８に蓄積する。
【００２８】
CPU２は、特定のタイミングでコンプリーションキュー２８からワークコンプリーション３０を回収し、対応するワークリクエスト２６が完了したことを確認し、メモリ５のセマフォ変数表２２のセマフォ変数を更新する。このワークコンプリーション回収処理の詳細については後述する。こうして処理要求が完了する。次に、ワークリクエスト２６、ワークコンプリーション３０、セマフォ変数表２２のデータ構成を説明する。
【００２９】
図３は、ワークキュー２４に蓄積されるワークリクエスト２６のデータ構成例を示す図である。図３の各エントリには、ワークリクエスト２６を特定する識別番号（Work Request ID）３１と、処理要求に関連するデータ３２が格納される。処理要求に関連するデータ３２には、図示しないが例えば、データの送信や受信等の処理要求内容、データの送信先や送信するデータ、受信したデータの格納先といった情報が格納されている。
【００３０】
図４は、コンプリーションキュー２８に蓄積されるワークコンプリーション３０のデータ構成例を示す図である。図４の各エントリには、処理されたワークリクエスト２６を特定する識別番号(Work Request ID)４１と、処理されたワークリクエスト２６に関連するデータ４２が格納される。処理されたワークリクエスト２６に関連するデータ４２には、図示しないが例えば、正常終了したか異常終了したかを示す終了ステータスや、エラー内容を示すエラーコード等が格納される。ワークコンプリーション３０を参照することにより、どのワークリクエスト２６がどのような状態で完了したのかを確認することができる。
【００３１】
図５は、メモリ５に格納されるセマフォ変数表２２である。図５の各エントリには、キュー番号５１とそのキュー番号のセマフォ変数値５２が格納される。図５においては、WQ1がワークキュー２４に対するキュー番号５１を示し、SW1は、ワークキュー２４に対するセマフォ変数値５２である。
【００３２】
また、本発明の第一の実施形態においては、１つのワークキュー２４にのみセマフォ変数が設定されるが、複数のワークキュー２４が存在する場合、各キューに設定されたセマフォ変数が図５の行データとしてセマフォ変数表に追加される。さらに、コンプリーションキュー２８に対するセマフォ変数が設定され、セマフォ変数表に追加されてもよい。セマフォ変数表２２を参照すれば、ワークキュー２４あるいはコンプリーションキュー２８に対応するセマフォ変数値５２を得ることができ、ワークキュー２４に対しワークリクエスト２６の追加蓄積が可能か判定することができる。
【００３３】
なお、本発明の第一の実施形態においては、セマフォ変数表２２を用いるが、表を使わない実装も可能である。例えば、ハッシュ関数を用いて、ワークキュー番号に対応するセマフォを特定するポインタがわかるようにしてもよい。
【００３４】
続いて、本発明の第一の実施形態におけるワークリクエスト蓄積処理、ワークコンプリーション回収処理をそれぞれ説明する。
【００３５】
図６は、本発明の第一の実施形態におけるワークリクエスト蓄積処理を説明するフローチャートである。予め、セマフォ変数表２２には、キュー番号WQ1のワークキュー２４に対応するセマフォ変数の初期値として、ワークキュー２４に蓄積可能なデータの最大数が設定されている。
【００３６】
まず、CPU２は、ワークキュー２４のセマフォ変数が正の値か判定する（Ｓ６２）。CPU２は、メモリ５のセマフォ変数表２２を参照し、キュー番号WQ1であるワークキュー２４に対応するセマフォ変数値５２を得る。得られたセマフォ変数値が正であれば、ワークキュー２４には空きがあり、ワークリクエスト２６が追加蓄積できることを意味する。
【００３７】
ステップＳ６２でワークキュー２４に空きがある場合、CPU２はワークキュー２４のセマフォ変数から１減算した値を新たなセマフォ変数としてセマフォ変数表２２を更新する（Ｓ６３）。これは、ワークリクエスト２６が蓄積される場合ワーククキュー２４の空きが１つ消費されることによるものである。
【００３８】
そして、ステップＳ６２で空きが無いと判定される場合、一定時間待機し再びステップＳ６２の処理を実施する。こうして、ワークキュー２４に空きができるのを待つ。もしくは、蓄積をあきらめる。
【００３９】
ステップＳ６３が済むと、ワークキュー２４にワークリクエスト２６を追加蓄積する（Ｓ６６）。そして、ステップＳ６４の蓄積処理が成功したか判定する（Ｓ６７）。ワークキュー２４への蓄積は可能な状態でも、蓄積処理の途中で装置の電源断や、割り込み処理による蓄積処理中止などで、蓄積処理に失敗した場合そのままワークリクエスト蓄積処理を中止する。
【００４０】
ステップＳ６７でワークリクエスト２６の蓄積に成功すれば、ワークリクエスト蓄積処理を終了する。ステップＳ６７で失敗した場合、ワークキュー２４のセマフォ変数に１加算し（Ｓ６９）、ワークリクエスト蓄積処理を終了する。ステップＳ６３では、ワークリクエストが蓄積されワーククキュー２４の空きが１つ消費されるものとしてセマフォ変数を更新したが、ステップＳ６７でワークリクエストの蓄積に失敗したため、ワーククキュー２４の空きは消費されていない。従ってステップＳ６９では、ステップＳ６３で減算した値を元に戻す。
【００４１】
図６のワークリクエスト蓄積処理によって、ワークキューの空き状態を表すセマフォ変数が適切に更新され、空きが無い場合、ワークリクエスト２６が追加されることはなく、ワークキュー２４のオーバフローを防止することができる。
【００４２】
図７は、本発明の第一の実施形態におけるワークコンプリーション回収処理を説明するフローチャートである。まず、コンプリーションキュー２８にワークコンプリーション３０が蓄積されているか判定する（Ｓ７１）。CPU２は、コンプリーションキュー２８の先頭からワークコンプリーション３０を回収し、コンプリーションキュー２８が空なら、そのままワークコンプリーション回収処理を終了する。
【００４３】
そして、CPU２はワークキュー２４のセマフォ変数に１加算した値をセマフォ変数として更新し（Ｓ７３）、ワークコンプリーション回収処理を終了する。これは、ワークリクエスト２６の処理が完了したため、ワーククキュー２４で１つ空きができたことを確認できたからである。ワークキュー２４に対応するセマフォ変数値５２は、コプロセッサ８がワークリクエスト２６の処理を完了した際に更新されるべきだが、CPU２はどのタイミングでコプロセッサ８がワークリクエスト２６を処理するか知ることができない。そこで、ワークコンプリーション３０の回収時にワークキュー２４に空きができたものとみなし、セマフォ変数を更新する。
【００４４】
図７のワークコンプリーション回収処理によって、ワークキュー２４の空き状態を表すセマフォ変数が適切に更新され、ワークキュー２４のあふれを防止することができる。また、ワークコンプリーション３０の回収時にワークキュー２４のセマフォ変数を更新することにより、本発明はHCAのコプロセッサ８の処理に関係なくOSやアプリケーション側のみで実装することができ、導入が容易になり、ハードウエアの実装を複雑化させずに済む。
【００４５】
以上本発明の第一の実施形態によれば、ワークキュー２４に対応するセマフォ変数を適切に更新し、ワークリクエストを追加する場合、セマフォ変数を参照することにより、ワークキュー２４のオーバフローを防止することが可能である。
【００４６】
また、第一の実施形態において予めコンプリーションキュー２８に蓄積可能なデータ数がワークキュー２４に蓄積可能なデータ数の最大数以上になるようコンプリーションキュー２８のサイズを設定することにより（コンプリーションキュー２８に対するセマフォ変数を設定することなく）、ワークキュー２４に対して設定されたセマフォ変数のみを利用し本発明を適用することができる。
【００４７】
すなわち、ある時点でワークキュー２４に蓄積されたワークリクエスト２６をすべてコンプリーションキュー２８に移したとしても、コンプリーションキュー２８が溢れないことが確約されるため、要求処理の実行にあたっては、各ワークキュー２４へワークリクエスト２６を蓄積する際のワークキュー２４のオーバフローのみを防止すればよいからである。
【００４８】
第一の実施形態においては、ワークキュー２４にのみセマフォ変数を設定したが、コンプリーションキュー２８にのみセマフォ変数を設定し、コンプリーションキュー２８のオーバフローを防止することも可能である。図６、図７におけるステップＳ６２、Ｓ６３、Ｓ７３のワークキュー２４の箇所を適宜コンプリーションキュー２８と読み替えることで本発明の適用が可能となる。
【００４９】
コンプリーションキューに空きが無い場合、ワークリクエスト２６が追加されることはない。ワークリクエスト２６とワークコンプリーション３０は1対１に対応するため、追加されたワークリクエスト２６が原因でコンプリーションキュー２８がオーバフローすることはない。こうして、コンプリーションキュー２８のオーバフローを防止することができる。また、ワークリクエスト２６の蓄積時にコンプリーションキュー２８のセマフォ変数を更新することにより、本発明はHCAのコプロセッサの処理に関係なく実装することができ、導入が容易になり、ハードウエアの実装を複雑化させずに済む。
【００５０】
また、第一の実施形態の変形例として、ワークキュー２４、コンプリーションキュー２８に共にセマフォ変数を設定し、両キューのオーバフローを防止することも可能である。第一の実施形態の変形例におけるワークリクエスト蓄積処理とワークコンプリーション回収処理について説明する。
【００５１】
図８は、第一の実施形態の変形例におけるワークリクエスト蓄積処理を説明するフローチャートである。図６と同じステップには同じステップ番号が振られており、必要がなければ説明は省略する。予め、セマフォ変数表２２には、キュー番号WQ1、CQ1のワークキュー２４、コンプリーションキュー２８に対応するセマフォ変数の初期値として、各キューに蓄積可能なデータの最大数が設定されている。
【００５２】
まず、CPU２は、ワークキュー２４に対応するセマフォ変数が正の値か判定する（Ｓ６２）。これは、図６と同じステップであり説明を省略する。ステップＳ６２でワークキュー２４に空きがある場合、CPU２はワークキュー２４のセマフォ変数から１減算した値を新たなセマフォ変数としてセマフォ変数表２２を更新する（Ｓ６３）。これは、ワークリクエスト２６が蓄積される場合ワーククキュー２４の空きが１つ消費されることによるものである。
【００５３】
ステップＳ６２で空きが無いと判定される場合、一定時間待機し再びステップＳ６２の処理を実施する。こうして、ワークキュー２４に空きができるのを待つ。もしくは、蓄積をあきらめる。
【００５４】
ステップＳ６３が済むと、コンプリーションキュー２８に対応するセマフォ変数が正の値か判定する（Ｓ６４）。CPU２は、セマフォ変数表２２を参照し、キュー番号CQ1であるコンプリーションキュー２８に対応するセマフォ変数値５２を得る。セマフォ変数値が正であれば、コンプリーションキュー２８に空きがあり、ワークコンプリーション３０を蓄積できることを意味する。
【００５５】
ステップＳ６４で空きがあると判定される場合、CPU２はコンプリーションキュー２８のセマフォ変数から１減算した値を新たなセマフォ変数としてセマフォ変数表２２を更新する（Ｓ６５）。コンプリーションキュー２８に対応するセマフォ変数値は、コプロセッサ８がワークリクエスト２６の処理を完了した後に更新されるべきだが、CPU２はどのタイミングでコプロセッサ８がワークリクエスト２６を処理するか知ることができない。また、ワークキュー２４に蓄積されたワークリクエスト２６は必ず処理完了後にそのワークリクエスト２６に対応するワークコンプリーション３０がコンプリーションキュー２８に蓄積され、１対１に対応するものである。そこで、ワークキュー２４へのワークリクエスト２６の蓄積時にコンプリーションキュー２８が１つ消費されたものとみなし、コンプリーションキュー２８のセマフォ変数を更新する。
【００５６】
ステップＳ６４で空きが無いと判定される場合、一定時間待機し再びステップＳ６４の処理を実施する。こうして、コンプリーションキュー２８に空きができるのを待つ。
【００５７】
こうして、ワークキュー２４とコンプリーションキュー２８に共に空きがある場合、ワークキュー２４にワークリクエスト２６を蓄積する（Ｓ６６）。そして、ステップＳ６４の蓄積処理が成功したか判定する（Ｓ６７）。
【００５８】
ステップＳ６７でワークリクエスト２６の蓄積に成功すれば、ワークリクエスト蓄積処理を終了する。ステップＳ６７で失敗した場合、ワークキュー２４のセマフォ変数、コンプリーションキューのセマフォ変数にそれぞれ１加算し（Ｓ６９）、ワークリクエスト蓄積処理を終了する。ステップＳ６３、Ｓ６５では、ワークリクエストが蓄積されワーククキュー２４、コンプリーションキュー２８の空きがそれぞれ１つ消費されるものとして、セマフォ変数を更新したが、ステップＳ６７でワークリクエストの蓄積に失敗したため、ワーククキュー２４、コンプリーションキュー２８の空きは消費されていない。従ってステップＳ６９では、ステップＳ６３、Ｓ６５で減算した値を元に戻す。
【００５９】
図８のワークリクエスト２６蓄積処理によって、各キューの空き状態を表すセマフォ変数が適切に更新され、ワークキューに空きが無い場合、ワークリクエスト２６が追加されることはない。また、コンプリーションキューに空きが無い場合も同様にワークリクエスト２６が追加されることはない。ワークリクエスト２６とワークコンプリーション３０は1対１に対応するため、追加されたワークリクエスト２６が原因でコンプリーションキュー２８がオーバフローすることはない。こうして、ワークキュー２４、およびコンプリーションキュー２８のオーバフローを防止することができる。また、ワークリクエスト２６の蓄積時にコンプリーションキュー２８のセマフォ変数を更新することにより、本発明はHCAのコプロセッサの処理に関係なく実装することができ、導入が容易になり、ハードウエアの実装を複雑化させずに済む。
【００６０】
図９は、第一の実施形態の変形例におけるワークコンプリーション回収処理を説明するフローチャートである。図７と同じステップには同じステップ番号が振られており、必要がなければ説明は省略する。
【００６１】
まず、コンプリーションキュー２８にワークコンプリーション３０が蓄積されているか判定する（Ｓ７１）。そして、CPU２はワークキュー２４のセマフォ変数に１加算した値をセマフォ変数として更新する（Ｓ７３）。次に、コンプリーションキュー２８のセマフォ変数に１加算した値を新たなセマフォ変数値として更新する（Ｓ７４）。これは、ステップＳ８２でワークコンプリーション３０を１つ回収したことによりコンプリーションキュー２８に空きができたためである。
【００６２】
図９のワークコンプリーション３０回収処理によって、各キューの空き状態を表すセマフォ変数が適切に更新され、ワークキュー２４、およびコンプリーションキュー２８のあふれを防止することができる。また、ワークコンプリーション３０の回収時にワークキュー２４のセマフォ変数を更新することにより、本発明はHCAのコプロセッサの処理に関係なく実装することができ、導入が容易になり、ハードウエアの実装を複雑化させずに済む。
【００６３】
なお、上記の第一の実施形態の変形例は、ワークキュー２４とコンプリーションキュー２８が１対１に対応するのであれば、それぞれが複数存在する構成においても適用が可能である。
【００６４】
次に本発明の第二の実施形態について説明する。第二の実施形態は、第一の実施形態と同じ図１の構成において、メモリ上に複数のワークキュー２４が確保され、複数のワークキュー２４に対し１つのコンプリーションキュー２８が確保される場合である。本発明の第二の実施形態においては、ワークキュー２４およびコンプリーションキュー２８に対して、各キューに蓄積可能なデータ（ワークリクエスト２６およびワークコンプリーション３０）の個数を示すセマフォ変数を設定することで、各キューが溢れることを防止する。
【００６５】
図１０は、本発明の第二の実施形態においてCPU２が周辺機器に格納されたデータにアクセスする際の動作を示す図である。図２と同じ箇所には同じ番号が振られており、必要が無ければ説明を省略する。
【００６６】
図１０のCPU２は、OSやアプリケーションプログラムからの処理要求を含むデータをワークリクエスト２６として、開始番地と終了番地により特定される領域としてそれぞれメモリ７に確保された、ワークキュー番号WQ1からWQnまでのn個(nは自然数)のワークキュー２４1からワークキュー２４nに蓄積する。CPU２は各ワークキュー２４と後述するコンプリーションキュー２８に対応して設定されるセマフォ変数が格納されたメモリ５のセマフォ変数表２２を参照し、ワークリクエスト２６の蓄積が可能か判定する。
【００６７】
ワークリクエスト２６の蓄積が可能であれば、ワークリクエスト２６がワークキュー２４の末尾に追加される。CPU２は、ワークリクエスト２６がどのワークキュー２４に蓄積されたかを示す情報をメモリ５のワークキュー２４対ワークリクエスト２６対応表２３に格納し、そしてセマフォ変数表２２を更新する。このワークリクエスト２６蓄積処理の詳細については後述する。
【００６８】
コプロセッサ８は、特定のタイミングでワークキュー２４から先頭のワークリクエスト２６を取り出し、処理要求を実行し、処理要求内容に沿ってインフィニバンドスイッチ９を介しファブリックネットワークに接続されたTCAとデータ伝送を行い、ワークリクエスト２６を完了する。取り出したワークリクエスト２６を処理し終えたら、コプロセッサ８はワークコンプリーション３０を作成し、コンプリーションキュー２８に蓄積する。一般には、ワークキュー２４とコンプリーションキュー２８が１対１に対応している必要はなく、図１０のように１つのコンプリーションキュー２８に対して複数のワークキュー２４を対応させることが可能である。
【００６９】
CPU２は、特定のタイミングでコンプリーションキュー２８からワークコンプリーション３０を回収し、対応するワークリクエスト２６が完了したことを確認し、処理要求が完了する。同時にCPU２はメモリ５のセマフォ変数表２２のセマフォ変数を更新する。このワークコンプリーション回収処理の詳細については後述する。
【００７０】
なお、図２では１つだが、コンプリーションキュー２８を複数有する構成にすることも可能である。また各ワークキュー２４には特定の役割を与えることができる。例えば、WQ1はInfinibandメッセージ送信用のワークリクエスト２６が、WQ2はInfinibandメッセージ受信用のワークリクエスト２６が蓄積されるよう設定することが可能である。また、ワークリクエスト２６、ワークコンプリーション３０、セマフォ変数表２２のデータ構成は、第一の実施形態と同じくそれぞれ図３、図４、図５のようになっている。
【００７１】
図１１は、メモリ５に格納されるワークキュー対ワークリクエスト対応表２３である。図１１の各エントリには、キュー番号５１とそのキュー番号で特定されるワークキュー２４に蓄積されたワークリクエスト番号３１のリスト１１１が格納される。この対応表を参照すれば、各ワークキュー２４に蓄積されたワークリクエスト２６番号のリストを得ることができる。従って、あるワークリクエスト２６がどのワークキュー２４に蓄積されたかを特定することが可能である。図１１においては、例えば、キュー番号WQ1であるキューに、リストWRL1に含まれるワークリクエスト番号（１、１２、２８）で特定されるワークリクエスト２６が蓄積されていることがわかる。
【００７２】
次に本発明の第二の実施形態におけるワークリクエスト蓄積処理およびワークコンプリーションを説明する。
【００７３】
図１２は、本発明の第二の実施形態におけるワークリクエスト蓄積処理を説明するフローチャートである。図６および図８と同じステップには同じステップ番号が振られており、必要がなければ説明は省略する。予め、セマフォ変数表２２には、各キューに対するセマフォ変数の初期値として、各キューに蓄積可能なデータの最大数が設定されている。
【００７４】
まず、OSやアプリケーションプログラムからの処理要求に対応するワークキュー２４が決定される（Ｓ６１）。CPU２は、処理要求内容に応じて、適切なワークキュー２４のワークキュー２４番号を取得する。例えば、処理要求内容がデータ送信で、図１０のキュー番号WQ1のワークキュー２４がデータ送信用に割り当てられていれば、キュー番号WQ1のワークキュー２４が選択される。各ワークキュー２４への用途の割り当ては自由に定めることができる。また、各ワークキュー２４に特に用途が設定されていなければ任意に１つのワークキュー２４を選択してもよい。
【００７５】
次にステップＳ６１で決定されたワークキュー２４のセマフォ変数が正の値か判定する（Ｓ６２）。CPU２は、メモリ５のセマフォ変数表２２を参照し、ステップＳ６１で決定されたワークキュー２４のセマフォ変数値を得る。
【００７６】
ステップＳ６２でセマフォ変数の値が正であれば、CPU２はステップＳ６１で決定されたワークキュー２４のセマフォ変数から１減算した値を新たなセマフォ変数としてセマフォ変数表２２を更新する（Ｓ６３）。ステップＳ６２でセマフォ変数の値が正であれば、そのワークキュー２４には空きがあり、ワークリクエスト２６が蓄積できる。従って、ワークリクエスト２６が蓄積された場合そのワーククキューの空きが１つ消費されることによるものである。
【００７７】
ステップＳ６２で空きが無いと判定される場合、一定時間待機し再びステップＳ６２の処理を実施する。こうして、ワークキュー２４に空きができるのを待つ。
【００７８】
ステップＳ６３が済むと、コンプリーションキュー２８のセマフォ変数が正の値か判定する（Ｓ６４）。CPU２は、セマフォ変数表２２を参照し、コンプリーションキュー２８のセマフォ変数値を得る。セマフォ変数値が正であれば、コンプリーションキュー２８に空きがあり、ワークコンプリーション３０を蓄積できる。
【００７９】
ステップＳ６４で空きがあると判定される場合、CPU２はコンプリーションキュー２８のセマフォ変数から１減算した値を新たなセマフォ変数としてセマフォ変数表２２を更新する（Ｓ６５）。コンプリーションキュー２８に対応するセマフォ変数値は、コプロセッサ８がワークリクエスト２６の処理を完了した後に更新されるべきだが、CPU２はどのタイミングでコプロセッサ８がワークリクエスト２６を処理するか知ることができない。また、ワークキュー２４に蓄積されたワークリクエスト２６は必ず処理完了後にそのワークリクエスト２６に対応するワークコンプリーション３０がコンプリーションキュー２８に蓄積され、１対１に対応するものである。そこで、ワークキュー２４へのワークリクエスト２６の蓄積時にコンプリーションキュー２８が１つ消費されたものとみなし、コンプリーションキュー２８のセマフォ変数を更新する。
【００８０】
ステップＳ６４で空きが無いと判定される場合、一定時間待機し再びステップＳ６４の処理を実施する。こうして、コンプリーションキュー２８に空きができるのを待つ。
【００８１】
こうして、ワークキュー２４とコンプリーションキュー２８に共に空きがある場合、ステップＳ６１で決定されたワークキュー２４にワークリクエスト２６を蓄積する（Ｓ６６）。次に、ステップＳ６６の蓄積処理が成功したか判定する（Ｓ６７）。ワークキュー２４への蓄積は可能な状態であったが、蓄積処理の途中で装置の電源断や、割り込み処理による蓄積処理中止などで、蓄積処理に失敗した場合そのままワークリクエスト蓄積処理を中止する。
【００８２】
ステップＳ６７でワークリクエスト２６の蓄積に成功すれば、ステップＳ６６で蓄積されたワークリクエスト２６と、そのワークリクエスト２６が蓄積されたワークキュー２４を対応付けて記録し（Ｓ６８）、  ワークリクエスト蓄積処理を終了する。これは、メモリ５に格納されたワークキュー対ワークリクエスト対応表２３で、ワークキュー２４のキュー番号５１に対応するワークリクエストＩＤリストに、ステップＳ６４で蓄積されたワークリクエスト番号を追加すればよい。
【００８３】
ステップＳ６７で失敗した場合、ステップＳ６１で特定されたワークキュー２４のセマフォ変数、コンプリーションキューのセマフォ変数にそれぞれ１加算し（Ｓ６９）、ワークリクエスト蓄積処理を終了する。ステップＳ６３、Ｓ６５では、ワークリクエストが蓄積されワーククキュー２４、コンプリーションキュー２８の空きがそれぞれ１つ消費されるものとして、セマフォ変数を更新したが、ステップＳ６７でワークリクエストの蓄積に失敗したため、ワーククキュー２４、コンプリーションキュー２８の空きは消費されていない。従ってステップＳ６９では、ステップＳ６３、Ｓ６５で減算した値を元に戻す。
【００８４】
図１２のワークリクエスト蓄積処理によって、各キューの空き状態を表すセマフォ変数が適切に更新され、ワークキューに空きが無い場合、ワークリクエスト２６が追加されることはない。また、コンプリーションキューに空きが無い場合も同様にワークリクエスト２６が追加されることはない。ワークリクエスト２６とワークコンプリーション３０は1対１に対応するため、追加されたワークリクエスト２６が原因でコンプリーションキュー２８がオーバフローすることはない。こうして、ワークキュー２４、およびコンプリーションキュー２８のオーバフローを防止することができる。また、ワークリクエスト２６の蓄積時にコンプリーションキュー２８のセマフォ変数を更新することにより、本発明はHCAのコプロセッサの処理に関係なく実装することができ、導入が容易になり、ハードウエアの実装を複雑化させずに済む。
【００８５】
図１３は、本発明の第二の実施形態におけるワークコンプリーション回収処理を説明するフローチャートである。まず、コンプリーションキュー２８にワークコンプリーション３０が蓄積されているか判定する（Ｓ７１）。CPU２は、コンプリーションキュー２８の先頭からワークコンプリーション３０を取り出し、コンプリーションキュー２８が空なら、そのまま処理を終了する。
【００８６】
次に、抽出されたワークコンプリーション３０からそのワークコンプリーション３０に対応するワークリクエスト２６が蓄積されたワークキュー２４を特定する（Ｓ７２）。ワークコンプリーション３０は処理が完了したワークリクエスト２６に対応して作成されるものであり、図４に示されているように、ワークコンプリーション３０には、処理されたワークリクエスト番号４１が格納されている。CPU２は、メモリ５のワークキュー対ワークリクエスト対応表２３を参照し、得られたワークリクエスト番号４１が含まれるワークリクエストＩＤリスト１１１を検索し、対応するキュー番号５１を得る。
【００８７】
そして、CPU２はステップＳ７２で特定されたワークキュー２４のセマフォ変数に１加算した値をセマフォ変数として更新する（Ｓ７３）。これは、ワークリクエスト２６の処理が完了したため、ステップＳ７２で特定されたワーククキューで１つ空きができたことを確認できたからである。ワークキュー２４に対応するセマフォ変数値は、コプロセッサ８がワークリクエスト２６の処理を完了した際に更新されるべきだが、CPU２はどのタイミングでコプロセッサ８がワークリクエスト２６を処理するか知ることができない。そこで、ワークコンプリーション３０の回収時にワークキュー２４に空きができたものとみなし、セマフォ変数を更新する。
【００８８】
次に、コンプリーションキュー２８のセマフォ変数に１加算した値を新たなセマフォ変数値として更新する（Ｓ７４）。これは、ステップＳ７２でワークコンプリーション３０を１つ回収したことによりコンプリーションキュー２８に空きができたためである。
【００８９】
図１３のワークコンプリーション回収処理によって、各キューの空き状態を表すセマフォ変数が適切に更新され、ワークキュー２４、およびコンプリーションキュー２８のオーバフローを防止することができる。また、ワークコンプリーションの回収時にワークキュー２４のセマフォ変数を更新することにより、本発明はHCAのコプロセッサの処理に関係なく実装することができ、導入が容易になり、ハードウエアの実装を複雑化させずに済む。
【００９０】
また、第二の実施形態において予めコンプリーションキュー２８に蓄積可能なデータ数が各ワークキュー２４に蓄積可能なデータ数の最大数の総和以上になるようコンプリーションキュー２８のサイズを設定することにより、コンプリーションキュー２８に対するセマフォ変数を設定することなく、ワークキュー２４に対して設定されたセマフォ変数のみを利用し本発明を適用することができる。
【００９１】
すなわち、ある時点で各ワークキュー２４に蓄積されたワークリクエスト２６をすべてコンプリーションキュー２８に移したとしても、コンプリーションキュー２８が溢れないことが確約されるため、処理要求の実行にあたっては、各ワークキュー２４へワークリクエスト２６を蓄積する際のワークキュー２４のオーバフローのみを防止すればよいからである。
【００９２】
本発明は、サーバ対サーバ、サーバ対ストレージ、ブレードサーバのバックプレーンを介したブレード間のプロセス間通信あるいは同一サーバ内のプロセス間通信にも適用が可能である。また、プログラムとしてOSやアプリケーションプログラムの機能として組み込んだり、OSとアプリケーションプログラムの仲介をするミドルウエアとして提供することが可能である。
【００９３】
以上をまとめると付記のようになる。
【００９４】
（付記１）  処理要求情報が蓄積される第一の領域を設定する工程と、処理要求の完了を示す情報である処理完了情報が蓄積される第二の領域を設定する工程と、前記第一の領域に対応するセマフォ変数の初期値を前記第一の領域に蓄積可能な情報数の最大数として設定する工程と、前記第一の領域に対応するセマフォ変数の値から１を減算した値が正の値か判定し、正の値であれば、前記第一の領域に前記処理要求情報を追加し、前記第一の領域に対応するセマフォ変数の値から１を減算した値を前記第一の領域に対応するセマフォ変数として更新する工程と、前記要求された処理が完了した場合、該処理要求を特定する情報と前記処理完了情報を対応付けて前記第二の領域に蓄積する工程と、前記第二の領域に前記処理完了情報が蓄積されているか判定し、蓄積されていれば、前記第一の領域に対応するセマフォ変数に１を加算した値を前記第一の領域に対応するセマフォ変数として更新し、前記処理完了情報を１つ削除する工程を有することを特徴とする情報蓄積制御方法。
【００９５】
（付記２）  付記１において、前記第二の領域に蓄積可能な情報数の最大数が、前記第一の領域に蓄積可能な情報数の最大数以上であることを特徴とする情報蓄積制御方法。
【００９６】
（付記３）  処理要求情報が蓄積される第一の領域を設定する工程と、処理要求の完了を示す情報である処理完了情報が蓄積される第二の領域を設定する工程と、前記第一の領域および前記第二の領域にそれぞれ対応するセマフォ変数の初期値を前記第一の領域および前記第二の領域にそれぞれ蓄積可能な情報数の最大数として設定する工程と、前記第一の領域に対応するセマフォ変数の値から１を減算した値と前記第二の領域に対応するセマフォ変数の値から１を減算した値が共に正の値か判定し、共に正の値であれば、前記第一の領域に処理要求情報を追加し、かつ前記第一の領域に対応するセマフォ変数の値から１を減算した値を前記第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から１を減算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ更新する工程と、前記処理要求が完了した場合、該処理要求を特定する情報を前記処理完了情報と対応付けて前記第二の領域に蓄積する工程と、前記第二の領域に前記処理完了情報が蓄積されているか判定し、蓄積されていれば、前記第一の領域に対応するセマフォ変数に１を加算した値を前記第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から１を加算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ更新し、前記処理完了情報を１つ削除する工程を有することを特徴とする情報蓄積制御方法。
【００９７】
（付記４）  処理要求情報が蓄積される複数の第一の領域を設定する工程と、処理要求の完了を示す情報である処理完了情報が蓄積される第二の領域を設定する工程と、前記複数の第一の領域にそれぞれ対応するセマフォ変数の初期値を前記複数の第一の領域にそれぞれ蓄積可能な情報数の最大数として設定する工程と、前記複数の第一の領域のうち１つを選択し、前記選択された第一の領域に対応するセマフォ変数の値から１を減算した値が正の値か判定し、正の値であれば、前記選択された第一の領域に処理要求情報を追加し、前記選択された第一の領域と前記処理要求を特定する情報を対応付けて対応表に蓄積し、前記選択された第一の領域に対応するセマフォ変数の値から１を減算した値を前記選択された第一の領域に対応するセマフォ変数として更新する工程と、前記処理要求が完了した場合、該処理要求を特定する情報を前記処理完了情報と対応付けて前記第二の領域に蓄積する工程と、前記第二の領域に前記処理完了情報が蓄積されているか判定し、蓄積されていれば、前記処理完了情報を１つ読み出し、前記読み出された処理完了情報に対応する前記処理要求を特定し、前記対応表を参照して該特定された処理要求が蓄積された前記第一の領域を特定し、該特定された第一の領域に対応するセマフォ変数に１を加算した値を前記特定された第一の領域に対応するセマフォ変数として更新し、前記読み出された処理完了情報を削除する工程を有することを特徴とする情報蓄積制御方法。
【００９８】
（付記５）  付記４において、前記第二の領域に蓄積可能な情報数の最大数が、前記複数の第一の領域に蓄積可能な情報数の最大数の総和以上であることを特徴とする情報蓄積制御方法。
【００９９】
（付記６）  処理要求情報が蓄積される複数の第一の領域を設定する工程と、処理要求の完了を示す情報である処理完了情報が蓄積される第二の領域を設定する工程と、複数の第一の領域の各第一の領域および第二の領域にそれぞれ対応するセマフォ変数の初期値を前記各第一の領域および前記第二の領域にそれぞれ蓄積可能な情報数の最大数として設定する工程と、前記複数の第一の領域のうち１つを選択し、前記選択された第一の領域に対応するセマフォ変数の値から１を減算した値と前記第二の領域に対応するセマフォ変数の値から１を減算した値が共に正の値か判定し、共に正の値であれば、前記選択された第一の領域に処理要求情報を追加し、前記選択された第一の領域と前記処理要求を特定する情報とを対応付けて対応表に蓄積し、前記選択された第一の領域に対応するセマフォ変数の値から１を減算した値を前記選択された第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から１を減算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ更新する工程と、前記処理要求が完了した場合、該処理要求を特定する情報を前記処理完了情報に対応付けて前記第二の領域に蓄積する工程と、前記第二の領域に前記処理完了情報が蓄積されているか判定し、蓄積されていれば、前記処理完了情報を１つ読み出し、前記読み出された処理完了情報に対応する前記処理要求を特定し、前記対応表を参照して該特定された処理要求が蓄積された前記第一の領域を特定し、該特定された第一の領域に対応するセマフォ変数に１を加算した値を前記特定された第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数に１を加算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ更新し、前記読み出された処理完了情報を削除する工程を有することを特徴とする情報蓄積制御方法。
【０１００】
（付記７）  処理要求情報が蓄積される第一の領域と、処理要求の完了を示す情報である処理完了情報が前記処理要求を特定する情報と対応付けられ蓄積される第二の領域と、前記第一の領域を特定する情報とセマフォ変数が対応付けられ蓄積されるセマフォ変数表とが格納される蓄積部と、前記蓄積部を制御する制御部とを有する装置において実行されるプログラムであって、前記制御部に、前記第一の領域に対応するセマフォ変数の初期値を前記第一の領域に蓄積可能な情報数の最大数として設定させる工程と、前記第一の領域に対応するセマフォ変数の値から１を減算した値が正の値か判定させ、正の値であれば、前記第一の領域に対応するセマフォ変数の値から１を減算した値を前記第一の領域に対応するセマフォ変数として前記セマフォ変数表を更新させ、前記第一の領域へ前記処理要求情報を追加させる工程と、前記第二の領域に前記処理完了情報が蓄積されているか判定させ、蓄積されていれば、前記第一の領域に対応するセマフォ変数に１を加算した値を前記第一の領域に対応するセマフォ変数として前記セマフォ変数表を更新させ、前記処理完了情報を１つ削除させる工程を実行させるためのプログラム。
【０１０１】
（付記８）  処理要求情報が蓄積される第一の領域と、処理要求の完了を示す処理完了情報が前記処理要求を特定する情報と対応付けられ蓄積される第二の領域と、前記第一の領域を特定する情報とセマフォ変数が対応付けられ蓄積されるセマフォ変数表とが格納される蓄積部と、前記蓄積部を制御する制御部とを有する装置において実行されるプログラムであって、前記制御部に、前記第一の領域および前記第二の領域にそれぞれ対応するセマフォ変数の初期値を前記第一の領域および前記第二の領域にそれぞれ蓄積可能な情報数の最大数として設定させる工程と、前記第一の領域に対応するセマフォ変数の値から１を減算した値と前記第二の領域に対応するセマフォ変数の値から１を減算した値が共に正の値か判定させ、共に正の値であれば、前記第一の領域に対応するセマフォ変数の値から１を減算した値を前記第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から１を減算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ前記セマフォ変数表を更新させ、前記第一の領域へ前記処理要求情報を追加させる工程と、前記第二の領域に前記処理完了情報が蓄積されているか判定させ、蓄積されていれば、前記第一の領域に対応するセマフォ変数に１を加算した値を前記第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から１を加算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ前記セマフォ変数表を更新させ、前記処理完了情報を１つ削除させる工程を実行させるためのプログラム。
【０１０２】
（付記９）  処理要求情報が蓄積される複数の第一の領域と、処理要求の完了を示す処理完了情報が前記処理要求を特定する情報と対応付けられ蓄積される第二の領域と、前記第一の領域を特定する情報とセマフォ変数が対応付けられ蓄積されるセマフォ変数表とが格納される蓄積部と、前記蓄積部を制御する制御部とを有する装置において実行されるプログラムであって、前記制御部に、前記複数の第一の領域の各第一の領域および前記第二の領域にそれぞれ対応するセマフォ変数の初期値を前記第一の領域および前記第二の領域にそれぞれ蓄積可能な情報数の最大数として設定させる工程と、前記複数の第一の領域のうち１つを選択し、前記選択された第一の領域に対応するセマフォ変数の値から１を減算した値と前記第二の領域に対応するセマフォ変数の値から１を減算した値が共に正の値か判定させ、共に正の値であれば、前記選択された第一の領域と前記処理要求を対応付けて対応表に蓄積させ、前記選択された第一の領域に対応するセマフォ変数の値から１を減算した値を前記選択された第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から１を減算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ前記セマフォ変数表を更新させ、前記選択された第一の領域へ前記処理要求情報を追加させる工程と、前記第二の領域に前記処理完了情報が蓄積されているか判定させ、蓄積されていれば、前記処理完了情報を１つ読み出し、前記読み出された処理完了情報に対応する前記処理要求を特定し、該特定された第一の領域に対応するセマフォ変数に１を加算した値を前記特定された第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から１を加算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ前記セマフォ変数表を更新させ、前記処理完了情報を１つ削除させる工程を実行させるためのプログラム。
【０１０３】
（付記１０）  処理要求情報が蓄積される第一の領域と、処理要求の完了を示す情報である処理完了情報が前記処理要求を特定する情報と対応付けられ蓄積される第二の領域とが格納される蓄積部と、前記蓄積部を制御し、前記処理要求を実行する制御部を有する第一の装置と、前記第一の装置に接続され、前記第一の領域を特定する情報とセマフォ変数が対応付けられ蓄積されるセマフォ変数表とが格納される蓄積部と、前記蓄積部を制御し、前記処理要求情報を前記第一の装置へ送信する制御部を有する第二の装置とを備え、前記第二の装置における制御部は、予め前記第一の領域に対するセマフォ変数の初期値を前記第一の領域に蓄積可能な情報数の最大数として設定し、特定のタイミングで前記第一の領域に対応するセマフォ変数から１を減算した値が正の値か判定し、正の値であれば、前記第一の領域に対応するセマフォ変数から１を減算した値を前記第一の領域に対応するセマフォ変数として更新し、前記第一の装置に新たな処理要求情報を送信し、前記第一の装置における制御部は、前記新たな処理要求情報を受信して前記第一の領域に追加し、特定のタイミングで前記第一の領域に蓄積された処理要求を実行し、該処理要求に対応する処理完了情報を作成して前記第二の領域に追加し、前記第二の装置における制御部は、特定のタイミングで前記第二の領域に前記処理完了情報が蓄積されているか判定し、蓄積されていれば、前記第一の領域に対応するセマフォ変数に１を加算した値を前記第一の領域に対応するセマフォ変数として更新し、前記第二の領域に蓄積された前記処理完了情報を１つ削除することを特徴とするシステム。
【０１０４】
（付記１１）  処理要求情報が蓄積される第一の領域と、処理要求の完了を示す処理完了情報が前記処理要求を特定する情報と対応付けられ蓄積される第二の領域とが格納される蓄積部と、前記蓄積部を制御し、前記処理要求を実行する制御部を有する第一の装置と、前記第一の装置に接続され、前記第一の領域および前記第二の領域を特定する情報とセマフォ変数が対応付けられ蓄積されるセマフォ変数表とが格納される蓄積部と、前記蓄積部を制御し、前記処理要求情報を前記第一の装置へ送信する制御部を有する第二の装置とを備え、前記第二の装置における制御部は、予め前記第一の領域に対するセマフォ変数の初期値を前記第一の領域に蓄積可能な情報数の最大数として、前記第二の領域に対するセマフォ変数の初期値を前記第二の領域に蓄積可能な情報数の最大数としてそれぞれ設定し、特定のタイミングで前記第一の領域に対応するセマフォ変数から１を減算した値と前記第二の領域に対応するセマフォ変数から１を減算した値が共に正の値か判定し、共に正の値であれば、前記第一の領域に対応するセマフォ変数から１を減算した値を前記第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数から１を減算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ更新し、前記第一の装置に新たな処理要求情報を送信し、前記第一の装置における制御部は、前記新たな処理要求情報を受信して前記第一の領域に追加し、特定のタイミングで前記第一の領域に蓄積された処理要求を実行し、該処理要求に対応する処理完了情報を作成して前記第二の装置に送信し、前記第二の装置における制御部は、前記処理完了情報を受信して前記第二の領域に追加し、特定のタイミングで前記第二の領域に前記処理完了情報が蓄積されているか判定し、蓄積されていれば、前記第一の領域に対応するセマフォ変数に１を加算した値を前記第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から１を加算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ更新し、前記第二の領域に蓄積された前記処理完了情報を１つ削除することを特徴とするシステム。
【０１０５】
（付記１２）  処理要求情報が蓄積される複数の第一の領域と、処理要求の完了を示す処理完了情報が前記処理要求を特定する情報と対応付けられ蓄積される第二の領域とが格納される蓄積部と、前記蓄積部を制御し、かつ前記処理要求を実行する制御部を有する第一の装置と、前記第一の装置に接続され、前記複数の第一の領域の各第一の領域および前記第二の領域を特定する情報とセマフォ変数が対応付けられ蓄積されるセマフォ変数表と、前記処理要求を特定する情報と前記複数の第一の領域のうち該処理要求が蓄積される第一の領域を特定する情報が対応付けられ蓄積される対応表とが格納される蓄積部と、前記蓄積部を制御し、かつ前記処理要求情報を前記第一の装置へ送信する制御部を有する第二の装置とを備え、前記第二の装置における制御部は、予め複数の第一の領域の各第一の領域および第二の領域にそれぞれ対応するセマフォ変数の初期値を前記第一の領域および前記第二の領域にそれぞれ蓄積可能な情報数の最大数として設定し、特定のタイミングで前記複数の第一の領域のうち１つを選択し、前記選択された第一の領域に対応するセマフォ変数から１を減算した値と前記第二の領域に対応するセマフォ変数から１を減算した値が共に正の値か判定し、共に正の値であれば、前記選択された第一の領域に対応するセマフォ変数から１を減算した値を前記選択された第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数から１を減算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ更新し、前記第一の装置に新たな処理要求情報を送信し、前記選択された第一の領域と前記処理要求を対応付けて対応表に蓄積し、前記第一の装置における制御部は、前記新たな処理要求情報を受信して前記第一の領域に蓄積し、特定のタイミングで前記第一の領域に蓄積された処理要求を実行し、該処理要求に対応する処理完了情報を作成して前記第二の装置に送信し、前記第二の装置における制御部は、前記処理完了情報を受信して前記第二の領域に蓄積し、特定のタイミングで前記第二の領域に前記処理完了情報が蓄積されているか判定し、蓄積されていれば、前記第一の領域に対応するセマフォ変数に１を加算した値を前記第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から１を加算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ更新し、かつ前記第二の領域に蓄積された前記処理完了情報を１つ削除することを特徴とするシステム。
【０１０６】
（付記１３）  付記１０において、
前記第一の装置が、サーバマシンに備えられたチャネルアダプタであり、前記第二の装置が、ネットワークインタフェースカードに備えられたチャネルアダプタであることを特徴とするシステム。
【０１０７】
（付記１４）  付記１０において、
前記第一の装置、前記第二の装置が共にサーバマシンに備えられたホストチャネルアダプタであることを特徴とするシステム。
【符号の説明】
【０１０８】
１  コンピュータ、２  CPU、３  システムバス、４  メモリコントローラ、５
メモリ、６  ホストチャネルアダプタ、７  メモリ、８  コプロセッサ、９  インフィニバンドスイッチ、１０  ネットワークインタフェースカード、１２  ＳＣＳＩカード、１４  ファイバチャネルカード、１１、１３、１５ターゲットチャネルアダプタ、２４  ワークキュー、２６  ワークリクエスト、２８  コンプリーションキュー、３０  ワークコンプリーション
【図１】
2010157254.tif 000003
【図２】
2010157254.tif 000004
【図３】
2010157254.tif 000005
【図４】
2010157254.tif 000006
【図５】
2010157254.tif 000007
【図６】
2010157254.tif 000008
【図７】
2010157254.tif 000009
【図８】
2010157254.tif 000010
【図９】
2010157254.tif 000011
【図１０】
2010157254.tif 000012
【図１１】
2010157254.tif 000013
【図１２】
2010157254.tif 000014
【図１３】
2010157254.tif 000015