以下、本発明の実施形態について図面に従って説明する。しかしながら、本発明の技術的範囲はかかる実施形態に限定されるものではなく、特許請求の範囲に記載された発明とその均等物に及ぶものである。
図1は、本発明の第一の実施形態に用いる情報処理装置の構成例を示す図である。本発明の適用はインフィニバンドに限定されるものではないが、本発明の実施形態においてはメモリに格納されたOSの指令を実行するCPUが処理要求の発行側装置として処理要求を含むデータ(ワークリクエスト)を送信し、同一筐体内のインフィニバンド用ホストチャネルアダプタが受信側装置としてワークリクエストを受信する場合に、本発明が適用される様子を説明する。
メモリ5には、コンピュータを動作させるための基本ソフトウエアであるオペレーティングシステム(OS、Operating System)や、OS上で動作するアプリケーションプログラムが蓄積される。CPU2は、OSやアプリケーションプログラムからの処理要求に基づき、システムバス3を介して、メモリ5や各種周辺機器(図示されないハードディスクや、SCSIやファイバチャネルを介して外部に接続された図示されないストレージ、LANを介して接続された図示されない他のコンピュータ等)に格納されたデータにアクセスし、コンピュータ1内の装置を制御するための処理を実行する。
CPU2がメモリ5に格納されたデータにアクセスする場合、メモリコントローラ4は、CPU2が指定する仮想メモリ上のアドレスを実際の物理メモリアドレスに変換し、対応するデータをシステムバス3を介してCPU2に送信する。CPU2が周辺機器に格納されたデータにアクセスする場合、CPU2は処理要求を含むデータ(以下ワークリクエストと呼ぶ)をホストチャネルアダプタ(HCA)6のメモリ7に確保されたワークキュー(図示せず)に蓄積する。コプロセッサ8は、HCA内の制御に関する演算を実行する処理装置であり、特定のタイミングでワークキューに蓄積されたワークリクエストを処理し、処理結果のデータをメモリ7に確保されたコンプリーションキュー(図示せず)に格納する。CPU2は特定のタイミングでコンプリーションキューをチェックし、処理結果のデータを回収、削除する。
インフィニバンドスイッチ9は、チャネルアダプタ間を接続し、チャネルアダプタ同士のポイントトゥポイント(point-to-point)のデータ伝送を可能にする。図1では、HCA6が、インフィニバンドスイッチ9を介して、コンピュータ1をネットワークに接続するためのネットワークインタフェースカード(NIC)11、コンピュータ1にSCSI機器を接続するためのSCSIカード13、ファイバチャネル(Fiber Channel)機器を接続するためのFCカード14のそれぞれに備えられたターゲットチャネルアダプタ(TCA)11、13、15と接続されている。また、インフィニバンドスイッチ9を介して他のHCAと直接接続することも可能である。これは、例えば、複数のコンピュータ1が同一筐体内に存在するブレードサーバ(この場合各コンピュータ1をブレードと呼ぶ)のような装置において、ブレード間を接続するバックプレーンと呼ばれる内部バスを介した接続がある。
図2は、本発明の第一の実施形態においてCPU2が周辺機器に格納されたデータにアクセスする際の動作を示す図である。本発明の第一の実施形態においては、メモリ上にワークキュー24およびコンプリーションキュー28が1つずつ確保され、ワークキュー24に蓄積可能なワークリクエスト26の個数を示すセマフォ変数を設定することで、ワークキュー24が溢れることが防止される。
セマフォ変数はワークリクエスト26がワークキュー24に1つ蓄積されると値が1減算され、ワークコンプリーション30が1つ回収されると値が1加算される。セマフォ変数の初期値をワークキュー24に蓄積可能なデータの最大数と設定することで、ワークキュー24のセマフォ変数が正の値であれば、ワークキュー24にデータを追加蓄積可能であることがわかる。
また、セマフォ変数として、ワークキュー24に蓄積可能なデータの最大量(例えば、確保された領域のサイズ)を設定し、ワークリクエスト26の蓄積の度にそのワークリクエスト26のサイズが減算され、ワークコンプリーション30の回収により、ワークリクエスト26のサイズが加算されることによっても同じ効果を得ることができる。後者は、各ワークリクエスト26のサイズが一定でない場合等に有効な手段となる。
図2のCPU2は、OSやアプリケーションプログラムからの処理要求を含むデータをワークリクエスト26として、開始番地と終了番地により特定される領域としてメモリ7に確保された、キュー番号WQ1のワークキュー24に蓄積する。CPU2はワークキュー24に対応して設定されるセマフォ変数が格納されたメモリ5のセマフォ変数表22を参照し、ワークリクエスト26の蓄積が可能か判定する。
ワークリクエスト26の蓄積が可能であれば、ワークリクエスト26がワークキュー24の末尾に追加される。そしてCPU2はセマフォ変数表22を更新する。このワークリクエスト蓄積処理の詳細については後述する。
コプロセッサ8は、特定のタイミングでワークキュー24から先頭のワークリクエスト26を取り出し、処理要求を実行する。ワークリクエスト26には、データの送信、受信といった処理要求内容と、データ送信先や送信するデータあるいは受信したデータの格納先等の情報が格納されており、コプロセッサ8は処理要求内容に沿った処理を実行する。
コプロセッサ8は、処理要求内容に沿ってインフィニバンドスイッチ9を介して接続されたTCAとデータ伝送を行い、ワークリクエスト26を完了する。ワークリクエスト26を処理し終えたら、コプロセッサ8は処理されたワークリクエスト26に対応するワークコンプリーション30を作成し、開始番地と終了番地により特定される領域としてメモリ7に確保された、キュー番号CQ1のコンプリーションキュー28に蓄積する。
CPU2は、特定のタイミングでコンプリーションキュー28からワークコンプリーション30を回収し、対応するワークリクエスト26が完了したことを確認し、メモリ5のセマフォ変数表22のセマフォ変数を更新する。このワークコンプリーション回収処理の詳細については後述する。こうして処理要求が完了する。次に、ワークリクエスト26、ワークコンプリーション30、セマフォ変数表22のデータ構成を説明する。
図3は、ワークキュー24に蓄積されるワークリクエスト26のデータ構成例を示す図である。図3の各エントリには、ワークリクエスト26を特定する識別番号(Work Request ID)31と、処理要求に関連するデータ32が格納される。処理要求に関連するデータ32には、図示しないが例えば、データの送信や受信等の処理要求内容、データの送信先や送信するデータ、受信したデータの格納先といった情報が格納されている。
図4は、コンプリーションキュー28に蓄積されるワークコンプリーション30のデータ構成例を示す図である。図4の各エントリには、処理されたワークリクエスト26を特定する識別番号(Work Request ID)41と、処理されたワークリクエスト26に関連するデータ42が格納される。処理されたワークリクエスト26に関連するデータ42には、図示しないが例えば、正常終了したか異常終了したかを示す終了ステータスや、エラー内容を示すエラーコード等が格納される。ワークコンプリーション30を参照することにより、どのワークリクエスト26がどのような状態で完了したのかを確認することができる。
図5は、メモリ5に格納されるセマフォ変数表22である。図5の各エントリには、キュー番号51とそのキュー番号のセマフォ変数値52が格納される。図5においては、WQ1がワークキュー24に対するキュー番号51を示し、SW1は、ワークキュー24に対するセマフォ変数値52である。
また、本発明の第一の実施形態においては、1つのワークキュー24にのみセマフォ変数が設定されるが、複数のワークキュー24が存在する場合、各キューに設定されたセマフォ変数が図5の行データとしてセマフォ変数表に追加される。さらに、コンプリーションキュー28に対するセマフォ変数が設定され、セマフォ変数表に追加されてもよい。セマフォ変数表22を参照すれば、ワークキュー24あるいはコンプリーションキュー28に対応するセマフォ変数値52を得ることができ、ワークキュー24に対しワークリクエスト26の追加蓄積が可能か判定することができる。
なお、本発明の第一の実施形態においては、セマフォ変数表22を用いるが、表を使わない実装も可能である。例えば、ハッシュ関数を用いて、ワークキュー番号に対応するセマフォを特定するポインタがわかるようにしてもよい。
続いて、本発明の第一の実施形態におけるワークリクエスト蓄積処理、ワークコンプリーション回収処理をそれぞれ説明する。
図6は、本発明の第一の実施形態におけるワークリクエスト蓄積処理を説明するフローチャートである。予め、セマフォ変数表22には、キュー番号WQ1のワークキュー24に対応するセマフォ変数の初期値として、ワークキュー24に蓄積可能なデータの最大数が設定されている。
まず、CPU2は、ワークキュー24のセマフォ変数が正の値か判定する(S62)。CPU2は、メモリ5のセマフォ変数表22を参照し、キュー番号WQ1であるワークキュー24に対応するセマフォ変数値52を得る。得られたセマフォ変数値が正であれば、ワークキュー24には空きがあり、ワークリクエスト26が追加蓄積できることを意味する。
ステップS62でワークキュー24に空きがある場合、CPU2はワークキュー24のセマフォ変数から1減算した値を新たなセマフォ変数としてセマフォ変数表22を更新する(S63)。これは、ワークリクエスト26が蓄積される場合ワーククキュー24の空きが1つ消費されることによるものである。
そして、ステップS62で空きが無いと判定される場合、一定時間待機し再びステップS62の処理を実施する。こうして、ワークキュー24に空きができるのを待つ。もしくは、蓄積をあきらめる。
ステップS63が済むと、ワークキュー24にワークリクエスト26を追加蓄積する(S66)。そして、ステップS64の蓄積処理が成功したか判定する(S67)。ワークキュー24への蓄積は可能な状態でも、蓄積処理の途中で装置の電源断や、割り込み処理による蓄積処理中止などで、蓄積処理に失敗した場合そのままワークリクエスト蓄積処理を中止する。
ステップS67でワークリクエスト26の蓄積に成功すれば、ワークリクエスト蓄積処理を終了する。ステップS67で失敗した場合、ワークキュー24のセマフォ変数に1加算し(S69)、ワークリクエスト蓄積処理を終了する。ステップS63では、ワークリクエストが蓄積されワーククキュー24の空きが1つ消費されるものとしてセマフォ変数を更新したが、ステップS67でワークリクエストの蓄積に失敗したため、ワーククキュー24の空きは消費されていない。従ってステップS69では、ステップS63で減算した値を元に戻す。
図6のワークリクエスト蓄積処理によって、ワークキューの空き状態を表すセマフォ変数が適切に更新され、空きが無い場合、ワークリクエスト26が追加されることはなく、ワークキュー24のオーバフローを防止することができる。
図7は、本発明の第一の実施形態におけるワークコンプリーション回収処理を説明するフローチャートである。まず、コンプリーションキュー28にワークコンプリーション30が蓄積されているか判定する(S71)。CPU2は、コンプリーションキュー28の先頭からワークコンプリーション30を回収し、コンプリーションキュー28が空なら、そのままワークコンプリーション回収処理を終了する。
そして、CPU2はワークキュー24のセマフォ変数に1加算した値をセマフォ変数として更新し(S73)、ワークコンプリーション回収処理を終了する。これは、ワークリクエスト26の処理が完了したため、ワーククキュー24で1つ空きができたことを確認できたからである。ワークキュー24に対応するセマフォ変数値52は、コプロセッサ8がワークリクエスト26の処理を完了した際に更新されるべきだが、CPU2はどのタイミングでコプロセッサ8がワークリクエスト26を処理するか知ることができない。そこで、ワークコンプリーション30の回収時にワークキュー24に空きができたものとみなし、セマフォ変数を更新する。
図7のワークコンプリーション回収処理によって、ワークキュー24の空き状態を表すセマフォ変数が適切に更新され、ワークキュー24のあふれを防止することができる。また、ワークコンプリーション30の回収時にワークキュー24のセマフォ変数を更新することにより、本発明はHCAのコプロセッサ8の処理に関係なくOSやアプリケーション側のみで実装することができ、導入が容易になり、ハードウエアの実装を複雑化させずに済む。
以上本発明の第一の実施形態によれば、ワークキュー24に対応するセマフォ変数を適切に更新し、ワークリクエストを追加する場合、セマフォ変数を参照することにより、ワークキュー24のオーバフローを防止することが可能である。
また、第一の実施形態において予めコンプリーションキュー28に蓄積可能なデータ数がワークキュー24に蓄積可能なデータ数の最大数以上になるようコンプリーションキュー28のサイズを設定することにより(コンプリーションキュー28に対するセマフォ変数を設定することなく)、ワークキュー24に対して設定されたセマフォ変数のみを利用し本発明を適用することができる。
すなわち、ある時点でワークキュー24に蓄積されたワークリクエスト26をすべてコンプリーションキュー28に移したとしても、コンプリーションキュー28が溢れないことが確約されるため、要求処理の実行にあたっては、各ワークキュー24へワークリクエスト26を蓄積する際のワークキュー24のオーバフローのみを防止すればよいからである。
第一の実施形態においては、ワークキュー24にのみセマフォ変数を設定したが、コンプリーションキュー28にのみセマフォ変数を設定し、コンプリーションキュー28のオーバフローを防止することも可能である。図6、図7におけるステップS62、S63、S73のワークキュー24の箇所を適宜コンプリーションキュー28と読み替えることで本発明の適用が可能となる。
コンプリーションキューに空きが無い場合、ワークリクエスト26が追加されることはない。ワークリクエスト26とワークコンプリーション30は1対1に対応するため、追加されたワークリクエスト26が原因でコンプリーションキュー28がオーバフローすることはない。こうして、コンプリーションキュー28のオーバフローを防止することができる。また、ワークリクエスト26の蓄積時にコンプリーションキュー28のセマフォ変数を更新することにより、本発明はHCAのコプロセッサの処理に関係なく実装することができ、導入が容易になり、ハードウエアの実装を複雑化させずに済む。
また、第一の実施形態の変形例として、ワークキュー24、コンプリーションキュー28に共にセマフォ変数を設定し、両キューのオーバフローを防止することも可能である。第一の実施形態の変形例におけるワークリクエスト蓄積処理とワークコンプリーション回収処理について説明する。
図8は、第一の実施形態の変形例におけるワークリクエスト蓄積処理を説明するフローチャートである。図6と同じステップには同じステップ番号が振られており、必要がなければ説明は省略する。予め、セマフォ変数表22には、キュー番号WQ1、CQ1のワークキュー24、コンプリーションキュー28に対応するセマフォ変数の初期値として、各キューに蓄積可能なデータの最大数が設定されている。
まず、CPU2は、ワークキュー24に対応するセマフォ変数が正の値か判定する(S62)。これは、図6と同じステップであり説明を省略する。ステップS62でワークキュー24に空きがある場合、CPU2はワークキュー24のセマフォ変数から1減算した値を新たなセマフォ変数としてセマフォ変数表22を更新する(S63)。これは、ワークリクエスト26が蓄積される場合ワーククキュー24の空きが1つ消費されることによるものである。
ステップS62で空きが無いと判定される場合、一定時間待機し再びステップS62の処理を実施する。こうして、ワークキュー24に空きができるのを待つ。もしくは、蓄積をあきらめる。
ステップS63が済むと、コンプリーションキュー28に対応するセマフォ変数が正の値か判定する(S64)。CPU2は、セマフォ変数表22を参照し、キュー番号CQ1であるコンプリーションキュー28に対応するセマフォ変数値52を得る。セマフォ変数値が正であれば、コンプリーションキュー28に空きがあり、ワークコンプリーション30を蓄積できることを意味する。
ステップS64で空きがあると判定される場合、CPU2はコンプリーションキュー28のセマフォ変数から1減算した値を新たなセマフォ変数としてセマフォ変数表22を更新する(S65)。コンプリーションキュー28に対応するセマフォ変数値は、コプロセッサ8がワークリクエスト26の処理を完了した後に更新されるべきだが、CPU2はどのタイミングでコプロセッサ8がワークリクエスト26を処理するか知ることができない。また、ワークキュー24に蓄積されたワークリクエスト26は必ず処理完了後にそのワークリクエスト26に対応するワークコンプリーション30がコンプリーションキュー28に蓄積され、1対1に対応するものである。そこで、ワークキュー24へのワークリクエスト26の蓄積時にコンプリーションキュー28が1つ消費されたものとみなし、コンプリーションキュー28のセマフォ変数を更新する。
ステップS64で空きが無いと判定される場合、一定時間待機し再びステップS64の処理を実施する。こうして、コンプリーションキュー28に空きができるのを待つ。
こうして、ワークキュー24とコンプリーションキュー28に共に空きがある場合、ワークキュー24にワークリクエスト26を蓄積する(S66)。そして、ステップS64の蓄積処理が成功したか判定する(S67)。
ステップS67でワークリクエスト26の蓄積に成功すれば、ワークリクエスト蓄積処理を終了する。ステップS67で失敗した場合、ワークキュー24のセマフォ変数、コンプリーションキューのセマフォ変数にそれぞれ1加算し(S69)、ワークリクエスト蓄積処理を終了する。ステップS63、S65では、ワークリクエストが蓄積されワーククキュー24、コンプリーションキュー28の空きがそれぞれ1つ消費されるものとして、セマフォ変数を更新したが、ステップS67でワークリクエストの蓄積に失敗したため、ワーククキュー24、コンプリーションキュー28の空きは消費されていない。従ってステップS69では、ステップS63、S65で減算した値を元に戻す。
図8のワークリクエスト26蓄積処理によって、各キューの空き状態を表すセマフォ変数が適切に更新され、ワークキューに空きが無い場合、ワークリクエスト26が追加されることはない。また、コンプリーションキューに空きが無い場合も同様にワークリクエスト26が追加されることはない。ワークリクエスト26とワークコンプリーション30は1対1に対応するため、追加されたワークリクエスト26が原因でコンプリーションキュー28がオーバフローすることはない。こうして、ワークキュー24、およびコンプリーションキュー28のオーバフローを防止することができる。また、ワークリクエスト26の蓄積時にコンプリーションキュー28のセマフォ変数を更新することにより、本発明はHCAのコプロセッサの処理に関係なく実装することができ、導入が容易になり、ハードウエアの実装を複雑化させずに済む。
図9は、第一の実施形態の変形例におけるワークコンプリーション回収処理を説明するフローチャートである。図7と同じステップには同じステップ番号が振られており、必要がなければ説明は省略する。
まず、コンプリーションキュー28にワークコンプリーション30が蓄積されているか判定する(S71)。そして、CPU2はワークキュー24のセマフォ変数に1加算した値をセマフォ変数として更新する(S73)。次に、コンプリーションキュー28のセマフォ変数に1加算した値を新たなセマフォ変数値として更新する(S74)。これは、ステップS82でワークコンプリーション30を1つ回収したことによりコンプリーションキュー28に空きができたためである。
図9のワークコンプリーション30回収処理によって、各キューの空き状態を表すセマフォ変数が適切に更新され、ワークキュー24、およびコンプリーションキュー28のあふれを防止することができる。また、ワークコンプリーション30の回収時にワークキュー24のセマフォ変数を更新することにより、本発明はHCAのコプロセッサの処理に関係なく実装することができ、導入が容易になり、ハードウエアの実装を複雑化させずに済む。
なお、上記の第一の実施形態の変形例は、ワークキュー24とコンプリーションキュー28が1対1に対応するのであれば、それぞれが複数存在する構成においても適用が可能である。
次に本発明の第二の実施形態について説明する。第二の実施形態は、第一の実施形態と同じ図1の構成において、メモリ上に複数のワークキュー24が確保され、複数のワークキュー24に対し1つのコンプリーションキュー28が確保される場合である。本発明の第二の実施形態においては、ワークキュー24およびコンプリーションキュー28に対して、各キューに蓄積可能なデータ(ワークリクエスト26およびワークコンプリーション30)の個数を示すセマフォ変数を設定することで、各キューが溢れることを防止する。
図10は、本発明の第二の実施形態においてCPU2が周辺機器に格納されたデータにアクセスする際の動作を示す図である。図2と同じ箇所には同じ番号が振られており、必要が無ければ説明を省略する。
図10のCPU2は、OSやアプリケーションプログラムからの処理要求を含むデータをワークリクエスト26として、開始番地と終了番地により特定される領域としてそれぞれメモリ7に確保された、ワークキュー番号WQ1からWQnまでのn個(nは自然数)のワークキュー241からワークキュー24nに蓄積する。CPU2は各ワークキュー24と後述するコンプリーションキュー28に対応して設定されるセマフォ変数が格納されたメモリ5のセマフォ変数表22を参照し、ワークリクエスト26の蓄積が可能か判定する。
ワークリクエスト26の蓄積が可能であれば、ワークリクエスト26がワークキュー24の末尾に追加される。CPU2は、ワークリクエスト26がどのワークキュー24に蓄積されたかを示す情報をメモリ5のワークキュー24対ワークリクエスト26対応表23に格納し、そしてセマフォ変数表22を更新する。このワークリクエスト26蓄積処理の詳細については後述する。
コプロセッサ8は、特定のタイミングでワークキュー24から先頭のワークリクエスト26を取り出し、処理要求を実行し、処理要求内容に沿ってインフィニバンドスイッチ9を介しファブリックネットワークに接続されたTCAとデータ伝送を行い、ワークリクエスト26を完了する。取り出したワークリクエスト26を処理し終えたら、コプロセッサ8はワークコンプリーション30を作成し、コンプリーションキュー28に蓄積する。一般には、ワークキュー24とコンプリーションキュー28が1対1に対応している必要はなく、図10のように1つのコンプリーションキュー28に対して複数のワークキュー24を対応させることが可能である。
CPU2は、特定のタイミングでコンプリーションキュー28からワークコンプリーション30を回収し、対応するワークリクエスト26が完了したことを確認し、処理要求が完了する。同時にCPU2はメモリ5のセマフォ変数表22のセマフォ変数を更新する。このワークコンプリーション回収処理の詳細については後述する。
なお、図2では1つだが、コンプリーションキュー28を複数有する構成にすることも可能である。また各ワークキュー24には特定の役割を与えることができる。例えば、WQ1はInfinibandメッセージ送信用のワークリクエスト26が、WQ2はInfinibandメッセージ受信用のワークリクエスト26が蓄積されるよう設定することが可能である。また、ワークリクエスト26、ワークコンプリーション30、セマフォ変数表22のデータ構成は、第一の実施形態と同じくそれぞれ図3、図4、図5のようになっている。
図11は、メモリ5に格納されるワークキュー対ワークリクエスト対応表23である。図11の各エントリには、キュー番号51とそのキュー番号で特定されるワークキュー24に蓄積されたワークリクエスト番号31のリスト111が格納される。この対応表を参照すれば、各ワークキュー24に蓄積されたワークリクエスト26番号のリストを得ることができる。従って、あるワークリクエスト26がどのワークキュー24に蓄積されたかを特定することが可能である。図11においては、例えば、キュー番号WQ1であるキューに、リストWRL1に含まれるワークリクエスト番号(1、12、28)で特定されるワークリクエスト26が蓄積されていることがわかる。
次に本発明の第二の実施形態におけるワークリクエスト蓄積処理およびワークコンプリーションを説明する。
図12は、本発明の第二の実施形態におけるワークリクエスト蓄積処理を説明するフローチャートである。図6および図8と同じステップには同じステップ番号が振られており、必要がなければ説明は省略する。予め、セマフォ変数表22には、各キューに対するセマフォ変数の初期値として、各キューに蓄積可能なデータの最大数が設定されている。
まず、OSやアプリケーションプログラムからの処理要求に対応するワークキュー24が決定される(S61)。CPU2は、処理要求内容に応じて、適切なワークキュー24のワークキュー24番号を取得する。例えば、処理要求内容がデータ送信で、図10のキュー番号WQ1のワークキュー24がデータ送信用に割り当てられていれば、キュー番号WQ1のワークキュー24が選択される。各ワークキュー24への用途の割り当ては自由に定めることができる。また、各ワークキュー24に特に用途が設定されていなければ任意に1つのワークキュー24を選択してもよい。
次にステップS61で決定されたワークキュー24のセマフォ変数が正の値か判定する(S62)。CPU2は、メモリ5のセマフォ変数表22を参照し、ステップS61で決定されたワークキュー24のセマフォ変数値を得る。
ステップS62でセマフォ変数の値が正であれば、CPU2はステップS61で決定されたワークキュー24のセマフォ変数から1減算した値を新たなセマフォ変数としてセマフォ変数表22を更新する(S63)。ステップS62でセマフォ変数の値が正であれば、そのワークキュー24には空きがあり、ワークリクエスト26が蓄積できる。従って、ワークリクエスト26が蓄積された場合そのワーククキューの空きが1つ消費されることによるものである。
ステップS62で空きが無いと判定される場合、一定時間待機し再びステップS62の処理を実施する。こうして、ワークキュー24に空きができるのを待つ。
ステップS63が済むと、コンプリーションキュー28のセマフォ変数が正の値か判定する(S64)。CPU2は、セマフォ変数表22を参照し、コンプリーションキュー28のセマフォ変数値を得る。セマフォ変数値が正であれば、コンプリーションキュー28に空きがあり、ワークコンプリーション30を蓄積できる。
ステップS64で空きがあると判定される場合、CPU2はコンプリーションキュー28のセマフォ変数から1減算した値を新たなセマフォ変数としてセマフォ変数表22を更新する(S65)。コンプリーションキュー28に対応するセマフォ変数値は、コプロセッサ8がワークリクエスト26の処理を完了した後に更新されるべきだが、CPU2はどのタイミングでコプロセッサ8がワークリクエスト26を処理するか知ることができない。また、ワークキュー24に蓄積されたワークリクエスト26は必ず処理完了後にそのワークリクエスト26に対応するワークコンプリーション30がコンプリーションキュー28に蓄積され、1対1に対応するものである。そこで、ワークキュー24へのワークリクエスト26の蓄積時にコンプリーションキュー28が1つ消費されたものとみなし、コンプリーションキュー28のセマフォ変数を更新する。
ステップS64で空きが無いと判定される場合、一定時間待機し再びステップS64の処理を実施する。こうして、コンプリーションキュー28に空きができるのを待つ。
こうして、ワークキュー24とコンプリーションキュー28に共に空きがある場合、ステップS61で決定されたワークキュー24にワークリクエスト26を蓄積する(S66)。次に、ステップS66の蓄積処理が成功したか判定する(S67)。ワークキュー24への蓄積は可能な状態であったが、蓄積処理の途中で装置の電源断や、割り込み処理による蓄積処理中止などで、蓄積処理に失敗した場合そのままワークリクエスト蓄積処理を中止する。
ステップS67でワークリクエスト26の蓄積に成功すれば、ステップS66で蓄積されたワークリクエスト26と、そのワークリクエスト26が蓄積されたワークキュー24を対応付けて記録し(S68)、 ワークリクエスト蓄積処理を終了する。これは、メモリ5に格納されたワークキュー対ワークリクエスト対応表23で、ワークキュー24のキュー番号51に対応するワークリクエストIDリストに、ステップS64で蓄積されたワークリクエスト番号を追加すればよい。
ステップS67で失敗した場合、ステップS61で特定されたワークキュー24のセマフォ変数、コンプリーションキューのセマフォ変数にそれぞれ1加算し(S69)、ワークリクエスト蓄積処理を終了する。ステップS63、S65では、ワークリクエストが蓄積されワーククキュー24、コンプリーションキュー28の空きがそれぞれ1つ消費されるものとして、セマフォ変数を更新したが、ステップS67でワークリクエストの蓄積に失敗したため、ワーククキュー24、コンプリーションキュー28の空きは消費されていない。従ってステップS69では、ステップS63、S65で減算した値を元に戻す。
図12のワークリクエスト蓄積処理によって、各キューの空き状態を表すセマフォ変数が適切に更新され、ワークキューに空きが無い場合、ワークリクエスト26が追加されることはない。また、コンプリーションキューに空きが無い場合も同様にワークリクエスト26が追加されることはない。ワークリクエスト26とワークコンプリーション30は1対1に対応するため、追加されたワークリクエスト26が原因でコンプリーションキュー28がオーバフローすることはない。こうして、ワークキュー24、およびコンプリーションキュー28のオーバフローを防止することができる。また、ワークリクエスト26の蓄積時にコンプリーションキュー28のセマフォ変数を更新することにより、本発明はHCAのコプロセッサの処理に関係なく実装することができ、導入が容易になり、ハードウエアの実装を複雑化させずに済む。
図13は、本発明の第二の実施形態におけるワークコンプリーション回収処理を説明するフローチャートである。まず、コンプリーションキュー28にワークコンプリーション30が蓄積されているか判定する(S71)。CPU2は、コンプリーションキュー28の先頭からワークコンプリーション30を取り出し、コンプリーションキュー28が空なら、そのまま処理を終了する。
次に、抽出されたワークコンプリーション30からそのワークコンプリーション30に対応するワークリクエスト26が蓄積されたワークキュー24を特定する(S72)。ワークコンプリーション30は処理が完了したワークリクエスト26に対応して作成されるものであり、図4に示されているように、ワークコンプリーション30には、処理されたワークリクエスト番号41が格納されている。CPU2は、メモリ5のワークキュー対ワークリクエスト対応表23を参照し、得られたワークリクエスト番号41が含まれるワークリクエストIDリスト111を検索し、対応するキュー番号51を得る。
そして、CPU2はステップS72で特定されたワークキュー24のセマフォ変数に1加算した値をセマフォ変数として更新する(S73)。これは、ワークリクエスト26の処理が完了したため、ステップS72で特定されたワーククキューで1つ空きができたことを確認できたからである。ワークキュー24に対応するセマフォ変数値は、コプロセッサ8がワークリクエスト26の処理を完了した際に更新されるべきだが、CPU2はどのタイミングでコプロセッサ8がワークリクエスト26を処理するか知ることができない。そこで、ワークコンプリーション30の回収時にワークキュー24に空きができたものとみなし、セマフォ変数を更新する。
次に、コンプリーションキュー28のセマフォ変数に1加算した値を新たなセマフォ変数値として更新する(S74)。これは、ステップS72でワークコンプリーション30を1つ回収したことによりコンプリーションキュー28に空きができたためである。
図13のワークコンプリーション回収処理によって、各キューの空き状態を表すセマフォ変数が適切に更新され、ワークキュー24、およびコンプリーションキュー28のオーバフローを防止することができる。また、ワークコンプリーションの回収時にワークキュー24のセマフォ変数を更新することにより、本発明はHCAのコプロセッサの処理に関係なく実装することができ、導入が容易になり、ハードウエアの実装を複雑化させずに済む。
また、第二の実施形態において予めコンプリーションキュー28に蓄積可能なデータ数が各ワークキュー24に蓄積可能なデータ数の最大数の総和以上になるようコンプリーションキュー28のサイズを設定することにより、コンプリーションキュー28に対するセマフォ変数を設定することなく、ワークキュー24に対して設定されたセマフォ変数のみを利用し本発明を適用することができる。
すなわち、ある時点で各ワークキュー24に蓄積されたワークリクエスト26をすべてコンプリーションキュー28に移したとしても、コンプリーションキュー28が溢れないことが確約されるため、処理要求の実行にあたっては、各ワークキュー24へワークリクエスト26を蓄積する際のワークキュー24のオーバフローのみを防止すればよいからである。
本発明は、サーバ対サーバ、サーバ対ストレージ、ブレードサーバのバックプレーンを介したブレード間のプロセス間通信あるいは同一サーバ内のプロセス間通信にも適用が可能である。また、プログラムとしてOSやアプリケーションプログラムの機能として組み込んだり、OSとアプリケーションプログラムの仲介をするミドルウエアとして提供することが可能である。
以上をまとめると付記のようになる。
(付記1) 処理要求情報が蓄積される第一の領域を設定する工程と、処理要求の完了を示す情報である処理完了情報が蓄積される第二の領域を設定する工程と、前記第一の領域に対応するセマフォ変数の初期値を前記第一の領域に蓄積可能な情報数の最大数として設定する工程と、前記第一の領域に対応するセマフォ変数の値から1を減算した値が正の値か判定し、正の値であれば、前記第一の領域に前記処理要求情報を追加し、前記第一の領域に対応するセマフォ変数の値から1を減算した値を前記第一の領域に対応するセマフォ変数として更新する工程と、前記要求された処理が完了した場合、該処理要求を特定する情報と前記処理完了情報を対応付けて前記第二の領域に蓄積する工程と、前記第二の領域に前記処理完了情報が蓄積されているか判定し、蓄積されていれば、前記第一の領域に対応するセマフォ変数に1を加算した値を前記第一の領域に対応するセマフォ変数として更新し、前記処理完了情報を1つ削除する工程を有することを特徴とする情報蓄積制御方法。
(付記2) 付記1において、前記第二の領域に蓄積可能な情報数の最大数が、前記第一の領域に蓄積可能な情報数の最大数以上であることを特徴とする情報蓄積制御方法。
(付記3) 処理要求情報が蓄積される第一の領域を設定する工程と、処理要求の完了を示す情報である処理完了情報が蓄積される第二の領域を設定する工程と、前記第一の領域および前記第二の領域にそれぞれ対応するセマフォ変数の初期値を前記第一の領域および前記第二の領域にそれぞれ蓄積可能な情報数の最大数として設定する工程と、前記第一の領域に対応するセマフォ変数の値から1を減算した値と前記第二の領域に対応するセマフォ変数の値から1を減算した値が共に正の値か判定し、共に正の値であれば、前記第一の領域に処理要求情報を追加し、かつ前記第一の領域に対応するセマフォ変数の値から1を減算した値を前記第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から1を減算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ更新する工程と、前記処理要求が完了した場合、該処理要求を特定する情報を前記処理完了情報と対応付けて前記第二の領域に蓄積する工程と、前記第二の領域に前記処理完了情報が蓄積されているか判定し、蓄積されていれば、前記第一の領域に対応するセマフォ変数に1を加算した値を前記第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から1を加算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ更新し、前記処理完了情報を1つ削除する工程を有することを特徴とする情報蓄積制御方法。
(付記4) 処理要求情報が蓄積される複数の第一の領域を設定する工程と、処理要求の完了を示す情報である処理完了情報が蓄積される第二の領域を設定する工程と、前記複数の第一の領域にそれぞれ対応するセマフォ変数の初期値を前記複数の第一の領域にそれぞれ蓄積可能な情報数の最大数として設定する工程と、前記複数の第一の領域のうち1つを選択し、前記選択された第一の領域に対応するセマフォ変数の値から1を減算した値が正の値か判定し、正の値であれば、前記選択された第一の領域に処理要求情報を追加し、前記選択された第一の領域と前記処理要求を特定する情報を対応付けて対応表に蓄積し、前記選択された第一の領域に対応するセマフォ変数の値から1を減算した値を前記選択された第一の領域に対応するセマフォ変数として更新する工程と、前記処理要求が完了した場合、該処理要求を特定する情報を前記処理完了情報と対応付けて前記第二の領域に蓄積する工程と、前記第二の領域に前記処理完了情報が蓄積されているか判定し、蓄積されていれば、前記処理完了情報を1つ読み出し、前記読み出された処理完了情報に対応する前記処理要求を特定し、前記対応表を参照して該特定された処理要求が蓄積された前記第一の領域を特定し、該特定された第一の領域に対応するセマフォ変数に1を加算した値を前記特定された第一の領域に対応するセマフォ変数として更新し、前記読み出された処理完了情報を削除する工程を有することを特徴とする情報蓄積制御方法。
(付記5) 付記4において、前記第二の領域に蓄積可能な情報数の最大数が、前記複数の第一の領域に蓄積可能な情報数の最大数の総和以上であることを特徴とする情報蓄積制御方法。
(付記6) 処理要求情報が蓄積される複数の第一の領域を設定する工程と、処理要求の完了を示す情報である処理完了情報が蓄積される第二の領域を設定する工程と、複数の第一の領域の各第一の領域および第二の領域にそれぞれ対応するセマフォ変数の初期値を前記各第一の領域および前記第二の領域にそれぞれ蓄積可能な情報数の最大数として設定する工程と、前記複数の第一の領域のうち1つを選択し、前記選択された第一の領域に対応するセマフォ変数の値から1を減算した値と前記第二の領域に対応するセマフォ変数の値から1を減算した値が共に正の値か判定し、共に正の値であれば、前記選択された第一の領域に処理要求情報を追加し、前記選択された第一の領域と前記処理要求を特定する情報とを対応付けて対応表に蓄積し、前記選択された第一の領域に対応するセマフォ変数の値から1を減算した値を前記選択された第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から1を減算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ更新する工程と、前記処理要求が完了した場合、該処理要求を特定する情報を前記処理完了情報に対応付けて前記第二の領域に蓄積する工程と、前記第二の領域に前記処理完了情報が蓄積されているか判定し、蓄積されていれば、前記処理完了情報を1つ読み出し、前記読み出された処理完了情報に対応する前記処理要求を特定し、前記対応表を参照して該特定された処理要求が蓄積された前記第一の領域を特定し、該特定された第一の領域に対応するセマフォ変数に1を加算した値を前記特定された第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数に1を加算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ更新し、前記読み出された処理完了情報を削除する工程を有することを特徴とする情報蓄積制御方法。
(付記7) 処理要求情報が蓄積される第一の領域と、処理要求の完了を示す情報である処理完了情報が前記処理要求を特定する情報と対応付けられ蓄積される第二の領域と、前記第一の領域を特定する情報とセマフォ変数が対応付けられ蓄積されるセマフォ変数表とが格納される蓄積部と、前記蓄積部を制御する制御部とを有する装置において実行されるプログラムであって、前記制御部に、前記第一の領域に対応するセマフォ変数の初期値を前記第一の領域に蓄積可能な情報数の最大数として設定させる工程と、前記第一の領域に対応するセマフォ変数の値から1を減算した値が正の値か判定させ、正の値であれば、前記第一の領域に対応するセマフォ変数の値から1を減算した値を前記第一の領域に対応するセマフォ変数として前記セマフォ変数表を更新させ、前記第一の領域へ前記処理要求情報を追加させる工程と、前記第二の領域に前記処理完了情報が蓄積されているか判定させ、蓄積されていれば、前記第一の領域に対応するセマフォ変数に1を加算した値を前記第一の領域に対応するセマフォ変数として前記セマフォ変数表を更新させ、前記処理完了情報を1つ削除させる工程を実行させるためのプログラム。
(付記8) 処理要求情報が蓄積される第一の領域と、処理要求の完了を示す処理完了情報が前記処理要求を特定する情報と対応付けられ蓄積される第二の領域と、前記第一の領域を特定する情報とセマフォ変数が対応付けられ蓄積されるセマフォ変数表とが格納される蓄積部と、前記蓄積部を制御する制御部とを有する装置において実行されるプログラムであって、前記制御部に、前記第一の領域および前記第二の領域にそれぞれ対応するセマフォ変数の初期値を前記第一の領域および前記第二の領域にそれぞれ蓄積可能な情報数の最大数として設定させる工程と、前記第一の領域に対応するセマフォ変数の値から1を減算した値と前記第二の領域に対応するセマフォ変数の値から1を減算した値が共に正の値か判定させ、共に正の値であれば、前記第一の領域に対応するセマフォ変数の値から1を減算した値を前記第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から1を減算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ前記セマフォ変数表を更新させ、前記第一の領域へ前記処理要求情報を追加させる工程と、前記第二の領域に前記処理完了情報が蓄積されているか判定させ、蓄積されていれば、前記第一の領域に対応するセマフォ変数に1を加算した値を前記第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から1を加算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ前記セマフォ変数表を更新させ、前記処理完了情報を1つ削除させる工程を実行させるためのプログラム。
(付記9) 処理要求情報が蓄積される複数の第一の領域と、処理要求の完了を示す処理完了情報が前記処理要求を特定する情報と対応付けられ蓄積される第二の領域と、前記第一の領域を特定する情報とセマフォ変数が対応付けられ蓄積されるセマフォ変数表とが格納される蓄積部と、前記蓄積部を制御する制御部とを有する装置において実行されるプログラムであって、前記制御部に、前記複数の第一の領域の各第一の領域および前記第二の領域にそれぞれ対応するセマフォ変数の初期値を前記第一の領域および前記第二の領域にそれぞれ蓄積可能な情報数の最大数として設定させる工程と、前記複数の第一の領域のうち1つを選択し、前記選択された第一の領域に対応するセマフォ変数の値から1を減算した値と前記第二の領域に対応するセマフォ変数の値から1を減算した値が共に正の値か判定させ、共に正の値であれば、前記選択された第一の領域と前記処理要求を対応付けて対応表に蓄積させ、前記選択された第一の領域に対応するセマフォ変数の値から1を減算した値を前記選択された第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から1を減算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ前記セマフォ変数表を更新させ、前記選択された第一の領域へ前記処理要求情報を追加させる工程と、前記第二の領域に前記処理完了情報が蓄積されているか判定させ、蓄積されていれば、前記処理完了情報を1つ読み出し、前記読み出された処理完了情報に対応する前記処理要求を特定し、該特定された第一の領域に対応するセマフォ変数に1を加算した値を前記特定された第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から1を加算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ前記セマフォ変数表を更新させ、前記処理完了情報を1つ削除させる工程を実行させるためのプログラム。
(付記10) 処理要求情報が蓄積される第一の領域と、処理要求の完了を示す情報である処理完了情報が前記処理要求を特定する情報と対応付けられ蓄積される第二の領域とが格納される蓄積部と、前記蓄積部を制御し、前記処理要求を実行する制御部を有する第一の装置と、前記第一の装置に接続され、前記第一の領域を特定する情報とセマフォ変数が対応付けられ蓄積されるセマフォ変数表とが格納される蓄積部と、前記蓄積部を制御し、前記処理要求情報を前記第一の装置へ送信する制御部を有する第二の装置とを備え、前記第二の装置における制御部は、予め前記第一の領域に対するセマフォ変数の初期値を前記第一の領域に蓄積可能な情報数の最大数として設定し、特定のタイミングで前記第一の領域に対応するセマフォ変数から1を減算した値が正の値か判定し、正の値であれば、前記第一の領域に対応するセマフォ変数から1を減算した値を前記第一の領域に対応するセマフォ変数として更新し、前記第一の装置に新たな処理要求情報を送信し、前記第一の装置における制御部は、前記新たな処理要求情報を受信して前記第一の領域に追加し、特定のタイミングで前記第一の領域に蓄積された処理要求を実行し、該処理要求に対応する処理完了情報を作成して前記第二の領域に追加し、前記第二の装置における制御部は、特定のタイミングで前記第二の領域に前記処理完了情報が蓄積されているか判定し、蓄積されていれば、前記第一の領域に対応するセマフォ変数に1を加算した値を前記第一の領域に対応するセマフォ変数として更新し、前記第二の領域に蓄積された前記処理完了情報を1つ削除することを特徴とするシステム。
(付記11) 処理要求情報が蓄積される第一の領域と、処理要求の完了を示す処理完了情報が前記処理要求を特定する情報と対応付けられ蓄積される第二の領域とが格納される蓄積部と、前記蓄積部を制御し、前記処理要求を実行する制御部を有する第一の装置と、前記第一の装置に接続され、前記第一の領域および前記第二の領域を特定する情報とセマフォ変数が対応付けられ蓄積されるセマフォ変数表とが格納される蓄積部と、前記蓄積部を制御し、前記処理要求情報を前記第一の装置へ送信する制御部を有する第二の装置とを備え、前記第二の装置における制御部は、予め前記第一の領域に対するセマフォ変数の初期値を前記第一の領域に蓄積可能な情報数の最大数として、前記第二の領域に対するセマフォ変数の初期値を前記第二の領域に蓄積可能な情報数の最大数としてそれぞれ設定し、特定のタイミングで前記第一の領域に対応するセマフォ変数から1を減算した値と前記第二の領域に対応するセマフォ変数から1を減算した値が共に正の値か判定し、共に正の値であれば、前記第一の領域に対応するセマフォ変数から1を減算した値を前記第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数から1を減算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ更新し、前記第一の装置に新たな処理要求情報を送信し、前記第一の装置における制御部は、前記新たな処理要求情報を受信して前記第一の領域に追加し、特定のタイミングで前記第一の領域に蓄積された処理要求を実行し、該処理要求に対応する処理完了情報を作成して前記第二の装置に送信し、前記第二の装置における制御部は、前記処理完了情報を受信して前記第二の領域に追加し、特定のタイミングで前記第二の領域に前記処理完了情報が蓄積されているか判定し、蓄積されていれば、前記第一の領域に対応するセマフォ変数に1を加算した値を前記第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から1を加算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ更新し、前記第二の領域に蓄積された前記処理完了情報を1つ削除することを特徴とするシステム。
(付記12) 処理要求情報が蓄積される複数の第一の領域と、処理要求の完了を示す処理完了情報が前記処理要求を特定する情報と対応付けられ蓄積される第二の領域とが格納される蓄積部と、前記蓄積部を制御し、かつ前記処理要求を実行する制御部を有する第一の装置と、前記第一の装置に接続され、前記複数の第一の領域の各第一の領域および前記第二の領域を特定する情報とセマフォ変数が対応付けられ蓄積されるセマフォ変数表と、前記処理要求を特定する情報と前記複数の第一の領域のうち該処理要求が蓄積される第一の領域を特定する情報が対応付けられ蓄積される対応表とが格納される蓄積部と、前記蓄積部を制御し、かつ前記処理要求情報を前記第一の装置へ送信する制御部を有する第二の装置とを備え、前記第二の装置における制御部は、予め複数の第一の領域の各第一の領域および第二の領域にそれぞれ対応するセマフォ変数の初期値を前記第一の領域および前記第二の領域にそれぞれ蓄積可能な情報数の最大数として設定し、特定のタイミングで前記複数の第一の領域のうち1つを選択し、前記選択された第一の領域に対応するセマフォ変数から1を減算した値と前記第二の領域に対応するセマフォ変数から1を減算した値が共に正の値か判定し、共に正の値であれば、前記選択された第一の領域に対応するセマフォ変数から1を減算した値を前記選択された第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数から1を減算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ更新し、前記第一の装置に新たな処理要求情報を送信し、前記選択された第一の領域と前記処理要求を対応付けて対応表に蓄積し、前記第一の装置における制御部は、前記新たな処理要求情報を受信して前記第一の領域に蓄積し、特定のタイミングで前記第一の領域に蓄積された処理要求を実行し、該処理要求に対応する処理完了情報を作成して前記第二の装置に送信し、前記第二の装置における制御部は、前記処理完了情報を受信して前記第二の領域に蓄積し、特定のタイミングで前記第二の領域に前記処理完了情報が蓄積されているか判定し、蓄積されていれば、前記第一の領域に対応するセマフォ変数に1を加算した値を前記第一の領域に対応するセマフォ変数として、また前記第二の領域に対応するセマフォ変数の値から1を加算した値を前記第二の領域に対応するセマフォ変数としてそれぞれ更新し、かつ前記第二の領域に蓄積された前記処理完了情報を1つ削除することを特徴とするシステム。
(付記13) 付記10において、
前記第一の装置が、サーバマシンに備えられたチャネルアダプタであり、前記第二の装置が、ネットワークインタフェースカードに備えられたチャネルアダプタであることを特徴とするシステム。
(付記14) 付記10において、
前記第一の装置、前記第二の装置が共にサーバマシンに備えられたホストチャネルアダプタであることを特徴とするシステム。