(57)【要約】【課題】  効率よく他のストレージにアクセスすることができるストレージシステム及びデータ転送方法を提供すること。【解決手段】  実施形態によれば、ストレージシステムは、複数のストレージと、複数のコントローラと、複数のパケット転送部と、を具備する。コントローラは、第２ストレージからデータをリードする場合、リードデータを含む第１パケットを受信するための領域をメモリに確保し、第１パケットを受信するための第１コマンドをパケット転送部の第１キューに登録し、リードデータの送信を要求するための第２パケットをメモリに格納し、第２パケットを送信するための第２コマンドを第１キューに登録する。パケット転送部は、第１コマンドを受信した場合、受信予定の第１パケットを全て受信すると、完了通知を第２キューに登録し、第２コマンドを受信した場合、前記第２パケットの送信が完了すると、完了通知を第２キューに登録する。【選択図】図１３
2019164713.tif 000002
【特許請求の範囲】
【請求項１】
複数のストレージと、前記複数のストレージに接続される複数のコントローラと、前記複数のコントローラに接続される複数のパケット転送部と、を具備するストレージシステムであって、
前記複数のストレージの中の第１ストレージに接続される第１コントローラは、前記複数のストレージの中の第２ストレージから第１データをリードする場合、前記第１データを含む複数の第１パケットを受信するための領域をメモリに確保し、前記複数の第１パケットを受信するための第１コマンドを前記第１コントローラに接続される第１パケット転送部の第１キューに登録し、前記第１データの送信を要求するための第２パケットを前記メモリに格納し、前記第２パケットを送信するための第２コマンドを前記第１パケット転送部の前記第１キューに登録し、
前記第１パケット転送部は、第１コマンドを受信した場合、前記複数の第１パケットを全て受信すると、前記第１コマンドの完了通知を第２キューに登録し、前記第２コマンドを受信した場合、前記第２パケットの送信が完了すると、前記第２コマンドの完了通知を前記第２キューに登録するストレージシステム。
【請求項２】
前記メモリは前記第１コントローラのメインメモリの物理アドレス領域である請求項１記載のストレージシステム。
【請求項３】
前記第１コントローラは、前記複数のストレージの中の第２ストレージへ第２データをライトする場合、ライト完了通知を含む第３パケットを受信するための領域を前記メモリに確保し、前記第３パケットを受信するための第１コマンドを前記第１キューに登録し、前記第２データを含む複数の第４パケットを前記メモリに格納し、前記複数の第４パケットを送信するための第２コマンドを前記第１キューに登録し、
前記第１パケット転送部は、前記複数の第１パケット又は前記第３パケットを受信するための第１コマンドを受信した場合、前記複数の第１パケットを全て受信する、又は前記第３パケットを受信すると、前記第１コマンドの前記完了通知を前記第２キューに登録し、前記第２パケット又は前記第４パケットを送信するための前記第２コマンドを受信した場合、前記第２パケット又は前記第４パケットの送信が完了すると、前記第２コマンドの完了通知を前記第２キューに登録する請求項１記載のストレージシステム。
【請求項４】
前記第１パケットは空領域のヘッダと、空領域のペイロードからなり、
前記第２パケットはリードコマンド情報、パケット識別情報、ワイルドカードがセットされたパケットＩＤを含むヘッダ領域と、複数の前記第１パケットの総数、各第１パケットのパケットＩＤとデータ長を含むペイロードならなる請求項１記載のストレージシステム。
【請求項５】
前記第３パケットは空領域のヘッダと、空領域のペイロードからなり、
前記第４パケットはライトコマンド情報、パケット識別情報、ワイルドカードがセットされたパケットＩＤを含むヘッダ領域と、前記第２データを含むペイロードならなる請求項３記載のストレージシステム。
【請求項６】
前記第１パケット転送部は、前記第１コマンドを受信した場合、前記複数の第１パケットのパケット番号がセットされるビットマップデータを具備し、前記ビットマップデータは前記複数の第１パケットを受信する毎に対応するパケット番号がクリアされ、前記ビットマップデータが全てクリアされると、前記第１コマンドの完了通知を前記第１コントローラへ送信する請求項１記載のストレージシステム。
【請求項７】
複数のストレージと、前記複数のストレージに接続される複数のコントローラと、前記複数のコントローラに接続される複数のパケット転送部と、を具備するストレージシステムであって、
前記複数のストレージの中の第１ストレージに接続される第１コントローラは、前記複数のストレージの中の第２ストレージから第１データをリードする場合、前記第１データのリードを要求するための第１パケットをメモリに格納し、前記第１パケットを、前記第１コントローラに接続される第１パケット転送部の第１スロットを介して送信するための第１コマンドを前記第１パケット転送部のキューに登録し、
前記第１パケット転送部は、前記第１データを含む第２パケットを前記第１スロットを介して受信し、リード完了を前記第１コントローラへ送信するストレージシステム。
【請求項８】
前記メモリは前記第１コントローラのメインメモリの物理アドレス領域である請求項７記載のストレージシステム。
【請求項９】
複数のストレージと、前記複数のストレージに接続される複数のコントローラと、前記複数のコントローラに接続される複数のパケット転送部と、を具備するストレージシステムであって、
前記複数のストレージの中の第１ストレージに接続される第１コントローラは、前記複数のストレージの中の第２ストレージへ第１データをライトする場合、前記第１データのライトを予約するための第１パケットをメモリに格納し、前記第１パケットを前記第１コントローラに接続される第１パケット転送部の第１スロットを介して送信するための第１コマンドを前記第１パケット転送部のキューに登録し、
前記第１コントローラは、前記第１パケット転送部がライト予約完了を通知するための第２パケットを前記第１スロットを介して受信すると、前記第１データを含む第３パケットを前記メモリに格納し、前記第３パケットを前記第１コントローラに接続される第１パケット転送部の第２スロットを介して送信するための第３コマンドを前記第１パケット転送部のキューに登録し、
前記第１パケット転送部はライト完了を通知するための第４パケットを前記第２スロットを介して受信すると、前記ライト完了を前記第１コントローラへ送信するストレージシステム。
【請求項１０】
前記メモリは前記第１コントローラのメインメモリの物理アドレス領域である請求項９記載のストレージシステム。
【請求項１１】
複数のストレージと、前記複数のストレージに接続される複数のコントローラと、前記複数のコントローラに接続される複数のパケット転送部と、を具備するストレージシステムであって、
前記複数のストレージの中の第１ストレージに接続される第１コントローラは、前記複数のストレージの中の第２ストレージへ第１データをライトする場合、前記第１データのライトを予約するための第１パケットをメモリに格納し、前記第１パケットを前記第１コントローラに接続される第１パケット転送部の第１スロットを介して送信するための第１コマンドを前記第１パケット転送部のキューに登録し、
前記第１コントローラは、前記第１パケット転送部がライトデータ要求を含む第２パケットを第２スロットを介して受信すると、前記第１データを含む第３パケットを前記メモリに格納し、前記第３パケットを送信するための第３コマンドを前記キューに登録し、
前記第１パケット転送部はライト完了を通知するための第４パケットを前記第１スロットを介して受信すると、前記ライト完了を前記第１コントローラへ送信するストレージシステム。
【請求項１２】
前記メモリは前記第１コントローラのメインメモリの物理アドレス領域である請求項１１記載のストレージシステム。
【請求項１３】
複数のストレージと、前記複数のストレージに接続される複数のコントローラと、前記複数のコントローラに接続される複数のパケット転送部と、を具備するストレージシステムにおけるデータ転送方法であって、
前記複数のストレージの中の第１ストレージに接続される第１コントローラは、前記複数のストレージの中の第２ストレージから第１データをリードする場合、前記第１データを含む複数の第１パケットを受信するための領域をメモリに確保し、前記複数の第１パケットを受信するための第１コマンドを前記第１コントローラに接続される第１パケット転送部の第１キューに登録し、前記第１データの送信を要求するための第２パケットを前記メモリに格納し、前記第２パケットを送信するための第２コマンドを前記第１パケット転送部の前記第１キューに登録し、
前記第１パケット転送部は、第１コマンドを受信した場合、前記複数の第１パケットを全て受信すると、前記第１コマンドの完了通知を第２キューに登録し、前記第２コマンドを受信した場合、前記第２パケットの送信が完了すると、前記第２コマンドの完了通知を前記第２キューに登録するデータ転送方法。
【請求項１４】
前記第１コントローラは、前記複数のストレージの中の第２ストレージへ第２データをライトする場合、ライト完了通知を含む第３パケットを受信するための領域を前記メモリに確保し、前記第３パケットを受信するための第１コマンドを前記第１キューに登録し、前記第２データを含む複数の第４パケットを前記メモリに格納し、前記複数の第４パケットを送信するための第２コマンドを前記第１キューに登録し、
前記第１パケット転送部は、前記複数の第１パケット又は前記第３パケットを受信するための第１コマンドを受信した場合、前記複数の第１パケットを全て受信する、又は前記第３パケットを受信すると、前記第１コマンドの前記完了通知を前記第２キューに登録し、前記第２パケット又は前記第４パケットを送信するための前記第２コマンドを受信した場合、前記第２パケット又は前記第４パケットの送信が完了すると、前記第２コマンドの完了通知を前記第２キューに登録する請求項１３記載のデータ転送方法。
【請求項１５】
複数のストレージと、前記複数のストレージに接続される複数のコントローラと、前記複数のコントローラに接続される複数のパケット転送部と、を具備するストレージシステムにおけるデータ転送方法であって、
前記複数のストレージの中の第１ストレージに接続される第１コントローラは、前記複数のストレージの中の第２ストレージから第１データをリードする場合、前記第１データのリードを要求するための第１パケットをメモリに格納し、前記第１パケットを、前記第１コントローラに接続される第１パケット転送部の第１スロットを介して送信するための第１コマンドを前記第１パケット転送部のキューに登録し、
前記第１パケット転送部は、前記第１データを含む第２パケットを前記第１スロットを介して受信し、リード完了を前記第１コントローラへ送信するデータ転送方法。
【請求項１６】
複数のストレージと、前記複数のストレージに接続される複数のコントローラと、前記複数のコントローラに接続される複数のパケット転送部と、を具備するストレージシステムにおけるデータ転送方法であって、
前記複数のストレージの中の第１ストレージに接続される第１コントローラは、前記複数のストレージの中の第２ストレージへ第１データをライトする場合、前記第１データのライトを予約するための第１パケットをメモリに格納し、前記第１パケットを前記第１コントローラに接続される第１パケット転送部の第１スロットを介して送信するための第１コマンドを前記第１パケット転送部のキューに登録し、
前記第１コントローラは、前記第１パケット転送部がライト予約完了を通知するための第２パケットを前記第１スロットを介して受信すると、前記第１データを含む第３パケットを前記メモリに格納し、前記第３パケットを前記第１コントローラに接続される第１パケット転送部の第２スロットを介して送信するための第３コマンドを前記第１パケット転送部のキューに登録し、
前記第１パケット転送部はライト完了を通知するための第４パケットを前記第２スロットを介して受信すると、前記ライト完了を前記第１コントローラへ送信するデータ転送方法。
【請求項１７】
複数のストレージと、前記複数のストレージに接続される複数のコントローラと、前記複数のコントローラに接続される複数のパケット転送部と、を具備するストレージシステムにおけるデータ転送方法であって、
前記複数のストレージの中の第１ストレージに接続される第１コントローラは、前記複数のストレージの中の第２ストレージへ第１データをライトする場合、前記第１データのライトを予約するための第１パケットをメモリに格納し、前記第１パケットを前記第１コントローラに接続される第１パケット転送部の第１スロットを介して送信するための第１コマンドを前記第１パケット転送部のキューに登録し、
前記第１コントローラは、前記第１パケット転送部がライトデータ要求を含む第２パケットを第２スロットを介して受信すると、前記第１データを含む第３パケットを前記メモリに格納し、前記第３パケットを送信するための第３コマンドを前記キューに登録し、
前記第１パケット転送部はライト完了を通知するための第４パケットを前記第１スロットを介して受信すると、前記ライト完了を前記第１コントローラへ送信するデータ転送方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は概してストレージシステム及びデータ転送方法に関する。
【背景技術】
【０００２】
フラッシュメモリ等の不揮発性半導体メモリを含む複数のストレージを含むストレージシステムが開発されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】米国特許出願公開第2013/151793号明細書
【特許文献２】特表2013-518327号公報
【特許文献３】特表2002-531891号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
従来のストレージシステムでは、複数のストレージがネットワークを構成している。第１のストレージが第２のストレージにデータをライトする際及び／又は第１のストレージが第２のストレージからデータをリードする際の効率には改善の余地があった。
【０００５】
本発明の目的は効率よく他のストレージにアクセスすることができるストレージシステム及びデータ転送方法を提供することである。
【課題を解決するための手段】
【０００６】
実施形態によれば、ストレージシステムは、複数のストレージと、前記複数のストレージに接続される複数のコントローラと、前記複数のコントローラに接続される複数のパケット転送部と、を具備する。
【０００７】
前記複数のストレージの中の第１ストレージに接続される第１コントローラは、前記複数のストレージの中の第２ストレージへ第１データをライトする場合、ライト完了通知を含む第１パケットを受信するための領域をメモリに確保し、前記第１パケットを受信するための第１コマンドを前記第１コントローラに接続される第１パケット転送部の第１キューに登録し、前記第１データを含む第２パケットを前記メモリに格納し、前記第２パケットを送信するための第２コマンドを前記第１パケット転送部の前記第１キューに登録する。
【０００８】
前記第１コントローラは、前記第２ストレージから第２データをリードする場合、前記第２データを含む第３パケットを受信するための領域を前記メモリに確保し、前記第３パケットを受信するための第１コマンドを前記第１パケット転送部の前記第１キューに登録し、前記第２データの送信を要求するための第４パケットを前記メモリに格納し、前記第４パケットを送信するための第２コマンドを前記第１パケット転送部の前記第１キューに登録する。
【０００９】
前記第１パケット転送部は、前記第１パケット又は前記第３パケットを受信するための第１コマンドを受信した場合、受信予定の前記第１パケット又は前記第３パケットを全て受信すると、前記第１コマンドの完了通知を第２キューに登録し、前記第２パケット又は前記第４パケットを送信するための前記第２コマンドを受信した場合、前記第２パケット又は前記第４パケットの送信が完了すると、前記第２コマンドの完了通知を前記第２キューに登録する。
【図面の簡単な説明】
【００１０】
【図１】実施形態に係るストレージシステム全体の構成の一例を示すブロック図である。
【図２】ストレージシステムのノード１２とマトリクスコントローラ１４の一例を示すブロック図である。
【図３】パケットＩＤの一例を示す図である。
【図４】パケット管理データの一例を示す図である。
【図５】第１のノードが第２のノードのストレージへデータをライトする第１のライト処理におけるパケット転送の一例を示す図である。
【図６】第１のライト処理の一例の前半を示すフローチャートである。
【図７】第１のライト処理の一例の後半を示すフローチャートである。
【図８】完了通知受信用パケットＰ１０と完了通知受信用ＲＭコマンドＲ１０の一例を示す図である。
【図９】ライトコマンド送信パケットＰ１１、Ｐ１２とライトコマンド送信パケットＳＭコマンドＳ１１、Ｓ１２の一例を示す図である。
【図１０】受信用パケットＰ２１、Ｐ２２と受信用パケットＲＭコマンドＲ２１、Ｒ２２の一例を示す図である。
【図１１】完了通知送信パケットＰ２０と完了通知送信パケットＳＭコマンドＳ２０の一例を示す図である。
【図１２】ＳＭコマンドとＲＭコマンドのオペコードの一例を示す図である。
【図１３】第１のノードが第２のノードのストレージからデータをリードする第１のリード処理におけるパケット転送の一例を示す図である。
【図１４】第１のリード処理の一例の前半を示すフローチャートである。
【図１５】第１のリード処理の一例の後半を示すフローチャートである。
【図１６】リードデータ受信用パケットＰ３１、Ｐ３２とリードデータ受信用パケットＲＭコマンドＲ３１、Ｒ３２の一例を示す図である。
【図１７】リードコマンド送信パケットＰ３０とリードコマンド送信パケットＳＭコマンドＳ３０の一例を示す図である。
【図１８】受信用パケットＰ４０と受信用パケットＲＭコマンドＲ４０の一例を示す図である。
【図１９】リードデータ送信パケットＰ４１、Ｐ４２とリードデータ送信パケットＳＭコマンドＳ４１、Ｓ４２の一例を示す図である。
【図２０】第２のリード／ライト処理におけるスロット確保コマンド（Ｗｉｌｄｃａｒｄ）の一例を示す図である。
【図２１】第２のリード／ライト処理におけるキューの一例を示す図である。
【図２２】第１のノードが第２のノードのストレージからデータをリードする第２のリード処理におけるパケット転送の一例を示す図である。
【図２３】第２のリード処理におけるリードコマンド送信パケットの一例を示す図である。
【図２４】第２のリード処理におけるリードコマンド送信パケットを送信するためのスロット確保送信コマンド（ＲＳｅｎｄ）の一例を示す図である。
【図２５】第２のリード処理におけるリードデータ送信パケットの一例を示す図である。
【図２６】第２のリード処理におけるリードデータ送信パケットを送信するためのスロット確保無し送信コマンド（Ｓｅｎｄ）の一例を示す図である。
【図２７】第１のノードが第２のノードのストレージへデータをライトする第２のライト処理におけるパケット転送の一例を示す図である。
【図２８】第１のノードが第２のノードのストレージへデータをライトする第３のライト処理におけるパケット転送の一例を示す図である。
【発明を実施するための形態】
【００１１】
以下、実施の形態について図面を参照して説明する。なお、開示はあくまで一例にすぎず、以下の実施形態に記載した内容により発明が限定されるものではない。当業者が容易に想到し得る変形は、当然に開示の範囲に含まれる。説明をより明確にするため、図面において、各部分のサイズ、形状等を実際の実施態様に対して変更して模式的に表す場合もある。複数の図面において、対応する要素には同じ参照数字を付して、詳細な説明を省略する場合もある。
【００１２】
［ストレージシステムの全体構成］  
図１は実施形態に係るストレージシステム全体の構成の一例を示すブロック図である。多数のストレージ１０−１、１０−２、…（ストレージ１０と総称することもある）が複数のノード１２−１、１２−２、…（ノード１２と総称することもある）にそれぞれ接続される。ストレージ１０はフラッシュメモリ等の不揮発性半導体メモリを含むものであり、例えばＳＳＤ（Solid State Drive）である。ノード１２は、プログラムを格納するＲＯＭ４、プログラムを実行するＣＰＵ２、プログラム実行中のデータを一時的に保持するＤＲＡＭ等のメインメモリ６を備え、ストレージ１０に対するリード／ライト処理を実行する。
【００１３】
複数のマトリクスコントローラ（以下、ＭＣと称する）１４−１、１４−２、１４−３、…（ＭＣ１４と総称することもある）がネットワークを構成する。ネットワークの一例は、１つのＭＣ１４が複数のＭＣ１４に接続されるメッシュネットワークがある。各ＭＣ１４は、例えばＬＶＤＳ（Low Voltage Differential Signaling）規格の信号線を介して複数のＭＣに接続される。各ノード１２はいずれかのＭＣ１４に接続される。ＭＣ１４はノード１２からのパケットを、接続されている複数のＭＣ１４の中のいずれかのＭＣ１４に転送するルーティング機能を有する。すなわち、ノード１２−１から送信されたパケットが複数のＭＣ１４を介してノード１２−２に転送される。これにより、各ノード１２は複数のストレージ１０を共有することができる。
【００１４】
ノード１２とストレージ１０とを相互接続するためのインタフェースとしては、ＳＣＳＩ（Small Computer System Interface）、ＳＡＳ（Serial Attached SCSI）、ＡＴＡ（Advanced Technology Attachment）、ＳＡＴＡ（Serial ATA）、ＰＣＩ  Ｅｘｐｒｅｓｓ（ＰＣＩｅとも称する）（登録商標）、ＮＶＭ  Ｅｘｐｒｅｓｓ（ＮＶＭｅとも称する）（登録商標）、Ｅｔｈｅｒｎｅｔ（登録商標）、Ｆｉｂｒｅ  ｃｈａｎｎｅｌ等を使用し得る。実施形態では、ノード１２とストレージ１０の間、ノード１２とＭＣ１４の間、隣接するＭＣ１４の間でＮＶＭｅインタフェースに従ってパケットが通信される。
【００１５】
図２はノード１２とＭＣ１４の機能ブロックの一例を示す図である。ノード１２は、図２（ａ）に示すように、ストレージＩ／Ｆ３２、ストレージ（自ノード）アクセスモジュール３４、アクセス要求パケット管理モジュール２６、送受信コマンド発行管理モジュール２８を備えるドライバ２４からなる。アクセス要求パケット管理モジュール２６は、パケット分割モジュール４２、パケット統合モジュール４４、パケットＩＤ付与モジュール４６、パケットＩＤ照合モジュール４８、ＳＧＬ（Scatter Gather List）分割モジュール５０、ＳＧＬ統合モジュール５２からなる。ノード１２のドライバ２４が備える各モジュールはＣＰＵ２が実行するソフトウェアで実現される。
【００１６】
ストレージＩ／Ｆ３２は、ファイルシステム等の上位レイヤがストレージ１０にアクセスするために必要なインタフェース（例えば、ＯＳ上のデバイスファイル）を提供する。ストレージＩ／Ｆ３２は、自ノードのストレージ１０及び他ノードのストレージ１０を同一アドレス空間又はそれぞれ独立したアドレス空間で提供することができる。ストレージＩ／Ｆ３２は、必要な場合、提供しているアドレス空間から自ノードのストレージ１０や他ノードのストレージ１０上のアドレス空間へのアドレス変換を行うことができる。
【００１７】
ストレージ（自ノード）アクセスモジュール３４は、ストレージＩ／Ｆ３２により自ノードのストレージ１０にマッピングされているアドレス空間内の領域に対するアクセス要求を受信した場合、自ノードのストレージ１０に対してアクセスする。
【００１８】
アクセス要求パケット管理モジュール２６は、ストレージＩ／Ｆ３２により他ノードのストレージ１０にマッピングされているアドレス空間内の領域に対するアクセス要求を受信した場合、そのアクセス要求をパケットに変換し、他ノードにそのパケットを転送し、他ノードからの応答パケットをアクセス要求の応答に変換する。さらに、アクセス要求パケット管理モジュール２６は、他ノードから転送された要求パケットを自ノードのストレージアクセス要求に変換して、ストレージ（自ノード）アクセスモジュール３４を使用して当該ストレージアクセス要求を実行し、その応答パケットを他ノードに返送する。
【００１９】
パケット分割モジュール４２は、他ノードのストレージ１０に対するアクセス要求に関するデータ転送量が単一のパケットに収まらない場合、当該アクセス要求を複数のパケットに分割して転送する。パケット統合モジュール４４は、複数のパケットに分割されて転送されたアクセス要求を転送先で元の１つのアクセス要求に復元する。
【００２０】
パケット分割、パケット統合のために、パケットＩＤ付与モジュール４６とパケットＩＤ照合モジュール４８が設けられる。パケットＩＤは、要求とパケットを対応付けし、パケットが不正なパケットではないことを識別するためのものであり、パケットにユニークな番号である。
【００２１】
パケットＩＤ付与モジュール４６は、受信用パケットを用意する際に、各パケットにパケットＩＤを割り当てる。パケットＩＤ照合モジュール４８は、パケットを受信すると、受信したパケットが正しい受信用パケットであるか否かをパケットＩＤに基づいて判断する。
【００２２】
図３はパケットＩＤ（ＰｋｔＩＤとも称する）の一例を示す。パケットＩＤは、例えば６４ビットからなり、上位５６ビットがＴＡＧであり、下位８ビットがパケット番号である。ＴＡＧはパケットＩＤのセットを示す。パケット番号はＴＡＧで識別される１セットのパケットＩＤ（ＴＡＧ）の中の何番目のパケットＩＤであるかを示す。
【００２３】
ＳＧＬ分割モジュール５０は、１つのパケットを複数のパケットに分割する際に、ＳＧＬをパケット毎の複数のＳＧＬに分割する。ＳＧＬとは、メインメモリ（物理アドレス領域）内に不連続に配置されたデータ（パケットヘッダを含む）領域のポインタ及びサイズを送受信する順番に並べたリストである。ＳＧＬ統合モジュール５２は、複数のパケットを統合して１つのアクセス要求に復元する際に、複数のＳＧＬを１つのＳＧＬに統合する。
【００２４】
送受信コマンド発行管理モジュール２８は、パケットＩＤがワイルドカードに設定された受信用パケットを受信するコマンドをサブミッションキュー（submission Queue：ＳＱ）に登録したり、送信コマンドが完了したことをコンプリーションキュー（completion Queue：ＣＱ）をポーリングして確認したり、割り込みを受信して受信完了したコマンドを処理する。ＮＶＭｅ規格では、メッセージ（コマンドとコマンド完了通知）を通知するために、固定のエントリサイズを有するサーキュラーキューが使用される。キューは、ＳＱとＣＱを含む。キューは何処にあっても良いが、ここでは、ＭＣ１４内にノード間のパケット転送のために使われるＳＱとＣＱが設けられているとする。ＳＱはノード１２からＭＣ１４に対するコマンドを発行するために使われる。ＣＱはそのコマンドが完了したことをＭＣ１４からノード１２に通知するために使われる。コマンドの例として、パケットを送信するもの（後述するＳＭコマンド）や、パケットを受信するもの（ＲＭコマンド）がある。
【００２５】
ＭＣ１４は、図２（ｂ）に示すように、コマンドキューイングモジュール６２、パケット送受信モジュール６４、パケット管理モジュール６６、受信コマンド待機モジュール６８を備え、パケット管理データ７０を格納する。ＭＣ１４の各モジュールはハードウェアで実現される。
【００２６】
コマンドキューイングモジュール６２は、ノード１２から発行された送受信コマンドのためのジョブをＳＱに登録し、完了した送受信コマンドのためのジョブをＣＱに登録する。
【００２７】
パケット送受信モジュール６４は、送信コマンドにより発行されたパケットを隣接するＭＣ１４に転送し、隣接したＭＣ１４から転送されたパケットが自ＭＣ宛のパケットか他ＭＣ宛のパケットかを判別し、他ＭＣ宛のパケットを他ＭＣ１４へ転送し、パケット管理モジュール６６を用いて自ＭＣ宛のパケットを判別し、ノード１２上のメモリ空間内の受信コマンドに定義されている領域に自ＭＣ宛のパケットを受信する。
【００２８】
受信コマンド待機モジュール６８は、ノード１２がセットした受信コマンドを適切なパケットが到着するまで保持する。保持したコマンドはノード１２のＣＰＵ２が実行するアプリケーションプログラム等の指示によりキャンセルされ得る。
【００２９】
パケット管理モジュール６６は、図４に示すパケット管理データ７０を利用して、受信パケットの状況を管理する。受信パケットの状況の管理は、パケット管理データ７０のパケット番号ビットマップへのパケット番号の登録、パケット番号ビットマップからのパケット番号の削除等を含む。パケット管理モジュール６６は、他のモジュールと連携して適切なタイミングでノード１２へ割り込みを発行する。
【００３０】
パケット管理データ７０は、パケット管理構造で保持される受信パケットの状況を示す管理用データである。図４はパケット管理データ７０の一例を示す。パケット管理データ７０は登録されているＴＡＧ毎のパケット番号のビットマップ（２５６ビット）を示す。パケット管理モジュール６６は、自ノードからＲＭコマンド（後述）を受信すると、コマンドに含まれるパケットＩＤに含まれるＴＡＧがパケット管理データ７０に登録済みであるか否かをチェックする。未登録であれば、パケット管理モジュール６６は、パケット管理データ７０にＴＡＧを登録し、パケット番号ビットマップのパケット番号に対応するビットを“１”とする。ただし、パケットＩＤがワイルドカードの場合、パケット管理モジュール６６は、ＴＡＧを登録しない。
【００３１】
パケット管理モジュール６６は、他ノードからＲＭコマンドを示すパケットを受信すると、対応するＲＭコマンドで指定されたメモリ領域にデータを転送する。転送が終わると、パケット管理モジュール６６は、ＣＱに完了通知を入れるとともに、パケット管理データ７０のパケット番号ビットマップのパケット番号に対応するビットを“０”とする。パケット管理モジュール６６は、パケット番号ビットマップの全ビットが“０”になったら、ＴＡＧをリストから削除し、割り込みを発生させる。パケット管理モジュール６６は、登録されているＴＡＧが無ければ、即時割り込みを発生させる。これにより、コマンドキューイングモジュール６２は、１つの受信コマンドが完了しても割り込みを生じさせずに、１つの送信コマンドに関係する全ての受信コマンドが完了した時に割り込みを生じさせ、ノード１２のＣＰＵ２が実行するアプリケーションプログラムに送受信コマンドの完了を通知する。このため、パケットの受信毎に割り込みが発生せず、ＲＭコマンドに関する全パケットが受信したら割り込みが発生する。これにより、割り込みの発生頻度が低下し、転送効率が改善する。
【００３２】
［第１のリード／ライト処理］  
実施形態のストレージデバイスは、第1のノードが第２のノードに接続されているストレージに対してデータをリード／ライトする効率を向上できる。このリード／ライト効率は、ノード１２のＣＰＵ２によるデータのコピー回数と、ＭＣ１４からノード１２のＣＰＵ２に対する割り込みの回数に応じている。
【００３３】
ノード１２のＣＰＵ２はパケットの作成に際して、データを所定の位置に配置し、所定の順番に並べたり、パケットに転送先のノードのアドレス等のルーティングアドレスや誤り訂正のためのＣＲＣ（Cyclic Redundancy Code）を付けたりするが、この際、データをメインメモリ６（物理アドレス領域）内で一旦他の場所にコピーする必要がある。このコピー処理の負荷がデータのリード／ライト効率を低下させる。
【００３４】
しかし、実施形態のノード１２はパケットを作成する際、ＳＧＬを利用してメインメモリ６（物理アドレス領域）内のヘッダ、データを関連づけてパケットを作成している。そのため、メインメモリ６（物理アドレス領域）内でデータのコピーが不要であり、リード／ライト効率が改善する。
【００３５】
また、ＭＣ１４は他のＭＣへ送信したコマンドにおいて要求したデータを含むパケットを受信する。データのサイズが大きいと、１つのコマンドに対して複数のパケットを受信する。ＭＣ１４はパケットの受信を完了すると、その都度ノード１２に完了通知を送信することがある。ノード１２が完了通知を受信すると、ＣＰＵ２は割り込み処理を開始するので、リード／ライト効率が低下する。しかし、実施形態では、１つのコマンドに関する全てのデータを受信するまでは、パケットを受信してもＭＣ１４はノード１２に完了通知を送信しない。ＭＣ１４は１つのコマンドに関する全てのデータを受信すると、ノード１２に完了通知を送信する。
【００３６】
これを実現するために、実施形態では、各ノードは予めパケット受信用パケットを準備しておく。パケット受信用パケットとはパケットを受信するためのメインメモリ６（物理アドレス領域）の一部の領域に相当する。予め準備しておくパケット受信用パケットのパケットＩＤはワイルドカードとされる。パケットがノードに転送されると、ノードは、転送されたパケットのパケットＩＤを確認して、そのパケットＩＤと一致する受信用パケットにてパケットを受信し、データをパケット受信用パケットに対応するメインメモリ６（物理アドレス領域）内の領域に格納する。もし、受信したパケットのパケットＩＤと一致する受信用パケットがなくても、ワイルドカードであるパケットＩＤのパケット受信用パケットがあれば、そのパケットにてパケットが受信される。そのため、パケット受信用パケットはどのようなパケットでも受信可能である。準備しておくパケット受信用パケットの数は、メインメモリ６（物理アドレス領域）に余裕がある限りできるだけ多数でよい。
【００３７】
そして、第１のノードは第２のノードへデータを要求する際、そのデータを受信する複数のパケット受信用パケットのパケットＩＤと、そのパケットが受信するデータ長のリストを転送する。リストの転送時に、第１のノードに接続されるＭＣ１４は、図４に示すパケット管理データ７０に受信用パケットのパケットＩＤを登録する（ＴＡＧ毎のパケット番号ビットマップのパケット番号に対応するビットを“１”とする）。第２のノードはこのリストに従いデータを複数のパケットとして第１のノードへ転送する。第１のノードに接続されるＭＣ１４は、パケットを受信すると、ＴＡＧ毎のパケット番号ビットマップにおける受信したパケット番号に対応するビットを“０”とする。ＴＡＧ毎のパケット番号ビットマップが全て“０”になると、ＭＣ１４はパケット管理データ７０からＴＡＧを削除し、ノード１２に完了通知を送信する。これにより、ノード１２のＣＰＵ２が割り込み処理を開始する頻度が低下し、リード／ライト効率の低下が防止される。
【００３８】
［第１のライト処理］  
第１のノード１２−１が第２のノード（ここでは、ノード１２−２）のストレージ１０−２へデータをライトする第１のライト処理の一例を説明する。図５は第１のライト処理におけるパケットの転送の一例を示し、図６、図７はライト処理の一例を示すフローチャートである。図６（ａ）、図７（ａ）は第１のノード１２−１側の処理、図６（ｂ）、図７（ｂ）は第２のノード１２−２側の処理を示す。
【００３９】
先ず、図６（ａ）を参照して第１のノード１２−１側の処理を説明する。
【００４０】
ステップＳ１１２において、ドライバ２４−１は、ＣＰＵ２が実行するアプリケーションプログラムからライト要求を受信する。ライト要求は、仮想アドレス領域のメインメモリ６（以下、仮想メモリと称する）Ｍ１１内のデータを第２のノード１２−２のストレージ１０−２へライトする要求である。
【００４１】
ステップＳ１１４において、ドライバ２４−１は、仮想メモリＭ１１内のライトデータを物理アドレス領域のメインメモリ６（以下、物理メモリと称する）内のデータ領域に変換（アドレス変換）し、パケットのヘッダ（ＰｋｔＩＤはワイルドカードである）を作成し、パケットヘッダを物理メモリＭ２１内に格納する。ＰｋｔＩＤがワイルドカードであるパケットは、パケット受信用パケットで受信可能である。図５では、物理メモリＭ２１が断片化されている場合を想定したので、ライトデータを物理メモリＭ２１内の複数のデータ領域に変換したが、断片化されていない場合は、１つのデータ領域に変換される。
【００４２】
ドライバ２４−１は、ＳＧＬを利用して、物理メモリＭ２１内のヘッダとデータを統合してライトコマンドを送信するためのパケットを作成する。ライトされるデータのサイズに応じて、１つのライト要求に対して複数のパケットが作成されることがある。ここでは、２つのパケットＰ１１、Ｐ１２が作成される例を示す。
【００４３】
ステップＳ１１６において、ドライバ２４−１は、ノード１２−２からのライト要求に対する完了通知パケット（ＰｋｔＩＤ＝特定のＩＤ）を受信するためのＮＶＭｅコマンド、ここではReceive Message（ＲＭ）コマンド（ＲＭＣｍｄ）Ｒ１０をＭＣ１４−１１のＳＱに登録する。
【００４４】
図８は、完了通知受信用パケットＰ１０と完了通知受信用パケットを受信するためのＲＭコマンドＲ１０の一例を示す。図８（ａ）に示すように、完了通知受信用パケットＰ１０は空のヘッダ領域のみからなり、ペイロードは含まない。図８（ｂ）に示すように、完了通知受信用パケットＲＭコマンドＲ１０は、例えば６４バイトからなり、００−０３バイトのCommand Dword 0 (CDW0)はReceive Messageであり、４０−４７バイトのCommand Dword 10 (CDW10)、Command Dword 11 (CDW11)には完了通知パケットのパケットＩＤがセットされる。完了通知受信用ＲＭコマンドＲ１０の１６−３１バイトのＭＴＰＲとＤＰＴＲはパケットのＳＧＬポインタであり、実際のＳＧＬは別領域である。完了通知パケットはヘッダ領域のみの１エントリなので、ＳＧＬポインタはSGL Descriptor0となる。これにより、物理メモリＭ２１内で完了通知パケットＰ１０を受信するための領域が確保される。
【００４５】
ステップＳ１１７において、ＭＣ１４−１１はＳＱに登録されたＲＭコマンドＲ１０に含まれる完了通知パケットＩＤに含まれるＴＡＧがパケット管理データ７０に登録済みであるか否かをチェックする。未登録であれば、ＭＣ１４−１１はパケット管理モジュール６６を用いてパケット管理データ７０にＴＡＧを登録し、パケット番号ビットマップのパケット番号に対応するビットを“１”とする。
【００４６】
ステップＳ１１８において、ドライバ２４−１は、ライトコマンド送信パケットＰ１１、Ｐ１２を送信するためのＮＶＭｅコマンド、ここではSend Message（ＳＭ）コマンド（ＳＭＣｍｄ）Ｓ１１、Ｓ１２をＭＣ１４−１１のＳＱに登録する。
【００４７】
図９は、ライトコマンド送信パケットＰ１１、Ｐ１２とライトコマンド送信パケットを送信するＳＭコマンドＳ１１、Ｓ１２の一例を示す。図９（ａ）に示すように、ライトコマンド送信パケットＰ１１、Ｐ１２はヘッダ領域とペイロードからなる。ヘッダ領域は、コマンドがライトコマンドであることを示すライトコマンド情報、パケット識別情報、パケットＩＤ（＝ワイルドカード）、完了通知パケットのパケットＩＤからなり、ペイロードはライトデータからなる。ライトコマンド情報はデータがライトされるストレージ１０−２の領域の論理アドレス及びデータを書き込む領域のサイズ（例えば、セクタ数）を含む。パケット識別情報はコマンドを識別する情報とそのコマンドに関する何番目のパケットであるかを示す情報を含む。コマンドを識別する情報は、あるコマンドが複数のパケットに分割された場合、そのコマンドに属するパケットであることを示す情報（前述したＴＡＧはこの情報の例である）である。例えば、ライトコマンドＡが複数のパケットに分割された場合、各パケットのパケットＩＤはワイルドカードであるが、パケット識別情報は、ライトコマンドＡであることを示す識別子と、ライトコマンドＡについての何番目のパケットであるかを示す番号情報を含む。なお、図示しないが、全てのパケットのヘッダ領域はルーティングアドレスも含む。ルーティングアドレスは第２のノードのアドレス等を含み、ＭＣ１４が受信したパケットをネットワーク内のどのＭＣ１４に転送するかを決める際に使用される。ペイロードは、例えば４ＫｉＢである。ワイルドカードパケットＩＤは、例えば0xFFFF FFFF FFFF FFFFである。
【００４８】
図９（ｂ）に示すように、ライトコマンド送信パケットＰ１１、Ｐ１２を送信するＳＭコマンドＳ１１、Ｓ１２は６４バイトからなり、００−０３バイトのCommand Dword 0 (CDW0)はSend Messageである。ライトコマンド送信パケットＰ１１、Ｐ１２はヘッダ領域とペイロードからなり、少なくとも２エントリになるため、１６−３１バイトのＳＧＬポインタはSGL Segment Descriptorとなる。
【００４９】
ステップＳ１２０において、ＭＣ１４−１１はＳＱ内のコマンドを実行し、コマンドで規定されるパケットをＬＶＤＳ線を介して隣接するＭＣ１４へ転送する。ここでは、図９（ａ）に示すライトコマンド送信パケットＰ１１、Ｐ１２が第２のノード１２−２へ転送されたとする。ＭＣ１４−１１はＬＶＤＳ線へのパケットＰ１１、Ｐ１２の送信が完了したタイミングで割り込みを発生させ、ノード１２−１にそれを通知する。
【００５０】
ここで、第２のノード１２−２の動作を説明する。上述したように、全ノード１２は、システムがオンすると、パケット受信用パケットを準備し、パケット受信用のＮＶＭｅコマンドを作成し、ＳＱに登録しておく。そのため、第２のノード１２−２も、システムがオンすると、図６（ｂ）のステップＳ２１２に示すように、物理メモリＭ２２内にデータとヘッダからなり、パケットＩＤがワイルドカードからなる多数のパケット受信用パケット（ここでは２つのみ示す）Ｐ２１、Ｐ２２を作成し、受信用パケットＰ２１、Ｐ２２を受信するためのＮＶＭｅコマンド、ここではＲＭコマンド（ＲＭＣｍｄ）Ｒ２１、Ｒ２２をＭＣ１４−１３のＳＱに登録する。なお、第１のノード１２−１もパケット受信用パケットのＲＭコマンドをＭＣ１４−１１のＳＱに登録するが、ライト処理では使用されないので、図６（ａ）、図７（ａ）では説明を省略する。
【００５１】
図１０は、パケット受信用パケットＰ２１、Ｐ２２とパケット受信用パケットを受信するためのＲＭコマンドＲ２１、Ｒ２２の一例を示す。図１０（ａ）に示すように、パケット受信用パケットＰ２１、Ｐ２２はヘッダ領域とペイロードからなる。ヘッダ領域は空である。ペイロードはペイロードヘッダとペイロードデータからなるが、両方とも空である。ペイロードは、例えば４ＫｉＢである。
【００５２】
図１０（ｂ）に示すように、パケット受信用パケットＲＭコマンドＲ２１、Ｒ２２は６４バイトからなり、００−０３バイトのCommand Dword 0 (CDW0)はReceive Messageであり、４０−４７バイトのCommand Dword 10 (CDW10)、Command Dword 11 (CDW11)のパケットＩＤにはワイルドカードパケットＩＤ（0xFFFF FFFF FFFF FFFF）がセットされる。受信用パケットはヘッダ領域とペイロードがあり、少なくとも２エントリになるため、１６−３１バイトのＳＧＬポインタはSGL Segment Descriptor となる。ただし、受信用パケットのヘッダ領域とペイロード領域は空領域であるので、１エントリとして、ＳＧＬポインタをSGL Descriptor0としてもよい。
【００５３】
第１のノード１２−１からステップＳ１２０において送信されたライトコマンド送信パケットＰ１１、Ｐ１２を第２のノード１２−２のドライバ２４−１が図７（ｂ）のステップＳ２１４で受信する。
【００５４】
ドライバ２４−１はパケットを受信すると、ＳＱ内のＲＭコマンドをスキャンし、パケットＩＤが一致するＲＭコマンドがあるか否かをチェックする。ライトコマンド送信パケットＰ１１、Ｐ１２のパケットＩＤはワイルドカードであるので、ドライバ２４−１は、図１０（ｂ）に示すパケット受信用パケットＲＭコマンドＲ２１、Ｒ２２を見つける。ドライバ２４−１は受信したパケットＰ１１、Ｐ１２のヘッダとデータをパケット受信用パケットＰ２１、Ｐ２２に対応する物理メモリＭ２２内の領域に格納する。
【００５５】
また、パケットを受信した際、パケットで指定されたパケットＩＤのＲＭコマンドがＳＱに存在しない場合、パケットＩＤがワイルドカードであるＲＭコマンドでパケットを受信することができる。
【００５６】
ＭＣ１４−１３は、パケットＩＤがワイルドカードであるＲＭコマンドでパケットを受信すると、ステップＳ２１５で、即時、ノード１２−２に受信完了を通知する。
【００５７】
ステップＳ２１６において、ドライバ２４−２はパケット受信用パケットＰ２１、Ｐ２２に対応する物理メモリＭ２２内の領域に格納されたデータを統合して、その統合したデータをストレージ１０−２にライトするためのライトコマンド（Write Ｃｍｄ）Ｗｒ２０を発行し、ストレージ１０−２内のＳＱに登録する。ストレージ１０−２でライトコマンドが実行され、データがストレージ１０−２内にライトされる。
【００５８】
ステップＳ２１７において、ストレージ１０−２がデータをライト完了すると、ストレージ１０−２内のＣＱはノード１２−２にライト完了を通知する。
【００５９】
ステップＳ２１８において、ドライバ２４−２は、ステップＳ２１４で受信したライトコマンド送信パケットＰ１１、Ｐ１２で指定された完了通知パケットＩＤを使用して完了通知送信パケットＰ２０を作成し、完了通知送信パケットＰ２０を物理メモリＭ２２内に格納し、完了通知送信パケットＰ２０を送信するためのＮＶＭｅコマンド、ここではＳＭコマンドＳ２０をＭＣ１４−１３内のＳＱに登録する。
【００６０】
図１１は、完了通知送信パケットＰ２０と完了通知送信パケットＳＭコマンドＳ２０の一例を示す。図１１（ａ）に示すように、完了通知送信パケットＰ２０はヘッダ領域のみからなる。ヘッダ領域はライトコマンドが成功か否かを示すライトコマンド結果と、完了通知送信パケットのパケットＩＤからなる。図１１（ｂ）に示すように、完了通知送信パケットＳＭコマンドＳ２０は、例えば６４バイトからなり、００−０３バイトのCommand Dword 0 (CDW0)はSend Messageであり、１６−３１バイトのＭＴＰＲとＤＰＴＲはパケットのＳＧＬポインタであり、完了通知送信パケットはヘッダ領域のみの１エントリなので、ＳＧＬポインタはSGL Descriptor0となる。
【００６１】
ステップＳ２２０において、ＭＣ１４−１３はＳＱ内のコマンドを実行し、コマンドで規定されるパケットをＬＶＤＳ線を介して隣接するＭＣ１４へ転送する。ここでは、図１１（ａ）に示す完了通知送信パケットＰ２０が第１のノード１２−１へ転送されたとする。ＭＣ１４−１３はＬＶＤＳ線へのパケットＰ２０の送信が完了したタイミングで割り込みを発生させ、ノード１２−２にそれを通知する。
【００６２】
図７（ａ）のステップＳ１２２に示すように、第１のノード１２−１のドライバ２４−１は、完了通知送信パケットＰ２０を受信すると、ＳＱ内のＲＭコマンドをスキャンし、パケットＩＤが一致するＲＭコマンドがあるか否かをチェックする。ドライバ２４−１は、図８（ｂ）に示す完了通知受信用ＲＭコマンドＲ１０を見つける。ドライバ２４−１は受信した完了通知送信パケットＰ２０のヘッダを完了通知受信用パケットＰ１０に対応する物理メモリＭ２２内の領域に格納する。
【００６３】
ＭＣ１４−１１はパケットを物理メモリＭ２２に格納すると、ステップＳ１２３でパケット管理データ７０のＴＡＧ毎のパケット番号ビットマップにおける受信したパケット番号に対応するビットを“０”とする。ＴＡＧ毎のパケット番号ビットマップが全て“０”になると、ＭＣ１４−１３はパケット管理データ７０からＴＡＧを削除し、アプリケーションプログラムにライト要求の完了を通知する。パケット管理データ７０にＴＡＧが登録されていなければ、パケットを受信すると、即時受信完了が通知される。
【００６４】
なお、ドライバ２４−１が定期的にＣＱをチェックして、ＣＱ内に完了通知があれば、ＣＰＵ２に割り込みを発生させてもよい。あるいは、ドライバ２４−１は、別要因の割り込み発生時にＣＱをチェックして、ＣＱ内に完了通知があれば、割り込みを発生させてもよい。このように、１パケットの送信毎に割り込みが発生しないので、ノード１２のＣＰＵ２のリード／ライト処理が中断されることがなく、処理効率が低下することがない。
【００６５】
図１２はＮＶＭｅコマンドのオペコードの一例を示す。オペコードはコマンドの００−０３バイトのCommand Dword 0 (CDW0)の００−０７ビットに定義される。Data transferはデータ転送方向を示し、“００ｂ”はデータ転送無、“０１ｂ”はノード１２からストレージ１０へのデータ転送、“１０ｂ”はストレージ１０からノード１２へのデータ転送、“１１ｂ”は双方向のデータ転送を示す。Ｏ／Ｍの“Ｏ”は任意、“Ｍ”は必須を示す。
【００６６】
Send Messageは０７ビットが１ｂ、０６−０２ビットが０００  ００ｂ、０１−００ビットが０１ｂ、Combined Opcodeが８１ｈである。なお、ＳＭコマンドのCommand Dword 10-15 (CDW10-CDW15)は図９、図１１に示すように、Reservedである。
【００６７】
Receive Messageは０７ビットが１ｂ、０６−０２ビットが０００  ００ｂ、０１−００ビットが１０ｂ、Combined Opcodeが８２ｈである。なお、ＲＭコマンドのCommand Dword 10, 11 (CDW11-CDW12)は図８、図１０に示すように、通常のパケットＩＤかワイルドカードである。
【００６８】
［第１のリード処理］  
次に、第１のノード１２−１が第２のノード（例えば、１２−２、ただし、複数の第２のノードでもよい）のストレージ１０−２からデータをリードする第１のリード処理の一例を説明する。図１３は第１のリード処理におけるパケットの転送の一例を示し、図１４、図１５はリード処理の一例を示すフローチャートである。図１４（ａ）、図１５（ａ）は第１のノード１２−１側の処理、図１４（ｂ）、図１５（ｂ）は第２のノード１２−２側の処理を示す。
【００６９】
先ず、図１４（ａ）を参照して第１のノード１２−１側の処理を説明する。
【００７０】
ステップＳ１５２において、ドライバ２４−１は、ＣＰＵ２が実行するアプリケーションプログラムからリード要求を受信する。リード要求は、第２のノード１２−２のストレージ１０−２内のデータをリードする要求である。
【００７１】
ステップＳ１５４において、ドライバ２４−１は、リードデータを格納するための領域を物理メモリＭ２１に確保するために、仮想メモリＭ１１内のリードデータを物理メモリＭ２１の複数のデータに変換（アドレス変換）し、パケットのヘッダのための領域も物理メモリＭ２１内に確保し、ＳＧＬを利用して、ヘッダとデータを統合してリードデータを受信するためのパケットＰ３１、Ｐ３２を作成する。リードデータのサイズに応じて、１つのリード要求に対して複数のパケットが作成されることがある。ここでは、２つのパケットＰ３１、Ｐ３２が作成される例を示す。図１３では、物理メモリＭ２１が断片化されている場合を想定したので、リードデータが物理メモリＭ２１内の複数のデータ領域で受信される例を説明したが、断片化されていない場合は、１つのデータ領域で受信される。
【００７２】
ステップＳ１５６において、ドライバ２４−１は、リードデータ受信用パケットＰ３１、Ｐ３２を受信するためのＮＶＭｅコマンド、ここではＲＭコマンド（ＲＭＣｍｄ）Ｒ３１、Ｒ３２をＭＣ１４−１１のＳＱに登録する。
【００７３】
図１６は、リード受信用パケットＰ３１、Ｐ３２とリードデータ受信用パケットを受信するためのＲＭコマンドＲ３１、Ｒ３１２の一例を示す。図１６（ａ）に示すように、リードデータ受信用パケットＰ３１、Ｐ３２はヘッダ領域とペイロードからなる。ヘッダ領域は空であり、ペイロードは空のリードデータからなる。ペイロードは、例えば４ＫｉＢである。
【００７４】
図１６（ｂ）に示すように、リードデータ受信用パケットＰ３１、Ｐ３２を受信するＲＭコマンドＲ３１、Ｒ３２は６４バイトからなり、００−０３バイトのCommand Dword 0 (CDW0)はReceive Messageである。受信用パケットＰ３１、Ｐ３２はヘッダ領域とペイロードからなり、少なくとも２エントリになるため、１６−３１バイトのＳＧＬポインタはSGL Segment Descriptorとなる。４０−４４バイトのパケットＩＤにはリードデータ送信パケットのパケットＩＤｘｘがセットされる。
【００７５】
ステップＳ１５７において、ＭＣ１４−１１はＳＱに登録されたＲＭコマンドＲ３１、Ｒ３２に含まれるパケットＩＤに含まれるＴＡＧがパケット管理データ７０に登録済みであるか否かをチェックする。未登録であれば、ＭＣ１４−１１はパケット管理モジュール６６を用いてパケット管理データ７０にＴＡＧを登録し、パケット番号ビットマップのパケット番号に対応するビットを“１”とする。
【００７６】
ステップＳ１５８において、ドライバ２４−１は、リードコマンド送信パケットＰ３０を送信するためのＮＶＭｅコマンド、ここではSend Message（ＳＭ）コマンド（ＳＭＣｍｄ）Ｓ３０をＭＣ１４−１１のＳＱに登録する。
【００７７】
図１７は、リードコマンド送信パケットＰ３０とリードコマンド送信パケットを送信するＳＭコマンドＳ３０の一例を示す。図１７（ａ）に示すように、リードコマンド送信パケットＰ３０はヘッダ領域とペイロードからなる。ヘッダ領域は、コマンドがリードコマンドであることを示すリードコマンド情報、パケット識別情報、パケットＩＤ（＝ワイルドカード）からなり、ペイロードは受信用パケットＩＤの数（受信用パケットの数）、各受信用パケット毎のパケットＩＤとデータ長からなる。リードコマンド情報はリードされるデータが格納されているストレージ１０−２の領域の論理アドレス及びリードするデータのサイズ（例えば、セクタ数）を含む。パケット識別情報はリードコマンドが複数のパケットからなる場合、リードコマンドであることを示す識別子と、当該パケットが何番目のパケットであるかを示す番号情報を含む。ペイロードは、例えば最長４ＫｉＢである。ワイルドカードパケットＩＤは、例えば0xFFFF FFFF FFFF FFFFである。
【００７８】
図１７（ｂ）に示すように、リードコマンド送信パケットＰ３０を送信するＳＭコマンドＳ３０は６４バイトからなり、００−０３バイトのCommand Dword 0 (CDW0)はSend Messageである。リードコマンド送信パケットはヘッダ領域とペイロードからなり、少なくとも２エントリになるため、１６−３１バイトのＳＧＬポインタはSGL Segment Descriptorとなる。
【００７９】
ステップＳ１６０において、ＭＣ１４−１１はＳＱ内のコマンドを実行し、コマンドで規定されるパケットをＬＶＤＳ線を介して隣接するＭＣ１４へ転送する。ここでは、図１７（ａ）に示すリードコマンド送信パケットＰ３０が第２のノード１２−２へ転送されたとする。ＭＣ１４−１１はＬＶＤＳ線へのパケットＰ３０の送信が完了したタイミングで割り込みを発生させ、ノード１２−１にそれを通知する。
【００８０】
ここで、第２のノード１２−２の動作を説明する。ライト処理の場合と同様に、全ノード１２は、システムがオンすると、パケット受信用パケットを準備し、パケット受信用のＮＶＭｅコマンドを作成し、ＳＱに登録しておく。そのため、第２のノード１２−２も、システムがオンすると、図１４（ｂ）のステップＳ２５２に示すように、物理メモリＭ２２内に、データとヘッダからなり、パケットＩＤがワイルドカードからなるパケット受信用パケットＰ４０を受信するためのＮＶＭｅコマンド、ここではＲＭコマンド（ＲＭＣｍｄ）Ｒ４０をＭＣ１４−１３のＳＱに登録する。なお、第１のノード１２−１も受信用パケットのＲＭコマンドをＭＣ１４−１１のＳＱに登録するが、リード処理では使用されないので、図１４（ａ）、図１５（ａ）では説明を省略する。
【００８１】
図１８は、パケット受信用パケットＰ４０とパケット受信用パケットを受信するためのＮＶＭｅコマンド、ここではＲＭコマンド（ＲＭＣｍｄ）Ｒ４０の一例を示す。図１８（ａ）に示すように、パケット受信用パケットはヘッダ領域とペイロードからなる。ヘッダ領域は空である。ペイロードはペイロードヘッダとペイロードデータからなり、両方とも空である。ペイロードは、例えば４ＫｉＢである。図１８（ｂ）に示すように、パケット受信用パケットＲＭコマンドＲ４０は、例えば６４バイトからなり、００−０３バイトのCommand Dword 0 (CDW0)はReceive Messageであり、４０−４７バイトのCommand Dword 10 (CDW10)、Command Dword 11 (CDW11)にはワイルドカードパケットＩＤ（0xFFFF FFFF FFFF FFFF）がセットされる。受信用パケットはヘッダ領域とペイロードがあり、少なくとも２エントリになるため、１６−３１バイトのＳＧＬポインタはSGL Segment Descriptorとなる。ただし、受信用パケットのヘッダ領域とペイロード領域は空領域であるので、１エントリとして、ＳＧＬポインタをSGL Descriptor0としてもよい。
【００８２】
第１のノード１２−１からステップＳ１６０において送信されたリードコマンド送信パケットＰ３０を第２のノード１２−２のドライバ２４−２が図１５（ｂ）のステップＳ２５４で受信する。
【００８３】
ドライバ２４−２はパケットを受信すると、ＳＱ内のＲＭコマンドをスキャンし、パケットＩＤが一致するＲＭコマンドがあるか否かをチェックする。リードコマンド送信パケットＰ３０のパケットＩＤはワイルドカードであるので、ドライバ２４−２は、図１８（ｂ）に示すパケット受信用パケットＲＭコマンドＲ４０を見つける。ドライバ２４−２は受信したリードコマンド送信パケットＰ３０をパケット受信用パケットＲＭコマンドＲ４０に対応する物理メモリＭ２２内の領域に格納する。
【００８４】
ＭＣ１４−１３は、パケットＩＤがワイルドカードであるＲＭコマンドでパケットを受信すると、ステップＳ２５５で、即時、ノード１２−２に受信完了を通知する。
【００８５】
ステップＳ２５６において、ドライバ２４−２は物理メモリＭ２２内にデータをリードするデータ領域を確保し、データをストレージ１０−２からリードするためのリードコマンド（Read  Ｃｍｄ）Ｒｅ４０を発行し、ストレージ１０−２内のＳＱに登録する。ストレージ１０−２でリードコマンドが実行され、リードデータが物理メモリＭ２２内に書き込まれる。リードコマンドＲｅ４０の完了すると、ＣＱで通知される。
【００８６】
ステップＳ２５８において、ドライバ２４−２は、ステップＳ２５４で受信したリードコマンド送信パケットＰ３０で指定された受信用パケットＩＤを使用してリードデータ送信パケットＰ４１、Ｐ４２を作成し、リードデータ送信パケットＰ４１、Ｐ４２を送信するためのＮＶＭｅコマンド、ここではＳＭコマンドＳ４１、Ｓ４２をＭＣ１４−１３のＳＱに登録する。
【００８７】
図１９は、リードデータ送信パケットＰ４１、Ｐ４２とリードデータ送信パケットＳＭコマンドＳ４１、Ｓ４２の一例を示す。図１９（ａ）に示すように、リードデータ送信パケットＰ４１、Ｐ４２はヘッダ領域とペイロードからなる。ヘッダ領域は、リードコマンド情報、パケット識別情報、パケットＩＤ（＝ＰｋｔＩＤｘｘ）からなる。なお、パケットＩＤが指定されているので、パケット識別情報は必須ではなく、省略可能である。ペイロードはリードデータからなり、最長サイズは、例えば４ＫｉＢである。図１９（ｂ）に示すように、リードデータ送信パケットＳＭコマンドＳ４１、Ｓ４２は、例えば６４バイトからなり、００−０３バイトのCommand Dword 0 (CDW0)はSend Messageである。リードデータ送信パケットはヘッダ領域とペイロードからなり、少なくとも２エントリになるため、１６−３１バイトのＳＧＬポインタはSGL Segment Descriptorとなる。
【００８８】
ステップＳ２６０において、ＭＣ１４−１３はＳＱ内のコマンドを実行し、コマンドで規定されるパケットをＬＶＤＳ線を介して隣接するＭＣ１４へ転送する。ここでは、図１９（ａ）に示すリードデータ送信パケットＰ４１、Ｐ４２が第１のノード１２−１へ転送されたとする。
【００８９】
図１５（ａ）のステップＳ１６２に示すように、第１のノード１２−１のドライバ２４−１は、リードデータ送信パケットＰ４１、Ｐ４２を受信すると、ＳＱ内のＲＭコマンドをスキャンし、パケットＩＤが一致するＲＭコマンドがあるかをチェックする。ドライバ２４−１は、図１６（ｂ）に示すリードデータ受信用パケットＲＭコマンドＲ３１、Ｒ３２を見つける。ドライバ２４−１は受信したリードデータ送信パケットＰ４１、Ｐ４２のヘッダとデータをリードデータ受信用パケットＲＭコマンドＲ３１、Ｒ３２のリードデータ受信用パケットＰ３１、Ｐ３２に対応する物理メモリＭ２１内の領域に格納する。
【００９０】
ＭＣ１４−１１はパケットを物理メモリＭ２１に格納すると、ステップＳ１６３でパケット管理データ７０のＴＡＧ毎のパケット番号ビットマップにおける受信したパケット番号に対応するビットを“０”とする。ＴＡＧ毎のパケット番号ビットマップが全て“０”になると、ＭＣ１４−１１はパケット管理データ７０からＴＡＧを削除し、アプリケーションプログラムにリード要求の完了を通知する。パケット管理データ７０にＴＡＧが登録されていなければ、パケットを受信すると、即時受信完了が通知される。
【００９１】
なお、ドライバ２４−１が定期的にＣＱをチェックして、ＣＱ内に完了通知があれば、割り込みを発生してもよい。あるいは、ドライバ２４−１は、別要因の割り込み発生時にＣＱをチェックして、ＣＱ内に完了通知があれば、割り込みを発生してもよい。このように、１パケットの送信毎に割り込みが発生しないので、ノード１２のＣＰＵ２のリード、ライト処理が中断され、処理効率が低下することがない。
【００９２】
［第２のリード／ライト処理］  
第１のリード／ライト処理では、パケットの送信についてSend MessageとReceive Messageの２種類のＮＶＭｅコマンドが用いられた。次に、３種類のＮＶＭｅコマンドを用いる第２のリード／ライト処理の例を説明する。第１の処理では、ノード１２の物理メモリＭ２１、Ｍ２２内にパケット受信用パケットのデータを格納する領域を確保している。第２の処理では、ＭＣ１４内の物理メモリ内に受信パケットに関する管理データを格納するスロットを設ける。受信パケットに関する管理データは、スロットが受信できるパケットのパケットＩＤと、受信したパケットを格納するノード１２内の物理メモリＭ２１、Ｍ２２へのポインタ等を含む。
【００９３】
第２の処理で使われるパケットの送信に関するコマンドは、スロットを確保してからパケットを送信する送信コマンドＲＳｅｎｄ（Reserve Send）と、スロットを確保しないでパケットを送信する送信コマンドＳｅｎｄがある。
【００９４】
第２の処理では、パケットの送信に関係せず、パケットを受信するためのスロットを確保するだけのスロット確保コマンド（Wildcard）もある。パケットを受信するためには、スロットが必要であり、パケットＩＤがワイルドカードＩＤに設定されたパケットを受信できるスロットを確保するためのコマンドがスロット確保コマンドである。スロット確保コマンドは、第１のリード／ライト処理で説明したパケットＩＤがワイルドカードＩＤに設定されたパケットを受信するためのＲＭコマンドに相当する。スロット確保コマンド（Wildcard）の一例を図２０に示す。スロット確保コマンド（Wildcard）は、例えば６４バイトからなり、００−０３バイトのCommand Dword 0 (CDW0)はWildcardであり、１６−２３バイトのMetadata Pointer (MPTR)は受信したパケットのヘッダを格納する物理メモリの領域を示すＳＧＬポインタであり、２４−３１バイトのData Pointer (DPTR)は受信したパケットのデータを格納する物理メモリの領域を示すＳＧＬポインタである。スロット確保コマンド（Wildcard）が実行されると、パケットの受信待ちとなり、１コマンドで１パケットの受信を担う。
【００９５】
スロット確保コマンド（Wildcard）の実行により、確保されたスロットをワイルドカードスロットと称する。一方、送信コマンドＲＳｅｎｄ（Reserve Send）の実行により確保されたスロットをリザーブドスロットと称する。リザーブドスロットはパケットの送信に用いられるとともに、送信したパケットに対する応答のパケットの受信にも用いられる。一方、ワイルドカードスロットはパケットの受信専用のスロットである。
【００９６】
図２１はキューＳＱ、ＣＱの概念を示す。３種類のコマンドそれぞれ毎にキューが設けられる。ＲＳｅｎｄコマンドは専用のキューＳＱａに登録され、Ｓｅｎｄコマンドも専用のキューＳＱｂに登録され、Wildcardコマンドも専用のキューＳＱｃに登録される。ＣＱもＳＱに対応して３種類のコマンドそれぞれ毎に設けられる。
【００９７】
コマンド登録のためのＳＱが１つであると、スロットを確保するために多数のＲＳｅｎｄコマンドがＳＱに登録されると、Ｓｅｎｄコマンドが登録できない場合がある。Ｓｅｎｄコマンドが実行できないと、他ノードとデッドロック状態になる可能性がある。１つのＳＱに後から登録されたＳｅｎｄコマンドを実行するジョブが先から登録されたＲＳｅｎｄコマンドを実行するジョブを追い越す制御は困難であるが、コマンド毎にキューを設け、コマンド毎のキューＳＱａ、ＳＱｂ、ＳＱｃの優先度を適宜異ならせると、デッドロック状態を回避できる。あるいは、キューＳＱａ、ＳＱｂ、ＳＱｃの優先度が同じでも、ラウンドロビン方式で３つのキューのジョブを順番に実行させれば、デッドロック状態を回避できる。なお、第１のリード／ライト処理でも図５、図１３に示すＳＱ、ＣＱをSend MessageコマンドとReceive Messageコマンド毎に設けてもよい。
【００９８】
［第２のリード処理］  
図２２を参照して、第１のノード１２−１が第２のノード（例えば、ノード１２−２、ただし複数の第２のノードでもよい）のストレージ１０−２からデータをリードする第２のリード処理の一例を説明する。
【００９９】
先ず、各ノードはシステムオンすると適宜な数のWildcardコマンドをキューＳＱｃに登録し、このコマンドを実行することにより、Wildcardスロットを作成しているとする。
【０１００】
第1のノード１２−１のドライバ２４−１は、ＣＰＵ２が実行するアプリケーションプログラムからリード要求を受信する。リード要求は、第２のノード１２−２のストレージ１０−２内のデータをリードする要求である。
【０１０１】
ドライバ２４−１は、ノード１２−２のドライバ２４−２に接続されているＭＣ１４−１３のワイルドカードスロットに対して送信されるリードコマンド送信パケット３０２を作成し、パケット３０２を物理メモリ内に格納する。
【０１０２】
図２３はリードコマンド送信パケット３０２の一例を示し、図２４はそれを送信するためのスロット確保送信コマンドＲＳｅｎｄの一例を示す。図２３に示すリードコマンド送信パケット３０２はヘッダ領域とペイロードからなる。ヘッダ領域は送信先（ここでは、ノード１２−１）ノードアドレス、送信元が確保したスロットＩＤ（ここでは、ＭＣ１４―１１によりＳＬ１が登録される）、送信先スロットＩＤ（ここでは、ワイルドカードスロット）、パケット番号情報、パケットＩＤ（ここでは、ワイルドカード）、送信先で何をさせるかを示すコマンド情報（ここでは、リード）等を含む。ワイルドカードスロットとは、相手側の送信先スロットのＩＤが分からないので、任意のワイルドカードスロット宛とするものである。相手側のノード１２−２でスロットＳＬ２が空いており、パケットがスロットＳＬ２で受信されるとする。ワイルドカードパケットＩＤは任意のＩＤである。ノード１２−２が応答を返す際に同じＩＤを指定し、ノード１２−１で応答を受信する際、スロットＤＬ１に登録されたパケットＩＤと一致しているパケットＩＤを有する応答のみ受信するためにワイルドカードパケットＩＤは利用される。ワイルドカードパケットＩＤは、他のノードが誤ってノード１２−１のスロットＳＬ１に対してパケットを送っても、スロットＳＬ１が間違って受信しないようにするためのシグネチャーである。パケット番号情報はコマンドを送信するパケットが複数ある場合、当該パケットが何番目のパケットであるかを示す。コマンド情報はリードされるデータが格納されているストレージ１０の領域の論理アドレス及びリードするデータのサイズ（例えば、セクタ数）を含む。リード処理では、送信するデータは無いので、ペイロードは空である。
【０１０３】
図２４に示すスロット確保送信コマンドＲＳｅｎｄのパケットを送信するとともに、受信するためのコマンドである。スロット確保送信コマンドＲＳｅｎｄは、例えば６４バイトからなり、００−０３バイトのCommand Dword 0 (CDW0)はReserve Sendであり、１６−２３バイトのMetadata Pointer (MPTR)はパケットのヘッダ領域が格納されている物理メモリの領域を示すＳＧＬポインタであり、２４−３１バイトのDate Pointer (DPTR)は送信データが格納されている物理メモリの領域を示すＳＧＬポインタであり、３２−３９バイトのDate Pointer (DPTR)は受信データが格納されている物理メモリの領域を示すＳＧＬポインタであり、４０−４３バイトのCommand Dword 10 (CDW10)は送信パケット数であり、４４−４７バイトのCommand Dword 11 (CDW11)は受信パケット数である。リードコマンド送信パケットは１つであるが、ＲＳｅｎｄコマンドは複数のパケットを送信することも受信することもできるので、送信パケット数、受信パケット数を含む。なお、ヘッダ領域のＳＧＬもデータと同様に送信パケット用と受信パケット用に分かれていてもよい。
【０１０４】
ドライバ２４−１は、図２３に示すリードコマンド送信パケット３０２が格納されている物理メモリの領域を示すＳＧＬポインタを図２４に示すＲＳｅｎｄコマンドの１６−２３バイトのMPTRにセットし、リードデータ受信用の領域を指すＳＧＬを３２−３９バイトのDPTRにセットし、リードコマンド送信パケット数（＝１）を４０−４３バイトのCDW10にセットし、リードデータのサイズに応じた受信パケット数を４４−４７バイトのCDW11にセットし、ＲＳｅｎｄコマンド３０４をＳＱａに登録する。
【０１０５】
ＭＣ１４−１１は、スロット確保送信コマンドＲＳｅｎｄを実行し、スロットＳＬ１を確保して、確保したスロットのＩＤであるＳＬ１をパケットヘッダの送信元スロットに格納してからリードコマンド送信パケットをＬＶＤＳ線を介して送信させる。
【０１０６】
ノード１２−２に接続されるＭＣ１４−１３にリードコマンド送信パケットが到達すると、ＭＣ１４−１３はパケットのヘッダ領域の送信先スロットＩＤで指定されたワイルドカードスロットの中で空いているスロット、ここではＳＬ２でリードコマンド送信パケットを受信する。ノード１２−２のドライバ２４−２はパケットのヘッダ領域のリードコマンド情報に基づいて、ストレージ１０−２の指定された論理アドレスの領域からデータをリードするためのリードコマンドを図示しないストレージ１０−２のＳＱに登録する。ドライバ２４−２はＳＱを使わずに、ストレージ１０−２からデータをリードしてもよい。ストレージ１０−２がリードコマンドを実行して、リードデータが得られ、リードデータは物理メモリ内に格納される。
【０１０７】
ドライバ２４−２は、ヘッダを作成し、ヘッダを物理メモリに格納する。ドライバ２４−２はヘッダ領域とリードデータからなるリードデータ送信パケット３０６を作成する。リードデータのサイズに応じて複数のリードデータ送信パケット３０６が作成される。
【０１０８】
図２５はリードデータ送信パケット３０６の一例を示し、図２６はそれを送信するためのスロット確保無し送信コマンドＳｅｎｄの一例を示す。図２５に示すリードデータ送信パケット３０６はヘッダ領域とペイロードからなる。ヘッダ領域は送信先（ここでは、ノード１２−２）ノードアドレス、送信元スロットＩＤ（Ｓｅｎｄコマンドはスロットを確保しないので、未定義）、送信先スロットＩＤ（ここでは、リザーブドスロットＳＬ１）、パケット番号情報、パケットＩＤ、コマンド情報（ここでは、リード要求のリプライ）等を含む。パケットＩＤはスロット確保の際にスロットと紐づけられて登録されるパケット固有のＩＤであり、リード要求パケットに格納されていたパケットＩＤが登録される。ペイロードにはリードデータが含まれる。
【０１０９】
図２６に示すスロット確保無し送信コマンドＳｅｎｄは、パケットを送信するだけのコマンドである。スロット確保無し送信コマンドＳｅｎｄは、例えば６４バイトからなり、００−０３バイトのCommand Dword 0 (CDW0)はSendであり、１６−２３バイトのMetadata Pointer (MPTR)はパケットのヘッダ領域のためのＳＧＬポインタであり、２４−３１バイトのDate Pointer (DPTR)はリードデータのためのＳＧＬポインタであり、４０−４３バイトのCommand Dword 10 (CDW10)は送信パケット数である。Ｓｅｎｄコマンドは複数のパケットを送信することができるので、送信パケット数を含む。
【０１１０】
ドライバ２４−２は、図２５に示すリードデータ送信パケット３０６のヘッダ領域が格納されている物理メモリの領域を示すＳＧＬポインタを図２６に示すＳｅｎｄコマンドの１６−２３バイトのMPTRにセットし、ペイロード３０５が格納されている物理メモリの領域を示すＳＧＬポインタを２４−３１バイトのDPTRにセットし、リードデータ送信パケット３０６の数をＳｅｎｄコマンドの４０−４３バイトのCDW10にセットし、Ｓｅｎｄコマンド３０８をＳＱｂに登録する。
【０１１１】
ＭＣ１４−１３は、スロット確保無し送信コマンドＳｅｎｄを実行し、リードデータ送信パケット３０６（複数の場合もある）をＬＶＤＳ線を介して送信させる。
【０１１２】
ノード１２−１に接続されるＭＣ１４−１１にリードデータ送信パケットが到達すると、ＭＣ１４−１１はパケットのヘッダ領域の送信先スロットＩＤで指定されたリザーブドスロットＳＬ１でリードデータ送信パケットを受信する。ＭＣ１４−１１はパケットのヘッダ領域のパケット番号情報に基づいて全てのリードデータ送信パケットを受信したことを検出すると、全パケットのペイロード３１０を物理メモリに転送し書き込み、リード要求の完了をアプリケーションに送る。ＭＣ１４−１１は複数のパケットそれぞれを受信する度にパケットのペイロード３１０を物理メモリに転送してもよい。その場合でも、リード要求の完了をアプリケーションに送るのは、全てのリードデータ送信パケットを受信した時のみである。
【０１１３】
［第２のライト処理］  
図２７を参照して、第１のノード１２−１が第２のノード（例えば、ノード１２−２、ただし複数の第２ノードでもよい）のストレージ１０−２へデータをライトする第２のライト処理の一例を説明する。
【０１１４】
ここでも、各ノードはシステムオンすると適宜な数のWildcardコマンドをキューＳＱｃに登録し、このコマンドを実行することにより、Wildcardスロットを作成しているとする。
【０１１５】
ノード１２−１のドライバ２４−１は、ＣＰＵ２が実行するアプリケーションプログラムからライト要求を受信する。ライト要求は、第２のノード１２−２のストレージ１０−２へデータをライトする要求である。
【０１１６】
ドライバ２４−１は、ノード１２−２に接続されているＭＣ１４−１３のワイルドカードスロットに対して送信されるライト予約コマンド送信パケット４０２を作成し、パケット４０２を物理メモリ内に格納する。ライト予約コマンド送信パケット４０２はヘッダ領域のみからなる。ヘッダ領域は送信先（ここでは、ノード１２−２）ノードアドレス、送信元が確保したスロットＩＤ（ここでは、リザーブドスロットＳＬ１）、送信先スロットＩＤ（ここでは、ワイルドカードスロット）、パケット番号情報、パケットＩＤ（ここでは、今回のライト要求に割り振られた固有のパケットＩＤ）、コマンド情報（ここでは、ライト予約）等を含む。ライト予約処理では、送信するデータは無いので、ペイロードは空である。
【０１１７】
ドライバ２４−１は、ライト予約コマンド送信パケット４０２のヘッダが格納されている物理メモリの領域を示すＳＧＬポインタを図２４に示すＲＳｅｎｄコマンドの１６−２３バイトのMPTRにセットし、受信パケットのデータを格納する物理メモリの領域を示すＳＧＬポインタを３２−３９バイトのDPTRにセットし、送信パケット数（＝１）を４０−４３バイトのCDW10にセットし、受信パケット数（＝１）を４４−４７バイトのCDW11にセットし、ＲＳｅｎｄコマンド４０４をＳＱａに登録する。
【０１１８】
ＭＣ１４−１１は、スロット確保送信コマンドＲＳｅｎｄを実行し、スロットＳＬ１を確保して、確保したスロットのＩＤであるＳＬ１をパケットヘッダの送信元スロットに格納してからライト予約コマンド送信パケットをＬＶＤＳ線を介して送信させる。
【０１１９】
ノード１２−２に接続されるＭＣ１４−１３にライト予約コマンド送信パケットが到達すると、ＭＣ１４−１３はパケットのヘッダ領域の送信先スロットＩＤで指定されたワイルドカードスロットの中で空いているスロット、ここではＳＬ２でライト予約コマンド送信パケットを受信する。ノード１２−２のドライバ２４−２はパケットのヘッダ領域のライト予約コマンド情報に基づいて、ライト予約を行う。ライト予約はライトデータを格納する領域を物理メモリ内に確保し、及びライトデータ受信用のスロットを確保することである。
【０１２０】
ドライバ２４−２は、ＭＣ１４−１１のリザーブドスロットＳＬ１に対して送信されるライト予約完了通知送信パケット４０６を作成し、パケット４０６を物理メモリ内に格納する。ライト予約完了通知送信パケット４０６はヘッダ領域のみからなる。ヘッダ領域は送信先（ここでは、ノード１２−１）ノードアドレス、送信元が確保したスロットＩＤ（ここでは、ＭＣ１４−１３によりＳＬ３が登録される）、送信先スロットＩＤ（ここでは、リザーブドスロットＳＬ１）、パケット番号情報、パケットＩＤ、コマンド情報（ここでは、ライトデータ送信）等を含む。ライト予約完了通知処理では、送信するデータは無いので、ペイロードは空である。
【０１２１】
ドライバ２４−２は、ライト予約完了通知送信パケット４０６が格納されている物理メモリの領域を示すＳＧＬポインタを図２４に示すＲＳｅｎｄコマンドの１６−２３バイトのMetadata Pointer (MPTR)にセットし、受信パケットのデータを格納する物理メモリの領域を示すＳＧＬポインタを３２−３９バイトのDPTRにセットし、送信パケット数（＝１）を４０−４３バイトのCDW10にセットし、ライトデータのサイズに応じた受信パケット数を４４−４７バイトのCDW11にセットし、ＲＳｅｎｄコマンド４０８をＳＱａに登録する。
【０１２２】
ＭＣ１４−１３は、スロット確保送信コマンドＲＳｅｎｄを実行し、スロットＳＬ３を確保して、確保したスロットのＩＤであるＳＬ３をパケットヘッダの送信元スロットに登録してからライト予約完了通知送信パケットをＬＶＤＳ線を介して送信させる。
【０１２３】
ノード１２−１に接続されるＭＣ１４−１１にライト予約完了通知送信パケットが到達すると、ＭＣ１４−１１はパケットのヘッダ領域の送信先スロットＩＤで指定されたリザーブドスロットＳＬ１でライト予約完了通知送信パケットを受信する。ノード１２−１のドライバ２４−１はパケットのヘッダ領域のライトデータ送信コマンド情報に基づいて、ライトデータ送信を行う。
【０１２４】
ライトデータ送信のために、ドライバ２４−１は、ＭＣ１４−１３のリザーブドスロットＳＬ３に対して送信されるライトデータ送信パケット４１２を作成し、パケット４１２を物理メモリ内に格納する。ライトデータ送信パケット４１２はヘッダ領域とペイロードからなる。ヘッダ領域は送信先（ここでは、ノード１２−２）ノードアドレス、送信元が確保したスロットＩＤ（ここでは、ＭＣ１４−１１によりＳＬ４が登録される）、送信先スロットＩＤ（ここでは、リザーブドスロットＳＬ３）、パケット番号情報、パケットＩＤ、コマンド情報（ここでは、ライト）等を含む。コマンド情報はデータがライトされるストレージ１０の領域の論理アドレスも含む。ペイロードはライトデータである。ライトデータのサイズが１パケットのペイロードに収まらない場合は、複数のライトデータ送信パケットが作成される。
【０１２５】
ドライバ２４−１は、ライトデータ送信パケット４１２のヘッダが格納されている物理メモリの領域を示すＳＧＬポインタを図２４に示すＲＳｅｎｄコマンドの１６−２３バイトのMPTRにセットし、ライトデータを格納する物理メモリの領域を示すＳＧＬポインタを２４−３１バイトのDPTRにセットし、ライトデータ送信パケットの数を４０−４３バイトのCDW10にセットし、受信パケット数（＝１）を４４−４７バイトのCDW11にセットし、ＲＳｅｎｄコマンド４１４をＳＱａに登録する。
【０１２６】
ＭＣ１４−１１は、スロット確保送信コマンドＲＳｅｎｄを実行し、スロットＳＬ４を確保して、確保したスロットのＩＤであるＳＬ４をパケットヘッダの送信元スロットに格納してからライトデータ送信パケットをＬＶＤＳ線を介して送信させる。
【０１２７】
ノード１２−２に接続されるＭＣ１４−１３にライトデータ送信パケットが到達すると、ＭＣ１４−１３はパケットのヘッダ領域の送信先スロットＩＤで指定されたリザーブドスロットＳＬ３でライトデータ送信パケットを受信する。ノード１２−２のドライバ２４−２はパケットのヘッダ領域のライトコマンド情報に基づいて、ライトデータをストレージ１０−２の指定された論理アドレスの領域へライトするためのライトコマンドを図示しないストレージ１０−２のＳＱに登録する。ドライバ２４−２はＳＱを使わずに、ストレージ１０−２にデータをライトしてもよい。ストレージ１０−２がライトコマンドを実行する。
【０１２８】
ストレージ１０−２のライト処理が完了すると、ドライバ２４−２は、ＭＣ１４−１１のリザーブドスロットＳＬ４に対して送信されるライト完了通知送信パケット４１８を作成し、パケット４１８を物理メモリ内に格納する。ライト完了通知送信パケット４１６はヘッダ領域のみからなる。ヘッダ領域は送信先（ここでは、ノード１２−１）ノードアドレス、送信先スロットＩＤ（ここでは、リザーブドスロットＳＬ４）、パケット番号情報、パケットＩＤ、コマンド情報（ここでは、ライト完了）等を含む。
【０１２９】
ドライバ２４−２は、ライト完了通知送信パケット４１８のヘッダが格納されている物理メモリの領域を示すＳＧＬポインタを図２６に示すＳｅｎｄコマンドの１６−２３バイトのMPTRにセットし、送信パケット数（＝１）を４０−４３バイトのCDW10にセットし、Ｓｅｎｄコマンド４２０をＳＱｂに登録する。
【０１３０】
ＭＣ１４−１３は、Ｓｅｎｄコマンドを実行し、ライト完了通知送信パケットをＬＶＤＳ線を介して送信させる。
【０１３１】
ノード１２−１に接続されるＭＣ１４−１１にライト完了通知送信パケットが到達すると、ＭＣ１４−１１はパケットのヘッダ領域の送信先スロットＩＤで指定されたリザーブドスロットＳＬ４でライト完了通知送信パケットを受信し、ドライバ２４−１はアプリケーションプログラムへライト要求の完了を通知する。
【０１３２】
［第３のライト処理］  
図２８を参照して、第１のノード１２−１が第２のノード（例えば、ノード１２−２、ただし複数の第２ノードでもよい）のストレージ１０−２へデータをライトする第３のライト処理の一例を説明する。第３のライト処理は第２のライト処理の変形に関するものであり、第２のライト処理では第１のノード１２−１は２つのスロットをリザーブする必要があったが、第３のライト処理では第１のノード１２−１は１つのスロットをリザーブするだけでよい。
【０１３３】
第１のノード１２−１からＲＳｅｎｄコマンド４０４によりライト予約コマンド送信パケット４０２がＲＳｅｎｄコマンド４０４により送信されるまでは、第２のライト処理と同じである。
【０１３４】
ドライバ２４−２はライト予約を完了すると、ＭＣ１４−１１のワイルドカードスロットに対して送信されるライトデータ要求送信パケット４３２を作成し、パケット４３２を物理メモリ内に格納する。ライトデータ要求送信パケット４３２はヘッダ領域のみからなる。ヘッダ領域は送信先（ここでは、ノード１２−１）ノードアドレス、送信元が確保したスロットＩＤ（ここでは、ＭＣ１４−１３によりＳＬ３が登録される）、送信先スロットＩＤ（ここでは、ワイルドカードスロット）、パケット番号情報、パケットＩＤ、コマンド情報（ここでは、ライトデータ送信）等を含む。ライトデータ要求処理では、送信するデータは無いので、ペイロードは空である。
【０１３５】
ドライバ２４−２は、ライトデータ要求送信パケット４３２が格納されている物理メモリの領域を示すＳＧＬポインタを図２４に示すＲＳｅｎｄコマンドの１６−２３バイトのMPTRにセットし、ライトデータを受信するための物理メモリを指すＳＧＬを３２−３９バイトのDPTRにセットし、送信パケット数（＝１）を４０−４３バイトのCDW10にセットし、ライトデータのサイズに応じた受信パケット数を４４−４７バイトのCDW11にセットし、ＲＳｅｎｄコマンド４３４をＳＱａに登録する。
【０１３６】
ＭＣ１４−１３は、スロット確保送信コマンドＲＳｅｎｄを実行し、スロットＳＬ３を確保して、確保したスロットのＩＤであるＳＬ３をパケットヘッダの送信元スロットに格納してからライトデータ要求送信パケットをＬＶＤＳ線を介して送信させる。
【０１３７】
ノード１２−１に接続されるＭＣ１４−１１にライトデータ要求送信パケットが到達すると、ＭＣ１４−１１はパケットのヘッダ領域の送信先スロットＩＤで指定されたワイルドカードスロットの中で空いているスロット、ここではＳＬ４でライトデータ要求送信パケットを受信する。ノード１２−１のドライバ２４−１はパケットのヘッダ領域のライトデータ送信コマンド情報に基づいて、ライトデータ送信を行う。
【０１３８】
ライトデータ送信のために、ドライバ２４−１は、ＭＣ１４−１３のリザーブドスロットＳＬ３に対して送信されるライトデータ送信パケット４１２を作成し、パケット４１２を物理メモリ内に格納する。ライトデータ送信パケット４１２はヘッダ領域とペイロードからなる。ヘッダ領域は送信先（ここでは、ノード１２−２）ノードアドレス、送信先スロットＩＤ（ここでは、リザーブドスロットＳＬ３）、パケット番号情報、パケットＩＤ、コマンド情報（ここでは、ライト）等を含む。コマンド情報はデータがライトされるストレージ１０の領域の論理アドレスも含む。ペイロードはライトデータである。ライトデータのサイズが１パケットのペイロードに収まらない場合は、複数のライトデータ送信パケットが作成される。
【０１３９】
ドライバ２４−１は、ライトデータ送信パケット４１２のヘッダが格納されている物理メモリの領域を示すＳＧＬポインタを図２６に示すＳｅｎｄコマンドの１６−２３バイトのMPTRにセットし、ライトデータを格納する物理メモリの領域を示すＳＧＬポインタを２４−３１バイトのDPTRにセットし、ライトデータ送信パケットの数を４０−４３バイトのCDW10にセットし、Ｓｅｎｄコマンド４３６をＳＱｂに登録する。
【０１４０】
ＭＣ１４−１１は、Ｓｅｎｄコマンドを実行し、ライトデータ送信パケットをＬＶＤＳ線を介して送信させる。
【０１４１】
ノード１２−２に接続されるＭＣ１４−１３にライトデータ送信パケットが到達すると、ＭＣ１４−１３はパケットのヘッダ領域の送信先スロットＩＤで指定されたリザーブドスロットＳＬ３でライトデータ送信パケットを受信する。この後、第２のライト処理と同様に、ライト処理、Ｓｅｎｄコマンドによるライト完了通知送信パケットの送信が行われる。ただし、ライト完了通知送信パケットの送信は第２のリザーブドスロットＳＬ４ではなく、ライト予約コマンド送信パケットを送信した第１のリザーブドスロットＳＬ１である点が異なる。
【０１４２】
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合せにより種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。更に、異なる実施形態に亘る構成要素を適宜組み合せてもよい。
【符号の説明】
【０１４３】
１０…ストレージ、１２…ノード、１４…ＭＣ、２４…ドライバ、２６…アクセス要求パケット管理モジュール、２８…送受信コマンド発行管理モジュール、７０…パケット管理データ。
【図１】
2019164713.tif 000003
【図２】
2019164713.tif 000004
【図３】
2019164713.tif 000005
【図４】
2019164713.tif 000006
【図５】
2019164713.tif 000007
【図６】
2019164713.tif 000008
【図７】
2019164713.tif 000009
【図８】
2019164713.tif 000010
【図９】
2019164713.tif 000011
【図１０】
2019164713.tif 000012
【図１１】
2019164713.tif 000013
【図１２】
2019164713.tif 000014
【図１３】
2019164713.tif 000015
【図１４】
2019164713.tif 000016
【図１５】
2019164713.tif 000017
【図１６】
2019164713.tif 000018
【図１７】
2019164713.tif 000019
【図１８】
2019164713.tif 000020
【図１９】
2019164713.tif 000021
【図２０】
2019164713.tif 000022
【図２１】
2019164713.tif 000023
【図２２】
2019164713.tif 000024
【図２３】
2019164713.tif 000025
【図２４】
2019164713.tif 000026
【図２５】
2019164713.tif 000027
【図２６】
2019164713.tif 000028
【図２７】
2019164713.tif 000029
【図２８】
2019164713.tif 000030