以下に添付図面を参照して、実施形態にかかるストレージ装置を詳細に説明する。なお、これらの実施形態により本発明が限定されるものではない。
(第1の実施形態)
図1は、第1の実施形態に係るストレージ装置の構成例を示す図である。ストレージ装置1は、1以上のアプリケーションサーバ2に接続されている。アプリケーションサーバ2は、クライアント端末(図示せず)とネットワークを介して接続されている。アプリケーションサーバ2は、ストレージ装置1に対する要求をネットワークを介して受信することができる。アプリケーションサーバ2は、クライアント端末から受信した要求をストレージ装置1に転送する。要求とは、例えば、データを書き込んだりデータを読み出したりする要求を含む。図1に示されたように本ストレージ装置1は、独立した複数のスイッチ15、ロードバランサ16を持つことができる。ストレージ装置の規模拡大につれてスイッチ15、およびロードバランサ16の性能向上が不要となっており、スケールアウトに適した構成となっている。
ストレージ装置1は、記憶部10、スイッチ15、およびロードバランサ16を備える。記憶部10は、記憶機能およびデータ転送機能を有する複数のメモリノード11を相互に接続した構成を備える。データ転送機能は、各メモリノード11が効率的にパケットを転送する転送方式を備える。
図1において、記憶部10は、複数のメモリノード11に対してデータが分散して格納される。図1の例では、各メモリノード11は、矩形格子の格子点に配置される。格子点の座標を座標(x、y)で示し、格子点に配置されるメモリノード11の位置情報は、当該格子点の座標と対応してノードアドレス(xD、yD)で示されるものとする。また、図1の例では、左上隅に位置するメモリノード11が原点のノードアドレス(0、0)を有し、各メモリノード11を横方向(X方向)および縦方向(Y方向)に移動することで、ノードアドレスが整数値で増減する。
各メモリノード11は、それぞれ、2つ以上の入力ポート12および2つ以上の出力ポート13を備えている。各メモリノード11は、隣接するメモリノード11と、入力ポート12および出力ポート13を介して接続される。より具体的には、対向する2つの隣接するメモリノード11は、互いの入力ポート12および出力ポート13を介して接続される。
また、各メモリノード11は、2以上の異なる方向に隣接するメモリノード11と接続される。例えば、図1において左上隅のノードアドレス(0、0)で示されるメモリノード11は、X方向に隣接するノードアドレス(1、0)で表されるメモリノード11と、X方向とは異なる方向であるY方向に隣接するノードアドレス(0、1)で表されるメモリノード11と、それぞれ接続される。また、図1においてノードアドレス(1、1)で表されるメモリノード11は、互いに異なる4の方向に隣接する、ノードアドレス(1、0)、(0、1)、(2、1)および(1、2)でそれぞれ示される4のメモリノード11に接続される。以降、ノードアドレス(xD、yD)で表されるメモリノード11を、メモリノード(xD、yD)と表記することがある。また、入力ポート12および出力ポート13を総称して入出力ポート12、13と表記することがある。
記憶部10は、少なくとも1つのコネクションユニット14を備える。コネクションユニット14は、入力ポート12および出力ポート13を介してメモリノード11に接続される。このとき、メモリノード11同士の通信規格とコネクションユニット14の通信規格とが異なる場合は、両者の間にアダプタを設けてもよい。図1の例では、コネクションユニット14は、各メモリノード11が配置される2次元の正方格子のx方向およびy方向それぞれの一方向の各端に、それぞれ接続されているが、これに限定されるものではない。
アプリケーションサーバ2から入力された要求は、スイッチ15を介してロードバランサ16に入力される。ロードバランサ16は、各コネクションユニット14の状態を調べ、処理に余裕があるコネクションユニット14を選択する。そして、ロードバランサ16は、スイッチ15を操作して、選択したコネクションユニット14に要求を転送する。
本実施例では、構成要素がスイッチ15とロードバランサ16の2つある場合を示しているが、スイッチ15にロードバランサ16の機能を内蔵させ、ロードバランサ16を設けない構成であってもかまわない。
コネクションユニット14は、メモリノード11が転送したり実行したりすることが可能なパケットを生成し、生成したパケットを、自コネクションユニット14に接続されているメモリノード11に送信する。
パケットは、そのパケットを受信したメモリノード11が所定の転送アルゴリズム(後述する)に基づいてルーティング先を決定することで、メモリノード11間を転送されて、宛先のメモリノード11に到達する。また、メモリノード11は、転送アルゴリズムに基づいて、故障または混雑しているメモリノード11を迂回するようにルーティング先を決定することができる。ここで、メモリノード11の故障が特定の形状で生じている場合、同じメモリノード11をパケットが循環してしまい、結果としてそのパケットにかかる処理がいつまでたっても完了しないという事態が発生する。また、コネクションユニット14がパケットを送信してから応答を受信するまでの時間は、記憶部10内を転送中および処理中のパケットの総数の増加に応じて増大する。これは、パケット数の増加により混雑が発生し、パケット転送を妨げるからである。パケットが同じメモリノード11を循環したまま宛先のメモリノード11に到達しない場合には、記憶部10内に滞留するパケットが増加し、結果としてストレージ装置1全体のスループット性能が低下する。第1の実施形態によれば、パケットに、転送によって減少する寿命が記録され、寿命が所定値以下となった場合には、そのパケットは破棄される。
図2は、第1の実施形態のパケットの構成を説明する図である。パケットは、宛先のノードアドレス、送り元のノードアドレス、寿命、およびコマンド(命令)が記録されて構成される。即ち、コマンドには寿命が付加されている。
寿命は、コネクションユニット14によって算出され、パケットに記録される。寿命は、例えば、パケットを生成したコネクションユニット14からそのパケットの宛先のメモリノード11までの最短経路における転送回数に基づいて算出される。例えば、寿命は、最短経路における転送回数に所定の定数を乗じて得られる、正の整数値である。メモリノード11間の転送中に寿命が所定値(ここでは「0」)以下となった場合には、メモリノード11によってそのパケットは破棄される。これにより、最短経路が短いパケットが不必要に長い時間だけ記憶部10内に滞留したり、最短距離が長いパケットが故障したメモリノード11を迂回することが出来なくなったりすることを防止することができる。
ここでは例として、寿命は転送回数に基づいて算出されるとしたが、これに限定されるものではない。例えば、ユーザー(人間)が定義した変数を寿命として設定する方式も考えられる。この方式では、寿命を算出する処理がないため、更なる演算負荷軽減が可能となる。
また、コネクションユニット14は、コネクションユニット14から最も離れているメモリノード11までの最短経路における転送回数に基づいた算出値を固定値として持っておいて、その固定値を寿命としてパケットに付加するようにしてもよい。転送回数に基づいた算出値は、例えば初期化時またはメモリノード11追加時などのタイミングにおいて算出されることが想定される。寿命を固定値とすることにより、コネクションユニット14がパケットを受けるたびにパケット内の宛先を基に寿命を計算する処理を実行する必要が無くなり、コネクションユニット14の演算負荷が軽減される。
なお、パケットは、アプリケーションサーバ2から受信した要求に応じて生成される。例えば、要求されたデータが複数に分割されて、分割されたデータが夫々異なる複数のメモリノード11に分散して格納されている場合には、コネクションユニット14は、分割されたデータの格納先のメモリノード11を全て特定して、特定した全てのメモリノード11から分割されたデータを読み出すためのパケットをメモリノード11毎に生成する。例えば、コネクションユニット14は、特定したメモリノード11のノードアドレスを宛先のノードアドレスとしてパケットに記録し、自コネクションユニット14が接続している最初にパケットを転送するメモリノード11のノードアドレスを送り元のノードアドレスとしてパケットに記録する。また、コネクションユニット14は、分割されたデータを読み出すコマンドをパケットに記録する。
図3は、コネクションユニット14の構成の一例を示す図である。コネクションユニット14は、データを処理するためのプロセッサに該当するマイクロプロセッサ(MPU)110、主記憶となるランダムアクセスメモリ(RAM)120、第1のインターフェース装置140、第2のインターフェース装置150を備える。第1のインターフェース装置140は、スイッチ15と通信するためのものである。第2のインターフェース装置150は、メモリノード11と通信をするためのものである。MPU110、RAM120、第1のインターフェース装置140および第2のインターフェース装置150は、互いにBUS130によって接続されている。ここで、第1のインターフェース装置140、および第2のインターフェース装置150は、それぞれ複数であってもかまわない。この他に、RAM120とは異なる不揮発なメモリを有していてもかまわない。
MPU110としては、例えばARM製A9またはIntel製のCore i7などが適用可能である。この場合、BUS230もMPU110に合わせて、それぞれAMBA BUSまたはQPI(Quick Path Interconnect)BUS等が適用される。RAM120としては、例えばDRAMなどの揮発性メモリが適用可能である。また、RAM120として、MRAM、PcRAM、またはRRAM(登録商標)等も適用可能である。外部のネットワークとの間で通信を行うネットワーク通信部に相当する、第1のインターフェース装置140としては、例えばイーサネット(登録商標)、インフィニバンド、ファイバーチャネルといったネットワークインターフェースが適用可能である。また、第1のインターフェース装置140としては、PCI Express、Universal serial bus、Serial attached SCSIなどの外部BUS、あるいはストレージインターフェース等が適用可能である。また、第2のインターフェース装置150は、MPU110がBUS130を通してメモリノード11との通信を行うものである。
図4は、メモリノード11の構成の一例を示す図である。メモリノード11は、コントローラ200と、不揮発メモリ300とを備えている。不揮発メモリ300は、ストレージを構成する。なお、ストレージを構成するメモリとしては、不揮発メモリ300には、NANDフラッシュメモリ、ビットコストスケーラブルメモリ(BiCS)、磁気抵抗メモリ(MRAM)、相変化メモリ(PcRAM)、および、抵抗変化型メモリ(RRAM(登録商標))等が適用可能である。
図5は、メモリノード11の構成の別の例を示す図である。この例では、メモリノード11は、一時記憶領域を提供するメモリであるRAM400を新たに備えている。RAM400は、不揮発メモリ300と比べて、速度やランダムアクセス性能、書換可能回数が優れるメモリを用いることが望ましい。なお、RAM400としては、例えば、DRAM、MRAM、PcRAM、またはRRAM(登録商標)等が採用可能である。
RAM400には、例えば、読み書き回数の多いメタ情報と呼ばれるデータが格納される。メタ情報の例としては、個々のメモリノード11の記憶領域にマッピングされた論理的なアドレス(論理アドレス)と、不揮発メモリ300またはRAM400中における物理的なアドレス(物理アドレス)と、が異なる場合、相互を変換するためのテーブル情報が挙げられる。また、メタ情報の別の例としては、不揮発メモリ300またはRAM400に記録されたデータに関する、属性情報が挙げられる。また、図4および図5では、隣接したメモリノードへのインターフェースが4つの場合を示しているが、これに限定されるものではない。
図6は、コントローラ200の構成の一例を示す図である。コントローラ200は、0番から4番までのポート番号が夫々割り当てられた5つの入力ポート12と、0番から4番までのポート番号が夫々割り当てられた5つの出力ポート13と、I/Oブロック202、入力ポートバッファ203、出力ポートバッファ204を備えている。0番の入出力ポート12、13は、コネクションユニット14とのデータ通信に用いられる。また、1〜4番の入出力ポート12、13はそれぞれ隣接するメモリノード11とのデータ通信に用いられる。ここでは入力ポート12および出力ポート13が、それぞれ5つの場合を示しているが、これに限定されるものではない。
入力ポート12からパケットが入力されると、そのパケットは入力ポートバッファ203に一時的に格納される。ルーティングコントローラ205が、パケットに記録された宛先のノードアドレスおよび送信元のノードアドレスと、そのメモリノード11自身のノードアドレスと、接続先のメモリノード11が故障または混雑しているか否かと、に基づいて、パケットのルーティング先を決定する。そして、ルーティングコントローラ205は、寿命の減算を行った後、マルチプレクサ(MUX)206を切り替えて、適切な出力ポートバッファ204へとパケットを転送する。寿命の操作によって寿命が所定値以下となった場合には、ルーティングコントローラ205は、例えばそのパケットを転送せずに消去する。
なお、入力されたパケットが自分宛てのパケットだった場合は、パケットはコマンドプロセッサ207へと送られる。コマンドプロセッサ207は、SRAM208に対する読み書き、不揮発メモリ I/F211を介した不揮発メモリ300に対する読み書き、または、RAM I/F212を介したRAM400に対する読み書き等、パケットに応じた処理を行う。例えばパケットがデータの読み出しコマンドである場合には、コマンドプロセッサ207は、不揮発メモリ300またはRAM400から該当のデータを読み出して、読み出したデータを含む新たなパケットを生成して、生成したパケットを出力ポートバッファ204に送信する。
I/Oブロック202の内部には、各入出力ポート12、13に対するエラー検出回路が設けられている。エラー検出回路は、データの送受信の最中に異常が発生した場合、ならびに、コントローラ200、不揮発メモリ300、またはRAM400等に異常が発生した場合に、隣接したメモリノード11に対してエラー情報を送信する。このことにより、隣接したメモリノード11は、データの転送を行う前に、エラーを検出し、異常の生じたメモリノードとデータの送受信をしないようになる。コマンドプロセッサ207は、ステータスレジスタを介してエラー情報を認識することができる。
例えば、信号が来ていない状態は、エラーとして検出される。なお、コントローラ200については、例えばRAM I/F212を設けない構成であってもよい。
ECC/ライダマイズ部213は、不揮発メモリ300にデータが書き込まれる際に、書き込み対象のデータをランダマイズしたり、書き込み対象のデータに対してECC符号を付加したりする。
図1を参照して、転送アルゴリズムについて説明する。メモリノード(0、0)に接続されているコネクションユニット14が、メモリノード(2、2)に対してパケットを送る場合について説明する。本来的には、メモリノード(0、0)を出発地点とし、メモリノード(2、2)を目的地とし、出発地点から目的地までの最短経路をパケットが転送されるようにメモリノード11のルーティングコントローラ205がルーティングを行う。最短経路とは、転送回数が最小となる経路であって、例えば、ノードアドレスが(0、0)、(1、0)、(1、1)、(1、2)、(2、2)で表される夫々のメモリノード11をこの順番で転送される経路が該当する。
例えば、メモリノード(1、1)が故障または混雑していて、メモリノード(1、0)がメモリノード(1、1)にパケットを転送できない場合を想定する。この場合には、メモリノード(1、0)が、前述の最短経路を構成するメモリノード(1、1)よりも優先順位が低い、メモリノード(2、0)をルーティング先に選択する。これにより、メモリノード(1、0)からメモリノード(2、1)を経由して目的地に至るようにルーティングされる。なお、夫々のメモリノード11は、I/Oブロック202に設けられたエラー検出回路によって、接続されているメモリノード11が故障しているか否かを認識することができる。エラー検出回路はデータ転送の際にエラーを検出しても良いし、隣接ノードからエラー信号を受信することで検出してもよい。また、夫々のメモリノード11は、出力ポートが混雑しているかどうかを認識することができる。例えば、出力ポートバッファ204に、送信されていないパケットが存在するか否かを判定することによって、接続先のメモリノード11が混雑しているか否かを認識しても良いし、隣接ノードからビジー信号を受け取ることで認識してもよい。
なお、接続先のメモリノード11のうちの最短経路を構成するメモリノード11が複数存在する場合に、当該最短経路を構成するメモリノード11のうちの何れに1位の優先順位を設定するかは任意である。また、3位以降の優先順位が設定されるようにしてもよい。
次に、第1の実施形態のストレージ装置1の動作を説明する。
図7は、ロードバランサ16の第1の実施形態の動作を説明するフローチャートである。ロードバランサ16は、アプリケーションサーバ2から要求を受信すると(S1)、記憶部10を構成するコネクションユニット14のうちから処理に余裕のあるコネクションユニット14を1つ、選択する(S2)。そして、ロードバランサ16は、ステップS2の処理によって選択したコネクションユニット14に要求を転送する(S3)。ロードバランサ16は、要求を転送後、要求に応じた応答、または、後述する破棄通知を待ち受ける。ロードバランサ16は、コネクションユニット14から応答を受信したか否かを判定する(S4)。応答を受信していない場合には(S4、No)、ロードバランサ16は、破棄通知を受信したか否かを判定する(S5)。破棄通知を受信していない場合には(S5、No)、ロードバランサ16は、ステップS4の判定処理を再び実行する。応答を受信した場合には(S4、Yes)、ロードバランサ16は、応答をアプリケーションサーバ2に送信し(S6)、動作を終了する。
コネクションユニット14から破棄通知を受信した場合には(S5、Yes)、ロードバランサ16は、ステップS2にて選択したコネクションユニット14と異なるコネクションユニット14を1つ、選択する(S7)。そして、ロードバランサ16は、ステップS7の処理によって選択したコネクションユニット14に要求を転送する(S8)。ロードバランサ16は、要求の転送後、コネクションユニット14から応答を受信したか否かを判定する(S9)。応答を受信していない場合には(S9、No)、ロードバランサ16は、破棄通知を受信したか否かを判定する(S10)。破棄通知を受信していない場合には(S10、No)、ロードバランサ16は、ステップS9の判定処理を再び実行する。応答を受信した場合には(S9、Yes)、ステップS6の処理を実行し、動作を終了する。
再び破棄通知を受信した場合には(S10、Yes)、ロードバランサ16は、アプリケーションサーバ2にエラー通知を送信し(S11)、動作を終了する。
図8は、コネクションユニット14の第1の実施形態の動作を説明するフローチャートである。コネクションユニット14において、第1のインターフェース装置140が要求を受信すると(S21)、MPU110は、パケットに宛先のノードアドレス、送り元のノードアドレス、およびコマンドを、受け付けた要求に応じて生成し、生成したこれらの情報をパケットに記録する(S22)。そして、MPU110は、ある算出値に基づいて寿命およびタイムアウト時間を算出する(S23)。ある算出値とは、例えば、宛先のメモリノード11と自コネクションユニット14との最短経路の転送回数などが挙げられる。そして、MPU110は、算出した寿命をパケットに記録する(S24)。
続いて、MPU110は、第2のインターフェース装置150に接続されているメモリノード11にパケットを送信する(S25)。MPU110は、パケットの送信後、算出したタイムアウト時間が経過するまでの間、宛先のメモリノード11からの応答を待ち受ける。MPU110は、応答を受信したか否かを判定する(S26)。応答を受信した場合には(S26、Yes)、MPU110は、受信した応答をロードバランサ16に転送し(S27)、コネクションユニット14の動作が終了する。応答を受信していない場合には(S26、No)、MPU110は、パケットの送信後からタイムアウト時間が経過したか否かを判定する(S28)。タイムアウト時間が経過していない場合には(S28、No)、MPU110は、ステップS26の処理を再び実行する。タイムアウト時間が経過した場合には(S28、Yes)、MPU110は、タイムアウト処理として、破棄通知をロードバランサ16に送信する(S29)。そして、コネクションユニット14の動作が終了する。
なお、ここではタイムアウトでロードバランサ16に破棄通知を送信したが、後述する寿命切れパケットの受信によって、破棄通知を送信してもよい。また、要求の受信にロードバランサ16を経由する説明をしたが、アプリケーションサーバ2やクライアントから直接コネクションユニット14に要求を出しても構わない。また、ロードバランサ16を介して要求を受けた際に、その応答を直接アプリケーションサーバ2やクライアントに返しても良い。
図9は、メモリノード11の第1の実施形態の動作を説明するフローチャートである。メモリノード11において、入力ポート12がパケットを受信すると(S31)、ルーティングコントローラ205は、パケットに記録された宛先のノードアドレスと自メモリノード11のノードアドレスとを比較することによって、パケットの宛先が自メモリノード11であるか否かを判定する(S32)。パケットの宛先が自メモリノード11である場合には(S32、Yes)、ルーティングコントローラ205によってパケットがコマンドプロセッサ207に送信され、コマンドプロセッサ207は、受信したパケットに記録されたコマンドに応じた処理を実行する(S33)。コマンドプロセッサ207は、処理を完了後、応答を生成する(S34)。生成された応答は、コマンドプロセッサ207内のバッファ209に一時的に格納される。
なお、応答は、図2を用いて説明したパケットと同様の構成を備えていてよい。例えば、コマンドがリードコマンドである場合には、コマンドプロセッサ207は、不揮発メモリ300からデータを読み出す。そして、コマンドプロセッサ207は、読み出したデータをコマンドの替りにパケットに記録する。コマンドがライトコマンドである場合には、コマンドプロセッサ207は、データを不揮発メモリ300に書き込み、書き込み完了通知をコマンドの替わりにパケットに記録する。また、コマンドプロセッサ207は、応答の送り元のノードアドレスとして、入力されたパケットに記録された宛先のノードアドレス(即ち自メモリノード11のノードアドレス)を記録し、応答の宛先のノードアドレスとして、入力されたパケットに記録された送り元のノードアドレスを記録する。なお、コマンドプロセッサ207は、応答に寿命を記録してもよいし、記録しなくてもよい。応答に記録される寿命は、例えば、コマンドプロセッサ207によってステップS23の処理と同様の処理によって算出される。ここではデータのアクセス先が不揮発メモリ300である場合について述べたが、SRAM208またはRAM400がデータのアクセス先であってもかまわない。
ルーティングコントローラ205は、転送アルゴリズムに従って、ルーティング先のメモリノード11を選択する(S35)。そして、ルーティングコントローラ205は、バッファ209に格納された応答を、選択したルーティング先のメモリノード11に送信する(S36)。
パケットの宛先が自メモリノード11ではない場合(S32、No)、ルーティングコントローラ205は、パケットに設定されている寿命を1だけ減算する(S37)。そして、ルーティングコントローラ205は、例えば寿命が「0」に等しいか否かを判定する(S38)。寿命が「0」に等しい場合(S38、Yes)、ルーティングコントローラ205は、パケットを破棄して(S39)、メモリノード11の動作が終了する。寿命が「0」に等しくない場合(S38、No)、ルーティングコントローラ205は、転送アルゴリズムに従って、ルーティング先のメモリノード11を選択する(S40)。そして、選択したルーティング先のメモリノード11にパケットを送信し(S41)、メモリノード11の動作が終了する。
図10は、以上のような動作によって転送されるパケットの経路の例を説明する図である。メモリノード(0、4)を送り元とし、メモリノード(4、1)を宛先とするパケットを考える。パケットは、最短経路で転送される場合には、7回の転送で宛先のメモリノード(4、1)に到達する。このパケットは、例えば、寿命が「7」に設定されているものとする。ここでは、メモリノード(2、1)、メモリノード(2、4)、メモリノード(3、2)、およびメモリノード(3、3)が故障している。パケットは、これらの故障したメモリノード11を迂回するために、例えば点線の矢印に示すようにルーティングされる。そして、このパケットは、7回の転送後、メモリノード(0、3)において寿命が「0」となり、破棄される。ここでは、寿命切れの際にパケットを破棄すると説明したが、パケットを破棄したメモリノード11は、寿命が切れたことを通知しても良い。通知の方法としては、パケットを破棄したメモリノード11が、寿命切れを示すパケットを生成して通知しても良いし、専用の通信経路を介して通知しても良い。この場合、夫々のメモリノード11は専用の通信経路を持ち、専用の通信経路を介してコネクションユニット14と直接繋がる構成となっている。また、専用の通信経路は、メモリノード故障やパケット転送失敗などのエラー情報を通知する経路、または、メモリノードの内部情報を通知する経路として使用してもかまわない。これにより、メモリノード内部のパケット数が増加しないため混雑が緩和できる。
なお、1回の転送あたりの寿命の減算量は、「1」であるものとして説明したが、転送にかかる時間が増加するに応じて増加してもよい。また、1回の転送あたりの寿命の減算量は、個別のメモリノード11においてコマンドプロセッサ207またはルーティングコントローラ205が算出してもよい。また、所定の時間が経過した際に減算しても構わない。また、寿命は整数に限定されない。
また、図1では、各メモリノードが矩形格子の格子点に配置されるように示したが、各メモリノードの配置は、この例に限定されない。すなわち、格子の形状は、格子点に配置される各メモリノードが2以上の異なる方向に隣接するメモリノードと接続されればよく、例えば三角形、六角形などでもよい。また、図1では各メモリノードが2次元状に配置されているが、コントローラの入出力ポート12、13の数を夫々2つ増やして、各メモリノードを3次元的に配置しても構わない。3次元的にメモリノードを配置した場合は、メモリノードは(x、y、z)の3つの値でその位置を指定することができる。
また、メモリノードが2次元的に配置される場合には、対辺に位置するメモリノード11同士を接続することによって、メモリノード11をトーラス状に接続するようにしてもよい。図11で示した例では、メモリノード11間は、実線で示す経路と点線で示す経路とで互いに接続されている。点線で示す経路は、実線で示す経路と等価である。このような場合、ノードアドレスのX座標値が増加する方向にルーティングするか減少する方向にルーティングするか、および/または、ノードアドレスのY座標値が増加する方向にルーティングするか減少する方向にルーティングするか、に応じて、複数の方向にルーティングすることが可能である。例えば、メモリノード(2、0)を送り元とし、メモリノード(2、3)を宛先とするパケットは、Y座標値が増加する方向にルーティングされる場合には、例えば、ノードアドレスが(2、0)、(2、1)、(2、2)、(2、3)のメモリノード11をこの順番で転送される。また、このパケットは、Y座標値が減少する方向にルーティングされる場合には、例えば、ノードアドレスが(2、0)、(2、4)、(2、3)のメモリノード11をこの順番で転送される。コネクションユニット14は、自コネクションユニット14に接続されたメモリノード11を起点としたルーティング方向を決定し、決定した方向をパケットに記録するようにしてもよい。夫々のメモリノード11においては、ルーティングコントローラ205は、パケットに記録された方向に基づいてルーティング先のメモリノード11が接続された出力ポート13を選択するようにしてもよい。また、コネクションユニット14は、1つの方向を設定したパケットを送信して、送信後にステップS28の判定処理においてタイムアウト時間の経過を検知すると、送信済みのルーティング方向とは異なる他のルーティング方向を記録したパケットを送信するようにしてもよい。また、コネクションユニット14は、他のルーティング方向を記録したパケットを送信した後にステップS28の判定処理においてタイムアウト時間の経過を検知した場合に、破棄通知をアプリケーションサーバ2側に送信するようにしてもよい。
また、ロードバランサ16は、要求をコネクションユニット14に転送した後に破棄通知を受信した場合に、転送先のコネクションユニット14を変更して要求の転送を再び実行する。ロードバランサ16は、転送を再び実行した後にさらに破棄通知を受信した場合に、エラー通知をアプリケーションサーバ2に送信するものとしたが、転送の再実行の回数は2以上であってもよい。
このように、第1の実施形態によれば、コネクションユニット14は、寿命を算出して算出した寿命をパケットに記録する。各メモリノード11のうちのパケットを受信したメモリノード11は、パケットの宛先が自メモリノードではない場合、パケットに記録された寿命を減算する。そして、そのメモリノード11は、減算後の寿命が所定値よりも小さい場合にはパケットを破棄する。また、そのメモリノード11は、減算後の寿命が所定値よりも大きい場合にはパケットに記録された命令寿命を減算後の寿命で書き換えて自メモリノード11に接続されている他のメモリノード11に転送する。これにより、パケットが記憶部10内に滞留するパケットの数を低減することができるので、滞留しているパケットに起因するスループット性能の低下を低減することができる。
また、パケットを受信したメモリノード11は、パケットの宛先が自メモリノードである場合、パケットに記録されたコマンドを実行するとともにコマンドに応じた応答を送信する。コネクションユニット14は、パケットを送信後に応答をタイムアウト時間内に受信しない場合には、タイムアウト処理を実行する。これにより、コネクションユニット14は、パケットの破棄を検知することができる。
コネクションユニット14は、ルーティング方向を指定可能であって、パケットを送信後に応答をタイムアウト時間内に受信しない場合には、ルーティング方向を変更して再びパケットを送信する。これにより、パケットの破棄の頻度を低減することが可能となる。また、ロードバランサ16にかかる負荷を低減することができる。
また、ロードバランサ16は、破棄通知を受信した場合、破棄通知を送信したコネクションユニットとは異なるコネクションユニットに要求を転送する。これにより、パケットの消失に起因する要求の不実行の発生頻度を低減することができる。
また、各メモリノード11は、所定の転送アルゴリズムと、自メモリノードに接続されている他のメモリノードの状態(故障状態や入出力ポートのパケット占有情報など)と、に基づいて、自メモリノードに接続されている他のメモリノードのうちから転送先のメモリノード11を一つ選択する。これにより、コネクションユニット14は転送経路を決定しなくてもパケットを宛先のメモリノード11に到達せしめることができる。
または、全メモリノード11が寿命演算部を具備し(または全メモリノード11の各コントローラ内で寿命を算出できるような処理を実行させる)、寿命演算部にて、パケットを受信したメモリノード11にて寿命を算出するような構成にしてもかまわない。寿命演算部では宛先メモリノード11の座標と自メモリノード11の座標から最短距離を計算し、最短距離を基に寿命の算出を行う。
(第2の実施形態)
第2の実施形態では、データを書き込む要求がストレージ装置1に入力された場合を考える。図12は、データを書き込む複数の要求がストレージ装置1に入力された場合を説明する図である。これらの要求に応じて、コネクションユニット14によって、ライトコマンドを備える複数の異なるパケットが生成される。これらの要求が同一箇所にデータを書き込む書き込み要求であった場合、生成された夫々のパケットは、同一の宛先のメモリノード11に到達する。ここで、これらのパケットは、同一のコネクションユニット14によって生成されるとは限らない。また、これらのパケットは、夫々別個にルーティングされる。したがって、これらのパケットは、ストレージ装置1に書き込み要求が入力された順番で宛先のメモリノード11に到達するとは限らない。宛先のメモリノード11の到達順序によっては、後に書き込み要求されたデータを先に書き込み要求されたデータで上書きしてしまう事態が発生する。
そこで、第2の実施形態では、書き込み要求された順番に応じたバージョン情報が付加される。ここでは一例として、タイムスタンプがバージョン情報として使用されるものとする。
図13は、コネクションユニット14の第2の実施形態の動作を説明するフローチャートである。ロードバランサ16から転送されてきた書き込み要求をコネクションユニット14において第1のインターフェース装置140が受信すると(S51)、MPU110は、書き込み要求されたライトデータに、タイムスタンプをバージョン情報として付加する(S52)。ライトデータは、書き込み要求とともに転送されてくる。バージョン情報の付加後、MPU110は、ライトデータを書き込むためのライトコマンドをパケットに記録する(S53)。そして、MPU110は、パケットを第2のインターフェース装置150に接続されているメモリノード11にパケットを送信し(S54)、コネクションユニット14の動作が終了する。
図14は、メモリノード11の第2の実施形態の動作を説明するフローチャートである。ここでは、ステップS53によって生成されたパケットの宛先のメモリノード11の動作を説明する。即ち、ルーティングの動作の説明を省略する。
パケットの宛先のメモリノード11において、入力ポート12がパケットを受信すると(S61)、そのパケットはルーティングコントローラ205によってコマンドプロセッサ207に送られ、コマンドプロセッサ207は、ライトデータの書き込み先の記憶領域にデータが存在するか否かを判定する(S62)。ライトデータの書き込み先にデータが存在するか否かは、例えば、個々のメモリノード11が備える記憶領域にマッピングされた論理アドレスと、不揮発メモリ300における物理アドレスとを相互に変換するテーブル情報を参照することによって判断可能である。即ち、ライトコマンドは、ライトデータの書き込み先の論理アドレスを含む。そして、テーブル情報は、不揮発メモリ300に書き込まれている有効なデータ毎に論理アドレスと物理アドレスとを対応付けるエントリを備えている。コマンドプロセッサ207は、ライトコマンドに含まれる論理アドレスを検索キーとしてテーブル情報を検索し、検索によってエントリが抽出されたか否かを判定することによって、ライトデータの書き込み先にデータが存在するか否かを判定することができる。なお、テーブル情報は、例えばRAM400に展開され、逐次更新される。以降、テーブル情報を、L2Pテーブルと表記することがある。
ライトデータの書き込み先にデータが存在する場合には(S62、Yes)、コマンドプロセッサ207は、ライトデータに付加されたバージョン情報は書き込み先に存在するデータに付加されたバージョン情報よりも新しいか否かを判定する(S63)。書き込み先に存在するデータのほうがライトデータよりもバージョン情報が新しい場合には(S63、No)、コマンドプロセッサ207は、ライトコマンドを実行しないで(S64)、メモリノード11の動作が終了する。
ライトデータの書き込み先にデータが存在しない場合(S62、No)、または、ライトデータのほうが書き込み先に存在するデータよりもバージョン情報が新しい場合(S63、Yes)、コマンドプロセッサ207は、ライトコマンドを実行する(S65)。即ち、コマンドプロセッサ207は、ライトデータを不揮発メモリ300に書き込む。ステップS65の後、メモリノード11の動作が終了する。
このように、メモリノード11においては、既に書き込み先に存在するデータよりもバージョン情報が新しいライトデータを書き込むようにしているので、後に要求されたデータを先に要求されたデータで上書きするような事態の発生が防止される。
なお、後に書き込み要求されたデータを先に書き込み要求されたデータで上書きすることを防止するために、ストレージ装置1のインターフェース近傍にライトデータの整合性を集中管理するCPUを設けることが考えられる。この場合、書き込み要求が短時間に多く入力されると、そのCPUの負荷が増大するため、ストレージ装置1全体の書き込み性能が低下する。これに対し、第2の実施形態によれば、データの整合性の管理は、個々のメモリノード11において分散して実行されるので、書き込み性能の低下を低減することができる。
また、そのCPUが、書き込み要求が実行完了するまで書き込み先をロックすることが考えられるが、その場合には、要求毎に書き込み先がロックされるので、オーバヘッドが大きい。第2の実施形態によれば、直前に入力された要求の実行が完了する前に次の要求が受け付けられてコネクションユニット14に転送されるので、オーバヘッドの増大なくデータの整合性を担保することが可能となる。
また、以上の説明においては、メモリノード11において、ライトコマンドを受信する毎に、不揮発メモリ300に既に書き込まれたデータとの間でバージョン情報の比較が実行されるとして説明した。一時記憶領域(例えばRAM400)にライトデータをバッファするように構成されている場合には、コマンドプロセッサ207は、書き込み先が同一のライトデータを当該バッファに蓄積しておき、蓄積しておいたライトデータのうちの最もバージョン情報が新しいライトデータを所定のタイミングで不揮発メモリ300に書き込むようにしてもよい。即ち、コマンドプロセッサ207は、書き込み要求された順番が最も後のライトデータで、書き込み先にすでに格納されているデータを上書きする。このように構成されることによって、ストレージ装置1が例えばデータベースを構成する場合に、当該バッファから不揮発メモリ300に書き込む前であれば、ロールバックを行うことが可能となる。なお、所定のタイミングとは、例えばデータベースでのコミットなど、データが確定した際に発行するフラッシュコマンド(バッファ上のデータをメモリに書き込むコマンド)を受信したタイミングであってよい。これにより、コネクションユニット14は、任意のタイミングでデータの上書きを実行することができるようになる。フラッシュコマンドは、例えば電源オフ時にもコネクションユニット14からメモリノード11へ送信される。
また、以上の説明においては、タイムスタンプをバージョン情報とするとして説明したが、バージョン情報はタイムスタンプに限定されない。例えば、ストレージ装置1が要求を入力される毎に、例えばロードバランサ16が入力された順番に連番となる識別番号を付与する。そして、コネクションユニット14においては、受信した要求に付与された識別番号をバージョン情報とする。また、連番となる識別番号の発行をストレージ装置1内のデータを書き込むメモリノード11以外のメモリノード11に担わせても良い。これは、担当するメモリノード11において所定のメモリ上の変数に1足す命令が排他的に実行されることで実現が可能である。この場合、担当するメモリノード11への到達の順に識別番号が割り振られることになる。こうすることで、異なるコネクションユニット14間で時刻を同期するのが困難な状況でも、バージョン管理を行うことが可能となる。
このように、第2の実施形態によれば、コネクションユニット14は、書き込み要求された第1データを、書き込み要求された順番に少なくとも応じたバージョン情報を付加してメモリノード11に送信する。第1データの宛先のメモリノード11は、自メモリノードが第1データと異なる第2データが存在する場合、第1データは書き込み要求された順番が第2データよりも後であるか否かを夫々のバージョン情報の比較に基づいて判定する。第1データは書き込み要求された順番が第2データよりも後である場合、メモリノード11は、第2データを第1データで上書きする。第1データは書き込み要求された順番が第2データよりも前である場合、第2データを第1データで上書きしない。これにより、後に書き込み要求データを先に書き込み要求されたデータで上書きする事態の発生を防止することができるので、データの整合性が担保される。
(第3の実施形態)
複数のハードディスク装置を備えるディスクアレイ装置が知られている。このようなディスクアレイ装置にデータを分散格納する技術として、RAID(Redundant Array of Independent Disks)と呼ばれる技術が知られている。RAIDによれば、複数のハードディスク装置が1つの記憶装置として扱われることによって、アクセス処理のパフォーマンスおよび信頼性の向上が実現される。
第3の実施形態では、ストレージ装置1にRAID(例えばRAIDレベル5)が適用される。即ち、ストレージ装置1は、所定量のデータからパリティを生成し、データとパリティとを複数のメモリノード11に対して分散して格納する。ここでは、ストレージ装置1は、書き込み要求されたデータ(第1データ)Di(iは自然数)を、例えば2つのデータ(第2データ)Dia、Dibに分割し、Dia、Dibに基づいてパリティ(パリティデータ)Piを生成し、Dia、Dib、Piを、夫々異なるメモリノード11に格納する。なお、パリティPiは、例えば水平パリティであってよい。また、分割数は2であるとしているが、3以上であってもよい。また、分割したパケットにビットエラーの検出や訂正が可能な符号を付加しても構わない。
アドレスのマッピングについて説明する。書き込み要求は、ストレージ装置1が備える記憶領域全体にマッピングされたアドレス(以降、グローバルアドレス)を用いて書き込み先を指定する。ストレージ装置1内においては、コネクションユニット14は、夫々のメモリノード11をノードアドレスを用いて指定し、指定したメモリノード11が備える記憶領域のうちの書き込み位置をその記憶領域内の範囲でユニークな論理アドレスを用いて指定する。論理アドレスは、夫々のメモリノード11において、記憶領域内の物理的な位置(物理アドレス)と対応づけられている。
ここで、論理アドレスと物理アドレスとの対応関係は固定されていてもよいし、固定されていなくてもよい。一般的なNANDフラッシュメモリは、ウェアレベリングと呼ばれる処理を実行する。ウェアレベリングは、データの書き込み位置を均等に分散させることによって、ブロック間の書き込み/消去回数のばらつきを低減させる処理である。ウェアレベリングが実行される場合には、論理アドレスと物理アドレスとの対応関係は逐次変化する。論理アドレスと物理アドレスとの対応関係は、L2Pテーブルに保持される。L2Pテーブルは、対応関係の変化に応じて逐次更新される。ここでは、夫々のメモリノード11は、例えばRAM400にL2Pテーブルを展開して、当該L2Pテーブルを用いて論理アドレスと物理アドレスとの間の変換を実行するものとする。また、L2Pテーブルは、所定サイズの記憶領域毎に対応関係を保持するものとする。なお、L2Pテーブルに対応関係が記録される単位記憶領域を物理セクタと表記する。即ち、論理アドレスは、物理セクタの先頭の物理アドレスに対応する。なお、物理セクタは、NANDフラッシュメモリのリード/ライトの単位であるページと等しくてもよいし、等しくなくてもよい。なお、ブロックは、消去の単位であって、複数のページを備えて構成される。また、L2Pテーブル全体を不揮発メモリ300に格納しておき、必要に応じて一部をRAM400などに展開してから論理アドレスを物理アドレスに変換してもかまわない。また、メモリノード11のノードアドレスに関しても、論理アドレスと物理アドレスを設定し、対応関係を逐次変化させてもかまわない。これにより、複数のNANDフラッシュメモリで構成されたシステムにおいて、異なるNANDフラッシュメモリ間でのウェアレベリングを実行することで、システム全体として摩耗を平滑化することが可能となる。
次に、Dia、DibおよびPiの書き込み位置が決定されるアルゴリズムを説明する。Dia、DibおよびPiは、夫々物理セクタのサイズ(第1サイズ)よりも小さいサイズ(第2サイズ)を有する。より詳しくは、ここでは、Dia、DibおよびPiのサイズは、物理セクタのサイズの3分の1のサイズを有する。物理セクタを3等分して得られる物理的な単位記憶領域を、サブセクタと表記する。データDiから生成されたDia、DibおよびPiは、夫々異なるメモリノード11の同一の論理アドレスに書き込み先に決定される。厳密には、論理アドレスが示す物理セクタのうちの先頭のサブセクタがDiaの書き込み位置に決定される。また、論理アドレスが示す物理セクタのうちの中央のサブセクタがDibの書き込み位置に決定される。また、論理アドレスが示す物理セクタのうちの末尾のサブセクタがPiの書き込み位置に決定される。パケットにおいては、サブセクタの先頭は、そのサブセクタが属する物理セクタの先頭の物理アドレスに対応する論理アドレスとその物理セクタの先頭からのオフセット値とを用いて表現される。
Dia、Dib、およびPiの書き込み先のメモリノード11は、メモリノード11間の関係を定義する予め定められた規則に基づいて決定される。予め定められた規則とは、RAIDを適用による複数のメモリノード11への格納方式であり、たとえばコネクションユニット14に定義されていて、システムの構成時に、ユーザーが要求する性能や信頼性に応じた設定がなされている。ここでは、Diaの書き込み先のメモリノード11と、Dibの書き込み先のメモリノード11と、Piの書き込み先のメモリノード11とは、X座標値またはY座標値が夫々異なるように決定される。例えば、Diaの書き込み先のメモリノード11をメモリノード(xia、yia)に決定された場合には、Di2の書き込み先のメモリノード11はメモリノード(xia+1、yia+1)、Piの書き込み先のメモリノード11はメモリノード(xia+2、yia+2)に夫々決定されるように、規則が定められているものとする。
図15は、データの格納例を説明する概念図である。Dia、Dib、Piを書き込むためのパケットを、夫々、パケットia、パケットib、パケットicと表記する。ここでは、サブセクタのサイズを256Bとし、物理セクタのサイズを768Bとしている。本図は、データD0の格納先の例を示している。
図15に示す例によれば、D0から生成されたD0a、D0b、P0は、夫々、メモリノード(1、1)、メモリノード(2、2)、メモリノード(3、3)に格納される。D0aを書き込むためのパケット0aは、D0aと、ノードアドレス(1、1)と、論理アドレスLA0と、オフセット値「0」とが記録されている。D0bを書き込むためのパケット0bは、D0bと、ノードアドレス(2、2)と、論理アドレスLA0と、オフセット値「256」とが記録されている。P0を書き込むためのパケット0cは、P0と、ノードアドレス(3、3)と、論理アドレスLA0と、オフセット値「512」とが記録されている。
パケット0aを受信したメモリノード(1、1)においては、メモリノード(1、1)内において独自に保守管理されるL2Pテーブル301に基づいてLA0が物理アドレスPA0aに変換される。PA0aは、メモリノード(1、1)の記憶領域が構成する物理アドレス空間302のうちの特定の物理セクタの先頭位置を示している。そして、不揮発メモリ300におけるPA0aが示す物理セクタの先頭からオフセット値「0」だけオフセットした位置にD0aが書き込まれる。同様に、パケット0bを受信したメモリノード(2、2)においては、メモリノード(2、2)内において独自に保守管理されるL2Pテーブル301に基づいてLA0が物理アドレスPA0bに変換される。PA0bは、メモリノード(2、2)の記憶領域が構成する物理アドレス空間302のうちの特定の物理セクタの先頭位置を示している。そして、不揮発メモリ300におけるPA0bが示す物理セクタの先頭からオフセット値「256」だけオフセットした位置にD0bが書き込まれる。Piに関しても、同様の手順により書き込み先の物理位置が決定される。
なお、グローバルアドレスと、ノードアドレスおよび論理アドレスと、の間の関係は任意である。例えば、グローバルアドレスの上位桁とDiaの書き込み先のメモリノード11のノードアドレスとが一対一に対応し、グローバルアドレスのうちの下位桁が論理アドレスLAiとして用いられるように構成されてもよい。また、グローバルアドレスの上位桁の前半部分がノードアドレスのX座標値に対応し、グローバルアドレスの上位桁の後半部分がノードアドレスのY座標値に対応するように構成されてもよい。Diaの書き込み先のメモリノード11のノードアドレスが決定されれば、DibおよびPiの書き込み先のメモリノード11のノードアドレスが自動的に定まる。
図16は、データの格納例を説明する別の概念図である。この図は、メモリノード11毎に、メモリノード11が備える記憶領域が構成する論理アドレス空間を示している。D1aは、メモリノード(1、2)に格納され、D2aは、メモリノード(1、3)に格納され、D3aは、メモリノード(2、0)に格納されている。このように、1つの物理セクタが備える3つのサブセクタには、夫々異なるデータから生成されたデータ(分割されて生成されたデータ、または、パリティデータ)が格納される。
なお、分割数をNとすると、物理セクタは、サブセクタのサイズのN倍のサイズを有し、Diは、サブセクタのサイズのN−1倍のサイズを有する。即ち、ストレージ装置1は、サブセクタのサイズのN−1倍のサイズのデータ毎に、論理アドレスが指定された書き込みの要求を処理することができる。論理アドレスが指定された、サブセクタのサイズのN−1倍のサイズの論理的な単位記憶領域を論理セクタと表記する。なお、書き込みを要求されたデータのサイズが論理セクタのサイズを超える場合には、要求されたデータがロードバランサ16またはコネクションユニット14において論理セクタ毎に分割された後に、論理セクタ毎のデータがさらにコネクションユニット14においてサブセクタ単位のデータに分割されてもよい。
図17は、コネクションユニット14の第3の実施形態の動作を説明するフローチャートである。ここでは、コネクションユニット14が、Diを書き込む要求に基づいてパケットia〜パケットicを生成する動作を説明する。
まず、MPU110は、Diをサブセクタ単位のデータDia、Dibに分割する(S71)。そして、MPU110は、Dia、Dibに基づいてパリティPiを生成する(S72)。そして、MPU110は、Diの書き込み先のグローバルアドレスに基づいて、Diaの書き込み先のノードアドレス(xia、yia)を算出する(S73)。
続いて、MPU110は、Dibの書き込み先のノードアドレス(xib、yib)およびPiの書き込み先のノードアドレス(xic、yic)を算出する(S74)。ここでは例えば、xibはxiaに1を加算して得られる値であり、xicはxiaに2を加算して得られる値であり、yibはyiaに1を加算して得られる値であり、yicはyiaに2を加算して得られる値である。
なお、X方向に配列されたメモリノード11の個数を値NX、Y方向に配列されたメモリノード11の個数を値NYとする。ステップS74の処理において、書き込み先のX座標値がNXを越える場合には、その座標値から例えばNX−1を減算した値を書き込み先のX座標値としてよい。また、書き込み先のY座標値がNyを越える場合には、その座標値から例えばNy−1を減算した値を書き込み先のY座標値としてもかまわない。
続いて、MPU110は、Dia、書き込み先の論理アドレスLAi、オフセット値「0」、宛先のメモリノードのノードアドレス(xia、yia)を記録したパケットiaを生成する(S75)。また、MPU110は、Dib、書き込み先の論理アドレスLAi、オフセット値「256」、宛先のメモリノードのノードアドレス(xib、yib)を記録したパケットibを生成する(S76)。また、MPU110は、Pi、書き込み先の論理アドレスLAi、オフセット値「512」、宛先のメモリノードのノードアドレス(xic、yic)を記録したパケットicを生成する(S77)。ステップS77の処理の後、パケットが生成される動作が終了となる。
図18は、メモリノード11の第3の実施形態の動作を説明するフローチャートである。ここでは、パケットibの宛先のメモリノード(xib、yib)が当該パケットibを処理する動作を説明する。コマンドプロセッサ207は、L2Pテーブル301を参照することによってLAiをPAibに変換する(S81)。そして、コマンドプロセッサ207は、PAibからオフセット値「256」だけオフセットした位置に、Dibを書き込む(S82)。そして、パケットibに応じた動作が終了となる。ここで、書き込みを行った際にサブセクタが有効になったことを示すビットを立てても良い。このような有効を示すビットマップがあると、チップ間で全データのコピーや移動の際に、有効なデータのみの転送を行うことが可能となり、処理時間を軽減できる。また、データの書き込み要求を受け取ったメモリノード11はデータを書き込むと説明したが、ランダムアクセス性能に優れたRAMなどで構成されたバッファにためても良い。バッファのデータは、フラッシュコマンドによって不揮発メモリ300に書き込まれても良いし、不揮発メモリ300の書き込み単位がそろった段階で自動的に書き込まれても良い。
このように、第3の実施形態によれば、各メモリノード11は、物理セクタを複数備える。コネクションユニット14は、書き込み要求された第1データを物理セクタよりもサイズが小さいサブセクタ毎の第2データに分割して、夫々の第2データを夫々異なるメモリノード11の物理セクタに書き込む。ここで、コネクションユニット14は、第2データ毎の書き込み位置を、物理セクタの先頭位置と、当該先頭位置からのサブセクタ単位の、第2データ毎に異なるオフセット値と、を用いて指定する。これにより、各メモリノード11は、物理セクタ単位で論理アドレスと物理アドレスとの対応関係を管理するだけで、物理セクタよりも小さい、コネクションユニット14から指定されたサブセクタを特定することができる。サブセクタ単位で対応関係を管理する場合に比べて、L2Pテーブル301のサイズを削減することができる。即ち、L2Pテーブル301のサイズの増加を抑制しつつ、より小さい記憶領域毎の読み書きの管理を行うことが可能となる。
また、複数のメモリノードが、列毎または行毎に夫々異なる、着脱可能なプリント基板に配設されて構成される場合がある。コネクションユニット14は、行または列が重複しないように第2データおよびパリティデータの書き込み先のメモリノード11を決定するので、1つのプリント基板が故障して換装される場合があったとしても、他のプリント基板に搭載されたデータに基づいて、交換前のプリント基板に搭載されていたメモリノード11の記憶内容を交換後のプリント基板に搭載されているメモリノード11に再構築することが可能となる。また、プリント基板上のメモリノードは列または行を成していなくても構わない。この場合、分割したデータの書き込み先メモリノードを決める際、異なるプリント基板上のメモリノードで組を作ることが望ましい。
なお、任意のデータDiが格納されるメモリノード11をロックすることが可能となるようにストレージ装置1が構成される場合がある。Dia、Dib、およびPiの書き込み先のメモリノード11がランダムに決定される場合には、Dia、Dib、およびPiの書き込み先のメモリノード11が全て同時にロックされる必要がある。複数のコネクションユニット14からの書き込みの際など、ひとつのコネクションユニット14がDia、Dib、およびPiの書き込み先のメモリノード11が全て同時にロックできない場合に、ロックの取り合いが発生し、制御が破綻する。第3の実施形態では、コネクションユニット14は、メモリノード11間の関係を定義する所定の規則に基づいて第2データ毎の書き込み先のメモリノードを決定する。したがって、例えば、コネクションユニット14は、分割されて生成された第2データのうちの先頭のデータであるDiaが格納されているメモリノード11のみをロックするだけで、Dib、Piが格納されているメモリノード11もロックされたものとして扱うことができる。即ち、3つのメモリノード11を同時にロックしなくても、3つのメモリノード11がロックされたものとして扱われるので、ロックの取り合いの発生を防止することができる。
なお第3の実施形態では、例としてRAIDレベル5を用いて説明したが、RAIDレベル0(ストライピング)のようにパリティを生成しない方式であってもかまわない。
(第4の実施形態)
図19は、第4の実施形態のパケットの構成を説明する図である。第4の実施形態のパケットは、先頭および末尾に「Signature」を備える。先頭の「Signature」はシリアルデータの受信開始のために使用される。末尾の「Signature」は、送信側のエラー情報(バッファのパリティチェック)を伝える。パリティエラーが見つかった場合、再送処理が行われる。
「Frame Size」はペイロード(第1ペイロード)のサイズを表す。「Frame Size」に記録される数値の単位は例えばB(Byte)であり、当該数値にはSignature部分のサイズは含まれない。「CMD」には、コントローラ200に実行させるコマンドの種類の識別番号(コマンド番号)が記録される。「SRC」は、送り元のメモリノード11のノードアドレスを、「DST」は、宛先のメモリノード11のノードアドレスを、夫々表す。「SRC」および「DST」の添え字である「X」、「Y」はそれぞれノードアドレスのX座標、Y座標を表す。なお、相対的なノードアドレスが使用可能な場合は、「DST」には必ずしも宛先の絶対座標が用いられなくてもよい。
「ERR」はエラー通知などの通知先が記録される。また、上りのパケット(コネクションユニット14からメモリノード11に向かうパケット)において、「SRC」に記録されたノードアドレスが壊れた場合、または、下りのパケット(メモリノード11からコネクションユニット14に向かうパケット)において、「DST」に記録されたノードアドレスが壊れた場合、「ERR」に記録された値を使うことで修復が可能となる。
「PORT」は、パケットを投入したコネクションユニット14の方向を表す情報としてのポート番号が記録される。応答のパケットが、応答の元となったパケットの送り元のメモリノード11まで戻った場合、送り元のメモリノード11は、コネクションユニット14がつながっている出力ポートを「PORT」に記録された値を用いて特定する。そして、送り元のメモリノード11は、特定した出力ポートに応答のパケットを転送する。
「LIFE」は、パケットの寿命を表す。寿命は、転送毎に、および、渋滞によってパケットが詰まる毎に、「1」だけ減じられる。「LIFE」に記録された値が「0」に等しくなった場合、そのパケットは破棄される。なお、既存のメモリノード11に新規のメモリノード11が新たに接続された場合、既存のメモリノード11は新規のメモリノード11に対し、ノードアドレスを設定する座標設定コマンドを送信する。座標設定コマンドのパケットにおける「LIFE」には、例えば「1」が設定される。座標設定コマンドに対する応答のパケットには、例えば距離(|DST_X−SRC_X|+|DST_Y-SRC_Y|)の4倍の値が設定される。
「CMD op.」にはコマンドの引数が記録される。「CRC」にはヘッダ部分(Frame Size〜CMD op.)のCRC8値が記録される。この値は、ヘッダ部分のエラーを検出できれば、他の値でも構わない。ペイロードにはデータまたはエラー情報が記録される。
不揮発メモリ300に書き込まれるデータは、所定サイズ(ここでは8bit)の単位データ毎に分割されてランダマイズされる。ランダマイズされた8bitの単位データは、3bitのランダマイズ情報が付加される。なお、単位データは、ランダマイズ情報が付加された後に、ECC符号がさらに付加される場合がある。
図20は、ランダマイズの処理を説明する図である。なお、ここでは、ランダマイズの対象の8bitのデータを、「a」から「h」まで配列されたアルファベット列(即ち「abcdefgh」)で表記する。夫々のアルファベットは、ランダマイズの対象の8bitのデータを構成する1bitのデータである。また、ランダマイズ情報を構成する夫々のビットを「x」、「y」、「z」と表記する。
まず、「x」、「y」、「z」に、夫々、「c」、「e」、「g」を反転した値が代入される(S91)。先頭の連続する3ビットである「a」、「b」、「c」が全て同じ値である場合(即ち「a」、「b」、「c」の全てが「1」であるか、または「a」、「b」、「c」の全てが「0」である場合)、「b」及び「x」の値がともに反転される(S92)。そして、中央部分の連続する3ビットである「c」、「d」、「e」が全て同じ値の場合、「d」及び「y」の値がともに反転される(S93)。そして、末尾の連続する3ビットである「e」、「f」、「g」が全て同じ値である場合、「f」及び「z」の値がともに反転される(S94)。そして、「abcdefgh」と「xyz」とがマージされ(S95)、ランダマイズ後のデータである「abcxdeyfgzh」が生成される。
なお、ランダマイズ後のデータ「abcxdeyfgzh」の復号化(以下、ランダマイズ復号化)の際には、「c」の値と「x」の値とが比較され、双方の値が同じであれば「b」の値が反転される。同様に、「e」の値と「y」の値との比較と、「g」の値と「z」の値との比較とが実行されることによって、ランダマイズされたデータがランダマイズ前のデータに復号化される。
前述のように、ヘッダ部分において、CRC8値が「CRC」に記録される。「CRC」に記録された値に基づいて通信によって発生するエラーの検出が実行される。ペイロードにデータが記録される際には、そのデータがECC符号とともに記録される。ペイロードに記録されたデータに対し、そのデータに付加されたECC符号に基づいて、通信によって発生するエラーの検出および訂正が実行される。ECC符号としては、例えば(15、11)BCH符号が用いられる。この場合、NANDフラッシュメモリへの書き込みの際に、読み出しの際に発生するエラーを検出したり訂正したりするために、ランダマイズ情報を含む11bitの単位データに、さらにECC符号4bitの冗長ビットが付加される。
なお、ランダマイズ、ランダマイズ復号化、ECC符号の符号化(以下、ECC符号化)、およびECC符号の復号化(以下、ECC復号化)の各処理は、メモリノード11およびコネクションユニット14の何れにおいて実行されてもよい。各処理がメモリノード11およびコネクションユニット14の何れにおいて実行されるかは、コマンドに応じて異なっていてもよい。
図21は、(15、11)BCH符号の生成回路の構成例を示す図である。符号化回路500に11bitの単位データが入力される際は、スイッチSW1がONされるとともに、スイッチSW2が「1」に切り替えられる。11bitの単位データが出力された後、計算されてR1からR4に保存されているECC符号を出力するために、スイッチSW1がOFFされるとともにスイッチSW2が「2」に切り替えられる。これにより、4bitのECC符号が符号化回路500から出力される。符号化回路500がECC符号を出力している際は、「0」が入力される。
ECC復号化の際はシンドロームと呼ばれる4bitの値が計算される。シンドロームは、符号化回路500において計算される。符号化回路500は、ECC符号を含む15bitの単位データを入力とする。ECC復号化の際に入力される単位データは、12bit目以降の4bitの入力が「0」ではない点がECC符号化の際と異なる。計算された4bitのシンドロームの値が全て「0」であればエラーは無いとしてそのまま出力される。シンドロームが「0」でない値を含む場合には、シンドロームとエラービットの位置との関係(図22参照)に基づいてエラービットの訂正(即ち反転)が実行される。
第4の実施形態においては、L2Pテーブル301およびガベージコレクションテーブル(GCテーブル)は、メモリノード11の外部からの読み出しの対象に含まれる。
不揮発メモリ300においては、無効化された古いデータが増えると、新たにデータを書き込むことができる領域が減少する。メモリノード11は、新たにデータを書き込むことができる領域が不足したとき、ガベージコレクションと呼ばれる処理を実行する。ガベージコレクションは、有効なデータを特定のブロックに集め、無効なデータだけになったブロックを消去して、空きブロックを生成する処理である。生成されたブロックは、GCテーブルに登録される。具体的には、GCテーブルは、ブロックの先頭の物理アドレス(以降、ブロックアドレス)が登録される。GCテーブルは、例えばFIFOのルールに従ってエントリの追加および取り出しが可能に構成される。ブロック数が2048個存在する場合には、GCテーブルは、11bitのサイズを有するブロックアドレスが2048個登録可能なサイズが必要となる。GCテーブルは、例えばRAM400に保持される。
なお、第4の実施形態においては、一例として、L2Pテーブル301は、ブロック毎に論理アドレスと物理アドレス(即ちブロックアドレス)との対応関係が記述されているものとする。また、夫々のブロックは、例えば128のページを含むものとする。
パケットは、前述のように、コマンド番号が記録される「CMD」と引数が記録される「CMD op.」を備えている。以下に、コマンドおよび引数の例を説明する。なお、引数の形式は、指定される内容が等しければ、以下の例に挙げた形式だけに限定されない。なお、コマンドの実行の際に、書き込むデータのランダマイズ、またはECC符号化のいずれかもしくは両方を行っても良いし、読みだしたデータのランダマイズ復号化、またはECC復号化のいずれかもしくは両方を行っても良い。
(1)Raw_Read(page、開始col.、終了col.)
このコマンドは、不揮発メモリ300から読み出しを行うためのコマンドである。引数のうちの「page」はページ番号、「開始col.」は読み出しを開始するカラム、「終了col.」は読み出しを終了するカラムを表す。メモリノード11は、データを読み出して、読み出したデータに含まれるECC符号に基づいてECC復号化を行い、ECC復号化後、データを応答のパケットのペイロードに記録してそのパケットを送信する。
(2)Raw_Write(page、開始col.、終了col.)
このコマンドは、不揮発メモリ300に書き込みを行うためのコマンドである。「Raw_Write」は、「Raw_Read」と同様に、ページおよびカラムを指定するための引数を備える。ただし、「Raw_Write」の場合、引数は、書き込み位置を指定するためのものである。ライトデータはペイロードに記録される。ライトデータのデータ長が短いためにペイロードに余剰の部分が生じる場合には、余剰の部分に「10」の値を表すビット列が繰り返し記録される。メモリノード11は、ライトデータに含まれるECC符号の復号化を行い、復号化後、ライトデータの書き込みを実行する。そして、メモリノード11は、書き込みの成否を応答のパケットのヘッダに記録してそのパケットを送信する。
(3)Raw_Erase(page)
このコマンドは、不揮発メモリ300に格納された内容の消去を行うためのコマンドである。消去対象のブロックは、引数である「page」により指定される。即ち、「page」により指定されたページを含むブロックが消去対象である。メモリノード11は、消去を実行後、消去の成否を応答のパケットのヘッダに記録してそのヘッダを送信する。
(4)L2P_Read(LA)
このコマンドは、L2Pテーブル301の読み出しを行うためのコマンドである。引数である「LA」は、論理アドレスを表す。メモリノード11は、L2Pテーブル301を参照することによって「LA」に対応する物理アドレス(ブロックアドレス)を読み出して、読み出したブロックアドレスを応答のパケットのペイロードに記録して、そのパケットを送信する。
(5)L2P_Write(LA、key1、key2)
このコマンドは、L2Pテーブル301に対する書き込みを行うためのコマンドである。「L2P_Write」の引数に含まれる「LA」は、論理アドレスを表す。「key1」および「key2」は夫々例えば2byteのサイズを有する。メモリノード11は、L2Pテーブル301を参照することによって「LA」に対応するブロックアドレスを読み出す。そして、メモリノード11は、読み出したブロックアドレスと引数に含まれる「key1」の値とを比較し、両者が一致した場合には、「LA」に対応するブロックアドレスを引数に含まれる「key2」の値で上書きする。そして、メモリノード11は、上書き完了後、成功した旨の情報を応答のパケットのヘッダに記録してそのパケットを送信する。両者が一致しない場合には、メモリノード11は、失敗した旨の情報を応答のパケットのヘッダに記録してそのパケットを送信する。
(6)GC_Read()
このコマンドは、GCテーブルの読み出しを行うためのコマンドである。メモリノード11は、GCテーブルに登録された全てのブロックアドレスを、登録された順番が識別可能な形式で読み出して、読み出した全てのブロックアドレスを応答のパケットのペイロードに記録して、そのパケットを送信する。
(7)GC_Push(BLK)
このコマンドは、GCテーブルに新たにエントリを登録するためのコマンドである。引数である「BLK」は、ブロックの先頭の物理アドレスを表す。メモリノード11は、「BLK」の値をGCテーブルの末尾に付加する。そして、メモリノード11は、付加の成否を応答のパケットのヘッダに記録してそのヘッダを送信する。
(8)GC_Shift()
このコマンドは、GCテーブルからブロックアドレスを取得するためのコマンドである。メモリノード11は、GCテーブルの先頭に登録されているブロックアドレスを読み出す。そして、メモリノード11は、読み出したブロックアドレスを応答のパケットのヘッダに記録して、そのパケットを送信する。その後、メモリノード11は、GCテーブルに登録されている夫々のエントリを1つずつ先頭方向にシフトせしめる。
(9)Read(LA1、key、LA2、BLK内page、開始col.、終了col.)
このコマンドは、L2Pテーブル301を用いて不揮発メモリ300からの読み出しを行うためのコマンドである。引数に含まれる「LA1」および「LA2」は、論理アドレスを表す。引数に含まれる「key」は、2Bのサイズを有する。引数に含まれる「BLK内page」は、1つのブロックの範囲内でページを特定する物理アドレスを表す。メモリノード11は、L2Pテーブル301を参照することによって「LA1」に対応するブロックアドレスを読み出す。そして、メモリノード11は、読み出したブロックアドレスと引数に含まれる「key」の値とを比較し、両者が一致した場合には、次に説明する読み出し処理を実行する。両者が一致しない場合には、メモリノード11は、読み出し処理を実行せずに、エラー情報1を応答のパケットのヘッダに記録してそのパケットを送信する。
読み出し処理においては、メモリノード11は、L2Pテーブル301を参照することによって「LA2」に対応するブロックアドレスを読み出す。ブロックアドレスの読み出しに失敗した場合には、メモリノード11は、エラー情報2を応答のパケットのヘッダに記録してそのパケットを送信する。ブロックアドレスの読み出しに成功した場合には、メモリノード11は、読み出したブロックアドレスに1ブロック当たりのページ数、例えば128を乗算し、乗算により得られた値に「BLK内page」を加算する。そして、メモリノード11は、加算によって得られた物理アドレスが示すページの、「開始col.」が表すカラムから「終了col.」が表すカラムまでを読み出し先として不揮発メモリ300からデータを読み出す。メモリノード11は、読み出したデータに含まれるECC符号に基づいてECC復号化を行う。そして、メモリノード11は、ECC復号化後、データを応答のパケットのペイロードに記録してそのパケットを送信する。
(10)Write(LA1、key、LA2、BLK内page、開始col.、終了col.)
このコマンドは、L2Pテーブル301を用いて不揮発メモリ300に対する書き込みを行うためのコマンドである。メモリノード11は、L2Pテーブル301を参照することによって「LA1」に対応するブロックアドレスを読み出す。そして、メモリノード11は、読み出したブロックアドレスと引数に含まれる「key」の値とを比較し、両者が一致した場合には、次に説明する書き込み処理を実行する。両者が一致しない場合には、メモリノード11は、書き込み処理を実行せずに、エラー情報を応答のパケットのヘッダに記録してそのパケットを送信する。
書き込み処理においては、メモリノード11は、L2Pテーブル301を参照することによって「LA2」に対応する物理アドレスを読み出す。「LA2」に対応するブロックアドレスの読み出しに失敗した場合には、メモリノード11は、GCテーブルからブロックアドレスを取得して、取得したブロックアドレスを「LA2」の値と対応付けてL2Pテーブル301に登録する。そして、メモリノード11は、L2Pテーブル301から読み出した、または、GCテーブルから取得した、ブロックアドレスに1ブロック当たりのページ数、例えば128を乗算し、乗算により得られた値に「BLK内page」を加算する。そして、メモリノード11は、加算によって得られた物理アドレスが示すページのうちの「開始col.」が表すカラムから「終了col.」が表すカラムまでをライトデータの書き込み先とする。メモリノード11は、ライトデータに含まれるECC符号の復号化を行い、復号化後、ライトデータを書き込み先に書き込む。そして、メモリノード11は、書き込みの成否を応答のパケットのヘッダに記録してそのパケットを送信する。
なお、メモリノード11は、GCテーブルからブロックアドレスの取得を行った場合、「GC_Shift」の場合と同様にGCテーブルに登録されたエントリのシフトを実行する。また、メモリノード11は、物理アドレスの取得を行った旨の情報を応答のパケットのヘッダに記録してそのパケットを送信する。
(11)Erase(LA1、key、LA2)
このコマンドは、不揮発メモリ300に格納された内容の消去をL2Pテーブル301を用いて行うためのコマンドである。L2Pテーブル301を参照することによって「LA1」に対応するブロックアドレスを読み出す。そして、メモリノード11は、読み出したブロックアドレスと引数に含まれる「key」の値とを比較し、両者が一致した場合には、次に説明する消去処理を実行する。両者が一致しない場合には、メモリノード11は、消去処理を実行せずに、エラー情報1を応答のパケットのヘッダに記録してそのパケットを送信する。
消去処理においては、メモリノード11は、L2Pテーブル301を参照することにとって「LA2」に対応するブロックアドレスを読み出す。ブロックアドレスの読み出しに失敗した場合には、メモリノード11は、エラー情報2を応答のパケットのヘッダに記録してそのパケットを送信する。ブロックアドレスの読み出しに成功した場合には、メモリノード11は、読み出したブロックアドレスが示すブロックを消去対象として、消去を行う。消去後、メモリノード11は、L2Pテーブル301に記録されている「LA2」と消去対象であったブロックアドレスとの対応関係を無効化するとともに、消去対象であったブロックアドレスをGCテーブルに登録する。消去の際にエラーが発生した場合には、メモリノード11は、ブロックアドレスをGCテーブルに追加せずに、その旨を応答のパケットのヘッダに記録してそのパケットを送信する。
(12)Activate()
このコマンドは、不揮発メモリ300の状態をアクセス可能な状態(正常動作状態)に遷移せしめるためのコマンドである。メモリノード11は、不揮発メモリ300の状態を正常動作状態に遷移せしめるとともに、メモリノード11に具備されるLEDに正常動作状態を表示する。なお、LEDの表示に関し、点灯状態を以って正常動作状態を表示するようにしてもよいし、消灯状態を以って正常動作状態を表示するようにしてもよい。
(13)Deactivate()
このコマンドは、不揮発メモリ300の状態をアクセス不能な状態に遷移せしめるためのコマンドである。アクセス不能な状態とは、不揮発メモリ300に対して、「Read」、「Write」、「Erase」、「L2P_Read」、「L2P_Write」、および「L2P_Erase」の何れのコマンドを実行する際においても書き込みおよび読み出しができない状態をいう。
(14)L2P_Backup(page)
このコマンドは、RAM400に保持されているL2Pテーブル301およびGCテーブルを不揮発メモリ300に書き込むためのコマンドである。メモリノード11は、RAM400からL2Pテーブル301およびGCテーブルを読み出して、読み出したデータに対してランダマイズおよびECC符号化を実行する。そして、メモリノード11は、「page」によって指定される物理アドレスを先頭とする連続するページにデータを書き込み、書き込みの成否を応答のパケットのヘッダに記録してそのヘッダを送信する。
(15)L2P_Restore(page)
このコマンドは、不揮発メモリ300に格納されているL2Pテーブル301およびGCテーブルをRAM400に読み出すためのコマンドである。メモリノード11は、不揮発メモリ300からL2Pテーブル301およびGCテーブルを読み出して、読み出したデータに対してECC復号化およびランダマイズ復号化を実行する。そして、メモリノード11は、ECC復号化およびランダマイズ復号化を行った後のデータをRAM400に展開する。なお、メモリノード11は、ECC復号化後、ECC符号のための冗長ビットを破棄する。展開後、メモリノード11は、展開の成否を応答のパケットのヘッダに記録してそのヘッダを送信する。
(16)L2P_Add(LA1、key、LA2、value)
このコマンドは、L2Pテーブル301に記録されている所望のブロックアドレスに値を加算するためのコマンドである。「value」は例えば、16bitのサイズを有する。メモリノード11は、L2Pテーブル301を参照することによって「LA1」に対応するブロックアドレスを読み出す。そして、メモリノード11は、読み出したブロックアドレスと引数に含まれる「key」の値とを比較し、両者が一致した場合には、次に説明する加算処理を実行する。両者が一致しない場合には、メモリノード11は、加算処理を実行せずに、エラー情報を応答のパケットのヘッダに記録してそのパケットを送信する。
加算処理においては、メモリノード11は、「LA2」に「value」の値を加算する。そして、メモリノード11は、L2Pテーブル301に記録されている論理アドレス「LA2」を、加算により得られた値で更新する。なお、「LA2」の最上位ビットは、桁あふれを表す。最上位ビットが加算処理によっていったん「1」となった場合には、以降、「1」のまま維持される。
(第5の実施形態)
図23は、第5の実施形態のパケットの構成を説明する図である。第5の実施形態のパケットは、ペイロード(第1ペイロード)に複数のコマンドが記録される。個々のコマンドは、コマンド長、コマンド番号、コマンドオプション、およびそのコマンド自身のペイロード(第2ペイロード)がこの順番で記録されて構成される。メモリノード11は、第1ペイロードに格納された複数のコマンドを、先頭から順番に実行することができる。以降、第1ペイロードに複数のコマンドを有する構成を、連続コマンド構成と表記する。これに対し、図19に示した第4の実施の形態のパケットの構成を、単一コマンド構成と表記する。
なお、コマンドオプションおよび第2ペイロードは、コマンドに応じてサイズが異なる。コマンドオプションおよび第2ペイロードのうちの一方または両方は、コマンドに応じて具備されてもよいし、具備されなくてもよい。
連続コマンド構成のパケットが備えるヘッダは、単一コマンド構成のパケットが備えるヘッダと同等であってよい。連続コマンド構成のパケットのヘッダにおいては、「CMD」には、連続コマンド構成を示すコマンド番号が記録される。即ち、メモリノード11は、パケットの構成が連続コマンド構成であるか否かを「CMD」に記録されたコマンド番号に基づいて識別することができる。パケットの構成が連続コマンド構成では無い場合には、メモリノード11は、「CMD」に記録されたコマンド番号に基づいて第4の実施形態において説明した動作を実行する。
次に、第1ペイロードに記録されるコマンドの例を説明する。なお、第5の実施形態において、以降の説明は連続コマンド構成のパケットに関する。
(1)COPY(MEM_ADDRESS from、LENGTH length、MEM_ADDRESS to、FLAG pointer)
このコマンドは、メモリノード11内においてメモリ間でデータをコピーするためのコマンドである。「MEM_ADDRESS from」はコピー元の領域を、「MEM_ADDRESS to」はコピー先の領域を、「LENGTH length」はコピー対象のデータのサイズを、夫々表す。「MEM_ADDRESS from」および「MEM_ADDRESS to」には、夫々、データ保存領域を表す識別番号(MEM_KIND)と、「MEM_KIND」が示すデータ保存領域内の位置を表すアドレス情報(ADDRESS)とが記録される。「MEM_KIND」は、ここでは4bitのサイズを備えている。「MEM_KIND」の値とデータ保存領域との対応関係の一例を以下に示す。
00:バッファ領域
01:演算バッファ領域
02:演算バッファ領域
03:演算バッファ領域
04:演算バッファ領域
05:SRAM208
06:不揮発メモリ300
07:RAM400
08:受信ヘッダ領域
09:受信ペイロード領域
10:送信ヘッダ領域
11:送信ペイロード領域
「COPY」においては、「MEM_KIND」としてこれらの全てが使用可能である。また、ここに示した以外のメモリ領域を使用出来てもかまわない。
なお、バッファ領域、4つの演算バッファ領域、受信ヘッダ領域、受信ペイロード領域、送信ヘッダ領域、および、送信ペイロード領域は、メモリノード11内に具備されるメモリ(例えばRAM400またはSRAM208)またはレジスタに予め確保されている。メモリノード11は、自メモリノード11が宛先となっているパケットを受信すると、受信したパケットを構成するヘッダを受信ヘッダ領域に格納し、受信したパケットを構成する第1のペイロードを受信ペイロード領域に格納する。また、メモリノード11は、コネクションユニット14または他のメモリノード11を宛先とするパケットを生成し、送信することが可能である。メモリノード11は、パケットを生成する際には、送信ヘッダ領域にヘッダを生成し、送信ペイロード領域に第1のペイロードを生成する。バッファ領域は、一時的なデータが格納される。演算バッファ領域は、演算の元データが一時的に格納されたり、演算の結果データが一時的に格納されたりする。
なお、コピー元の領域には、ポインタが格納されている場合がある。「FLAG pointer」は、コピー元として指定された領域に格納されているデータ(ポインタが格納されている場合にはポインタ)をコピー対象とするか、コピー元として指定された領域に格納されているポインタが指す別の領域に格納されているデータをコピー対象とするか、を表す。「FLAG pointer」は、「0」が前者を、「1」が後者を、夫々表す、1bitのサイズを有する情報である。なお、データがポインタであるかポインタ以外のデータ(以降、実データ)であるかは、データの最上位ビットにより識別される。
ポインタは、メタ情報(META)とアドレス情報(MEM_ADDRESS)とを備える。また、「META」は、「FLAG pointer」と「LENGTH length」と「RIGHT right」とを備える。「META」に含まれる「FLAG pointer」は、「COPY」の引数に含まれる「FLAG pointer」と等しい。「MEM_ADDRESS」は、「MEM_ADDRESS from」などと同等の構成を備える。
図24は、「COPY」が備える「FLAG pointer」に「1」が記録されている場合の、コピー対象の特定方法を説明する概念図である。まず、「COPY」に含まれる「MEM_ADDRESS from」は領域#1を示す。領域#1には、ポインタが格納されている。領域#1に格納されているポインタに含まれる「MEM_ADDRESS」は、領域#2を示している。
領域#2には、ポインタが格納されている。領域#1に格納されているポインタに含まれる「FLAG pointer」には「1」が記録されているので、領域#2に格納されているポインタはコピー対象ではない。
領域#2に格納されているポインタに含まれる「MEM_ADDRESS」は、領域#3を示している。領域#3には、実データが格納されている。また、領域#2に格納されているポインタに含まれる「FLAG pointer」には「0」が記録されている。従って、領域#3に格納されている実データがコピー対象として特定される。
(2)EXCHANGE(MEM_ADDRESS from、LENGTH length、MEM_ADDRESS to)
このコマンドは、メモリノード11内においてメモリ間でデータを交換するためのコマンドである。メモリノード11は、「MEM_ADDRESS from」に格納された「LENGTH length」のサイズのデータと、「MEM_ADDRESS to」に格納された「LENGTH length」のサイズのデータとを交換する。「EXCHANGE」においては、「MEM_KIND」として、「00(バッファ領域)」、「05(SRAM208)」および「07(RAM400)」のような、ランダムアクセス性能が高いメモリが使用可能であることが望ましい。
(3)OPERATE(OP_TYPE type、LONG val、MEM_KIND target、MEM_KIND result)
このコマンドは、演算を行うためのコマンドである。「OP_TYPE type」は、演算の種類を表す。「OP_TYPE type」は、ここでは3bitのサイズを有する。「OP_TYPE type」の値と演算の種類との対応関係の一例を以下に示す。
00:加算
01:<<
02:>>
03:AND
04:OR
05:NOT
06:XOR
「LONG val」は、演算に使用される整数である。「MEM_KIND target」は、演算対象のデータが格納されるデータ保存領域を表し、「MEM_KIND result」は演算結果が格納されるデータ保存領域を表す。「OPERATE」においては、「MEM_KIND target」および「MEM_KIND result」には、「01(演算バッファ領域)」、「02(演算バッファ領域)」、「03(演算バッファ領域)」および「04(演算バッファ領域)」が使用可能である。
なお、4つの演算バッファ領域は、夫々8byteのサイズを有する。ビットシフト(「01(<<)」および「02(>>)」)の演算においては、演算バッファ領域は「0」でパディングされる。「00(加算)」の演算が実行される際には、演算バッファ領域の最上位ビットは、桁あふれしたか否かを表すビットとして使用される。例えば、演算バッファ領域の最上位ビットにおいて、「1」は桁あふれが発生したことを示し、「0」は桁あふれが発生していないことを示す。
(4)COMPARE(COMP_TYPE type、LONG value、MEM_KIND target、MEM_KIND result)
このコマンドは、メモリノード11内においてメモリ間で比較を行うためのコマンドである。「COMP_TYPE type」は、比較の種類を表す。「COMP_TYPE type」は、ここでは3bitのサイズを有する。「COMP_TYPE type」の値と比較の種類との対応関係を以下に示す。
00:==value
01:!=value
02:>=value
03:>value
04:<=value
05:<value
「MEM_KIND target」は、比較対象のデータが格納されるデータ保存領域を表し、「MEM_KIND result」は、比較結果が格納されるデータ保存領域を表す。「COMPARE」においては、「MEM_KIND target」および「MEM_KIND result」には、「01(演算バッファ領域)」、「02(演算バッファ領域)」、「03(演算バッファ領域)」および「04(演算バッファ領域)」が使用可能である。メモリノード11は、比較結果が「true」である場合には「0x01」を書き込み、比較結果が「false」である場合には「0x00」を書き込む。
(5)UNLESS_GO(MEM_KIND target、LENGTH jump)
このコマンドは、条件分岐を行うためのコマンドである。「MEM_KIND target」は、条件分岐を判断するためのデータが格納されるデータ保存領域を表す。「UNLESS_GO」においては、「MEM_KIND target」には、「01(演算バッファ領域)」、「02(演算バッファ領域)」、「03(演算バッファ領域)」および「04(演算バッファ領域)」が使用可能である。「LENGTH jump」は、コマンド数を表す。メモリノード11は、「MEM_KIND target」が示す演算バッファ領域の最下位ビットが「1」である場合には、「UNLESS_GO」のすぐ後に記録されたコマンドを実行する。メモリノード11は、「MEM_KIND target」が示す演算バッファ領域の最下位ビットが「0」である場合には、「UNLESS_GO」のすぐ後に記録されたコマンドから「LENGTH jump」が示すコマンド数だけジャンプした位置に記録されたコマンドを実行する。例えば、第1ペイロードに「COMPARE」の後に「UNLESS_GO」を記録することによって、「COMPARE」による比較結果に応じて「UNLESS_GO」による条件分岐を実行させることが可能となる。
(6)SEND(FLAG to_CU)
このコマンドは、パケットの送信をメモリノード11に実行させるためのコマンドである。「FLAG to_CU」は、コネクションユニット14を宛先とするか他のメモリノード11を宛先とするかを表す。「FLAG to_CU」は、「1」が前者を、「0」が後者を、夫々表す、1bitのサイズを有する情報である。メモリノード11は、ヘッダに含まれる「LIFE」、「CRC」、「Frame size」を計算するとともに計算結果を送信ヘッダ領域に記録する。そして、メモリノード11は、送信ヘッダ領域に格納された内容をヘッダに、送信ペイロード領域に格納された内容を第1ペイロードに、夫々記録することによって、パケットを生成する。
なお、デフォルト設定によれば、メモリノード11は、受信ヘッダ領域に格納されている宛先のノードアドレスを送り元のノードアドレスとして送信ペイロード領域に格納し、受信ヘッダ領域に格納されている送り元のノードアドレスを宛先のノードアドレスとして送信ペイロード領域に格納する。「FLAG to_CU」の値が「0」である場合には、「COPY」を用いることによって送信ヘッダ領域に格納された宛先のノードアドレスが所望のノードアドレスに書き換えられる。
例えば、応答の内容を送信ペイロード領域に格納させ、その応答の内容をコネクションユニット14を介して送信させるといった運用が可能となる。また、第1ペイロードに記録されたコマンドのうちの所望のコマンド以降の連続するコマンドを送信ペイロード領域に格納させ、その連続するコマンドを他のメモリノード11に実行させるといった運用が可能となる。
(7)VARI_FILTER(CHAR start、CHAR end、MEM_ADDR addr、LENGTH length、FLAG part)
このコマンドは、可変長の文字列を検索するためのコマンドである。検索対象の範囲は、バッファ領域に格納されたデータのうちの、「CHAR start」に記録された文字から「CHAR end」に記録された文字に至るまでの範囲のデータである。「CHAR start」に記録された文字と「CHAR end」に記録された文字に至るまでの範囲のデータがバッファ領域に複数存在する場合には、それらの複数のデータが検索対象の範囲のデータである。「MEM_ADDR addr」は、検索文字列の先頭に位置を表し、「LENGTH length」は、検索文字列のサイズを表す。即ち、メモリノード11は、「MEM_ADDR addr」が表す位置から「LENGTH length」が表すサイズのデータを読み出して、読み出したデータを検索文字列とする。メモリノード11は、検索対象の範囲のデータが検索文字列と一部一致または完全一致した場合には、その検索対象の範囲のデータを送信ペイロード領域に格納する。送信ペイロード領域が溢れる場合には、エラーとなる。「FLAG part」は、部分一致検索を行うか、完全一致検索を行うかを表す。
(8)FIX_FILTER(LENGTH size、MEM_ADDR addr、LENGTH length、FLAG part)
このコマンドは、固定長の文字列を検索するためのコマンドである。検索対象の範囲は、バッファ領域に格納されたデータを先頭から「LENGTH size」が表すサイズ毎に分割して得られる夫々の分割データである。「MEM_ADDR addr」は、検索文字列の先頭に位置を表し、「LENGTH length」は、検索文字列のサイズを表す。メモリノード11は、検索対象の分割データと検索文字列とを逐次比較する。検索対象の分割データが検索文字列と一部一致または完全一致した場合には、メモリノード11は、一部一致または完全一致した分割データを送信ペイロード領域に格納する。送信ペイロード領域が溢れる場合には、エラーとなる。「FLAG part」は、部分一致検索を行うか、完全一致検索を行うかを表す。
メモリノード11は、受信ペイロード領域に格納されたデータの読み出し位置を管理するための先頭ポインタを備えている。図25は、先頭ポインタを説明する図である。受信ペイロード領域600には、第1ペイロードに記録された複数のコマンド(コマンド601およびコマンド602)が格納される。コマンド601およびコマンド602は、メモリノード11によってシリアルに実行される。メモリノード11は、コマンド601、602を実行中には、実行中のコマンド601、602に含まれる第2ペイロードの先頭位置に先頭ポインタ603を移動させる。例えば、コマンド601を実行中においては、先頭ポインタ603は、コマンド601に含まれる第2ペイロードの先頭位置を示し、コマンド602を実行中においては、先頭ポインタ603は、コマンド602に含まれる第2ペイロードの先頭位置を示す。
また、メモリノード11は、送信ペイロード領域に格納されたデータの長さを管理するために、長さポインタを備えている。例えば、メモリノード11は、例えばRAM400に長さポインタを記憶する。そして、メモリノード11は、所定の規則に則って長さポインタを更新する。メモリノード11は、パケットのヘッダに含まれる「Frame Size」を、長さポインタの値に基づいて算出する。
図26は、長さポインタの更新ルールを説明する図である。長さポインタ701は、送信ペイロード領域700に記録されている有効なデータの末尾を指す((a)を参照)。「COPY」においては、「ADDRESS」により送信ペイロード領域700のうちの書き込み位置を指定することが可能である。従って、例え既に有効なデータが格納されている範囲であっても、「COPY」によって上書きされてしまう場合が存在する。その場合であっても、メモリノード11は、有効なデータが格納されている範囲が変わらない場合は、長さポインタを更新しない((b)を参照)。(b)において、斜め線でハッチングされた領域は、「COPY」によってデータが上書きされた領域を示す。メモリノード11は、「VARI_FILTER」または「FIX_FILTER」を実行した結果、一部一致または完全一致したデータがあった場合には、そのデータを、長さポインタ701が示す位置に格納するとともに、格納したデータのサイズ分だけ長さポインタ701を送信ペイロード領域700の末尾に向かって移動させる((c)を参照)。(c)において、点でハッチングされた領域は、一部一致または完全一致されたデータを示す。
(第6の実施形態)
ここでは、ASICを用いてコントローラ200を構成する場合について説明する。以下、コントローラ200をNode Moduleと表記する。
[RAM構成]
FPGAで構成されたシステムは、RAMとして、FPGA専用のBRAMを使用している。このため、ASICで構成されたシステムでは、ASIC用のRAMに置き換える必要がある。注意する部分としては、FPGAはWord/Byteライトイネーブルに対して、ASIC用はbit単位で制御になっている点である。また、ASICのシリーズによっては、2ポートRAMに対応していない場合がある。この場合は、1ポートRAMを2つ用意することによって、バッファリング機能を新たに追加する必要がある。ASICのシリーズ選定をする際には、2ポートRAMに対応しているか否かについても注意が必要である。
図27は、2ポートRAMを用いてデータが受け渡しされる様子を説明する図であり、図28は、2つの1ポートRAMを用いてデータが受け渡しされる様子を説明する図である。
[PLL構成]
FPGAで構成されたシステムでは、FPGA専用のPLLモジュールを使用している。このため、自由に組み合わせたクロックを生成することが可能である。ASIC用のPLLモジュールは、高い周波数を生成し、それをCLK構成側で、所定の周波数ひ変換、制御する。PLLモジュールの機能テストのためのテスト回路(Mux回路)を追加することが必要である。
[CLK構成]
FPGAで構成されたシステムでは、CLK構成は、存在せず、すべてPLLモジュールで対応できる。ASICで構成されたシステムでは、各モジュールに対して周波数を提供するCLKGENモジュールが必要となる。このモジュールは、PLLの起動/停止などの制御を行い、PLLモジュールから入力される高い周波数からFlipFlop(FF)を使って1/2、1/4、1/8...など低い周波数を生成する。または、カウンタを使ってそれ以外の周波数を作成する。
ASICで構成されたシステムは、レジスタ制御によって各モジュールに対してのクロックをON/OFFできる、ゲーティング回路が搭載される。
[I/O構成]
FPGAで構成されたシステムでは、特殊I/Oから通常I/Oまで、I/O構成を任意に選択可能であるが、ASICで構成されたシステムではそうではない。特にNode Module間で使用しているLVDS I/Fは、例えば1.2Gbps程度で接続することを想定している。これに対応するには、専用I/Oとデータを受け取る回路(Serializer/Deserializer)が必要となる。
ASICで構成されたシステムで、DDR/2/3など高速RAMを実装する場合は、それに伴うPHYを実装する必要がある(アナログ回路)。
ASICで構成されたシステムの通常のI/Oは、GPIO制御の双方向通信可能な信号の利用が想定される。また、PULLUP/PULLDOWNも、レジスタで制御可能な特殊I/Oで実装される。
[RESET構成]
ASICで構成されたシステムでのRESET構成は、FPGAで構成されたシステムのそれと変えなくても良い。RESETモジュールは各周波数に同期化した回路を搭載して、各モジュールのリセットを行う。ただし、ASICで構成されたシステムでは、FPGAで構成されたシステムと違って、Node Moduleを交換する際にのみ、メインリセットを使うことが想定される。そのため、ASICで構成されたシステムでは、各ブロックおよび各ポートのソフトリセットなどが実装される必要がある。
例えば、ポートからSleep状態を解除されたモジュールが、ソフトリセットをかけてから起動しても良いし、Sleep状態に入る際にソフトリセットをかけて、Sleep解除前にソフトリセットを解除してから稼働しても良い。
[TEST構成]
ASICで構成されたシステムでは、TEST構成として、Node Moduleのクロック系(PLL、CLKGEN)や、搭載RAMのbitエラー、NANDフラッシュメモリの状態などの情報を外部から確認できる機能が必要となる。RAMの情報へのアクセスは、RAM BISTを使うことにより行うことができる。PLLモジュールの機能確認は、MUX制御で行うことができる。NANDフラッシュメモリの状態を判断する際は、Node Moduleからのアクセス履歴などを用いて判断する必要があるため、NANDフラッシュメモリとNode Moduleを1チップ化した場合は、システムはその情報にアクセスできる機能を備える必要がある。
[GatedClock構成]
CLKの源信に近い部分のON/OFFは、レジスタ制御で行われる。
ASICで構成されたシステムでは、Node ModuleはLVDS I/Fでパケットの先頭を検知することで、パケット毎にLinkを行う。これにより、パケットが来ていない場合、LVDS I/Fより内部の回路は、GatedClockにより停止することができる。停止した回路の起動は、パケットの先頭が来たことにより、GatedClockで回路をアクティブにされることで行われ、パケットの処理が完了し、次のパケットが来ていない場合にGatedClockで回路をディアクティブにする。
Node Moduleがアクセス可能なRAMはGatedClockによりディアクティブにされ、アクセスする時にだけGatedClockをイネーブルにし、そのRAMをアクティブにする。
数クロック毎に複数bitを更新するFFなど,制御信号が予め分かっている場合、その制御信号を使ってGatedClockを組み込むことができる。注意すべき点は、GatedClockはSubModuleとして実装し、通常回路と混ぜないことである。
[高速シリアル転送の構成]
高速シリアル転送として、例えば差動信号のLVDSが採用される。
[パッケージの検討]
パッケージとして、例えばフラットパッケージの144ピンなどが候補となるが、ASICで構成されたシステムでは、高速I/Fなどを複数実装するため、ノイズ対策や接点の接触などを避けるため、BGAなどPINが内側に隠れるパッケージが望ましい。
SRAM、DDR/2/3やNAND I/Fなどは、アドレス、データ幅のPIN数が必要となる。この部分は、他の信号と共通化できる物できる、I/FによってはPIN数が増大する可能性があるため、必要以上のRAMを搭載しないことが望ましい。
NANDフラッシュメモリおよびDDRまたはSRAMと、Node ModuleのASICチップとを基板上に並べて配置した場合に比べ、マルチチップ構造にして1チップ化することで実装面積を削減することが可能であり、またPIN数も削減することが可能となる。
[電圧の検討]
FPGAで構成されたシステムでは、NANDフラッシュメモリと、LVDS(Serializer/Deserializer)チップへの入力が、例えば3.3Vであり、それに合わせて全体が作成される。FPGAのコア電圧が異なる場合、DC−DCコンバーターで変圧して電力を提供する必要がある。ASICで構成されたシステムでは、コア電源として例えば1.5Vが、I/Oは例えば1.8Vの電圧が想定される。
[Node Moduleカードの検討]
Node Moduleカードに対してNode Moduleを1モジュール実装したと仮定する。Node Moduleカードは、Node Module ASICチップ1つに対して、NANDを少なくとも1つ、SRAMまたはDRAMを少なくとも1つの3チップ構成となる。またカード内には、DC−DC変換チップ、LED表示等が実装される。Node Moduleカードは、HotSwapに対応するため、マザーボードとの接続に、HotSwap対応のコネクタを使用する必要がある。
[Node Module間データ転送手順の検討]
FPGAで構成されたシステムでは、8bitのデータに対して3bitのNode Module Port間の制御信号を付加した11bitで通信を行う。I/Fとして8bit幅のものが採用された場合、このPort間の制御信号が使えなくなる。この場合、通信の手法としてNode Module間のパケットを別途定義するか、転送するパケットの最後に制御情報を追加するかの2択となる。後者の場合、制御信号を共有するためにパケットの送受信を行う必要があり、負荷が増大してしまう。そのため、前者の方式が望ましい。
[Node Module GPIOの検討]
ASICで構成されたシステムは、Node Moduleの状態(OKAY/ERROR/Etc)などの情報を通知するLEDと、モード情報を設定するDIP−SWなどが実装される。DIP−SWは、外部RAM I/Fの選択(DDR/SRAM)とNAND I/Fのアクセス選択(レガシ/Toggle DDR)などを行う。
ASICで構成されたシステムでは、テスト用途として、UARTまたはI2CをGPIO内に割り振り、Node Moduleの内部を直接制御できる様にすることが望ましい。
[Node Module 外部メモリI/Fの検討]
Node Moduleの外部メモリには、速度やChip電圧等を考慮すると、例えばDDR2 SDRAMが用いられる。SRAM等についても、例えば電源電圧が1.8Vのものを用いる。複数のRAMに対してそれぞれ専用PINを設計しておき、どちらの外部メモリI/Fを有効にするかを選択することで、複数のRAMを個別にアクセスすることが可能となる。SRAMのPINについては、同時に使用しないことが分かる場合は、他のGPIOと共通化しても構わない。
[システム構造の検討]
ブレードサーバー型のシステムは、例えば、1つ以上のNode Moduleと1つ以上コネクションユニット14を同じ基板に実装したドーターカードを、複数搭載可能なマザーボードが含まれる1つ以上のSystem Boxによって構成される。System Box間の接続は、サーバー背面にまとめておき、ブレード基板側から電源と情報コネクタで接続される。
System Boxを引き出しても、サーバー背面の電源と情報コネクタは外れない構造とすることで、System Boxを引き出した状況でも、稼働状態を継続させることが可能である。
[Node Moduleの座標設定手順の検討]
Node Moduleの座標を、隣接するNode Moduleとの位置関係で決定する場合、各System Box内の座標設定は、隣接するSystem Box内の座標設定と整合性をとる必要がある。
[Node Module ASIC版]
図29は、ASIC化を想定したNode Moduleの内部構成例を示す図である。なお、PCUは、Packet Command Unitである。PRUは、Packet Routing Unitである。PGUは、Packet Generation Unitである。NIUは、Node Information Unitである。NPMUは、Node Power Management Unitである。PDMAは、Packet Direct Memory Accessである。PRIUは、Packet Rx Interface Unitである。PTIUは、Packet Tx Interface Unitである。また、図には示さないがNode Moduleは、PHAU(Packet Header Analysis Unit)を持つ。PA、PB、PCについては、GPIO制御が想定されている。
[High Speed Serial Interface PORT[0〜3]]
例えば1Gbpsのシリアル差動信号に対して、例えば4相のサンプリングを行い、パケットの先頭を使って同期をとり、移行のヘッダ情報およびペイロード部を内部に取り込む。取り込んだ際に、シリアルからパラレルに変換し、例えば8bitまたは、32bitに変換してRAMに書き込む。
[PRIU]
PRIUでは、パケットを受け取ると、ヘッダが正しいかCRCチェックを行う。問題なければ、PTIU経由でOKAYパケット(PORT間パケット)を通知する。ERRORの場合は、ERRORパケット(PORT間パケット)または、RETRYパケット(PORT間パケット)を通知する。ヘッダが正しいと判断し、送信先座標が自座標であれば、PCU(Packet Command Unit)に通知(割り込み)を行う。他座標であれば、PRU(Packet Routing Unit)に通知(割り込み)を行う。
その後、PCU、PRUからの指示により、PDMAによりパケットを所定の場所にコピーする。コピーが正常終了した場合は、PDMAからOKAYのレスポンスが帰り、PRIUからRAM上のパケットが削除される。この場合の削除とは、High Speed Serial Interface側にRAMを解放することである。
[PTIU]
PTIUでは、PDMAからのパケットやPRIUからのPORT間パケットをRAMに書き込む。RAMにパケットが格納された後は、High Speed Serial Interface側から送出する。
[PCU]
PCUは、各ポートからの通知(割り込み)により、ポートに格納されているパケットのヘッダ情報を読み出し、命令解析を行う。解析した結果を元にPDMAに対して、転送指示を行う、もしくはペイロードに埋め込まれている連続命令の解析を行い、COPY、演算、サーチなどの命令の実行を行う。
[PRU]
PRUは、他座標や戻りパケットに対しての使用ポートのルーティングを計算する。ポートパケットによる情報と、自パケットの状況を踏まえて、例えば4方向のポートを検討する。PRUでは、パケットリミット値制御も行う。
[PGU]
PGUは、PCUやPRIUからの要求により、パケットの構築を行い、指示したモジュールに対して通知(割り込み)する。
[INTC]
INTCは、PRIU、PTIUやPDMAなどからの通知(割り込み)を受け取る。ラウンドロビン動作により順番に処理を行う。
[NIU]
NIUは、Node Moduleの各ポートからの状況やデータの流れを蓄積し、PCUからの問い合わせの際に情報を提示する。また、NANDアクセスの履歴情報などの管理を行う。
[NPMU]
NPMUは、Node Module内の電力制御を行う。このブロックは、指定間隔使用されない機能について停止制御を自動に制御する。機能復帰は、PCU、PRIU、PTIU、PDMAなどの機能ブロックから行う。
[PDMA]
PDMAは、PRIUやPCUなどの指示(転送コマンド)により、転送元アドレスから転送先アドレスに対して指定サイズ転送を行う。転送が完了すると指示元に通知(割り込み)を行う。通知を受け取った側はステータス情報を読み出して正常終了していることを確認する。転送コマンドは、パケットサイズと共に転送元と転送先の組み合わせのコマンドをセットする。PDMAは複数Chで構成される。
[Buffer]
Bufferは、パケットの保持などを行い、汎用の内部RAMで構成される。
[TIMER]
TIMERは、タイミング調整用のタイマである。TIMERは、指定間隔で問い合わせを行ったりする場合に使用される。カウントダウンタイマで、0になると通知(割り込み)する。
[内部バス]
内部バスは、BusMatrix構成になっている。内部バスは、PDMAの転送が停止しない様に複数定義される。内部バスの構成は、AHBをベースとする。
[CLKGEN]
CLKGENでは、High Speed Serial Interfaceの源信周波数および、各種内部周波数やGPIOなどの低速デバイス用などのクロックを生成する。なお、GatedClock等は含まない。機能ブロック毎にGatedClock付きのクロック信号が用意してもよい。図30は、CLKGENの構成を示す図である。
[RSTGEN]
RSTGENでは、図31に示すRSTGEN回路が実装される。ASICのルールに従った回路を実装する必要がある。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。