(57)【特許請求の範囲】
【請求項１】
複数の第１記憶デバイスと、複数の第２記憶デバイスと、ストレージコントローラと、を有するストレージシステムであって、
前記複数の第１記憶デバイスはそれぞれ、データの消去単位である複数の物理ブロックを各々有する複数のフラッシュチップと、前記複数の物理ブロックの各々の消去回数を管理し、前記第１記憶デバイス内の物理ブロック間の消去回数の偏りを少なくさせる機能を実行する第１デバイスコントローラを含み、
前記複数の第２記憶デバイスはそれぞれ、第２デバイスコントローラを含み、
前記ストレージコントローラは、
それぞれが、前記複数の第１記憶デバイスのうちの一揃えの前記第１記憶デバイス群から成り、それぞれが該一揃えの前記第１記憶デバイス群の各々に分割格納されている複数の第１データ領域を含む、複数の第１ＲＡＩＤグループと、
それぞれが、前記複数の第２記憶デバイスのうちの一揃えの前記第２記憶デバイス群から成り、それぞれが該一揃えの前記第２記憶デバイス群の各々に分割格納されている複数の第２データ領域を含む、複数の第２ＲＡＩＤグループと、
を構成し、
前記第１データ領域と前記第２データ領域の各々は、複数のデータレコードと該複数のデータレコードから生成されるパリティレコードとを含むレコードセットを少なくとも１つ格納するものであって、
前記ストレージコントローラはまた、
前記複数の第１記憶デバイスの各々から、前記第1デバイスコントローラによって管理されている消去回数に関する第１情報を取得し、
前記複数の第１ＲＡＩＤグループの中から前記第１情報に基づいて、前記レコードセットの転送元となる少なくとも１つの第１ＲＡＩＤグループを選択し、
前記複数の第２ＲＡＩＤグループの中から前記レコードセットの転送先となる少なくとも１つの前記第２ＲＡＩＤグループを選択し、
前記選択された第１ＲＡＩＤグループから、前記複数の第１データ領域のうちの１つの第１データ領域内の前記レコードセットを、前記選択された第２ＲＡＩＤグループへと転送する、
ことを特徴とするストレージシステム。
【請求項２】
請求項１に記載のストレージシステムにおいて、前記ストレージコントローラは、
ホストコンピュータに対し、複数の仮想データ領域を有する仮想ボリュームを提供するよう構成され、
前記複数の第１及び第２データ領域の各々は、前記仮想データ領域に割り当て可能であることを特徴とするストレージシステム。
【請求項３】
請求項２に記載のストレージシステムにおいて、前記ストレージコントローラは、
前記複数の第１及び第２データ領域についてのデータ書き込み量に関連する第２情報を取得し、
前記第１ＲＡＩＤグループの中から、前記第２情報に基づいて選択された特定の第１データ領域から、前記第２ＲＡＩＤグループの中から選択され、かつ前記複数の仮想データ領域のいずれにも割り当てられていない特定の第２データ領域へと前記レコードセットを転送し、
前記特定の第１データ領域が割り当てられていた前記仮想データ領域へのデータ領域の割り当てを、前記特定の第１データ領域から前記特定の第２データ領域へと変更するように構成されていることを特徴とするストレージシステム。
【請求項４】
請求項１に記載のストレージシステムにおいて、
前記第１ＲＡＩＤグループの第１記憶デバイスの消去回数は、第１の所定の閾値より多いことを特徴とする
ストレージシステム。
【請求項５】
請求項１に記載のストレージシステムにおいて、前記ストレージコントローラは、
ホストコンピュータから、特定のパターンを有するデータについて記憶領域に書き込みする要求を受け付け、
前記記憶領域に関係する前記第１記憶デバイスを特定し、
前記特定された第１記憶デバイスに対して消去要求を送信するよう構成され、
前記特定された第１記憶デバイスの前記第１デバイスコントローラは、前記消去要求を受け付けると、前記消去要求で指定された複数の物理ブロックを消去することを特徴とする、ストレージシステム。
【請求項６】
請求項１に記載のストレージシステムにおいて、
一の前記第１デバイスコントローラから前記ストレージコントローラに対して提供される論理ブロック群の合計記憶容量は、前記複数の第１記憶デバイスのうちの１つの第１記憶デバイスが有する全物理ブロックの合計記憶容量よりも大きいことを特徴とするストレージシステム。
【請求項７】
請求項６に記載のストレージシステムにおいて、前記第１デバイスコントローラは、
前記ストレージコントローラから書き込み要求を受け付け、
前記書き込み要求で指定された前記論理ブロックに物理ブロックが割り当てられていない場合には、前記指定された論理ブロックに対して前記複数の物理ブロックのうちの１つを割り当てるように構成されていることを特徴とするストレージシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージシステムに関する。
【背景技術】
【０００２】
フラッシュメモリは、メモリの特性上、データを書き換えようとした時、そのデータが元々格納されていた物理領域上に、そのデータを、直接上書きすることは不可能である。データの書換えを行う際には、フラッシュメモリの消去単位であるブロックと呼ばれる単位で、消去処理を実行した後、データを書き換える必要がある。このブロックに対する消去処理の実行回数には、物理的な制約から限界がある。フラッシュメモリのブロックは、消去回数がこの限界数をこえると、そのブロックにはデータを格納できなくなってしまうという性質をもっている。【０００３】
このため、フラッシュメモリの各々のブロックに対して、データを格納するアドレスを固定的に割り当てる方式をとると、通常はアドレスごとに書換え頻度が異なるので、消去回数のばらつきがブロックごとに生ずることになる。このため、ある特定のブロックの消去回数が限界数を超えると、そのブロックに割り当てたアドレスのデータを格納できなくなってしまう。以上の問題を解決するため、このばらつきを少なくする技術として、ウエアレベリングと呼ばれる技術が公開されている（例えば、特許文献１）。ウエアレベリングの基本的な考え方は、外側に見せるアドレス層として、物理的なアドレスとは別に、論理的なアドレス層を設け、物理的なアドレスに割り当てる論理的なアドレスを適宜変更していく、例えば、頻繁にアクセスされる論理的なアドレスには、消去回数の少ないアドレスを割り当てることによって、物理的なブロックの消去回数の偏りを削減しようというものである。また、物理的なアドレスが変更になっても、論理的なアドレスは変わらないので、外側からは、同一のアドレスでデータクセスが可能であるため、使い勝手の良さも維持できる。【０００４】
次に、格納容量削減技術について述べる。近年、ストレージシステムでは、格納容量を削減する技術が注目されている。その代表的な技術の一つが、容量の仮想化技術である。容量の仮想化技術とは、ストレージシステムがもっている物理的な容量より大きな仮想的な容量をホスト側に見せる技術である。これは、ユーザが実際にストレージを使用する場合、ユーザが定義したユーザボリューム（ユーザからみた記憶装置）の容量に対し、実際に格納するデータの量は、この定義容量には、なかなか達しないという特性を利用したものである。すなわち、容量仮想化技術がない場合には、ボリューム定義時に、定義された物理的な容量を確保していたのに対し、容量仮想化技術を適用した場合には、実際にストレージシステムにデータが格納されたとき、初めて容量を確保することになる。これによって、格納容量を削減でき、かつ、ユーザはボリューム容量を厳密に定義する必要なく、単純に大きく余裕をもった値を定義すればよいため、使い勝手も向上できる。この技術において、データが書き込まれたときに確保される物理的な記憶領域は、ページと呼ばれる。一般に、ページのサイズは、多様性にとんでいるが、本発明では、ページのサイズのほうが、フラッシュメモリの消去単位であるブロックのサイズより大きいものとする。一方、フラッシュメモリにおいては、一般的に、消去の単位は、前述したようにブロックと呼ぶのに対し、ブロックの中での読み書きの単位をページとよぶ。当然、フラッシュメモリにおいては、ブロックのサイズのほうが、ページサイズより大きくなる。しかし、本発明では、ページという言葉は、容量仮想化におけるページをさすことにする。また、繰り返しになるが、本発明においては、ページのサイズは、フラッシュメモリのブロックのサイズよりも大きいとする。【０００５】
ただし、本発明の対象となるストレージシステムは、上記の容量仮想化技術をもっていることが必ずしも必要条件とはならない。一方、容量仮想化技術をもったストレージステムにおいては、ページ単位で、ページを記憶装置（典型的には、HDD(Hard Disk Drive)）の間で移動させ、性能向上を実現させる技術が、公開されている（特許文献２）。さらに、価格性能比がことなる記憶装置間で、ページを移動させ、価格性能比を向上させる技術も公開されている。一方、通常、HDDには、ユーザのデータを格納する前に、特定のパターン、例えば、オール０などでフォーマティングする。この際、ホストが書き込むこの特定パターンを、ストレージシステムで検出して、すでに割り当てているページを解放する技術も公開されている（特許文献３）。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】日本国特許3507132
【特許文献２】特開2007-66259号公報
【特許文献３】特開2007-199922号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
本発明の対象となるフラッシュメモリを記憶媒体とする大容量ストレージシステムにおいては、フラッシュメモリチップの数は、例えば数万に及ぶ。このため、数百のチップを搭載したフラッシュパッケージを数百枚、ストレージシステムのコントローラに接続するのが典型的な構成となる。【０００８】
本発明において解決しようとする課題は、第1に、多数のフラッシュメモリチップを記憶媒体として構成する大規模ストレージシステムにおいて、ストレージシステム全体で、フラッシュメモリの消去回数の偏りを効率的に少なくすることであり、第2に、フラッシュメモリへの格納データ容量を削減することである。まず、第1の課題について述べる。フラッシュメモリを搭載したストレージシステムにおいては、ウエアレベリング技術が大変重要になる。しかし、本発明の対象となる数万のフラッシュメモリを有するストレージシステムにおいて、従来のウエアレベリングの考え方を、そのまま適用すると、数万個のすべてのフラッシュメモリチップのブロック消去回数の偏りを少なくしようとするので、ウエアレベリングの制御オーバヘッドが大きくなってしまうという課題があった。【０００９】
第2の課題について説明する。容量仮想化技術を適用したストレージシステムにおいては、データの書き込みが行われると、ページを確保することになる。したがって、ページサイズを小さくしたほうが、容量の削減効果は大きいことになる。ただ、本技術を適用すると、ホストから見て連続しているボリュームのアドレスが、ページごとに、HDD上でバラバラに格納される可能性がでてくる。通常、HDDの連続した領域へのアクセス（シーケンシャルアクセス）は、バラバラな領域へのアクセス（ランダムアクセス）に比較すると格段に高速になるので、ホスト上のアプリーションソフトは、この性能差を意識して構築される。したがって、容量仮想化を導入しても、シーケンシャルアクセスに対する性能を維持しようとすると、ページサイズをある程度より、大きくする必要があった。このため、容量の削減効率が十分でないという課題があった（すでに述べたように、本発明では、ページのサイズは、フラッシュメモリのブロックのサイズよりも大きいとしている）。
【課題を解決するための手段】
【００１０】
前記第1の課題を解決するための、本発明の第１の特徴は、階層的なウエアレベリングを行う点である。すなわち、上位レベルのウエアレベリングと下位レベルのウエアレベリングにより構成される点が特徴となる。階層化することで、効率的に、ストレージシステム全体の数万個のすべてのフラッシュメモリチップのブロック消去回数の偏りを少なくすることができる。本発明の第１の特徴では、階層的なウエアレベリングを行う点であるので、上位レベルのウエアレベリングの単位を特に規定しない。(任意の単位である。)。下位レベルのウエアレベリングは、複数のチップ（例えば数百のチップ）を搭載したフラッシュパッケージ上のブロック消去回数の偏りを少なくしようとするウエアレベリングであり、特許文献１のような公知技術を適用してよい。基本的には、下位レベルのウエアレベリングの単位は、フラッシュメモリの消去単位であるブロックであるのが一般的である。なお、一つのフラッシュパッケージを一つのＳＳＤ(Solid  State Drive)としても、 本発明は有効である。フラッシュパッケージがプロセッサをもつ場合、下位レベルのウエアレベリングは、当該プロセッサがそのパッケージ内のフラッシュメモリのブロックの消去回数の偏りを少なくするのが一つの方法である。ただし、ストレージシステムのコントンローラプロセッサで、下位レベルのウエアレベリングを行ってもよい。一方、本発明の第２の特徴は、上位レベルのウエアレベリングを、ストレージシステムの容量仮想化のために導入した、ベージ単位で行う点である。（これは、本発明の第１の特徴を実現するだけであれば、ストレージシステムのコントローラが、容量仮想化機能をもつことが必須の条件ではないことを意味している。）一方で、容量仮想化を実現しているストレージシステムにおいては、ページ単位での移動制御を行うのが今後の潮流となっており、フラッシュメモリの上位レベルのウエアレベリングをページとすることにより、このページ単位制御の一環とすることができるメリットが大きい。また、ページというブロックより大きなサイズでウエアレベリングを行うことにより、オーバヘッドを少なくできる。【００１１】
また、本発明における上位レベルのウエアレベリングでは、ブロック消去回数の偏りを少なくしてもよいし、ブロック消去回数が限界数に達するまでの予測時間がある一定時間以上になるように制御してもよい。【００１２】
第2の課題の解決を狙った、本発明の第３の特徴は、階層的な容量仮想化を実現する点である。上位レベルの容量仮想化は、従来のように、ストレージシステムのコントローラで実現し、ホストに仮想容量を適用する。したがって、第２の課題を解決する本発明の第３の特徴は、下位レベルの容量仮想化であり、フラッシュパッケージの容量を仮想化し、実際、フラッシュパッケージがもっているフラッシュメモリの容量より大きな容量を仮想容量として定義し、下位レベルで、データを書き込もうとしたとき、ブロックを割り当てられているかどうかをチェックして、いないとき初めてブロックを割り当てることが本発明の特徴である。これにより、実際に割り当てる契機を遅らせることができ、割り当てる容量もページに比べブロックという小さいサイズにすることができる。また、フラッシュメモリの特質として、ランダムアクセスもシーケンシャルアクセスも性能差が、ほとんどないため、割り当てサイズを小さくしても性能上の問題がほとんどない。【００１３】
また、本発明の課題２を解決する第４の特徴として、オール０などのフォーマット情報を認識した場合も、下位レベルの容量仮想化機能で、ブロック単位の解放を行い、容量の削減効果を可能にする。ただし、フラッシュメモリの特性として、解放を行うブロックを他の領域に割り当てるには、一度、消去する必要がある。なお、通常のWriteコマンドで、オール０などのフォーマットパターンを書き込んだ場合にも、ストレージシステムで、フォーマットパターンを認識して、対応するブロックを解放させ、容量削減を図ることも可能である。下位レベルの容量仮想化は、フラッシュパッケージがプロセッサをもつ場合、当該プロセッサがそのパッケージ内の容量を仮想化するのが、一つの方法である。ただし、ストレージシステムのコントンローラプロセッサで、下位レベルの容量仮想化を行ってもよい。また、記憶媒体をフラッシュメモリとし、実容量より大きい仮想容量を持ち、消去単位であるブロックを割り当て単位とした、容量仮想化機能を、従来の上位レベルの容量仮想化機能なしに、ホストに提供してもよい。
【発明の効果】
【００１４】
本発明によれば、それぞれが多数のフラッシュメモリを実装したフラッシュパッケージを多数接続した大容量のストレージシステムにおいて、効率的なウエアレベリングを実現できる。さらに、従来技術に比べ、性能劣化をほとんど招かずに、データ格納容量の削減も可能となる。
【図面の簡単な説明】
【００１５】
【図１】図１は、本発明の一実施形態に係るストレージシステム１００を有する情報システムを示す図である。
【図２】図２は、ストレージシステム１００の構成を示す図である。
【図３】図３は、フラッシュパッケージ２３０の構成を示す図である。
【図４】図４は、共有メモリ２２０に記憶される情報を示す図である。
【図５】図５は、論理ボリューム情報２０００を示す図である。
【図６】図６は、スケジュール情報２７００を示す図である。
【図７】図７は、実ページ情報２１００を示す図である。
【図８】図８は、本発明の一実施形態における複数種類の記憶領域の対応関係を示す図である。
【図９】図９は、空きページ管理情報ポインタ２２００によって管理される空きページの集合を表した図である。
【図１０】図１０は、パッケージグループ情報２３００を示す図である。
【図１１】図１１は、フラッシュパッケージ情報２５００を示す図である。
【図１２】図１２は、パッケージメモリ３２０に記憶される管理情報を示す図である。
【図１３】図１３は、図１２に示した管理情報と同様の管理情報が共有メモリ１６０に記憶された例を示す図である。
【図１４】図１４は、パッケージ情報３０００を示す図である。
【図１５】図１５は、チップ情報３１００を示す図である。
【図１６】図１６は、仮想ブロック情報３２００を示す図である。
【図１７】図１７は、実ブロック情報３３００を示す図である。
【図１８】図１８は、空きブロック情報ポインタ３４００によって管理される空きブロックの集合を表した図である。
【図１９】図１９は、メモリ２７０に格納されたプログラムを示す図である。
【図２０】図２０は、リード処理実行部４０００の処理フローを示す図である。
【図２１】図２１は、ライト要求受付部４１００の処理フローを示す図である。
【図２２】図２２は、ライトアフタ処理実行部４２００の処理フローを示す図である。
【図２３】図２３は、ライトセイムコマンド処理実行部４３００の処理フローを示す図である。
【図２４】図２４は、ページ移動スケジュール部４４００の処理フローを示す図である。
【図２５】図２５は、ページ移動処理実行部４５００の処理フローを示す図である。
【図２６】図２６は、パッケージメモリ３２０に格納されているプログラムを示す図である。
【図２７】図２７は、下位レベルのプログラムがメモリ２７０に格納された例を示す図である。
【図２８】図２８は、データリード処理実行部１２０００の処理フローを示す図である。
【図２９】図２９は、データライト処理実行部１２１００の処理フローの一部を示す図である。
【図３０】図３０は、データライト処理実行部１２１００の処理フローの残りを示す図である。
【図３１】図３１は、実ブロック解放処理実行部１２２００の処理フローを示す図である。
【図３２】図３２は、仮想ブロック移動処理実行部１２３００の処理フローを示す図である。
【図３３】図３３は、仮想ブロック格納処理実行部１２４００の処理フローを示す図である。
【発明を実施するための形態】
【００１６】
以下、図面を参照して、本実施形態を詳細に説明する。
【００１７】
図１は、本発明の一実施形態に係るストレージシステムを有する情報システムを示す。
【００１８】
情報システムは、ストレージシステム１００と、ホスト１１０と、それらを接続するＳＡＮ（Storage Area Network）１２０とを有する。ホスト１１０は、ストレージシステム１００に、ＳＡＮ１２０経由で、データの読み書きを行う。図１には、示してはいないが、ストレージシステム１００は、ＳＡＮ経由で、別のストレージシステム１００と接続されていて、ストレージシステム１００の間で、ディザスタリカバリに対応したリモートコピー機能を実行してもよい。
【００１９】
ホスト１１０は、ユーザアプリケーションが動作するシステム（例えば計算機）である。ホスト１１０は、ＳＡＮ１２０を介して、ストレージステム１００が提供する論理ボリュームにアクセスする。論理ボリュームは、前述した上位レベルの容量仮想化に従う論理ボリューム（複数の仮想ページで構成されたボリューム）であってもよいし、通常の論理ボボリュームであってもよい。ただし、以下では、容量仮想化にしたがう論理ボリュームを前提に説明する。なお、ＳＡＮ１２０では、ＳＣＳＩ（Small Computer System Interface）コマンドが転送可能なプロトコル（例えば、Fibre Channel等のプロトコル）が用いられる。
【００２０】
本実施形態は、多数のフラッシュメモリを記憶媒体として構成するストレージシステム１００において、第1の技術として、フラッシュメモリの消去回数の偏りを少なくしようとする技術、および、第2の技術として、フラッシュメモリへの格納データ容量削減技術を実現するものである。第1の技術は、階層型ウエアレベリング技術であり、第2の技術は、階層型容量仮想化技術である。本実施形態では、階層型のウエアレベリング技術、階層型の容量仮想化技術の双方を実現しているが、本発明は、それぞれ単独に、階層型のウエアレベリングング技術だけ、階層型の容量仮想化技術だけを実現しても有効である。また、本実施形態においては、上位レベルのウエアレリング技術、容量仮想化技術の制御単位は、ページとよばれる単位である。本実施形態におけるページは、従来の特許文献２に示される容量仮想化技術で開示されているページである。なお、以下の説明では、階層型ウエアレベリングにおける上位レベルの制御単位は、ページであるが、本発明は、その制御単位がページでなくとも有効である。例えば、上位レベルのウエレベリングの制御単位を、下位レベルの制御単位と同じように、フラッシュメモリの消去単位であるブロックを基本にしてもよい。本実施形態では、ページのサイズは、フラッシュメモリにおける消去単位であるブロックよりも大きい。通常、フラッシュメモリにおいては、リード・ライトの単位をページと呼ぶので、ページはブロックよりも小さい。しかし、すでに述べたように、本実施形態では、ページは、容量仮想化技術示されるページを意味しており、そのサイズは、ブロックよりも大きい。また、下位レベルのウエアレリング技術、容量仮想化技術の制御単位は、基本的には、フラッシュメモリの消去単位である１つのブロックであるが、ブロックの整数倍の単位としてもよい。ただし、本実施形態では、１つのブロックを制御単位とすることを前提にして、説明を行う。また、本発明は、記憶媒体をフラッシュメモリとし、実容量より大きい仮想容量を持ち、消去単位であるブロックを割り当て単位とした、下位レベルの容量仮想化機能を、単独に、従来の上位レベルの容量仮想化機能なしに、ホスト１１０に提供しても有効である。また、本実施形態においては、フラッシュメモリの消去回数の偏りを少なくしようとする技術に加えて、フラッシュメモリの寿命を所定の期間より延ばそうという技術を実現している。このため、ウエアレベリング機能については、さらに広い技術が加わったことを考慮して、長寿命化制御とも呼ぶ。
【００２１】
図２は、ストレージシステム１００の構成を示す。
【００２２】
ストレージシステム１００は、複数のフラッシュパッケージ２３０と、一以上のストレージコントローラ２００と、キャッシュメモリ２１０と、共有メモリ２２０と、タイマ２４０と、これらの構成要素を接続する一以上の接続装置２５０とを有する。なお、一つのフラッシュパッケージ２３０が、１つのＳＳＤ(Solid  State Drive)であっても、 本発明は有効である。また、フラッシュパッケージ２３０に加えて、ハードディスクドライブ（ＨＤＤ）などが備えられても良い。なお、本発明において、上位レベルの長寿命化制御（ウエアレベリング機能）と容量仮想化機能は、ストレージコントローラ２００が実行する。一方、下位レベルの長寿命化制御（ウエアレベリング機能）と容量仮想化機能は、ストレージコントローラ２００が実行しても、フラッシュパッケージ２３０が実行してもよい。ただし、本実施形態では、フラッシュパッケージ２３０が実施する形態を、中心に説明を行う。
【００２３】
タイマ２４０は、すべてのストレージコントローラ２００から参照可能である。タイマ２４０が表す情報は、時刻である必要は無く、例えば、経過時間に相当する値を示すかカウント値でもよい。
【００２４】
全てのフラッシュパッケージ２３０の記憶容量（実ブロックの総記憶容量）が等しい必要は無いが（すなわち、記憶容量の異なるフラッシュパッケージ２３０が混在していても良いが）、本実施形態では、全てのフラッシュパッケージ２３０の記憶容量（実ブロックの総記憶容量）が等しいとする。
【００２５】
ストレージコントローラ２００は、ＳＡＮ１２０を通じて、ホスト１１０から、ライト要求及びそれに付随するデータ、又は、リード要求を受け付ける。ストレージコントローラ２００は、メモリ２７０とプロセッサ２６０とを有する。メモリ２７０は、プログラム及び情報を記憶する。プロセッサ２６０は、メモリ２７０に記憶されているコンピュータプログラムを実行する。
【００２６】
接続装置２５０は、ストレージシステム１００内の各構成要素を接続する装置（例えばクロスバスイッチ）である。本実施形態では、各ストレージコントローラ２００及び各フラッシュパッケージ２３０が複数の接続装置２５０に接続されている。しかし、必ずしも複数の接続装置２５０に接続されている必要はなく、例えば、一つのフラッシュパッケージ２３０及び／又は一つのストレージコントローラ２００が一つの接続装置２５０にしか接続されていなくても良い。
【００２７】
キャッシュメモリ２１０及び共有メモリ２２０は、揮発メモリ（例えばＤＲＡＭ（Dynamic Random Access Memory）で構成されるが、バッテリーなどにより不揮発化されている。ただし、キャッシュメモリ２１０が不揮発化されていなくても本発明は有効であるし、共有メモリ２２０が、不揮発化されていなくとも本発明は有効である。また、キャッシュメモリ２１０が二重化さていてもよいし、共有メモリ２２０が二重化されていてもよい。キャッシュメモリ２１０には、例えば、フラッシュパッケージ２３０に格納されたデータの中で、ストレージコントローラ２００から頻繁にアクセスされるデータが格納される。ストレージコントローラ２００は、ホスト１１０から受け付けたライト要求に付随するデータをキャッシュメモリ２１０に書き込んだ時点で、ライト処理の完了としても良いし、そのデータをキャッシュメモリ２１０からフラッシュパッケージ２３０に格納した時点でライト処理の完了としても良い。共有メモリ２２０は、キャッシュメモリ２１０の制御情報、ストレージシステム１００に関する管理情報などを記憶する。
【００２８】
フラッシュパッケージ２３０は、ストレージコントローラ２００からは、一台の記憶装置に見えているものとする。ストレージコントローラ２００が、高信頼化のために、所定数（例えば一台又は二台）のフラッシュパッケージ２３０が故障してもそのフラッシュパッケージ２３０のデータを回復できるＲＡＩＤ（Redundant Array of Independent (or Inexpensive) Disks）機能を有する。(なお、‘ＲＡＩＤ’という用語の’Ｄ’は’Ｄｉｓｋ’の略であるが、ある記憶装置に障害が発生したときに、別の記憶装置の冗長データなどから故障した装置のデータを復元する機能は、Ｄｉｓｋ以外の記憶装置にも適用可能である。)ＲＡＩＤ機能がある場合、複数のフラッシュパッケージ２３０で一つのＲＡＩＤ構成が構築される。そのＲＡＩＤ構成に従うグループを、以下、「パッケージグループ」と呼ぶ。ストレージシステム１００はＲＡＩＤ構成を有していなくても良い。
【００２９】
図３は、フラッシュパッケージ２３０の構成を示す。
【００３０】
フラッシュパッケージ２３０は、複数のフラッシュチップ３００と、パッケージコントローラ３１５とを有する。
【００３１】
パッケージコントローラ３１５は、パッケージプロセッサ３１０と、パッケージメモリ３２０と、バッファ３３０と、パッケージバス３４０と、パッケージバス転送装置３５０とを有する。パッケージプロセッサ３１０は、ストレージコントローラ２００からのライト指示やリード指示を処理する。
【００３２】
バッファ３３０は、ストレージコントローラ２００とフラッシュチップ３００との間で読み書きされるデータを格納する。本実施形態では、バッファ３３０は揮発メモリである。ストレージコントローラ２００から受けたライト指示の処理は、そのライト指示に従うデータがフラッシュチップ３００に書き込まれた時点で完了となる。ただし、バッファ３３０が、不揮発化されていて、ストレージコントローラ２００へのライト指示の完了報告の後、データをフラッシュチップ３００に書き込んでも、本発明は有効である。パッケージメモリ３２０には、パッケージプロセッサ３１０が実行するコンピュータプログラム、フラッシュパッケージ２３０の管理情報が格納される。ただし、パッケージメモリ３２０が不揮発化されていても本発明は有効である。
【００３３】
パッケージバス３４０は、バッファ３３０とフラッシュチップ３００との間でデータ転送を行うバスで、一本以上存在する。一本のパッケージバス３４０に、一つ以上のフラッシュチップ３００が接続される。
【００３４】
パッケージバス転送装置３５０は、パッケージバス３４０対応に存在し、パッケージプロセッサ３１０の指示にしたがって、バッファ３３０とフラッシュチップ３００との間で、データ転送を実行する。
【００３５】
図４は、共有メモリ２２０に記憶される情報を示す。
【００３６】
共有メモリ２２０は、例えば、論理ボリューム情報２０００、スケジュール時間情報２７００、実ページ情報２１００、空きページ管理情報ポインタ２２００、パッケージグループ情報２３００、フラッシュパッケージ情報２５００及び仮想ページ容量２６００を記憶する。これらの情報は、上位レベルの長寿命化制御と、上位レベルの容量仮想化機能とに必要である。
【００３７】
仮想ページ容量２６００は、仮想ページの容量を表す情報である。なお、仮想ページの容量（サイズ）と実ページの容量（サイズ）は等しくないことがある。例えば、仮想ページの容量と実ページの容量との関係は、ＲＡＩＤ構成に依存する。具体的には、例えば、ＲＡＩＤ１のようにデータを２重に書き込む場合、実ページの容量は、仮想ページの容量の２倍になる。また、例えば、ＲＡＩＤ５のように、Ｎ台の記憶装置の容量に対し１台分の記憶装置の容量の冗長データを格納する場合、実ページの容量は、仮想ページの容量の(Ｎ＋１)／Ｎの容量である。また、例えば、ＲＡＩＤ０のように、冗長性がない場合、実ページの容量は、仮想ページの容量と等しい。なお、本実施形態においては、仮想ページ容量２６００はストレージシステム１００の中で共通であるが、ストレージシステム１００に仮想ページ容量２６００に異なったものがあっても、本発明は有効である。
【００３８】
本実施形態では、ストレージステム１００は、前述した上位レベルの容量仮想化機能を有するが、その機能を必ずしも有していなくても良い。上位レベルの容量仮想化機能について、記憶領域の割り当て単位は「ページ」であり、下位レベルの容量仮想化機能について、記憶領域の割り当て単位は「ブロック」である。
【００３９】
図８は、複数種類の記憶領域の対応関係を示す。
【００４０】
本実施形態においては、それぞれのフラッシュパッケージ２３０は、容量仮想化機能をもっており、ストレージコントローラ２００には、見かけ上、実際の物理容量より大きな容量を提供している。フラッシュパッケージ２３０の容量仮想化の単位は、本実施形態では、フラッシュメモリの消去単位であるブロックとする。以下、ストレージコントローラ２００から見たブロックを「仮想ブロック」と呼び、フラッシュパッケージ２３０が、実際に割り当てているブロックを「実ブロック」と呼ぶ。したがって、本実施形態では、実ページは、仮想ブロックにより構成されることになる。また、本実施形態では、仮想ブロックにより構成される容量空間のほうが、実ブロックにより構成される容量空間より大きいことになる。図８は、仮想ページ、実ページ、仮想ブロック、実ブロックの関係を示したものである。すでに述べたように、実ページには、仮想ページにはない、冗長データが含まれている。一方、仮想ブロック、実ブロックに含まれるデータは同じである。また、本実施形態では、フラッシュパッケージ２３０は、実ブロック数より多くの仮想ブロックをもっているように、ストレージコントローラ２００に見せていることになる。ただし、本実施形態では、ストレージコントローラ２００は、実際にフラッシュパッケージ２３０がいくつの実ブロックをもっているかを意識して、実ページの再配置を行う。本実施形態では、フラッシュパッケージ２３０が、まだ実ブロックを割り当てていない仮想ブロックに、書き込み要求を受け付けたとき、実ブロックを割り当てることが特徴である。
【００４１】
以下、ストレージコントローラ２００から実ブロックへのアクセスの流れを説明する。なお、ストレージコントローラ２００は、どの仮想ページにどの実ページが割り当てられているかの対応関係（ページ対応関係）を管理している。ただし、以下では、下位レベルの長寿命化制御（ウエアレベリング機能）と容量仮想化機能は、フラッシュパッケージ２３０が実施する形態で説明を行う。
【００４２】
ストレージコントローラ２００は、ホスト１１０からライト要求を受けた場合、そのライト要求から特定される仮想ページ（ライト先の仮想ページ）に実ページが割り当てられているか否かをページ対応関係を基に判断する。その判断の結果が否定的の場合、ストレージコントローラ２００は、ライト先の仮想ページに未割当ての実ページを割り当て、割り当てた実ページに、ライト要求に付随するデータを書き込む。
【００４３】
ストレージコントローラ２００は、実ページにデータを書き込む場合、その実ページに基づくアドレスを指定したライト指示を、そのアドレスを管理するパッケージコントローラ３１５に送信する。そのライト指示を受けたパッケージコントローラ３１５が、ブロック対応関係を基に、そのライト指示で指定されているアドレスを有する仮想ブロック（ライト先の仮想ブロック）に実ブロックが割り当てられているか否かを判断する。その判断の結果が否定的の場合に、パッケージコントローラ３１５は、ライト先の仮想ブロックに未割当ての実ブロック（空きの実ブロック）を割当て、割り当てた実ブロックに、そのライト指示の対象のデータを書き込む。
【００４４】
ストレージコントローラ２００は、ホスト１１０からリード要求を受けた場合、そのリード要求から特定される仮想ページ（リード元の仮想ページ）に割り当てられている実ページをページ対応関係を基に特定する。ストレージコントローラ２００は、特定された実ページからデータを読み出し、読み出したデータをホスト１１０に送信する。
【００４５】
ストレージコントローラ２００は、実ページからデータを読み出す場合、その実ページに基づくアドレスを指定したリード指示を、そのアドレスを管理するパッケージコントローラ３１５に送信する。そのリード指示を受けたパッケージコントローラ３１５が、そのリード指示で指定されているアドレスを有する仮想ブロックに割り当てられている実ブロックをブロック対応関係を基に特定する。パッケージコントローラ３１５が、特定された実ブロックからデータを読み出し、そのデータをストレージコントローラ２００に送信する。
【００４６】
なお、例えばＮＡＮＤ型のフラッシュメモリでは、一般に、消去単位は「ブロック」と呼ばれ、書込み単位は「ページ」と呼ばれる。具体的には、複数の物理セクタで一つの物理ページが構成され、複数の物理ページで一つの実ブロックが構成される。しかし、本実施形態で言う「ページ」は、上位レベルの容量仮想化機能が行う領域割当ての単位であることは明らかであり、何ら混同は生じない。
【００４７】
さて、以下、図４に示した各種情報を詳細に説明する。
【００４８】
図５は、論理ボリューム情報２０００を示す。
【００４９】
論理ボリュームは、ホスト１１０からアクセスされる論理的な記憶装置である。ホスト１１０から発行されるアクセス要求は、論理ボリュームのＩＤ（例えばＬＵＮ（Logical Unit Number））と、論理ボリューム内のアドレス（例えばＬＢＡ（Logical Block Address））と、書き込む又は読み出すデータの長さとを含む。論理ボリュームのＩＤからアクセス先の論理ボリュームが特定され、アドレスとデータの長さとから、その論理ボリュームにおけるアクセス先の一以上の仮想ページが特定される。
【００５０】
論理ボリューム情報２０００は、論理ボリュームごとに存在する情報である。以下、一つの論理ボリューム（図５の説明において「対象ボリューム」と言う）を例に採り、情報２０００を説明する。
【００５１】
情報２０００は、論理ボリュームＩＤ２００１、論理容量２００２、論理ＲＡＩＤタイプ２００３、実ページポインタ２００４及びフォーマット情報２００５を含む。
【００５２】
論理ボリュームＩＤ２００１は、対象ボリュームのＩＤである。
【００５３】
論理容量２００２は、ホスト１１０から見た対象ボリュームの容量を表す。
【００５４】
論理ＲＡＩＤタイプ２００３は、対象ボリュームに対応したＲＡＩＤ構成のタイプ（ＲＡＩＤタイプ（例えば、ＲＡＩＤ０、ＲＡＩＤ１））を表す情報である。なお、ＲＡＩＤタイプが、Ｎ台の記憶装置に対し所定台数分の冗長データが格納されるタイプ（例えば、ＲＡＩＤ５、ＲＡＩＤ６）である場合、Ｎの具体的数値が情報２００３に含まれる。ただし、任意のＲＡＩＤタイプが指定できるわけでなく、少なくとも一つのパッケージグループ２８０がもつＲＡＩＤタイプである必要がある。
【００５５】
実ページポインタ２００４は、対象ボリュームの仮想ページに割り当てた実ページ情報２１００へのポインタである。実ページポインタ２００４の数は、対象ボリュームが有する仮想ページの数（例えば、論理ボリューム容量２００２を仮想ページ容量２６００で割った数、もし余りがでれば＋１）である。最初の実ページポインタ２００４に対応する実ページが、対象ボリュームの先頭の仮想ページに割り当てられた実ページである。以降、次の実ページポインタ２００４には、次の仮想ページに割り当てられた実ページに対応するポインタが格納される。上位レベルの容量仮想化機能によれば、実ページが割り当てられるのは、対象ボリュームを定義された契機ではなく、仮想ページを指定したライト要求を受けた契機（仮想ページにライトが発生した契機）である。したがって、まだライトが発生していない仮想ページに対応した実ページポインタ２００４は、未割当てを意味する情報（例えばヌル値）になっている。
【００５６】
フォーマット情報２００５も、対象ボリュームの仮想ページ毎に存在する情報である。ホスト１１０は、アプリケーションプログラムのデータを格納する前に、特定の情報（例えば前述したパターンデータ）で記憶装置（例えば論理ボリューム）を初期化することが多い。パターンデータは、一般的なライト要求に付随することもあれば、明示的な要求（以下、ライトセイムコマンド）に付随することもある。パターンデータ（繰り返し情報）を、フォーマット情報２００５に含めることで、その情報２００５に対応した仮想ページにそのパターンデータが格納されていると認識することができる。このため、パターンデータが格納されている仮想ページに対する実ページの割当てを解除する（その実ページを解放する）ことができる。本実施形態では、ライトセイムコマンドをストレージコントローラ２００が受信した場合、下位レベルの容量仮想化機能（例えばパッケージコントローラ３１５）に、ライトセイムコマンドで指定された仮想ページに割り当てられている実ページに対応した仮想ブロックを通知する（具体的には、その仮想ブロックを指定した解放指示が送信される）。その解放指示で指定された仮想ブロックに対する実ブロックの割当てが、解除される（解放される）。これにより、消費記憶容量が節約される。なお、通常のライト要求に応答してパターンデータ（例えばオール０などのフォーマットデータ）が書き込まれる場合にも、ストレージコントローラ２００が、パターンデータを認識して、下位レベルの容量仮想化機能に、パターンデータのライト先の論ブロックに対する実ブロックを解放させても良い。また、フォーマット情報２００５を設定した場合、そのフォーマット情報２００５に対応した仮想ページに実ページを割り当てる必要はないので、その仮想ページに対応した実ページポインタ２００４は、未割当てを意味する情報（例えばヌル値）となる。フォーマット情報２００５に格納されたパターンデータ以外のデータがライト対象である場合には、ライト先の仮想ページに実ページが割り当てられるので、フォーマット情報２００５が、無効な情報（例えばヌル値）になる。
【００５７】
図６は、スケジュール情報２７００を示す。
【００５８】
本実施形態では、上位レベルの長寿命化制御は、所定のスケジュールに従って開始される。情報２７００は、前回スケジュール時刻２７０１と次回スケジュール時刻２７０２とを含む。
【００５９】
前回スケジュール時刻２７０１は、上位レベルの長寿命化制御が最近実行された時刻（過去）である。
【００６０】
次回スケジュール時刻２７０２は、上位レベルの長寿命化制御が次に実行される予定時刻（将来）である。
【００６１】
なお、上位レベルの長寿命化制御は、所定のスケジュールに代えて又は加えて、任意の時点に実行されても良い。例えば、ストレージコントローラ２００がユーザから上位レベルの長寿命化制御の実行を要求されたとき、及び、実ページに対するライト（実ブロックに対するライト）に失敗したときなどのうちの少なくとも一つのときに実行されて良い。
【００６２】
図７は、実ページ情報２１００を示す。
【００６３】
情報２１００は、実ページの管理情報であり、実ページごとに存在する。以下、一つの実ページ（図７の説明において「対象実ページ」）を例に採り、情報２１００を詳細に説明する。
【００６４】
情報２１００は、パッケージグループ２１０１、実ページアドレス２１０２、空きページポインタ２１０３、実ブロック割り当て数２１０４、追加実ブロック割り当て数２１０５、累積実ブロック割り当て時間２１０６、累積実ブロック消去回数２１０７、追加実ブロック割り当て時間２１０８、移動中フラグ２１０９、移動先実ページ情報２１１０、移動待ちフラグ２１１１及び累積ライトデータ量２１１２を含む。
【００６５】
パッケージグループ２１０１は、対象実ページがどのパッケージグループ２８０に基づく実ページであるかを示す情報であり、例えば、対象実ページの基になっているパッケージグループ２８０の識別子（パッケージグループＩＤ）である。
【００６６】
実ページアドレス２１０２は、対象実ページの基になっているパッケージグループ２８０のうちのどの相対的なアドレスに対象実ページが割り当てられているかを示す情報である。
【００６７】
空きページポインタ２１０３は、対象実ページが仮想ページに割り当てられていない場合に有効な値となる。この場合、その有効な値は、仮想ページに割り当てられていない別の物理ページに対応した空きページ情報２１００を指している。対象実ページに仮想ページが割り当てられている場合、空きページポインタ２１０３はヌル値となる。
【００６８】
実ブロック割り当て数２１０４、及び、追加実ブロック割り当て数２１０５は、対象実ページの基になっているパッケージグループ２８０が有するフラッシュパッケージ２３０の数だけ存在する。
【００６９】
本実施形態では、それぞれのフラッシュパッケージ２３０のパッケージコントローラ３１５は、下位レベルの容量仮想化機能を有する。そのため、ストレージコントローラ２００には、見かけ上、実際の物理容量より大きな仮想容量が提供されている。フラッシュパッケージ２３０の容量仮想化の単位は、前述の通り「ブロック」である。図８で説明した通り、実ページに複数の仮想ブロックが割り当てられ、各仮想ブロックに実ブロックが割り当てられる。したがって、実ページは複数の仮想ブロックから構成されていると言うことになる。また、本実施形態では、仮想ブロックにより構成される容量空間のほうが、実ブロックにより構成される容量空間より大きい。
【００７０】
すでに述べたように、本実施形態では、実ページには、仮想ページに対するデータには含まれてない冗長データが格納されることがある。一方、仮想ブロックに対するデータと実ブロックに格納されるデータは同じである。また、本実施形態では、フラッシュパッケージ２３０は、実ブロック数より多くの仮想ブロックをもっているように、ストレージコントローラ２００に見せていることになる。ただし、本実施形態では、ストレージコントローラ２００は、フラッシュパッケージ２３０が実際にいくつの実ブロックをもっているかを意識して、実ページの再配置を行う。
【００７１】
下位レベルの長寿命化制御（ウエアレベリング機能）と容量仮想化機能を、フラッシュパッケージ２３０が実施する形態の場合、ストレージコントローラ２００が、対象実ページにデータを書き込む際には、対象実ページに割り当てられている仮想ブロック内のアドレスを指定したライト指示を、その仮想ブロックを管理するフラッシュパッケージ２３０に送信する。フラッシュパッケージ２３０は、そのライト指示で指定されている仮想ブロックにまだ実ブロックが割り当てられていない場合、その仮想ブロックに実ブロックを割り当てる。新たに実ブロックが割り当てられた場合、パッケージコントローラ３１５は、新たに実ブロックが割り当てられたことを、ストレージコントローラ２００に通知する。これにより、ストレージコントローラ２００は、対象実ページに実ブロックが割り当てられたことを検知し、実ブロック割り当て数２１０４あるいは追加実ブロック数２１０５を更新する。
【００７２】
実ブロック割り当て数２１０４は、その情報２１０４に対応するフラッシュパッケージ２３０が有し、対象実ページに割り当てられている実ブロックのうちの、前回スケジュール時刻２７０１以前に対象実ページに割り当てられた実ブロックの数である。なお、「前回スケジュール時刻２７０１以前」とは、前回スケジュール時刻２７０１を含んでも含まなくても良い。
【００７３】
追加実ブロック数２１０５は、その情報２１０５に対応するフラッシュパッケージ２３０が有し、対象実ページに割り当てられている実ブロックのうちの、前回スケジュール時刻２７０１以降に対象実ページに割り当てられた実ブロックの数である。なお、「前回スケジュール時刻２７０１以降」とは、前回スケジュール時刻２７０１を含んでも含まなくても良い。例えば、「前回スケジュール時刻２７０１以前」が前回スケジュール時刻２７０１を含む場合、「前回スケジュール時刻２７０１以降」は前回スケジュール時刻２７０１を含まず、一方、「前回スケジュール時刻２７０１以前」が前回スケジュール時刻２７０１を含まない場合、「前回スケジュール時刻２７０１以降」は前回スケジュール時刻２７０１を含む。
【００７４】
累積実ブロック割り当て時間２１０６、累積実ブロック消去回数２１０７、及び、追加実ブロック割り当て時間２１０８、累積ライトデータ量２１１２も、それぞれ、対象実ページの基になっているパッケージグループ２８０が有するフラッシュパッケージ２３０の数だけ存在する。ただし、これらの情報は、対象実ページに含まれる仮想ブロックの属性情報ではなく、対象実ページの割当先の仮想ページに対するデータに関する属性情報である。したがって、その仮想ページに、対象実ページに代えて別の実ページが割り当てられ、対象実ページ内のデータがその別の実ページに移動された場合、累積実ブロック割り当て時間２１０６、累積実ブロック消去回数２１０７、及び、追加実ブロック割り当て時間２１０８、累積ライトデータ量２１１２も、その別の実ページの管理情報として引き継がれる。
【００７５】
累積実ブロック割り当て時間２１０６は、対象実ページに割り当てられているすべての仮想ブロックについての経過時間の合計である。ここで言う「経過時間」とは、対象実ページに割り当てられている仮想ブロックに実ブロックが割り当てられた契機から前回スケジュール時間２７０１までの、その仮想ブロックについての時間である。なお、その契機は、対象実ページについてではなく、過去に別の実ページについて起こった可能性もある。
【００７６】
累積実ブロック消去回数２１０７は、対象実ページに割り当てられているすべての仮想ブロックについての消去回数の合計である。ここで言う「消去回数」とは、対象実ページに割り当てられている仮想ブロックに実ブロックが割り当てられた契機からの、その実ブロックの消去回数である。
【００７７】
累積ライトデータ量２１１２は、累積実ブロック消去回数２１０７の代わりに（又は加えて）、実ページ情報２１００に含まれる情報である。累積ライトデータ量２１１２は、対象実ページの基になっているパッケージグループ２８０が有するフラッシュパッケージ２３０の数だけ存在し、対象実ページの割当先の仮想ページに対するデータに関する属性情報である。累積ライトデータ量２１１２は、対象実ページに割り当てられているすべての仮想ブロックについてのライトデータ量の合計である。ここで言う「ライトデータ量」とは、対象実ページに割り当てられている仮想ブロックに実ブロックが割り当てられた契機からの、仮想ブロックが割り当てられていた実ブロックのライト対象データの量（サイズ）である。累積ライトデータ量２１１２を基に、累積実ブロック消去回数２１０７に相当する値を算出することが可能である。詳細は後述する。
【００７８】
追加実ブロック割り当て時間２１０８は、前回スケジュール時間２７０１以降に仮想ブロックに割り当てられた実ブロックが割り当てられている時間長である。実ブロックが新たに一つ割り当てられると、追加実ブロック割り当て時間２１０８には、次回スケジュール時間２７０２と割り当てを行った時刻との差分に相当する時間長（差分時間）が加算される。この差分時間を加算する理由については、後で説明する。
【００７９】
移動中フラグ２１０９、移動先実ページ情報２１１０、及び、移動待ちフラグ２１１１は、対象実ページ内のデータを別の実ページに移動するときに使用される情報である。移動中フラグ２１０９は、対象実ページ内のデータを別の実ページに移動中のときにＯＮになるフラグである。移動先実ページ情報２１１０は、対象実ページ内のデータの移動先の実ページのアドレスを表す情報である。移動待ちフラグ２１１１は、対象実ページ内のデータを移動すると決定したときにＯＮになるフラグである。
【００８０】
図９は、空きページ管理情報ポインタ２２００によって管理される空きページの集合を表している。
【００８１】
空きページ管理情報ポインタ２２００は、パッケージグループ２８０ごとに設けられる情報である。
【００８２】
「空きページ」とは、仮想ページに割り当てられていない実ページ（未割当ての実ページ）である。また、空きページに対応した実ページ情報２１００を、「空きページ情報」と呼ぶ。空きページ管理情報ポインタ２２００は、先頭の空きページ情報のアドレスをさす。次に、先頭の実ページ情報２１００の中の空きページポインタ２１０３が、次の空きページ情報を指す。図９では、最後の空きページ情報の空きページポインタ２１０３は、空きページ管理情報ポインタ２２００を示しているが、ヌル値でもよい。ストレージコントローラ２００は、実ページが割り当てられていない仮想ページを指定したライト要求をホスト１１０から受け付けた場合、論理ＲＡＩＤタイプ２００３と同一のＲＡＩＤタイプを有するいずれかのパッケージグループ２８０（例えば、空きページ数の最も多いパッケージグループ２８０）から、空きページ管理情報ポインタ２２００を基に空きページを探し、見つかった空きページを仮想ページに割り当てる。
【００８３】
図１０は、パッケージグループ情報２３００を示す。
【００８４】
パッケージグループ情報２３００は、パッケージグループ２８０毎に存在する。以下、一つのパッケージグループ２８０（図１０の説明において「対象パッケージグループ２８０」と言う）を例に採り、パッケージグループ情報２３００を説明する。
【００８５】
パッケージグループ情報２３００は、パッケージグループＩＤ２３０１、パッケージグループＲＡＩＤタイプ２３０２、実ページ数２３０３、空きページ数２３０４及びフラッシュパッケージポインタ２３０５を含む。
【００８６】
パッケージグループＩＤ２３０１は、対象パッケージグループ２８０の識別子である。
【００８７】
パッケージグループＲＡＩＤタイプ２３０２は、対象パッケージグループ２８０のＲＡＩＤタイプである。本実施形態におけるＲＡＩＤタイプは、論理ＲＡＩＤタイプ２００３についての説明で述べたとおりである。
【００８８】
実ページ数２３０３は、対象パッケージグループ２８０が有する実ページの数を表し、空きページ数２３０４は、対象パッケージグループ２８０が有する空きページの数を表す。
【００８９】
フラッシュパッケージポインタ２３０５は、対象パッケージグループ２８０に属するフラッシュパッケージ２３０のフラッシュパッケージ情報２５００へのポインタである。フラッシュパッケージポインタ２３０５の数は、対象パッケージグループ２８０が有するフラッシュパッケージ２３０の数と同じであるが、これは、パッケージグループＲＡＩＤタイプ２３０２によって決まる値である。
【００９０】
図１１は、フラッシュパッケージ情報２５００を示す。
【００９１】
フラッシュパッケージ情報２５００は、フラッシュパッケージ２３０毎に存在する。以下、一つのフラッシュパッケージ（図１１の説明において「対象フラッシュパッケージ」と言う）を例に採り、情報２５００を説明する。
【００９２】
情報２５００は、フラッシュパッケージＩＤ２５０１、フラッシュパッケージ仮想容量２５０２、ブロック容量２５０３、パッケージ内割り当て可能実ブロック数２５０４、パッケージ内実ブロック割り当て数２５０５、パッケージ内追加実ブロック割り当て数２５０６、パッケージ内累積実ブロック割り当て時間２５０７、パッケージ内累積実ブロック消去回数２５０８、パッケージ内追加実ブロック割り当て時間２５０９、パッケージ内累積ライトデータ量２５１０、保証期間終了時刻２５１１及び限界消去回数２５１２を含む。
【００９３】
フラッシュパッケージＩＤ２５０１は、対象フラッシュパッケージ２３０の識別子である。
【００９４】
フラッシュパッケージ仮想容量２５０２は、対象フラッシュパッケージ２３０の仮想的な容量である。
【００９５】
ブロック容量２５０３は、仮想ブロック及び実ブロックに含まれるデータの容量である。仮想ブロックに対するデータと実ブロックに格納されるデータは同じである。従って、フラッシュパッケージ容量２５０２をブロック容量２５０３で割った値が、対象プラッシュパッケージ２３０が有する仮想ブロックの数となる。
【００９６】
割り当て可能実ブロック数２５０４は、対象フラッシュパッケージ２３０の中で割り当て可能な実ブロックの数である。フラッシュパッケージ２３０中で、例えばｘ個の実ブロックが障害状態（不良ブロック）になると、割り当て可能実ブロック数２５０４が示す値からｘが引かれる。下位レベルの長寿命化制御（ウエアレベリング機能）と容量仮想化機能を、フラッシュパッケージ２３０が実施する形態の場合、割り当て可能な実ブロックの数が減ると、パッケージコントローラ３１５から、ストレージコントローラ２００に、割り当て可能な実ブロックの数が減ったことが通知される。
【００９７】
パッケージ内実ブロック割り当て数２５０５は、対象パッケージグループ２８０に基づく全ての実ページについての実ブロック割り当て数２１０４の合計である。
【００９８】
パッケージ内追加実ブロック割り当て数２５０６は、対象パッケージグループ２８０に基づく全ての実ページについての追加実ブロック割り当て数２１０５の合計である。
【００９９】
パッケージ内累積実ブロック割り当て時間２５０７は、対象パッケージグループ２８０に基づく全ての実ページについての累積実ブロック割り当て時間２１０６の合計である。
【０１００】
パッケージ内累積実ブロック消去回数２５０８は、対象パッケージグループ２８０に基づく全ての実ページについての累積実ブロック消去回数２１０７の合計である。
【０１０１】
パッケージ内追加実ブロック割り当て時間２５０９は、対象パッケージグループ２８０に基づく全ての実ページについての追加実ブロック割り当て時間２１０８の合計である。
【０１０２】
パッケージ内累積ライトデータ量２５１０は、対象パッケージグループ２８０に基づく全ての実ページについての累積ライトデータ量２１１２の合計である。ただし、累積ライトデータ量２５１２は、累積実ブロック消去回数２１０７の代わりに存在する情報で、必ずしも存在する情報ではない。
【０１０３】
保証期間終了時刻２５１１は、対象フラッシュパッケージ２３０の保障期間が終了する時間（時刻）である。
【０１０４】
消去限界数２５１２は、対象フラッシュパッケージ２３０の実ブロックの限界消去回数を表す。フラッシュメモリには、いくつかの種類があり、それぞれ限界消去回数が異なる。例えば、一般に、ＳＬＣ（Single Level Cell）は約１０万回、ＭＬＣ（Multi Level Cell）は５千〜１万回と言われている。
【０１０５】
次に、フラッシュパッケージ２３０のパッケージメモリ３２０に記憶される、フラッシュパッケージ２３０の管理情報を説明する。
【０１０６】
図１２は、パッケージメモリ３２０に記憶される管理情報を示す。
【０１０７】
その管理情報は、パッケージ情報３０００、チップ情報３１００、仮想ブロック情報３２００、実ブロック情報３３００及び空きブロック情報ポインタ３４００を含む。この管理情報は、下位レベルのウエアレベリング制御及び容量仮想化機能に利用される情報である。本実施形態では、フラッシュパッケージ２３０が、下位レベルの長寿命化制御（ウエアレベリング機能）を行い、且つ、下位レベルの容量仮想化機能を有する。下位レベルの長寿命化制御（ウエアレベリング機能）及び容量仮想化機能は、ストレージコントローラ２００で実現されてもよい。この場合、例えば、図１３に示すように、図１２に示した管理情報とほぼ同様の管理情報が、共有メモリ２２０に格納される。図１３に示した管理情報は、ストレージコントローラ２００が参照及び更新するので、図１２に示した管理情報とは若干違っていて良い。
【０１０８】
本実施形態では、前述した通り、フラッシュパッケージ２３０が、下位レベルの長寿命化制御（ウエアレベリング制御）及び容量仮想化機能を実現し、図１２に示した管理情報を保持する。以下その管理情報に含まれる情報３０００、３１００、３２００、３３００及び３４００を詳細に説明する。
【０１０９】
図１４は、パッケージ情報３０００を示す。
【０１１０】
以下、一つのフラッシュパッケージ２３０（図１４の説明において「対象フラッシュパッケージ」と言う）を例に採り、パッケージ情報３０００を説明する。
【０１１１】
パッケージ情報３０００は、パッケージＩＤ３００１、仮想パッケージ容量３００２、実パッケージ容量３００３、フラッシュブロック容量３００４、パッケージブロック容量３００５、パッケージ割り当て可能ブロック数３００６、パッケージ空きブロック数３００７、障害ブロック数３００８、内部情報格納ブロック数３００９及び内部情報格納アドレス３０１０を含む。
【０１１２】
パッケージＩＤ３００１は、対象フラッシュパッケージ２３０の識別子である。
【０１１３】
仮想パッケージ容量３００２は、ストレージコントローラ２００から見た対象フラッシュパッケージ２３０の仮想的な記憶容量を示す。
【０１１４】
実パッケージ容量３００３は、対象パッケージグループ２８０内に、ストレージコントローラ２００が実際にデータを格納できる記憶容量を示す。
【０１１５】
フラッシュブロック容量３００４は、フラッシュメモリの消去単位であるブロックの物理的な容量である。一方、パッケージブロック容量３００５は、すでに述べた仮想ブロック及び実ブロックに格納されるデータの容量である。二つの容量３００４及び３００５に違いがあるのは、主に、高性能化やブロックの長寿命化のためである。以下、この理由について説明する。仮に、二つの容量３００４及び３００５を同じにしたとする。その場合、フラッシュメモリの実ブロックのすべてに、データが格納されることになる。このとき、実ブロック内の一部のデータを書き換える指示（普通のライト指示）を、ストレージコントローラ２００からパッケージコントローラ３１５が受け取ったとする。フラッシュメモリの実ブロックは書き換えができないので、パッケージコントローラ３１５は、その実ブロックの全データをバッファ３３０に読み出し、書き換え部分だけ更新して、当該実ブロックを一度消去した後、更新後の全データを当該実ブロックに格納しなければならない。フラッシュパッケージ２３０がライト指示を受け取るたびに、このような処理を実行すると、処理時間が長くなる。これを解決するため、本実施形態では、パッケージブロック容量３００５の値は、フラッシュブロック容量３００４より小さい値にされる。これにより、実ブロックには、空き領域が存在することになり、書き換えデータが空き領域に入れば、空き領域に追加書き込みが行われる。なお、この追加書き込みを行った場合、対応する仮想ブロック内のどのアドレス（相対アドレスでよい）のデータを書き込んだかが管理される。空き領域が小さくなって書き換えデータが入らなくなった場合、消去処理が行われる。これにより、消去処理は、ｎ回（ｎは１以上の整数）のライト指示について一回実行されればよいので、性能を向上させることができる。また、消去処理の回数の削減は、フラッシュメモリの長寿命化にもつながる。
【０１１６】
パッケージ割り当て可能ブロック数３００６は、対象フラッシュパッケージ２３０が有する複数の実ブロックのうちの、ストレージコントローラ２００から受け取ったデータを格納可能な実ブロックの数を示す。
【０１１７】
パッケージ空きブロック数３００７は、ストレージコントローラ３００からのデータを格納可能な実ブロックのうちの、仮想ブロックに割り当てられていない実ブロック（空きブロック）の数を示す。
【０１１８】
障害ブロック数３００８は、障害状態になってデータを格納できなくなってしまった実ブロック（不良ブロック）の数を示す。
【０１１９】
内部情報格納ブロック数３００９は、パッケージメモリ３２０に格納されているパッケージ情報３０００、チップ情報３１００、仮想ブロック情報３２００、実ブロック情報３３００及び空きブロックポインタ３４００の退避先（例えば停電や障害発生時での退避先）となる実ブロックの数を示す。内部情報格納アドレス３０１０は、退避先の実ブロックのアドレスを示す。パッケージ情報３０００、チップ情報３１００、仮想ブロック情報３２００、実ブロック情報３３００及び空きブロックポインタ３４００は、重要な情報なので、退避する情報は、ｎ重化（ｎは２以上の整数）されてもよい。また、退避される回数はそう多くないと考えられるので、実ブロックの消去回数なども問題にならないと考えられる。パッケージ割り当て可能ブロック数３００６、障害ブロック数３００８及び内部情報格納ブロック数３００９の合計が、対象フラッシュパッケージ２３０が有する実ブロックの数である。
【０１２０】
図１５は、チップ情報３１００を示す。
【０１２１】
チップ情報３１００は、フラッシュチップ３００毎に存在する情報である。以下、一つのフラッシュチップ（図１５の説明で「対象チップ」と言う）を例に採り、チップ情報３１００を説明する。
【０１２２】
チップ情報３１００は、チップＩＤ３１０１、チップ内実ブロック数３１０２、チップ内空きブロック数３１０３及び接続バスＩＤ３１０４を含む。
【０１２３】
チップＩＤ３１０１は、対象チップ３００の識別子である。
【０１２４】
チップ内実ブロック数３１０２は、対象チップ３００が有する実ブロックの数を示す。
【０１２５】
チップ内空きブロック数３１０３は、対象チップ３００が有する空きブロックの数を示す。
【０１２６】
接続バスＩＤ３１０４は、対象チップ３００が接続されているパッケージバス３４０の識別子である。
【０１２７】
図１６は、仮想ブロック情報３２００を示す。
【０１２８】
仮想ブロック情報３２００は、仮想ブロック毎に存在する情報である。以下、一つの仮想ブロック（図１６の説明で「対象仮想ブロック」と言う）を例に採り、仮想ブロック情報３２００を説明する。なお、仮想ブロック情報３２００は、仮想ブロックのアドレス順に並んでいるとする。最初の仮想ブロック情報３２００が、先頭の仮想ブロックに対応する。
【０１２９】
仮想ブロック情報３２００は、仮想ブロックＩＤ３２０１、仮想ブロック情報ポインタ３２０２、仮想ブロック割り当て時刻３２０３及び仮想ブロック消去回数３２０４を含む。
【０１３０】
仮想ブロックＩＤ３２０１は、対象仮想ブロックの識別子である。
【０１３１】
実ブロック情報ポインタ３２０２は、対象仮想ブロックに割り当てられた実ブロックの実ブロック情報３３００へのポインタである。
【０１３２】
仮想ブロック割り当て時刻３２０３は、実ブロックが割り当てられていない対象仮想ブロック内のアドレスを指定したライト指示をストレージコントローラ２００から受け付けた時刻である。
【０１３３】
仮想ブロック消去回数３２０４は、仮想ブロック割り当て時刻３２０３以降に対象仮想ブロックに割り当てられていた実ブロックの消去回数である。仮想ブロック割り当て時刻３２０３及び仮想ブロック消去回数３２０４は、階層型の長寿命化制御、及び、階層型の容量仮想化を実行するため、対象仮想ブロックを含む実ページ内のデータが別の実ページに移動されるときに、移動先の実ページに対して引き継がれる。この引継ぎ処理は、ストレージコントローラ２００が、移動元の実ページに割り当てられているそれぞれの仮想ブロックについての仮想ブロック割り当て時刻３２０３及び仮想ブロック消去回数３２０４を読み出し、移動先の実ページに割り当てられているそれぞれの仮想ブロックの仮想ブロック割り当て時刻３２０３及び仮想ブロック消去回数３２０４に引き継ぐ。
【０１３４】
図１７は、実ブロック情報３３００を示す。
【０１３５】
実ブロック情報３３００は、実ブロック毎に存在する情報である。以下、一つの実ブロック（図１７の説明で「対象実ブロック」と言う）を例に採り、情報３３００を説明する。
【０１３６】
実ブロック情報３３００は、実ブロックＩＤ３３０１、空きブロックポインタ３３０２、実ブロック障害フラグ３３０３、実ブロック内空き容量３３０４、追加書き込みデータアドレス情報３３０５及び実ブロック消去回数３３０６を含む。
【０１３７】
実ブロックＩＤ３３０１は、対象実ブロックの識別子である。このＩＤ３３０１が、どのフラッシュチップ３００のどのアドレスに相当する実ブロックかを示している。
【０１３８】
空きブロックポインタ３３０２は、対象実ブロックが空きブロック場合（いずれの仮想ブロックにも割り当てられていない場合）、次の空きブロックの実ブロック情報３３００を指している。
【０１３９】
実ブロック障害フラグ３３０３は、対象実ブロックが障害状態になり、データを格納できなくなったとき、ＯＮとされる。
【０１４０】
実ブロック内空き容量３３０４は、対象実ブロックの現在の空き容量を示している。この値は、当初は、例えば、（フラッシュブロック容量３００４−パッケージブロック容量３００５）である。パッケージプロセッサ３１０は、対象実ブロックに対し、この空き容量以下のデータを書くことのライト指示を、ストレージコントローラ２００から受け、この空き領域に、ライト指示の対象のデータを書き込む。書き込んだ後、書き込まれたデータ量だけ、実ブロック内空き容量３３０４の値が小さくされる。
【０１４１】
追加書き込みデータアドレス情報３３０５は、当初の空き領域（（（フラッシュブロック容量３００４−パッケージブロック３００５））の容量の領域）に追加書き込みを行ったすべてのデータの仮想ブロック内の相対アドレスとデータ長の集合値である。
【０１４２】
実ブロック消去回数３３０６は、対象実ブロックの現在までの消去回数を示している。
【０１４３】
図１８は、空きブロック情報ポインタ３４００によって管理される空きブロックの集合を表している。
【０１４４】
空きブロック管理情報ポインタ３４００は、先頭の空きブロックの実ブロック情報３３００のアドレスをさす。次に、先頭の空きブロックの実ブロック情報３３００の中の空きブロックポインタ３３０２が、次の空きブロックの実ブロック情報３３００を示す。図１８では、最後の空きブロックの実ブロック情報３３００の空きブロックポインタ２１０３は、空きブロック情報ポインタ３４００を示しているが、ヌル値でもよい。パッケージプロセッサ３１０は、実ブロックが割り当てられていない仮想ブロック内のアドレスを指定したライト指示を受け付けると、いずれかのフラッシュチップ３００（例えば、空きブロックの数の最も多いチップ）から、そのチップに対応する空きブロック情報ポインタ３４００を基に空きブロックを探し、見つかった空きブロック（実ブロック）を仮想ブロックに割り当てる。
【０１４５】
次に、ストレージコントローラ２００及びパッケージコントローラ３１５が行う処理を説明する。
【０１４６】
まず、ストレージコントローラ２００が行う処理を説明する。ストレージコントローラ２００が行う処理は、プロセッサ２６０がメモリ２７０内に格納されているプログラムを実行することにより実現される。以下、メモリ２７０内のプログラムを主語として説明する処理は、実際にはプロセッサ２６０が行う処理である。
【０１４７】
図１９は、メモリ２７０に格納されているプログラムを示す。
【０１４８】
プログラムとして、例えば、リード処理実行部４０００、ライト要求受付部４１００、ライトアフタ処理実行部４２００、ライトセイムコマンド処理実行部４３００、ページ移動スケジュール部４４００及びページ移動処理実行部４５００がある。これらのプログラムが、上位レベルの長寿命化制御及び容量仮想化機能を含む。なお、すでに述べたが、本実施形態は、下位レベルの長寿命化制御及び容量仮想化機能を実現するのは、パッケージコントローラ３１５であるが、下位レベルの長寿命化制御及び容量仮想化機能はストレージコントローラ２００によって実現されてもよい。この場合、上位レベルのプログラムと下位レベルのプログラム双方が、ストレージコントローラ２００で実行されるので、プログラム間のインターフェイスが異なってくるが、上位レベルのプログラムが実行する内容は基本的に大きな相違はない。したがって、本実施形態では、下位レベルの長寿命化制御及び容量仮想化機能を実現するのはパッケージコントローラ３１５であることを前提に、リード処理実行部４０００、ライト要求受付部４１００、ライトアフタ処理実行部４２００、ライトセイムコマンド処理実行部４３００、ページ移動スケジュール部４４００、ページ移動処理実行部４５００がそれぞれ行う処理のフローを詳細に説明する。
【０１４９】
図２０は、リード処理実行部４０００の処理フローを示す。
【０１５０】
リード処理実行部４０００は、ストレージコントローラ２００がホスト１１０からリード要求を受け付けたときに実行される。図２０の説明において、リード要求の対象のデータを「リード対象データ」と言い、リード要求から特定される論理ボリューム、仮想ページ、及びその仮想ページにおける領域を、「リード元論理ボリューム」、「リード元仮想ページ」、及び「リード元領域」と言う。
【０１５１】
ステップ５０００：実行部４０００は、受け取ったリード要求で指定されたリード対象とするアドレスから、リード元仮想ページとリード元領域の相対アドレスとを計算する。
【０１５２】
ステップ５００１：実行部４０００は、リード対象データが、キャッシュメモリ２１０に存在するか否か（キャッシュヒットしたか否か）を判断する。キャッシュヒットならば、ステップ５０１０が行われ、キャッシュミスならば、ステップ５０００２が行われる。
【０１５３】
ステップ５００２：キャッシュミスの場合、まず、実行部４０００は、リード元仮想ページに対応するフォーマット情報２００５が有効な値か否かを判断する。有効でなければ、ステップ５００４へジャンプする。
【０１５４】
ステップ５００３：フォーマット情報２００５が有効な場合、実行部４０００は、リード元領域には、このパターンデータ（繰り返し情報）が格納されていることになる。このため、実行部４０００は、キャッシュメモリ２１０に、その情報２００５が有するパターンデータを格納し、ステップ５０１０へジャンプする。
【０１５５】
ステップ５００４:ここでは、リード対象データをキャッシュメモリ２１０にロードする必要がある。ます、実行部４０００は、リード元仮想ページに割り当てられている実ページ（以下、図２０の説明において「リード元実ページ」と言う）に対応する実ページ情報２１００を、リード元論理ボリュームに対応した情報２０００内の実ページポインタ２００４から獲得する。
【０１５６】
ステップ５００５:実行部４０００は、獲得した実ページ管理情報２１００内のパッケージグループ２１０１及び実ページアドレス２１０２から、リード元実ページが属するパッケージグループ２８０とリード元実ページのパッケージグループ２８０内での先頭アドレスとを得る。
【０１５７】
ステップ５００６:実行部４０００は、リード元仮想ページ内の相対アドレスとパッケージグループＲＡＩＤタイプ２３０２とから、リード元実ページ内の相対アドレスを計算する。実行部４０００は、計算した実ページ内相対アドレスと、リード元実ページに対応するパッケージグループＲＡＩＤタイプ２３０２及びフラッシュパッケージポインタ２３０５とを基に、どのフラッシュパッケージ２３０のどのアドレスにアクセスするかを特定する。
【０１５８】
ステップ５００７:実行部４０００は、ステップ５００６で特定されたフラッシュパッケージ２３０に対し、そのステップ５００６で特定されたアドレスを指定したリード指示を送信する。
【０１５９】
ステップ５００８：実行部４０００は、リード指示の送信先のフラッシュパッケージ２３０から、リード指示の対象のデータが送られてくるのを待つ。
【０１６０】
ステップ５００９：実行部４０００は、フラッシュパッケージ２３０から送られてきたデータをキャシュメモリ１５０に格納する。
【０１６１】
ステップ５０１０：実行部４０００は、キャッシュメモリ２１０に格納されているリード対象データをホスト１１０へ送る。
【０１６２】
図２１は、ライト要求受付部４１００の処理フローを示す。
【０１６３】
ライト要求受付部４１００は、ストレージコントローラ２００が、ホスト１１０からライト要求を受け付けたときに実行される。図２１の説明において、ライト要求に付随するデータを「ライト対象データ」と言い、ライト要求から特定される論理ボリューム、仮想ページ、及びその仮想ページにおける領域を、「ライト先論理ボリューム」、「ライト先仮想ページ」、及び「ライト先領域」と言う。
【０１６４】
ステップ６０００：受付部４１００は、受け取ったライト要求がライト対象とするアドレスから、対応するライト先仮想ページとライト先領域の相対アドレスとを計算する。
【０１６５】
ステップ６００１：受付部４１００は、ステップ６０００で得たライト先仮想ページに実ページが割り当てられているか否かを、ライト先仮想ページに対応した実ページポインタ（ライト先論理ボリュームに対応した情報２０００内のポインタ）２００４を参照して、判断する。割り当てられていない場合、ステップ６００２が行われ、割り当てられている場合、ステップ６００３へジャンプする。
【０１６６】
ステップ６００２：受付部４１００は、ライト先仮想ページに空きページを割り当てる。具体的には、例えば、受付部４１００は、以下の（ａ）〜（ｅ）：
（ａ）ライト先論理ボリュームに対応した情報２０００内のＲＡＩＤタイプ２００２と、パッケージグループ情報２３００内のパッケージグループＲＡＩＤタイプ２３０３及び空きページ数２３０４等を参照して、どのパッケージグループ２８０の基になっている実ページをライト先仮想ページに割り当てるかを決める；
（ｂ）決めたパッケージグループ２８０に対応する空きページ管理情報ポインタ２４００を参照して、ライト先仮想ページに対応した実ページポインタ２００４を、先頭の空きページ情報２１００を示すよう更新する（これで、ライト先仮想ページに空きページが割り当てられたことになる）；
（ｃ）空きページ管理情報ポインタ２４００を、次の実ページ情報２１００（仮想ページに割り当てられた実ページの実ページ情報２１００の中の空きページポインタ２１０３が示す実ページ情報２１００）を示すよう更新する；
（ｄ）ライト先仮想ページに割り当てた実ページの実ページ情報２１００の中の空きページポインタ２１０３をヌル値にする；
（ｅ）割り当てた実ページに対応するパッケージグループ情報２３００の空きページ数２３０４が示す値を減らす、
を行う。仮想ページに空きページを割り当てる処理を、本実施形態では、ライト要求を受け付けたときに実行するが、この割り当て処理は、フラッシュパッケージ２３０へデータを格納するまでに実行されればよい。この後、ステップ６００５へジャンプする。
【０１６７】
ステップ６００３：受付部４１００は、ライト先仮想ページに対応したフォーマット情報２００５が有効な値であるかを判断する。有効でなければ、ステップ６００５へジャンプする。
【０１６８】
ステップ６００４：当該ライト要求の実行により、ライト先仮想ページに対応したフォーマット情報２００５は無効な値となる。このため、当該ライト要求で、ライト先仮想ページにおけるライト先領域以外の領域には、ライト先仮想ページに対応したこれまでのフォーマット情報２００５で、書き込む必要がある。したがって、ここでは、受付部４１００は、キャッシュメモリ２１０に、ライト先仮想ページに対応したフォーマット情報２００５が有するパターンデータを格納する（当該ライト要求で、ライト対象データは、次のステップ６００５で受け取る）。また、受付部４１００は、そのパターンデータには、どのフラッシュパッケージ２３０のどのアドレスに書き込むべきかを示す情報をつけておく。これらの情報を獲得するために、ここでも、受付部４１００は、図２０のステップ５００４及び５００５の処理を実行することになる。この後、ライト先仮想ページに対応したフォーマット情報２００５が無効な値にされる。
【０１６９】
ステップ６００５：受付部４１００は、ホスト１１０からのライト対象データをキャッシュメモリ２１０に格納する。ステップ６００４でパターンデータがキャッシュメモリ２１０に格納された場合、ライト先領域の繰り返しパターンが、このとき受け取ったライト対象データに置き換えられる。このときも、このライト対象データには、どのフラッシュパッケージ２３０のどのアドレスに書き込むべきかを示す情報をつけておく。これらの情報を獲得するために、ここでも、図２０のステップ５００４及び５００５の処理を実行することになる。
【０１７０】
パッケージグループ２８０は、ＲＡＩＤ構成を有する。このため、キャッシュメモリ２１０上に格納したライト対象データに冗長データを生成しなければならない場合がある。また、実ページは、冗長データを格納する領域を有するので、ライト対象データに対応する冗長データの実ページ内のライト先アドレスも一意に定まる。冗長データも、一度、キャッシュメモリ２１０に格納される。なお、キャッシュメモリ２１０上の冗長データも、ライト対象データと同様に、どのフラッシュパッケージ２３０のどのアドレスに書き込むべきかを示す情報をつけておく。ライト対象データ及び冗長データは、ライトアフタ処理実行部５２００によって、フラッシュパッケージ２３０に書き込まれる。これらのデータは、ライトアフタ処理実行部５２００から見ると、いずれもフラッシュパッケージ２３０へ書き込むデータなので、両者（つまりライト対象データであるか冗長データであるか）を区別する必要はない。同様に、フラッシュパッケージ２３０も、両者を区別する必要はない。
【０１７１】
図２２は、ライトアフタ処理実行部４２００の処理フローを示す。
【０１７２】
ライトアフタ処理実行部４２００は、適宜に（例えば定期的に）実行される。実行部４２００は、キャッシュメモリ２１０内のライト対象データ及び冗長データをフラッシュパッケージ２３０に書き込むライトアフタ処理を行う。ただし、実行部４２００は、ライト対象データ及び冗長データの両者を、フラッシュパッケージ２３０に書き込むべきデータ（図２２の説明において「デステージ対象データ」と言う）として、両者を区別せずに処理する。
【０１７３】
ステップ７０００：実行部４２００は、キャッシュメモリ２１０をサーチして、デステージ対象データを決める。
【０１７４】
ステップ７００１：実行部４２００は、見つけたデステージ対象データに付与されているアドレス情報を取得し、アドレス情報を基に特定されるフラッシュパッケージ２３０に、アドレス情報を基に特定されるライト先アドレスを指定したライト指示とデステージ対象データとを送信する。なお、ライト先実ページ（ライト先アドレスを有する仮想ブロックが割り当てられている実ページ）に対応する移動中フラグ２１０９がＯＮの場合、ライト先実ページ内のデータは移動中である。この場合、実行部４２００は、ステップ７０００で決定されたデステージ対象データのライトを中止し、別のデステージ対象データを探す。また、実行部４２００は、フラッシュパッケージ２３０に送信するライト指示に、タイマ２４０から取得される現在時刻（ストレージシステム１００内一意に定まるカウンタのようなものでもよい）を付与する。ライト指示に付与された時刻は、後述する平均消去回数の算出に使用される（具体的には、累積実ページ割り当て時間２１０６、パッケージ内累積実ページ割り当て時間２５０７の更新に使用される）。
【０１７５】
ステップ７００２： 実行部４２００は、フラッシュパッケージ２３０からライト完了報告（ライト指示に対する完了報告）を受けるのを待つ。
【０１７６】
ステップ７００３：実行部４２００は、以下の（ａ）〜（ｃ）：
（ａ）フラッシュパッケージ２３０からのライト完了報告を基に、ライト指示で指定したアドレスを有する仮想ブロック（ライト先の仮想ブロック）に実ブロックが割り当てられたかを判断する；
（ｂ）実ブロックが割り当てられたのであれば（（ａ）の判断結果が肯定的であれば）、割り当てられた実ブロックの数（図２２の説明において「今回割当て数」という）を、ライト先実ページに対応した追加実ブロック割り当て数２１０５と、ライト先パッケージ（ライト先実ページの基になっているフラッシュパッケージ）２３０に対応したパッケージ内追加実ブロック割り当て数２５０６とに加算する；
（ｃ）今回割当て数に、（次回スケジュール時刻２７０１−現在時刻（現在のタイマ２４０の値））を乗算し、この乗算値を、ライト先実ページに対応した追加実ブロック割り当て時間２１０８と、ライト先パッケージ２３０に対応したパッケージ内追加実ブロック割り当て時間２５０９とに加算する、
を実行する。（ｃ）では、例えば、今回割当て数が３で、（次回スケジュール時刻２７０１−現在時刻）が４０分であれば、１２０分が乗算値となり、１２０分が、ライト先実ページに対応した時間２１０８とライト先パッケージ２３０に対応した時間２５０９とにそれぞれ加算されることになる。
【０１７７】
ステップ７００４: 実行部４２００は、以下の（ａ）及び（ｂ）：
（ａ）フラッシュパッケージ２３０からのライト完了報告を基に、実ブロックに対する消去処理が発生したかを判断する；
（ｂ）消去処理が発生したのであれば（（ａ）の判断結果が肯定的であれば）、発生した消去回数（例えば、２個の実ブロックに１回の消去処理が発生したのであれば、消去回数は２である）を、ライト先実ページに対応する累積実ブロック消去回数２１０７と、ライト先パッケージに対応するパッケージ内累積実ブロック消去回数２５０８とに加える（累積ライトデータ量２１１２及びパッケージ内累積ライトデータ量２５１０がある場合、本ライトアフタ処理で書き込んだデステージ対象データの量を、それらの情報２１１２及び２５１０にそれぞれ加える）、
を実行する。
【０１７８】
ステップ７００５：実行部４２００は、以下の（ａ）及び（ｂ）：
（ａ）フラッシュパッケージ２３０からのライト完了報告を基に、ブロック消去回数が一定値以上になった（障害状態になった）実ブロックがあるか否かを判断する；
（ｂ）障害状態になった実ブロックがあれば（（ａ）の判断結果が肯定的であれば）、障害状態になった実ブロックの数を、ライト先パッケージに対応する割り当て可能実ブロック数２５０４から減算する、
を実行する。
【０１７９】
図２３は、ライトセイムコマンド処理実行部４３００の処理フローを示す。
【０１８０】
ライトセイムコマンド処理実行部４３００は、ライトセイムコマンドを、ストレージコントローラ２００が、ホスト１１０から受け取ったときに実行される。ライトセイムコマンドは、パターンデータ（例えば短いパターンデータ）を或る記憶領域に繰り返し書き込むことの要求である。ストレージコントローラ２００は、このパターンデータを、ライトセイムコマンドで指定されている記憶領域（仮想ページ内の記憶領域）に書き込むのではなく、指定された記憶領域に対応する仮想ページにパターンデータが格納されているということを記憶して、その仮想ページに割り当てられている実ページを解放する（実ページの割当てを解除する）。これにより、消費記憶容量が節約される。なお、解放された実ページに対応する仮想ブロックに割り当てられている実ブロック（図２３の説明において「解放実ブロック」という）を他の仮想ブロックに割り当てるためには、解放実ブロックに対する消去処理が必要である。本実施形態では、ストレージコントローラ２００は、ライトセイムコマンドを受け取った場合、フラッシュパッケージ２３０に、解放実ブロックの消去処理を指示する。ライトセイムコマンドは、ストレージコントローラ２００からパッケージコントローラ３１５に送信され、パッケージコントローラ３１５が、その要求に応答して、実ブロックの解放及び消去処理を行ってもよい。なお、通常のライト要求に応答してオール０などのパターンデータ（例えばフォーマットデータ）が書き込まれる場合にも、ストレージコントローラ２００、あるいは、パッケージコントローラ３１５が、パターンデータを認識して、解放実ブロックを解放させてもよい。
【０１８１】
ステップ８０００：実行部４３００は、受けたライトセイムコマンドで指定されている記憶領域（以下、ライト指定領域）に係る仮想ページの集合を特定する。ライト指定領域は、例えば、仮想ページの一部領域（以下、仮想一部領域）、一以上の仮想ページ全域、あるいは、それらの組合せに相当する。
【０１８２】
ステップ８００１：本実施形態では、仮想ページ全体が指定されていれば対応する実ページが解放の対象となる。また、仮想ブロック全体が指定されていれば、フラッシュパッケージ１６０の中の実ブロックを解放できる可能性がある。ＲＡＩＤ０やＲＡＩＤ１の場合には、仮想ブロック全体が指定されていれば、対応する実ブロックを解放することができる。しかし、仮想ブロック全体が指定されていても、ＲＡＩＤ５のように、Ｎ個のデータから１つの冗長データを生成する場合、単純に対応する実ブロックを解放することはできない。本実施形態では、ＲＡＩＤ５を構成するＮ個の仮想ブロック全体が指定された場合、対応するＮ個の実ブロッックとその冗長データを格納した１個の実ブロックを解放するようにする。仮想ブロックの一部の領域や、ＲＡＩＤ５を構成するＮ個の仮想ブロックの一部の領域が、指定された場合、指定された記憶領域には、指定された情報パターンを書き込む必要がある。当該ステップでは、実行部４３００は、フラッシュパッケージ２３０に情報パターンを書き込む必要がある領域と実ブロックの解放が可能なフラッシュパッケージ２３０内の領域を分類する。情報パターンを、フラッシュパッケージ２３０へ書き込む必要がない場合、ステップ８００３へジャンプする。
【０１８３】
ステップ８００２：実行部４３００は、フラッシュパッケージ２３０に書き込むパターンデータを、キャッシュメモリ２１０に格納する。その際、どのフラッシュパッケージ２３０のどの領域に書き込むのかというアドレス情報がそのパターンデータに付与される。この後、そのパターンデータは、ライト要求に付随するライト対象データと同じように、フラッシュパッケージ２３０へ書き込まれる。
【０１８４】
ステップ８００３：実行部４３００は、解放できる実ブロック及び実ページがあるかを判断する。いずれもない場合、本処理フローが終了する。
【０１８５】
ステップ８００４：実行部４３００は、ステップ８００１で判別したフラッシュパッケージ２３０の記憶領域を指定した解放指示を、そのフラッシュパッケージ２３０に送信する。その解放指示は、パッケージグループ２８０を構成する一以上のフラッシュパッケージ２３０に送信される可能性がある。
【０１８６】
ステップ８００５：実行部４３００は、解放指示の送信先のすべてのフラッシュパッケージ２３０から処理報告を待つ。
【０１８７】
ステップ８００６:各フラッシュパッケージ２３０内のパッケージコントローラ３１５は、その解放指示の応答として、各仮想ブロックについて、実際に解放した仮想ブロックの個数（＝実ブロックの個数）と、各仮想ブロックごとに、実ブロックを割り当てた時刻と仮想ブロックの消去回数を、ストレージコントローラ２００に報告する。本ステップでは、実行部４３００は、仮想ブロックごとの実ブロック割り当て時刻を判断して、前回スケジュール時刻２７０１以前の値をもつ仮想ブロックと、前回スケジュール時刻２７０１以降の値をもつ仮想ブロックとに分類する。以下のステップ８００７及び８００８では、実ページ情報２１００及びフラッシュパッケージ情報２５００がもっている情報から、解放した実ブロックに関する属性（例えば、割当て時間）が削減される。
【０１８８】
ステップ８００７：本ステップの処理は、前回スケジュール時刻２７０１以前の値をもつ仮想ブロックの集合に対する処理である。実行部４３００は、以下の（ａ）〜（ｆ）：
（ａ）それぞれの実ブロック割り当て時刻ごとに、（実ブロック割り当て時刻−前回スケジュール時刻２７０１）を計算し、この値を、対応する実ページ及びフラッシュパッケージ２３０ごとに加算する（実ブロック割当て時刻は、例えば、ストレージコントローラ２００のライト指示に付与されていた時刻である）；
（ｂ）それぞれの加算された値を、対応するすべての実ページ情報２１００内の累積実ページ割り当て時間２１０６と、対応するすべてのフラッシュパッケージ管理情報２５００内のパッケージ内累積実ページ割り当て時間２５０７から減算する；
（ｃ）それぞれの仮想ブロックの消去回数を、対応する実ページ及びフラッシュパッケージ２３０ごとに加算する；
（ｄ）それぞれの加算された値を、対応するすべての実ページ情報２１００内の累積実ページ消去回数２１０７と、対応するすべてのフラッシュパッケージ管理情報２５００内のパッケージ内累積実ページ消去回数２５０８から減算する；
（ｅ）実ブロック割り当て時刻をもつ仮想ブロックが、実ページ及びフラッシュパッケージ２３０ごとにいくつあるかをそれぞれカウントする；
（ｆ）それぞれのカウント値を、対応するすべての実ページ情報２１００内の累積実ページ割り当て数２１０４と、対応するすべてのフラッシュパッケージ管理情報２５００内のパッケージ内実ページ割り当て数２５０５から削減する、
を実行する。
【０１８９】
ステップ８００８：本ステップの処理は、前回スケジュール時刻２７０１以降の値をもつ仮想ブロックの集合に対する処理である。実行部４３００は、以下の（ａ）〜（ｆ）：
（ａ）それぞれの実ブロック割り当て時刻ごとに、（次回スケジュール時刻２７０１−実ブロック割り当て時刻）を計算し、この値を、対応する実ページ及びフラッシュパッケージ２３０ごとに加算する；
（ｂ）それぞれの加算した値を、対応するすべての実ページ情報２１００内の追加実ページ割り当て時間２１０８と、対応するすべてのフラッシュパッケージ管理情報２５００内のパッケージ内追加実ページ時間２５０９とから減算する；
（ｃ）それぞれの仮想ブロックの消去回数を、対応する実ページ及びフラッシュパッケージ２３０ごとに加算する；
（ｄ）それぞれの加算された値を、対応するすべての実ページ情報２１００内の追加実ページ消去回数２１０９と、対応するすべてのフラッシュパッケージ管理情報２５００内のパッケージ内追加パページ消去回数２５１０から減算する；
（ｅ）実ブロック割り当て時刻をもつ仮想ブロックが、実ページ及びフラッシュパッケージ２３０ごとにいくつあるかをそれぞれカウントする（なお、この処理は、ステップ８００７でも行われているので省略されてもよい）；
（ｆ）それぞれのカウント値を、対応するすべての実ページ情報２１００内の追加実ブロック割り当て数２１０５と、対応するすべてのフラッシュパッケージ管理情報２５００内のパッケージ内追加実ページ割り当て数２５０６から減算する、
を実行する。
【０１９０】
ステップ８００９：実行部４３００は、上記受けたライトセイムコマンドで、仮想ページから実ページを解放できるものがあるかを判断する。なければ、本処理フローが終了する。
【０１９１】
ステップ８０１０:本ステップの処理は、仮想ページから実ページを解放する処理である。実行部４３００は、（ａ）〜（ｅ）：
（ａ）解放可能な実ページに対応する実ページ情報２１００を、空きページ管理情報ポインタ２２００のキューに登録する；
（ｂ）解放可能な実ページの基になっているフラッシュパケッージグループ２８０ごとに、解放できる実ページ数を計算する；
（ｃ）パッケージグループ２８０ごとに計算した値を、対応するパッケージグループ情報２３００内の空きページ数２３０４から減算する；
（ｄ）解放する実ページごとに、論理ボリューム情報２０００内の実ページポインタ２００４をヌル値にする；
（ｅ）ライトセイムコマンドに付随するパターンデータを、フォーマット情報２００５に含める、
を実行する。これにより、ライト指定領域に係る仮想ページにはフォーマット情報２００５に含まれたパターンデータが格納されていることをストレージコントローラ２００が認識することができる。
【０１９２】
図２４は、ページ移動スケジュール部４４００の処理フローを示す。
【０１９３】
ページ移動スケジュール部４４００は、タイマ２４０が、次回スケジュール時刻２７０２になったときに、実行を開始する。
【０１９４】
ステップ１００００：スケジュール部４４００は、各フラッシュパッケージ２３０について、以下の（ａ）〜（ｅ）：
（ａ）パッケージ内実ブロック割り当て数２５０５に（次回スケジジュ−ル時刻２７０２−前回スケジュール時刻２７０１）を乗算した値を、パッケージ内累積実ブロック割り当て時間２５０７に加える；
（ｂ）パッケージ内累積実ブロック割り当て時間２５０７に、パッケージ内追加実ブロック割り当て時間２５０９を加える；
（ｃ）ブロックパッケージ内追加実ブロック割り当て時間２５０９を０にする；
（ｄ）パッケージ内実ブロック割り当て数２５０５に、パッケージ内追加実ブロック数２５０６加える、
（ｅ）パッケージ内追加実ブロック数２５０６を０にする、
を実行する。（ａ）と（ｂ）により、前回スケジュール時刻２７０１以降に割り当てられた実ブロックの割り当て時間を反映（加算）できたことになる。なぜなら、パッケージ内追加実ブロック割り当て時間２５０９は、前回スケジュール時刻２７０１以降に割り当てられた、当該フラッシュパッケージの実ブロックごとに、（次回スケジュール実時刻２７０２−実ブロック割り当て時刻）が加算されてきたからである。
【０１９５】
ステップ１０００１：スケジュール部４４００は、各実ページについて、以下の（ａ）〜（ｅ）：
（ａ）実ブロック割り当て数２１０４に（次回スケジュール時刻２７０２−前回スケジュール時刻２７０１）を乗算した値を、累積実ブロック割り当て時間２１０６に加える；
（ｂ）累積実ブロック割り当て時間２１０６に、追加実ブロック割り当て時間２１０８を加える；
（ｃ）追加実ブロック割り当て時間２１０８を０にする；
（ｄ）実ブロック割り当て数２１０４に、追加実ブロック数２１０５を加える；
（ｅ）追加実ブロック数２１０５を０にする、
を実行する。（ａ）と（ｂ）により、前回スケジュール時刻２７０１以降に割り当てられた実ブロックの割り当て時間を反映（加算）できたことになる。なぜなら、追加実ブロック割り当て時間２１０８には、前回スケジュール時刻２７０１以降に割り当てられた、当該実ページの実ブロックごとに、（次回スケジュール実時刻２７０２−実ブロック割り当て時刻）が加算されてきたからである。
【０１９６】
ステップ１０００２：スケジュール部４４００は、各フラッシュパッケージ２３０について、以下の（ａ）〜（ｄ）：
（ａ）パッケージ内累積実ブロック消去回数２５０８をパッケージ内累積実ブロック割り当て時間２５０７で割る；
（ｂ）パッケージ内実ブロック割り当て数２５０５を、割り当て可能実ブロック数２５０４で割る、
（ｃ）複数のパッケージグループ２８０から移動元パッケージグループを決定する；
（ｄ）複数のパッケージグループ２８０から移動先パッケージグループを決定する、
を実行する。
【０１９７】
(ａ)で得られた値は、実ページの割り当ての変更を行わなかった場合のそれぞれのフラシュパッケージ２３０の実ブロックの単位時間当りの平均消去回数（以下、単に「平均消去回数」と言う）となる。なお、パッケージ内累積実ブロック消去回数２５０８の代わりにパッケージ内累積ライトデータ量２５１０がある場合、そのライトデータ量２５１０からパッケージ内累積実ブロック消去回数２５０８の値が推測される。具体的には、例えば、パッケージ内累積ライトデータ量２５１０／（フラッシュブロック容量３００４―パッケージブロック容量３００５）で算出された値が、パッケージ内累積実ブロック消去回数２５０８の推測値である。これは、当初、（フラッシュブロック容量３００４−パッケージブロック容量３００５）が空き容量になっていて、この空き容量がなくなると、消去処理が発生するためである。
【０１９８】
スケジュール部４４００は、余命が短いパッケージグループを移動元パッケージグループとして決定することができるが、「余命」は、平均消去回数と消去限界数２５１２を基に算出される。具体的には、例えば、｛（消去限界数２５１２−パッケージ内累積実ブロック消去回数２５０８）／平均消去回数｝＋現在時刻（タイマ２４０から取得される時刻）を計算することにより、一つのパッケージグループ２３０についての余命が得られる。
【０１９９】
（ｂ）で得られた値は、実ページの割り当ての変更を行わなかった場合のそれぞれのフラシュパッケージ２３０の実ブロックの占有率になる。
【０２００】
本実施形態では、この平均消去回数や実ブロックの占有率に基づき、移動元パッケージグループが決定される。以下、それぞれのケースを説明する。
【０２０１】
＜平均消去回数＞。
【０２０２】
スケジュール部４４００は、例えば、平均消去回数が多い或いは余命が短いパッケージグループを移動元パッケージグループとして決定する。具体的には、例えば、スケジュール部４４００は、下記（Ａ１）〜（Ａ３）の少なくとも一つに適合するフラッシュパッケージを含んだパッケージグループ：
（Ａ１）平均消去回数が所定の第１の閾値を超えている；
（Ａ２）余命が保障期間終了時刻２５１１より短い；
（Ａ３）平均消去回数が、他のフラッシュパッケージ２３０に比べて一定の割合以上に多い（すなわち、フラッシュパッケージ２３０間で、平均消去回数の偏りが大きい）、
を、移動元パッケージグループとして決定する。
【０２０３】
スケジュール部４４００は、例えば、平均消去回数が少ない或いは余命が長いパッケージグループを移動先パッケージグループとして決定する。具体的には、例えば、スケジュール部４４００は、下記（Ｂ１）〜（Ｂ３）の少なくとも一つに適合するフラッシュパッケージを含んだパッケージグループ：
（Ｂ１）平均消去回数が所定の第２の閾値以下である（第２の閾値は前述の第１の閾値以下）；
（Ｂ２）余命が保障期間終了時刻２５１１より長い；
（Ｂ３）平均消去回数が、他のフラッシュパッケージ２３０に比べて一定の割合未満に少ない、
を、移動先パッケージグループとして決定する。より具体的には、例えば、上記（Ａ１）のフラッシュパッケージ２３０を含んだ移動元パッケージグループに対して、（Ｂ１）のフラッシュパッケージ２３０を含んだパッケージグループ２８０が移動先として決定され、上記（Ａ２）のフラッシュパッケージ２３０を含んだ移動元パッケージグループに対して、（Ｂ２）のフラッシュパッケージ２３０を含んだパッケージグループ２８０が移動先として決定され、上記（Ａ３）のフラッシュパッケージ２３０を含んだ移動元パッケージグループに対して、（Ｂ３）のフラッシュパッケージ２３０を含んだパッケージグループ２８０が移動先として決定される。その際、移動先となるパッケージグループ２８０は、例えば、移動元との平均消去回数の差、又は、余命の差を基に、決定される。
【０２０４】
＜実ブロックの占有率＞。
【０２０５】
スケジュール部４４００は、例えば、下記（Ｘ１）及び（Ｘ２）の少なくとも一つに適合するフラッシュパッケージを含んだパッケージグループ２８０：
（Ｘ１）実ブロックの占有率が所定の第３の閾値を越えている（フラッシュパッケージ２３０が満杯になる可能性がある）；
（Ｘ２）割り当て可能実ブロック数２５０４がある基準を満たしていない（例えば所定の第５の閾値以下である）、
を、移動元パッケージグループとして決定する。
【０２０６】
スケジュール部４４００は、例えば、下記（Ｙ１）及び（Ｙ２）の少なくとも一つに適合するフラッシュパッケージを含んだパッケージグループ：
（Ｙ１）平均消去回数が所定の第４の閾値以下である（第４の閾値は前述の第３の閾値以下）；
（Ｙ２）割り当て可能実ブロック数２５０４がある基準を満たしている（例えば所定の第６の閾値を超えている（第６の閾値は前述の第５の閾値以上））、
を、移動先パッケージグループとして決定する。
【０２０７】
ステップ１０００３：スケジュール部４４００は、
（ａ）移動元ページ（データの移動元の実ページ）と移動先ページ（データの移動先の実ページ）とを決定する（すなわち、スケジュール部４４００は、移動元パッケージグループに基づく複数の実ページから移動元ページを決定し、且つ、移動先パッケージグループに基づく複数の実ページから移動先ページを決定する）；
（ｂ）決定されたすべての移動元ページに対応する移動待ちフラグ２１１１をＯＮに更新する；
（ｃ）移動先ページを割り当てるパッケージグループ２８０に対応する空きページ管理情報ポインタ２２００がさす実ページ情報２１００を、移動元ページのコピー先実ページ情報ポインタ２１１０に設定する；
（ｄ）空きページ管理情報ポインタ２２００を、次の空いた状態にあるページ管理情報２１００を示すように更新する、
を実行する。上記（ｃ）及び（ｄ）は、決定された全ての移動元ページについて実行される。これにより、移動元ページと移動先ページのペアが決まったことになる。
【０２０８】
（ａ）において、スケジュール部４４００は、例えば、移動元パッケージグループ２８０に属する各実ブロック情報２１００の、累積実ブロック割り当て時間２１０６、累積実ブロック消去回数２１０７(代わりに、累積ライトデータ量２１１２)、実ブロック割り当て数２１０４などのうちの少なくとも一つを基に、移動元ページを決定する。具体的には、例えば、スケジュール部４４００が決定した移動元ページは、下記（ｘ）又は（ｙ）の特徴：
（ｘ）決定された移動元ページの累積実ブロック消去回数２１０７は、その移動元ページの累積実ブロック消去回数２１０７と移動先ページ（移動先の実ページ）の累積実ブロック消去回数２１０７との差になるべく近い（好ましくは等しい）；
（ｙ）決定された移動元ページの実ブロック占有率は、その移動元ページの実ブロック占有率と移動先ページの実ブロック占有率との差になるべく近い（好ましくは等しい）、
を有する。（ｘ）の特徴を有する移動元ページは、例えば、移動元パッケージグループが上記（Ａ１）〜（Ａ３）のいずれかに対応したグループの場合に決定される。（ｙ）の特徴を有する移動元ページは、移動元パッケージグループが上記（Ｂ１）又は（Ｂ２）に対応したグループの場合に決定される。
【０２０９】
ステップ１０００４：スケジュール部４４００は、パッケージグループ１６０ごとに存在するページ移動処理実行部４５００の中で、少なくとも一つの移動元ページを有するパッケージグループ２８０に対応したページ移動処理実行部４５００を起動する。
【０２１０】
ステップ１０００５：スケジュール部４４００は、以下の（ａ）及び（ｂ）：
（ａ）次回スケジュール時刻２７０１を前回スケジュール時刻２７０１にコピーする；
（ｂ）次回スケジュール時刻２７０１に次のスケジュール時間を設定する（例えば、次回スケジュール時刻２７０１を、現在の次回スケジュール時刻２７０１に所定の時間を加算することにより得られた時刻に更新する）、
を実行する。
【０２１１】
図２５は、ページ移動処理実行部４５００の処理フローを示す。
【０２１２】
ページ移動処理実行部４５００は、パッケージグループ２８０毎に存在する。また、図２４のステップ１０００４で述べたように、少なくとも一つの移動元ページを有するパッケージグループ２８０に対応したページ移動処理実行部４５００が、ページ移動スケジュール部４４００から起動される。
【０２１３】
ステップ１１０００：実行部４５００は、ＯＮになっている移動待ちフラグ２１１１を含んだ実ページ情報２１００を探す。この実ページ情報２１００に対応した実ページが移動元ページである。もし、ＯＮになった移動待ちフラグ２１１１を含んだ実ページ情報２１００がない場合、本処理フローは終了する。
【０２１４】
ステップ１１００１：実行部４５００は、見つかった実ページ情報２１００内の移動待ちフラグ２１１１をＯＦＦにして、移動中フラグ２１０９をＯＮにする。
【０２１５】
ステップ１１００２：実行部４５００は、移動元ページに割り当てられている仮想ブロックの集合を特定する。移動元ページに対応するパッケージグループ２１０１が示すパッケージグループ情報２３００が、該当するパッケージグループ情報２３００である。このパッケージグループ情報２３００内のフラッシュパッケージポインタ２３０５が示すフラッシュパッケージ情報２５００に対応するフラッシュパッケージ２３０が、移動元ページの基になっているフラッシュパッケージ（移動元パッケージ）２３０である。実行部４５００は、移動元ページに対応した実ページアドレス２１０２と、移動元パッケージに対応したブロック容量２５０３とを基に、それぞれのフラッシュパッケージ２３０の中の移動対象となる仮想ブロックの集合を、すべてのフラッシュパッケージ２３０に関して特定する。
【０２１６】
ステップ１１００３：実行部４５００は、移動元グループ（移動元ページの基になっているパッケージグループ）２８０を構成する各フラッシュパッケージ２３０のパッケージコントローラ３１５に、特定された仮想ブロックの集合に格納されているデータのリード指示を送信する。
【０２１７】
ステップ１１００４：実行部４５００は、ステップ１１００３での指示の送信先のすべてのフラッシュパッケージ２３０から、完了報告をまつ。 
ステップ１１００５：実行部４５００は、フラッシュパッケージ２３０からの完了報告に含まれている情報を、キャッシュメモリ２１０に格納する。なお、その完了報告には、ステップ１１００３で送信した指示で指定した各仮想ブロック（リード元仮想ブロック）に実ブロックが割りてられていたか否かを表す情報が含まれている。リード元仮想ブロックに実ブロックが割り当てられていた場合、完了報告には、以下の情報（Ａ）〜（Ｃ）；、
（Ａ）リード元仮想ブロックに割り当てられていた実ブロックに格納されていたデータ；
（Ｂ）リード元仮想ブロックに実ブロックが割り当てられていない状態から初めて実ブロック（現在割り当てられている実ブロックとは限らない）を割り当てた時刻；
（Ｃ）（Ｄ）の時刻以降の、リード元仮想ブロックに割り当てられていた実ブロックの消去回数、
が含まれている。
【０２１８】
ステップ１１００６：実行部４５００は、移動先ページに割り当てられている仮想ブロックの集合を特定する。この場合、移動元ページに対応した実ページ情報２１００内の移動先ページポインタ２１１０が示す実ページ情報２１００が、移動先ページに対応する実ページ情報２１００である。
【０２１９】
ステップ１１００７：実行部４５００は、移動先グループ（移動先ページの基になっているパッケージグループ）２８０を構成する各フラッシュパッケージ２３０のパッケージコントローラ３１５に、特定された仮想ブロック（ライト先仮想ブロック）にデータを格納することのライト指示を送信する。このとき、各パッケージコントローラ３１５に送られる情報は、ステップ１１０５でキャッシュメモリ２１０に格納された情報（移動元パッケージ２３０から送られてきた情報）である。
【０２２０】
ステップ１１００８：実行部４５００は、ライト指示の送信先のすべてのフラッシュパッケージ２３０から、完了報告をまつ。
【０２２１】
ステップ１１００９：実行部４５００は、以下の（ａ）〜（ｃ）：
（ａ）移動元ページを空きページに更新し、且つ、移動先ページを、これまで移動元ページが割り当てられていた仮想ページに割り当てる（具体的には、移動元ページに対応した実ページ情報２１００に空きページ管理ポインタ２２００をつなぎ、これまで移動元ページを示していた実ページポインタ２００４を移動先ページに対応した実ページ情報２１００を示すようにする）；
（ｂ）、移動元ページに対応した実ページ情報２１００のうち、実ブロック割り当て数２１０４、追加実ブロック割り当て数２１０５、累積実ブロック割り当て時間２１０６、累積実ブロック消去回数２１０７（累積ライトデータ量２１１２）、追加実ブロック割り当て時間２１０８を、移動先ページに対応した実ページ情報２１００にコピーする；
（ｃ）移動元ページに対応した実ページ情報２１００のうち、情報２１０４〜２１１１をクリアする、
を実行する。
【０２２２】
ステップ１１０１０：実行部４５００は、移動元に対応したすべてのパッケージグループ情報２３００と移動先に対応したすべてのパッケージグループ情報２３００とを更新する。具体的には、実行部４５００は、移動元に対応したパッケージグループ情報２３００内の実ページ数２３０３から移動元ページの数（例えば１）を減らし、移動先に対応したパッケージグループ情報２３００内の実ページ数２３０３に、移動先ページの数を加算する。
【０２２３】
ステップ１１０１１：実行部４５００は、移動元に対応したすべてのフラッシュパッケージ情報２５００と移動先に対応したすべてのフラッシュパッケージ情報２５００とを更新する。具体的には、実行部４５００は、例えば、以下の（ａ）及び（ｂ）：
（ａ）移動元に対応したそれぞれのフラッシュパッケージ情報２５００内の下記（Ａ）〜（Ｆ）のそれぞれの値から、移動先ページに対応した実ページ情報２１００のうちの、それぞれのフラッシュパッケージ２３０に対応する下記（Ｕ）〜（Ｚ）のそれぞれの値を減算する（つまり、（Ａ）−（Ｕ）、（Ｂ）−（Ｖ）、（Ｃ）−（Ｗ）、（Ｄ）−（Ｘ）、（Ｅ）−（Ｙ）、及び（（Ｆ）−（Ｚ））を行う）；
（Ａ）パッケージ内実ブロック割り当て数２５０５、
（Ｂ）パッケージ内追加実ブロック割り当て数２５０６、
（Ｃ）パッケージ内累積実ブロック割り当て時間２５０７、
（Ｄ）パッケージ内累積実ブロック消去回数２５０８、
（Ｅ）パッケージ内追加実ブロック割り当て時間２５０９
（（Ｆ）パッケージ内累積ライトデータ量２５１０））
（Ｕ）実ブロック割り当て数２１０４、
（Ｖ）追加実ブロック割り当て数２１０５
（Ｗ）累積実ブロック割り当て時間２１０６、
（Ｘ）累積実ブロック消去回数２１０７
（Ｙ）追加実ブロック割り当て時間２１０８
（（Ｚ）累積ライトデータ量２１１２））
（パッケージ内累積ライトデータ量２５１０と累積ライトデータ量２１１２は存在しない場合があるが、その場合、パッケージ内累積ライトデータ量２５１０から累積ライトデータ量２１１２が減算される処理は実行されない。）、
（ｂ）移動元に対応したそれぞれのフラッシュパッケージ情報２５００内の下記（Ｇ）〜（Ｌ）のそれぞれの値に、移動先ページに対応した実ページ情報２１００のうちの、それぞれのフラッシュパッケージ２３０に対応する下記（Ｏ）〜（Ｔ）のそれぞれの値を加算する（つまり、（Ｇ）＋（Ｏ）、（Ｈ）＋（Ｐ）、（Ｉ）＋（Ｑ）、（Ｊ）＋（Ｒ）、（Ｋ）＋（Ｓ）、及び（（Ｌ）＋（Ｔ））を行う）；
（Ｇ）パッケージ内実ブロック割り当て数２５０５、
（Ｈ）パッケージ内追加実ブロック割り当て数２５０６、
（Ｉ）パッケージ内累積実ブロック割り当て時間２５０７、
（Ｊ）パッケージ内累積実ブロック消去回数２５０８、
（Ｋ）パッケージ内追加実ブロック割り当て時間２５０９
（（Ｌ）パッケージ内累積ライトデータ量２５１０））
（Ｏ）実ブロック割り当て数２１０４、
（Ｐ）追加実ブロック割り当て数２１０５
（Ｑ）累積実ブロック割り当て時間２１０６、
（Ｒ）累積実ブロック消去回数２１０７
（Ｓ）追加実ブロック割り当て時間２１０８
（（Ｔ）累積ライトデータ量２１１２））
（パッケージ内累積ライトデータ量２５１０と累積ライトデータ量２１１２が存在しない場合があるが、その場合には、パッケージ内累積ライトデータ量２５１０に累積ライトデータ量２１１２を加算する処理は実行されない。）、
を実行する。この後、ステップ１１０００へ戻る。
【０２２４】
（ａ）の累積割当て時間は、本実施形態よりも簡単に管理されても良い。例えば、直前回の上位レベルの長寿命化制御が行われてから今回の上位レベルの長寿命化制御が行われるまでの間に、割り当てられる実ブロックの数に変更があっても、その変更は適宜に無視されても良い。
【０２２５】
ストレージコントローラ２００は、実ブロックの消去回数や割当て時間を、例えば、フラッシュパッケージ２３０から受ける情報を基に特定することができ、特定された消去回数及び割当て時間を、フラッシュパッケージ毎の累積割当て時間や全体消去回数に反映することができる。
【０２２６】
次に、フラッシュパッケージ２３０が実行する動作の説明を行う。フラッシュパッケージ２３０の動作は、パッケージコントローラ３１５（典型的にはパッケージプロセッサ３１０）が実行し、そのプログラムは、パッケージメモリ３２０内に格納されている。
【０２２７】
図２６は、パッケージメモリ３２０に格納されているプログラムを示す。
【０２２８】
プログラムとして、例えば、データリード処理実行部１２０００、データライト処理実行部１２１００、実ブロック解放処理実行部１２２００、仮想ブロック移動処理実行部１２３００及び仮想ブロック格納処理実行部１２４００がある。これらのプログラムは、下位レベルのウエアレベリング制御及び容量仮想化機能を実現するためのプログラムである。前述したように、本実施形態では、フラッシュパッケージ２３０が、下位レベルのウエアレベリング制御及び容量仮想化機能を実現するが、それらはストレージコントローラ２００で実現されてもよい。その場合、図２７に示すように、図２６に示したプログラムとほぼ同様のプログラムが、共有メモリ２２０に格納される。図２７に示した構成では、これらの情報は、ストレージコントローラ２００が実行するので、図２６に示したそれぞれのプログラムとは、若干相違が生ずる。
【０２２９】
以下、パッケージメモリ３２０内のプログラム１２０００、１２１００、１２２００、１２３００及び１２４００を主語として説明する処理は、実際にはパッケージプロセッサ３１０が行う処理である。
【０２３０】
図２８は、データリード処理実行部１２０００の処理フローを示す。
【０２３１】
データリード処理実行部１２０００は、ストレージコントローラ２００から、リード指示を受け取ったときに、実行される。以下の説明では、一つの仮想ブロックからデータを読み出すことを例に採るが、図２８の処理フローは、複数の仮想ブロックからデータを読み出すことにも有効である。
【０２３２】
ステップ１３０００：実行部１２０００は、受けたリード指示が指定するアドレスと、パッケージブロック容量３００５とを基に、リード元となる仮想ブロックと、リード元仮想ブロック内の相対アドレスとを計算する。
【０２３３】
ステップ１３００１：実行部１２０００は、リード元の仮想ブロックに割り当てられている実ブロック（リード元実ブロック）に対応した実ブロック情報３３００を、リード元仮想ブロックに対応した仮想ブロック情報３２００内の実ブロック情報ポインタ３２０２から獲得する。
【０２３４】
ステップ１３００２：実行部１２０００は、以下の（ａ）及び（ｂ）：
（ａ）獲得した実ブロック情報３３００内の実ブロックＩＤ３３０１から、そのＩＤ３３０１に対応する実ブロックの先頭が、どのフラッシュチップ３００のどのアドレスであるかを特定する；
（ｂ）（ａ）で特定されたアドレスと、上記獲得した実ブロック情報３３００内の追加書き込みデータアドレス情報３３０５と、ステップ１３０００で得たリード指示でアクセス対象となる仮想ブロック内の相対アドレスとを基に、そのリード指示から特定された仮想ブロックが、当該フラッシュチップ３００のどの当該アドレスに格納されているかを算出する、
を実行する。
【０２３５】
ステップ１３００３: 実行部１２０００は、リード対象のデータが格納されているフラッシュチップ３００に対応したチップ情報３１００を参照し、当該フラッシュチップ３００が接続されているパッケージバス３４０を識別し、対応するパッケージバス転送装置３５０を認識する。
【０２３６】
ステップ１３００４: 実行部１２０００は、ステップ１３００３で認識したパッケージバス転送装置３５０に対して、どのフラッシュチップ３００のどのアドレス（実ブロックのアドレス）からバッファ３３０にデータを転送するのかを、指示する。
【０２３７】
ステップ１３００５：実行部１２０００は、転送が完了するのを待つ。
【０２３８】
ステップ１３００６：実行部１２０００は、バッファ３３０に格納されたデータ（ストレージコントローラ２００からのリード指示の対象のデータ）を、ストレージコントローラ２００に送る。
【０２３９】
図２９と図３０は、データライト処理実行部１２１００の処理フローを示す。
【０２４０】
データライト処理実行部１２１００は、フラッシュパッケージ２３０がストレージコントローラ２００からライト指示を受け付けたときに実行される。以下の説明では、一つの仮想ブロックにデータを書き込むことを例に採るが、図２９及び３０の処理フローは、複数の仮想ブロックにデータを書き込むことにも有効である。
【０２４１】
ステップ１４０００: 実行部１２１００は、受けたライト指示が指定するアドレスと、パッケージブロック容量３００５とを基に、ライト先の仮想ブロックとその仮想ブロックの相対アドレスとを計算する。
【０２４２】
ステップ１４００１：実行部１２１００は、上記ライト指示に付随するライト対象データを、バッファ３３０に格納する。
【０２４３】
ステップ１４００２：実行部１２１００は、ライト先仮想ブロックに対応する仮想ブロック情報３２００内の実ブロック情報ポインタ３２０２を参照する。実行部１２１００は、そのポインタ３２０２の値がヌル値かどうか、すなわち、実ブロックが割り当てられているか否かを判断する。割り当てられていれば（その判断の結果が肯定的であれば）、ステップ１４００５へジャンプする。
【０２４４】
ステップ１４００３：本ステップは、ライト先仮想ブロックに空きブロックを割り当てるステップである。なお、ここでは、割り当てられる空きブロックは消去されていてデータは格納されていないものとする。実行部１２１００は、以下の（ａ）〜（ｅ）：
（ａ）各チップ情報３１００のチップ内空きブロック数３１０３等を参照して、どのフラッシュチップ３００空きブロックを割り当てるかを決める；
（ｂ）決めた空きブロックを有するフラッシュチップ３００に対応した空きブロック管理情報ポインタ３４００を参照して、ライト先仮想ブロックに対応した実ブロック情報ポインタ３３０２を、先頭の実ブロック情報３３００を示すよう更新する（これで、ライト先仮想ブロックに実ブロックを割り当てられたことになる）；
（ｃ）空きブロック管理情報ポインタ３４００を、次の実ブロック情報３３００（仮想ブロックに割り当てられた実ブロックに対応した実ブロック情報３３００内の空きブロックポインタ３３０２が示す実ブロック情報３３００）を示すよう更新する；
（ｄ）ライト先仮想ブロックに割り当てられた実ブロックに対応する実ブロック情報３３００内の空きブロックポインタ３３０２をヌル値にする；
（ｅ）その割り当てられた実ブロックに対応するチップ情報３１００内のチップ内空きブロック数３１０３の値から、割り当てられた実ブロックの数（例えば１）減算する、
を実行する。
【０２４５】
ステップ１４００４：実行部１２１００は、以下の（ａ）〜（ｃ）：
（ａ）上記ライト指示に付与されている時刻情報を、ライト先仮想ブロックに対応した仮想ブロック情報３２００内の仮想ページ割り当て時刻３２０３に設定する；
（ｂ）ライト先仮想ブロックに対応した仮想ブロック消去回数３２０４に０を設定する；
（ｃ）バッファ３３０上に、パッケージブロック容量３００５分の初期パターン（ストレージコントローラ２００からライト対象データ（図２９及び図３０の説明において、ライト指示に付随するデータ）を受け取っていないことを意味するパターン）を生成する、
を実行する。ここで、ライト先仮想ブロックに割り当てられた実ブロック（図２９及び図３０の説明において「ライト先実ブロック」という）には、ライト対象データ以外は、この初期パターンが書き込まれることになる。これを実行するため、図３０のステップ１４０１６へジャンプする。
【０２４６】
ステップ１４００５：実行部１２１００は、ライト先実ブロックに対応する実ブロック情報３３００内の実ブロックＩＤ３３０１を参照して、ライト先実ブロックの先頭が、どのフラッシュチップ３００のどのアドレスであるかを特定する。
【０２４７】
ステップ１４００６：実行部１２１００は、ライト先実ブロックに対応する実ブロック内空き領域３３０４と、ライト対象データの長さとを基に、ライト対象データをライト先実ブロックの空き領域に書き込めるか否かを判断する。書き込めない場合（その判断の結果が否定的の場合）、図３０のステップ１４０１１へジャンプする。
【０２４８】
ステップ１４００７: 実行部１２１００は、ライト先実ブロックを有するフラッシュチップ３００に対応したチップ情報３１００を参照し、そのフラッシュチップ３００が接続されているパッケージバス３４０を識別し、対応するパッケージバス転送装置３５０を認識する。
【０２４９】
ステップ１４００８: 実行部１２１００は、ステップ１４００７で認識したパッケージバス転送装置３５０に対して、どのフラッシュチップ３００のどのアドレスにバッファ３３０からライト対象データを書き込むかを指示する。
【０２５０】
ステップ１４００９：実行部１２１００は、書き込みが完了するのを待つ。 
ステップ１４０１０：実行部１２１００は、以下の（ａ）〜（ｃ）：
（ａ）ライト先実ブロックに対応した実ブロック内空き領域３３０４から、ライト対象データの量を減算する；
（ｂ）ライト先実ブロックに対応した追加書き込みデータアドレス情報３３０５に、ライト先実ブロック内の相対アドレスとライト対象データの長さとを加える；
（ｃ）ストレージコントローラ２００に、ライト指示が完了したことの完了報告を送信する、
を実行する。
【０２５１】
ステップ１４０１１：本ステップは、ライト先実ブロックの空き領域よりもライト対象データの長さが大きい場合に実行されるステップである。この場合、ライト対象データは、ライト先実ブロックには、消去処理を実行することなしに、格納できない。本実施形態では、実ブロックの消去回数の偏りを少なくするために、ライト対象データは別の実ブロックに格納するようにする。したがって、本ステップでは、実行部１２１００は、下位レベルのウエアレベリング制御部をコールする。実行部１２１００は、下位レベルのウエアレベリング制御部から、ライト対象データを格納すべき実ブロックに対応する実ブロック情報３３００のアドレスを受け取る。下位レベルのウエアレベリング制御は、実ブロックの消去回数の偏りを少なくするように、新しい実ブロックを選択する。その実ブロックは、例えば、消去された状態にあり、直接データを書き込めるような状態であるとする。なお、下位レベルのウエアレベリング技術は、特許文献１のような公知技術を適用すればよいため、ここでは詳細に説明しない。
【０２５２】
ステップ１４０１２：実行部１２１００は、新たに指定された実ブロックに、ライト対象データだけでなく、ライト先仮想ブロックに元々割り当てられていた実ブロック（図２９及び図３０の説明において「元の実ブロック」と言う）内の全てのデータ（パッケージブロック容量３００５分のデータ）を書き込む必要がある。このため、実行部１２１００は、元の実ブロックに対応した追加書き込みデータアドレス情報３２０５を参照して、元の実ブロックのパッケージブロック容量３００５分の容量のデータを仮想ブロックのアドレス順にバッファ３３０に格納するため、フラッシュチップ３００への指示を生成する。
【０２５３】
ステップ１４０１３: 実行部１２１００は、ステップ１４００５で認識したフラッシュチップ３００に対応したチップ情報３１００を参照し、そのフラッシュチップ３００が接続されているパッケージバス３４０を識別し、対応するパッケージバス転送装置３５０を認識する。
【０２５４】
ステップ１４０１４: 実行部１２１００は、ステップ１４００７で認識したパッケージバス転送装置３５０に、ステップ１４００１１で生成した指示にしたがって、どのフラッシュチップ３００のどのアドレスからバッファ３３０にデータを読み込むかを指示する。
【０２５５】
ステップ１４０１５：実行部１２１００は、バッファ３３０への読み込みが完了するのを待つ。
【０２５６】
ステップ１４０１６：実行部１２１００は、新たに割り当てた実ブロックにパッケージブロック容量３００５分のデータを書き込む。具体的には、本ステップでは、実行部１２１００は、ステップ１４００４、あるいは、ステップ１４０１４で、バッファ３３０に格納したパッケージブロック容量３００５分のデータ（ステップ１４００４で格納したのは初期パターンのデータ）に対し、ストレージコントローラ２００から受けたライト対象データを、ステップ１４０００で認識した相対アドレスから上書きする。
【０２５７】
ステップ１４０１７：次に、実行部１２１００は、新たに割り当てた実ブロックに対応する実ブロック情報３３００内の実ブロックＩＤ３３０１を参照して、新たに割り当てた実ブロックがどのフラッシュチップ３００のどのアドレスに格納するかを特定する。
【０２５８】
ステップ１４０１８: 実行部１２１００は、ステップ１４０１７で認識したライト対象データを格納するフラッシュチップ３００に対応したチップ情報３１００を参照し、そのフラッシュチップ３００が接続されているパッケージバス３４０を識別し、対応するパッケージバス転送装置３５０を認識する。
【０２５９】
ステップ１４０１９: 実行部１２１００は、ステップ１４０１８で認識したパッケージバス転送装置３５０に、どのフラッシュチップ３００のどのアドレスへバッファ３３０からパッケージブロック容量３００５分のデータを書き込むかを指示する。
【０２６０】
ステップ１４０２０：実行部１２１００は、バッファ３３０からの書き込みが完了するのを待つ。
【０２６１】
ステップ１４０２１：実行部１２１００は、元の実ブロックにライト対象データを格納できないために新しい実ブロックを割り当てた場合、ステップ１４０２２及び１４０２３を行う。そうではない場合、ステップ１４０２４へジャンプする。
【０２６２】
ステップ１４０２２:本ステップは、実行部１２１００は、実ブロックを空いた状態にするステップである。実行部１２１００は、以下の（ａ）〜（ｆ）：
（ａ）元の実ブロックに対して消去処理を行う；
（ｂ）元の実ブロックに対応した実ブロック消去回数３３０６の値に１を加算する；
（ｃ）実ブロック消去回数３３０６が上限値を超えた場合、元の実ブロックに対応する実ブロック障害フラグ３３０３をＯＮにし、上記のライト指示に起因して障害状態になった実ブロックが発生したことを記憶する；
（ｄ）元の実ブロックが割り当てられていた仮想ブロックに対応する仮想ブロック消去回数３２０４の値に１を加算する；
（ｅ）元の実ブロックに対応する空きブロックポインタ３３０２に、空きブロック管理情報ポインタ３４００が示していた実ブロック情報３３００のアドレスを設定する；
（ｆ）空きブロック管理情報ポインタ３４００には、元の実ブロックに対応する実プロック情報３３００のアドレスを設定する；
を実行する。
【０２６３】
ステップ１４０２３:本ステップは、新たな実ブロックをライト先仮想ブロックに割り当てるステップである。具体的には、実行部１２１００は、ライト先仮想ブロック対応する実ブロック情報ポインタ３２０２を、新たな実ブロックに対応した実ブロック情報３３００を示す値に更新する。
【０２６４】
ステップ１４０２４：実行部１２１００は、ストレージコントローラ２００に対して、ライト完了報告を送信する。その完了報告は、例えば、ストレージコントローラ２００からのライト指示に伴って消去処理が施された実ブロックがあれば、その実ブロックの数を含む。また、その完了報告は、そのライト指示に伴って障害状態になった実ブロックがあれば、その実ブロックの数を含む。また、ステップ１４００４で、仮想ブロックに、実ブロックを割り当てていない状態から、新たに実ブロックを割り当てた場合、その割り当てた個数と、ライト指示に含まれていた時刻情報も、ストレージコントローラ２００に対する完了報告に含まれる。
【０２６５】
図３１は、実ブロック解放処理実行部１２２００の処理フローを示す。
【０２６６】
実ブロック解放処理実行部１２２００は、ストレージコントローラ２００から、領域の範囲（仮想ブロックの集合）を解放せよという解放指示を受け付けたときに実行する。
【０２６７】
ステップ１５０００：実行部１２２００は、解放指示で指定された領域の範囲とパッケージブロック容量３００５とを基に、解放を指示された仮想ブロックの集合を算出する。
【０２６８】
ステップ１５００１：実行部１２２００は、ステップ１５０００で特定した仮想ブロックの集合に対し、それぞれの仮想ブロックに対応する仮想ブロック情報３２００の実ブロック情報ポインタ３２０２を参照し、実ブロックが割り当てられているか否かを判断する。ここでは、実行部１２２００は、指定されたすべての仮想ブロックに対して、それぞれの仮想ブロックに実ブロックが割り当てられているか否かを示す情報を作成する。実行部１２２００は、作成した情報を、ストレージコントローラ２００に送るため、バッファ３３０に書き込む。
【０２６９】
ステップ１５００２：実行部１２２００は、ステップ１５０００で特定した仮想ブロックの集合のうちの、実ブロックが割り当てられている仮想ブロックを探す。なければ、ステップ１５００６へジャンプする。
【０２７０】
ステップ１５００３：実行部１２２００は、見つかった仮想ブロックに対応する実ブロック情報ポインタ３２０２が示す実ブロック情報３３００に対応する実ブロックの解放処理を行う。このため、実行部１２２００は、その実ブロック情報３３００内の実ブロックＩＤ３３０１を解析し、解放する実ブロックが、どのフラッシュチップ１３０２のどのアドレスに存在するかを特定する。
【０２７１】
ステップ１５００４：本ステップは、実ブロックを空いた状態にするステップである。対象となる実ブロックは、ステップ１５００３で特定された実ブロックであるが、処理内容は、図３０のステップ１４０２２と同じである。このため、ここでは説明を省略する。
【０２７２】
ステップ１５００５：実行部１２２００は、空いた状態にされた実ブロックに割り当てられていた仮想ブロック（空き仮想ブロック）に対応する仮想ブロック割り当て時刻３２０３及び仮想ブロック消去回数３２０４を、バッファ３３０へコピーする。それらの情報３２０３及び３２０４をストレージコントローラ２００に送るためである。コピー後、実行部１２２００は、空き仮想ブロックに対応する仮想ブロック情報２０００内の仮想ページ割り当て時刻３２０３及び仮想ブロック消去回数３２０４を初期化する。この後、ステップ１５００２に戻る。
【０２７３】
ステップ１５００６：実行部１２２００は、ストレージコントローラ２００に、下記情報（Ａ）及び（Ｂ）の情報：
（Ａ）解放指示で指定された領域の範囲に属する仮想ブロックごとに、実ブロックが割り当てられていたか否かを示す情報；
（Ｂ）解放された実ブロックが割り当てられていた仮想ブロック毎の、仮想ブロック割り当て時刻３２０３と仮想ブロック消去回数３２０４、
を含んだ解放完了報告を、ストレージコントローラ２００に送る。
【０２７４】
図３２は、仮想ブロック移動処理実行部１２３００の処理フローを示す。
【０２７５】
仮想ブロック移動処理実行部１２３００は、ストレージコントローラ２００から、指定された仮想ブロックの集合に格納されているデータをストレージコントローラ２００に送る指示を受けたときに、実行する。移動されたデータを格納していた実ブロックは解放されるので、図３１と異なるのは、実ブロックに格納されていたデータをストレージコントローラ２００に送る点である。このため、図３１の処理フローの各ステップを引用しながら、図３２の説明を行う。
【０２７６】
ステップ１６０００：ステップ１５０００と同様。実行部１２３００は、解放を指示された仮想ブロックの集合を特定する。
【０２７７】
ステップ１６００１：ステップ１５００１と同様。実行部１２３００は、指定されたすべての仮想ブロックについて、実ブロックが割り当てられているか否かを示す情報を作成し、その情報をバッファ３３０にコピーする。
【０２７８】
ステップ１６００２：ステップ１５００２と同様。実行部１２３００は、実ブロックが割り当てられている仮想ブロックを探す。なければ、ステップ１６０１０へジャンプする。
【０２７９】
ステップ１６００３：基本的にはステップ１５００３と同様。このため、実行部１２３００は、移動元の実ブロックに対応する実ブロックＩＤ３３０１を解析し、移動元の実ブロックが、どのフラッシュチップ３００のどのアドレスから存在するかを特定する。
【０２８０】
ステップ１６００４：実行部１２３００は、移動元の実ブロックに対応する実ブロック情報３３００の先頭アドレスと、その情報３３００内の追加書き込みデータアドレス情報３３０５と、ステップ１６００３で得た格納先アドレスとを基に、アドレスリストを作成する。そのアドレスリストは、移動元の実ブロックについてのアドレスのリストであって、ストレージコントローラ２００に送るべきパッケージブロック容量３００５分のデータが格納されているアドレスのリストである。
【０２８１】
ステップ１６００５: 実行部１２３００は、移動元の実ブロックを有するフラッシュチップ３００に対応したチップ３１００情報を参照し、そのフラッシュチップ３００が接続されているパッケージバス３４０を識別し、対応するパッケージバス転送装置３５０を認識する。
【０２８２】
ステップ１６００６: 実行部１２３００は、ステップ１６００５で認識したパッケージバス転送装置３５０に、移動元の実ブロックを有するフラッシュチップ３００にアドレスリストを渡し、且つ、そのアドレスリストにしたがってバッファ３３０にデータを転送することを指示する。
【０２８３】
ステップ１６００７：実行部１２３００は、転送が完了するのを待つ。
【０２８４】
ステップ１６００８：本ステップは、実ブロックを空いた状態にするステップである。対象となる実ブロックは、移動元の実ブロックであるが、処理内容は、図３０のステップ１４０２２と同じである。このため、ここでは、説明を省略する。
【０２８５】
ステップ１６００９：ステップ１５００５と同様。実行部１２３００は、空いた状態にされた実ブロックに割り当てられていた仮想ブロック（空き仮想ブロック）に対応する仮想ブロック割り当て時刻３２０３及び仮想ブロック消去回数３２０４を、バッファ３３０へコピーする。コピー後、実行部１２３００は、空き仮想ブロックに対応する仮想ブロック情報２０００内の仮想ページ割り当て時刻３２０３及び仮想ブロック消去回数３２０４を初期化する。この後、ステップ１６００２に戻る。
【０２８６】
ステップ１６０１０：実行部１２３００は、ストレージコントローラ２００へ、バッファ３３０に格納されたデータを送る。具体的には、例えば、実行部１２３００は、下記情報（Ａ）〜（Ｃ）の情報：
（Ａ）移動元の仮想ブロックごとに、実ページが割り当てられていたか否かを示す情報；
（Ｂ）解放された実ブロックが割り当てられていた仮想ブロック毎の、仮想ページ割り当て時刻３２０３と仮想ブロック消去回数３２０４；
（Ｃ）バッファ３３０に格納されたデータ（移動元の仮想ブロックに割り当てられていた実ブロック内のデータ）、
を含んだ完了報告を、ストレージコントローラ２００に送る。
【０２８７】
図３３は、仮想ブロック格納処理実行部１２４００の処理フローを示す。
【０２８８】
仮想ブロック格納処理実行部１２４００は、指定された仮想ブロックの集合に、実ブロックをそれぞれ割り当て、且つ、ストレージコントローラ２００から送られてきたデータを格納せよというライト指示を受けたときに、実行する。仮想ブロック移動処理実行部１２３００とは、データの流れが逆であるが、共通点が多いので、図３２の処理フローの各ステップを引用しながら説明を行う。
【０２８９】
ステップ１７０００：ステップ１６０００と同様。実行部１２４００は、格納を指示された仮想ブロックの集合を算出する。
【０２９０】
ステップ１７００１：フラッシュパッケージ２３０内のパッケージコントローラ３１５が、ストレージコントローラ２００から、以下の（Ａ）〜（Ｃ）を含んだ情報：
（Ａ）格納先の仮想ブロックの集合のうちの各仮想ブロックについて、実ブロックが割り当てられていたか否かを示す情報；
（Ｂ）実ブロックが割り当てられていたすべての仮想ブロックに関して、その仮想ブロック全体のデータ（具体的には、その仮想ブロックに割り当てられていた実ブロック内のデータ）、
（Ｃ）実ブロックが割り当てられていた仮想ブロックに対応した仮想ページ割り当て時刻３２０３及び仮想ブロック消去回数３２０４、
を受ける。その情報は、バッファ３３０に格納される。さらに、パッケージコントローラ３１５（パッケージプロセッサ３１０）は、仮想ブロック毎の情報（実ブロックが割り当てられるか否かを示す情報）を、バッファ３３０から取得する。
【０２９１】
ステップ１７００２：ステップ１６００２と同様。実行部１２４００は、取得した情報を基に、実ブロックが割り当てられていた仮想ブロックを探す。なければ、ステップ１７０１０へジャンプする。
【０２９２】
ステップ１７００３：実行部１２４００は、ステップ１７００２で見つかった仮想ブロックに空きブロックを割り当てる。この処理は、図２９のステップ１４００３と同様であるので、詳細な説明は省略する。
【０２９３】
ステップ１７００４: 実行部１２４００は、バッファ３３０に格納されている（Ｃ）の情報（実ブロックが割り当てられていた仮想ページ割り当て時刻３２０３及び仮想ブロック消去回数３２０４）を、空きブロックの割当先の仮想ブロックに対応した仮想ブロック情報３２００内の仮想ページ割り当て時刻３２０３及び仮想ブロック消去３２０４にコピーする。
【０２９４】
ステップ１７００５：基本的にはステップ１６００４と同様。実行部１２４００は、割り当てた実ブロックに対応する実ブロックＩＤ３３０１を解析し、ステップ１７００３で割り当てた実ブロックがどのフラッシュチップ３００のどのアドレスから存在するかを特定する。
【０２９５】
ステップ１７００６:基本的にはステップ１６００５と同様。実行部１２４００は、特定された実ブロックが格納されているフラッシュチップ３００に対応したチップ情報３１００を参照し、そのフラッシュチップ３００が接続されているパッケージバス３４０を識別し、対応するパッケージバス転送装置３５０を認識する。
【０２９６】
ステップ１７００７: 実行部１２４００は、ステップ１７００６で認識したパッケージバス転送装置３５０に、どのフラッシュチップ３００のどのアドレスからバッファ３３０内のデータ（ステップ１７００１での（Ｂ）のデータ）を書き込むかを指示する。
【０２９７】
ステップ１７００８：実行部１２４００は、転送が完了するのを待つ。
【０２９８】
ステップ１７００９：ステップ１７００２に戻る。
【０２９９】
ステップ１７０１０：実行部１２４００は、ストレージコントローラ２００へ、完了報告を送信する。
【０３００】
以上、本発明の一つの実施形態を説明したが、これは本発明の説明のための例示であって、本発明の範囲をこの実施形態にのみ限定する趣旨ではない。本発明は、他の種々の形態でも実施することが可能である。
【０３０１】
例えば、パッケージコントローラ３１５は、フラッシュパッケージ２３０の外に設けられても良い。その場合、パッケージコントローラ３１５の数は、フラッシュパッケージ２３０の数よりも多くても少なくても良い。具体的には、例えば、Ｘ個（Ｘは二以上の整数）のフラッシュパッケージ２３０につき一つのパッケージコントローラ３１５が設けられても良い。この場合、一つのパッケージコントローラ３１５は、Ｘ個のフラッシュパッケージ２３０のそれぞれについて、論理アドレスと物理アドレスとの対応関係などを管理する。
【０３０２】
また、例えば、パッケージグループ間のデータ移動（ページ単位のデータ移動）は、ストレージコントローラ２００を介することなく行われても良い。具体的には、例えば、ストレージコントローラ２００が、移動元アドレス及び移動先アドレスを、移動元及び／又は移動先に対応したパッケージコントローラ３１５に通知し、移動元に対応したパッケージコントローラ３１５と移動先に対応したパッケージコントローラ３１５との間で、ストレージコントローラ２００を介することなく、移動元ページに対応した仮想ブロックに割り当てられている実ブロック内のデータが、移動先ページに対応する仮想ブロックに割り当てられる実ブロックに移動されても良い。
【符号の説明】
【０３０３】
１００：ストレージシステム
【図１】
0005437373.tif 000002
【図２】
0005437373.tif 000003
【図３】
0005437373.tif 000004
【図４】
0005437373.tif 000005
【図５】
0005437373.tif 000006
【図６】
0005437373.tif 000007
【図７】
0005437373.tif 000008
【図８】
0005437373.tif 000009
【図９】
0005437373.tif 000010
【図１０】
0005437373.tif 000011
【図１１】
0005437373.tif 000012
【図１２】
0005437373.tif 000013
【図１３】
0005437373.tif 000014
【図１４】
0005437373.tif 000015
【図１５】
0005437373.tif 000016
【図１６】
0005437373.tif 000017
【図１７】
0005437373.tif 000018
【図１８】
0005437373.tif 000019
【図１９】
0005437373.tif 000020
【図２０】
0005437373.tif 000021
【図２１】
0005437373.tif 000022
【図２２】
0005437373.tif 000023
【図２３】
0005437373.tif 000024
【図２４】
0005437373.tif 000025
【図２５】
0005437373.tif 000026
【図２６】
0005437373.tif 000027
【図２７】
0005437373.tif 000028
【図２８】
0005437373.tif 000029
【図２９】
0005437373.tif 000030
【図３０】
0005437373.tif 000031
【図３１】
0005437373.tif 000032
【図３２】
0005437373.tif 000033
【図３３】
0005437373.tif 000034