(57)【特許請求の範囲】
【請求項１】
２以上の異なる方向に相互に接続される複数のメモリノードと、
外部からの要求に応じて前記複数のメモリノードのうちの一を宛先とした命令を送信するコネクションユニットと、
を備え、
前記命令は転送毎に減算される値を持ち、
前記複数のメモリノードの夫々は、前記コネクションユニットへ繋がる専用経路を有し、前記命令を受信したとき、前記命令の宛先が自メモリノードではない場合、前記値を参照し、前記値が所定値よりも小さい場合には、前記命令を破棄して破棄を示すパケットを前記専用経路を通して前記コネクションユニットへ転送し、前記値が前記所定値よりも大きい場合には前記命令を自メモリノードに接続されている他のメモリノードに転送する、
ことを特徴とするストレージ装置。
【請求項２】
前記複数のメモリノードの夫々は、前記命令の宛先が自メモリノードである場合、前記命令を実行するとともに前記命令に応じた応答を送信し、
前記コネクションユニットは、前記命令を送信後に前記応答を所定の時間内に受信しない場合には、タイムアウト処理を実行する、
ことを特徴とする請求項１に記載のストレージ装置。
【請求項３】
前記複数のメモリノードの夫々は、前記命令の宛先が自メモリノードである場合、前記命令を実行するとともに前記命令に応じた応答を前記コネクションユニットへ送信し、
前記コネクションユニットは、前記命令を送信する際に、自コネクションユニットが接続されているメモリノードを起点とした転送方向を指定可能であって、
前記コネクションユニットは、前記命令を送信後に前記応答を所定の時間内に受信しない場合には、前記転送方向を変更して再び前記命令を送信する、
ことを特徴とする請求項１または２に記載のストレージ装置。
【請求項４】
前記コネクションユニットは、前記転送方向が変更された前記命令を送信後に前記応答を前記所定の時間内に受信しない場合には、前記タイムアウト処理を実行する、
ことを特徴とする請求項３に記載のストレージ装置。
【請求項５】
前記コネクションユニットを複数備え、前記夫々のコネクションユニットは夫々異なるメモリノードに接続され、
外部から入力される前記要求を前記複数のコネクションユニットのうちの一に転送する振り分け部をさらに備え、
前記タイムアウト処理は、前記振り分け部に前記要求の破棄通知を送信する処理であって、
前記振り分け部は、前記破棄通知を受信した場合、前記破棄通知を送信したコネクションユニットとは異なるコネクションユニットに前記要求を転送する、
ことを特徴とする請求項２または請求項４に記載のストレージ装置。
【請求項６】
前記複数のメモリノードの夫々は、自メモリノードと前記命令の宛先として指定されているメモリノードまでの最短経路と、自メモリノードに接続されている他のメモリノードの状態と、に基づいて、自メモリノードに接続されている他のメモリノードのうちから転送先のメモリノードを一つ選択する、
ことを特徴とする請求項１乃至請求項５の何れか一項に記載のストレージ装置。
【請求項７】
前記コネクションユニットは、自コネクションユニットから前記命令の宛先として指定されているメモリノードまでの最短経路に基づいて前記値の初期値を算出し、前記算出した初期値を前記命令に付加して送信する、
ことを特徴とする請求項１乃至請求項５の何れか一項に記載のストレージ装置。
【請求項８】
前記コネクションユニットは、自コネクションユニットから前記命令の宛先として指定されているメモリノードまでの最短経路に基づいて前記所定の時間を算出する、
ことを特徴とする請求項２乃至請求項５の何れか一項に記載のストレージ装置。
【請求項９】
２以上の異なる方向に相互に接続される複数のメモリノードと、
外部からの要求に応じて前記複数のメモリノードのうちの一を宛先とした命令を送信するコネクションユニットと、
を備え、
前記コネクションユニットは、前記命令が転送される毎に減算される値を自コネクションユニットから前記命令の宛先として指定されているメモリノードまでの最短経路に基づいて演算し、前記演算された値を前記命令に付加して送信し、
前記複数のメモリノードの夫々は、前記命令を受信したとき、前記命令の宛先が自メモリノードではない場合、前記値を参照し、前記値が所定値よりも小さい場合には前記命令を破棄し、前記値が前記所定値よりも大きい場合には前記命令を自メモリノードに接続されている他のメモリノードに転送する、
ことを特徴とするストレージ装置。
【請求項１０】
前記複数のメモリノードの夫々は、前記コネクションユニットへ繋がる専用経路を有し、
前記命令を破棄する際に、破棄を示すパケットを前記専用経路を通して前記コネクションユニットへ送信する、
ことを特徴とする請求項９に記載のストレージ装置。
【請求項１１】
前記複数のメモリノードの夫々は、前記命令の宛先が自メモリノードである場合、前記命令を実行するとともに前記命令に応じた応答を送信し、
前記コネクションユニットは、前記命令を送信後に前記応答を所定の時間内に受信しない場合には、タイムアウト処理を実行する、
ことを特徴とする請求項９または請求項１０に記載のストレージ装置。
【請求項１２】
前記複数のメモリノードの夫々は、前記命令の宛先が自メモリノードである場合、前記命令を実行するとともに前記命令に応じた応答を前記コネクションユニットへ送信し、
前記コネクションユニットは、前記命令を送信する際に、自コネクションユニットが接続されているメモリノードを起点とした転送方向を指定可能であって、
前記コネクションユニットは、前記命令を送信後に前記応答を所定の時間内に受信しない場合には、前記転送方向を変更して再び前記命令を送信する、
ことを特徴とする請求項１０または請求項１１に記載のストレージ装置。
【請求項１３】
前記コネクションユニットは、前記転送方向が変更された前記命令を送信後に前記応答を前記所定の時間内に受信しない場合には、前記タイムアウト処理を実行する、
ことを特徴とする請求項１２に記載のストレージ装置。
【請求項１４】
前記コネクションユニットを複数備え、前記夫々のコネクションユニットは夫々異なるメモリノードに接続され、
外部から入力される前記要求を前記複数のコネクションユニットのうちの一に転送する振り分け部をさらに備え、
前記タイムアウト処理は、前記振り分け部に前記要求の破棄通知を送信する処理であって、
前記振り分け部は、前記破棄通知を受信した場合、前記破棄通知を送信したコネクションユニットとは異なるコネクションユニットに前記要求を転送する、
ことを特徴とする請求項１１または請求項１３に記載のストレージ装置。
【請求項１５】
前記複数のメモリノードの夫々は、自メモリノードと前記命令の宛先として指定されているメモリノードまでの最短経路と、自メモリノードに接続されている他のメモリノードの状態と、に基づいて、自メモリノードに接続されている他のメモリノードのうちから転送先のメモリノードを一つ選択する、
ことを特徴とする請求項９乃至請求項１４の何れか一項に記載のストレージ装置。
【請求項１６】
前記コネクションユニットは、自コネクションユニットから前記命令の宛先として指定されているメモリノードまでの最短経路に基づいて前記所定の時間を算出する、
ことを特徴とする請求項１１乃至請求項１４の何れか一項に記載のストレージ装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、ストレージ装置に関する。
【背景技術】
【０００２】
近年、ストレージ装置を備えた複数台の情報処理装置を、相互にネットワークで接続して、一つの情報処理システムとして動作させる場合（例えばクラウドコンピューティング）が増加している。また、ストレージ装置としても、従来型のＨＤＤを使用したものと比較してより高速な、ＤＲＡＭチップやＮＡＮＤフラッシュチップなどを多数並べてチップ間配線によって接続し、一つのストレージ装置として用いられるものが存在する。
【０００３】
このような、複数の情報処理装置を接続して成る単一の情報システムでは、システムを構成する情報処理装置の台数を増やすことで性能向上が図られている。しかしながら、台数が増加した大規模な情報処理システムにおいては、想定通りの性能が発揮されない、管理のための手間やコストが増大する、などの問題があった。
【０００４】
このような問題点に対する解決方法として、これまでに、データ転送機能を有するメモリノードを複数接続して成るストレージ装置が提案されている。このようなストレージ装置内では、各メモリノードは、自身に宛てたパケットを受信した場合は読み出し、又は書き込みなどの所定の処理を行い、自身宛てでないパケットを受信した場合は、受信パケットを適切な他のメモリノードに転送する。各メモリノードによって適切な転送が繰り返されることで、パケットは目的のメモリノードに到達できる。このような構成にすると、ストレージ装置が大型化しても設計が容易になるというメリットがあった。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１０−２６２６３１号公報
【特許文献２】特表２００６−５２８３９４号公報
【特許文献３】特許３８１７４２６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、特定の位置のメモリノードが故障し、当該故障したメモリノードを迂回するようにパケットを転送できない場合には、パケットがストレージ装置内に滞留する。滞留しているパケットが増加すると、ストレージ装置のスループット性能が低下する。
【０００７】
本発明の一つの実施形態は、パケットの滞留に起因するスループット性能の低下を抑制するストレージ装置を提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明の一つの実施形態によれば、ストレージ装置は、複数のメモリノードと、コネクションユニットとを備える。複数のメモリノードは、２以上の異なる方向に相互に接続される。コネクションユニットは、外部からの要求に応じて複数のメモリノードのうちの一を宛先とした命令を送信する。ここで、命令は転送毎に減算される値を持つ。複数のメモリノードの夫々は、コネクションユニットへ繋がる専用経路を有している。複数のメモリノードの夫々は、命令を受信したとき、命令の宛先が自メモリノードではない場合、値を参照する。複数のメモリノードの夫々は、値が所定値よりも小さい場合には、命令を破棄して破棄を示すパケットを前記専用経路を通して前記コネクションユニットへ転送する。また、複数のメモリノードの夫々は、値が前記所定値よりも大きい場合には命令を自メモリノードに接続されている他のメモリノードに転送する。
【図面の簡単な説明】
【０００９】
【図１】図１は、第１の実施形態に係るストレージ装置の構成例を示す図である。
【図２】図２は、第１の実施形態のパケットの構成を説明する図である。
【図３】図３は、コネクションユニットの構成の一例を示す図である。
【図４】図４は、メモリノードの構成の一例を示す図である。
【図５】図５は、メモリノードの構成の別の例を示す図である。
【図６】図６は、コントローラの構成の一例を示す図である。
【図７】図７は、ロードバランサの第１の実施形態の動作を説明するフローチャートである。
【図８】図８は、コネクションユニットの第１の実施形態の動作を説明するフローチャートである。
【図９】図９は、メモリノードの第１の実施形態の動作を説明するフローチャートである。
【図１０】図１０は、パケットの経路の例を説明する図である。
【図１１】図１１は、メモリノードがトーラス状に接続される例を示す図である。
【図１２】図１２は、データを書き込む複数の要求がストレージ装置に入力された場合を説明する図である。
【図１３】図１３は、コネクションユニットの第２の実施形態の動作を説明するフローチャートである。
【図１４】図１４は、メモリノードの第２の実施形態の動作を説明するフローチャートである。
【図１５】図１５は、データの格納例を説明する概念図である。
【図１６】図１６は、データの格納例を説明する別の概念図である。
【図１７】図１７は、コネクションユニットの第３の実施形態の動作を説明するフローチャートである。
【図１８】図１８は、メモリノードの第３の実施形態の動作を説明するフローチャートである。
【図１９】図１９は、第４の実施形態のパケットの構成を説明する図である。
【図２０】図２０は、ランダマイズの処理を説明する図である。
【図２１】図２１は、（１５、１１）ＢＣＨ符号の符号生成回路の構成例を示す図である。
【図２２】図２２は、シンドロームとエラービットの位置との関係を示す図である。
【図２３】図２３は、第５の実施形態のパケットの構成を説明する図である。
【図２４】図２４は、コピー対象の特定方法を説明する概念図である。
【図２５】図２５は、先頭ポインタを説明する図である。
【図２６】図２６は、長さポインタの更新ルールを説明する図である。
【図２７】図２７は、２ポートＲＡＭを用いてデータが受け渡しされる様子を説明する図である。
【図２８】図２８は、２つの１ポートＲＡＭを用いてデータが受け渡しされる様子を説明する図である。
【図２９】図２９は、ＡＳＩＣ化を想定したＮｏｄｅ  Ｍｏｄｕｌｅの内部構成例を示す図である。
【図３０】図３０は、ＣＬＫＧＥＮの構成を示す図である。
【図３１】図３１は、ＲＳＴＧＥＮの構成を示す図である。
【発明を実施するための形態】
【００１０】
以下に添付図面を参照して、実施形態にかかるストレージ装置を詳細に説明する。なお、これらの実施形態により本発明が限定されるものではない。
【００１１】
（第１の実施形態）
図１は、第１の実施形態に係るストレージ装置の構成例を示す図である。ストレージ装置１は、１以上のアプリケーションサーバ２に接続されている。アプリケーションサーバ２は、クライアント端末（図示せず）とネットワークを介して接続されている。アプリケーションサーバ２は、ストレージ装置１に対する要求をネットワークを介して受信することができる。アプリケーションサーバ２は、クライアント端末から受信した要求をストレージ装置１に転送する。要求とは、例えば、データを書き込んだりデータを読み出したりする要求を含む。図１に示されたように本ストレージ装置１は、独立した複数のスイッチ１５、ロードバランサ１６を持つことができる。ストレージ装置の規模拡大につれてスイッチ１５、およびロードバランサ１６の性能向上が不要となっており、スケールアウトに適した構成となっている。
【００１２】
ストレージ装置１は、記憶部１０、スイッチ１５、およびロードバランサ１６を備える。記憶部１０は、記憶機能およびデータ転送機能を有する複数のメモリノード１１を相互に接続した構成を備える。データ転送機能は、各メモリノード１１が効率的にパケットを転送する転送方式を備える。
【００１３】
図１において、記憶部１０は、複数のメモリノード１１に対してデータが分散して格納される。図１の例では、各メモリノード１１は、矩形格子の格子点に配置される。格子点の座標を座標（ｘ、ｙ）で示し、格子点に配置されるメモリノード１１の位置情報は、当該格子点の座標と対応してノードアドレス（ｘD、ｙD）で示されるものとする。また、図１の例では、左上隅に位置するメモリノード１１が原点のノードアドレス（０、０）を有し、各メモリノード１１を横方向（Ｘ方向）および縦方向（Ｙ方向）に移動することで、ノードアドレスが整数値で増減する。
【００１４】
各メモリノード１１は、それぞれ、２つ以上の入力ポート１２および２つ以上の出力ポート１３を備えている。各メモリノード１１は、隣接するメモリノード１１と、入力ポート１２および出力ポート１３を介して接続される。より具体的には、対向する２つの隣接するメモリノード１１は、互いの入力ポート１２および出力ポート１３を介して接続される。
【００１５】
また、各メモリノード１１は、２以上の異なる方向に隣接するメモリノード１１と接続される。例えば、図１において左上隅のノードアドレス（０、０）で示されるメモリノード１１は、Ｘ方向に隣接するノードアドレス（１、０）で表されるメモリノード１１と、Ｘ方向とは異なる方向であるＹ方向に隣接するノードアドレス（０、１）で表されるメモリノード１１と、それぞれ接続される。また、図１においてノードアドレス（１、１）で表されるメモリノード１１は、互いに異なる４の方向に隣接する、ノードアドレス（１、０）、（０、１）、（２、１）および（１、２）でそれぞれ示される４のメモリノード１１に接続される。以降、ノードアドレス（ｘD、ｙD）で表されるメモリノード１１を、メモリノード（ｘD、ｙD）と表記することがある。また、入力ポート１２および出力ポート１３を総称して入出力ポート１２、１３と表記することがある。
【００１６】
記憶部１０は、少なくとも１つのコネクションユニット１４を備える。コネクションユニット１４は、入力ポート１２および出力ポート１３を介してメモリノード１１に接続される。このとき、メモリノード１１同士の通信規格とコネクションユニット１４の通信規格とが異なる場合は、両者の間にアダプタを設けてもよい。図１の例では、コネクションユニット１４は、各メモリノード１１が配置される２次元の正方格子のｘ方向およびｙ方向それぞれの一方向の各端に、それぞれ接続されているが、これに限定されるものではない。
【００１７】
アプリケーションサーバ２から入力された要求は、スイッチ１５を介してロードバランサ１６に入力される。ロードバランサ１６は、各コネクションユニット１４の状態を調べ、処理に余裕があるコネクションユニット１４を選択する。そして、ロードバランサ１６は、スイッチ１５を操作して、選択したコネクションユニット１４に要求を転送する。
本実施例では、構成要素がスイッチ１５とロードバランサ１６の２つある場合を示しているが、スイッチ１５にロードバランサ１６の機能を内蔵させ、ロードバランサ１６を設けない構成であってもかまわない。
【００１８】
コネクションユニット１４は、メモリノード１１が転送したり実行したりすることが可能なパケットを生成し、生成したパケットを、自コネクションユニット１４に接続されているメモリノード１１に送信する。
【００１９】
パケットは、そのパケットを受信したメモリノード１１が所定の転送アルゴリズム（後述する）に基づいてルーティング先を決定することで、メモリノード１１間を転送されて、宛先のメモリノード１１に到達する。また、メモリノード１１は、転送アルゴリズムに基づいて、故障または混雑しているメモリノード１１を迂回するようにルーティング先を決定することができる。ここで、メモリノード１１の故障が特定の形状で生じている場合、同じメモリノード１１をパケットが循環してしまい、結果としてそのパケットにかかる処理がいつまでたっても完了しないという事態が発生する。また、コネクションユニット１４がパケットを送信してから応答を受信するまでの時間は、記憶部１０内を転送中および処理中のパケットの総数の増加に応じて増大する。これは、パケット数の増加により混雑が発生し、パケット転送を妨げるからである。パケットが同じメモリノード１１を循環したまま宛先のメモリノード１１に到達しない場合には、記憶部１０内に滞留するパケットが増加し、結果としてストレージ装置１全体のスループット性能が低下する。第１の実施形態によれば、パケットに、転送によって減少する寿命が記録され、寿命が所定値以下となった場合には、そのパケットは破棄される。
【００２０】
図２は、第１の実施形態のパケットの構成を説明する図である。パケットは、宛先のノードアドレス、送り元のノードアドレス、寿命、およびコマンド（命令）が記録されて構成される。即ち、コマンドには寿命が付加されている。
【００２１】
寿命は、コネクションユニット１４によって算出され、パケットに記録される。寿命は、例えば、パケットを生成したコネクションユニット１４からそのパケットの宛先のメモリノード１１までの最短経路における転送回数に基づいて算出される。例えば、寿命は、最短経路における転送回数に所定の定数を乗じて得られる、正の整数値である。メモリノード１１間の転送中に寿命が所定値（ここでは「０」）以下となった場合には、メモリノード１１によってそのパケットは破棄される。これにより、最短経路が短いパケットが不必要に長い時間だけ記憶部１０内に滞留したり、最短距離が長いパケットが故障したメモリノード１１を迂回することが出来なくなったりすることを防止することができる。
【００２２】
ここでは例として、寿命は転送回数に基づいて算出されるとしたが、これに限定されるものではない。例えば、ユーザー（人間）が定義した変数を寿命として設定する方式も考えられる。この方式では、寿命を算出する処理がないため、更なる演算負荷軽減が可能となる。
【００２３】
また、コネクションユニット１４は、コネクションユニット１４から最も離れているメモリノード１１までの最短経路における転送回数に基づいた算出値を固定値として持っておいて、その固定値を寿命としてパケットに付加するようにしてもよい。転送回数に基づいた算出値は、例えば初期化時またはメモリノード１１追加時などのタイミングにおいて算出されることが想定される。寿命を固定値とすることにより、コネクションユニット１４がパケットを受けるたびにパケット内の宛先を基に寿命を計算する処理を実行する必要が無くなり、コネクションユニット１４の演算負荷が軽減される。
【００２４】
なお、パケットは、アプリケーションサーバ２から受信した要求に応じて生成される。例えば、要求されたデータが複数に分割されて、分割されたデータが夫々異なる複数のメモリノード１１に分散して格納されている場合には、コネクションユニット１４は、分割されたデータの格納先のメモリノード１１を全て特定して、特定した全てのメモリノード１１から分割されたデータを読み出すためのパケットをメモリノード１１毎に生成する。例えば、コネクションユニット１４は、特定したメモリノード１１のノードアドレスを宛先のノードアドレスとしてパケットに記録し、自コネクションユニット１４が接続している最初にパケットを転送するメモリノード１１のノードアドレスを送り元のノードアドレスとしてパケットに記録する。また、コネクションユニット１４は、分割されたデータを読み出すコマンドをパケットに記録する。
【００２５】
図３は、コネクションユニット１４の構成の一例を示す図である。コネクションユニット１４は、データを処理するためのプロセッサに該当するマイクロプロセッサ（ＭＰＵ）１１０、主記憶となるランダムアクセスメモリ（ＲＡＭ）１２０、第１のインターフェース装置１４０、第２のインターフェース装置１５０を備える。第１のインターフェース装置１４０は、スイッチ１５と通信するためのものである。第２のインターフェース装置１５０は、メモリノード１１と通信をするためのものである。ＭＰＵ１１０、ＲＡＭ１２０、第１のインターフェース装置１４０および第２のインターフェース装置１５０は、互いにＢＵＳ１３０によって接続されている。ここで、第１のインターフェース装置１４０、および第２のインターフェース装置１５０は、それぞれ複数であってもかまわない。この他に、ＲＡＭ１２０とは異なる不揮発なメモリを有していてもかまわない。
【００２６】
ＭＰＵ１１０としては、例えばＡＲＭ製Ａ９またはＩｎｔｅｌ製のＣｏｒｅ  ｉ７などが適用可能である。この場合、ＢＵＳ２３０もＭＰＵ１１０に合わせて、それぞれＡＭＢＡ  ＢＵＳまたはＱＰＩ（Ｑｕｉｃｋ  Ｐａｔｈ  Ｉｎｔｅｒｃｏｎｎｅｃｔ）ＢＵＳ等が適用される。ＲＡＭ１２０としては、例えばＤＲＡＭなどの揮発性メモリが適用可能である。また、ＲＡＭ１２０として、ＭＲＡＭ、ＰｃＲＡＭ、またはＲＲＡＭ（登録商標）等も適用可能である。外部のネットワークとの間で通信を行うネットワーク通信部に相当する、第１のインターフェース装置１４０としては、例えばイーサネット（登録商標）、インフィニバンド、ファイバーチャネルといったネットワークインターフェースが適用可能である。また、第１のインターフェース装置１４０としては、ＰＣＩ  Ｅｘｐｒｅｓｓ、Ｕｎｉｖｅｒｓａｌ  ｓｅｒｉａｌ  ｂｕｓ、Ｓｅｒｉａｌ  ａｔｔａｃｈｅｄ  ＳＣＳＩなどの外部ＢＵＳ、あるいはストレージインターフェース等が適用可能である。また、第２のインターフェース装置１５０は、ＭＰＵ１１０がＢＵＳ１３０を通してメモリノード１１との通信を行うものである。
【００２７】
図４は、メモリノード１１の構成の一例を示す図である。メモリノード１１は、コントローラ２００と、不揮発メモリ３００とを備えている。不揮発メモリ３００は、ストレージを構成する。なお、ストレージを構成するメモリとしては、不揮発メモリ３００には、ＮＡＮＤフラッシュメモリ、ビットコストスケーラブルメモリ（ＢｉＣＳ）、磁気抵抗メモリ（ＭＲＡＭ）、相変化メモリ（ＰｃＲＡＭ）、および、抵抗変化型メモリ（ＲＲＡＭ（登録商標））等が適用可能である。
【００２８】
図５は、メモリノード１１の構成の別の例を示す図である。この例では、メモリノード１１は、一時記憶領域を提供するメモリであるＲＡＭ４００を新たに備えている。ＲＡＭ４００は、不揮発メモリ３００と比べて、速度やランダムアクセス性能、書換可能回数が優れるメモリを用いることが望ましい。なお、ＲＡＭ４００としては、例えば、ＤＲＡＭ、ＭＲＡＭ、ＰｃＲＡＭ、またはＲＲＡＭ（登録商標）等が採用可能である。
【００２９】
ＲＡＭ４００には、例えば、読み書き回数の多いメタ情報と呼ばれるデータが格納される。メタ情報の例としては、個々のメモリノード１１の記憶領域にマッピングされた論理的なアドレス（論理アドレス）と、不揮発メモリ３００またはＲＡＭ４００中における物理的なアドレス（物理アドレス）と、が異なる場合、相互を変換するためのテーブル情報が挙げられる。また、メタ情報の別の例としては、不揮発メモリ３００またはＲＡＭ４００に記録されたデータに関する、属性情報が挙げられる。また、図４および図５では、隣接したメモリノードへのインターフェースが４つの場合を示しているが、これに限定されるものではない。
【００３０】
図６は、コントローラ２００の構成の一例を示す図である。コントローラ２００は、０番から４番までのポート番号が夫々割り当てられた５つの入力ポート１２と、０番から４番までのポート番号が夫々割り当てられた５つの出力ポート１３と、Ｉ／Ｏブロック２０２、入力ポートバッファ２０３、出力ポートバッファ２０４を備えている。０番の入出力ポート１２、１３は、コネクションユニット１４とのデータ通信に用いられる。また、１〜４番の入出力ポート１２、１３はそれぞれ隣接するメモリノード１１とのデータ通信に用いられる。ここでは入力ポート１２および出力ポート１３が、それぞれ５つの場合を示しているが、これに限定されるものではない。
【００３１】
入力ポート１２からパケットが入力されると、そのパケットは入力ポートバッファ２０３に一時的に格納される。ルーティングコントローラ２０５が、パケットに記録された宛先のノードアドレスおよび送信元のノードアドレスと、そのメモリノード１１自身のノードアドレスと、接続先のメモリノード１１が故障または混雑しているか否かと、に基づいて、パケットのルーティング先を決定する。そして、ルーティングコントローラ２０５は、寿命の減算を行った後、マルチプレクサ（ＭＵＸ）２０６を切り替えて、適切な出力ポートバッファ２０４へとパケットを転送する。寿命の操作によって寿命が所定値以下となった場合には、ルーティングコントローラ２０５は、例えばそのパケットを転送せずに消去する。
【００３２】
なお、入力されたパケットが自分宛てのパケットだった場合は、パケットはコマンドプロセッサ２０７へと送られる。コマンドプロセッサ２０７は、ＳＲＡＭ２０８に対する読み書き、不揮発メモリ  Ｉ／Ｆ２１１を介した不揮発メモリ３００に対する読み書き、または、ＲＡＭ  Ｉ／Ｆ２１２を介したＲＡＭ４００に対する読み書き等、パケットに応じた処理を行う。例えばパケットがデータの読み出しコマンドである場合には、コマンドプロセッサ２０７は、不揮発メモリ３００またはＲＡＭ４００から該当のデータを読み出して、読み出したデータを含む新たなパケットを生成して、生成したパケットを出力ポートバッファ２０４に送信する。
【００３３】
Ｉ／Ｏブロック２０２の内部には、各入出力ポート１２、１３に対するエラー検出回路が設けられている。エラー検出回路は、データの送受信の最中に異常が発生した場合、ならびに、コントローラ２００、不揮発メモリ３００、またはＲＡＭ４００等に異常が発生した場合に、隣接したメモリノード１１に対してエラー情報を送信する。このことにより、隣接したメモリノード１１は、データの転送を行う前に、エラーを検出し、異常の生じたメモリノードとデータの送受信をしないようになる。コマンドプロセッサ２０７は、ステータスレジスタを介してエラー情報を認識することができる。
【００３４】
例えば、信号が来ていない状態は、エラーとして検出される。なお、コントローラ２００については、例えばＲＡＭ  Ｉ／Ｆ２１２を設けない構成であってもよい。
【００３５】
ＥＣＣ／ライダマイズ部２１３は、不揮発メモリ３００にデータが書き込まれる際に、書き込み対象のデータをランダマイズしたり、書き込み対象のデータに対してＥＣＣ符号を付加したりする。
【００３６】
図１を参照して、転送アルゴリズムについて説明する。メモリノード（０、０）に接続されているコネクションユニット１４が、メモリノード（２、２）に対してパケットを送る場合について説明する。本来的には、メモリノード（０、０）を出発地点とし、メモリノード（２、２）を目的地とし、出発地点から目的地までの最短経路をパケットが転送されるようにメモリノード１１のルーティングコントローラ２０５がルーティングを行う。最短経路とは、転送回数が最小となる経路であって、例えば、ノードアドレスが（０、０）、（１、０）、（１、１）、（１、２）、（２、２）で表される夫々のメモリノード１１をこの順番で転送される経路が該当する。
【００３７】
例えば、メモリノード（１、１）が故障または混雑していて、メモリノード（１、０）がメモリノード（１、１）にパケットを転送できない場合を想定する。この場合には、メモリノード（１、０）が、前述の最短経路を構成するメモリノード（１、１）よりも優先順位が低い、メモリノード（２、０）をルーティング先に選択する。これにより、メモリノード（１、０）からメモリノード（２、１）を経由して目的地に至るようにルーティングされる。なお、夫々のメモリノード１１は、Ｉ／Ｏブロック２０２に設けられたエラー検出回路によって、接続されているメモリノード１１が故障しているか否かを認識することができる。エラー検出回路はデータ転送の際にエラーを検出しても良いし、隣接ノードからエラー信号を受信することで検出してもよい。また、夫々のメモリノード１１は、出力ポートが混雑しているかどうかを認識することができる。例えば、出力ポートバッファ２０４に、送信されていないパケットが存在するか否かを判定することによって、接続先のメモリノード１１が混雑しているか否かを認識しても良いし、隣接ノードからビジー信号を受け取ることで認識してもよい。
【００３８】
なお、接続先のメモリノード１１のうちの最短経路を構成するメモリノード１１が複数存在する場合に、当該最短経路を構成するメモリノード１１のうちの何れに１位の優先順位を設定するかは任意である。また、３位以降の優先順位が設定されるようにしてもよい。
【００３９】
次に、第１の実施形態のストレージ装置１の動作を説明する。
【００４０】
図７は、ロードバランサ１６の第１の実施形態の動作を説明するフローチャートである。ロードバランサ１６は、アプリケーションサーバ２から要求を受信すると（Ｓ１）、記憶部１０を構成するコネクションユニット１４のうちから処理に余裕のあるコネクションユニット１４を１つ、選択する（Ｓ２）。そして、ロードバランサ１６は、ステップＳ２の処理によって選択したコネクションユニット１４に要求を転送する（Ｓ３）。ロードバランサ１６は、要求を転送後、要求に応じた応答、または、後述する破棄通知を待ち受ける。ロードバランサ１６は、コネクションユニット１４から応答を受信したか否かを判定する（Ｓ４）。応答を受信していない場合には（Ｓ４、Ｎｏ）、ロードバランサ１６は、破棄通知を受信したか否かを判定する（Ｓ５）。破棄通知を受信していない場合には（Ｓ５、Ｎｏ）、ロードバランサ１６は、ステップＳ４の判定処理を再び実行する。応答を受信した場合には（Ｓ４、Ｙｅｓ）、ロードバランサ１６は、応答をアプリケーションサーバ２に送信し（Ｓ６）、動作を終了する。
【００４１】
コネクションユニット１４から破棄通知を受信した場合には（Ｓ５、Ｙｅｓ）、ロードバランサ１６は、ステップＳ２にて選択したコネクションユニット１４と異なるコネクションユニット１４を１つ、選択する（Ｓ７）。そして、ロードバランサ１６は、ステップＳ７の処理によって選択したコネクションユニット１４に要求を転送する（Ｓ８）。ロードバランサ１６は、要求の転送後、コネクションユニット１４から応答を受信したか否かを判定する（Ｓ９）。応答を受信していない場合には（Ｓ９、Ｎｏ）、ロードバランサ１６は、破棄通知を受信したか否かを判定する（Ｓ１０）。破棄通知を受信していない場合には（Ｓ１０、Ｎｏ）、ロードバランサ１６は、ステップＳ９の判定処理を再び実行する。応答を受信した場合には（Ｓ９、Ｙｅｓ）、ステップＳ６の処理を実行し、動作を終了する。
【００４２】
再び破棄通知を受信した場合には（Ｓ１０、Ｙｅｓ）、ロードバランサ１６は、アプリケーションサーバ２にエラー通知を送信し（Ｓ１１）、動作を終了する。
【００４３】
図８は、コネクションユニット１４の第１の実施形態の動作を説明するフローチャートである。コネクションユニット１４において、第１のインターフェース装置１４０が要求を受信すると（Ｓ２１）、ＭＰＵ１１０は、パケットに宛先のノードアドレス、送り元のノードアドレス、およびコマンドを、受け付けた要求に応じて生成し、生成したこれらの情報をパケットに記録する（Ｓ２２）。そして、ＭＰＵ１１０は、ある算出値に基づいて寿命およびタイムアウト時間を算出する（Ｓ２３）。ある算出値とは、例えば、宛先のメモリノード１１と自コネクションユニット１４との最短経路の転送回数などが挙げられる。そして、ＭＰＵ１１０は、算出した寿命をパケットに記録する（Ｓ２４）。
【００４４】
続いて、ＭＰＵ１１０は、第２のインターフェース装置１５０に接続されているメモリノード１１にパケットを送信する（Ｓ２５）。ＭＰＵ１１０は、パケットの送信後、算出したタイムアウト時間が経過するまでの間、宛先のメモリノード１１からの応答を待ち受ける。ＭＰＵ１１０は、応答を受信したか否かを判定する（Ｓ２６）。応答を受信した場合には（Ｓ２６、Ｙｅｓ）、ＭＰＵ１１０は、受信した応答をロードバランサ１６に転送し（Ｓ２７）、コネクションユニット１４の動作が終了する。応答を受信していない場合には（Ｓ２６、Ｎｏ）、ＭＰＵ１１０は、パケットの送信後からタイムアウト時間が経過したか否かを判定する（Ｓ２８）。タイムアウト時間が経過していない場合には（Ｓ２８、Ｎｏ）、ＭＰＵ１１０は、ステップＳ２６の処理を再び実行する。タイムアウト時間が経過した場合には（Ｓ２８、Ｙｅｓ）、ＭＰＵ１１０は、タイムアウト処理として、破棄通知をロードバランサ１６に送信する（Ｓ２９）。そして、コネクションユニット１４の動作が終了する。
【００４５】
なお、ここではタイムアウトでロードバランサ１６に破棄通知を送信したが、後述する寿命切れパケットの受信によって、破棄通知を送信してもよい。また、要求の受信にロードバランサ１６を経由する説明をしたが、アプリケーションサーバ２やクライアントから直接コネクションユニット１４に要求を出しても構わない。また、ロードバランサ１６を介して要求を受けた際に、その応答を直接アプリケーションサーバ２やクライアントに返しても良い。
【００４６】
図９は、メモリノード１１の第１の実施形態の動作を説明するフローチャートである。メモリノード１１において、入力ポート１２がパケットを受信すると（Ｓ３１）、ルーティングコントローラ２０５は、パケットに記録された宛先のノードアドレスと自メモリノード１１のノードアドレスとを比較することによって、パケットの宛先が自メモリノード１１であるか否かを判定する（Ｓ３２）。パケットの宛先が自メモリノード１１である場合には（Ｓ３２、Ｙｅｓ）、ルーティングコントローラ２０５によってパケットがコマンドプロセッサ２０７に送信され、コマンドプロセッサ２０７は、受信したパケットに記録されたコマンドに応じた処理を実行する（Ｓ３３）。コマンドプロセッサ２０７は、処理を完了後、応答を生成する（Ｓ３４）。生成された応答は、コマンドプロセッサ２０７内のバッファ２０９に一時的に格納される。
【００４７】
なお、応答は、図２を用いて説明したパケットと同様の構成を備えていてよい。例えば、コマンドがリードコマンドである場合には、コマンドプロセッサ２０７は、不揮発メモリ３００からデータを読み出す。そして、コマンドプロセッサ２０７は、読み出したデータをコマンドの替りにパケットに記録する。コマンドがライトコマンドである場合には、コマンドプロセッサ２０７は、データを不揮発メモリ３００に書き込み、書き込み完了通知をコマンドの替わりにパケットに記録する。また、コマンドプロセッサ２０７は、応答の送り元のノードアドレスとして、入力されたパケットに記録された宛先のノードアドレス（即ち自メモリノード１１のノードアドレス）を記録し、応答の宛先のノードアドレスとして、入力されたパケットに記録された送り元のノードアドレスを記録する。なお、コマンドプロセッサ２０７は、応答に寿命を記録してもよいし、記録しなくてもよい。応答に記録される寿命は、例えば、コマンドプロセッサ２０７によってステップＳ２３の処理と同様の処理によって算出される。ここではデータのアクセス先が不揮発メモリ３００である場合について述べたが、ＳＲＡＭ２０８またはＲＡＭ４００がデータのアクセス先であってもかまわない。
【００４８】
ルーティングコントローラ２０５は、転送アルゴリズムに従って、ルーティング先のメモリノード１１を選択する（Ｓ３５）。そして、ルーティングコントローラ２０５は、バッファ２０９に格納された応答を、選択したルーティング先のメモリノード１１に送信する（Ｓ３６）。
【００４９】
パケットの宛先が自メモリノード１１ではない場合（Ｓ３２、Ｎｏ）、ルーティングコントローラ２０５は、パケットに設定されている寿命を１だけ減算する（Ｓ３７）。そして、ルーティングコントローラ２０５は、例えば寿命が「０」に等しいか否かを判定する（Ｓ３８）。寿命が「０」に等しい場合（Ｓ３８、Ｙｅｓ）、ルーティングコントローラ２０５は、パケットを破棄して（Ｓ３９）、メモリノード１１の動作が終了する。寿命が「０」に等しくない場合（Ｓ３８、Ｎｏ）、ルーティングコントローラ２０５は、転送アルゴリズムに従って、ルーティング先のメモリノード１１を選択する（Ｓ４０）。そして、選択したルーティング先のメモリノード１１にパケットを送信し（Ｓ４１）、メモリノード１１の動作が終了する。
【００５０】
図１０は、以上のような動作によって転送されるパケットの経路の例を説明する図である。メモリノード（０、４）を送り元とし、メモリノード（４、１）を宛先とするパケットを考える。パケットは、最短経路で転送される場合には、７回の転送で宛先のメモリノード（４、１）に到達する。このパケットは、例えば、寿命が「７」に設定されているものとする。ここでは、メモリノード（２、１）、メモリノード（２、４）、メモリノード（３、２）、およびメモリノード（３、３）が故障している。パケットは、これらの故障したメモリノード１１を迂回するために、例えば点線の矢印に示すようにルーティングされる。そして、このパケットは、７回の転送後、メモリノード（０、３）において寿命が「０」となり、破棄される。ここでは、寿命切れの際にパケットを破棄すると説明したが、パケットを破棄したメモリノード１１は、寿命が切れたことを通知しても良い。通知の方法としては、パケットを破棄したメモリノード１１が、寿命切れを示すパケットを生成して通知しても良いし、専用の通信経路を介して通知しても良い。この場合、夫々のメモリノード１１は専用の通信経路を持ち、専用の通信経路を介してコネクションユニット１４と直接繋がる構成となっている。また、専用の通信経路は、メモリノード故障やパケット転送失敗などのエラー情報を通知する経路、または、メモリノードの内部情報を通知する経路として使用してもかまわない。これにより、メモリノード内部のパケット数が増加しないため混雑が緩和できる。
【００５１】
なお、１回の転送あたりの寿命の減算量は、「１」であるものとして説明したが、転送にかかる時間が増加するに応じて増加してもよい。また、１回の転送あたりの寿命の減算量は、個別のメモリノード１１においてコマンドプロセッサ２０７またはルーティングコントローラ２０５が算出してもよい。また、所定の時間が経過した際に減算しても構わない。また、寿命は整数に限定されない。
【００５２】
また、図１では、各メモリノードが矩形格子の格子点に配置されるように示したが、各メモリノードの配置は、この例に限定されない。すなわち、格子の形状は、格子点に配置される各メモリノードが２以上の異なる方向に隣接するメモリノードと接続されればよく、例えば三角形、六角形などでもよい。また、図１では各メモリノードが２次元状に配置されているが、コントローラの入出力ポート１２、１３の数を夫々２つ増やして、各メモリノードを３次元的に配置しても構わない。３次元的にメモリノードを配置した場合は、メモリノードは（ｘ、ｙ、ｚ）の３つの値でその位置を指定することができる。
【００５３】
また、メモリノードが２次元的に配置される場合には、対辺に位置するメモリノード１１同士を接続することによって、メモリノード１１をトーラス状に接続するようにしてもよい。図１１で示した例では、メモリノード１１間は、実線で示す経路と点線で示す経路とで互いに接続されている。点線で示す経路は、実線で示す経路と等価である。このような場合、ノードアドレスのＸ座標値が増加する方向にルーティングするか減少する方向にルーティングするか、および／または、ノードアドレスのＹ座標値が増加する方向にルーティングするか減少する方向にルーティングするか、に応じて、複数の方向にルーティングすることが可能である。例えば、メモリノード（２、０）を送り元とし、メモリノード（２、３）を宛先とするパケットは、Ｙ座標値が増加する方向にルーティングされる場合には、例えば、ノードアドレスが（２、０）、（２、１）、（２、２）、（２、３）のメモリノード１１をこの順番で転送される。また、このパケットは、Ｙ座標値が減少する方向にルーティングされる場合には、例えば、ノードアドレスが（２、０）、（２、４）、（２、３）のメモリノード１１をこの順番で転送される。コネクションユニット１４は、自コネクションユニット１４に接続されたメモリノード１１を起点としたルーティング方向を決定し、決定した方向をパケットに記録するようにしてもよい。夫々のメモリノード１１においては、ルーティングコントローラ２０５は、パケットに記録された方向に基づいてルーティング先のメモリノード１１が接続された出力ポート１３を選択するようにしてもよい。また、コネクションユニット１４は、１つの方向を設定したパケットを送信して、送信後にステップＳ２８の判定処理においてタイムアウト時間の経過を検知すると、送信済みのルーティング方向とは異なる他のルーティング方向を記録したパケットを送信するようにしてもよい。また、コネクションユニット１４は、他のルーティング方向を記録したパケットを送信した後にステップＳ２８の判定処理においてタイムアウト時間の経過を検知した場合に、破棄通知をアプリケーションサーバ２側に送信するようにしてもよい。
【００５４】
また、ロードバランサ１６は、要求をコネクションユニット１４に転送した後に破棄通知を受信した場合に、転送先のコネクションユニット１４を変更して要求の転送を再び実行する。ロードバランサ１６は、転送を再び実行した後にさらに破棄通知を受信した場合に、エラー通知をアプリケーションサーバ２に送信するものとしたが、転送の再実行の回数は２以上であってもよい。
【００５５】
このように、第１の実施形態によれば、コネクションユニット１４は、寿命を算出して算出した寿命をパケットに記録する。各メモリノード１１のうちのパケットを受信したメモリノード１１は、パケットの宛先が自メモリノードではない場合、パケットに記録された寿命を減算する。そして、そのメモリノード１１は、減算後の寿命が所定値よりも小さい場合にはパケットを破棄する。また、そのメモリノード１１は、減算後の寿命が所定値よりも大きい場合にはパケットに記録された命令寿命を減算後の寿命で書き換えて自メモリノード１１に接続されている他のメモリノード１１に転送する。これにより、パケットが記憶部１０内に滞留するパケットの数を低減することができるので、滞留しているパケットに起因するスループット性能の低下を低減することができる。
【００５６】
また、パケットを受信したメモリノード１１は、パケットの宛先が自メモリノードである場合、パケットに記録されたコマンドを実行するとともにコマンドに応じた応答を送信する。コネクションユニット１４は、パケットを送信後に応答をタイムアウト時間内に受信しない場合には、タイムアウト処理を実行する。これにより、コネクションユニット１４は、パケットの破棄を検知することができる。
【００５７】
コネクションユニット１４は、ルーティング方向を指定可能であって、パケットを送信後に応答をタイムアウト時間内に受信しない場合には、ルーティング方向を変更して再びパケットを送信する。これにより、パケットの破棄の頻度を低減することが可能となる。また、ロードバランサ１６にかかる負荷を低減することができる。
【００５８】
また、ロードバランサ１６は、破棄通知を受信した場合、破棄通知を送信したコネクションユニットとは異なるコネクションユニットに要求を転送する。これにより、パケットの消失に起因する要求の不実行の発生頻度を低減することができる。
【００５９】
また、各メモリノード１１は、所定の転送アルゴリズムと、自メモリノードに接続されている他のメモリノードの状態（故障状態や入出力ポートのパケット占有情報など）と、に基づいて、自メモリノードに接続されている他のメモリノードのうちから転送先のメモリノード１１を一つ選択する。これにより、コネクションユニット１４は転送経路を決定しなくてもパケットを宛先のメモリノード１１に到達せしめることができる。
【００６０】
または、全メモリノード１１が寿命演算部を具備し（または全メモリノード１１の各コントローラ内で寿命を算出できるような処理を実行させる）、寿命演算部にて、パケットを受信したメモリノード１１にて寿命を算出するような構成にしてもかまわない。寿命演算部では宛先メモリノード１１の座標と自メモリノード１１の座標から最短距離を計算し、最短距離を基に寿命の算出を行う。
【００６１】
（第２の実施形態）
第２の実施形態では、データを書き込む要求がストレージ装置１に入力された場合を考える。図１２は、データを書き込む複数の要求がストレージ装置１に入力された場合を説明する図である。これらの要求に応じて、コネクションユニット１４によって、ライトコマンドを備える複数の異なるパケットが生成される。これらの要求が同一箇所にデータを書き込む書き込み要求であった場合、生成された夫々のパケットは、同一の宛先のメモリノード１１に到達する。ここで、これらのパケットは、同一のコネクションユニット１４によって生成されるとは限らない。また、これらのパケットは、夫々別個にルーティングされる。したがって、これらのパケットは、ストレージ装置１に書き込み要求が入力された順番で宛先のメモリノード１１に到達するとは限らない。宛先のメモリノード１１の到達順序によっては、後に書き込み要求されたデータを先に書き込み要求されたデータで上書きしてしまう事態が発生する。
【００６２】
そこで、第２の実施形態では、書き込み要求された順番に応じたバージョン情報が付加される。ここでは一例として、タイムスタンプがバージョン情報として使用されるものとする。
【００６３】
図１３は、コネクションユニット１４の第２の実施形態の動作を説明するフローチャートである。ロードバランサ１６から転送されてきた書き込み要求をコネクションユニット１４において第１のインターフェース装置１４０が受信すると（Ｓ５１）、ＭＰＵ１１０は、書き込み要求されたライトデータに、タイムスタンプをバージョン情報として付加する（Ｓ５２）。ライトデータは、書き込み要求とともに転送されてくる。バージョン情報の付加後、ＭＰＵ１１０は、ライトデータを書き込むためのライトコマンドをパケットに記録する（Ｓ５３）。そして、ＭＰＵ１１０は、パケットを第２のインターフェース装置１５０に接続されているメモリノード１１にパケットを送信し（Ｓ５４）、コネクションユニット１４の動作が終了する。
【００６４】
図１４は、メモリノード１１の第２の実施形態の動作を説明するフローチャートである。ここでは、ステップＳ５３によって生成されたパケットの宛先のメモリノード１１の動作を説明する。即ち、ルーティングの動作の説明を省略する。
【００６５】
パケットの宛先のメモリノード１１において、入力ポート１２がパケットを受信すると（Ｓ６１）、そのパケットはルーティングコントローラ２０５によってコマンドプロセッサ２０７に送られ、コマンドプロセッサ２０７は、ライトデータの書き込み先の記憶領域にデータが存在するか否かを判定する（Ｓ６２）。ライトデータの書き込み先にデータが存在するか否かは、例えば、個々のメモリノード１１が備える記憶領域にマッピングされた論理アドレスと、不揮発メモリ３００における物理アドレスとを相互に変換するテーブル情報を参照することによって判断可能である。即ち、ライトコマンドは、ライトデータの書き込み先の論理アドレスを含む。そして、テーブル情報は、不揮発メモリ３００に書き込まれている有効なデータ毎に論理アドレスと物理アドレスとを対応付けるエントリを備えている。コマンドプロセッサ２０７は、ライトコマンドに含まれる論理アドレスを検索キーとしてテーブル情報を検索し、検索によってエントリが抽出されたか否かを判定することによって、ライトデータの書き込み先にデータが存在するか否かを判定することができる。なお、テーブル情報は、例えばＲＡＭ４００に展開され、逐次更新される。以降、テーブル情報を、Ｌ２Ｐテーブルと表記することがある。
【００６６】
ライトデータの書き込み先にデータが存在する場合には（Ｓ６２、Ｙｅｓ）、コマンドプロセッサ２０７は、ライトデータに付加されたバージョン情報は書き込み先に存在するデータに付加されたバージョン情報よりも新しいか否かを判定する（Ｓ６３）。書き込み先に存在するデータのほうがライトデータよりもバージョン情報が新しい場合には（Ｓ６３、Ｎｏ）、コマンドプロセッサ２０７は、ライトコマンドを実行しないで（Ｓ６４）、メモリノード１１の動作が終了する。
【００６７】
ライトデータの書き込み先にデータが存在しない場合（Ｓ６２、Ｎｏ）、または、ライトデータのほうが書き込み先に存在するデータよりもバージョン情報が新しい場合（Ｓ６３、Ｙｅｓ）、コマンドプロセッサ２０７は、ライトコマンドを実行する（Ｓ６５）。即ち、コマンドプロセッサ２０７は、ライトデータを不揮発メモリ３００に書き込む。ステップＳ６５の後、メモリノード１１の動作が終了する。
【００６８】
このように、メモリノード１１においては、既に書き込み先に存在するデータよりもバージョン情報が新しいライトデータを書き込むようにしているので、後に要求されたデータを先に要求されたデータで上書きするような事態の発生が防止される。
【００６９】
なお、後に書き込み要求されたデータを先に書き込み要求されたデータで上書きすることを防止するために、ストレージ装置１のインターフェース近傍にライトデータの整合性を集中管理するＣＰＵを設けることが考えられる。この場合、書き込み要求が短時間に多く入力されると、そのＣＰＵの負荷が増大するため、ストレージ装置１全体の書き込み性能が低下する。これに対し、第２の実施形態によれば、データの整合性の管理は、個々のメモリノード１１において分散して実行されるので、書き込み性能の低下を低減することができる。
【００７０】
また、そのＣＰＵが、書き込み要求が実行完了するまで書き込み先をロックすることが考えられるが、その場合には、要求毎に書き込み先がロックされるので、オーバヘッドが大きい。第２の実施形態によれば、直前に入力された要求の実行が完了する前に次の要求が受け付けられてコネクションユニット１４に転送されるので、オーバヘッドの増大なくデータの整合性を担保することが可能となる。
【００７１】
また、以上の説明においては、メモリノード１１において、ライトコマンドを受信する毎に、不揮発メモリ３００に既に書き込まれたデータとの間でバージョン情報の比較が実行されるとして説明した。一時記憶領域（例えばＲＡＭ４００）にライトデータをバッファするように構成されている場合には、コマンドプロセッサ２０７は、書き込み先が同一のライトデータを当該バッファに蓄積しておき、蓄積しておいたライトデータのうちの最もバージョン情報が新しいライトデータを所定のタイミングで不揮発メモリ３００に書き込むようにしてもよい。即ち、コマンドプロセッサ２０７は、書き込み要求された順番が最も後のライトデータで、書き込み先にすでに格納されているデータを上書きする。このように構成されることによって、ストレージ装置１が例えばデータベースを構成する場合に、当該バッファから不揮発メモリ３００に書き込む前であれば、ロールバックを行うことが可能となる。なお、所定のタイミングとは、例えばデータベースでのコミットなど、データが確定した際に発行するフラッシュコマンド（バッファ上のデータをメモリに書き込むコマンド）を受信したタイミングであってよい。これにより、コネクションユニット１４は、任意のタイミングでデータの上書きを実行することができるようになる。フラッシュコマンドは、例えば電源オフ時にもコネクションユニット１４からメモリノード１１へ送信される。
【００７２】
また、以上の説明においては、タイムスタンプをバージョン情報とするとして説明したが、バージョン情報はタイムスタンプに限定されない。例えば、ストレージ装置１が要求を入力される毎に、例えばロードバランサ１６が入力された順番に連番となる識別番号を付与する。そして、コネクションユニット１４においては、受信した要求に付与された識別番号をバージョン情報とする。また、連番となる識別番号の発行をストレージ装置１内のデータを書き込むメモリノード１１以外のメモリノード１１に担わせても良い。これは、担当するメモリノード１１において所定のメモリ上の変数に１足す命令が排他的に実行されることで実現が可能である。この場合、担当するメモリノード１１への到達の順に識別番号が割り振られることになる。こうすることで、異なるコネクションユニット１４間で時刻を同期するのが困難な状況でも、バージョン管理を行うことが可能となる。
【００７３】
このように、第２の実施形態によれば、コネクションユニット１４は、書き込み要求された第１データを、書き込み要求された順番に少なくとも応じたバージョン情報を付加してメモリノード１１に送信する。第１データの宛先のメモリノード１１は、自メモリノードが第１データと異なる第２データが存在する場合、第１データは書き込み要求された順番が第２データよりも後であるか否かを夫々のバージョン情報の比較に基づいて判定する。第１データは書き込み要求された順番が第２データよりも後である場合、メモリノード１１は、第２データを第１データで上書きする。第１データは書き込み要求された順番が第２データよりも前である場合、第２データを第１データで上書きしない。これにより、後に書き込み要求データを先に書き込み要求されたデータで上書きする事態の発生を防止することができるので、データの整合性が担保される。
【００７４】
（第３の実施形態）
複数のハードディスク装置を備えるディスクアレイ装置が知られている。このようなディスクアレイ装置にデータを分散格納する技術として、ＲＡＩＤ（Ｒｅｄｕｎｄａｎｔ  Ａｒｒａｙ  ｏｆ  Ｉｎｄｅｐｅｎｄｅｎｔ  Ｄｉｓｋｓ）と呼ばれる技術が知られている。ＲＡＩＤによれば、複数のハードディスク装置が１つの記憶装置として扱われることによって、アクセス処理のパフォーマンスおよび信頼性の向上が実現される。
【００７５】
第３の実施形態では、ストレージ装置１にＲＡＩＤ（例えばＲＡＩＤレベル５）が適用される。即ち、ストレージ装置１は、所定量のデータからパリティを生成し、データとパリティとを複数のメモリノード１１に対して分散して格納する。ここでは、ストレージ装置１は、書き込み要求されたデータ（第１データ）Ｄｉ（ｉは自然数）を、例えば２つのデータ（第２データ）Ｄｉａ、Ｄｉｂに分割し、Ｄｉａ、Ｄｉｂに基づいてパリティ（パリティデータ）Ｐｉを生成し、Ｄｉａ、Ｄｉｂ、Ｐｉを、夫々異なるメモリノード１１に格納する。なお、パリティＰｉは、例えば水平パリティであってよい。また、分割数は２であるとしているが、３以上であってもよい。また、分割したパケットにビットエラーの検出や訂正が可能な符号を付加しても構わない。
【００７６】
アドレスのマッピングについて説明する。書き込み要求は、ストレージ装置１が備える記憶領域全体にマッピングされたアドレス（以降、グローバルアドレス）を用いて書き込み先を指定する。ストレージ装置１内においては、コネクションユニット１４は、夫々のメモリノード１１をノードアドレスを用いて指定し、指定したメモリノード１１が備える記憶領域のうちの書き込み位置をその記憶領域内の範囲でユニークな論理アドレスを用いて指定する。論理アドレスは、夫々のメモリノード１１において、記憶領域内の物理的な位置（物理アドレス）と対応づけられている。
【００７７】
ここで、論理アドレスと物理アドレスとの対応関係は固定されていてもよいし、固定されていなくてもよい。一般的なＮＡＮＤフラッシュメモリは、ウェアレベリングと呼ばれる処理を実行する。ウェアレベリングは、データの書き込み位置を均等に分散させることによって、ブロック間の書き込み／消去回数のばらつきを低減させる処理である。ウェアレベリングが実行される場合には、論理アドレスと物理アドレスとの対応関係は逐次変化する。論理アドレスと物理アドレスとの対応関係は、Ｌ２Ｐテーブルに保持される。Ｌ２Ｐテーブルは、対応関係の変化に応じて逐次更新される。ここでは、夫々のメモリノード１１は、例えばＲＡＭ４００にＬ２Ｐテーブルを展開して、当該Ｌ２Ｐテーブルを用いて論理アドレスと物理アドレスとの間の変換を実行するものとする。また、Ｌ２Ｐテーブルは、所定サイズの記憶領域毎に対応関係を保持するものとする。なお、Ｌ２Ｐテーブルに対応関係が記録される単位記憶領域を物理セクタと表記する。即ち、論理アドレスは、物理セクタの先頭の物理アドレスに対応する。なお、物理セクタは、ＮＡＮＤフラッシュメモリのリード／ライトの単位であるページと等しくてもよいし、等しくなくてもよい。なお、ブロックは、消去の単位であって、複数のページを備えて構成される。また、Ｌ２Ｐテーブル全体を不揮発メモリ３００に格納しておき、必要に応じて一部をＲＡＭ４００などに展開してから論理アドレスを物理アドレスに変換してもかまわない。また、メモリノード１１のノードアドレスに関しても、論理アドレスと物理アドレスを設定し、対応関係を逐次変化させてもかまわない。これにより、複数のＮＡＮＤフラッシュメモリで構成されたシステムにおいて、異なるＮＡＮＤフラッシュメモリ間でのウェアレベリングを実行することで、システム全体として摩耗を平滑化することが可能となる。
【００７８】
次に、Ｄｉａ、ＤｉｂおよびＰｉの書き込み位置が決定されるアルゴリズムを説明する。Ｄｉａ、ＤｉｂおよびＰｉは、夫々物理セクタのサイズ（第１サイズ）よりも小さいサイズ（第２サイズ）を有する。より詳しくは、ここでは、Ｄｉａ、ＤｉｂおよびＰｉのサイズは、物理セクタのサイズの３分の１のサイズを有する。物理セクタを３等分して得られる物理的な単位記憶領域を、サブセクタと表記する。データＤｉから生成されたＤｉａ、ＤｉｂおよびＰｉは、夫々異なるメモリノード１１の同一の論理アドレスに書き込み先に決定される。厳密には、論理アドレスが示す物理セクタのうちの先頭のサブセクタがＤｉａの書き込み位置に決定される。また、論理アドレスが示す物理セクタのうちの中央のサブセクタがＤｉｂの書き込み位置に決定される。また、論理アドレスが示す物理セクタのうちの末尾のサブセクタがＰｉの書き込み位置に決定される。パケットにおいては、サブセクタの先頭は、そのサブセクタが属する物理セクタの先頭の物理アドレスに対応する論理アドレスとその物理セクタの先頭からのオフセット値とを用いて表現される。
【００７９】
Ｄｉａ、Ｄｉｂ、およびＰｉの書き込み先のメモリノード１１は、メモリノード１１間の関係を定義する予め定められた規則に基づいて決定される。予め定められた規則とは、ＲＡＩＤを適用による複数のメモリノード１１への格納方式であり、たとえばコネクションユニット１４に定義されていて、システムの構成時に、ユーザーが要求する性能や信頼性に応じた設定がなされている。ここでは、Ｄｉａの書き込み先のメモリノード１１と、Ｄｉｂの書き込み先のメモリノード１１と、Ｐｉの書き込み先のメモリノード１１とは、Ｘ座標値またはＹ座標値が夫々異なるように決定される。例えば、Ｄｉａの書き込み先のメモリノード１１をメモリノード（ｘｉａ、ｙｉａ）に決定された場合には、Ｄｉ２の書き込み先のメモリノード１１はメモリノード（ｘｉａ＋１、ｙｉａ＋１）、Ｐｉの書き込み先のメモリノード１１はメモリノード（ｘｉａ＋２、ｙｉａ＋２）に夫々決定されるように、規則が定められているものとする。
【００８０】
図１５は、データの格納例を説明する概念図である。Ｄｉａ、Ｄｉｂ、Ｐｉを書き込むためのパケットを、夫々、パケットｉａ、パケットｉｂ、パケットｉｃと表記する。ここでは、サブセクタのサイズを２５６Ｂとし、物理セクタのサイズを７６８Ｂとしている。本図は、データＤ０の格納先の例を示している。
【００８１】
図１５に示す例によれば、Ｄ０から生成されたＤ０ａ、Ｄ０ｂ、Ｐ０は、夫々、メモリノード（１、１）、メモリノード（２、２）、メモリノード（３、３）に格納される。Ｄ０ａを書き込むためのパケット０ａは、Ｄ０ａと、ノードアドレス（１、１）と、論理アドレスＬＡ０と、オフセット値「０」とが記録されている。Ｄ０ｂを書き込むためのパケット０ｂは、Ｄ０ｂと、ノードアドレス（２、２）と、論理アドレスＬＡ０と、オフセット値「２５６」とが記録されている。Ｐ０を書き込むためのパケット０ｃは、Ｐ０と、ノードアドレス（３、３）と、論理アドレスＬＡ０と、オフセット値「５１２」とが記録されている。
【００８２】
パケット０ａを受信したメモリノード（１、１）においては、メモリノード（１、１）内において独自に保守管理されるＬ２Ｐテーブル３０１に基づいてＬＡ０が物理アドレスＰＡ０ａに変換される。ＰＡ０ａは、メモリノード（１、１）の記憶領域が構成する物理アドレス空間３０２のうちの特定の物理セクタの先頭位置を示している。そして、不揮発メモリ３００におけるＰＡ０ａが示す物理セクタの先頭からオフセット値「０」だけオフセットした位置にＤ０ａが書き込まれる。同様に、パケット０ｂを受信したメモリノード（２、２）においては、メモリノード（２、２）内において独自に保守管理されるＬ２Ｐテーブル３０１に基づいてＬＡ０が物理アドレスＰＡ０ｂに変換される。ＰＡ０ｂは、メモリノード（２、２）の記憶領域が構成する物理アドレス空間３０２のうちの特定の物理セクタの先頭位置を示している。そして、不揮発メモリ３００におけるＰＡ０ｂが示す物理セクタの先頭からオフセット値「２５６」だけオフセットした位置にＤ０ｂが書き込まれる。Ｐｉに関しても、同様の手順により書き込み先の物理位置が決定される。
【００８３】
なお、グローバルアドレスと、ノードアドレスおよび論理アドレスと、の間の関係は任意である。例えば、グローバルアドレスの上位桁とＤｉａの書き込み先のメモリノード１１のノードアドレスとが一対一に対応し、グローバルアドレスのうちの下位桁が論理アドレスＬＡｉとして用いられるように構成されてもよい。また、グローバルアドレスの上位桁の前半部分がノードアドレスのＸ座標値に対応し、グローバルアドレスの上位桁の後半部分がノードアドレスのＹ座標値に対応するように構成されてもよい。Ｄｉａの書き込み先のメモリノード１１のノードアドレスが決定されれば、ＤｉｂおよびＰｉの書き込み先のメモリノード１１のノードアドレスが自動的に定まる。
【００８４】
図１６は、データの格納例を説明する別の概念図である。この図は、メモリノード１１毎に、メモリノード１１が備える記憶領域が構成する論理アドレス空間を示している。Ｄ１ａは、メモリノード（１、２）に格納され、Ｄ２ａは、メモリノード（１、３）に格納され、Ｄ３ａは、メモリノード（２、０）に格納されている。このように、１つの物理セクタが備える３つのサブセクタには、夫々異なるデータから生成されたデータ（分割されて生成されたデータ、または、パリティデータ）が格納される。
【００８５】
なお、分割数をＮとすると、物理セクタは、サブセクタのサイズのＮ倍のサイズを有し、Ｄｉは、サブセクタのサイズのＮ−１倍のサイズを有する。即ち、ストレージ装置１は、サブセクタのサイズのＮ−１倍のサイズのデータ毎に、論理アドレスが指定された書き込みの要求を処理することができる。論理アドレスが指定された、サブセクタのサイズのＮ−１倍のサイズの論理的な単位記憶領域を論理セクタと表記する。なお、書き込みを要求されたデータのサイズが論理セクタのサイズを超える場合には、要求されたデータがロードバランサ１６またはコネクションユニット１４において論理セクタ毎に分割された後に、論理セクタ毎のデータがさらにコネクションユニット１４においてサブセクタ単位のデータに分割されてもよい。
【００８６】
図１７は、コネクションユニット１４の第３の実施形態の動作を説明するフローチャートである。ここでは、コネクションユニット１４が、Ｄｉを書き込む要求に基づいてパケットｉａ〜パケットｉｃを生成する動作を説明する。
【００８７】
まず、ＭＰＵ１１０は、Ｄｉをサブセクタ単位のデータＤｉａ、Ｄｉｂに分割する（Ｓ７１）。そして、ＭＰＵ１１０は、Ｄｉａ、Ｄｉｂに基づいてパリティＰｉを生成する（Ｓ７２）。そして、ＭＰＵ１１０は、Ｄｉの書き込み先のグローバルアドレスに基づいて、Ｄｉａの書き込み先のノードアドレス（ｘｉａ、ｙｉａ）を算出する（Ｓ７３）。
【００８８】
続いて、ＭＰＵ１１０は、Ｄｉｂの書き込み先のノードアドレス（ｘｉｂ、ｙｉｂ）およびＰｉの書き込み先のノードアドレス（ｘｉｃ、ｙｉｃ）を算出する（Ｓ７４）。ここでは例えば、ｘｉｂはｘｉａに１を加算して得られる値であり、ｘｉｃはｘｉａに２を加算して得られる値であり、ｙｉｂはｙｉａに１を加算して得られる値であり、ｙｉｃはｙｉａに２を加算して得られる値である。
【００８９】
なお、Ｘ方向に配列されたメモリノード１１の個数を値ＮＸ、Ｙ方向に配列されたメモリノード１１の個数を値ＮＹとする。ステップＳ７４の処理において、書き込み先のＸ座標値がＮＸを越える場合には、その座標値から例えばＮＸ−１を減算した値を書き込み先のＸ座標値としてよい。また、書き込み先のＹ座標値がＮｙを越える場合には、その座標値から例えばＮｙ−１を減算した値を書き込み先のＹ座標値としてもかまわない。
【００９０】
続いて、ＭＰＵ１１０は、Ｄｉａ、書き込み先の論理アドレスＬＡｉ、オフセット値「０」、宛先のメモリノードのノードアドレス（ｘｉａ、ｙｉａ）を記録したパケットｉａを生成する（Ｓ７５）。また、ＭＰＵ１１０は、Ｄｉｂ、書き込み先の論理アドレスＬＡｉ、オフセット値「２５６」、宛先のメモリノードのノードアドレス（ｘｉｂ、ｙｉｂ）を記録したパケットｉｂを生成する（Ｓ７６）。また、ＭＰＵ１１０は、Ｐｉ、書き込み先の論理アドレスＬＡｉ、オフセット値「５１２」、宛先のメモリノードのノードアドレス（ｘｉｃ、ｙｉｃ）を記録したパケットｉｃを生成する（Ｓ７７）。ステップＳ７７の処理の後、パケットが生成される動作が終了となる。
【００９１】
図１８は、メモリノード１１の第３の実施形態の動作を説明するフローチャートである。ここでは、パケットｉｂの宛先のメモリノード（ｘｉｂ、ｙｉｂ）が当該パケットｉｂを処理する動作を説明する。コマンドプロセッサ２０７は、Ｌ２Ｐテーブル３０１を参照することによってＬＡｉをＰＡｉｂに変換する（Ｓ８１）。そして、コマンドプロセッサ２０７は、ＰＡｉｂからオフセット値「２５６」だけオフセットした位置に、Ｄｉｂを書き込む（Ｓ８２）。そして、パケットｉｂに応じた動作が終了となる。ここで、書き込みを行った際にサブセクタが有効になったことを示すビットを立てても良い。このような有効を示すビットマップがあると、チップ間で全データのコピーや移動の際に、有効なデータのみの転送を行うことが可能となり、処理時間を軽減できる。また、データの書き込み要求を受け取ったメモリノード１１はデータを書き込むと説明したが、ランダムアクセス性能に優れたＲＡＭなどで構成されたバッファにためても良い。バッファのデータは、フラッシュコマンドによって不揮発メモリ３００に書き込まれても良いし、不揮発メモリ３００の書き込み単位がそろった段階で自動的に書き込まれても良い。
【００９２】
このように、第３の実施形態によれば、各メモリノード１１は、物理セクタを複数備える。コネクションユニット１４は、書き込み要求された第１データを物理セクタよりもサイズが小さいサブセクタ毎の第２データに分割して、夫々の第２データを夫々異なるメモリノード１１の物理セクタに書き込む。ここで、コネクションユニット１４は、第２データ毎の書き込み位置を、物理セクタの先頭位置と、当該先頭位置からのサブセクタ単位の、第２データ毎に異なるオフセット値と、を用いて指定する。これにより、各メモリノード１１は、物理セクタ単位で論理アドレスと物理アドレスとの対応関係を管理するだけで、物理セクタよりも小さい、コネクションユニット１４から指定されたサブセクタを特定することができる。サブセクタ単位で対応関係を管理する場合に比べて、Ｌ２Ｐテーブル３０１のサイズを削減することができる。即ち、Ｌ２Ｐテーブル３０１のサイズの増加を抑制しつつ、より小さい記憶領域毎の読み書きの管理を行うことが可能となる。
【００９３】
また、複数のメモリノードが、列毎または行毎に夫々異なる、着脱可能なプリント基板に配設されて構成される場合がある。コネクションユニット１４は、行または列が重複しないように第２データおよびパリティデータの書き込み先のメモリノード１１を決定するので、１つのプリント基板が故障して換装される場合があったとしても、他のプリント基板に搭載されたデータに基づいて、交換前のプリント基板に搭載されていたメモリノード１１の記憶内容を交換後のプリント基板に搭載されているメモリノード１１に再構築することが可能となる。また、プリント基板上のメモリノードは列または行を成していなくても構わない。この場合、分割したデータの書き込み先メモリノードを決める際、異なるプリント基板上のメモリノードで組を作ることが望ましい。
【００９４】
なお、任意のデータＤｉが格納されるメモリノード１１をロックすることが可能となるようにストレージ装置１が構成される場合がある。Ｄｉａ、Ｄｉｂ、およびＰｉの書き込み先のメモリノード１１がランダムに決定される場合には、Ｄｉａ、Ｄｉｂ、およびＰｉの書き込み先のメモリノード１１が全て同時にロックされる必要がある。複数のコネクションユニット１４からの書き込みの際など、ひとつのコネクションユニット１４がＤｉａ、Ｄｉｂ、およびＰｉの書き込み先のメモリノード１１が全て同時にロックできない場合に、ロックの取り合いが発生し、制御が破綻する。第３の実施形態では、コネクションユニット１４は、メモリノード１１間の関係を定義する所定の規則に基づいて第２データ毎の書き込み先のメモリノードを決定する。したがって、例えば、コネクションユニット１４は、分割されて生成された第２データのうちの先頭のデータであるＤｉａが格納されているメモリノード１１のみをロックするだけで、Ｄｉｂ、Ｐｉが格納されているメモリノード１１もロックされたものとして扱うことができる。即ち、３つのメモリノード１１を同時にロックしなくても、３つのメモリノード１１がロックされたものとして扱われるので、ロックの取り合いの発生を防止することができる。
【００９５】
なお第３の実施形態では、例としてＲＡＩＤレベル５を用いて説明したが、ＲＡＩＤレベル０（ストライピング）のようにパリティを生成しない方式であってもかまわない。
【００９６】
（第４の実施形態）
図１９は、第４の実施形態のパケットの構成を説明する図である。第４の実施形態のパケットは、先頭および末尾に「Ｓｉｇｎａｔｕｒｅ」を備える。先頭の「Ｓｉｇｎａｔｕｒｅ」はシリアルデータの受信開始のために使用される。末尾の「Ｓｉｇｎａｔｕｒｅ」は、送信側のエラー情報（バッファのパリティチェック）を伝える。パリティエラーが見つかった場合、再送処理が行われる。
【００９７】
「Ｆｒａｍｅ  Ｓｉｚｅ」はペイロード（第１ペイロード）のサイズを表す。「Ｆｒａｍｅ  Ｓｉｚｅ」に記録される数値の単位は例えばＢ（Ｂｙｔｅ）であり、当該数値にはＳｉｇｎａｔｕｒｅ部分のサイズは含まれない。「ＣＭＤ」には、コントローラ２００に実行させるコマンドの種類の識別番号（コマンド番号）が記録される。「ＳＲＣ」は、送り元のメモリノード１１のノードアドレスを、「ＤＳＴ」は、宛先のメモリノード１１のノードアドレスを、夫々表す。「ＳＲＣ」および「ＤＳＴ」の添え字である「Ｘ」、「Ｙ」はそれぞれノードアドレスのＸ座標、Ｙ座標を表す。なお、相対的なノードアドレスが使用可能な場合は、「ＤＳＴ」には必ずしも宛先の絶対座標が用いられなくてもよい。
【００９８】
「ＥＲＲ」はエラー通知などの通知先が記録される。また、上りのパケット（コネクションユニット１４からメモリノード１１に向かうパケット）において、「ＳＲＣ」に記録されたノードアドレスが壊れた場合、または、下りのパケット（メモリノード１１からコネクションユニット１４に向かうパケット）において、「ＤＳＴ」に記録されたノードアドレスが壊れた場合、「ＥＲＲ」に記録された値を使うことで修復が可能となる。
【００９９】
「ＰＯＲＴ」は、パケットを投入したコネクションユニット１４の方向を表す情報としてのポート番号が記録される。応答のパケットが、応答の元となったパケットの送り元のメモリノード１１まで戻った場合、送り元のメモリノード１１は、コネクションユニット１４がつながっている出力ポートを「ＰＯＲＴ」に記録された値を用いて特定する。そして、送り元のメモリノード１１は、特定した出力ポートに応答のパケットを転送する。
【０１００】
「ＬＩＦＥ」は、パケットの寿命を表す。寿命は、転送毎に、および、渋滞によってパケットが詰まる毎に、「１」だけ減じられる。「ＬＩＦＥ」に記録された値が「０」に等しくなった場合、そのパケットは破棄される。なお、既存のメモリノード１１に新規のメモリノード１１が新たに接続された場合、既存のメモリノード１１は新規のメモリノード１１に対し、ノードアドレスを設定する座標設定コマンドを送信する。座標設定コマンドのパケットにおける「ＬＩＦＥ」には、例えば「１」が設定される。座標設定コマンドに対する応答のパケットには、例えば距離（｜ＤＳＴ_Ｘ−ＳＲＣ_Ｘ｜＋｜ＤＳＴ_Ｙ-ＳＲＣ_Ｙ｜）の４倍の値が設定される。
【０１０１】
「ＣＭＤ  ｏｐ.」にはコマンドの引数が記録される。「ＣＲＣ」にはヘッダ部分（Ｆｒａｍｅ  Ｓｉｚｅ〜ＣＭＤ  ｏｐ.）のＣＲＣ８値が記録される。この値は、ヘッダ部分のエラーを検出できれば、他の値でも構わない。ペイロードにはデータまたはエラー情報が記録される。
【０１０２】
不揮発メモリ３００に書き込まれるデータは、所定サイズ（ここでは８ｂｉｔ）の単位データ毎に分割されてランダマイズされる。ランダマイズされた８ｂｉｔの単位データは、３ｂｉｔのランダマイズ情報が付加される。なお、単位データは、ランダマイズ情報が付加された後に、ＥＣＣ符号がさらに付加される場合がある。
【０１０３】
図２０は、ランダマイズの処理を説明する図である。なお、ここでは、ランダマイズの対象の８ｂｉｔのデータを、「ａ」から「ｈ」まで配列されたアルファベット列（即ち「ａｂｃｄｅｆｇｈ」）で表記する。夫々のアルファベットは、ランダマイズの対象の８ｂｉｔのデータを構成する１ｂｉｔのデータである。また、ランダマイズ情報を構成する夫々のビットを「ｘ」、「ｙ」、「ｚ」と表記する。
【０１０４】
まず、「ｘ」、「ｙ」、「ｚ」に、夫々、「ｃ」、「ｅ」、「ｇ」を反転した値が代入される（Ｓ９１）。先頭の連続する３ビットである「ａ」、「ｂ」、「ｃ」が全て同じ値である場合（即ち「ａ」、「ｂ」、「ｃ」の全てが「１」であるか、または「ａ」、「ｂ」、「ｃ」の全てが「０」である場合）、「ｂ」及び「ｘ」の値がともに反転される（Ｓ９２）。そして、中央部分の連続する３ビットである「ｃ」、「ｄ」、「ｅ」が全て同じ値の場合、「ｄ」及び「ｙ」の値がともに反転される（Ｓ９３）。そして、末尾の連続する３ビットである「ｅ」、「ｆ」、「ｇ」が全て同じ値である場合、「ｆ」及び「ｚ」の値がともに反転される（Ｓ９４）。そして、「ａｂｃｄｅｆｇｈ」と「ｘｙｚ」とがマージされ（Ｓ９５）、ランダマイズ後のデータである「ａｂｃｘｄｅｙｆｇｚｈ」が生成される。
【０１０５】
なお、ランダマイズ後のデータ「ａｂｃｘｄｅｙｆｇｚｈ」の復号化（以下、ランダマイズ復号化）の際には、「ｃ」の値と「ｘ」の値とが比較され、双方の値が同じであれば「b」の値が反転される。同様に、「ｅ」の値と「ｙ」の値との比較と、「ｇ」の値と「ｚ」の値との比較とが実行されることによって、ランダマイズされたデータがランダマイズ前のデータに復号化される。
【０１０６】
前述のように、ヘッダ部分において、ＣＲＣ８値が「ＣＲＣ」に記録される。「ＣＲＣ」に記録された値に基づいて通信によって発生するエラーの検出が実行される。ペイロードにデータが記録される際には、そのデータがＥＣＣ符号とともに記録される。ペイロードに記録されたデータに対し、そのデータに付加されたＥＣＣ符号に基づいて、通信によって発生するエラーの検出および訂正が実行される。ＥＣＣ符号としては、例えば（１５、１１）ＢＣＨ符号が用いられる。この場合、ＮＡＮＤフラッシュメモリへの書き込みの際に、読み出しの際に発生するエラーを検出したり訂正したりするために、ランダマイズ情報を含む１１ｂｉｔの単位データに、さらにＥＣＣ符号４ｂｉｔの冗長ビットが付加される。
【０１０７】
なお、ランダマイズ、ランダマイズ復号化、ＥＣＣ符号の符号化（以下、ＥＣＣ符号化）、およびＥＣＣ符号の復号化（以下、ＥＣＣ復号化）の各処理は、メモリノード１１およびコネクションユニット１４の何れにおいて実行されてもよい。各処理がメモリノード１１およびコネクションユニット１４の何れにおいて実行されるかは、コマンドに応じて異なっていてもよい。
【０１０８】
図２１は、（１５、１１）ＢＣＨ符号の生成回路の構成例を示す図である。符号化回路５００に１１ｂｉｔの単位データが入力される際は、スイッチＳＷ１がONされるとともに、スイッチＳＷ２が「１」に切り替えられる。１１ｂｉｔの単位データが出力された後、計算されてＲ１からＲ４に保存されているＥＣＣ符号を出力するために、スイッチＳＷ１がOＦＦされるとともにスイッチＳＷ２が「２」に切り替えられる。これにより、４ｂｉｔのＥＣＣ符号が符号化回路５００から出力される。符号化回路５００がＥＣＣ符号を出力している際は、「０」が入力される。
【０１０９】
ＥＣＣ復号化の際はシンドロームと呼ばれる４ｂｉｔの値が計算される。シンドロームは、符号化回路５００において計算される。符号化回路５００は、ＥＣＣ符号を含む１５ｂｉｔの単位データを入力とする。ＥＣＣ復号化の際に入力される単位データは、１２ｂｉｔ目以降の４ｂｉｔの入力が「０」ではない点がＥＣＣ符号化の際と異なる。計算された４ｂｉｔのシンドロームの値が全て「０」であればエラーは無いとしてそのまま出力される。シンドロームが「０」でない値を含む場合には、シンドロームとエラービットの位置との関係（図２２参照）に基づいてエラービットの訂正（即ち反転）が実行される。
【０１１０】
第４の実施形態においては、Ｌ２Ｐテーブル３０１およびガベージコレクションテーブル（ＧＣテーブル）は、メモリノード１１の外部からの読み出しの対象に含まれる。
【０１１１】
不揮発メモリ３００においては、無効化された古いデータが増えると、新たにデータを書き込むことができる領域が減少する。メモリノード１１は、新たにデータを書き込むことができる領域が不足したとき、ガベージコレクションと呼ばれる処理を実行する。ガベージコレクションは、有効なデータを特定のブロックに集め、無効なデータだけになったブロックを消去して、空きブロックを生成する処理である。生成されたブロックは、ＧＣテーブルに登録される。具体的には、ＧＣテーブルは、ブロックの先頭の物理アドレス（以降、ブロックアドレス）が登録される。ＧＣテーブルは、例えばＦＩＦＯのルールに従ってエントリの追加および取り出しが可能に構成される。ブロック数が２０４８個存在する場合には、ＧＣテーブルは、１１ｂｉｔのサイズを有するブロックアドレスが２０４８個登録可能なサイズが必要となる。ＧＣテーブルは、例えばＲＡＭ４００に保持される。
【０１１２】
なお、第４の実施形態においては、一例として、Ｌ２Ｐテーブル３０１は、ブロック毎に論理アドレスと物理アドレス（即ちブロックアドレス）との対応関係が記述されているものとする。また、夫々のブロックは、例えば１２８のページを含むものとする。
【０１１３】
パケットは、前述のように、コマンド番号が記録される「ＣＭＤ」と引数が記録される「ＣＭＤ  ｏｐ.」を備えている。以下に、コマンドおよび引数の例を説明する。なお、引数の形式は、指定される内容が等しければ、以下の例に挙げた形式だけに限定されない。なお、コマンドの実行の際に、書き込むデータのランダマイズ、またはＥＣＣ符号化のいずれかもしくは両方を行っても良いし、読みだしたデータのランダマイズ復号化、またはＥＣＣ復号化のいずれかもしくは両方を行っても良い。
【０１１４】
（１）Ｒａｗ＿Ｒｅａｄ（ｐａｇｅ、開始ｃｏｌ.、終了ｃｏｌ.）
このコマンドは、不揮発メモリ３００から読み出しを行うためのコマンドである。引数のうちの「ｐａｇｅ」はページ番号、「開始ｃｏｌ.」は読み出しを開始するカラム、「終了ｃｏｌ.」は読み出しを終了するカラムを表す。メモリノード１１は、データを読み出して、読み出したデータに含まれるＥＣＣ符号に基づいてＥＣＣ復号化を行い、ＥＣＣ復号化後、データを応答のパケットのペイロードに記録してそのパケットを送信する。
【０１１５】
（２）Ｒａｗ＿Ｗｒｉｔｅ（ｐａｇｅ、開始ｃｏｌ.、終了ｃｏｌ.）
このコマンドは、不揮発メモリ３００に書き込みを行うためのコマンドである。「Ｒａｗ＿Ｗｒｉｔｅ」は、「Ｒａｗ＿Ｒｅａｄ」と同様に、ページおよびカラムを指定するための引数を備える。ただし、「Ｒａｗ＿Ｗｒｉｔｅ」の場合、引数は、書き込み位置を指定するためのものである。ライトデータはペイロードに記録される。ライトデータのデータ長が短いためにペイロードに余剰の部分が生じる場合には、余剰の部分に「１０」の値を表すビット列が繰り返し記録される。メモリノード１１は、ライトデータに含まれるＥＣＣ符号の復号化を行い、復号化後、ライトデータの書き込みを実行する。そして、メモリノード１１は、書き込みの成否を応答のパケットのヘッダに記録してそのパケットを送信する。
【０１１６】
（３）Ｒａｗ＿Ｅｒａｓｅ（ｐａｇｅ）
このコマンドは、不揮発メモリ３００に格納された内容の消去を行うためのコマンドである。消去対象のブロックは、引数である「ｐａｇｅ」により指定される。即ち、「ｐａｇｅ」により指定されたページを含むブロックが消去対象である。メモリノード１１は、消去を実行後、消去の成否を応答のパケットのヘッダに記録してそのヘッダを送信する。
【０１１７】
（４）Ｌ２Ｐ＿Ｒｅａｄ（ＬＡ）
このコマンドは、Ｌ２Ｐテーブル３０１の読み出しを行うためのコマンドである。引数である「ＬＡ」は、論理アドレスを表す。メモリノード１１は、Ｌ２Ｐテーブル３０１を参照することによって「ＬＡ」に対応する物理アドレス（ブロックアドレス）を読み出して、読み出したブロックアドレスを応答のパケットのペイロードに記録して、そのパケットを送信する。
【０１１８】
（５）Ｌ２Ｐ＿Ｗｒｉｔｅ（ＬＡ、ｋｅｙ１、ｋｅｙ２）
このコマンドは、Ｌ２Ｐテーブル３０１に対する書き込みを行うためのコマンドである。「Ｌ２Ｐ＿Ｗｒｉｔｅ」の引数に含まれる「ＬＡ」は、論理アドレスを表す。「ｋｅｙ１」および「ｋｅｙ２」は夫々例えば２byteのサイズを有する。メモリノード１１は、Ｌ２Ｐテーブル３０１を参照することによって「ＬＡ」に対応するブロックアドレスを読み出す。そして、メモリノード１１は、読み出したブロックアドレスと引数に含まれる「ｋｅｙ１」の値とを比較し、両者が一致した場合には、「ＬＡ」に対応するブロックアドレスを引数に含まれる「ｋｅｙ２」の値で上書きする。そして、メモリノード１１は、上書き完了後、成功した旨の情報を応答のパケットのヘッダに記録してそのパケットを送信する。両者が一致しない場合には、メモリノード１１は、失敗した旨の情報を応答のパケットのヘッダに記録してそのパケットを送信する。
【０１１９】
（６）ＧＣ＿Ｒｅａｄ（）
このコマンドは、ＧＣテーブルの読み出しを行うためのコマンドである。メモリノード１１は、ＧＣテーブルに登録された全てのブロックアドレスを、登録された順番が識別可能な形式で読み出して、読み出した全てのブロックアドレスを応答のパケットのペイロードに記録して、そのパケットを送信する。
【０１２０】
（７）ＧＣ＿Ｐｕｓｈ（ＢＬＫ）
このコマンドは、ＧＣテーブルに新たにエントリを登録するためのコマンドである。引数である「ＢＬＫ」は、ブロックの先頭の物理アドレスを表す。メモリノード１１は、「ＢＬＫ」の値をＧＣテーブルの末尾に付加する。そして、メモリノード１１は、付加の成否を応答のパケットのヘッダに記録してそのヘッダを送信する。
【０１２１】
（８）ＧＣ＿Ｓｈｉｆｔ（）
このコマンドは、ＧＣテーブルからブロックアドレスを取得するためのコマンドである。メモリノード１１は、ＧＣテーブルの先頭に登録されているブロックアドレスを読み出す。そして、メモリノード１１は、読み出したブロックアドレスを応答のパケットのヘッダに記録して、そのパケットを送信する。その後、メモリノード１１は、ＧＣテーブルに登録されている夫々のエントリを１つずつ先頭方向にシフトせしめる。
【０１２２】
（９）Ｒｅａｄ（ＬＡ１、ｋｅｙ、ＬＡ２、ＢＬＫ内ｐａｇｅ、開始ｃｏｌ.、終了ｃｏｌ.）
このコマンドは、Ｌ２Ｐテーブル３０１を用いて不揮発メモリ３００からの読み出しを行うためのコマンドである。引数に含まれる「ＬＡ１」および「ＬＡ２」は、論理アドレスを表す。引数に含まれる「ｋｅｙ」は、２Ｂのサイズを有する。引数に含まれる「ＢＬＫ内ｐａｇｅ」は、１つのブロックの範囲内でページを特定する物理アドレスを表す。メモリノード１１は、Ｌ２Ｐテーブル３０１を参照することによって「ＬＡ１」に対応するブロックアドレスを読み出す。そして、メモリノード１１は、読み出したブロックアドレスと引数に含まれる「ｋｅｙ」の値とを比較し、両者が一致した場合には、次に説明する読み出し処理を実行する。両者が一致しない場合には、メモリノード１１は、読み出し処理を実行せずに、エラー情報１を応答のパケットのヘッダに記録してそのパケットを送信する。
【０１２３】
読み出し処理においては、メモリノード１１は、Ｌ２Ｐテーブル３０１を参照することによって「ＬＡ２」に対応するブロックアドレスを読み出す。ブロックアドレスの読み出しに失敗した場合には、メモリノード１１は、エラー情報２を応答のパケットのヘッダに記録してそのパケットを送信する。ブロックアドレスの読み出しに成功した場合には、メモリノード１１は、読み出したブロックアドレスに１ブロック当たりのページ数、例えば１２８を乗算し、乗算により得られた値に「ＢＬＫ内ｐａｇｅ」を加算する。そして、メモリノード１１は、加算によって得られた物理アドレスが示すページの、「開始ｃｏｌ.」が表すカラムから「終了ｃｏｌ.」が表すカラムまでを読み出し先として不揮発メモリ３００からデータを読み出す。メモリノード１１は、読み出したデータに含まれるＥＣＣ符号に基づいてＥＣＣ復号化を行う。そして、メモリノード１１は、ＥＣＣ復号化後、データを応答のパケットのペイロードに記録してそのパケットを送信する。
【０１２４】
（１０）Ｗｒｉｔｅ（ＬＡ１、ｋｅｙ、ＬＡ２、ＢＬＫ内ｐａｇｅ、開始ｃｏｌ.、終了ｃｏｌ.）
このコマンドは、Ｌ２Ｐテーブル３０１を用いて不揮発メモリ３００に対する書き込みを行うためのコマンドである。メモリノード１１は、Ｌ２Ｐテーブル３０１を参照することによって「ＬＡ１」に対応するブロックアドレスを読み出す。そして、メモリノード１１は、読み出したブロックアドレスと引数に含まれる「ｋｅｙ」の値とを比較し、両者が一致した場合には、次に説明する書き込み処理を実行する。両者が一致しない場合には、メモリノード１１は、書き込み処理を実行せずに、エラー情報を応答のパケットのヘッダに記録してそのパケットを送信する。
【０１２５】
書き込み処理においては、メモリノード１１は、Ｌ２Ｐテーブル３０１を参照することによって「ＬＡ２」に対応する物理アドレスを読み出す。「ＬＡ２」に対応するブロックアドレスの読み出しに失敗した場合には、メモリノード１１は、ＧＣテーブルからブロックアドレスを取得して、取得したブロックアドレスを「ＬＡ２」の値と対応付けてＬ２Ｐテーブル３０１に登録する。そして、メモリノード１１は、Ｌ２Ｐテーブル３０１から読み出した、または、ＧＣテーブルから取得した、ブロックアドレスに１ブロック当たりのページ数、例えば１２８を乗算し、乗算により得られた値に「ＢＬＫ内ｐａｇｅ」を加算する。そして、メモリノード１１は、加算によって得られた物理アドレスが示すページのうちの「開始ｃｏｌ.」が表すカラムから「終了ｃｏｌ.」が表すカラムまでをライトデータの書き込み先とする。メモリノード１１は、ライトデータに含まれるＥＣＣ符号の復号化を行い、復号化後、ライトデータを書き込み先に書き込む。そして、メモリノード１１は、書き込みの成否を応答のパケットのヘッダに記録してそのパケットを送信する。
【０１２６】
なお、メモリノード１１は、ＧＣテーブルからブロックアドレスの取得を行った場合、「ＧＣ＿Ｓｈｉｆｔ」の場合と同様にＧＣテーブルに登録されたエントリのシフトを実行する。また、メモリノード１１は、物理アドレスの取得を行った旨の情報を応答のパケットのヘッダに記録してそのパケットを送信する。
【０１２７】
（１１）Ｅｒａｓｅ（ＬＡ１、ｋｅｙ、ＬＡ２）
このコマンドは、不揮発メモリ３００に格納された内容の消去をＬ２Ｐテーブル３０１を用いて行うためのコマンドである。Ｌ２Ｐテーブル３０１を参照することによって「ＬＡ１」に対応するブロックアドレスを読み出す。そして、メモリノード１１は、読み出したブロックアドレスと引数に含まれる「ｋｅｙ」の値とを比較し、両者が一致した場合には、次に説明する消去処理を実行する。両者が一致しない場合には、メモリノード１１は、消去処理を実行せずに、エラー情報１を応答のパケットのヘッダに記録してそのパケットを送信する。
【０１２８】
消去処理においては、メモリノード１１は、Ｌ２Ｐテーブル３０１を参照することにとって「ＬＡ２」に対応するブロックアドレスを読み出す。ブロックアドレスの読み出しに失敗した場合には、メモリノード１１は、エラー情報２を応答のパケットのヘッダに記録してそのパケットを送信する。ブロックアドレスの読み出しに成功した場合には、メモリノード１１は、読み出したブロックアドレスが示すブロックを消去対象として、消去を行う。消去後、メモリノード１１は、Ｌ２Ｐテーブル３０１に記録されている「ＬＡ２」と消去対象であったブロックアドレスとの対応関係を無効化するとともに、消去対象であったブロックアドレスをＧＣテーブルに登録する。消去の際にエラーが発生した場合には、メモリノード１１は、ブロックアドレスをＧＣテーブルに追加せずに、その旨を応答のパケットのヘッダに記録してそのパケットを送信する。
【０１２９】
（１２）Ａｃｔｉｖａｔｅ（）
このコマンドは、不揮発メモリ３００の状態をアクセス可能な状態（正常動作状態）に遷移せしめるためのコマンドである。メモリノード１１は、不揮発メモリ３００の状態を正常動作状態に遷移せしめるとともに、メモリノード１１に具備されるＬＥＤに正常動作状態を表示する。なお、ＬＥＤの表示に関し、点灯状態を以って正常動作状態を表示するようにしてもよいし、消灯状態を以って正常動作状態を表示するようにしてもよい。
【０１３０】
（１３）Ｄｅａｃｔｉｖａｔｅ（）
このコマンドは、不揮発メモリ３００の状態をアクセス不能な状態に遷移せしめるためのコマンドである。アクセス不能な状態とは、不揮発メモリ３００に対して、「Ｒｅａｄ」、「Ｗｒｉｔｅ」、「Ｅｒａｓｅ」、「Ｌ２Ｐ＿Ｒｅａｄ」、「Ｌ２Ｐ＿Ｗｒｉｔｅ」、および「Ｌ２P_Ｅｒａｓｅ」の何れのコマンドを実行する際においても書き込みおよび読み出しができない状態をいう。
【０１３１】
（１４）Ｌ２Ｐ＿Ｂａｃｋｕｐ（ｐａｇｅ）
このコマンドは、ＲＡＭ４００に保持されているＬ２Ｐテーブル３０１およびＧＣテーブルを不揮発メモリ３００に書き込むためのコマンドである。メモリノード１１は、ＲＡＭ４００からＬ２Ｐテーブル３０１およびＧＣテーブルを読み出して、読み出したデータに対してランダマイズおよびＥＣＣ符号化を実行する。そして、メモリノード１１は、「ｐａｇｅ」によって指定される物理アドレスを先頭とする連続するページにデータを書き込み、書き込みの成否を応答のパケットのヘッダに記録してそのヘッダを送信する。
【０１３２】
（１５）Ｌ２Ｐ＿Ｒｅｓｔｏｒｅ（ｐａｇｅ）
このコマンドは、不揮発メモリ３００に格納されているＬ２Ｐテーブル３０１およびＧＣテーブルをＲＡＭ４００に読み出すためのコマンドである。メモリノード１１は、不揮発メモリ３００からＬ２Ｐテーブル３０１およびＧＣテーブルを読み出して、読み出したデータに対してＥＣＣ復号化およびランダマイズ復号化を実行する。そして、メモリノード１１は、ＥＣＣ復号化およびランダマイズ復号化を行った後のデータをＲＡＭ４００に展開する。なお、メモリノード１１は、ＥＣＣ復号化後、ＥＣＣ符号のための冗長ビットを破棄する。展開後、メモリノード１１は、展開の成否を応答のパケットのヘッダに記録してそのヘッダを送信する。
【０１３３】
（１６）Ｌ２Ｐ＿Ａｄｄ（ＬＡ１、ｋｅｙ、ＬＡ２、ｖａｌｕｅ）
このコマンドは、Ｌ２Ｐテーブル３０１に記録されている所望のブロックアドレスに値を加算するためのコマンドである。「ｖａｌｕｅ」は例えば、１６ｂｉｔのサイズを有する。メモリノード１１は、Ｌ２Ｐテーブル３０１を参照することによって「ＬＡ１」に対応するブロックアドレスを読み出す。そして、メモリノード１１は、読み出したブロックアドレスと引数に含まれる「ｋｅｙ」の値とを比較し、両者が一致した場合には、次に説明する加算処理を実行する。両者が一致しない場合には、メモリノード１１は、加算処理を実行せずに、エラー情報を応答のパケットのヘッダに記録してそのパケットを送信する。
【０１３４】
加算処理においては、メモリノード１１は、「ＬＡ２」に「ｖａｌｕｅ」の値を加算する。そして、メモリノード１１は、Ｌ２Ｐテーブル３０１に記録されている論理アドレス「ＬＡ２」を、加算により得られた値で更新する。なお、「ＬＡ２」の最上位ビットは、桁あふれを表す。最上位ビットが加算処理によっていったん「１」となった場合には、以降、「１」のまま維持される。
【０１３５】
（第５の実施形態）
図２３は、第５の実施形態のパケットの構成を説明する図である。第５の実施形態のパケットは、ペイロード（第１ペイロード）に複数のコマンドが記録される。個々のコマンドは、コマンド長、コマンド番号、コマンドオプション、およびそのコマンド自身のペイロード（第２ペイロード）がこの順番で記録されて構成される。メモリノード１１は、第１ペイロードに格納された複数のコマンドを、先頭から順番に実行することができる。以降、第１ペイロードに複数のコマンドを有する構成を、連続コマンド構成と表記する。これに対し、図１９に示した第４の実施の形態のパケットの構成を、単一コマンド構成と表記する。
【０１３６】
なお、コマンドオプションおよび第２ペイロードは、コマンドに応じてサイズが異なる。コマンドオプションおよび第２ペイロードのうちの一方または両方は、コマンドに応じて具備されてもよいし、具備されなくてもよい。
【０１３７】
連続コマンド構成のパケットが備えるヘッダは、単一コマンド構成のパケットが備えるヘッダと同等であってよい。連続コマンド構成のパケットのヘッダにおいては、「ＣＭＤ」には、連続コマンド構成を示すコマンド番号が記録される。即ち、メモリノード１１は、パケットの構成が連続コマンド構成であるか否かを「ＣＭＤ」に記録されたコマンド番号に基づいて識別することができる。パケットの構成が連続コマンド構成では無い場合には、メモリノード１１は、「ＣＭＤ」に記録されたコマンド番号に基づいて第４の実施形態において説明した動作を実行する。
【０１３８】
次に、第１ペイロードに記録されるコマンドの例を説明する。なお、第５の実施形態において、以降の説明は連続コマンド構成のパケットに関する。
【０１３９】
（１）ＣＯＰＹ（ＭＥＭ＿ＡＤＤＲＥＳＳ  ｆｒｏｍ、ＬＥＮＧＴＨ  ｌｅｎｇｔｈ、ＭＥＭ＿ＡＤＤＲＥＳＳ  ｔｏ、ＦＬＡＧ  ｐｏｉｎｔｅｒ）
このコマンドは、メモリノード１１内においてメモリ間でデータをコピーするためのコマンドである。「ＭＥＭ＿ＡＤＤＲＥＳＳ  ｆｒｏｍ」はコピー元の領域を、「ＭＥＭ＿ＡＤＤＲＥＳＳ  ｔｏ」はコピー先の領域を、「ＬＥＮＧＴＨ  ｌｅｎｇｔｈ」はコピー対象のデータのサイズを、夫々表す。「ＭＥＭ＿ＡＤＤＲＥＳＳ  ｆｒｏｍ」および「ＭＥＭ＿ＡＤＤＲＥＳＳ  ｔｏ」には、夫々、データ保存領域を表す識別番号（ＭＥＭ＿ＫＩＮＤ）と、「ＭＥＭ＿ＫＩＮＤ」が示すデータ保存領域内の位置を表すアドレス情報（ＡＤＤＲＥＳＳ）とが記録される。「ＭＥＭ＿ＫＩＮＤ」は、ここでは４ｂｉｔのサイズを備えている。「ＭＥＭ＿ＫＩＮＤ」の値とデータ保存領域との対応関係の一例を以下に示す。
【０１４０】
００：バッファ領域
０１：演算バッファ領域
０２：演算バッファ領域
０３：演算バッファ領域
０４：演算バッファ領域
０５：ＳＲＡＭ２０８
０６：不揮発メモリ３００
０７：ＲＡＭ４００
０８：受信ヘッダ領域
０９：受信ペイロード領域
１０：送信ヘッダ領域
１１：送信ペイロード領域
【０１４１】
「ＣＯＰＹ」においては、「ＭＥＭ＿ＫＩＮＤ」としてこれらの全てが使用可能である。また、ここに示した以外のメモリ領域を使用出来てもかまわない。
【０１４２】
なお、バッファ領域、４つの演算バッファ領域、受信ヘッダ領域、受信ペイロード領域、送信ヘッダ領域、および、送信ペイロード領域は、メモリノード１１内に具備されるメモリ（例えばＲＡＭ４００またはＳＲＡＭ２０８）またはレジスタに予め確保されている。メモリノード１１は、自メモリノード１１が宛先となっているパケットを受信すると、受信したパケットを構成するヘッダを受信ヘッダ領域に格納し、受信したパケットを構成する第１のペイロードを受信ペイロード領域に格納する。また、メモリノード１１は、コネクションユニット１４または他のメモリノード１１を宛先とするパケットを生成し、送信することが可能である。メモリノード１１は、パケットを生成する際には、送信ヘッダ領域にヘッダを生成し、送信ペイロード領域に第１のペイロードを生成する。バッファ領域は、一時的なデータが格納される。演算バッファ領域は、演算の元データが一時的に格納されたり、演算の結果データが一時的に格納されたりする。
【０１４３】
なお、コピー元の領域には、ポインタが格納されている場合がある。「ＦＬＡＧ  ｐｏｉｎｔｅｒ」は、コピー元として指定された領域に格納されているデータ（ポインタが格納されている場合にはポインタ）をコピー対象とするか、コピー元として指定された領域に格納されているポインタが指す別の領域に格納されているデータをコピー対象とするか、を表す。「ＦＬＡＧ  ｐｏｉｎｔｅｒ」は、「０」が前者を、「１」が後者を、夫々表す、１ｂｉｔのサイズを有する情報である。なお、データがポインタであるかポインタ以外のデータ（以降、実データ）であるかは、データの最上位ビットにより識別される。
【０１４４】
ポインタは、メタ情報（ＭＥＴＡ）とアドレス情報（ＭＥＭ＿ＡＤＤＲＥＳＳ）とを備える。また、「ＭＥＴＡ」は、「ＦＬＡＧ  ｐｏｉｎｔｅｒ」と「ＬＥＮＧＴＨ  ｌｅｎｇｔｈ」と「ＲＩＧＨＴ  ｒｉｇｈｔ」とを備える。「ＭＥＴＡ」に含まれる「ＦＬＡＧ  ｐｏｉｎｔｅｒ」は、「ＣＯＰＹ」の引数に含まれる「ＦＬＡＧ  ｐｏｉｎｔｅｒ」と等しい。「ＭＥＭ＿ＡＤＤＲＥＳＳ」は、「ＭＥＭ＿ＡＤＤＲＥＳＳ  ｆｒｏｍ」などと同等の構成を備える。
【０１４５】
図２４は、「ＣＯＰＹ」が備える「ＦＬＡＧ  ｐｏｉｎｔｅｒ」に「１」が記録されている場合の、コピー対象の特定方法を説明する概念図である。まず、「ＣＯＰＹ」に含まれる「ＭＥＭ＿ＡＤＤＲＥＳＳ  ｆｒｏｍ」は領域＃１を示す。領域＃１には、ポインタが格納されている。領域＃１に格納されているポインタに含まれる「ＭＥＭ＿ＡＤＤＲＥＳＳ」は、領域＃２を示している。
【０１４６】
領域＃２には、ポインタが格納されている。領域＃１に格納されているポインタに含まれる「ＦＬＡＧ  ｐｏｉｎｔｅｒ」には「１」が記録されているので、領域＃２に格納されているポインタはコピー対象ではない。
【０１４７】
領域＃２に格納されているポインタに含まれる「ＭＥＭ＿ＡＤＤＲＥＳＳ」は、領域＃３を示している。領域＃３には、実データが格納されている。また、領域＃２に格納されているポインタに含まれる「ＦＬＡＧ  ｐｏｉｎｔｅｒ」には「０」が記録されている。従って、領域＃３に格納されている実データがコピー対象として特定される。
【０１４８】
（２）ＥＸＣＨＡＮＧＥ（ＭＥＭ＿ＡＤＤＲＥＳＳ  ｆｒｏｍ、ＬＥＮＧＴＨ  ｌｅｎｇｔｈ、ＭＥＭ＿ＡＤＤＲＥＳＳ  ｔｏ）
このコマンドは、メモリノード１１内においてメモリ間でデータを交換するためのコマンドである。メモリノード１１は、「ＭＥＭ＿ＡＤＤＲＥＳＳ  ｆｒｏｍ」に格納された「ＬＥＮＧＴＨ  ｌｅｎｇｔｈ」のサイズのデータと、「ＭＥＭ＿ＡＤＤＲＥＳＳ  ｔｏ」に格納された「ＬＥＮＧＴＨ  ｌｅｎｇｔｈ」のサイズのデータとを交換する。「ＥＸＣＨＡＮＧＥ」においては、「ＭＥＭ＿ＫＩＮＤ」として、「００（バッファ領域）」、「０５（ＳＲＡＭ２０８）」および「０７（ＲＡＭ４００）」のような、ランダムアクセス性能が高いメモリが使用可能であることが望ましい。
【０１４９】
（３）ＯＰＥＲＡＴＥ（ＯＰ＿ＴＹＰＥ  ｔｙｐｅ、ＬＯＮＧ  ｖａｌ、ＭＥＭ＿ＫＩＮＤ  ｔａｒｇｅｔ、ＭＥＭ＿ＫＩＮＤ  ｒｅｓｕｌｔ）
このコマンドは、演算を行うためのコマンドである。「ＯＰ＿ＴＹＰＥ  ｔｙｐｅ」は、演算の種類を表す。「ＯＰ＿ＴＹＰＥ  ｔｙｐｅ」は、ここでは３ｂｉｔのサイズを有する。「ＯＰ＿ＴＹＰＥ  ｔｙｐｅ」の値と演算の種類との対応関係の一例を以下に示す。
【０１５０】
００：加算
０１：<<
０２：>>
０３：ＡＮＤ
０４：ＯＲ
０５：ＮＯＴ
０６：ＸＯＲ
【０１５１】
「ＬＯＮＧ  ｖａｌ」は、演算に使用される整数である。「ＭＥＭ＿ＫＩＮＤ  ｔａｒｇｅｔ」は、演算対象のデータが格納されるデータ保存領域を表し、「ＭＥＭ＿ＫＩＮＤ  ｒｅｓｕｌｔ」は演算結果が格納されるデータ保存領域を表す。「ＯＰＥＲＡＴＥ」においては、「ＭＥＭ＿ＫＩＮＤ  ｔａｒｇｅｔ」および「ＭＥＭ＿ＫＩＮＤ  ｒｅｓｕｌｔ」には、「０１（演算バッファ領域）」、「０２（演算バッファ領域）」、「０３（演算バッファ領域）」および「０４（演算バッファ領域）」が使用可能である。
【０１５２】
なお、４つの演算バッファ領域は、夫々８byteのサイズを有する。ビットシフト（「０１（<<）」および「０２（>>）」）の演算においては、演算バッファ領域は「０」でパディングされる。「００（加算）」の演算が実行される際には、演算バッファ領域の最上位ビットは、桁あふれしたか否かを表すビットとして使用される。例えば、演算バッファ領域の最上位ビットにおいて、「１」は桁あふれが発生したことを示し、「０」は桁あふれが発生していないことを示す。
【０１５３】
（４）ＣＯＭＰＡＲＥ（ＣＯＭＰ＿ＴＹＰＥ  ｔｙｐｅ、ＬＯＮＧ  ｖａｌｕｅ、ＭＥＭ＿ＫＩＮＤ  ｔａｒｇｅｔ、ＭＥＭ＿ＫＩＮＤ  ｒｅｓｕｌｔ）
このコマンドは、メモリノード１１内においてメモリ間で比較を行うためのコマンドである。「ＣＯＭＰ＿ＴＹＰＥ  ｔｙｐｅ」は、比較の種類を表す。「ＣＯＭＰ＿ＴＹＰＥ  ｔｙｐｅ」は、ここでは３ｂｉｔのサイズを有する。「ＣＯＭＰ＿ＴＹＰＥ  ｔｙｐｅ」の値と比較の種類との対応関係を以下に示す。
【０１５４】
００：＝＝ｖａｌｕｅ
０１：！＝ｖａｌｕｅ
０２：＞＝ｖａｌｕｅ
０３：＞ｖａｌｕｅ
０４：＜＝ｖａｌｕｅ
０５：＜ｖａｌｕｅ
【０１５５】
「ＭＥＭ＿ＫＩＮＤ  ｔａｒｇｅｔ」は、比較対象のデータが格納されるデータ保存領域を表し、「ＭＥＭ＿ＫＩＮＤ  ｒｅｓｕｌｔ」は、比較結果が格納されるデータ保存領域を表す。「ＣＯＭＰＡＲＥ」においては、「ＭＥＭ＿ＫＩＮＤ  ｔａｒｇｅｔ」および「ＭＥＭ＿ＫＩＮＤ  ｒｅｓｕｌｔ」には、「０１（演算バッファ領域）」、「０２（演算バッファ領域）」、「０３（演算バッファ領域）」および「０４（演算バッファ領域）」が使用可能である。メモリノード１１は、比較結果が「ｔｒｕｅ」である場合には「０ｘ０１」を書き込み、比較結果が「ｆａｌｓｅ」である場合には「０ｘ００」を書き込む。
【０１５６】
（５）ＵＮＬＥＳＳ＿ＧＯ（ＭＥＭ＿ＫＩＮＤ  ｔａｒｇｅｔ、ＬＥＮＧＴＨ  ｊｕｍｐ）
このコマンドは、条件分岐を行うためのコマンドである。「ＭＥＭ＿ＫＩＮＤ  ｔａｒｇｅｔ」は、条件分岐を判断するためのデータが格納されるデータ保存領域を表す。「ＵＮＬＥＳＳ＿ＧＯ」においては、「ＭＥＭ＿ＫＩＮＤ  ｔａｒｇｅｔ」には、「０１（演算バッファ領域）」、「０２（演算バッファ領域）」、「０３（演算バッファ領域）」および「０４（演算バッファ領域）」が使用可能である。「ＬＥＮＧＴＨ  ｊｕｍｐ」は、コマンド数を表す。メモリノード１１は、「ＭＥＭ＿ＫＩＮＤ  ｔａｒｇｅｔ」が示す演算バッファ領域の最下位ビットが「１」である場合には、「ＵＮＬＥＳＳ＿ＧＯ」のすぐ後に記録されたコマンドを実行する。メモリノード１１は、「ＭＥＭ＿ＫＩＮＤ  ｔａｒｇｅｔ」が示す演算バッファ領域の最下位ビットが「０」である場合には、「ＵＮＬＥＳＳ＿ＧＯ」のすぐ後に記録されたコマンドから「ＬＥＮＧＴＨ  ｊｕｍｐ」が示すコマンド数だけジャンプした位置に記録されたコマンドを実行する。例えば、第１ペイロードに「ＣＯＭＰＡＲＥ」の後に「ＵＮＬＥＳＳ＿ＧＯ」を記録することによって、「ＣＯＭＰＡＲＥ」による比較結果に応じて「ＵＮＬＥＳＳ＿ＧＯ」による条件分岐を実行させることが可能となる。
【０１５７】
（６）ＳＥＮＤ（ＦＬＡＧ  ｔｏ＿ＣＵ）
このコマンドは、パケットの送信をメモリノード１１に実行させるためのコマンドである。「ＦＬＡＧ  ｔｏ＿ＣＵ」は、コネクションユニット１４を宛先とするか他のメモリノード１１を宛先とするかを表す。「ＦＬＡＧ  ｔｏ＿ＣＵ」は、「１」が前者を、「０」が後者を、夫々表す、１ｂｉｔのサイズを有する情報である。メモリノード１１は、ヘッダに含まれる「ＬＩＦＥ」、「ＣＲＣ」、「Ｆｒａｍｅ  ｓｉｚｅ」を計算するとともに計算結果を送信ヘッダ領域に記録する。そして、メモリノード１１は、送信ヘッダ領域に格納された内容をヘッダに、送信ペイロード領域に格納された内容を第１ペイロードに、夫々記録することによって、パケットを生成する。
【０１５８】
なお、デフォルト設定によれば、メモリノード１１は、受信ヘッダ領域に格納されている宛先のノードアドレスを送り元のノードアドレスとして送信ペイロード領域に格納し、受信ヘッダ領域に格納されている送り元のノードアドレスを宛先のノードアドレスとして送信ペイロード領域に格納する。「ＦＬＡＧ  ｔｏ＿ＣＵ」の値が「０」である場合には、「ＣＯＰＹ」を用いることによって送信ヘッダ領域に格納された宛先のノードアドレスが所望のノードアドレスに書き換えられる。
【０１５９】
例えば、応答の内容を送信ペイロード領域に格納させ、その応答の内容をコネクションユニット１４を介して送信させるといった運用が可能となる。また、第１ペイロードに記録されたコマンドのうちの所望のコマンド以降の連続するコマンドを送信ペイロード領域に格納させ、その連続するコマンドを他のメモリノード１１に実行させるといった運用が可能となる。
【０１６０】
（７）ＶＡＲＩ＿ＦＩＬＴＥＲ（ＣＨＡＲ  ｓｔａｒｔ、ＣＨＡＲ  ｅｎｄ、ＭＥＭ＿ＡＤＤＲ  ａｄｄｒ、ＬＥＮＧＴＨ  ｌｅｎｇｔｈ、ＦＬＡＧ  ｐａｒｔ）
このコマンドは、可変長の文字列を検索するためのコマンドである。検索対象の範囲は、バッファ領域に格納されたデータのうちの、「ＣＨＡＲ  ｓｔａｒｔ」に記録された文字から「ＣＨＡＲ  ｅｎｄ」に記録された文字に至るまでの範囲のデータである。「ＣＨＡＲ  ｓｔａｒｔ」に記録された文字と「ＣＨＡＲ  ｅｎｄ」に記録された文字に至るまでの範囲のデータがバッファ領域に複数存在する場合には、それらの複数のデータが検索対象の範囲のデータである。「ＭＥＭ＿ＡＤＤＲ  ａｄｄｒ」は、検索文字列の先頭に位置を表し、「ＬＥＮＧＴＨ  ｌｅｎｇｔｈ」は、検索文字列のサイズを表す。即ち、メモリノード１１は、「ＭＥＭ＿ＡＤＤＲ  ａｄｄｒ」が表す位置から「ＬＥＮＧＴＨ  ｌｅｎｇｔｈ」が表すサイズのデータを読み出して、読み出したデータを検索文字列とする。メモリノード１１は、検索対象の範囲のデータが検索文字列と一部一致または完全一致した場合には、その検索対象の範囲のデータを送信ペイロード領域に格納する。送信ペイロード領域が溢れる場合には、エラーとなる。「ＦＬＡＧ  ｐａｒｔ」は、部分一致検索を行うか、完全一致検索を行うかを表す。
【０１６１】
（８）ＦＩＸ＿ＦＩＬＴＥＲ（ＬＥＮＧＴＨ  ｓｉｚｅ、ＭＥＭ＿ＡＤＤＲ  ａｄｄｒ、ＬＥＮＧＴＨ  ｌｅｎｇｔｈ、ＦＬＡＧ  ｐａｒｔ）
このコマンドは、固定長の文字列を検索するためのコマンドである。検索対象の範囲は、バッファ領域に格納されたデータを先頭から「ＬＥＮＧＴＨ  ｓｉｚｅ」が表すサイズ毎に分割して得られる夫々の分割データである。「ＭＥＭ＿ＡＤＤＲ  ａｄｄｒ」は、検索文字列の先頭に位置を表し、「ＬＥＮＧＴＨ  ｌｅｎｇｔｈ」は、検索文字列のサイズを表す。メモリノード１１は、検索対象の分割データと検索文字列とを逐次比較する。検索対象の分割データが検索文字列と一部一致または完全一致した場合には、メモリノード１１は、一部一致または完全一致した分割データを送信ペイロード領域に格納する。送信ペイロード領域が溢れる場合には、エラーとなる。「ＦＬＡＧ  ｐａｒｔ」は、部分一致検索を行うか、完全一致検索を行うかを表す。
【０１６２】
メモリノード１１は、受信ペイロード領域に格納されたデータの読み出し位置を管理するための先頭ポインタを備えている。図２５は、先頭ポインタを説明する図である。受信ペイロード領域６００には、第１ペイロードに記録された複数のコマンド（コマンド６０１およびコマンド６０２）が格納される。コマンド６０１およびコマンド６０２は、メモリノード１１によってシリアルに実行される。メモリノード１１は、コマンド６０１、６０２を実行中には、実行中のコマンド６０１、６０２に含まれる第２ペイロードの先頭位置に先頭ポインタ６０３を移動させる。例えば、コマンド６０１を実行中においては、先頭ポインタ６０３は、コマンド６０１に含まれる第２ペイロードの先頭位置を示し、コマンド６０２を実行中においては、先頭ポインタ６０３は、コマンド６０２に含まれる第２ペイロードの先頭位置を示す。
【０１６３】
また、メモリノード１１は、送信ペイロード領域に格納されたデータの長さを管理するために、長さポインタを備えている。例えば、メモリノード１１は、例えばＲＡＭ４００に長さポインタを記憶する。そして、メモリノード１１は、所定の規則に則って長さポインタを更新する。メモリノード１１は、パケットのヘッダに含まれる「Ｆｒａｍｅ  Ｓｉｚｅ」を、長さポインタの値に基づいて算出する。
【０１６４】
図２６は、長さポインタの更新ルールを説明する図である。長さポインタ７０１は、送信ペイロード領域７００に記録されている有効なデータの末尾を指す（（ａ）を参照）。「ＣＯＰＹ」においては、「ＡＤＤＲＥＳＳ」により送信ペイロード領域７００のうちの書き込み位置を指定することが可能である。従って、例え既に有効なデータが格納されている範囲であっても、「ＣＯＰＹ」によって上書きされてしまう場合が存在する。その場合であっても、メモリノード１１は、有効なデータが格納されている範囲が変わらない場合は、長さポインタを更新しない（（ｂ）を参照）。（ｂ）において、斜め線でハッチングされた領域は、「ＣＯＰＹ」によってデータが上書きされた領域を示す。メモリノード１１は、「ＶＡＲＩ＿ＦＩＬＴＥＲ」または「ＦＩＸ＿ＦＩＬＴＥＲ」を実行した結果、一部一致または完全一致したデータがあった場合には、そのデータを、長さポインタ７０１が示す位置に格納するとともに、格納したデータのサイズ分だけ長さポインタ７０１を送信ペイロード領域７００の末尾に向かって移動させる（（ｃ）を参照）。（ｃ）において、点でハッチングされた領域は、一部一致または完全一致されたデータを示す。
【０１６５】
（第６の実施形態）
ここでは、ＡＳＩＣを用いてコントローラ２００を構成する場合について説明する。以下、コントローラ２００をＮｏｄｅ  Ｍｏｄｕｌｅと表記する。
【０１６６】
［ＲＡＭ構成］
ＦＰＧＡで構成されたシステムは、ＲＡＭとして、ＦＰＧＡ専用のＢＲＡＭを使用している。このため、ＡＳＩＣで構成されたシステムでは、ＡＳＩＣ用のＲＡＭに置き換える必要がある。注意する部分としては、ＦＰＧＡはＷｏｒｄ／Ｂｙｔｅライトイネーブルに対して、ＡＳＩＣ用はｂｉｔ単位で制御になっている点である。また、ＡＳＩＣのシリーズによっては、２ポートＲＡＭに対応していない場合がある。この場合は、１ポートＲＡＭを２つ用意することによって、バッファリング機能を新たに追加する必要がある。ＡＳＩＣのシリーズ選定をする際には、２ポートＲＡＭに対応しているか否かについても注意が必要である。
【０１６７】
図２７は、２ポートＲＡＭを用いてデータが受け渡しされる様子を説明する図であり、図２８は、２つの１ポートＲＡＭを用いてデータが受け渡しされる様子を説明する図である。
【０１６８】
［ＰＬＬ構成］
ＦＰＧＡで構成されたシステムでは、ＦＰＧＡ専用のＰＬＬモジュールを使用している。このため、自由に組み合わせたクロックを生成することが可能である。ＡＳＩＣ用のＰＬＬモジュールは、高い周波数を生成し、それをＣＬＫ構成側で、所定の周波数ひ変換、制御する。ＰＬＬモジュールの機能テストのためのテスト回路（Ｍｕｘ回路）を追加することが必要である。 
【０１６９】
［ＣＬＫ構成］
ＦＰＧＡで構成されたシステムでは、ＣＬＫ構成は、存在せず、すべてＰＬＬモジュールで対応できる。ＡＳＩＣで構成されたシステムでは、各モジュールに対して周波数を提供するＣＬＫＧＥＮモジュールが必要となる。このモジュールは、ＰＬＬの起動／停止などの制御を行い、ＰＬＬモジュールから入力される高い周波数からＦｌｉｐＦｌｏｐ（ＦＦ）を使って１／２、１／４、１／８...など低い周波数を生成する。または、カウンタを使ってそれ以外の周波数を作成する。
【０１７０】
ＡＳＩＣで構成されたシステムは、レジスタ制御によって各モジュールに対してのクロックをＯＮ／ＯＦＦできる、ゲーティング回路が搭載される。
【０１７１】
［Ｉ／Ｏ構成］
ＦＰＧＡで構成されたシステムでは、特殊Ｉ／Ｏから通常Ｉ／Ｏまで、Ｉ／Ｏ構成を任意に選択可能であるが、ＡＳＩＣで構成されたシステムではそうではない。特にＮｏｄｅ  Ｍｏｄｕｌｅ間で使用しているＬＶＤＳ  I／Ｆは、例えば１．２Ｇｂｐｓ程度で接続することを想定している。これに対応するには、専用Ｉ／Ｏとデータを受け取る回路（Ｓｅｒｉａｌｉｚｅｒ／Ｄｅｓｅｒｉａｌｉｚｅｒ）が必要となる。
【０１７２】
ＡＳＩＣで構成されたシステムで、ＤＤＲ／２／３など高速ＲＡＭを実装する場合は、それに伴うＰＨＹを実装する必要がある（アナログ回路）。
【０１７３】
ＡＳＩＣで構成されたシステムの通常のＩ／Ｏは、ＧＰＩＯ制御の双方向通信可能な信号の利用が想定される。また、ＰＵＬＬＵＰ／ＰＵＬＬＤＯＷＮも、レジスタで制御可能な特殊Ｉ／Ｏで実装される。
【０１７４】
［ＲＥＳＥＴ構成］
ＡＳＩＣで構成されたシステムでのＲＥＳＥＴ構成は、ＦＰＧＡで構成されたシステムのそれと変えなくても良い。ＲＥＳＥＴモジュールは各周波数に同期化した回路を搭載して、各モジュールのリセットを行う。ただし、ＡＳＩＣで構成されたシステムでは、ＦＰＧＡで構成されたシステムと違って、Ｎｏｄｅ  Ｍｏｄｕｌｅを交換する際にのみ、メインリセットを使うことが想定される。そのため、ＡＳＩＣで構成されたシステムでは、各ブロックおよび各ポートのソフトリセットなどが実装される必要がある。
【０１７５】
例えば、ポートからＳｌｅｅｐ状態を解除されたモジュールが、ソフトリセットをかけてから起動しても良いし、Ｓｌｅｅｐ状態に入る際にソフトリセットをかけて、Ｓｌｅｅｐ解除前にソフトリセットを解除してから稼働しても良い。
【０１７６】
［ＴＥＳＴ構成］
ＡＳＩＣで構成されたシステムでは、ＴＥＳＴ構成として、Ｎｏｄｅ  Ｍｏｄｕｌｅのクロック系（ＰＬＬ、ＣＬＫＧＥＮ）や、搭載ＲＡＭのｂｉｔエラー、ＮＡＮＤフラッシュメモリの状態などの情報を外部から確認できる機能が必要となる。ＲＡＭの情報へのアクセスは、ＲＡＭ  ＢＩＳＴを使うことにより行うことができる。ＰＬＬモジュールの機能確認は、ＭＵＸ制御で行うことができる。ＮＡＮＤフラッシュメモリの状態を判断する際は、Ｎｏｄｅ  Ｍｏｄｕｌｅからのアクセス履歴などを用いて判断する必要があるため、ＮＡＮＤフラッシュメモリとＮｏｄｅ  Ｍｏｄｕｌｅを１チップ化した場合は、システムはその情報にアクセスできる機能を備える必要がある。
【０１７７】
［ＧａｔｅｄＣｌｏｃｋ構成］
ＣＬＫの源信に近い部分のＯＮ／ＯＦＦは、レジスタ制御で行われる。
【０１７８】
ＡＳＩＣで構成されたシステムでは、Ｎｏｄｅ  ＭｏｄｕｌｅはＬＶＤＳ  I／Ｆでパケットの先頭を検知することで、パケット毎にＬｉｎｋを行う。これにより、パケットが来ていない場合、ＬＶＤＳ  I／Ｆより内部の回路は、ＧａｔｅｄＣｌｏｃｋにより停止することができる。停止した回路の起動は、パケットの先頭が来たことにより、ＧａｔｅｄＣｌｏｃｋで回路をアクティブにされることで行われ、パケットの処理が完了し、次のパケットが来ていない場合にＧａｔｅｄＣｌｏｃｋで回路をディアクティブにする。
【０１７９】
Ｎｏｄｅ  Ｍｏｄｕｌｅがアクセス可能なＲＡＭはＧａｔｅｄＣｌｏｃｋによりディアクティブにされ、アクセスする時にだけＧａｔｅｄＣｌｏｃｋをイネーブルにし、そのＲＡＭをアクティブにする。
【０１８０】
数クロック毎に複数ｂｉｔを更新するＦＦなど，制御信号が予め分かっている場合、その制御信号を使ってＧａｔｅｄＣｌｏｃｋを組み込むことができる。注意すべき点は、ＧａｔｅｄＣｌｏｃｋはＳｕｂＭｏｄｕｌｅとして実装し、通常回路と混ぜないことである。
【０１８１】
［高速シリアル転送の構成］
高速シリアル転送として、例えば差動信号のＬＶＤＳが採用される。
【０１８２】
［パッケージの検討］
パッケージとして、例えばフラットパッケージの１４４ピンなどが候補となるが、ＡＳＩＣで構成されたシステムでは、高速Ｉ／Ｆなどを複数実装するため、ノイズ対策や接点の接触などを避けるため、ＢＧＡなどＰＩＮが内側に隠れるパッケージが望ましい。
【０１８３】
ＳＲＡＭ、ＤＤＲ／２／３やＮＡＮＤ  Ｉ／Ｆなどは、アドレス、データ幅のＰＩＮ数が必要となる。この部分は、他の信号と共通化できる物できる、Ｉ／ＦによってはＰＩＮ数が増大する可能性があるため、必要以上のＲＡＭを搭載しないことが望ましい。
【０１８４】
ＮＡＮＤフラッシュメモリおよびＤＤＲまたはＳＲＡＭと、Ｎｏｄｅ  ＭｏｄｕｌｅのＡＳＩＣチップとを基板上に並べて配置した場合に比べ、マルチチップ構造にして１チップ化することで実装面積を削減することが可能であり、またＰＩＮ数も削減することが可能となる。
【０１８５】
［電圧の検討］
ＦＰＧＡで構成されたシステムでは、ＮＡＮＤフラッシュメモリと、ＬＶＤＳ（Ｓｅｒｉａｌｉｚｅｒ／Ｄｅｓｅｒｉａｌｉｚｅｒ）チップへの入力が、例えば３.３Ｖであり、それに合わせて全体が作成される。ＦＰＧＡのコア電圧が異なる場合、ＤＣ−ＤＣコンバーターで変圧して電力を提供する必要がある。ＡＳＩＣで構成されたシステムでは、コア電源として例えば１.５Ｖが、Ｉ／Ｏは例えば１.８Ｖの電圧が想定される。
【０１８６】
［Ｎｏｄｅ  Ｍｏｄｕｌｅカードの検討］
Ｎｏｄｅ  Ｍｏｄｕｌｅカードに対してＮｏｄｅ  Ｍｏｄｕｌｅを１モジュール実装したと仮定する。Ｎｏｄｅ  Ｍｏｄｕｌｅカードは、Ｎｏｄｅ  Ｍｏｄｕｌｅ  ＡＳＩＣチップ１つに対して、ＮＡＮＤを少なくとも１つ、ＳＲＡＭまたはＤＲＡＭを少なくとも１つの３チップ構成となる。またカード内には、ＤＣ−ＤＣ変換チップ、ＬＥＤ表示等が実装される。Ｎｏｄｅ  Ｍｏｄｕｌｅカードは、ＨｏｔＳｗａｐに対応するため、マザーボードとの接続に、ＨｏｔＳｗａｐ対応のコネクタを使用する必要がある。
【０１８７】
［Ｎｏｄｅ  Ｍｏｄｕｌｅ間データ転送手順の検討］
ＦＰＧＡで構成されたシステムでは、８ｂｉｔのデータに対して３ｂｉｔのＮｏｄｅ  Ｍｏｄｕｌｅ  Ｐｏｒｔ間の制御信号を付加した１１ｂｉｔで通信を行う。Ｉ／Ｆとして８ｂｉｔ幅のものが採用された場合、このＰｏｒｔ間の制御信号が使えなくなる。この場合、通信の手法としてＮｏｄｅ  Ｍｏｄｕｌｅ間のパケットを別途定義するか、転送するパケットの最後に制御情報を追加するかの２択となる。後者の場合、制御信号を共有するためにパケットの送受信を行う必要があり、負荷が増大してしまう。そのため、前者の方式が望ましい。 
【０１８８】
［Ｎｏｄｅ  Ｍｏｄｕｌｅ  ＧＰＩＯの検討］
ＡＳＩＣで構成されたシステムは、Ｎｏｄｅ  Ｍｏｄｕｌｅの状態（ＯＫＡＹ／ＥＲＲＯＲ／Ｅｔｃ）などの情報を通知するＬＥＤと、モード情報を設定するＤＩＰ−ＳＷなどが実装される。ＤＩＰ−ＳＷは、外部ＲＡＭ  Ｉ／Ｆの選択（ＤＤＲ／ＳＲＡＭ）とＮＡＮＤ  Ｉ／Ｆのアクセス選択（レガシ／Ｔｏｇｇｌｅ  ＤＤＲ）などを行う。
【０１８９】
ＡＳＩＣで構成されたシステムでは、テスト用途として、ＵＡＲＴまたはＩ２ＣをＧＰＩＯ内に割り振り、Ｎｏｄｅ  Ｍｏｄｕｌｅの内部を直接制御できる様にすることが望ましい。
【０１９０】
［Ｎｏｄｅ  Ｍｏｄｕｌｅ 外部メモリＩ／Ｆの検討］
Ｎｏｄｅ  Ｍｏｄｕｌｅの外部メモリには、速度やＣｈｉｐ電圧等を考慮すると、例えばＤＤＲ２  ＳＤＲＡＭが用いられる。ＳＲＡＭ等についても、例えば電源電圧が１．８Ｖのものを用いる。複数のＲＡＭに対してそれぞれ専用ＰＩＮを設計しておき、どちらの外部メモリＩ／Ｆを有効にするかを選択することで、複数のＲＡＭを個別にアクセスすることが可能となる。ＳＲＡＭのＰＩＮについては、同時に使用しないことが分かる場合は、他のＧＰＩＯと共通化しても構わない。
【０１９１】
［システム構造の検討］
ブレードサーバー型のシステムは、例えば、１つ以上のＮｏｄｅ  Ｍｏｄｕｌｅと１つ以上コネクションユニット１４を同じ基板に実装したドーターカードを、複数搭載可能なマザーボードが含まれる１つ以上のＳｙｓｔｅｍ  Ｂｏｘによって構成される。Ｓｙｓｔｅｍ  Ｂｏｘ間の接続は、サーバー背面にまとめておき、ブレード基板側から電源と情報コネクタで接続される。
【０１９２】
Ｓｙｓｔｅｍ  Ｂｏｘを引き出しても、サーバー背面の電源と情報コネクタは外れない構造とすることで、Ｓｙｓｔｅｍ  Ｂｏｘを引き出した状況でも、稼働状態を継続させることが可能である。
【０１９３】
［Ｎｏｄｅ  Ｍｏｄｕｌｅの座標設定手順の検討］
Ｎｏｄｅ  Ｍｏｄｕｌｅの座標を、隣接するＮｏｄｅ  Ｍｏｄｕｌｅとの位置関係で決定する場合、各Ｓｙｓｔｅｍ  Ｂｏｘ内の座標設定は、隣接するＳｙｓｔｅｍ  Ｂｏｘ内の座標設定と整合性をとる必要がある。
【０１９４】
［Ｎｏｄｅ  Ｍｏｄｕｌｅ ＡＳＩＣ版］
図２９は、ＡＳＩＣ化を想定したＮｏｄｅ  Ｍｏｄｕｌｅの内部構成例を示す図である。なお、ＰＣＵは、Ｐａｃｋｅｔ  Ｃｏｍｍａｎｄ  Ｕｎｉｔである。ＰＲＵは、Ｐａｃｋｅｔ  Ｒｏｕｔｉｎｇ  Ｕｎｉｔである。ＰＧＵは、Ｐａｃｋｅｔ  Ｇｅｎｅｒａｔｉｏｎ  Ｕｎｉｔである。ＮＩＵは、Ｎｏｄｅ  Ｉｎｆｏｒｍａｔｉｏｎ  Ｕｎｉｔである。ＮＰＭＵは、Ｎｏｄｅ  Ｐｏｗｅｒ  Ｍａｎａｇｅｍｅｎｔ  Ｕｎｉｔである。ＰＤＭＡは、Ｐａｃｋｅｔ  Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓである。ＰＲＩＵは、Ｐａｃｋｅｔ  Ｒｘ  Ｉｎｔｅｒｆａｃｅ  Ｕｎｉｔである。ＰＴＩＵは、Ｐａｃｋｅｔ  Ｔｘ  Ｉｎｔｅｒｆａｃｅ  Ｕｎｉｔである。また、図には示さないがＮｏｄｅ  Ｍｏｄｕｌｅは、ＰＨＡＵ（Ｐａｃｋｅｔ  Ｈｅａｄｅｒ  Ａｎａｌｙｓｉｓ  Ｕｎｉｔ）を持つ。ＰＡ、ＰＢ、ＰＣについては、ＧＰＩＯ制御が想定されている。
【０１９５】
［Ｈｉｇｈ  Ｓｐｅｅｄ  Ｓｅｒｉａｌ  Ｉｎｔｅｒｆａｃｅ  ＰＯＲＴ［０〜３］］
例えば１Ｇｂｐｓのシリアル差動信号に対して、例えば４相のサンプリングを行い、パケットの先頭を使って同期をとり、移行のヘッダ情報およびペイロード部を内部に取り込む。取り込んだ際に、シリアルからパラレルに変換し、例えば８ｂｉｔまたは、３２ｂｉｔに変換してＲＡＭに書き込む。
［ＰＲＩＵ］
ＰＲＩＵでは、パケットを受け取ると、ヘッダが正しいかＣＲＣチェックを行う。問題なければ、ＰＴＩＵ経由でＯＫＡＹパケット（ＰＯＲＴ間パケット）を通知する。ＥＲＲＯＲの場合は、ＥＲＲＯＲパケット（ＰＯＲＴ間パケット）または、ＲＥＴＲＹパケット（ＰＯＲＴ間パケット）を通知する。ヘッダが正しいと判断し、送信先座標が自座標であれば、ＰＣＵ（Ｐａｃｋｅｔ  Ｃｏｍｍａｎｄ  Ｕｎｉｔ）に通知（割り込み）を行う。他座標であれば、ＰＲＵ（Ｐａｃｋｅｔ  Ｒｏｕｔｉｎｇ  Ｕｎｉｔ）に通知（割り込み）を行う。
【０１９６】
その後、ＰＣＵ、ＰＲＵからの指示により、ＰＤＭＡによりパケットを所定の場所にコピーする。コピーが正常終了した場合は、ＰＤＭＡからＯＫＡＹのレスポンスが帰り、ＰＲＩＵからＲＡＭ上のパケットが削除される。この場合の削除とは、Ｈｉｇｈ  Ｓｐｅｅｄ  Ｓｅｒｉａｌ  Ｉｎｔｅｒｆａｃｅ側にＲＡＭを解放することである。
【０１９７】
［ＰＴＩＵ］
ＰＴＩＵでは、ＰＤＭＡからのパケットやＰＲＩＵからのＰＯＲＴ間パケットをＲＡＭに書き込む。ＲＡＭにパケットが格納された後は、Ｈｉｇｈ  Ｓｐｅｅｄ  Ｓｅｒｉａｌ  Ｉｎｔｅｒｆａｃｅ側から送出する。
【０１９８】
［ＰＣＵ］
ＰＣＵは、各ポートからの通知（割り込み）により、ポートに格納されているパケットのヘッダ情報を読み出し、命令解析を行う。解析した結果を元にＰＤＭＡに対して、転送指示を行う、もしくはペイロードに埋め込まれている連続命令の解析を行い、ＣＯＰＹ、演算、サーチなどの命令の実行を行う。
【０１９９】
［ＰＲＵ］
ＰＲＵは、他座標や戻りパケットに対しての使用ポートのルーティングを計算する。ポートパケットによる情報と、自パケットの状況を踏まえて、例えば４方向のポートを検討する。ＰＲＵでは、パケットリミット値制御も行う。
【０２００】
［ＰＧＵ］
ＰＧＵは、ＰＣＵやＰＲＩＵからの要求により、パケットの構築を行い、指示したモジュールに対して通知（割り込み）する。
【０２０１】
［ＩＮＴＣ］
ＩＮＴＣは、ＰＲＩＵ、ＰＴＩＵやＰＤＭＡなどからの通知（割り込み）を受け取る。ラウンドロビン動作により順番に処理を行う。
【０２０２】
［ＮＩＵ］
ＮＩＵは、Ｎｏｄｅ  Ｍｏｄｕｌｅの各ポートからの状況やデータの流れを蓄積し、ＰＣＵからの問い合わせの際に情報を提示する。また、ＮＡＮＤアクセスの履歴情報などの管理を行う。 
【０２０３】
［ＮＰＭＵ］
ＮＰＭＵは、Ｎｏｄｅ  Ｍｏｄｕｌｅ内の電力制御を行う。このブロックは、指定間隔使用されない機能について停止制御を自動に制御する。機能復帰は、ＰＣＵ、ＰＲＩＵ、ＰＴＩＵ、ＰＤＭＡなどの機能ブロックから行う。
【０２０４】
［ＰＤＭＡ］
ＰＤＭＡは、ＰＲＩＵやＰＣＵなどの指示（転送コマンド）により、転送元アドレスから転送先アドレスに対して指定サイズ転送を行う。転送が完了すると指示元に通知（割り込み）を行う。通知を受け取った側はステータス情報を読み出して正常終了していることを確認する。転送コマンドは、パケットサイズと共に転送元と転送先の組み合わせのコマンドをセットする。ＰＤＭＡは複数Ｃｈで構成される。
【０２０５】
［Ｂｕｆｆｅｒ］
Ｂｕｆｆｅｒは、パケットの保持などを行い、汎用の内部ＲＡＭで構成される。
【０２０６】
［ＴＩＭＥＲ］
ＴＩＭＥＲは、タイミング調整用のタイマである。ＴＩＭＥＲは、指定間隔で問い合わせを行ったりする場合に使用される。カウントダウンタイマで、０になると通知（割り込み）する。
【０２０７】
［内部バス］
内部バスは、ＢｕｓＭａｔｒｉｘ構成になっている。内部バスは、ＰＤＭＡの転送が停止しない様に複数定義される。内部バスの構成は、ＡＨＢをベースとする。
【０２０８】
［ＣＬＫＧＥＮ］
ＣＬＫＧＥＮでは、Ｈｉｇｈ  Ｓｐｅｅｄ  Ｓｅｒｉａｌ  Ｉｎｔｅｒｆａｃｅの源信周波数および、各種内部周波数やＧＰＩＯなどの低速デバイス用などのクロックを生成する。なお、ＧａｔｅｄＣｌｏｃｋ等は含まない。機能ブロック毎にＧａｔｅｄＣｌｏｃｋ付きのクロック信号が用意してもよい。図３０は、ＣＬＫＧＥＮの構成を示す図である。
【０２０９】
［ＲＳＴＧＥＮ］
ＲＳＴＧＥＮでは、図３１に示すＲＳＴＧＥＮ回路が実装される。ＡＳＩＣのルールに従った回路を実装する必要がある。
【０２１０】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０２１１】
１  ストレージ装置、２  アプリケーションサーバ、１０  記憶部、１１  メモリノード、１２  入力ポート、１３  出力ポート、１４  コネクションユニット、１５  スイッチ、１６  ロードバランサ、１４０  第１のインターフェース装置、１５０  第２のインターフェース装置、２００  コントローラ、２０２  Ｉ／Ｏブロック、２０３  入力ポートバッファ、２０４  出力ポートバッファ、２０５  ルーティングコントローラ、２０７  コマンドプロセッサ、２０８  ＳＲＡＭ、２０９  バッファ、２１１  不揮発メモリ  Ｉ／Ｆ、２１２  ＲＡＭ  Ｉ／Ｆ、２１３  ＥＣＣ／ライダマイズ部、３００  不揮発メモリ、３０１  Ｌ２Ｐテーブル、３０２  物理アドレス空間、５００  符号化回路、６００  受信ペイロード領域、６０１、６０２  コマンド、６０３  先頭ポインタ、７００  送信ペイロード領域、７０１  先頭ポインタ。
【図１】
0005931816.tif 000002
【図２】
0005931816.tif 000003
【図３】
0005931816.tif 000004
【図４】
0005931816.tif 000005
【図５】
0005931816.tif 000006
【図６】
0005931816.tif 000007
【図７】
0005931816.tif 000008
【図８】
0005931816.tif 000009
【図９】
0005931816.tif 000010
【図１０】
0005931816.tif 000011
【図１１】
0005931816.tif 000012
【図１２】
0005931816.tif 000013
【図１３】
0005931816.tif 000014
【図１４】
0005931816.tif 000015
【図１５】
0005931816.tif 000016
【図１６】
0005931816.tif 000017
【図１７】
0005931816.tif 000018
【図１８】
0005931816.tif 000019
【図１９】
0005931816.tif 000020
【図２０】
0005931816.tif 000021
【図２１】
0005931816.tif 000022
【図２２】
0005931816.tif 000023
【図２３】
0005931816.tif 000024
【図２４】
0005931816.tif 000025
【図２５】
0005931816.tif 000026
【図２６】
0005931816.tif 000027
【図２７】
0005931816.tif 000028
【図２８】
0005931816.tif 000029
【図２９】
0005931816.tif 000030
【図３０】
0005931816.tif 000031
【図３１】
0005931816.tif 000032