(57)【要約】  サーバのドライバは、当該サーバの有するメモリのアドレスを、当該サーバに対応するオフセット値に基づいて、オフセットアドレスに変換し、そのオフセットアドレスを含むコマンドをキューに格納する。記憶装置は、サーバのキューからコマンドを取得し、その取得したコマンドに含まれるオフセットアドレスに対してアクセス要求を発行する。中間装置は、記憶装置から発行されたアクセス要求をトラップし、そのトラップしたアクセス要求に含まれるオフセットアドレスに基づいてサーバを特定し、その特定したサーバに対応するオフセット値に基づいて、そのオフセットアドレスを元のアドレスに戻し、その元に戻したアドレスを含むアクセス要求を、その特定したサーバへ転送する。
2017203645.tif 000002
【特許請求の範囲】
【請求項１】
ＮＶＭｅ（Ｎｏｎ−Ｖｏｌａｔｉｌｅ  Ｍｅｍｏｒｙ  Ｅｘｐｒｅｓｓ）に対応する記憶装置と、
前記記憶装置と接続されている中間装置と、
前記中間装置と接続されている複数のサーバと、
を有する計算機システムであって、
各サーバは、
前記記憶装置に係るドライバと、
前記記憶装置に対するコマンドが格納されるキューと、
を有し、
サーバのドライバは、
当該サーバの有するメモリのアドレスを、当該サーバに対応するオフセット値に基づいてオフセットアドレスに変換し、
そのオフセットアドレスを含むコマンドを、前記キューに格納し、
前記記憶装置は、
サーバのキューからコマンドを取得し、
その取得したコマンドに含まれるオフセットアドレスに対してアクセス要求を発行し、
前記中間装置は、
前記記憶装置から発行されたアクセス要求をトラップし、
そのトラップしたアクセス要求に含まれるオフセットアドレスに基づいてサーバを特定し、
その特定したサーバに対応するオフセット値に基づいて、そのオフセットアドレスを元のアドレスに戻し、
その元に戻したアドレスを含むアクセス要求を、その特定したサーバへ転送する
計算機システム。
【請求項２】
前記複数のサーバの内の第１のサーバのドライバは、
当該第１のサーバの有するメモリにＡｄｍｉｎキューを生成し、
その生成したＡｄｍｉｎキューに係るアドレスを、当該第１のサーバに対応するオフセット値に基づいて、オフセットアドレスに変換する
請求項１に記載の計算機システム。
【請求項３】
前記第１のサーバのドライバは、
当該第１のサーバの有するメモリにＩＯキューを生成し、
その生成したＩＯキューに係るアドレスを、当該第１のサーバに対応するオフセット値に基づいて、オフセットアドレスを変換し、
その変換したオフセットアドレスを含むＩＯキュー生成コマンドを、前記Ａｄｍｉｎキューに格納する
請求項２に記載の計算機システム。
【請求項４】
前記複数のサーバの内の第２のサーバのドライバは、
当該第２のサーバの有するメモリにＩＯキューを生成し、
その生成したＩＯキューに係るアドレスを、当該第２のサーバに対応するオフセット値に基づいて、オフセットアドレスに変換し、
その変換したオフセットアドレスを含むＩＯキュー生成コマンドを、前記第１のサーバへ送信し、
前記第１のサーバのドライバは、
前記第２のサーバから受領したＩＯキュー生成コマンドを、前記Ａｄｍｉｎキューに格納する
請求項３に記載の計算機システム。
【請求項５】
前記第１のサーバは、未割り当てのキューＩＤを管理するための未割り当てキューＩＤ管理情報を有し、
前記第１のサーバのドライバは、
前記第２のサーバから受領したＩＯキュー生成コマンドに対して、前記未割り当てキューＩＤ管理情報に含まれるキューＩＤを割り当て、
その割り当てたキューＩＤを、前記第２のサーバへ通知する
請求項４に記載の計算機システム。
【請求項６】
前記中間装置は、前記複数のサーバと複数のオフセット値とがそれぞれ対応付けられているルーティング管理情報を有する
請求項１に記載の計算機システム。
【請求項７】
前記オフセット値は、メモリのアドレス空間の上位から所定のビットを変換する値である
請求項１に記載の計算機システム。
【請求項８】
ＮＶＭｅ（Ｎｏｎ−Ｖｏｌａｔｉｌｅ  Ｍｅｍｏｒｙ  Ｅｘｐｒｅｓｓ）に対応する記憶装置と、
前記記憶装置と接続されている中間装置と、
前記中間装置と接続されている複数のサーバと、
を有する計算機システムにおける記憶制御方法であって、
各サーバは、
前記記憶装置に係るドライバと、
前記記憶装置に対するコマンドが格納されるキューと、
を有し、
サーバのドライバが、
当該サーバの有するメモリのアドレスを、当該サーバに対応するオフセット値に基づいて、オフセットアドレスに変換し、
そのオフセットアドレスを含むコマンドを、前記キューに格納し、
前記記憶装置が、
サーバのキューからコマンドを取得し、
その取得したコマンドに含まれるオフセットアドレスに対してアクセス要求を発行し、
前記中間装置が、
前記記憶装置から発行されたアクセス要求をトラップし、
そのトラップしたアクセス要求に含まれるオフセットアドレスに基づいてサーバを特定し、
その特定したサーバに対応するオフセット値に基づいて、そのオフセットアドレスを元のアドレスに戻し、
その元に戻したアドレスを含むアクセス要求を、その特定したサーバへ転送する
記憶制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、計算機システムにおけるデータ制御に関する。
【背景技術】
【０００２】
複数のサーバが記憶装置を共有する計算機システムにおいて、サーバと記憶装置との間のＩＯ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）を振り分ける技術として、次のような技術が知られている。計算機システムは、サーバと、ＩＯハブと、当該ＩＯハブに接続されているＩＯカードと、サーバ及びＩＯハブが接続されているスイッチとを備え、サーバがＩＯカードを専有して使用可能に設定されている。そして、ＩＯハブが、ＩＯカードに対応する物理ＭＭＩＯ（Ｍｅｍｏｒｙ  Ｍａｐｐｅｄ  Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）アドレスに対してサーバに固有な仮想ＭＭＩＯアドレスを割り当て、その割り当てられた仮想ＭＭＩＯアドレスと、物理ＭＭＩＯアドレスと、サーバ識別子との関係を示す割り当て情報を保持し、サーバからＩＯカードへのアクセス要求が送信されたときに、割り当て情報を参照して、アクセス要求からサーバ識別子を抽出し、アクセス要求元のサーバを識別する。さらにＩＯハブが、ＩＯカードからのＤＭＡ（Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）要求に含まれるＤＭＡアドレスを、識別されたＤＭＡ要求元のサーバに対応したアドレスに変換し、その変換したアドレスに基づいて、ＩＯカードから送信されたＤＭＡ要求をサーバのメモリ空間に転送する（特許文献１、２）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００８−２１２５２号公報
【特許文献２】特開２００７−１４８６２１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかし、上記の従来技術を、ＮＶＭｅ（Ｎｏｎ−Ｖｏｌａｔｉｌｅ  Ｍｅｍｏｒｙ  Ｅｘｐｒｅｓｓ）対応の記憶装置を備える計算機システムに適用した場合、記憶装置のＩＯ性能を十分に発揮させることができない。以下にその理由を述べる。【０００５】
ＮＶＭｅの仕様では、ＤＭＡ先のサーバのメモリアドレスを含むコマンドは、サーバのメモリに格納されており、記憶装置は、サーバのメモリに対してリードリクエストを発行することによりコマンドをフェッチし、内部のアドレスレジスタに設定する。また、ＮＶＭｅの仕様では、指定された複数のサーバアドレスが１つのコマンドに収まらない場合、記憶装置は、リスト状になったサーバのメモリアドレスを次々とフェッチする。このような構成では、従来技術のようにＩＯハブ上でＤＭＡ要求に含まれるＤＭＡアドレスを要求元サーバに対応したアドレスに変換することは、困難である。なぜならば、ＩＯハブが変換しなければならないＤＭＡアドレスは、記憶装置が発行したリードリクエストに対するコンプリーションの中に含まれることとなり、ＩＯハブは記憶装置が送出した前記リードリクエストがＩＯ動作のデータ転送なのか、コマンドフェッチに相当するものなのかを判断しなければならないからである。このような判断をＩＯハブ上で実現するためには、ＩＯハブの機構が複雑になる上、レイテンシの増大も招く。【０００６】
そこで、本発明の目的は、複数のサーバがＮＶＭｅ対応の記憶装置を共有する計算機システムを比較的簡易な機構で実現し、レイテンシの増大を抑制することにある。
【課題を解決するための手段】
【０００７】
実施形態に係る計算機システムは、ＮＶＭｅに対応する記憶装置と、記憶装置と接続されている中間装置と、中間装置と接続されている複数のサーバと、を有する。
各サーバは、記憶装置に係るドライバと、記憶装置に対するコマンドが格納されるキューと、を有する。
サーバのドライバは、当該サーバの有するメモリのアドレスを、当該サーバに対応するオフセット値に基づいてオフセットアドレスに変換し、そのオフセットアドレスを含むコマンドをキューに格納する。
記憶装置は、サーバのキューからコマンドを取得し、その取得したコマンドに含まれるオフセットアドレスに対してアクセス要求を発行する。
中間装置は、記憶装置から発行されたアクセス要求をトラップし、そのトラップしたアクセス要求に含まれるオフセットアドレスに基づいてサーバを特定し、その特定したサーバに対応するオフセット値に基づいて、そのオフセットアドレスを元のアドレスに戻し、その元に戻したアドレスを含むアクセス要求を、その特定したサーバへ転送する。
【発明の効果】
【０００８】
本発明によれば、複数のサーバがＮＶＭｅ対応の記憶装置を共有する計算機システムを比較的簡易な機構で実現し、レイテンシの増大を抑制することができる。
【図面の簡単な説明】
【０００９】
【図１】計算機システムの構成例を示す。
【図２】サーバの構成例を示す。
【図３】中間装置の構成例を示す。
【図４】ＩＯキュー生成処理の概要を示す。
【図５】ＩＯキュー生成コマンドの構成例を示す。
【図６】ＩＯコマンド発行処理の概要を示す。
【図７】ＩＯコマンド実行処理の概要を示す。
【図８】代表サーバの初期設定処理の一例を示すフローチャートである。
【図９】代表サーバ以外のサーバの初期設定処理の一例を示すフローチャートである。
【図１０】記憶装置に対するサーバのＩＯ処理の一例を示すフローチャートである。
【発明を実施するための形態】
【００１０】
以下、実施形態を説明する。
【００１１】
以下の説明では、「ｘｘｘテーブル」、「ｘｘｘキュー」又は「ｘｘｘリスト」の表現にて情報を説明することがあるが、情報は、どのようなデータ構造で表現されていてもよい。すなわち、情報がデータ構造に依存しないことを示すために、「ｘｘｘテーブル」、「ｘｘｘキュー」又は「ｘｘｘリスト」を「ｘｘｘ情報」と呼ぶことができる。
【００１２】
また、以下の説明では、「プログラム」を主語として処理を説明する場合があるが、プログラムは、プロセッサ（例えばＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ））によって実行されることで、定められた処理を、適宜に記憶資源（例えばメモリ）及び通信インターフェイスデバイスのうちの少なくとも１つを用いながら行うため、処理の主語が、プロセッサ、そのプロセッサを有する装置とされてもよい。プロセッサが行う処理の一部又は全部が、ハードウェア回路で行われてもよい。コンピュータプログラムは、プログラムソースからインストールされてよい。プログラムソースは、プログラム配布サーバ又は記憶メディア（例えば可搬型の記憶メディア）であってもよい。
【００１３】
また、以下の説明では、同種の要素を区別して説明する場合には、「サーバ４Ａ」、「サーバ４Ｂ」のように、参照符号を使用し、同種の要素を区別しないで説明する場合には、「サーバ」のように参照符号のうちの共通番号のみを使用することがある。
【００１４】
なお、以下の実施形態においては便宜上その必要があるときは、複数のセクションまたは実施の形態に分割して説明するが、特に明示した場合を除き、それらはお互いに無関係なものではなく、一方は他方の一部または全部の変形例、詳細、補足説明などの関係にある。
【００１５】
また、以下の実施形態において、要素の数等（個数、数値、量、範囲等を含む）に言及する場合、特に明示した場合及び原理的に明らかに特定の数に限定される場合などを除き、その特定の数に限定されるものではなく、特定の数以上でも以下でも良いものとする。
【００１６】
さらに、以下の実施形態において、その構成要素（要素ステップなどを含む）は、特に明示した場合及び原理的に明らかに必須であると考えられる場合などを除き、必ずしも必須のものではない。
【００１７】
図１は、実施形態に係る計算機システム１の構成例を示す。
【００１８】
計算機システム１は、複数のサーバ４（第１サーバ４Ａ及び第２サーバ４Ｂ）と、中間装置６と、記憶装置８とを有する。記憶装置８の例は、ＮＶＭｅに対応するＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）である。中間装置６及び記憶装置８は、複数であってもよい。
【００１９】
第１サーバ４Ａ及び第２サーバ４Ｂは、所定のネットワーク３を介して、双方向通信可能である。ネットワーク３の例は、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、及びＶＰＮ（Ｖｉｒｔｕａｌ  Ｐｒｉｖａｔｅ  Ｎｅｔｗｏｒｋ）などである。
【００２０】
第１サーバ４Ａ及び第２サーバ４Ｂは、中間装置６と双方向通信可能に接続されている。当該接続方式はＰＣＩｅ（ＰＣＩ−Ｅｘｐｒｅｓｓ）であってよい。
【００２１】
中間装置６は、記憶装置８と双方向通信可能に接続されている。当該接続方式もＰＣＩｅであってよい。中間装置６の詳細については後述する（図３参照）。
【００２２】
図２は、サーバ４の構成例を示す。
【００２３】
サーバ４は、ＣＰＵ１４と、メモリ１２と、ＰＣＩｅカード１６と、ＮＩＣ（Ｎｅｔｗｏｒｋ  Ｉｎｔｅｒｆａｃｅ  Ｃａｒｄ）１４とを有する。これらの構成要素は、双方向通信可能な内部バス１８で接続されてよい。これらの構成要素は、複数であってもよい。
【００２４】
ＮＩＣ１４は、サーバ４がネットワーク３を介して送受信するＩＰに係るデータを制御する。
【００２５】
ＰＣＩｅカード１６は、サーバ４が中間装置６と送受信するＰＣＩｅに係るデータを制御する。ＰＣＩｅカード１６は、複数のＰＣＩｅポートを備えてよい。
【００２６】
ＣＰＵ１０は、メモリ１２からプログラム及びデータを読み出して処理することにより、サーバ４の有する様々な機能を実現する。
【００２７】
メモリ１２には、プログラム及びデータが格納される。メモリ１２の例は、ＤＲＡＭ（Ｄｙｎａｍｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＭＲＡＭ（Ｍａｇｎｅｔｏｒｅｓｉｓｔｉｖｅ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＦｅＲＡＭ（Ｆｅｒｒｏｅｌｅｃｔｒｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）などである。
【００２８】
メモリ１２には、プログラムとして、デバイスドライバ（「ドライバ」と表現する）１００が格納されてよい。ドライバ１００は、サーバ４のアプリケーションが記憶装置８にアクセスするための機能を提供する。本実施形態の説明におけるサーバ４が主体の動作は、サーバ４のドライバ１００が主体であってよいし、そのドライバ１００を実行するＣＰＵ１０が主体であってもよい。
【００２９】
メモリ１２には、データとして、ＱＩＤフリーリスト１１０が格納されてよい。ＱＩＤフリーリスト１１０は、未割り当ての（つまり割り当て可能な）キューのＩＤ（「ＱＩＤ」という）を有する。ＱＩＤフリーリスト１１０は、キューＩＤ管理情報と表現してもよい。
【００３０】
メモリ１２には、ＮＶＭｅに係るキューが構成されてよい。キューの例は、Ａｄｍｉｎ  Ｓｕｂｍｉｓｓｉｏｎ  Ｑｕｅｕｅ（「Ａｄｍｉｎ  ＳＱ」という）１２０、Ａｄｍｉｎ  Ｃｏｍｐｌｅｔｉｏｎ  Ｑｕｅｕｅ（「Ａｄｍｉｎ  ＣＱ」という）１２２、ＩＯ  Ｓｕｂｍｉｓｓｉｏｎ  Ｑｕｅｕｅ（「ＩＯ  ＳＱ」という）１３０、ＩＯ  Ｃｏｍｐｌｅｔｉｏｎ  Ｑｕｅｕｅ（「ＩＯ  ＣＱ」という）１３２である。
【００３１】
メモリ１２には、必要に応じてバッファ１４０が確保されてよい。バッファ１４０には、記憶装置８に対するライトデータ、又は、記憶装置８からのリードデータなどが格納されてよい。
【００３２】
図３は、中間装置６の構成例を示す。
【００３３】
中間装置６は、コントローラ２０と、メモリ２２と、ＰＣＩｅカード２４Ａ、２４Ｂとを有する。これらの構成要素は、双方向通信可能な内部バス２８で接続されてよい。これらの構成要素は、複数であってもよい。
【００３４】
ＰＣＩｅカード２４Ａは、中間装置６がサーバ４と送受信するＰＣＩｅに係るデータを制御する。ＰＣＩｅカード２４Ｂは、中間装置６が記憶装置８と送受信するＰＣＩｅに係るデータを制御する。ＰＣＩｅカード２４には、複数のＰＣＩｅポートが備えられてよい。
【００３５】
コントローラ２０は、中間装置６の有する様々な機能を実現する。本実施形態における中間装置６が主体の動作は、中間装置６のコントローラ２０が主体であってよい。
【００３６】
メモリ２２には、データとして、ルーティング管理テーブル２００が格納されてよい。ルーティング管理テーブル２００の詳細については後述する（図４参照）。
【００３７】
図４は、ＩＯキュー生成処理の概要を示す。図５は、ＩＯキュー生成コマンドの構成例を示す。
【００３８】
サーバ４は、ＮＶＭｅ対応の記憶装置８とＩＯコマンドをやり取りするために、メモリ１２にＩＯキューを生成する必要がある。そのＩＯキューを生成するためのコマンドが、ＩＯキュー生成コマンドである。
【００３９】
ＩＯキュー生成コマンドには、図５に示すように、コマンドＩＤ、キューベースアドレス、キューサイズ、ＮａｍｅＳｐａｃｅＩＤ、ＱＩＤ（ＱｕｅｕｅＩＤ）が含まれてよい。
【００４０】
コマンドＩＤは、当該コマンドを識別するためのＩＤである。当該コマンドＩＤには、ＮＶＭｅ仕様における「Ｃｒｅａｔｅ  ＩＯ  ＳＱ  Ｃｏｍｍａｎｄ」に対応するＩＤや、「Ｃｒｅａｔｅ  ＩＯ  ＣＱ  Ｃｏｍｍａｎｄ」に対応するＩＤなどが格納される。
【００４１】
キューベースアドレスは、メモリ１２に生成されたＩＯキュー１３０の先頭アドレス１３２を示す。
【００４２】
キューサイズは、メモリ１２に生成されたＩＯキューのサイズを示す。
【００４３】
ＮａｍｅＳｐａｃｅＩＤは、コマンドの発行先のＮａｍｅＳｐａｃｅを識別するためのＩＤである。
【００４４】
ＱＩＤは、メモリ１２に生成されたＩＯキューを一意に識別するためのＩＤである。
【００４５】
サーバ４は、メモリ１２にＩＯキューを生成し、記憶装置８に対してＩＯキュー生成コマンドを発行することにより、記憶装置８とＩＯデータをやり取りできるようになる。記憶装置８に対するＩＯキュー生成コマンドの発行は、Ａｄｍｉｎ  ＳＱを通じて行われる。しかし、ＮＶＭｅ仕様では、記憶装置８は１つのＡｄｍｉｎ  ＳＱしか管理しないので、複数のサーバ４が、それぞれ、Ａｄｍｉｎ  ＳＱを生成することはできない。
【００４６】
そこで、本実施形態に係る計算機システム１は、複数のサーバ４のうち１つのサーバが代表して、記憶装置８に対してＩＯキュー生成コマンドを発行する構成を有する。以下、図４を参照しながら、第１サーバ４Ａが代表サーバ、第２サーバ４Ｂが代表以外のサーバである場合における、第２サーバ４ＢにＩＯキューを生成する処理の概要を述べる。
【００４７】
（Ａ１）第２サーバ４Ｂのドライバ１００は、「Ｃｒｅａｔｅ  ＩＯ  ＳＱ  Ｃｏｍｍａｎｄ」４００Ｂを生成する。このとき、第２サーバ４Ｂのドライバ１００は、第２サーバ４Ｂのメモリ１２Ｂに生成されたＩＯ  ＳＱ１３０Ｂのキューベースアドレス１３２Ｂに対して、第２サーバ４Ｂに対応付けられているオフセット値を加算したアドレス（「オフセットアドレス」という）を、当該「Ｃｒｅａｔｅ  ＩＯ  ＳＱ  Ｃｏｍｍａｎｄ」４００Ｂのキューベースアドレス４２０に格納してよい。なお、各サーバには、そのサーバを一意に識別可能なオフセット値が対応付けられてよい。
【００４８】
図４の例では、「０ｘ００００＿００００＿００００＿Ｃ０００」がメモリ１２Ｂに生成されたＩＯ  ＳＱ１３０Ｂのキューベースアドレス１３２Ｂに相当し、「０ｘ８００２＿００００＿００００＿００００」が第２サーバ４Ｂに対応付けられているオフセット値に相当し、「０ｘ８００２＿００００＿００００＿Ｃ０００」がそれらを加算したオフセットアドレスに相当する。本実施形態において、オフセット値を先頭のアドレス（０ｘ８００２）のみで表現することがある。また、メモリ１２Ｂに生成したＩＯ  ＳＱ１３０Ｂの実際のキューベースアドレス１３２Ｂを「キューの実アドレス」、実アドレスにオフセット値を加算したオフセットアドレスを「キューのオフセットアドレス」と表現してもよい。
【００４９】
また、本実施形態では、６４ビットのメモリ空間の上位１６ビットに対して加算及び減算を行うオフセット値を用いているが、物理的に搭載されているメモリ領域と重複しない限り、オフセット値はどのような値であってもよい。
【００５０】
また、第２サーバ４Ｂのドライバ１００は、「Ｃｒｅａｔｅ  ＩＯ  ＳＱ  Ｃｏｍｍａｎｄ」４００ＢのＱＩＤ４２２Ｂに、ダミーのＱＩＤ（例えば「０ｘ００」）を格納してよい。この場合、正規のＱＩＤは、代表サーバである第１サーバで付与される。
【００５１】
（Ａ２）第２サーバ４Ｂのドライバ１００は、その生成した「Ｃｒｅａｔｅ  ＩＯ  ＳＱ  Ｃｏｍｍａｎｄ」４００Ｂの発行を、代表サーバである第１サーバ４Ａに依頼する。このとき、第２サーバ４Ｂのドライバ１００は、「Ｃｒｅａｔｅ  ＩＯ  ＳＱ  Ｃｏｍｍａｎｄ」４００Ｂをそのまま第１サーバ４Ａへ送信しても良いし、「Ｃｒｅａｔｅ  ＩＯ  ＳＱ  Ｃｏｍｍａｎｄ」の内容を含むコマンドの発行依頼を第１サーバ４Ａへ送信してもよい。
【００５２】
（Ａ３）第１サーバ４Ａのドライバ１００は、第２サーバ４Ｂから「Ｃｒｅａｔｅ  ＩＯ  ＳＱ  Ｃｏｍｍａｎｄ」４００Ｂを受領すると、その「Ｃｒｅａｔｅ  ＩＯ  ＳＱ  Ｃｏｍｍａｎｄ」４００Ｂに対して、ＱＩＤフリーリスト１１０内のＱＩＤの１つを割り当てる。図４の例では、ダミーのＱＩＤ４２２Ｂ「０ｘ００」を、ＱＩＤフリーリスト１１０内のＱＩＤ「０ｘ０２」に置き換えている。
【００５３】
（Ａ４）第１サーバ４Ａのドライバ１００は、その「Ｃｒｅａｔｅ  ＩＯ  ＳＱ  Ｃｏｍｍａｎｄ」４００Ｂを、当該第１サーバ４Ａのメモリ１２ＡのＡｄｍｉｎ  ＳＱ１２０にエンキューする。
【００５４】
（Ａ５）第１サーバ４Ａのドライバ１００は、記憶装置８のＡｄｍｉｎ  ＳＱ１２０に係るＤｏｏｒｂｅｌｌレジスタを更新する。
【００５５】
（Ａ６）記憶装置８は、（Ａ４）のＡｄｍｉｎ  ＳＱ１２０に係るＤｏｏｒｂｅｌｌレジスタの更新を検知すると、第１サーバ４ＡのＡｄｍｉｎ  ＳＱ１２０から「Ｃｒｅａｔｅ  ＩＯ  ＳＱ  Ｃｏｍｍａｎｄ」４００Ｂをフェッチするためのリードリクエストを発行する。このとき記憶装置８は、当該リードリクエストに、Ａｄｍｉｎ  ＳＱ１２０のオフセットアドレスを含めてよい。Ａｄｍｉｎ  ＳＱ１２０のオフセットアドレスは、第１サーバ４ＡのＡｄｍｉｎ  ＳＱ１２０の実アドレスに、第１サーバ４Ａに対応付けられているオフセット値（０ｘ８０００）を加算したアドレスであってよい。Ａｄｍｉｎ  ＳＱ１２０のオフセットアドレスは、第１サーバ４ＡがＡｄｍｉｎ  ＳＱ１２０を生成する際に記憶装置８に伝えられ、記憶装置８の内部レジスタ２２０に登録されてよい。
【００５６】
（Ａ７）中間装置６は、記憶装置８から発行されたリードリクエストをトラップする。そして、中間装置６は、ルーティング管理テーブル２００を参照し、当該リードリクエストに含まれるオフセットアドレスのオフセット値（０ｘ８０００）から、当該リードリクエストのルーティング先が第１サーバ４Ａであると特定する。そして、中間装置６は、当該リードリクエストのオフセットアドレスを実アドレスに変換し、第１サーバ４Ａに転送する。オフセットアドレスを実アドレスに変換することは、オフセットアドレスからオフセット値を減算することであってよい。又は、オフセットアドレスのオフセット値を「ＮＵＬＬ」にすることであってもよい。これは他の変換においても同様である。
【００５７】
（Ａ８）第１サーバ４Ａは、（Ａ７）のリードリクエストを受領し、そのリードリクエストに含まれる実アドレスに格納されているＡｄｍｉｎ  ＳＱ１２０内「Ｃｒｅａｔｅ  ＩＯ  ＳＱ  Ｃｏｍｍａｎｄ」４００Ｂを、記憶装置８に返送する。
【００５８】
（Ａ９）記憶装置８は、（Ａ８）の「Ｃｒｅａｔｅ  ＩＯ  ＳＱ  Ｃｏｍｍａｎｄ」４００Ｂを取得し、当該コマンドに含まれるＱＩＤとオフセットアドレスとを対応付けて、内部レジスタ２２０に登録する。このオフセットアドレスは、上述の通り、第２サーバ４Ｂのメモリ１２Ｂに生成されたＩＯ  ＳＱ１３０の実アドレス１３２Ｂに、第２サーバ４Ｂに対応付けられているオフセット値（０ｘ８００２）を加算したアドレスである。
【００５９】
（Ａ１０）なお、第１サーバ４Ａのドライバ１００は、第２サーバ４Ｂの「Ｃｒｅａｔｅ  ＩＯ  ＳＱ  Ｃｏｍｍａｎｄ」のダミーＱＩＤに対して付与したＱＩＤを、所定のタイミングで第２サーバ４Ｂに通知してよい。例えば、「Ｃｒｅａｔｅ  ＩＯ  ＳＱ  Ｃｏｍｍａｎｄ」に対応する「Ｃｏｍｍａｎｄ  Ｃｏｍｐｌｅｔｉｏｎ」を受領したタイミング、又は、上記（Ａ３）の実行後のタイミングなどに通知してよい。
【００６０】
以上の処理により、代表サーバ以外のサーバのメモリに生成されたＩＯキューのオフセットアドレスを、記憶装置８に登録させることができる。なお、代表サーバのメモリに生成されたＩＯキューのオフセットアドレスを記憶装置８に登録させる場合は、代表サーバが、オフセットアドレスを含む「Ｃｒｅａｔｅ  ＩＯ  ＳＱ  Ｃｏｍｍａｎｄ」を生成し、自分のメモリのＡｄｍｉｎ  ＳＱ１２０にエンキューすればよい。また、上述では「Ｃｒｅａｔｅ  ＩＯ  ＳＱ  Ｃｏｍｍａｎｄ」について説明したが、「Ｃｒｅａｔｅ  ＩＯ  ＣＱ  Ｃｏｍｍａｎｄ」などについても同様である。
【００６１】
図６は、ＩＯコマンド発行処理の概要を示す。
【００６２】
サーバ４は、メモリ１２に生成したＩＯキューにＩＯコマンドをエンキューすることにより、ＮＶＭｅ対応の記憶装置８に対してＩＯコマンドを発行する。ＩＯコマンドの例は、ＮＶＭｅ仕様における「Ｗｒｉｔｅ  Ｃｏｍｍａｎｄ」及び「Ｒｅａｄ  Ｃｏｍｍａｎｄ」などである。
【００６３】
以下、図６を参照しながら、代表以外のサーバである第２サーバ４Ｂが、「Ｒｅａｄ  Ｃｏｍｍａｎｄ」を発行する処理の概要を述べる。なお、以下の処理は、「Ｗｒｉｔｅ  Ｃｏｍｍａｎｄ」であっても同様である。
【００６４】
（Ｂ１）第２サーバ４Ｂのドライバ１００は、「Ｒｅａｄ  Ｃｏｍｍａｎｄ」４０２を生成する。このとき、第２サーバ４Ｂのドライバ１００は、第２サーバ４Ｂのメモリ１２ＢにＲｅａｄデータ格納用に確保したバッファ１４０Ｂのベースアドレスに対して第２サーバ４Ｂに対応付けられているオフセット値（０ｘ８００２）を加算したオフセットアドレス４３０を、「Ｒｅａｄ  Ｃｏｍｍａｎｄ」４０２に含めてよい。
【００６５】
図６の例では、「０ｘ００００＿００００＿００００＿Ａ０００」がメモリ１２Ｂに確保したバッファ１４０Ｂのベースアドレスに相当し、「０ｘ８００２＿００００＿００００＿Ａ０００」がオフセット値を加算したバッファのオフセットアドレス４３０に相当する。メモリ１２Ｂに確保したバッファ１４０Ｂの実際のベースアドレスを「バッファの実アドレス」、バッファ１４０Ｂのベースアドレスにオフセット値を加算したアドレスを「バッファのオフセットアドレス」と表現してもよい。また、第２サーバ４Ｂのドライバ１００は、第２サーバ４ＢのＩＯ  ＳＱ１３０Ｂに対応するＱＩＤ４３２（図６の例では「０ｘ０２」）を「Ｒｅａｄ  Ｃｏｍｍａｎｄ」４０２に含めてよい。
【００６６】
（Ｂ２）第２サーバ４Ｂのドライバ１００は、その生成した「Ｒｅａｄ  Ｃｏｍｍａｎｄ」４０２を、第２サーバ４Ｂのメモリ１２ＢのＩＯ  ＳＱ１３０Ｂにエンキューする。
【００６７】
（Ｂ３）第２サーバ４Ｂのドライバ１００は、記憶装置８の第２サーバ４ＢのＩＯ  ＳＱ１３０Ｂに係るＤｏｏｒｂｅｌｌレジスタを更新する。
【００６８】
（Ｂ４）記憶装置８は、（Ｂ３）のＩＯ  ＳＱ１３０Ｂに係るＤｏｏｒｂｅｌｌレジスタの更新を検知すると、第２サーバ４ＢのＩＯ  ＳＱ１３０Ｂから「Ｒｅａｄ  Ｃｏｍｍａｎｄ」４０２をフェッチするためのリードリクエストを発行する。このとき記憶装置８は、当該リードリクエストに、ＩＯ  ＳＱ１３０Ｂのオフセットアドレスを含めてよい。ＩＯ  ＳＱ１３０Ｂのオフセットアドレスは、第２サーバ４ＢのＩＯ  ＳＱ１３０Ｂの実アドレスに、第２サーバ４Ｂに対応付けられているオフセット値（０ｘ８００２）を加算したアドレスであってよい。ＩＯ  ＳＱ１３０Ｂのオフセットアドレスは、第２サーバ４ＢがＩＯ  ＳＱ１３０Ｂを生成する際に記憶装置８に伝えられ、記憶装置８の内部レジスタ２２０に登録されてよい。
【００６９】
（Ｂ５）中間装置６は、記憶装置８から発行されたリードリクエストをトラップする。そして、中間装置６は、ルーティング管理テーブル２００を参照し、当該リードリクエストに含まれるオフセットアドレスのオフセット値（０ｘ８００２）から、当該リードリクエストのルーティング先が第２サーバ４Ｂであると特定する。そして、中間装置６は、当該リードリクエストのオフセットアドレスを実アドレスに変換し、第２サーバ４Ｂに転送する。
【００７０】
（Ｂ６）第２サーバ４Ｂは、（Ｂ５）のリードリクエストを受領し、そのリードリクエストに含まれる実アドレスに格納されているＩＯ  ＳＱ１３０Ｂ内「Ｒｅａｄ  Ｃｏｍｍａｎｄ」４０２Ｂを、記憶装置８に返送する。以下、図７を参照しながらこの後の処理を説明する。
【００７１】
図７は、ＩＯコマンド実行処理の概要を示す。
【００７２】
図６に引き続き、ＩＯコマンドが「Ｒｅａｄ  Ｃｏｍｍａｎｄ」の場合の処理について述べる。
【００７３】
（Ｃ１）記憶装置８は、上記（Ｂ６）の「Ｒｅａｄ  Ｃｏｍｍａｎｄ」４０２Ｂを取得し、当該「Ｒｅａｄ  Ｃｏｍｍａｎｄ」４０２Ｂに含まれるバッファ１４０Ｂのオフセットアドレスを内部レジスタ２４０に登録する。
【００７４】
（Ｃ２）記憶装置８は、バッファ１４０Ｂのオフセットアドレス宛にリードデータを送出する。
【００７５】
（Ｃ３）中間装置６は、記憶装置８から送出されたリードデータをトラップする。そして、中間装置６は、ルーティング管理テーブル２００を参照し、当該リードデータの宛先であるバッファ１４０Ｂのオフセットアドレス内のオフセット値（０ｘ８００２）から、ルーティング先を第２サーバ４Ｂと特定する。そして、中間装置６は、当該リードデータの宛先を、バッファ１４０Ｂのオフセットアドレスから実アドレスに変換し、第２サーバ４Ｂに転送する。
【００７６】
（Ｃ４）その転送されたリードデータは、宛先のバッファ１４０Ｂの実アドレスに書き込まれる。
【００７７】
なお、ＩＯコマンドが「Ｗｒｉｔｅ  Ｃｏｍｍａｎｄ」の場合、バッファ１４０Ｂに格納されたライトデータが、記憶装置８に転送されて書き込まれる。
【００７８】
以上の処理により、第２サーバ４Ｂのドライバ１００は、記憶装置８からデータをリードしたり、記憶装置８にデータをライトしたりすることができる。
【００７９】
図８は、代表サーバの初期設定処理の一例を示すフローチャートである。
【００８０】
代表サーバである第１サーバ４Ａは、初期化設定処理により、自分のメモリ１２ＡにＡｄｍｉｎ  ＳＱ１２０及びＡｄｍｉｎ  ＣＱ１２２、並びに、ＩＯ  ＳＱ１３０及びＩＯ  ＣＱ１３２を生成する。以下詳細を説明する。
【００８１】
第１サーバ４Ａのドライバ１００は、メモリ１２ＡにＡｄｍｉｎ  ＣＱ１２２を生成する（Ｓ１００）。
【００８２】
第１サーバ４Ａのドライバ１００は、その生成したＡｄｍｉｎ  ＣＱ１２２の実アドレスに、第１サーバ４Ａと対応付けられているオフセット値（０ｘ８０００）を加算し、Ａｄｍｉｎ  ＣＱ１２２のオフセットアドレスを算出する。そして、第１サーバ４Ａのドライバ１００は、そのＡｄｍｉｎ  ＣＱ１２２のオフセットアドレスを記憶装置８に送信する（Ｓ１０２）。
【００８３】
記憶装置８は、この送信されたＡｄｍｉｎ  ＣＱ１２２のオフセットアドレスを、内部レジスタ２２０に登録する（Ｓ１０４）。
【００８４】
第１サーバ４Ａのドライバ１００及び記憶装置８は、Ａｄｍｉｎ  ＳＱ１２０について、上記Ｓ１００及びＳ１０２と同様の処理を実行する（Ｓ１１０）。
【００８５】
第１サーバ４Ａのドライバ１００は、メモリ１２ＢにＩＯ  ＣＱ１３２を生成する（Ｓ１１６）。
【００８６】
第１サーバ４Ａのドライバ１００は、ＱＩＤフリーリスト１１０の中からＱＩＤを１つ選択する。そして、第１サーバ４Ａのドライバ１００は、その選択したＱＩＤを、ＱＩＤフリーリスト１１０から削除する（Ｓ１１８）。
【００８７】
第１サーバ４Ａのドライバ１００は、その生成したＩＯ  ＣＱ１３２の実アドレスに、第１サーバ４Ａと対応付けられているオフセット値（０ｘ８０００）を加算し、ＩＯ  ＣＱ１３２のオフセットアドレスを算出する。そして、第１サーバ４Ａのドライバ１００は、その算出したオフセットアドレスとＳ１１８で選択したＱＩＤとを含む「Ｃｒｅａｔｅ  ＩＯ  ＣＱ  Ｃｏｍｍａｎｄ」を生成する（Ｓ１２０）。
【００８８】
第１サーバ４Ａのドライバ１００は、この生成した「Ｃｒｅａｔｅ  ＩＯ  ＣＱ  Ｃｏｍｍａｎｄ」を、Ａｄｍｉｎ  ＳＱ１２０にエンキューする（Ｓ１２２）。
【００８９】
第１サーバ４Ａのドライバ１００は、記憶装置８におけるＡｄｍｉｎ  ＳＱ１２０に係るＤｏｏｒｂｅｌｌレジスタを更新する（Ｓ１２４）。このときのＴａｉｌアドレスは、オフセットアドレスを加算したアドレスであってよい。他のＤｏｏｒｂｅｌｌレジスタの更新についても同様である。
【００９０】
記憶装置８は、このＤｏｏｒｂｅｌｌレジスタの更新を検知すると、Ａｄｍｉｎ  ＳＱ１２０から「Ｃｒｅａｔｅ  ＩＯ  ＣＱ  Ｃｏｍｍａｎｄ」をフェッチするためのリードリクエストを発行する（Ｓ１４４）。
【００９１】
中間装置６は、記憶装置８から発行されたＳ１４４のリードリクエストをトラップする。そして、中間装置６は、ルーティング管理テーブル２００を参照し、そのリードリクエストに含まれるオフセットアドレスのオフセット値（０ｘ８０００）が、第１サーバ４Ａに対応付けられていることを特定する。そして、中間装置６は、そのオフセットアドレスを実アドレスに変換する。例えば、オフセットアドレスからオフセット値（０ｘ８０００）を減算する。そして、中間装置６は、その変換後のリードリクエストを、その特定した第１サーバ４Ａへ転送する（Ｓ１４６）。
【００９２】
第１サーバ４Ａは、その転送されたリードリクエストを受領すると、その実アドレスに係るＡｄｍｉｎ  ＳＱ１２０から「Ｃｒｅａｔｅ  ＩＯ  ＣＱ  Ｃｏｍｍａｎｄ」を、記憶装置８へ返送する（Ｓ１４８）。
【００９３】
記憶装置８は、その返送された「Ｃｒｅａｔｅ  ＩＯ  ＣＱ  Ｃｏｍｍａｎｄ」を実行する（Ｓ１５０）。すなわち、記憶装置８は、「Ｃｒｅａｔｅ  ＩＯ  ＣＱ  Ｃｏｍｍａｎｄ」に含まれるＱＩＤとＩＯ  ＣＱ１３２のオフセットアドレスとを対応付けて内部レジスタ２２０に登録する。
【００９４】
そして、記憶装置８は、第１サーバ４ＡのＡｄｍｉｎ  ＣＱ１２２に対して「Ｃｏｍｍａｎｄ  Ｃｏｍｐｌｅｔｉｏｎ」を発行する（Ｓ１５２）。この「Ｃｏｍｍａｎｄ  Ｃｏｍｐｌｅｔｉｏｎ」の宛先アドレスは、Ａｄｍｉｎ  ＣＱ１２２に対応するオフセットアドレスである。
【００９５】
中間装置６は、その「Ｃｏｍｍａｎｄ  Ｃｏｍｐｌｅｔｉｏｎ」をトラップする。そして、中間装置６は、ルーティング管理テーブル２００を参照し、その「Ｃｏｍｍａｎｄ  Ｃｏｍｐｌｅｔｉｏｎ」の宛先アドレスであるオフセットアドレスのオフセット値（０ｘ８０００）が、第１サーバ４Ａに対応付けられていることを特定する。そして、中間装置６は、その「Ｃｏｍｍａｎｄ  Ｃｏｍｐｌｅｔｉｏｎ」のオフセットアドレスを実アドレスに変換する。そして、中間装置６は、その変換後の「Ｃｏｍｍａｎｄ  Ｃｏｍｐｌｅｔｉｏｎ」を、その特定した第１サーバ４Ａに転送する（Ｓ１５４）。
【００９６】
第１サーバ４Ａのドライバ１００は、Ａｄｍｉｎ  ＣＱ１２２から、その「Ｃｏｍｍａｎｄ  Ｃｏｍｐｌｅｔｉｏｎ」をデキューし、Ｓ１２２でエンキューした「Ｃｒｅａｔｅ  ＩＯ  ＣＱ  Ｃｏｍｍａｎｄ」の実行を完了する（Ｓ１５６）。
【００９７】
第１サーバ４Ａのドライバ１００及び記憶装置８は、ＩＯ  ＳＱ１３０について、上記Ｓ１１６乃至Ｓ１５６と同様の処理を実行する（Ｓ１６０）。
【００９８】
以上の処理により、第１サーバ４Ａのメモリ１２Ａに、Ａｄｍｉｎ  ＣＱ１２２、Ａｄｍｉｎ  ＳＱ１２０、ＩＯ  ＣＱ１３２、及びＩＯ  ＳＱ１３０が生成される。また、記憶装置８の内部レジスタ２２０に、Ａｄｍｉｎ  ＣＱ１２２、Ａｄｍｉｎ  ＳＱ１２０、ＩＯ  ＣＱ１３２、及びＩＯ  ＳＱ１３０について、それぞれ、ＱＩＤ及びオフセットアドレスが登録される。
【００９９】
図９は、代表サーバ以外のサーバの初期設定処理の一例を示すフローチャートである。
【０１００】
代表サーバ以外のサーバである第２サーバ４Ｂは、初期設定処理により、自分のメモリ１２ＢにＩＯ  ＳＱ１３０及びＩＯ  ＣＱ１３２を生成する。以下詳細を説明する。
【０１０１】
第２サーバ４Ｂのドライバ１００は、メモリ１２ＢにＩＯ  ＣＱ１３２を生成する（Ｓ２００）。
【０１０２】
第２サーバ４Ｂのドライバ１００は、その生成したＩＯ  ＣＱ１３２の実アドレスに、第２サーバ４Ｂと対応付けられているオフセット値（０ｘ８００２）を加算し、ＩＯ  ＣＱ１３２のオフセットアドレスを算出する。そして、第２サーバ４Ｂのドライバ１００は、そのオフセットアドレスとダミーのＱＩＤとを含む「Ｃｒｅａｔｅ  ＩＯ  ＣＱ  Ｃｏｍｍａｎｄ」を作成する（Ｓ２０２）。
【０１０３】
第２サーバ４Ｂのドライバ１００は、代表サーバである第１サーバ４Ａに、Ｓ２０２で作成した「Ｃｒｅａｔｅ  ＩＯ  ＣＱ  Ｃｏｍｍａｎｄ」の実行依頼を送信する（Ｓ２０４）。
【０１０４】
第１サーバ４Ａのドライバ１００は、Ｓ２０４の実行依頼を受領すると、ＱＩＤフリーリスト１１０からＱＩＤを１つ選択する。そして、第１サーバ４Ａのドライバ１００は、その選択したＱＩＤを、ＱＩＤフリーリスト１１０から削除する。そして、第１サーバ４Ａのドライバ１００は、その実行依頼された「Ｃｒｅａｔｅ  ＩＯ  ＣＱ  Ｃｏｍｍａｎｄ」のダミーのＱＩＤを、その選択したＱＩＤに置き換える（Ｓ２０８）。
【０１０５】
第１サーバ４Ａのドライバ１００は、その「Ｃｒｅａｔｅ  ＩＯ  ＣＱ  Ｃｏｍｍａｎｄ」を、Ａｄｍｉｎ  ＳＱ１２０にエンキューする（Ｓ２１０）。
【０１０６】
第１サーバ４Ａのドライバ１００、中間装置６及び記憶装置８は、図８のＳ１１６乃至Ｓ１５６と同様の処理を行う（Ｓ２１２）。これにより、第２サーバ４Ｂのメモリ１２ＢのＩＯ  ＣＱ１３２のオフセットアドレスとＱＩＤとが対応付けられて、記憶装置８の内部レジスタ２２０に登録される。
【０１０７】
第１サーバ４Ａのドライバ１００は、中間装置６から「Ｃｒｅａｔｅ  ＩＯ  ＣＱ  Ｃｏｍｍａｎｄ」に対応する「Ｃｏｍｍａｎｄ  Ｃｏｍｐｌｅｔｉｏｎ」を受領し、第２サーバ４Ｂのドライバ１００へ送信する（Ｓ２１４）。この「Ｃｏｍｍａｎｄ  Ｃｏｍｐｌｅｔｉｏｎ」には、Ｓ２０８で選択したＱＩＤが含まれて良い。第２サーバ４Ｂのドライバ１００は、この「Ｃｏｍｍａｎｄ  Ｃｏｍｐｌｅｔｉｏｎ」を受領し、「Ｃｒｅａｔｅ  ＩＯ  ＣＱ  Ｃｏｍｍａｎｄ」の処理を完了する。
【０１０８】
第２サーバ４Ｂのドライバ１００は、上記Ｓ２００乃至Ｓ２１４と同様の処理によって、ＩＯ  ＳＱ１３０も生成する（Ｓ２４０）。
【０１０９】
以上の処理により、第２サーバ４Ｂのメモリ１２Ｂに、ＩＯ  ＣＱ１３２及びＩＯ  ＳＱ１３２が生成される。
【０１１０】
図１０は、記憶装置８に対するサーバのＩＯ処理の一例を示すフローチャートである。
【０１１１】
以下、第２サーバ４ＢのＩＯ処理について説明するが、第１サーバ４Ａや他のサーバについても同様であってよい。
【０１１２】
第２サーバ４Ｂのドライバ１００は、メモリ１２Ｂにバッファ１４０を確保する（Ｓ３００）。
【０１１３】
第２サーバ４Ｂのドライバ１００は、その確保したバッファ１４０の実アドレスに、第２サーバ４Ｂと対応付けられているオフセット値（０ｘ８００２）を加算し、バッファ１４０のオフセットアドレスを算出する。そして、第２サーバ４Ｂのドライバ１００は、そのバッファ１４０のオフセットアドレスを含む「ＩＯ  Ｃｏｍｍａｎｄ」を作成する（Ｓ３０２）。この「ＩＯ  Ｃｏｍｍａｎｄ」は、「Ｒｅａｄ  Ｃｏｍｍａｎｄ」又は「Ｗｒｉｔｅ  Ｃｏｍｍａｎｄ」であってよい。
【０１１４】
第２サーバ４Ｂのドライバ１００は、その作成した「ＩＯ  Ｃｏｍｍａｎｄ」を、自分のメモリ１２ＢのＩＯ  ＳＱ１３０Ｂにエンキューする（Ｓ３０４）。
【０１１５】
第２サーバ４Ｂのドライバ１００は、記憶装置８におけるＩＯ  ＳＱ１３０Ｂに係るＤｏｏｒｂｅｌｌレジスタを更新する（Ｓ３０６）。
【０１１６】
記憶装置８は、このＤｏｏｒｂｅｌｌレジスタの更新を検知すると、ＩＯ  ＳＱ１３０Ｂから「ＩＯ  Ｃｏｍｍａｎｄ」をフェッチするためのリードリクエストを発行する（Ｓ３１０）。
【０１１７】
中間装置６は、記憶装置８から発行されたＳ３１０のリードリクエストをトラップする。そして、中間装置６は、ルーティング管理テーブル２００を参照し、そのリードリクエストに含まれるオフセットアドレスのオフセット値（０ｘ８００２）が、第２サーバ４Ｂに対応付けられていることを特定する。そして、中間装置６は、そのオフセットアドレスを実アドレスに変換する。そして、中間装置６は、その変換後のリードリクエストを、その特定した第２サーバ４Ｂに転送する（Ｓ３１２）。
【０１１８】
第２サーバ４Ｂは、その転送されたリードリクエストを受領すると、その実アドレスに格納されているＩＯ  ＳＱ１３０Ｂ内「ＩＯ  Ｃｏｍｍａｎｄ」を、記憶装置８へ返送する（Ｓ３１４）。
【０１１９】
記憶装置８は、その返送された「ＩＯ  Ｃｏｍｍａｎｄ」を実行する（Ｓ３１６）。すなわち、記憶装置８は、「ＩＯ  Ｃｏｍｍａｎｄ」が「Ｒｅａｄ  Ｃｏｍｍａｎｄ」の場合、第２サーバ４Ｂのオフセットアドレスのバッファへリードデータを書き込もうとする。記憶装置８は、「ＩＯ  Ｃｏｍｍａｎｄ」が「Ｗｒｉｔｅ  Ｃｏｍｍａｎｄ」の場合、第２サーバ４Ｂのオフセットアドレスのバッファからライトデータを読み出そうとする。
【０１２０】
中間装置６は、Ｓ３１６の、記憶装置８から第２サーバ４Ｂのバッファ１４０Ｂのオフセットアドレスに対するアクセスをトラップする。そして、中間装置６は、ルーティング管理テーブル２００を参照し、そのアクセスに含まれるオフセットアドレスのオフセット値（０ｘ８００２）が、第２サーバ４Ｂに対応付けられていることを特定する。そして、中間装置６は、そのアクセスに含まれるオフセットアドレスを実アドレスに変換する。そして、中間装置６は、その変換後のアクセスを、その特定した第２サーバ４Ｂに転送する（Ｓ３１８）。これにより、「ＩＯ  Ｃｏｍｍａｎｄ」が「Ｒｅａｄ  Ｃｏｍｍａｎｄ」の場合、第２サーバ４Ｂのバッファ１４０Ｂに、リードデータが格納される。また、「ＩＯ  Ｃｏｍｍａｎｄ」が「Ｗｒｉｔｅ  Ｃｏｍｍａｎｄ」の場合、第２サーバ４Ｂのバッファ１４０Ｂに格納されているライトデータが、記憶装置８に取得される。
【０１２１】
記憶装置８は、「ＩＯ  Ｃｏｍｍａｎｄ」の実行完了後、第２サーバ４ＢのＩＯ  ＣＱ１３２Ｂに対して「Ｃｏｍｍａｎｄ  Ｃｏｍｐｌｅｔｉｏｎ」を発行する（Ｓ３２０）。
【０１２２】
中間装置６は、Ｓ３２０の「Ｃｏｍｍａｎｄ  Ｃｏｍｐｌｅｔｉｏｎ」をトラップする。そして、中間装置６は、ルーティング管理テーブル２００を参照し、その「Ｃｏｍｍａｎｄ  Ｃｏｍｐｌｅｔｉｏｎ」の宛先アドレスであるオフセットアドレスのオフセット値（０ｘ８００２）が、第２サーバ４Ｂに対応付けられていることを特定する。そして、中間装置６は、その「Ｃｏｍｍａｎｄ  Ｃｏｍｐｌｅｔｉｏｎ」の宛先であるオフセットアドレスを実アドレスに変換する。そして、中間装置６は、その変換後の「Ｃｏｍｍａｎｄ  Ｃｏｍｐｌｅｔｉｏｎ」を、その特定した第２サーバに転送する（Ｓ３２２）。
【０１２３】
第２サーバ４Ｂのドライバ１００は、ＩＯ  ＣＱ１３２Ｂから、その「Ｃｏｍｍａｎｄ  Ｃｏｍｐｌｅｔｉｏｎ」をデキューし、Ｓ３０４でエンキューした「ＩＯ  Ｃｏｍｍａｎｄ」の実行を完了する（Ｓ３２４）。
【０１２４】
以上の処理により、第２サーバ４Ｂは、記憶装置８からデータをリードしたり、記憶装置８にデータをライトしたりすることができる。
【０１２５】
上述した実施形態は、本発明の説明のための例示であり、本発明の範囲を実施形態にのみ限定する趣旨ではない。当業者は、本発明の要旨を逸脱することなしに、他の様々な態様で本発明を実施することができる。
【０１２６】
例えば、実アドレスからオフセット値を減算してオフセットアドレスに変換し、オフセットアドレスにオフセット値を加算して実アドレスに戻してもよい。
【符号の説明】
【０１２７】
１：計算機システム  ４：サーバ  ６：中間装置  ８：記憶装置
【図１】
2017203645.tif 000003
【図２】
2017203645.tif 000004
【図３】
2017203645.tif 000005
【図４】
2017203645.tif 000006
【図５】
2017203645.tif 000007
【図６】
2017203645.tif 000008
【図７】
2017203645.tif 000009
【図８】
2017203645.tif 000010
【図９】
2017203645.tif 000011
【図１０】
2017203645.tif 000012
【国際調査報告】
2017203645.tif 000013
2017203645.tif 000014
2017203645.tif 000015
2017203645.tif 000016