(57)【特許請求の範囲】
【請求項１】
複数の記憶媒体とストレージコントローラとを備えるストレージシステムであって、
前記ストレージコントローラは、前記複数の記憶媒体によって提供されるプールに含まれる複数のページを管理し、ホストに対して仮想ボリュームを提供し、前記ホストからの書き込み要求に応じて、前記プール内の割当て可能な複数のページのうちのあるページを前記仮想ボリュームの一部に割当て、前記プール内の割当て可能なページ数を管理し、割り当てた前記ページに対応する領域を有する前記複数の記憶媒体に対してライトデータを送信し、
前記複数の記憶媒体のうちの少なくとも一つの記憶媒体は、前記ストレージコントローラから受信した前記ライトデータを圧縮して、圧縮した前記ライトデータを格納し、
前記複数の記憶媒体のうちの少なくとも一つの記憶媒体は、当該記憶媒体の圧縮されたデータの格納量に基づいて、圧縮情報を生成し、
前記複数の記憶媒体のうちの少なくとも一つの記憶媒体は、前記圧縮情報を前記ストレージコントローラに送信し、
前記ストレージコントローラは、前記複数の記憶媒体のうちの少なくとも一つの記憶媒体から受信した前記圧縮情報に基づいて、前記プール内の割当て可能なページ数を調整することを特徴とする、
ストレージシステム。
【請求項２】
請求項１記載のストレージシステムであって、
前記ストレージコントローラは、前記圧縮情報に基づいて前記プール内の割当て可能なページ数を調整する際、前記プール内の使用不可ページ数を調整することを特徴とする、
ストレージシステム。
【請求項３】
請求項１記載のストレージシステムであって、
前記複数の記憶媒体のうちの少なくとも一つの記憶媒体は、前記ホストからのI/O要求と独立に、前記圧縮情報を前記ストレージコントローラに送信することを特徴とする、ストレージシステム。
【請求項４】
請求項１記載のストレージシステムであって、
前記ストレージコントローラは、前記プール内の割当て可能な複数のページのうちのあるページを前記仮想ボリュームの一部に割当てる際、前記プール内の割当て可能なページ数から一のページを減じてページ数を管理することを特徴とする、ストレージシステム。
【請求項５】
請求項１記載のストレージシステムであって、
前記複数の記憶媒体は、それぞれ、データ記憶領域を有し、
前記圧縮されたデータは、前記データ記憶領域に格納されることを特徴とする、ストレージシステム。
【請求項６】
請求項５記載のストレージシステムであって、
前記圧縮情報は、前記データ記憶領域に格納された前記圧縮されたデータの格納量と、前記ストレージコントローラから送信されたライトデータの合計値に基づく、圧縮率であることを特徴とする、ストレージシステム。
【請求項７】
請求項１記載のストレージシステムであって、
前記ストレージコントローラは、前記仮想ボリュームの、前記ホストからの書き込み要求に対応するライト先のアドレスに当該ページが割り当てられていない場合、前記プール内の割当て可能な複数のページのうちのあるページを前記仮想ボリュームの前記アドレスに割当てることを特徴とする、ストレージシステム。
【請求項８】
請求項１記載のストレージシステムであって、
前記複数の記憶媒体は、それぞれ、複数のフラッシュチップを有するフラッシュパッケージであることを特徴とする、ストレージシステム。
【請求項９】
請求項１記載のストレージシステムであって、
前記複数の記憶媒体のうちの少なくとも一つは、HDDであることを特徴とする、ストレージシステム。
【請求項１０】
請求項１記載のストレージシステムであって、
前記複数の記憶媒体は、ＲＡＩＤグループであることを特徴とする、ストレージシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、フラッシュメモリに格納するデータの容量を削減する技術に関する。
【背景技術】
【０００２】
フラッシュメモリは、磁気ディスクなどに比べ、ビットコストが高価であるため、格納データ容量を削減し、見かけ上の容量を大きくするニーズは高い。
【０００３】
また、フラッシュメモリ（例えばＮＡＮＤ型のフラッシュメモリ）は、メモリの特性上、データを書き換えようとした時、そのデータが元々格納されていた物理領域上に、そのデータを、直接上書きすることは不可能である。既にデータが書き込まれている物理領域に新たにデータを書き込むためには、フラッシュメモリの消去単位である「ブロック」と呼ばれる単位で、消去処理を実行し、その後に、データを書き込む必要がある。このため、通常、データを書き換える場合、元々そのデータが格納されていた物理領域に新たにデータを書き込むのではなく、別の物理領域にデータを書き込む。同一の論理アドレスを書込み先としたデータが複数の物理領域に書き込まれ、ブロックが満杯になると、そのブロック内の最新のデータ（有効なデータ）を別のブロックに書き込み、無効なデータで満杯のブロックの消去処理（ブロックに格納されているデータを消去する処理）を行うことで、そのブロックを使用可能にする（そのブロックを空きブロックにする）処理が行われる。以下、この処理を「リクラメーション処理」と呼ぶ。このため、１以上のフラッシュメモリを搭載したパッケージ（以下、フラッシュパッケージ）では、フラッシュパッケージの外側に見せるアドレス層として、物理的なアドレスの層とは別に、論理的なアドレスの層が設けられる。物理的なアドレスに割り当てる論理的なアドレスが適宜変更される。また、物理的なアドレスが変更になっても、論理的なアドレスは変わらない。このため、フラッシュパッケージの外側からは、同一の論理アドレスでデータクセスが可能である。故に、使い勝手の良さを維持することができる。
【０００４】
次に、格納容量削減技術について述べる。一般的に、容量を削減する代表的な技術として、圧縮技術がある。一方、近年、ストレージシステムでは、格納容量を削減する技術として、容量仮想化技術という技術が知られている。容量の仮想化技術とは、ストレージシステムが含む記憶装置の物理的な容量より大きな仮想的な容量を、ストレージシステムの外側（例えばホスト側）に見せる技術で、ストレージシステムのコントローラ（以下、ストレージコントローラ）で実現される。これは、ユーザが実際にストレージシステムを使用する場合、ユーザが定義したユーザボリューム（ユーザからみた論理ボリューム）の容量に対し、実際に格納するデータの量は、このユーザボリュームの記憶容量（ユーザが定義した容量）には、なかなか達しないという特性を利用したものである。すなわち、容量仮想化技術が適用されないストレージシステムでは、ボリューム定義時に、定義された物理的な容量が確保されるのに対し、容量仮想化技術が適用されているストレージシステムでは、実際にストレージシステムにデータが格納された時に初めて物理的な容量が確保される。これにより、ストレージシステムで消費される記憶容量（確保される記憶容量）が削減され、かつ、ユーザはユーザボリュームの容量を厳密に定義する必要がないため（例えば、余裕をもった容量を単純に定義すればよいため）、使い勝手を向上することができる。
【０００５】
特許文献１では、多数のフラッシュパッケージに接続されたストレージコントローラを含むストレージシステムにおいて、ストレージコントローラだけでなく、フラッシュパッケージも、容量仮想化技術をもった方式が公開されている。特許文献１では、それぞれを区別するため、ストレージコントローラが持つ容量仮想化機能を「上位レベルの容量仮想化機能」と呼び、フラッシュパッケージが持つ容量仮想化機能を「下位レベルの容量仮想化機能」と呼んでいる。
【０００６】
このため、フラッシュパッケージは、実際のフラッシュメモリの物理容量より大きな容量をストレージコントローラに見せることができる。容量仮想化技術において、データが書き込まれたときに確保される物理的な記憶領域は、ページと呼ばれる。特許文献１では、ストレージコントローラで実現される上位レベルの容量仮想化技術において、データが書き込まれたときに確保される物理的な記憶領域は、「ページ」と呼ばれる。一方、フラッシュパッケージで実現される下位レベルの容量仮想化技術において、データが書き込まれたときに確保される物理的な記憶領域は、フラッシュメモリの消去単位である「ブロック」と呼ばれる。一般に、ページのサイズは、多様性にとんでいるが、特許文献１では、ページのサイズのほうが、ブロックのサイズより大きい。
【０００７】
ところで、フラッシュメモリに関して、一般的に、消去の単位は、前述したように「ブロック」と呼ばれ、ブロックの中での読み書きの単位は「ページ」と呼ばれる。当然、フラッシュメモリにおいては、ブロックのサイズのほうが、ページのサイズより大きい。しかし、特許文献１では、「ページ」という言葉は、フラッシュメモリの読み書き単位でなく、上位レベルの容量仮想化技術に従い割り当てられる物理的な記憶領域を意味する。なお、本明細書においても、「ページ」という言葉は、フラッシュメモリの読み書き単位でなく、上位レベルの容量仮想化技術に従い割り当てられる物理的な記憶領域を意味する。なお、本明細書では、フラッシュメモリの読み書きの単位を、「セグメント」と呼ぶ。
【０００８】
ただし、本発明に従うストレージシステムは、上位レベルの容量仮想化技術を必ずしももっていなくて良い。一方、通常、記憶装置には、ユーザのデータを格納する前に、特定のパターン（例えば、オール０）でフォーマティングする。特許文献２では、フォーマッティングの際に書き込まれる特定パターンが書き込まれているページが解放される。特許文献１では、ストレージシステムが、オール０の書込み先をフラッシュメモリ記憶装置に通知し、フラッシュメモリ記憶装置は、その書込み先にブロックを割り当てないよう制御する。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】国際公開第２０１１／０１０３４４号パンフレット
【特許文献２】特開２００７−１９９９２２号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
フラッシュメモリを記憶媒体とする大容量ストレージシステムにおいては、フラッシュメモリチップの数は、数万に及ぶ。このため、数百のチップを搭載したフラッシュパッケージを数百枚、ストレージコントローラに接続するのが典型的な構成となり得る。
【００１１】
本発明において解決しようとする課題は、多数のフラッシュパッケージを含む大規模ストレージシステムにおいて、ストレージシステム全体で、性能に与える影響を少なくして、フラッシュメモリに格納するデータの量を削減し、見掛け上、より多くの量のデータを格納するようにすることである。具体的には、例えば、下記第１及び第２の課題がある。
【００１２】
第１の課題は、フラッシュパッケージ内で、性能に与える影響を少なくして、格納するデータの量を削減することである。特許文献１は、（１）容量仮想化技術（下位レベルの容量仮想化技術）と、（２）書込み対象のデータが特定のパターンであれば物理的な領域を割り当てない、ことを開示している。しかし、フラッシュメモリに格納するデータの量を更に削減することが可能である。格納するデータの量を削減する代表的な方法として、圧縮という方法がある。しかし、フラッシュメモリの特性を生かす形で、見掛け上より多くの量のデータを格納するような圧縮技術は知られていない。
【００１３】
第２の課題について説明する。一般に、圧縮率のようなデータの削減率は、データの中身によって異なり、予測は難しい。特許文献１では、フラッシュパッケージが、見かけ上、物理容量より大きな容量（以下、仮想容量と呼ぶ）を、ストレージコントローラに見せる。しかし、実際に格納されたデータにより、圧縮率が変化するという事象に生ずる課題、例えば、圧縮率が予想以上に低かった場合に発生する課題を解決する技術は知られていない。
【課題を解決するための手段】
【００１４】
ストレージシステムは、複数のフラッシュパッケージと、ホストからライト要求を受け、そのライト要求に従うライトデータを、ライト先のフラッシュパッケージに送信するストレージコントローラとを有する。各フラッシュパッケージは、複数のフラッシュチップを有する。各フラッシュチップは、複数のブロックで形成されている。ブロックは、データの消去単位である。
【００１５】
第１の課題を解決するための、本発明の１つの特徴は、以下の通りである。すなわち、フラッシュパッケージは、物理容量よりも大きな容量を格納できるよう、物理容量より大きな仮想容量を、ストレージシステム内のコントローラに見せ、且つ、圧縮技術により、ストレージコントローラから受けたライトデータを圧縮する。フラッシュメモリの特性を生かすことで、性能に与える影響を抑えることができる。
【００１６】
すでに、述べたように、フラッシュメモリでは、データを書きかえる場合、元々そのデータが格納されていた領域（例えばブロック内の領域）に書き込むのではなく、別の領域（例えば同じブロック内の別の領域）にそのデータが書き込まれることが多い。同一のデータが複数の領域に書き込まれ、ブロックが満杯になると、リクラメーション処理が実行される。このため、データを圧縮することでそのデータの格納容量（ブロックにおけるデータの容量）が削減されても、データ更新時には、別領域にデータが書き込まれるので、問題がない。また、更新データ（書き換え後のデータ）を圧縮して書き込むことで、更新データの格納容量も削減することができる。ブロックが満杯になったときには、フラッシュパッケージは、リクラメーション処理を行えばよい。リクラメーション処理では、フラッシュパッケージは、一度データを伸長し、伸長したデータを並び替えた後に、並び替えられたデータを圧縮してもよいし、圧縮されたままデータを移動してもよい。
【００１７】
以上の通り、本発明によれば、フラッシュメモリで一般的に実行される基本動作（例えば、追記ライト処理（ブロック内の或る領域に格納済みのデータの書き換え後のデータを、同一のブロック内の別の空き領域（又は別のブロック内の空き領域）に書く処理）とリクラメーション処理）に、圧縮処理を組み込むことができる。これにより、圧縮処理が原因で性能が低下することを抑えることができる。また、圧縮率が高ければ、リクラメーション処理の実行頻度が低くなるため、場合によっては、圧縮によって性能が向上する可能性もある。
【００１８】
第２の課題、すなわち、実際に格納されたデータにより圧縮率が変化するという事象が発生する具体的な課題、について述べる。例えば、圧縮率が予想以上に低いと、フラッシュパッケージがストレージコントローラに見せている仮想容量よりも少ない容量しかそのフラッシュパッケージにデータが格納されていないのに、フラッシュパッケージにそれ以上データが格納できないという事象が発生する。一方で、圧縮率が予想より高いと、フラッシュパッケージがコントローラに見せている仮想容量と同程度の容量のデータがそのフラッシュパッケージに格納されたのに、まだ多くの空き容量が残っているということになる。本発明の更なる特徴は、フラッシュパッケージが、コントローラに見せる仮想容量を動的に変化させるために、圧縮率を用いる機能をもつ点である。この機能により、より効率的にデータの格納容量の削減が可能になる。
【００１９】
一方で、ストレージコントローラは、フラッシュパッケージが、仮想容量の変化を通知してきた場合、これに対応する機能をもつ必要がある。この機能を実現する際には、ストレージコントローラも容量仮想化機能（上位レベルの容量仮想化機能）をもっていることが望ましい。なぜなら、フラッシュパッケージが仮想容量の変化を通知してきても、ストレージコントローラが、その仮想容量の変化をホストに意識させないようにするためである。容量仮想化機能とは、ストレージシステムがもっている実際の物理的な記憶容量ではなく、仮想的な記憶容量をホストに見せる技術の１つである。このため、フラッシュパッケージが仮想容量の変化をストレージコントローラに通知してきても、ストレージコントローラが、その仮想容量の変化をホストに意識させないようにすることができる。圧縮率の認識、及び、フラッシュパッケージの仮想容量の調整を、フラッシュパッケージではなくストレージコントローラが行ってもよい。
【発明の効果】
【００２０】
本発明によれば、複数のフラッシュパッケージを有する大容量のストレージシステムにおいて、性能劣化を抑えて、データの格納容量の削減し、物理的な記憶容量よりも大きな容量のデータを格納することができる。
【図面の簡単な説明】
【００２１】
【図１】本発明の一実施例における情報システムの構成を示す図である。
【図２】本発明の一実施例におけるストレージシステムの構成を示す図である。
【図３】本発明の一実施例におけるフラッシュパッケージの構成を示す図である。
【図４】本発明の一実施例におけるストレージシステムの共有メモリに格納された上位レベルの制御に関する情報を示す図である。
【図５】本発明の一実施例における論理ボリューム情報の形式を示す図である。
【図６】本発明の一実施例における実ページ情報の形式を示す図である。
【図７】本発明の一実施例における仮想ページ、実ページ、仮想ブロック、実ブロックの関係を表した図である。
【図８】本発明の一実施例におけるフラッシュパッケージ情報の形式を示すである。
【図９】本発明の一実施例におけるフラッシュパッケージグループ情報の形式を示す図である。
【図１０】本発明の一実施例における空き実ページ情報ポインタからポイントされた空き状態にある実ページ情報の集合を表した図である。
【図１１】本発明の一実施例における使用不可実ページ情報ポインタからポイントされた使用不可状態にある実ページ情報の集合を表した図である。
【図１２】本発明の一実施例におけるフラッシュパッケージのパッケージメモリ内における下位レベルの階層のための情報を示す図である。
【図１３】下位レベルの階層の制御を行うための情報を、ストレージシステムの共有メモリに設けた構成を示す図である。
【図１４】本発明の一実施例におけるパッケージ情報の形式を示す図である。
【図１５】本発明の一実施例におけるチップ情報の形式を示す図である。
【図１６】本発明の一実施例における仮想ブロック情報の形式を示す図である。
【図１７】本発明の一実施例における実ブロック情報の形式を示す図である。
【図１８】本発明の一実施例における空き実ブロック情報ポインタによりポイントされる空き状態にある実ブロックの集合を表す図である。
【図１９】本発明の一実施例におけるストレージコントローラのメモリ内の上位レベルの制御を行うプログラムを示す図である。
【図２０】本発明の一実施例におけるリード処理実行部の処理フローを示す図である。
【図２１】本発明の一実施例におけるライト要求受付部の処理フローを示す図である。
【図２２】本発明の一実施例におけるライトアフタ処理実行部の処理フローを示す図である。
【図２３】本発明の一実施例におけるライトセイムコマンド処理実行部の処理フローを示す図である。
【図２４】本発明の一実施例におけるページ移動処理実行部の処理フローを示す図である。
【図２５】本発明の一実施例におけるフラッシュパッケージのパッケージメモリに格納されるプログラムを示す図である。
【図２６】下位レベルの制御を行うプログラムを、ストレージコントローラのメモリに格納した構成を示す図である。
【図２７】本発明の一実施例におけるデータリード処理実行部の処理フローを示す図である。
【図２８】本発明の一実施例におけるデータライト処理実行部の一部の処理フローを示す図である。
【図２９】本発明の一実施例におけるデータライト処理実行部の残りの一部の処理フローを示す図である。
【図３０】本発明の一実施例における実ブロック解放処理実行部の処理フローを示す図である。
【図３１】本発明の一実施例における仮想ブロック移動処理実行部の処理フローを示す図である。
【図３２】本発明の一実施例における仮想ブロック格納処理実行部の処理フローを示す図である。
【図３３】本発明の一実施例における仮想容量判定処理部の処理フローを示す図である。
【発明を実施するための形態】
【００２２】
以下、図面を参照して、本発明の一実施例を説明する。
【００２３】
図１は、本発明の一実施例における情報システムの構成を示す。
【００２４】
情報システムは、ストレージシステム１００、ホスト１１０と、それらを接続するSAN（Storage  Area  Network）１２０とを有する。ホスト１１０は、アプリケーションプログラム（ユーザアプリケーション）を実行する計算機であり、ストレージステム１００との間で、SAN１２０経由で、必要なデータを読み書きする。SAN１２０は、SCSIコマンドが転送可能なプロトコルを用いる。そのプロトコルとして、例えば、Fibre  Channel等のプロトコルを用いることができる。SCSIコマンド以外に、メインフレームのI/Oプロトコルも用いることもできる。
【００２５】
本実施例は、多数のフラッシュメモリを有するストレージシステム１００において、フラッシュメモリへの格納データ容量削減技術（フラッシュメモリに格納するデータの容量を削減する技術）を実現するものである。本実施例においては、ストレージシステム１００は、階層型の容量仮想化技術をもつ。上位レベルの容量仮想化技術の制御単位は、ページとよばれる単位である。本実施例におけるページは、ストレージコントローラ２００で実現される容量仮想化技術で用いられるページである。なお、本発明は、階層型の容量仮想化技術における上位レベルの制御単位は、ページでなくとも有効である。本実施例では、ページのサイズは、フラッシュメモリにおける消去単位であるブロックよりも大きい。例えば、ページのサイズは、ブロックのサイズのＸ倍である（Ｘは２以上の整数）。通常、フラッシュメモリにおいては、リード・ライトの単位をページと呼ぶので、ページはブロックよりも小さい。しかし、すでに述べたように、本実施例では、ページは、上位レベルの容量仮想化技術についての制御単位（シンプロビジョニングに従う仮想的な論理ボリュームに割り当てられる記憶領域）を意味しており、そのサイズは、ブロックよりも大きい。なお、本実施例では、フラッシュメモリにおけるリード・ライトの単位を、上位レベルの容量仮想化の制御単位であるページと区別するため、「セグメント」と呼ぶ。また、下位レベルの容量仮想化技術の制御単位は、本実施例では、フラッシュメモリの消去単位であるブロックのＮ番目（Ｎは１以上の整数）の単位として、説明を行う。また、本発明は、記憶媒体をフラッシュメモリとし、実容量より大きい仮想容量を持ち、消去単位であるブロックを割り当て単位とした、容量仮想化機能を、単独に、従来の上位レベルの容量仮想化機能なしに、ホスト１１０に提供しても有効である。
【００２６】
図２は、ストレージシステム１００の構成を示している。
【００２７】
ストレージシステム１００は、一つ以上のストレージコントローラ２００と、キャッシュメモリ２１０と、共有メモリ２２０と、フラッシュパッケージ２３０と、それらの構成要素を接続する一つ以上の接続装置２５０とを有する。また、本実施例においては、ストレージシステム１００内の複数の記憶媒体は、すべてフラッシュメモリであるが、ストレージシステム１００は、フラッシュメモリの他に、HDDのような他種の記憶媒体を含んでいてもよい。また、本実施例において、全てのフラッシュパッケージ２３０の物理容量（物理的な記憶容量）は等しい。ただし、本発明は、複数のフラッシュパッケージ２３０のうちの少なくとも２以上のフラッシュパッケージ２３０の物理容量が異なっていても良い。ストレージコントローラ２００は、ホスト１１０から発行されたリード要求又はライト要求を処理するプロセッサ２６０と、プログラム及び／又は情報を記憶する記憶資源（例えばメモリ２７０）とを有する。
【００２８】
接続装置２５０は、ストレージシステム１００内の各構成要素を接続する機構である。また、本実施例では、高信頼化のために、一つのフラッシュパッケージ２３０は、複数の接続機構２５０で、複数のストレージコントローラ２００に接続されているものとする。ただし、一つのフラッシュパッケージ２３０が一つの接続装置２５０にしか接続されていない場合も本発明は有効である。
【００２９】
キャッシュメモリ２１０及び共有メモリ２２０の少なくとも一方は、通常、DRAMなどの揮発メモリで構成されるが、バッテリーなどによりメモリは不揮発化されていても良い。ただし、本発明は、キャッシュメモリ２１０及び共有メモリ２２０の少なくとも一方が不揮発化されていなくても有効である。
【００３０】
キャッシュメモリ２１０には、フラッシュパッケージ２３０に格納されたデータの中で、ストレージコントローラ２００からよくアクセスされるデータが格納される。ストレージコントローラ２００は、ホスト１１０からライト要求を受け付け、そのライト要求に従うデータ（フラッシュパッケージ２３０に書き込むデータ）を、キャッシュメモリ２１０に書き込んで、そのライト要求を完了させる（例えばライト要求に対する完了報告をホスト１１０に送る）。ただし、本発明は、書き込むデータをフラッシュパッケージ２３０に格納した段階でライト要求を完了させる方式でも有効である。
【００３１】
共有メモリ２２０は、キャッシュメモリ２１０の制御情報、ストレージシステム１００内の重要な管理情報、ストレージコントローラ２００間の連絡情報、及び、同期情報のうちの少なくとも１種類の情報を記憶する。
【００３２】
なお、本実施例では、フラッシュパッケージ２３０は、ストレージコントローラ２００からは、一台の記憶装置に見えているものとする。したがって、ストレージコントローラ２００が、高信頼化のために、一台のフラッシュパッケージ２３０が故障しても、そのフラッシュパッケージ２３０のデータを回復できるＲＡＩＤ（Redundant  Array  of  Independent  (or  Inexpensive)  Disks）機能をもっているものとする。ストレージコントローラ２００がRAID機能もつ場合、複数のフラッシュパッケージ２３０で、一つのRAID構成をとる。これを、フラッシュパッケージグループ２８０と呼ぶ。ただし、そのようなRAID機能を、ストレージコントローラ２００がもっていなくとも、本発明は有効である。
【００３３】
図３は、フラッシュパッケージ２３０の構成を示している。
【００３４】
フラッシュパッケージ２３０は、複数のフラッシュチップ３００と、パッケージプロセッサ３１０と、パッケージメモリ３２０と、バッファ３３０と、パッケージバス３４０と、バス転送装置３５０と、圧縮・伸長回路３６０とを有する。本実施例では、フラッシュパッケージ２３０は、ブロック単位の容量仮想化機能をもっている。なお、フラッシュパッケージ２３０が、ブロック単位以外の容量仮想化機能をもっていても、本発明は有効である。このため、フラッシュパッケージ２３０の物理容量（フラッシュパッケージ２３０がもっている全てのフラッシュチップ３００の物理容量を合計した値）より大きな容量が、仮想容量として定義される。フラッシュパッケージ２３０は、ストレージコントローラ２００からライト要求を受け付けたとき、そのライト要求に従うライト先のアドレス（そのアドレスが属する仮想的な領域）に、データを書き込むべきブロックが割り当てられているかどうかを判断し、その判断の結果が否定的の場合に、ライト先のアドレスに、ブロックを割り当てる。これによって、実際にブロックを割り当てる時刻を遅らせることができ、容量削減の効果がある。
【００３５】
また、２つの圧縮・伸長回路３６０Ａ及び３６０Ｂが設けられている。第１の圧縮・伸長回路３６０Ａは、ストレージコントローラ２００とバッファ３３０の間で転送されるデータを圧縮又は伸長する。第２の圧縮・伸長回路３６０Ｂは、バス転送装置３５０とバッファ３３０の間で転送されるデータ、及び、バッファ３３０の或る領域から読み出されてバッファ３３０の別の領域に書き込まれるデータを、圧縮又は伸長する。以上により、フラッシュチップ３００に格納するデータを圧縮することができるので、さらなる容量削減の効果がある。また、本実施例では、圧縮・伸長回路３６０Ａ及び３６０Ｂは、特に指示がない場合（例えば、パッケージプロセッサ３１０からの指示がない場合）、圧縮及び伸長のいずれも行わず、入力されたデータをそのまま転送する。
【００３６】
パッケージプロセッサ３１０は、ストレージコントローラ２００からリード要求又はライト要求を受け付け、受けた要求に従う処理を実行する。
【００３７】
バッファ３３０は、ストレージコントローラ２００とフラッシュチップ３００との間でリード又はライトされるデータを格納する。本実施例では、バッファ３３０は、揮発メモリである。パッケージプロセッサ３１０が、ストレージコントローラ２００からライト要求を受け、そのライト要求に従うデータをフラッシュチップ３００に書き込んだ段階で、そのライト要求を完了する（ライト要求の完了をストレージコントローラ２００に報告する）。ただし、バッファ３３０が不揮発メモリであっても良く、また、パッケージプロセッサ３１０は、ストレージコントローラ２００からのライト要求に従うデータをバッファ３３０に書き込んだ段階で、そのライト要求の完了報告をストレージコントローラ２００に送信しても良い。
【００３８】
パッケージメモリ３２０には、パッケージプロセッサ３１０が実行するプログラム、及び、フラッシュチップ３００の管理情報などが格納される。フラッシュパッケージ２３０の管理情報は重要な情報であるので、計画停止時には、管理情報を特定のフラッシュチップ３００に退避できることが望ましい。また、突発的な障害に備え、バッテリーをもち、これを利用して、障害などが発生しても、管理情報を特定のフラッシュチップ３００に退避できることが望ましい。
【００３９】
パッケージバス３４０は、バッファ３３０とフラッシュチップ３００との間で転送されるデータが流れるバスで、一本以上存在する。性能向上のために、複数のパッケージバス３４０を持つのが一般的だが、パッケージバス３４０が一本でも本発明は有効である。
【００４０】
バス転送装置３５０は、パッケージバス３４０対応に存在し、パッケージプロセッサ３１０の指示にしたがって、バッファ３３０とフラッシュチップ３００との間で、データ転送を実行する。
【００４１】
圧縮・伸長回路３６０Ａ及び３６０Ｂは、パッケージプロセッサ３１０からの指示に従い、バッファ３３０から読み出されるデータ、及び／又は、バッファ３３０に書き込まれるデータの圧縮又は伸長を行う。もちろん、圧縮・伸長回路３６０Ａ及び３６０Ｂは、データを、圧縮又は伸長なしに転送することも可能である。
【００４２】
図４は、ストレージシステム１００の共有メモリ２２０に格納される情報を示す。
【００４３】
論理ボリューム情報２０００、実ページ情報２１００、空きページ管理情報ポインタ２２００、フラッシュパッケージグループ情報２３００、フラッシュパッケージ情報２５００、仮想ページ容量２６００、及び、使用不可ページ管理情報ポインタ２７００が共有メモリ２２０に格納される。これらの情報のうちの少なくとも１種類が、上位レベルの容量仮想化技術を実現するために利用される。
【００４４】
本実施例においては、ストレージコントローラ２００は、上位レベルの容量仮想化機能を有しているものとする。ただし、本発明は、ストレージコントローラ２００が、上位レベルの容量仮想化機能をもっていなくとも有効である。通常、上位レベルの容量仮想化機能において、記憶領域の割り当て単位は、ページと呼ばれる。なお、本実施例では、論理ボリューム（例えば、シンプロビジョニングに従う仮想的な論理ボリューム）は、複数の仮想ページ（仮想的な記憶領域）に分割されているものとし、１以上のフラッシュパッケージグループ２８０に基づく記憶空間（以下、「プール」と言うことがある）は、複数の実ページ（実体的な記憶領域）に分割されているものとする。容量仮想化においては、論理ボリュームの記憶容量を、実際の容量よりも大きく見せることができる。このため、一般に、仮想ページの数は、実ページの数より多い。容量仮想化機能を実現した場合、ストレージコントローラ２００が、ホスト１１０からのライト要求に従うライト先のアドレスに属する仮想ページに、空きの実ページをプールから割り当て、その実ページに、ライト要求に従うデータを書き込む。
【００４５】
仮想ページ容量２６００は、仮想ページの容量を表す情報である。しかし、本実施例では、仮想ページの容量と実ページの容量は等しいというわけではない。なぜなら、実ページには、RAIDのタイプにより異なってくる冗長データが格納されることがあるためである。したがって、実ページの容量は、その実ページが割り当てられたフラッシュパッケージグループ２８０のRAIDタイプにより決まる。たとえば、RAID１のようにデータを２重に書き込む場合、実ページの容量は、仮想ページ容量の２倍になる。RAID5のように、N台の記憶装置の容量に対し、１台分の記憶装置の容量の冗長データを格納する場合、仮想ページ容量の（N+１）/Nの容量が、実ページの容量である。また、１つの冗長データとこれを生成するN個のデータを、「ストライプグループ」と呼ぶ。さらに、ストライプグループを構成する個々のデータの長さを「ストライプサイズ」と呼ぶ。当然、RAID0のように、冗長性がない場合、仮想ページの容量と等しい容量が実ページの容量ということになる。なお、本実施例においては、仮想ページの容量は、ストレージシステム１００が提供する１又は複数の論理ボリューム（シンプロビジョニングに従う仮想的な論理ボリューム）について共通であるが、１又は複数の仮想ボリュームにおいて異なる容量の仮想ページが含まれていても、本発明は有効である。
【００４６】
図５は、論理ボリューム情報２０００の形式を示したものである。
【００４７】
論理ボリュームは、ホスト１１０がリード又はライトするデータが格納される論理的な記憶デバイスである。一般的に、ホスト１１０は、論理ボリュームのID、論理ボリューム内のアドレス、読み書きしたいデータの長さを指定して、リード要求やライト要求を発行する。論理ボリューム情報２０００は、論理ボリュームごとに存在する情報である。この情報は、論理ボリュームID２００１、論理容量２００２、論理ボリュームRAIDタイプ２００３、実ページポインタ２００４、及び、フォーマット情報２００５を含む。
【００４８】
論理ボリュームID２００１は、対応する論理ボリュームのIDを示す。
【００４９】
論理容量２００２は、ホスト１１０から見た、対応する論理ボリュームの容量、を表す。
【００５０】
論理ボリュームRAIDタイプ２００３は、対応する論理ボリュームのRAIDタイプ（例えば、RAID0、RAID１など）を表す。RAID5のように、N台のフラッシュパッケージ２３０に対し１台のフラッシュパッケージ２３０に冗長データを格納する場合、Nの具体的数値を指定するものとする。ただし、任意のRAIDタイプが指定できるわけでなく、少なくとも一つのフラッシュパッケージグループ２８０がもつRAIDタイプである必要がある。
【００５１】
実ページポインタ２００４は、対応する論理ボリュームの仮想ページに割り当てた実ページ情報２１００へのポインタである。実ページポインタ２００４の数は、論理ボリュームの仮想ページの数（論理容量２００２が表す値を仮想ページ容量２６００が表す値で割った数になるが、余りがでれば、商に１を足す）である。最初の実ページポインタ２００４に対応するページが、論理ボリュームの先頭の仮想ページに割り当てられた実ページで、以降、次の実ページポインタ２００４には、次の仮想ページに割り当てる実ページに対応するポインタが格納される。また、仮想容量機能をサポートしているので、実ページが割り当てられるのは、論理ボリュームを定義した契機ではなく、対応する仮想ページに実際にデータ書き込みが行われる契機である。したがって、まだ書き込みが行われていな
い仮想ページの場合、対応する実ページポインタ２００４はヌルになっている。
【００５２】
フォーマット情報２００５も、対応する論理ボリュームの仮想ページ対応に存在する情報である。ホスト１１０は、アプリケーションプログラムが使用するデータを格納する前に、特定の情報で記憶媒体を初期化することが多い。ストレージシステム１００は、ライト要求に従い仮想ページに繰り返し情報（例えば、短いフォーマットデータの繰り返し）が書き込まれたことを認識した場合、その仮想ページに対応するフォーマット情報２００５にフォーマットデータが書き込まれたことを表す情報を記録することで、その仮想ページに割り当てられている実ページを解放しても良い。或いは、ホスト１１０が、明示的に指定した領域に短い繰り返し情報（繰り返しパターン）を書き込めというライトセイムコマンドを発行し、ストレージシステム１００は、ライトセイムコマンドを受けた場合でも、繰り返し情報を、フォーマット情報２００５に記憶することで、その仮想ページには、この繰り返し情報が格納されていることが認識できるので、その仮想ページに割り当てられている実ページを解放することができる。ストレージシステム１００は、ライトセイムコマンドを受領したとき、下位レベルの容量仮想化機能にも、その要求を伝え、ブロック単位の解放をフラッシュパッケージ２３０に行なわせて良い。それにより、容量の削減効果が期待できる。あるいは、さらに、明示的に、ホスト１１０が、この領域を解放せよという要求を発行した場合、同じ処理をストレージシステム１００が実行してもよい。同様に、通常のライトコマンドで、オール０などのフォーマットパターンが書き込まれた場合にも、ストレージシステム１００は、そのフォーマットパターンを認識して、下位レベルの容量仮想化機能に、対応するブロックを解放させても良い。フォーマット情報２００５が設定された場合、その仮想ページに実ページを割り当てる必要はないので、実ページポインタ２００４はヌル値になる。フォーマット情報２００５に格納された情報以外のデータが、対応する仮想ページに書き込まれると、実ページが割り当てられ、フォーマット情報２００４はヌルになる。
【００５３】
図６は、実ページ情報２１００の形式である。
【００５４】
実ページ情報２１００は、実ページごとに存在する、実ページの管理情報である。実ページ情報２１００は、パッケージグループ２１０１、実ページアドレス２１０２、空きページポインタ２１０３、ページデータ格納量２１０４、ページ圧縮後データ格納量２１０５、移動中フラグ２１０９、移動先実ページ情報２１１０、及び、移動待ちフラグ２１１１を含む。
【００５５】
パッケージグループ２１０１は、対応する実ページが、どのフラッシュパッケージグループ２８０に割り当てられているかを示す。
【００５６】
実ページアドレス２１０２は、対応する実ページの基になっているフラッシュパッケージグループ２８０の中で、対応する実ページがどの相対的なアドレスに割り当てられているかを示す情報である。
【００５７】
空きページポインタ２１０３は、対応する実ページに、仮想ページが割り当てられていない場合、有効な値となる。この場合、その値は、次の仮想ページが割り当てられていない空きの実ページ情報２１００をさす。仮想ページが割り当てられている場合、空きページポインタ２１０３は、ヌル値となる。
【００５８】
本実施例においては、それぞれのフラッシュパッケージ２３０は、容量仮想化機能をもっており、ストレージコントローラ２００には、見かけ上、実際の物理容量より大きな容量を仮想容量として提供している。フラッシュパッケージ２３０の容量仮想化の単位は、本実施例では、フラッシュメモリの消去単位であるブロックとする。以下、ストレージコントローラ２００から見たブロックを「仮想ブロック」と呼び、フラッシュパッケージ２３０が、実際に割り当てているブロックを「実ブロック」と呼ぶことがある。したがって、本実施例では、実ページは、１又は複数の仮想ブロックにより構成されることになる。また、本実施例では、仮想ブロックにより構成される容量空間のほうが、実ブロックにより構成される容量空間より大きいことになる。
【００５９】
図７は、仮想ページ、実ページ、仮想ブロック、実ブロックの関係を示したものである。
【００６０】
すでに述べたように、実ページには、仮想ページにはない、冗長データが格納されることがある。一方、仮想ブロックに格納されるデータは、圧縮され、圧縮されたデータが実ブロックに格納される。本実施例では、ｍ個（ｍは１以上の整数）の仮想ブロックのデータが、圧縮率に応じて、１個から（ｍ＋１）個までの実ブロックに格納される。ただし、以上の格納方式を採らない場合でも、本発明は有効である。以下、このｍ個の仮想ブロックを「仮想ブロックグループ」、１つの仮想ブロックグループを割り当てた１つ以上の実ブロックを「実ブロックグループ」と呼ぶことがある。以下、本実施例で、実ブロックの最大割り当て数を（ｍ＋１）個にした理由を以下に示す。仮に、仮想ブロックグループに格納されるデータをほとんど圧縮することができなかったとする。この場合、必要な実ブロックの数はｍ個となるが、実ブロックに空き容量はほとんどないことになる。このとき、ブロック内の一部のデータを書き換える要求（普通のライト要求）を、ストレージコントローラ２００からフラッシュパッケージ２３０が受け取ったとする。フラッシュメモリのブロックは書き換えができないので、フラッシュパッケージ２３０は、そのブロックの全データをバッファ３３０に読み出し、書き換え部分だけ更新して、当該ブロックを一度消去した後、ブロック全体にデータを格納しなければならない。フラッシュパッケージ２３０がライト要求を受け取るたびに、以上の動作が実行されると、処理時間が過大になりすぎ、実用的とは言いがたい。これを解決するため、本実施例では、もう一つ実ブロックを割り当て、空き領域を確保することにより、空き領域に追加書き込みを行うようにする。空き領域が小さくなって、書き換えデータに入らなくなった場合、消去処理（ブロックのデータを消去する処理）が行われる。これにより、消去処理をｎ回のライト要求につき１回実行すればよいので、性能を向上させることができる。また、消去処理の回数の削減は、フラッシュメモリの長寿命化にもつながる。本実施例では、フラッシュパッケージ２３０は、実ブロック数より多くの仮想ブロックをもっているように、ストレージコントローラ２００に見せていることになる。ただし、本発明では、ストレージコントローラ２００は、実際にフラッシュパッケージ２３０がいくつの空き実ブロックをもっているかを意識して、実ページの再配置を行う。本実施例では、フラッシュパッケージ２３０が、まだ実ブロックを割り当てていない仮想ブロックに属するアドレスを指定したライト要求をストレージコントローラ２００から受け付けた場合、その仮想ブロックに実ブロックを割り当てることができる。
【００６１】
ページデータ格納量２１０４、及び、ページ圧縮後データ格納量２１０５は、それぞれ、当該実ページの基になっているフラッシュパッケージグループ２８０を構成するフラッシュパッケージ２３０の数だけ存在する（つまり、各実ページは、フラッシュパッケージグループ２８０を構成する複数のフラッシュパッケージ２３０に基づく記憶領域で良い）。ただし、これらの情報は、この実ページに含まれる仮想ブロックの属性情報ではなく、この実ページに対応する仮想ページのデータに関する属性情報である。したがって、この仮想ページが別の実ページに割り当てられ、現在の実ページのデータが新しい実ページにコピーされた場合、ページデータ格納量２１０４及びページ圧縮後データ格納量２１０５は、新しい実ページの管理情報として引き継がれる。ページデータ格納量２１０４は、当該実ページに格納したデータ量である。ページ圧縮後データ格納量２１０５は、当該実ページに格納した圧縮後のデータ量である。以上の二つの値（データ量）は、フラッシュパッケージ２３０から受け取った情報に基づき、算出される。
【００６２】
移動中フラグ２１０９、移動先実ページ情報２１１０、移動待ちフラグ２１１１は、当該実ページのデータを別の実ページに移動するときに使用される情報である。移動中フラグ２１０９は、この実ページのデータを別の実ページに移動中のときにONにされるフラグである。移動先実ページ情報２１１０は、この実ページのデータを移動している移動先の実ページのアドレスを表す情報である。移動待ちフラグ２１１１は、当該実ページ内のデータを移動すると決定したときにONにされるフラグである。
【００６３】
図８は、フラッシュパッケージ情報２５００の形式である。
【００６４】
フラッシュパッケージ情報２５００は、フラッシュパッケージ２３０ごとに存在する。フラッシュパッケージ情報２５００は、フラッシュパッケージID２５０１、フラッシュパッケージ仮想容量２５０２、及び、仮想ブロック容量２５０３を含む。
【００６５】
フラッシュパッケージID２５０１は、当該フラッシュパッケージ２３０の識別子である。
【００６６】
フラッシュパッケージ仮想容量２５０２は、当該フラッシュパッケージ２３０の仮想容量を表す。
【００６７】
仮想ブロック容量２５０３は、仮想ブロックの容量である。フラッシュパッケージ仮想容量２５０２が表す値を仮想ブロック容量２５０３を表す値で割った値が、このフラッシュパッケージ２３０に基づく仮想ブロックの数となる。本実施例では、このフラッシュパッケージ仮想容量２５０２を表す値が、フラッシュパッケージ２３０の圧縮率などにより調整される。すでに述べたが、本実施例では、フラッシュパッケージ２３０がそのパッケージ２３０の仮想容量を決定するが、その仮想容量は、ストレージコントローラ２００が決定してもよい。フラッシュパッケージ２３０から、仮想容量が変化した旨の通知を受けると、ストレージコントローラ２００は、この値を、フラッシュパッケージ仮想容量２５０２に設定する。
【００６８】
図９は、フラッシュパッケージグループ情報２３００の形式を示す。
【００６９】
フラッシュパッケージグループ情報２３００は、フラッシュパッケージグループ２８０ごとに存在する。フラッシュパッケージグループ情報２３００は、フラッシュパッケージグループID２３０１、パッケージグループRAIDタイプ２３０２、実ページ数２３０３、空き実ページ数２３０４、フラッシュパッケージポインタ２３０５、及び、使用不可実ページ数２３０６を含む。
【００７０】
フラッシュパッケージグループID２３０１は、当該フラッシュパッケージグループ２８０の識別子である。
【００７１】
パッケージグループRAIDタイプ２３０２は、当該フラッシュパッケージグループ２８０のRAIDタイプである。本実施例におけるRAIDタイプは、論理ボリュームRAIDタイプ２００３を説明したときに述べたとおりである。
【００７２】
実ページ数２３０３は、フラッシュパッケージグループ２８０に基づく実ページの数を表す。空き実ページ数２３０４は、フラッシュパッケージグループ２８０に基づく複数の実ページのうちの空きの実ページ（空きの実ページ）の数を表す。使用不可実ページ数２３０６は、フラッシュパッケージグループ２８０に基づく複数の実ページのうちの使用不可能な実ページの数を表す。すでに述べたように、本実施例における１つの特徴は、圧縮率によって、フラッシュパッケージ２３０の仮想容量が変化する点である。フラッシュパッケージ２３０の仮想容量が変化したとき、実ページ数２３０３及び空き実ページ数２３０４も変化する。以下、これを説明する。まず、当該フラッシュパッケージ２３０の仮想容量が変化すると、当該フラッシュパッケージグループ２８０の実ページの数も変化することになる。これを、具体的に示す。まず、ＲＡＩＤの考え方から、同一フラッシュパッケージグループ２８０内のフラッシュパッケージ２３０では使用可能な容量は等しいことが前提となる。故に、式は、
実ページ数２３０３＝（フラッシュパッケージグループ２８０内のフラッシュパッケージ２３０の最小のフラッシュパッケージ仮想容量２５０２）＊（フラッシュパッケージグループ２８０内のフラッシュパッケージ２３０の数）／（実ページサイズ）、
になる。従って、当該フラッシュパッケージグループ２８０内のフラッシュパッケージ２３０の最小のフラッシュパッケージ仮想容量２５０２が変化した場合、実ページ数２３０３も変化する。同様に、空き実ページ数２３０４も変化する。逆に、これは、使用不可になった実ページの数も変化したことになるので、使用不可実ページ数２３０６も変化することになる。例えば、実ページ数２３０３が、１０増加した場合、空き実ページ数２３０４も１０増加し、使用不可実ページ数２３０５は１０減少する。なお、すでに、述べたが、本実施例では、フラッシュパッケージ２３０がこの容量を決定するが、ストレージコントローラ２００が決定してもよい。
【００７３】
フラッシュパッケージポインタ２３０５は、当該フラッシュパッケージグループ２８０に属するフラッシュパッケージ２３０のフラッシュパッケージ情報２５００へのポインタである。フラッシュパッケージポインタ２３０５の数は、当該フラッシュパッケージグループ２８０に属するフラッシュパッケージ２３０の数であるが、これは、パッケージグループRAIDタイプ２３０２によって決まる値である。
【００７４】
図４に示した空きページ管理情報ポインタ２２００は、フラッシュパッケージグループ２８０ごとに設けられる情報である。
【００７５】
図１０は、空きページ管理情報ポインタ２２００によって管理される空き実ページの集合を表している。
【００７６】
この構造を、空きページ管理情報キュー２２０１と呼ぶ。空き実ページとは、仮想ページに割り当てられていない実ページ（仮想ページに空きの実ページ）を意味する。また、空き実ページに対応した実ページ情報を空き実ページ情報２１００と呼ぶ。空きページ管理情報ポインタ２２００は、先頭の空き実ページ情報２１００のアドレスをさす。次に、先頭の実ページ情報２１００の中の空きページポインタ２１０３が次の空き実ページ情報２１００を指す。図１０では、最後の空き実ページ情報２１００の空き実ページポインタ２１０３は、空きページ管理情報ポインタ２２００を示しているが、ヌル値でもよい。ストレージコントローラ２００は、実ページを割り当てていない仮想ページに書き込み要求を受け付けると、論理ボリュームRAIDタイプ２００３と同一のフラッシュパッケージグループ２８０の中のいずれか、例えば、空き実ページ数の最も多いフラッシュパッケージグループ２８０の空きページ管理情報ポインタ２２００から、空き実ページを探し、見つかった空き実ページを仮想ページに割り当てる。
【００７７】
図４に示した使用不可ページ管理情報ポインタ２７００は、フラッシュパッケージグループ２８０ごとに設けられる情報である。
【００７８】
図１１は、使用不可ページ管理情報ポインタ２７００によって管理される使用不可実ページの集合を表している。
【００７９】
この構造を、使用不可ページ管理情報キュー２７０１と呼ぶ。その構造は、空きページ管理情報キュー２２０１と同じである。フラッシュパッケージ２３０の仮想容量が少なくなり、実ページ数２３０３の数が少なくなった場合、その数だけ、空きページ管理情報キュー２２０１で管理されている実ページ情報２１００が、使用不可ページ管理情報キュー２７０１に移される。逆に、フラッシュパッケージ２３０の仮想容量が多くなり、実ページ数２３０３の数が多くなった場合、その数だけ、使用不可ページ管理情報キュー２７０１で管理されている実ページ情報２１００が、空きページ管理情報キュー２２０１に移される。本実施例では、ストレージコントローラ２００が、上位レベルの容量仮想化機能、フラッシュパッケージ２３０が下位レベルの容量仮想化機能をもつ。このため、ストレージコントローラ１１０は、フラッシュパッケージ２３０の仮想容量が変化しても、実ページ情報２１００をすでに説明したような方法で移動させるだけで良い。実ページ情報２１００が使用不可ページ管理情報キュー２７０１に関連付けられた場合、その実ページ情報２１００に対応する実ページは、仮想ページに割り当てられなくなり、その実ページに含まれている仮想ブロックにはアクセスが発生しない。このため、実ブロックを他の仮想ブロックに割り当てることができる。つまり、実ブロックを有効に使用することができる。
【００８０】
次に、フラッシュパッケージ２３０が有する管理情報について説明する。フラッシュパッケージ２３０は、パッケージメモリ３２０内に管理情報をもつ。
【００８１】
図１２は、パッケージメモリ３２０に格納される管理情報を示している。
【００８２】
パッケージメモリ３２０に、パッケージ情報３０００、チップ情報３１００、仮想ブロック情報３２００、実ブロック情報３３００、及び、空き実ブロック情報ポインタ３４００が格納される。これらの情報のうちの少なくとも１種類の情報が、下位レベルの容量仮想化技術及び／又は圧縮技術を実現するために使用される。本実施例では、フラッシュパッケージ２３０が、下位レベルの容量仮想化技術及び圧縮技術を実現する。ただし、本発明は、下位レベルの容量仮想化技術及び圧縮技術をストレージコントローラ２００が実現してもよい。この場合、図１３に示すように、図１２に示した情報とほぼ同様の情報が、共有メモリ２２０に格納されることになる。図１３に示した構成では、図１３に示した情報を、ストレージコントローラ２００が参照及び更新するので、図１２に示したそれぞれの情報とは、若干相違が生ずる。したがって、本実施例では、フラッシュパッケージ２３０が、下位レベルの容量仮想化技術、圧縮技術を実現するものとする。
【００８３】
図１４は、パッケージ情報３０００の形式である。
【００８４】
パッケージ情報３０００は、パッケージID３００１、仮想パッケージ容量３００２、実パッケージ容量３００３、フラッシュブロック容量３００４、パッケージブロック容量３００５、パッケージデータ格納量３００６、パッケージ圧縮データ格納量３００７、内部情報格納ブロック数３００９、及び、内部情報格納ブロックアドレス３０１０を含む。
【００８５】
パッケージID３００１は、当該フラッシュパッケージ２３０の識別子である。
【００８６】
仮想パッケージ容量３００２は、ストレージコントローラ２００から見た当該フラッシュパッケージ２３０の仮想容量を表す。本実施例の１つの特徴は、圧縮率の変化によって、この仮想容量を、フラッシュパッケージ２３０が調整する点である。すでに述べたように、この調整は、ストレージコントローラ２００が実施してもよい。
【００８７】
実パッケージ容量３００３は、当該フラッシュパッケージグループ２８０の物理容量、具体的には、当該フラッシュパッケージグループ２８０内にストレージコントローラ２００が実際にデータを物理的に格納できる容量を表す。
【００８８】
フラッシュブロック容量３００４は、フラッシュメモリの消去単位であるブロックの物理的な容量を表す。
【００８９】
パッケージブロック容量３００５は、フラッシュパッケージ２３０における実ブロックの容量を表す。
【００９０】
パッケージデータ格納量３００６は、ストレージコントローラ２００から受けたライトデータの圧縮前の合計値を表す。
【００９１】
パッケージ圧縮データ格納量３００７は、ストレージコントローラ２００から受けたライトデータの圧縮後の合計値を表す。
【００９２】
内部情報格納ブロック数３００９は、内部情報（パッケージメモリ３２０に格納されたパッケージ情報３０００、チップ情報３１００、仮想ブロック情報３２００、実ブロック情報３３００及び空き実ブロック情報ポインタ３４００を含んだ情報）の退避先のブロックの数である。内部情報は、例えば、電源OFF時又は障害発生時に退避される。
【００９３】
内部情報格納ブロックアドレス３０１０は、内部情報が格納されている記憶領域のアドレス（パッケージメモリ３２０における格納領域のアドレス）を表す。重要な情報（例えば、パッケージ情報３０００、チップ情報３１００、仮想ブロック情報３２００、実ブロック情報３３００、空き実ブロック情報ポインタ３４００）は、ｎ重に格納されてもよい。また、退避される回数はそう多くないので、ブロックの消去回数なども問題にならないと考えられる。
【００９４】
当該フラッシュパッケージ２３０がもつ実ブロックの総数を表す情報が、パッケージ情報３０００に含まれて良い。例えば、内部情報格納ブロック数３００９の他に、フラッシュパッケージ２３０から割り当て可能なブロックの数、フラッシュパッケージ２３０に基づく障害ブロックの数等を表す情報が、パッケージ情報３０００に含まれていても良い。
【００９５】
図１５は、チップ情報３１００の形式である。
【００９６】
チップ情報３１００は、フラッシュチップ３００ごとに存在する情報である。チップ情報３１００は、チップID３１０１、チップ内実ブロック数３１０２、チップ内空き実ブロック数３１０３、及び、接続バスID３１０４を含む。
【００９７】
チップID３１０１は、当該フラッシュチップ３００の識別子である。
【００９８】
チップ内実ブロック数３１０２は、当該フラッシュチップ３００がもつ実ブロックの数を表す。
【００９９】
チップ内空き実ブロック数３１０３は、当該フラッシュチップ３００の中の空き実ブロックの数を示している。空き実ブロックとは、仮想ブロックに割り当てられていない実ブロック（仮想ブロックに割り当て可能な実ブロック）である。
【０１００】
接続バスID３１０４は、当該フラッシュチップ３００が接続されているパッケージバス３４０の識別子である。
【０１０１】
図１６は、仮想ブロック情報３２００の形式である。
【０１０２】
仮想ブロック情報３２００は、仮想ブロックグループごとに存在する情報である。仮想ブロック情報３２００は、仮想ブロックのアドレス順に並んでいるものとする。最初の仮想ブロック情報３２００が、先頭の仮想ブロックからｍ個の仮想ブロックに対応する。仮想ブロック情報３２００は、仮想ブロックグループ識別子３２０１、実ブロック情報ポインタ３２０２、データ格納量３２０３、圧縮データ格納量３２０４、仮想セグメントアドレスポインタ３２０５、及び、圧縮仮想セグメントデータ量３２０６を含む。当該実施例では、フラッシュメモリの読み書き単位は「セグメント」と呼ばれる。フラッシュメモリの読み書き単位は、通常、ページと呼ばれるが、本実施例は、ページは、ストレージコントローラ２００が行う容量仮想化の単位であるため、混同を避けるために、フラッシュメモリの読み書き単位は、「セグメント」と呼ぶ。本実施例では、フラッシュメモリに書き込むデータは、圧縮され、圧縮されたデータがフラッシュメモリに格納される。圧縮されたデータを格納する、フラッシュメモリのセグメントを、「実セグメント」と呼ぶことがある。圧縮前の仮想的なセグメントを、「仮想セグメント」と呼ぶことがある。本実施例では、１つ以上の仮想セグメントが、圧縮され実セグメントに格納される。
【０１０３】
仮想ブロック識別子３２０１は、対応する仮想ブロックグループの識別子である。
【０１０４】
実ブロック情報ポインタ３２０２は、対応する仮想ブロックグループにおける仮想ブロックに割り当てられた実ブロックの実ブロック情報３３００へのポインタである。実ブロック情報ポインタ３２０２は、（ｍ＋１）個存在する。実ブロック情報ポインタ３２０２は、実ブロックを割り当ていないときには、ヌル値である。当該仮想ブロックグループに割り当てられている実ブロックの数をｋ個（ｋは（ｍ＋１）以下）とすると、先頭からｋ個の実ブロック情報ポインタ３２０２が有効である。
【０１０５】
データ格納量３２０３は、当該仮想ブロックグループに格納されている圧縮前のデータ量をあらわす。最大容量は、仮想ブロックグループの容量となる。圧縮データ格納量３２０４は、当該仮想ブロックグループに格納されている圧縮後のデータの格納量である。なお、フラッシュメモリの場合、仮想セグメントの内容が書き換えられると、別の実ブロックに格納するため、同一の仮想セグメントのデータが複数個所に存在する。データ格納量３２０３及び圧縮データ格納量３２０４は、それぞれ、最新の仮想セグメントの格納量に基づき算出された値である。
【０１０６】
仮想セグメントアドレスポインタ３２０５は、対応する仮想セグメントが、当該仮想ブロックグループに割り当てた実ブロックに対応する実ブロック情報３３００のうち何番目の情報かを示す識別子と、その実ブロック内のどのアドレスに格納されているかを示すポインタとを表す。圧縮仮想セグメントデータ量３２０６は、対応する仮想セグメントの圧縮後のデータ量を表す。なお、本実施例では、仮想セグメントアドレスポインタ３２０５、及び、圧縮仮想セグメントデータ量３２０６は、仮想セグメントごとに存在するが、２つ以上の仮想セグメントごとに情報３２０５及び３２０６のうちの少なくとも一方が存在しても、本発明は有効である。
【０１０７】
図１７は、実ブロック情報３３００の形式である。
【０１０８】
実ブロック情報３３００は、実ブロックごとに存在する情報である。実ブロック情報３３００は、実ブロックID３３０１、空き実ブロックポインタ３３０２、及び、実ブロック内空き容量３３０４を含む。
【０１０９】
実ブロックID３３０１は、対応する実ブロックの識別子であり、例えば、この実ブロックが、どのフラッシュチップ３００のどのアドレスに相当するブロックかを示す。
【０１１０】
空き実ブロックポインタ３３０２は、対応する実ブロックが仮想ブロックに割り当てられていない（空き状態にある）時、次の空き状態にある実ブロックの実ブロック情報３３００を指している。
【０１１１】
実ブロック内空き容量３３０４は、対応する実ブロックの現在の空き容量を示す。パッケージプロセッサ３１０は、対応する実ブロックに対し、空き容量以下のライトデータを格納できる。パッケージプロセッサ３１０は、ライトデータを格納した後、格納したライトデータの量だけ、実ブロック内空き容量３３０４を削減する。
【０１１２】
空き実ブロック情報ポインタ３４００は、フラッシュチップ３００対応に存在する。図１８は、空き実ブロック情報ポインタ３４００によって管理される空き実ブロックの集合を表している。空きブロック情報ポインタ３４００は、先頭の空き実ブロックの実ブロック情報３３００のアドレスをさす。次に、先頭の空き実ブロックの実ブロック情報３３００の中の空き実ブロックポインタ３３０２が、次の空き実ブロックの実ブロック情報３３００を示す。図１８では、最後の空き実ブロックの実ブロック情報３３００の空き実ブロックポインタ３３０２は、空きブロック情報ポインタ３４００を示しているが、ヌル値でもよい。パッケージプロセッサ３１０は、実ブロックを割り当てていない仮想ブロックに属するアドレスを指定したライト要求をストレージコントローラ２００から受けると、フラッシュチップ３００の中のいずれかから（例えば、空き実ブロックの数の最も多いフラッシュチップ３００に対応する空きブロック情報ポインタ３４００を基に）、空き実ブロックを探し、見つけた空き実ブロックを仮想ブロックに割り当てる。パッケージプロセッサ３１０は、割り当てた空き実ブロックに、上記受けたライト要求に従うデータを書き込む。
【０１１３】
次に、上記に説明した管理情報を用いて、ストレージコントローラ２００及びフラッシュパッケージ２３０が実行する動作の説明を行う。
【０１１４】
まず、ストレージコントローラ２００の動作を説明する。ストレージコントローラ２００の動作は、ストレージコントローラ２００内のプロセッサ２６０が実行し、そのプログラムは、メモリ２７０内に格納されている。
【０１１５】
図１９は、メモリ２７０に格納されているプログラムが示されている。
【０１１６】
本実施例に関するプログラムとしては、例えば、リード処理実行部４０００、ライト要求受付部４１００、ライトアフタ処理実行部４２００、ライトセイムコマンド処理実行部４３００、及びページ移動処理実行部４５００がある。これらのプログラムのうちの少なくとも１つが、上位レベルの容量仮想化技術を実現するプログラムである。なお、すでに述べたが、本実施例は、下位レベルの容量仮想化技術を実現するのは、フラッシュパッケージ２３０であるが、下位レベルの容量仮想化技術をストレージコントローラ２００が実行してもよい。その場合、下位レベルの容量仮想化技術は、ストレージコントローラ２００で実行される。したがって、上位レベルのプログラムと下位レベルのプログラムの双方が、ストレージコントローラ２００で実行されるので、プログラム間のインターフェイスが異なってくるが、基本的に大きな相違はない。本実施例では、下位レベルの容量仮想化技術を実現するのは、フラッシュパッケージ２３０であることを前提に、リード処理実行部４０００、ライト要求受付部４１００、ライトアフタ処理実行部４２００、ライトセイムコマンド処理実行部４３００、ページ移動処理実行部４５００の処理フローを詳細に説明する。なお、本実施例では、ホスト１１０からのリード要求、ライト要求、ライトセイムコマンドは、フラッシュメモリのリード・ライト単位であるセグメント（一般のフラッシュメモリの用語ではページ）境界で発行されるものとする。もちろん、本発明は、ホスト１１０からのリード要求、ライト要求、ライトセイムコマンドが、セグメントの一部のみを指定した場合にも有効である。
【０１１７】
また、以下の説明では、プログラムを主語として処理を説明する場合があるが、プログラムは、プロセッサ（例えばＣＰＵ（Central  Processing  Unit））によって実行されることで、定められた処理を、適宜に記憶資源（例えばメモリ）を用いながら行うため、処理の主語がプロセッサとされてもよい。プログラムを主語として説明された処理は、ストレージコントローラ、フラッシュパッケージ、或いはストレージシステムが行う処理としても良い。
【０１１８】
図２０は、リード処理実行部４０００の処理フローである。リード処理実行部４０００は、ストレージコントローラ２００が、ホスト１１０からリード要求を受け付けたときに実行される。
【０１１９】
ステップ５０００：リード処理実行部４０００は、リード元仮想ページ（ホスト１１０からのリード要求で指定されているリード対象アドレスが属する仮想ページ）に対する、リード元仮想ページ内の相対アドレスを計算する。
【０１２０】
ステップ５００１：リード処理実行部４０００は、リード対象となったデータが、キャッシュメモリ２１０にヒットしているかをチェックする。これは、公知の技術である。ヒットしている場合、ステップ５０１０へジャンプする。
【０１２１】
ステップ５００２：ミスしている場合、まず、リード処理実行部４０００は、フォーマット情報２００５が有効かをチェックする。有効でなければ、ステップ５００４へジャンプする。
【０１２２】
ステップ５００３：フォーマット情報２００５が有効な場合、そのフォーマット情報２００５は、リード元領域（特定された相対アドレスに従う記憶領域）に繰り返し情報が格納されていることを意味する。このため、リード処理実行部４０００は、キャッシュメモリ２１０上に、この繰り返し情報を格納して、ステップ５０１０へジャンプする。
【０１２３】
ステップ５００４：ここでは、リード対象としているデータをキャッシュメモリ２１０にロードする必要がある。ます、当該ステップでは、リード処理実行部４０００は、リード元仮想ページに割り当てられている実ページに対応する実ページ情報２１００を、論理ボリューム情報２０００の実ページポインタ２００４から獲得する。
【０１２４】
ステップ５００５：リード処理実行部４０００は、獲得した実ページ情報２１００のパッケージグループ２１０１及び実ページアドレス２１０２を基に、リード元仮想ページに割り当てられている実ページ（図２０においてリード元実ページ）の基になっているフラッシュパッケージグループ（図２０においてリード元パッケージグループ）２８０と、リード元パッケージグループ２８０内の相対アドレスとを特定する。
【０１２５】
ステップ５００６：リード処理実行部４０００は、ステップ５００５で得たリード元パッケージグループ２８０内の相対アドレスと、リード元パッケージグループ２８０に対応したパッケージグループ内ＲＡＩＤタイプ２３０２とを基に、リード元実ページ内の相対アドレスを算出する。リード処理実行部４０００は、算出した実ページ内相対アドレスと、リード元パッケージグループに対応するパッケージグループ内ＲＡＩＤタイプ２３０２及びフラッシュパッケージポインタ２３０５とを基に、どのフラッシュパッケージ２３０のどのアドレスにアクセスするかを特定する。
【０１２６】
ステップ５００７：リード処理実行部４０００は、ステップ５００６で特定したフラッシュパッケージ２３０に対し、ステップ５００６で特定したアドレスを指定したリード要求を送信する。
【０１２７】
ステップ５００８：リード処理実行部４０００は、ステップ５００７でのリード要求の送信先のフラッシュパッケージ２３０からデータが送られてくるのを待つ。
【０１２８】
ステップ５００９：リード処理実行部４０００は、ステップ５００７でのリード要求に応答してフラッシュパッケージ２３０から送られてきたデータをキャッシュメモリ２１０に格納する。
【０１２９】
ステップ５０１０：リード処理実行部４０００は、ステップ５００９でキャッシュメモリ２１０に格納したデータ（リードデータ）をホスト１１０へ送り、処理を完了する。
【０１３０】
図２１は、ライト要求受付部４１００の処理フローである。ライト要求受付部４１００は、ストレージコントローラ２００がホスト１１０からライト要求を受け付けたときに実行される。
【０１３１】
ステップ６０００：ライト要求受付部４１００は、ライト先仮想ページ（ホスト１１０からのライト要求が指定するライト対象アドレスが属する仮想ページ）に対する、ライト先仮想ページ内の相対アドレスを計算する。
【０１３２】
ステップ６００１：ライト要求受付部４１００は、ライト先ボリューム（ライト要求で指定されている論理ボリューム）に対応した論理ボリューム情報２０００内の実ページポインタ２００４を基に、ライト先仮想ページに実ページが割り当てられているかをチェックする。割り当てられている場合、ステップ６００５へジャンプする。
【０１３３】
ステップ６００２：当該ステップでは、ライト要求受付部４１００は、ライト先仮想ページに実ページを割り当てる。ライト先ボリュームに対応する論理ボリューム情報２０００内のＲＡＩＤタイプ２００２と、フラッシュパッケージグループ情報２３００内のパッケージグループＲＡＩＤタイプ２３０２及び空き実ページ数２３０４等を基に、ライト要求受付部４１００は、どのフラッシュパッケージグループ２８０に基づく実ページを割り当てるかを決める。その後、ライト要求受付部４１００は、決定したフラッシュパッケージグループ（ライト先パッケージグループ）２８０に対応する空きページ管理情報ポインタ２２００を基に、先頭の空き実ページ情報２１００を、当該実ページポインタ２００４が示すようにする。これにより、ライト先仮想ページに実ページが割り当てられたことになる。なお、空きページ管理情報ポインタ２２００は、次の実ページ情報２１００（仮想ページに割り当てた実ページの実ページ情報２１００の中の空きページポインタ２１０３が示す実ページ情報２１００）を示すようにし、さらに、仮想ページに割り当てた実ページの実ページ情報２１００の中の空きページポインタ２１０３をヌルにする。また、ライト要求受付部４１００は、当該実ページに対応するフラッシュパッケージグループ管理情報の空き実ページ数２３０４の数を減らす。仮想ページを実ページに割り当てる処理を、本実施例では、ライト要求を受け付けたときに実施されるが、本発明では、この割り当て処理は、フラッシュパッケージ２３０へデータを格納するまでに実行されればよい。
【０１３４】
ステップ６００３：ライト要求受付部４１００は、フォーマット情報２００５が有効であるかをチェックする。有効でなければ、ステップ６００５へジャンプする。
【０１３５】
ステップ６００４：ライト要求受付部４１００は、フォーマット情報２００５を無効にする。
【０１３６】
ステップ６００５：ライト要求受付部４１００は、ホスト１１０からのライト要求に従うライトデータを、キャッシュメモリ２１０に格納する。
【０１３７】
フラッシュパッケージグループ２８０は、ＲＡＩＤ構成をとるので、キャッシュメモリ２１０上に格納したライトデータに対して、冗長データを生成する必要がある。ただし、これは、公知の方法であるので、詳細に説明はしない。また、実ページの中には、冗長データを格納する領域も含まれているので、ライトデータに対応する冗長データの実ページ内の格納アドレスも一意に定まる。冗長データも、一度、キャッシュメモリ２１０に格納する。なお、キャッシュメモリ２１０上の冗長データも、ライトデータと同様に、どのフラッシュパッケージ２３０のどのアドレスに書き込むべきかを示す情報をつけておく。ライトデータ、冗長データは、ライトアフタ処理実行部４２００によって、フラッシュパッケージ１６０に書き込まれるが、ライトアフタ処理実行部４２００から見ると、いずれもフラッシュパッケージ２３０へ書き込むデータなので、両者を区別する必要はない。同様に、フラッシュパッケージ２３０も、両者を区別する必要はない。
【０１３８】
図２２は、ライトアフタ処理実行部４２００の処理フローである。ライトアフタ処理実行部４２００は、プロセッサ２６０によって適宜に実行される。ライトアフタ処理実行部４２００は、ホスト１１０からのライトデータ（及び冗長データ）をフラッシュパッケージ２３０に書き込む。ライトアフタ処理実行部４２００は、ライトデータ、冗長データの両者を、フラッシュパッケージ２３０に書き込むべきデータとして、両者を区別せずに処理する。
【０１３９】
ステップ７０００：ライトアフタ処理実行部４２００は、キャッシュメモリ２１０をサーチして、フラッシュパッケージ２３０に書き込むべきデータを決める。ライトアフタ処理実行部４２００は、見つけたデータに関連付けられている情報（例えば、フラッシュパッケージ２３０のＩＤとそのパッケージ２３０におけるライト先アドレスに関する情報）を特定し、特定されたライト先（例えば、フラッシュパッケージ２３０のＩＤ及びライト先アドレス）を指定したライト要求を、ライト先のフラッシュパッケージ２３０に発行する。なお、このとき、ライトアフタ処理実行部４２００は、ライト先に属する仮想ページに割り当てられている実ページに対応する実ページ情報２１００の移動中フラグ２１０９をチェックして、そのフラグ２１０９がｏｎの場合、その実ページは移動中であるため、当該ライト先を指定したライト要求の実行を中止し、別のデータをキャッシュメモリ２１０から探す。
【０１４０】
ステップ７００１：ライトアフタ処理実行部４２００は、ライトデータをフラッシュパッケージ２３０へ送る。
【０１４１】
ステップ７００２：ライトアフタ処理実行部４２００は、フラッシュパッケージ２３０からライト要求の完了報告を待つ。
【０１４２】
ステップ７００３：ライトアフタ処理実行部４２００は、フラッシュパッケージ２３０からの当該ライト要求に関する完了報告をチェックする。完了報告は、例えば、データ格納量（ステップ７００１で送ったライトデータの量）及び圧縮後データ量（ステップ７００１で送ったライトデータの圧縮後の量）を表す情報を含む。この情報は、完了報告とは別のタイミングで、フラッシュパッケージ２３０からストレージコントローラ２００に送られても良い。ライトアフタ処理実行部４２００は、当該ライト要求に対する完了報告が含む情報が表すデータ格納量及び圧縮後データ量を特定し、ライト先の実ページに対応するページデータ格納量２１０４に、特定したデータ格納量を加算し、且つ、ライト先の実ページに対応するページ圧縮後データ格納量２１０５に、特定した圧縮後データ格納量を加算する。
【０１４３】
ステップ７００４：ここでは、ライトアフタ処理実行部４２００は、仮想容量に変化があったフラッシュパッケージ２３０が有るか否かをチェックする。ない場合、処理が終了する。
【０１４４】
ステップ７００５：仮想容量に変化があったフラッシュパッケージ２３０がある場合、ライトアフタ処理実行部４２００は、変化後の仮想容量を、仮想容量に変化があったフラッシュパッケージ２３０に対応するフラッシュパッケージ仮想容量２５０２に設定する。次に、ライトアフタ処理実行部４２００は、仮想容量に変化があったフラッシュパッケージ２３０を含むフラッシュパッケージグループ２８０を構成する複数のフラッシュパッケージ２３０に対応した複数のフラッシュパッケージ仮想容量２５０２のうちの最小値が変化したかをチェックする。変化した場合、この変化値にあわせて、ライトアフタ処理実行部４２００は、そのフラッシュパッケージグループ２８０に対応する実ページ数２３０３及び空き実ページ数２３０４を更新する。また、ライトアフタ処理実行部４２００は、その数にあわせて、空きページ管理情報キューと使用不可ページ管理情報キューの間で、実ページ情報２１００を移動する。その後、ライトアフタ処理実行部４２００は、ページ移動処理（ページ移動処理実行部４５００）をコールする。その後、ライトアフタ処理実行部４２００は、処理を完了する。
【０１４５】
図２３は、ライトセイムコマンド処理実行部４３００の処理フローである。ライトセイムコマンド処理実行部４３００は、ライトセイムコマンドを、ストレージコントローラ２００がホスト１１０から受けたときに実行される。ライトセイムコマンドは、ストレージシステム１００の容量仮想化機能に対応して設けられた機能である。ライトセイムコマンドは、ある記憶領域に短いデータパターンを繰り返し書き込むよう指示するコマンドである。ストレージシステム１００は、このデータパターンをフラッシュメモリに書き込むのではなく、指定された記憶領域を含む仮想ページにそのデータパターンが繰り返し格納されているということを記憶して、その仮想ページに実ページが割り当てられていればその実ページを解放する。これにより、使用される実ページの数を削減することができる。一般的に、ＨＤＤ（Hard  Disk  Drive）が記憶媒体として採用されているシステムでの容量仮想化機能においては、実ページの解放の際に、ＨＤＤの物理的な処理は発生しない。しかし、フラッシュメモリが記憶媒体として採用される本実施例では、実ブロックを他の仮想ブロックに割り当てるためには、実ブロックの消去処理を実行する必要がある。したがって、実ブロックの解放には、その実ブロックの消去処理を行うことになる。本実施例では、ストレージコントローラ２００が、ライトセイムコマンドを受けたとき、フラッシュパッケージ２３０に、実ブロックの消去処理を要求する。また、ライトセイムコマンドを、フラッシュパッケージ２３０に送り、以上の処理をフラッシュパッケージ２３０が実行しても本発明は有効である。あるいは、ホスト１１０が、ある記憶領域を解放せよという、より直接的なコマンドを発行して、ストレージコントローラ２００、あるいは、フラッシュパッケージ２３０が、ライトセイムコマンドを受け取ったときと同じ処理を実行しても本発明は、有効である。なお、通常のライトコマンドで、オール０などの繰り返し情報を書き込んだ場合にも、ストレージコントローラ２００、あるいは、フラッシュパッケージ２３０が、繰り返し情報を認識して、ライト先の仮想ブロックに割り当てられている実ブロックを解放させても、本発明は有効である。
【０１４６】
ステップ８０００：ライトセイムコマンド処理実行部４３００は、受けたライトセイムコマンドで指定されたライト先情報（例えばアドレス）を基に、当該コマンドの処理対象となる仮想ページの集合を判別する。また、この際、仮想ページ全体が、当該コマンドの処理対象となっているものと、仮想ベージの一部が処理対象となっているものに分類する。仮想ページ全体が指定されている場合、ライトセイムコマンド処理実行部４３００は、その仮想ページに対応するフォーマット情報２００５に、データパターンを設定する。
【０１４７】
ステップ８００１：次に、フラッシュパッケージ２３０に送る情報について述べる。フラッシュパッケージ２３０のアドレス空間は、仮想セグメントベースの仮想アドレス空間なので、本実施例では、ライトセイムコマンドで指定された領域を、フラッシュパッケージのアドレス空間に変換して、要求をおくる。（この変換は、公知の技術なので、詳細に説明しない。）ただし、ＲＡＩＤ５のように、Ｎ個のデータから１つの冗長データを生成する場合、当該コマンドで、ストライプグループ全体のＮ個のデータを格納した領域が指定されたとき、冗長データを格納した領域を解放することができる。一方、Ｎ個のうちの一部の領域しか指定されなかった場合、その繰り返し情報を冗長データに反映させる必要があるので、その冗長データを格納した領域は更新される必要がある。当該ステップでは、当該コマンドの指定により、更新が必要な領域と、解放可能な領域とに分類される。
【０１４８】
ステップ８００２：データの更新が必要な領域がない場合、ステップ８００４へジャンプする。
【０１４９】
ステップ８００３：ライトセイムコマンド処理実行部４３００は、フラッシュパッケージ２３０に書き込む、冗長データを生成し、その冗長データをキャッシュメモリ２１０に格納する。この際、どのプラッシュパッケージ２３０のどの領域に書き込むのかという情報が、その冗長データに関連付けられる。この後、指定された繰り返し情報は、図２２に示したライトアフタ処理部４２００によって、フラッシュパッケージ２３０へ書き込まれる。この後、解放できる領域がない場合、処理が終了する。
【０１５０】
ステップ８００４：ライトセイムコマンド処理実行部４３００は、ステップ８００１で判別したフラッシュパッケージ２３０とその記憶領域を、そのフラッシュパッケージ２３０へ伝え、対応する領域の解放を要求する。なお、ここでは、フラッシュパッケージ２３０に要求する領域は、実ページ単位に分割されて発行されるものとする。当然、実ページに含まれるすべての領域が指定される場合と、一部の仮想領域が指定されるケースがある。この要求は、フラッシュパッケージグループ２８０を構成する一つ以上の任意の個数のフラッシュパッケージ２３０に発行される。
【０１５１】
ステップ８００５：ライトセイムコマンド処理実行部４３００は、ステップ８００４での要求の発行先のフラッシュパッケージ２３０から処理報告を待つ。
【０１５２】
ステップ８００６：ライトセイムコマンド処理実行部４３００は、フラッシュパッケージ２３０から当該要求に関する完了報告をチェックする。まず、ライトセイムコマンド処理実行部４３００は、当該要求に対してフラッシュパッケージ２３０から受けた完了報告が含む情報から、データ格納量及び圧縮後データ量を表す情報の処理を行う。具体的には、ライトセイムコマンド処理実行部４３００は、１つの実ページに含まれる仮想ブロックグループに対応したデータ格納量と圧縮データ格納量の変化値を、その実ページに対応するページデータ格納量２１０４と、ページ圧縮後データ格納量２１０５に加算する。
【０１５３】
ステップ８００７：ここでは、ライトセイムコマンド処理実行部４３００は、それぞれのプラッシュパッケージ２３０の仮想容量に変化があったか否かをチェックする。仮想容量に変化があったフラッシュパッケージ２３０が一つもない場合、ステップ８００９へジャンプする。
【０１５４】
ステップ８００８：ライトセイムコマンド処理実行部４３００は、変化後の仮想容量を、仮想容量に変化があったフラッシュパッケージ２３０に対応するフラッシュパッケージ仮想容量２５０２に設定する。次に、ライトセイムコマンド処理実行部４３００は、仮想容量に変化があったフラッシュパッケージ２３０を含むフラッシュパッケージグループ２８０を構成する複数のフラッシュパッケージ２３０に対応した複数のフラッシュパッケージ仮想容量２５０２のうちの最小値が変化したかをチェックする。変化した場合、この変化値にあわせて、ライトセイムコマンド処理実行部４３００は、そのフラッシュパッケージグループ２８０に対応する実ページ数２３０３及び空き実ページ数２３０４を更新する。また、ライトセイムコマンド処理実行部４３００は、その数にあわせて、空きページ管理情報キューと使用不可ページ管理情報キューの間で、実ページ情報２１００を移動する。その後、ライトセイムコマンド処理実行部４３００は、ページ移動処理（ページ移動処理実行部４５００）をコールする。その後、ライトアフタ処理実行部４３００は、処理を完了する。
【０１５５】
ステップ８００９：まだ、解放可能な領域を含む実ページの中で、フラッシュパッケージ２３０に要求を発行していない実ページがあれば、ステップ８００４にジャンプする。なければ、ライトセイムコマンド処理実行部４３００は処理を完了する。
【０１５６】
図２４は、ページ移動処理実行部４５００の処理フローである。ページ移動処理実行部４５００は、ライトアフタ処理実行部４２００、ライトセイムコマンド処理実行部４３００からコールされる。その際、仮想容量に変化があったフラッシュパッケージ２３０を含むフラッシュパッケージグループ２８０が指定される。
【０１５７】
ステップ１１０００：ページ移動処理実行部４５００は、指定されたフラッシュパッケージグループ（図２４の説明において「対象グループ」と言う）２８０に対応する空き実ページ数２３０４が、所定の閾値以下になっていないか否か（つまり、対象グループ２８０に基づく空き容量が多いか否か）を判断する。この判断の結果が否定的の場合、処理が終了する。
【０１５８】
ステップ１１００１：ページ移動処理実行部４５００は、対象グループを構成する複数のフラッシュパッケージ２３０に対応した実ページ情報２１００をサーチし、ページ圧縮後データ格納量２１０５が表す値が大きい実ページ情報２１００を見つける。ページ圧縮後データ格納量２１０５が表す値が大きい実ページとは、対象グループに基づく全実ページのうちページ圧縮後データ格納量２１０５が表す値が上位Ｘ％（Ｘは０より大きい値）である１以上の実ページであっても良いし、ページ圧縮後データ格納量２１０５が表す値が所定の閾値Ｚ（Ｚは０より大きい値）以上である実ページでも良い。ページ移動処理実行部４５００は、見つけた実ページ情報２１００に対応する実ページを、移動の対象候補とし、その実ページに対応する移動待ちフラグ２１１１をオンにする。
【０１５９】
ステップ１１００２：ここでは、ページ移動処理実行部４５００は、移動先となるフラッシュパッケージグループ２８０を選択する。本実施例では、フラッシュパッケージグループ２８０は一つ選択されるが、もちろん、移動先として複数のフラッシュパッケージグループ２８０が選択されても良い。本実施例では、例えば、ページ移動処理実行部４５００は、空き実ページ数２１０４が比較的少ないフラッシュパッケージグループ２８０（例えば空き実ページ数２１０４が最も少ない或いは所定の閾値未満であるフラッシュパッケージグループ２８０）を移動先として選択する。次に、ページ移動処理実行部４５００は、選択した移動先のフラッシュパッケージグループ（図２４の説明において「移動先グループ）２８０の中のどの実ページを移動先とするかを決定する。移動先の実ページを決めると、ページ移動処理実行部４５００は、移動先グループ２８０に対応する空きページ管理情報ポインタ２２００がさす実ページ情報２１００を、移動元の実ページの実ページ情報２１００のコピー先実ページ情報ポインタ２１１０に設定する。ページ移動処理実行部４５００は、空きページ管理情報ポインタ２２００を、次の空きの実ページに対応するページ管理情報２１００に更新する。以上の処理が、ステップ１１００１で移動を決定したすべての実ページに対して実行される。以上で、各移動元実ページについて移動先ページが決まったことになる。
【０１６０】
ステップ１１００３：ここでは、ページ移動処理実行部４５００は、移動元となる実ページの実ページ情報２１００を決定する。具体的には、ページ移動処理実行部４５００は、移動待ちフラグ２１１１がオンになっている実ページ情報２１００を見つける。ない場合、処理が終了し、呼び出し元に戻る。
【０１６１】
ステップ１１００４：ここでは、ページ移動処理実行部４５００は、見つけた実ページ情報２１００に対応する実ページがフラッシュパッケージ２３０のどの領域になるかを算出する。見つかった実ページ情報２１００のパッケージグループ２１０１が示すフラッシュパッケージグループ情報２３００が、該当するフラッシュパッケージグループ情報２３００である。このフラッシュパッケージグループ情報２３００に格納されたフラッシュパッケージポインタ２３０５が示すフラッシュパッケージ情報２５００に対応するフラッシュパッケージ２３０が、コピー元の実ページの基になっているフラッシュパッケージ２３０である。次に、実ページ情報２１００内の実ページアドレス２１０２と、フラッシュパッケージ情報２５００のブロック容量２５０３から、ページ移動処理実行部４５００は、それぞれのフラッシュパッケージ２３０の中の移動対象となる領域を、すべてのフラッシュパッケージ２３０に関して特定する。
【０１６２】
ステップ１１００５：ページ移動処理実行部４５００は、移動元となる実ページの基になっているフラッシュパッケージグループ２８０を構成する各フラッシュパッケージ２３０に、指定した領域の中で、データを格納した領域のデータを、キャッシュメモリ２１０に移動するよう要求する。
【０１６３】
ステップ１１００６：ページ移動処理実行部４５００は、ステップ１１００５での要求の発行先のフラッシュパッケージ２３０からの完了報告をまつ。
【０１６４】
ステップ１１００７：フラッシュパッケージ２３０からは、各領域（本実施例では、仮想セグメント）ごとに、仮想セグメントにデータが格納されていたか、いないかの情報と、データが格納されていた場合、その圧縮後のデータ量と格納されていたデータが、フラッシュパッケージ２３０から送られてくる。ページ移動処理実行部４５００は、これらの情報を、キャッシュメモリ２１０に格納する。
【０１６５】
ステップ１１００８：ページ移動処理実行部４５００は、ここでは、移動先実ページが、その移動元実ページの基になっているフラッシュパッケージグループ２８０を構成するフラッシュパッケージ２３０の集合と、それぞれのフラッシュパッケージ２３０のどの仮想セグメントの集合とに該当するかを算出する。この場合、移動元の実ページに対応する実ページ情報２１００の移動先実ページアドレスが示す実ページ情報２１００が、移動先の実ページに対応する実ページ情報２１００となる。実ページ情報２１００から、フラッシュパッケージグループ２８０を構成するフラッシュパッケージ２３０の集合と、それぞれのフラッシュパッケージ２３０のどの領域になるかを算出する処理は、ステップ１１００４で説明したので省略する。
【０１６６】
ステップ１１００９：ページ移動処理実行部４５００は、移動先となる実ページが割り当てられているフラッシュパッケージグループ２８０を構成する各フラッシュパッケージ２３０に、指定した領域にデータを格納するよう要求する。このとき、各フラッシュパッケージ２３０に送られるのは、ステップ１１０７でキャッシュメモリ２１０に格納した情報（移動元のフラッシュパッケージ２３０から送られてきた情報）と、移動元の実ページの中で、データを格納している領域のデータとである。
【０１６７】
ステップ１１０１０：ページ移動処理実行部４５００は、ステップ１１００９での要求の発行先のフラッシュパッケージ２３０からの完了報告をまつ。
【０１６８】
ステップ１１０１１：ページ移動処理実行部４５００は、移動元実ページを空き実ページとして管理し、且つ、移動元実ページが割り当てられていた仮想ページにその実ページに代えて移動先実ページを割り当てる。具体的には、例えば、ページ移動処理実行部４５００は、移動元の実ページに対応する実ページ情報２１００を空きページ管理情報ポインタ２２００につなぎ、移動元の実ページに対応する実ページ情報２１００を示していた実ページポインタ２００４を移動先の実ページ情報を示すようにする。また、ページ移動処理実行部４５００は、移動元実ページに対応する実ページ情報２１００内のページデータ格納量２１０４及びページ圧縮後データ格納量２１０５を、移動先実ページに対応する実ページ情報２１００にコピーする。その後、ページ移動処理実行部４５００は、移動元実ページ及び移動先実ページの双方に対応する実ページ情報２１００における移動中フラグ２１０９、移動先実ページポインタ２１１０及び移動待ちフラグ２１１１を、クリアする。
【０１６９】
ステップ１１０１２：ページ移動処理実行部４５００は、移動元のフラッシュパッケージグループ２８０に対応するフラッシュパッケージグループ情報（以下、移動元グループ情報）２３００と移動先のフラッシュパッケージグループ２８０に対応するフラッシュパッケージグループ情報（以下、移動先グループ情報）２３００とを更新する。具体的には、移動元グループ情報２３００内の空き実ページ数２３０４が表す値から１が削減され、移動先グループ情報２３００内の空き実ページ数２３０４が表す値に１が加算される。この後、次に移動対象とする実ページを探すために、ステップ１１００３にジャンプする。
【０１７０】
次に、フラッシュパッケージ２３０が実行する動作の説明を行う。フラッシュパッケージ２３０の動作の大部分は、パッケージプロセッサ３１０がコンピュータプログラムを実行することにより行われ、そのプログラムは、パッケージメモリ３２０に格納されている。
【０１７１】
図２５は、パッケージメモリ３２０が記憶するプログラムを示している。
【０１７２】
パッケージメモリ３２０は、データリード処理実行部１２０００、データライト処理実行部１２１００、仮想ブロック解放処理実行部１２２００、仮想ブロック移動処理実行部１２３００、仮想ブロック格納処理実行部１２４００、及び仮想容量判定処理部１２５００を記憶する。これらのプログラムのうちの少なくとも１つは、下位レベルの容量仮想化技術を実現するためのプログラムである。本実施例では、フラッシュパッケージ２３０が、下位レベルの容量仮想化技術を実現する。ただし、本発明は、下位レベルの容量仮想化技術をストレージコントローラ２００で実現してもよい。この場合、図２６に示すように、図２５に示したプログラムとほぼ同様のプログラムが、メモリ２７０に格納されることになる。図２６に示した構成では、これらのプログラムは、ストレージコントローラ２００が実行するので、図２５に示したプログラムとは若干相違が生ずるだけである。したがって、本実施例では、フラッシュパッケージ２３０が、下位レベルの容量仮想化技術を実現するものとし、図２５に示したデータリード処理実行部１２０００、データライト処理実行部１２１００、仮想ブロック解放処理実行部１２２００、仮想ブロック移動処理実行部１２３００、仮想ブロック格納処理実行部１２４００及び仮想容量判定処理部１２５００の処理フローを詳細に説明する。
【０１７３】
図２７は、データリード処理実行部１２０００の処理フローである。データリード処理実行部１２０００は、フラッシュパッケージ２３０がストレージコントローラ２００からリード要求を受けたときに実行される。なお、図２７の処理フローは、一つの仮想ブロックグループに格納されたデータをリードする処理のフローである。ただし、本発明は、リード要求で、複数の仮想ブロックグループに格納されたデータを読み出すようにした場合も有効である。また、図２７の処理フローは、仮想セグメント単位のデータをリードする際の処理フローである。ただし、本発明は、リード要求で、仮想セグメントの一部のデータを読み出すようにした場合も有効である。
【０１７４】
ステップ１３０００：データリード処理実行部１２０００は、受けたリード要求で指定されているリード対象アドレスと、パッケージブロック容量３００５とから、対応する仮想ブロックグループ（リード元の仮想ブロックグループ）と、リード元の仮想ブロックグループ内の相対アドレスとを算出する。これにより、リード元の仮想ブロックグループに対応する仮想ブロック情報３２００を特定することが可能となる。また、仮想ブロックグループ内の相対アドレスから、対応する仮想セグメントが特定される。その仮想セグメントに対応する仮想セグメントアドレスポインタ３２０５から、その仮想セグメントが、実ブロック内のどのアドレスに格納されているか（割り当てられているか）が特定される。
【０１７５】
ステップ１３００１：データリード処理実行部１２０００は、ステップ１３０００で特定した情報（実ブロック内のどのアドレスに格納されているかを示す情報）が、繰り返し情報を格納していることを意味する情報でなければ、ステップ１３００３へジャンプする。
【０１７６】
ステップ１３００２：データリード処理実行部１２０００は、圧縮仮想セグメントデータ量３２０６に格納された繰り返し情報を、対応する仮想セグメント分の長さだけバッファ３３０に格納する。この後、ステップ１３００８へジャンプする。
【０１７７】
ステップ１３００３：データリード処理実行部１２０００は、リード元のそれぞれの仮想ブロックに割り当てた実ブロックに対応する実ブロック情報３３００を、リード元のそれぞれの仮想ブロックに対応する仮想ブロック情報３２００の実ブロック情報ポインタ３２０２を基に特定する。
【０１７８】
ステップ１３００４：データリード処理実行部１２０００は、特定したそれぞれの実ブロック情報３３００の実ブロック識別子３３０１から識別される実ブロックが、どのフラッシュチップ３００のどの先頭アドレスから格納されているかを特定する。次に、データリード処理実行部１２０００は、該当する仮想セグメントアドレスポインタ３２０５から、当該リード要求を基に特定されたそれぞれの仮想セグメントが、当該フラッシュチップ３００のどの当該アドレスに格納されているかを算出する。なお、仮想セグメントが、実セグメントの一部に格納されている場合、仮想セグメントを含む実セグメント全体が、読み出し対象となる。
【０１７９】
ステップ１３００５：データリード処理実行部１２０００は、ステップ１３００４で特定したフラッシュチップ３００に対応したチップ情報３１００をアクセスして、当該フラッシュチップ３００が接続されているパッケージバス３４０を識別し、対応するバス転送装置３５０を特定する。
【０１８０】
ステップ１３００６：データリード処理実行部１２０００は、ステップ１３００５で特定したバス転送装置３５０に、ステップ１３００４で特定したフラッシュチップ３００のステップ１３００４で特定したアドレスからバッファ３３０にデータを転送するよう指示する。また、圧縮・伸長回路３６０Ｂに、データ転送と同期してデータを伸長するよう指示する。
【０１８１】
ステップ１３００７：この後、転送が完了するのを待つ。
【０１８２】
ステップ１３００８：データリード処理実行部１２０００は、バッファ３３０に格納したデータ（ステップ１３００１で、バッファに格納したデータ、あるいは、ステップ１３００６の指示によりステップ１３００７で伸長されたデータ）の中から、要求された仮想セグメントのデータを、ストレージコントローラ２００に送る。この後、処理を完了する。
【０１８３】
図２８と図２９は、データライト処理実行部１２１００の処理フローである。データライト処理実行部１２１００は、フラッシュパッケージ２３０がストレージコントローラ２００からライト要求を受けたときに実行される。なお、本実施例で示す図２８と図２９の処理フローは、一つの仮想ブロックグループに格納するデータをライトする処理のフローである。ただし、本発明は、ライト要求で複数の仮想ブロックグループにデータを書き込むようにした場合も有効である。また、図２８の処理フローは、仮想セグメント単位のデータをライトする際の処理フローである。ただし、本発明は、ライト要求で、仮想セグメントの一部のデータを書き込むようにした場合も有効である。
【０１８４】
ステップ１４０００：データライト処理実行部１２１００は、受けたライト要求で指定されているライト対象アドレスと、パッケージブロック容量３００５とから、対応する仮想ブロックグループとアクセスする仮想ブロックグループの相対アドレスを計算する。これにより、ライト先の仮想ブロックグループに対応する仮想ブロック情報３２００を特定することが可能となる。また、仮想ブロックグループ内の相対アドレスから、対応する仮想セグメントが特定される。その仮想セグメントに対応する仮想セグメントアドレスポインタ３２０５から、その仮想セグメントが、実ブロック内のどのアドレスに格納されているか（割り当てられているか）が特定される。
【０１８５】
ステップ１４００１：データライト処理実行部１２１００は、ライト要求に従うライトデータをバッファ３３０に格納する。なお、この際、データライト処理実行部１２１００は、圧縮・伸長回路３６０Ａに、圧縮を指示する。バッファ３３０には、圧縮されたライトデータが格納される。
【０１８６】
ステップ１４００２：データライト処理実行部１２１００は、ライト先の仮想ブロックグループに対応する仮想ブロック情報３２００の最初の実ブロック情報ポインタ３２０２を特定する。この値がヌルかどうか、すなわち、実ブロックが割り当てられているかが、チェックされる。割り当てていれば、ステップ１４００６へジャンプする。
【０１８７】
ステップ１４００３：データライト処理実行部１２１００は、ライト先の仮想ブロックグループに空きの実ブロックを割り当てる。ここで割り当てられる実ブロックは、消去処理が済んでいてデータは格納されていない実ブロックである。データライト処理実行部１２１００は、各チップ情報３１００のチップ内空き実ブロック数３１０３を参照して、どのフラッシュチップ３００の実ブロックを割り当てるかを決める。その後、データライト処理実行部１２１００は、決定したフラッシュチップ３００の空きブロック情報ポインタ３４００を参照して、先頭の実ブロック情報３３００を、当該仮想ブロックグループに対応する仮想ブロック情報３２００の最初の空き実ブロックポインタ３３０２が示すようにする。これで、仮想ブロックグループに最初の実ブロックを割り当てたことになる。なお、データライト処理実行部１２１００は、空きブロック情報ポインタ３４００を、次の実ブロック情報３３００（仮想ブロックに割り当てた実ブロックの実ブロック情報３３００の中の空き実ブロックポインタ３３０２が示す実ブロック情報３３００）を示すよう更新する。また、データライト処理実行部１２１００は、仮想ブロックに割り当てられた実ブロックの実ブロック情報３３００の中の空き実ブロックポインタ３３０２をヌルにする。また、データライト処理実行部１２１００は、当該実ブロックに対応するチップ情報３１００のチップ内空き実ブロック数３１０３が表す値を減らす。
【０１８８】
ステップ１４００４：さらに、データライト処理実行部１２１００は、ライト先の仮想セグメントに対応する仮想セグメントポインタに、ライト先仮想ブロックに割り当てられた実ブロックの識別子とその実ブロックの先頭アドレスとをセットする。データライト処理実行部１２１００は、ライト先仮想ブロックグループに対応する圧縮後仮想セグメントデータ量３２０６に、圧縮・伸長回路３６０Ａから特定された値（圧縮後のライトデータの量）が示す値をセットする。また、同じ値を、データライト処理実行部１２１００は、圧縮データ格納量３２０４にセットする。さらに、同じ値を、データライト処理実行部１２１００は、パッケージ圧縮後データ格納量３００７が表す値に加える。さらに、データライト処理実行部１２１００は、対象となるライトデータの量である、仮想セグメントの容量を、データ格納量３２０３にセットする。また、同じ値を、データライト処理実行部１２１００は、ライト先のフラッシュパッケージに対応するパッケージデータ格納量３００６に加える。また、データライト処理実行部１２１００は、ストレージコントローラ２００から受けたライトデータの量とそのライトデータの圧縮後のデータ量とを表す情報を、ストレージコントローラ２００に返す値として記憶資源（例えばプロセッサ３１０内のレジスタ、或いは、メモリ３２０）に格納する。
【０１８９】
ステップ１４００５：データライト処理実行部１２１００は、ライト先のフラッシュチップ３００のライト先のアドレスへバッファ３３０からデータを書き込むようバス転送装置３５０に指示する。この後、ステップ１４０１４にジャンプする。
【０１９０】
ステップ１４００６：データライト処理実行部１２１００は、ライト先仮想ブロックグループに対応する仮想ブロック情報３２００の最後の実ブロック情報ポインタ３２０２が示す実ブロック情報３３００の実ブロック識別子３３０１を参照して、対応する実ブロックが、どのフラッシュチップ３００のどの先頭アドレスから格納されているかを特定する。
【０１９１】
ステップ１４００７：データライト処理実行部１２１００は、ライト先の実ブロック（ライト先の仮想ブロックに割り当てられた実ブロック）に対応する実ブロック情報３３００の実ブロック内空き領域３３０４とバッファ３３０に格納したライトデータの量とを基に、受けたデータを、ライト先実ブロックの空き領域に書き込めるかをチェックする。書き込めない場合、ステップ１４０１６へジャンプする。
【０１９２】
ステップ１４００８：データライト処理実行部１２１００は、ライト先仮想セグメントの仮想セグメントアドレスポインタ３２０５がヌルか、また、繰り返し情報を格納しているかを判断する。いずれかが成立する場合、ステップ１４０１０へジャンプする。
【０１９３】
ステップ１４００９：ヌルでないか、繰り返し情報が格納されていない場合には、データライト処理実行部１２１００は、当該圧縮・伸長回路３６０Ａが示す値から圧縮仮想セグメントデータ量３２０６が表す値を減算した値Ｋを、圧縮データ格納量３２０４が表す値に加える。さらに、データライト処理実行部１２１００は、同じ値Ｋを、パッケージ圧縮データ格納量３００７が表す値に加える。この後、データライト処理実行部１２１００は、圧縮・伸長回路３６０Ａが示す値を圧縮仮想セグメントデータ量３２０６が表す値にセットする。また、データライト処理実行部１２１００は、今回書き込んだライトデータの量としては、０を、圧縮後のデータの量としては、圧縮仮想セグメントデータ量３２０６が表す値に加えた値を、ストレージコントローラ２００に返す値として、記憶資源（例えばプロセッサ３１０内のレジスタ、或いは、メモリ３２０）に格納する。この後、ステップ１４０１２へジャンプする。
【０１９４】
ステップ１４０１０：ヌルか、繰り返し情報を格納している場合、当該圧縮・伸長回路３６０が示す値を、圧縮データ格納量３２０４に加える。さらに、同じ値を、パッケージ圧縮データ格納量３００７に加える。この後、圧縮・伸長回路が示す値を圧縮仮想セグメントデータ量３２０６にセットする。また、今回書き込んだライトデータ量に関しては、ストレージコントローラ２００から受け取った圧縮前のデータ量を、圧縮後のデータに関しては、当該圧縮・伸長回路３６０が示す値を、ストレージコントローラ２００に返す値として、記憶資源（例えばプロセッサ３１０内のレジスタ、或いは、メモリ３２０）に格納する。
【０１９５】
ステップ１４０１１：データライト処理実行部１２１００は、ライト先の実ブロックに対応する実ブロック内空き容量３３０４が表す値から、今回受けたライトデータの量（圧縮後の値）を減算する。データライト処理実行部１２１００は、ライト先仮想セグメントに対応する仮想セグメントアドレスポインタ３２０５に、ライト先仮想ブロックグループに対応する仮想ブロック情報３２００の最後の実ブロックポインタ３２０２と、特定された相対アドレスとをセットする。
【０１９６】
ステップ１４０１２：データライト処理実行部１２１００は、ライトデータを格納するフラッシュチップ３００に対応したチップ情報３１００を基に、当該フラッシュチップ３００が接続されているパッケージバス３４０を識別し、そのバス３４０に接続されているバス転送装置３５０を特定する。
【０１９７】
ステップ１４０１３：データライト処理実行部１２１００は、ステップ１４０１２で特定したバス転送装置３５０に、ライト先のフラッシュチップ３００のライト先のアドレスにバッファ３３０からライトデータを書き込むよう指示する。
【０１９８】
ステップ１４０１４：この後、書き込みが完了するのを待つ。
【０１９９】
ステップ１４０１５：データライト処理実行部１２１００は、ストレージコントローラ２００に、ライト要求が完了したことの完了報告を送信して、処理を完了する。その完了報告は、圧縮前のライトデータの量及び圧縮後のライトデータの量を表す情報を含んで良い。
【０２００】
ステップ１４０１６：当該ステップは、ライト先の実ブロックの空き領域より、ライトデータの量が大きい場合に実行される。本ステップでは、データライト処理実行部１２１００は、ライト先仮想ブロックグループに、（ｍ＋１）個の実ブロックを割り当てている場合は、実ブロックを割り当てない。その場合、図２９に示すステップ１４０１９にジャンプする。
【０２０１】
ステップ１４０１７：このステップでは、ライト先の仮想ブロックグループに空き実ブロックが割り当てられる。なお、ここでは、割り当てられる実ブロックは、消去処理済みの実ブロック（有効なデータが格納されていない実ブロック）であるとする。データライト処理実行部１２１００は、各チップ情報３１００のチップ内空き実ブロック数３１０３等を参照して、どのフラッシュチップ３００の実ブロックを割り当てるかを決める。その後、データライト処理実行部１２１００は、対応するフラッシュチップ３００の空きブロック情報ポインタ３４００を参照して、先頭の実ブロック情報３３００を、当該仮想ブロックグループ管理情報の最初にヌルになっている実ブロックポインタ３３０２が示すようにする。これで、仮想ブロックグループに新たな実ブロックが割り当てられたことになる。なお、データライト処理実行部１２１００は、空きブロック情報ポインタ３４００を、次の実ブロック情報３３００（仮想ブロックに割り当てた実ブロックの実ブロック情報３３００の中の空き実ブロックポインタ３３０２が示す実ブロック情報３３００）を示すようにし、さらに、仮想ブロックに割り当てた実ブロックの実ブロック情報３３００の中の空き実ブロックポインタ３３０２をヌルにする。また、データライト処理実行部１２１００は、当該実ブロックに対応するチップ情報３１００のチップ内空きブロック数３１０３の値を減らす。
【０２０２】
ステップ１４０１８：データライト処理実行部１２１００は、当該仮想ブロック情報３２００の新たに割り当てた実ブロック情報ポインタ３２０２が示す実ブロック情報３３００と、その一つ前の実ブロック情報ポインタ３２０２が示す実ブロック情報３３００の実ブロック識別子３３０１とを基に、どのフラッシュチップ３００のどのアドレスにデータを格納するかを決定する。この後、ステップ１４００８へジャンプする。
【０２０３】
ステップ１４０１９：本ステップでは、当該仮想ブロックグループに別の実ブロックが割り当てられる。別の実ブロックを割り当てる理由は、実ブロックの消去回数の偏りを少なくするためである。この処理は、ウエアレベリング処理と呼ばれる。この際、割り当てる実ブロックの数は、例えば、ライト先仮想ブロックグループに対応する圧縮後データ格納量３２０６が表す値に圧縮・伸長回路３６０Ａに示された値を加えた値を基に決定される。当該ステップでは、データライト処理実行部１２１００は、必要な実ブロックの数を入力値として、ウエアレベリング処理部（例えば、フラッシュパッケージ２３０内のプロセッサ３１０で実行される図示しないプログラム）をコールして、実ブロックを決定する。データライト処理実行部１２１００は、ウエアレベリング処理部から、ライトデータを格納する実ブロックの実ブロック情報３３００のアドレスを、入力値に等しい数だけ、受ける。この実ブロックは、消去された状態にあり、直接データを書き込めるような状態であるとする。また、本実施例では、ウエアレベリング処理部は、例えば、特許文献１のような公知の技術を前提とするので、ここでは、特に詳細に説明しない。
【０２０４】
ステップ１４０２０：ここでは、当該仮想ブロックグループ内のすべての圧縮後データを一度伸長してバッファ３３０に読み出す。このため、ヌル値でも、繰り返し情報でもないすべての仮想セグメントアドレス３２０５と対応する圧縮仮想セグメントデータ量３２０６を参照する。これらの値と、実ブロック情報３３００とを基に、データライト処理実行部１２１００は、仮想セグメントのアドレス順に、どのフラッシュチップ３００のどのアドレスからどの量だけをバッファ３３０に転送するかを示すアドレスリストを生成する。
ただし、必要となる仮想セグメントの一部を含む実セグメントも読み出し対象となる。
【０２０５】
ステップ１４０２１：データライト処理実行部１２１００は、ステップ１４０２０で認識したフラッシュチップ３００に対応したチップ情報３１００を基に、当該フラッシュチップ３００が接続されているパッケージバス３４０を特定し、対応するバス転送装置３５０を特定する。
【０２０６】
ステップ１４０２２：データライト処理実行部１２１００は、ステップ１４０２１で特定したバス転送装置３５０に、ステップ１４０２０で生成したアドレスリストに従う場所（フラッシュチップ３００のアドレス）からバッファ３３０にデータを読み込むよう指示する。なお、この際、データライト処理実行部１２１００は、圧縮・伸長回路３６０Ｂには、データを伸長するよう指示する。
【０２０７】
ステップ１４０２３：この後、バッファ３３０への読み込みが完了するのを待つ。
【０２０８】
ステップ１４０２４：データライト処理実行部１２１００は、当該仮想ブロック情報３２００の中で、ヌル値あるいは繰り返し情報を格納している仮想セグメントアドレスポインタ３２０５以外のすべての仮想セグメントアドレスポインタ３２０５（以下、有効な仮想セグメントアドレスポインタ３２０５と呼ぶ）を更新する。データライト処理実行部１２１００は、最初の有効な仮想セグメントアドレスポインタ３２０５に、ブロックアドレスとして、最初に割り当てた実ブロックのアドレスを設定し、相対アドレスとして、その実ブロックの先頭アドレスを設定する。データライト処理実行部１２１００は、次の有効な仮想セグメントアドレスポインタ３２０５について、基本的には、ブロックアドレスとして、その前の有効な仮想セグメントアドレスポインタ３２０５が表すブロックアドレスを設定し、相対アドレスとして、その前の有効な圧縮仮想セグメントアドレスポインタ３２０５が表す値（相対アドレス）を加えた値（累積値）を設定していく。相対アドレスが、実ブロックの範囲をこえた場合、相対アドレスとしては、その値（実ブロックの範囲を超えた値）から、実ブロックの範囲に相当する値を減算した値が設定されブロックアドレスとしては、次に割り当てた実ブロックのアドレスが設定される。最後の有効な仮想セグメントアドレスポインタ３２０５の値を設定したあと、データライト処理実行部１２１００は、最後の有効な仮想セグメントアドレスポインタ３２０５に関する相対アドレスの値に、対応する圧縮仮想セグメントデータ量３２０６が表す値が加算される。このように算出された値Ｈが、実ブロック容量をこえていなければ、最後の有効な仮想セグメントアドレスポインタ３２０５のブロックアドレスに対応する実ブロック情報３３００の実ブロック内空き容量３３０４に、実ブロック容量からこの算出値を減算した値がセットされ、加えて、当該ライト要求に対応した仮想セグメントアドレスポインタ３２０５には、ブロックアドレスとして、当該実ブロックのアドレスが設定される。さらに、算出値Ｈが、実ブロック容量をこえていれば、最後の実ブロック情報ポインタ３２０２が示す実ブロック情報３３００の実ブロック内空き領域３３０４に、実ブロック容量の２倍の値からこの算出値Ｈを減算した値がセットされる。
【０２０９】
ステップ１４０２５：データライト処理実行部１２１００は、ストレージコントローラ２００から受けたライトデータを、ステップ１４０２３で転送したデータの次の領域に、伸長して書き込む。
【０２１０】
ステップ１４０２６：データライト処理実行部１２１００は、当該仮想セグメントの仮想セグメントアドレスポインタ３２０５がヌルか繰り返し情報を格納しているかを判断する。どちらかが成立なら、ステップ１４０２８へジャンプする。
【０２１１】
ステップ１４０２７：どちらも成立しないなら、データライト処理実行部１２１００は、ストレージコントローラ２００からライトデータを転送した際に使用した圧縮・伸長回路３６０Ａが示す値から圧縮仮想セグメントデータ量３２０６を減算した値Ｊを、圧縮データ格納量３２０４に加える。さらに、データライト処理実行部１２１００は、同じ値Ｊを、パッケージ圧縮データ格納量３００７が表す値に加算する。この後、データライト処理実行部１２１００は、圧縮・伸長回路３６０Ａが示す値を圧縮仮想セグメントデータ量３２０６にセットする。また、データライト処理実行部１２１００は、今回書き込んだライトデータ量としては、０を、圧縮後のデータ量として、圧縮後のデータ量を圧縮仮想セグメントデータ量３２０６に加えた値を、ストレージコントローラ２００に返す値として記憶資源（例えばレジスタ又はメモリ３２０）に格納する。この後、ステップ１４０２９へジャンプする。
【０２１２】
ステップ１４０２８：成立の場合、データライト処理実行部１２１００は、ストレージコントローラ２００から転送した際に使用した圧縮・伸長回路３６０Ａが示す値Ｌを、ライト先の仮想ブロックグループに対応する圧縮データ格納量３２０４が表す値に加える。さらに、データライト処理実行部１２１００は、同じ値Ｌを、パッケージ圧縮データ格納量３００７に加える。この後、データライト処理実行部１２１００は、同じ値Ｌを圧縮仮想セグメントデータ量３２０６にセットする。また、データライト処理実行部１２１００は、今回書き込んだライトデータ量としては、ストレージコントローラ２００から受けた圧縮前のデータ量を表す値を、圧縮後のデータ量としては、当該圧縮・伸長回路３６０Ａが示す値Ｌを、ストレージコントローラ２００に返す値として記憶資源（例えばレジスタ又はメモリ）に記憶する。
【０２１３】
ステップ１４０２９：データライト処理実行部１２１００は、最後の有効な仮想セグメントアドレスポインタ３２０５の値の中で、この相対アドレスの値に、対応する圧縮仮想セグメントデータ量３２０６の値を加える。これにより算出された値をＭとする。この算出値Ｍが実ブロック容量をこえていなければ、データライト処理実行部１２１００は、当該ライト要求に対応した仮想セグメントアドレスポインタ３２０５には、ブロックアドレスとして、最後の有効な仮想セグメントアドレスポインタ３２０５が示す実ブロックのアドレスを設定し、相対アドレスとして、この算出値Ｍを設定する。さらに、この算出値Ｍが実ブロック容量をこえていれば、データライト処理実行部１２１００は、最後の実ブロック情報３３００の実ブロック内空き容量３３０４に、実ブロック容量からこの算出値Ｍを減算した値を設定する。さらに、データライト処理実行部１２１００は、この算出値Ｍが実ブロック容量をこえていれば、最後の実ブロック情報３３００の実ブロック内空き容量３３０４に、実ブロック容量の２倍の値から、この算出値Ｍを減算した値を設定する。
【０２１４】
ステップ１４０３０：次に、データライト処理実行部１２１００は、新たに割り当てた実ブロックに対応する実ブロック情報３３００の実ブロック識別子３３０１を基に、この実ブロックがどのフラッシュチップ３００のどのアドレスに該当するかを特定し、転送を指示するアドレスリストを生成する。
【０２１５】
ステップ１４０３１：データライト処理実行部１２１００は、ステップ１４０３０で特定したライトデータを格納するフラッシュチップ３００に対応したチップ情報３１００を基に、当該フラッシュチップ３００が接続されているパッケージバス３４０を特定し、そのバス３４０に接続されているバス転送装置３５０を特定する。
【０２１６】
ステップ１４０３２：データライト処理実行部１２１００は、ステップ１４０３１で特定したバス転送装置３５０に、ステップ１４０３０で生成されたアドレスリストに従うフラッシュチップ３００のアドレスへバッファ３３０からデータを書き込むよう指示する。この際、データライト処理実行部１２１００は、圧縮・伸長回路３６０Ｂには圧縮を指示する。
【０２１７】
ステップ１４０３３：この後、バッファ３３０からの書き込みが完了するのを待つ。
【０２１８】
ステップ１４０３４：この後、データライト処理実行部１２１００は、ステップ１４０３３でのライト先のパッケージの仮想容量を変化させる必要があるかをチェックするために仮想容量判定処理部１２５００をコールする。
【０２１９】
ステップ１４０３５：このステップでは、割り当てられていた実ブロックが空きの状態にされる。まず、データライト処理実行部１２１００は、元々割り当てられていた実ブロックに対して消去処理を行う。これが完了すると、次に、データライト処理実行部１２１００は、元々割り当てられていた実ブロックに対応する実ブロック情報３３００の空き実ブロックポインタ３３０２に、空き実ブロック情報ポインタ３４００が示していた実ブロック情報３３００のアドレスを設定し、空き実ブロック情報ポインタ３４００には、元々割り当てられていた実ブロックに対応する実プロック情報３３００のアドレスを設定する。さらに、元々割り当てられていた実ブロックに対応する実ブロック情報３３００の空き実ブロックポインタ３３０２以外の情報を、ヌル値にする。また、データライト処理実行部１２１００は、対応する仮想ブロック情報３２００の実ブロック情報ポインタ３２０２をヌル状態にする。このステップ１４０３５は、当該仮想ブロックグループに割り当てられていた実ブロックの数だけ繰り替えされる。
【０２２０】
ステップ１４０３６：このステップでは、実ブロックが新たに仮想ブロックグループに割り当てられる。具体的には、例えば、データライト処理実行部１２１００は、ライト先の仮想ブロックグループを構成する仮想ブロックの数だけの仮想ブロック情報３２００の実ブロック情報ポインタ３２０２が、新しく割り当てられる実ブロックの実ブロック情報３３００を示すようにする。
【０２２１】
ステップ１４０３７：データライト処理実行部１２１００は、ストレージコントローラ２００に対して、ライト要求の終了を報告する。なお、データライト処理実行部１２１００は、仮想容量判定処理部１２５００の実行結果から、当該フラッシュパッケージ２３０の仮想容量を変化させることを検出した場合、新たな仮想容量（変化後の仮想容量、又は、現在の仮想容量との差分）を表す情報を、ストレージコントローラ２００に報告する。また、データライト処理実行部１２１００は、ライトデータの圧縮前の量と圧縮後の量を表す情報も、ストレージコントローラ２００に報告する。
【０２２２】
図３０は、仮想ブロック解放処理実行部１２２００の処理フローである。仮想ブロック解放処理実行部１２２００は、ストレージコントローラ２００から領域の範囲（仮想セグメントの集合）を指定した解放要求（割り当てられている実ブロックを解放することの要求）をフラッシュパッケージ２３０が受けた時に実行される。
【０２２３】
ステップ１５０００：仮想ブロック解放処理実行部１２２００は、受けた解放要求で指定された領域範囲と、パッケージブロック容量３００５とを基に、解放を指示された範囲（仮想ブロックグループにおける範囲）を特定する。このとき、特定された範囲は、仮想ブロックグループ全域ということもあれば、仮想ブロックグループにおける一部の仮想セグメントということもあり得る。また、指定された範囲（仮想セグメント）を含む仮想ブロックグループごとに、分類が行われて良い。また、仮想ブロック解放処理実行部１２２００は、ストレージコントローラ２００に返却する、指定された領域範囲に対応して設ける、データ格納量と圧縮データ格納量との差分（変化）を示す値をクリアしておく（０としておく）。
【０２２４】
ステップ１５００１：仮想ブロック解放処理実行部１２２００は、全域が指定された仮想ブロックグループがなければ、ステップ１５００５へジャンプする。
【０２２５】
ステップ１５００２：仮想ブロック解放処理実行部１２２００は、解放要求で指定された全ての仮想ブロックグループのデータ格納量３２０３を合計し、且つ、解放要求で指定された全ての仮想ブロックグループの圧縮データ格納量３２０４を合計する。仮想ブロック解放処理実行部１２２００は、それぞれの合計値を、ストレージコントローラ２００に返却するそれぞれ対応する値（データ格納量、圧縮データ格納量）に加算する。さらに、仮想ブロック解放処理実行部１２２００は、データ格納量３２０３に関する合計値を、パッケージデータ格納量３００６から減算し、且つ、圧縮データ格納量３２０４に関する合計値を、パッケージ圧縮データ格納量３００７から減算する。その後、仮想ブロック解放処理実行部１２２００は、解放要求で指定された全ての仮想ブロックグループについて、データ格納量３２０３と圧縮データ格納量３２０４をクリアし、すべての仮想セグメントアドレスポインタ３２０５に繰り返し情報が指定されていることを意味する値を設定し、且つ、全ての圧縮仮想セグメントデータ量３２０６にその繰り返し情報を設定する。
【０２２６】
ステップ１５００３：仮想ブロック解放処理実行部１２２００は、指定されたすべての仮想ブロックグループに対応する仮想ブロック情報３２００の実ブロック情報ポインタ３２０２が示す実ブロック情報３３００に対応する実ブロックの解放処理を行う。このため、仮想ブロック解放処理実行部１２２００は、該当するすべての実ブロック情報３３００の実ブロック識別子３３０１を解析し、解放する実ブロックが、どのフラッシュチップ３００のどのアドレスから格納されているかを特定する。
【０２２７】
ステップ１５００４：本ステップでは、該当するすべての仮想ブロックグループに割り当てられているすべての実ブロックが空いた状態にされる。対象となる実ブロックは、ステップ１５００３で特定された実ブロックであるが、処理は、図２９のステップ１４０３５と同じであるので、ここでは、説明を省略する。ただし、ステップ１４０３５の処理は、一つの仮想ブロックグループに対する処理であるが、ここでは、ステップ１４０３５の処理は、該当する仮想ブロックグループの数だけ、実行される。この後、一部の仮想セグメントの解放が指示された仮想セグメントグループがなければ、ステップ１５００６へジャンプする。
【０２２８】
ステップ１５００５：本ステップは、仮想ブロックグループの全域ではなく一部が指定されたすべての仮想ブロックグループについての処理である。仮想ブロック解放処理実行部１２２００は、解放要求で指定された全ての仮想ブロックグループのデータ格納量３２０３を合計し、且つ、解放要求で指定された全ての仮想ブロックグループの圧縮データ格納量３２０４を合計する。仮想ブロック解放処理実行部１２２００は、それぞれの合計値を、ストレージコントローラ２００に返却するそれぞれ対応する値（データ格納量、圧縮データ格納量）に加算する。さらに、仮想ブロック解放処理実行部１２２００は、データ格納量３２０３に関する合計値を、パッケージデータ格納量３００６から減算し、且つ、圧縮データ格納量３２０４に関する合計値を、パッケージ圧縮データ格納量３００７から減算する。仮想ブロック解放処理実行部１２２００は、全ての仮想ブロックグループについて、各々の対応する実ページ（指定された仮想ブロックグループを含む実ページ）と各々の指定された仮想ブロックグループに対して指定された仮想セグメントアドレスポインタ３２０５の中から、全ての有効な仮想セグメントアドレスポインタ３２０５の数の合計と当該有効な仮想セグメントアドレスポインタ３２０５に対応する圧縮仮想セグメントデータ量３２０６の合計を算出する。仮想ブロック解放処理実行部１２２００は算出された値を、ストレージコントローラ２００へ返却される、各実ページに対して提供される対応する値に加算する。加えて仮想ブロック解放処理実行部１２２００は、データ格納量について、計算値（データ格納量３２０３の合計とストレージコントローラ２００に返却される値（データ格納量）との合計値）を、パッケージデータ格納量３００６から減算し、また圧縮データ格納量について、計算値（圧縮データ格納量３２０４の合計とストレージコントローラ２００に返却される値（圧縮データ格納量）との合計値）をパッケージ圧縮データ格納量３００７から減算する。さらに、仮想ブロック解放処理実行部１２２００は、仮想ブロックグループごとに、算出されたデータ格納量及び圧縮データ格納量を、該当する仮想セグメントグループのデータ格納量３２０３と圧縮データ格納量３２０４から減算する。最後に、仮想ブロック解放処理実行部１２２００は、指定された仮想セグメントアドレスポインタ３２０５の中で、すべての有効仮想セグメントアドレスポインタ３２０５の値を、繰り返し情報が設定されていることを示す値に変更し、且つ、対応する圧縮仮想セグメントデータ量３２０６に繰り返し情報を設定する。なお、ここでは、解放を指示された仮想セグメントには、繰り返し情報が設定されていることを記憶するだけで、実ブロックの解放を行わない。しかし、当該仮想ブロックグループに、別の実ブロックを割り当て、割り当てた実ブロックに有効なデータを書き込む際には、（データライト処理実行部１２１００のステップ１４０１９-１４０３３の処理）、繰り返し情報が格納されているという情報から、当該仮想セグメントは、データが書き込まれないので、格納領域を削減できる。また、本実施例では、当該仮想ブロックグループに、別セグメントを割り当てる処理を、この��機で実行はしていないが、この契機で、別セグメントを割り当てる処理（データライト処理実行部１２１００のステップ１４０１９-１４０３３の処理）を実行して、直ちに、格納容量を削減しても、本発明は有効である。
【０２２９】
ステップ１５００６：仮想ブロック解放処理実行部１２２００は、ストレージコントローラ２００に、ステップ１５００２とステップ１５００５で算出されたデータ格納量と圧縮後データ格納量を報告する。ストレージコントローラ２００へ解放要求の完了報告を行う。その完了報告が、ステップ１５００２とステップ１５００５で算出されたデータ格納量と圧縮後データ格納量を表す情報を含んで良い。
【０２３０】
図３１は、仮想ブロック移動処理実行部１２３００の処理フローである。仮想ブロック移動処理実行部１２３００は、指定された仮想セグメントの集合に格納されているデータを移動することの要求（仮想ブロック移動要求）をフラッシュパッケージ２３０がストレージコントローラ２００から受けたときに実行される。なお、ここでは、実ページ単位の要求なので、仮想ブロックグループの一部のセグメントの転送要求はないものとする。また、送ったデータを格納していた実ブロックは解放するので、図３０の仮想ブロック解放処理実行部１２２００と処理が異なるのは、実ブロックに格納されていたデータをストレージコントローラ２００に送る点である。このため、図３０の処理フローの各ステップを引用しながら、図３１の説明を行う。
【０２３１】
ステップ１６０００：仮想ブロック移動処理実行部１２３００は、仮想ブロック移動要求で指定された仮想ブロックグループの集合を算出する。
【０２３２】
ステップ１６００１：仮想ブロック移動処理実行部１２３００は、指定されたすべての仮想ブロックグループについて、それぞれの仮想ブロックグループのすべての仮想セグメントに対し、対応する仮想セグメントアドレスポインタ３２０５を参照して、ステータス情報（データが格納されていない（ヌル）、繰り返し情報が設定されているか、或いは、データが格納されているかを示す情報）と、圧縮仮想セグメントデータ量３２０６が表す値とを、ストレージコントローラ２００に戻す値として設定する。
【０２３３】
ステップ１６００２：仮想ブロック移動処理実行部１２３００は、指定されたすべての仮想ブロックグループについて、それぞれの仮想ブロックグループのデータ格納量３２０３と圧縮データ格納量３２０４を、ストレージコントローラ２００に戻す値として設定する。また、仮想ブロック移動処理実行部１２３００は、これらの仮想ブロックグループのデータ格納量３２０３と圧縮データ格納量３２０４のそれぞれの合計値を求め、それぞれの合計値を、ストレージコントローラ２００に返却する値として設定する。さらに、仮想ブロック移動処理実行部１２３００は、それぞれの合計値を、パッケージデータ格納量３００６とパッケージ圧縮データ格納量３００７から減算する。その後、仮想ブロック移動処理実行部１２３００は、データ格納量３２０３、圧縮データ格納量３２０４、すべての仮想セグメントアドレスポインタ３２０５と圧縮仮想セグメントデータ量３２０６をクリアする。
【０２３４】
ステップ１６００３：仮想ブロック移動処理実行部１２３００は、指定されたすべての仮想セグメントの仮想セグメントアドレスポインタ３２０５がデータを格納していることを示す、仮想セグメントアドレスポインタ３２０５と対応する圧縮仮想セグメントデータ量３２０６から、ストレージコントローラ２００に送るべき当該仮想ブロックグループの中に格納されているデータが格納されているアドレスとその転送長を示す情報リストを生成する。ただし、必要となる仮想セグメントの一部を含む実セグメントも読み出し対象となる。
【０２３５】
ステップ１６００４：仮想ブロック移動処理実行部１２３００は、指定された仮想セグメントに割り当てられている実ブロックが格納されているフラッシュチップ３００に対応したチップ３１００情報をアクセスして、当該フラッシュチップ３００が接続されているパッケージバス３４０を特定し、対応するバス転送装置３５０を特定する。
【０２３６】
ステップ１６００５：仮想ブロック移動処理実行部１２３００は、ステップ１６００４で特定したバス転送装置３５０に、ステップ１６００４で生成した情報リストに従うアドレスからバッファ３３０にデータを転送するよう指示する。その際、仮想ブロック移動処理実行部１２３００は、圧縮・伸長回路３６０Ｂには、データを伸長するよう指示する。
【０２３７】
ステップ１６００６：転送が完了するのを待つ。
【０２３８】
ステップ１６００７：ステップ１５００３と同じ処理であるため、説明を省略する。
【０２３９】
ステップ１６００８：ステップ１５００４と同じ処理であるため、説明を省略する。
【０２４０】
ステップ１６００９：仮想ブロック移動処理実行部１２３００は、ストレージコントローラ２００へ、バッファ３３０に格納したデータを送る。まず、仮想ブロック移動処理実行部１２３００は、仮想セグメントごとに、ステータス情報（データが格納されていたか、繰り返し情報が設定されていたか、データが格納されていないかを示す情報）と、圧縮後のデータ量を表す情報とを送る。次に、仮想ブロック移動処理実行部１２３００は、仮想ブロックグループに対応した格納データ量と圧縮データ格納量の変化値を、さらに、すべてのデータの格納データ量と圧縮データ格納量の変化値を、最後に、バッファ３３０に格納したデータの中から、有効な仮想セグメントのデータを選択して、ストレージコントローラ２００に送る。以上で処理を終了する。
【０２４１】
図３２は、仮想ブロック格納処理実行部１２４００の処理フローである。仮想ブロック格納処理実行部１２４００は、格納要求（指定された仮想ブロックグループに、実ブロックをそれぞれ割り当てて、ストレージコントローラ２００から送られてきたデータを格納せよという要求）を受けたときに、実行される。仮想ブロック移動処理実行部１２３００とは、データの流れが逆ではあるが、共通点が多いので、図３１の処理フローの各ステップを引用しながら説明を行う。
【０２４２】
ステップ１７０００：ステップ１６０００と同様。仮想ブロック格納処理実行部１２４００は、格納を指示された仮想セグメントの集合から、対象となる仮想ブロックグループを特定する。
【０２４３】
ステップ１７００１：仮想ブロック格納処理実行部１２４００は、ストレージコントローラ２００から以下の情報：
（＊）指定された仮想セグメントの集合の内、仮想セグメントごとにデータが格納されているかいないか、或いは、繰り返し情報が設定されているかを示す値；
（＊）圧縮後のデータ量を示す値、
を受け、それらの情報をバッファ３３０に格納する。次に、仮想ブロック格納処理実行部１２４００は、仮想ブロックグループごとの格納データ量と圧縮データ格納量の変化値を受ける。さらに、仮想ブロック格納処理実行部１２４００は、すべてのデータの格納データ量と圧縮データ格納量の変化値を受ける。最後に、仮想ブロック格納処理実行部１２４００は、仮想セグメントに格納するデータを受けるが、この際には、圧縮・伸長回路３６０Ａに圧縮処理を実行するよう指示して、圧縮後のデータをバッファ３００に格納するようにする。また、仮想ブロック格納処理実行部１２４００は、すべてのデータの格納データ量と圧縮データ格納量の変化値をパッケージデータ格納量３００６、パッケージ圧縮データ量３００７に加える。次に、仮想ブロック格納処理実行部１２４００は、指定された仮想セグメントを、仮想ブロックグループごとに分類する。
【０２４４】
ステップ１７００２：ステップ１６００２と同様。仮想ブロック格納処理実行部１２４００は、データを格納するよう指示されている仮想ブロックグループを探す。もうなければ、ステップ１７０１０へジャンプする。
【０２４５】
ステップ１７００３：仮想ブロック格納処理実行部１２４００は、当該仮想ブロックグループについての格納データ量と圧縮データ格納量の変化値を、対応する仮想ブロック情報３２００のデータ格納量３２０３と圧縮データ格納量３２０４に格納する。また、仮想ブロック格納処理実行部１２４００は、対応する仮想セグメントに関して受けた、データが格納されている、いない、或いは、繰り返し情報が設定されているかを示す値を、仮想セグメントアドレスポインタ３２０５に設定する。データが格納されているという値を受けた場合、仮想ブロック格納処理実行部１２４００は、対応する圧縮後データ格納量を、圧縮仮想セグメントデータ量３２０６にセットする。
【０２４６】
ステップ１７００４：ここでは、実ブロックが当該仮想ブロックグループに割り当てられる。割り当てられる実ブロックの数は、当該仮想ブロック情報３２００の圧縮データ格納量３２０４を基に決定される。ここでは、必要な数の実ブロックが割り当てられる。これは、図２９のステップ１４０１９に示した処理なので、説明を省略する。
【０２４７】
ステップ１７００５：仮想ブロック格納処理実行部１２４００は、当該仮想ブロック情報３２００の中で、データを格納していることを示す仮想セグメントアドレスポインタ３２０５を更新する。これは、ステップ１４０２４と同じであるため、説明を省略する。
【０２４８】
ステップ１７００６：仮想ブロック格納処理実行部１２４００は、仮想セグメント内のデータが格納されているフラッシュチップ３００に対応したチップ情報３１００を基に、当該フラッシュチップ３００が接続されているパッケージバス３４０を特定し、対応するバス転送装置３５０を特定する。
【０２４９】
ステップ１７００７：仮想ブロック格納処理実行部１２４００は、ステップ１７００６で特定したバス転送装置３５０に、フラッシュチップ３００のアドレスからバッファ３３０に当該仮想ブロックグループ全体のデータを格納するよう指示する。
【０２５０】
ステップ１７００８：転送が完了するのを待つ。
【０２５１】
ステップ１７００９：ステップ１７００２に戻る。
【０２５２】
ステップ１７０１０：ストレージコントローラ２００へ、処理要求の完了を報告する。以上で処理を終了する。
【０２５３】
図３３は、仮想容量判定処理部１２５００の処理フローである。仮想容量判定処理部１２５００は、圧縮率を把握し、当該パッケージ２３０の仮想容量を調整する必要があるかを判断する。調整する必要があると判断した場合、その容量を決定し、仮想容量判定処理部１２５００は、仮想パッケージ容量３００２に設定する。さらに、この容量と容量を変更した旨を、呼び出し元に返却する。
【０２５４】
ステップ１８０００：仮想容量判定処理部１２５００は、パッケージデータ格納量３００６／仮想パッケージ容量３００２の比を算出する。算出された比をＰとする。比Ｐが、Ｑ（Ｑは、例えば、Ｐよりも十分小さい値）以下の場合、仮想容量の調整を行わず、処理が、呼び出し元に戻る。比Ｐが、Ｑ以下の場合、まだ、それ程多くのデータが格納されていないからである。
【０２５５】
ステップ１８００１：次に、仮想容量判定処理部１２５００は、Ｒ＝（仮想パッケージ容量３００２／実パッケージ容量３００３）を算出する。また、仮想容量判定処理部１２５００は、Ｔ＝（パッケージデータ格納量３００６／パッケージ圧縮データ格納量３００７）を算出する。値Ｔは、圧縮率である。
【０２５６】
ステップ１８００２：仮想容量判定処理部１２５００は、ＲとＴを比較する。これらの値がほぼ等しければ（例えば、ＲとＴの差が所定値未満であれば）、理想的な仮想パッケージ容量３００２が設定されているということである。このため、仮想容量判定処理部１２５００は、調整を行わないことを決定し、呼び出し元に戻る。ＲのほうがＴより大きい場合（仮想容量が大き過ぎる場合）、又は、ＲのほうがＴより小さい場合（仮想容量が小さすぎる場合）、仮想容量判定処理部１２５００は、仮想パッケージ容量３００２の調整を行う。
【０２５７】
ステップ１８００３：仮想容量判定処理部１２５００は、仮想容量を調整する。調整後の仮想容量の値は、例えば、実パッケージ容量３００３＊Ｔである。これは、圧縮率Ｔが今後も変化しなければ理想値となる。調整後の仮想容量の値は、（実パッケージ容量３００３−パッケージ圧縮データ格納量３００７）＊Ｒ＋パッケージ圧縮データ格納量３００７＊Ｔでも良い。仮想容量判定処理部１２５００は、決定した値（調整後の仮想容量の値）を、仮想パッケージ容量３００２に設定し、さらに、呼び出し元に、仮想容量の調整を行うことと、この決定した値とを通知し、処理を完了させる。
【０２５８】
本実施例によれば、それぞれが多数のフラッシュメモリを実装したフラッシュパッケージを多数接続した大容量のストレージシステムにおいて、圧縮機能を適用し、データ格納容量を削減しても、性能劣化を抑えて、物理容量よりも大きな容量を格納できることが可能である。
【０２５９】
以上、本発明の一実施例を説明したが、これは本発明の説明のための例示であって、本発明の範囲をこの実施例にのみ限定する趣旨ではない。本発明は、他の種々の形態でも実施することが可能である。
【０２６０】
以下、上述した説明を基に、本発明の１以上の観点に従う概要を記載する。
【０２６１】
ストレージシステムは、複数のフラッシュパッケージと、ホストからのライト要求（以下、上位のライト要求）に従うデータに基づくライトデータのライト要求（以下、下位のライト要求）をフラッシュパッケージに送信するストレージコントローラとを有する。各フラッシュパッケージは、１以上のフラッシュメモリと、ストレージコントローラ及び１以上のフラッシュメモリに接続されるパッケージコントローラとを有する。各フラッシュメモリは、複数の実ブロックを有する。各実ブロックは、複数の実セグメントで構成されている。そのフラッシュメモリは、ブロック単位でデータが消去され、セグメント単位でデータが読み書きされるタイプのフラッシュメモリ、例えば、ＮＡＮＤ型のフラッシュメモリである。パッケージコントローラは、ストレージコントローラからのライト要求に従うライトデータを、実ブロックに書き込む。
【０２６２】
ストレージコントローラ又はパッケージコントローラが、フラッシュパッケージが有する複数のフラッシュチップの物理的な容量の合計値よりも大きな仮想的な容量をストレージコントローラに定義する。
【０２６３】
ストレージコントローラ又はパッケージコントローラが、下位のライト要求に従うライトデータを圧縮する。下位のライト要求の送信先のフラッシュパッケージのパッケージコントローラが、圧縮されたライトデータである圧縮データを、ライト先の仮想ブロックに割り当てられた実ブロックに書き込む。
【０２６４】
ストレージコントローラ又はパッケージコントローラが、フラッシュパッケージのデータ格納状況に応じて、そのフラッシュパッケージの仮想容量を変更する。データ格納状況は、典型的には、前述した圧縮率である。フラッシュパッケージの圧縮率は、そのフラッシュパッケージに格納されている有効な圧縮データの圧縮前のライトデータの総容量と、そのフラッシュパッケージに格納されている有効な圧縮データの総容量とに基づく値である。具体的には、例えば、ストレージコントローラ又はパッケージコントローラが、仮想セグメントに書き込まれた有効な圧縮後のデータの量とその有効なデータの圧縮前のデータの量とを仮想セグメントごとに管理する。フラッシュパッケージに格納されている有効な圧縮データの圧縮前のライトデータの総容量は、そのフラッシュパッケージが提供する各仮想セグメントについての、書き込まれた有効なデータの圧縮前のデータの量を基に算出された値である。フラッシュパッケージに格納されている有効な圧縮データの総容量は、そのフラッシュパッケージが提供する各仮想セグメントについての、そのフラッシュパッケージに格納されている有効な圧縮データの量を基に算出された値である。例えば、仮想ブロック＃１に実ブロック＃１が割り当てられていて、仮想ブロック＃１が仮想セグメント＃１及び＃２を含んでいるとする。ここでは、仮想セグメント長を８キロバイトとして説明を行う。仮想セグメント＃１に、データが格納され、圧縮された結果、１キロバイトの圧縮データが格納され、仮想セグメント＃２に、データが格納され、圧縮の結果２キロバイトの圧縮データが格納され、さらに、仮想セグメント＃１が、書きかえられ、圧縮の結果、３キロバイトのデータが格納されたとする。この場合、仮想セグメント＃１の有効なデータ（最新のデータ）は、３キロバイトの圧縮データであり、仮想セグメント＃２の有効なデータ（最新のデータ）は、２キロバイトの圧縮データである。このため、実ブロック＃１について、最新の圧縮データの総量は、３キロバイト＋２キロバイト＝５キロバイトである。また、実ブロック＃１について、最新の圧縮前のデータの総量は、８キロバイト＋８キロバイト＝１６キロバイトである。このように、仮想セグメントに圧縮データが格納されれば、その仮想セグメントを提供するフラッシュパッケージについて、パッケージデータ格納量３００６及びパッケージ圧縮データ格納量３００７が更新される。パッケージコントローラが、ライト先の仮想セグメントを含む仮想ブロックについて、圧縮状況情報（例えば、その仮想セグメントに書き込まれた圧縮データの量とその圧縮データの圧縮前のライトデータの量とを表す情報、及び／又は、それらの量に基づいて算出される、当該ライト時の圧縮率を表す情報）を、ストレージコントローラに送信する。圧縮状況情報は、下位のライト要求に対する完了報告に含められても良い。
【０２６５】
ストレージコントローラ又はパッケージコントローラが、フラッシュパッケージの圧縮率が増加した場合、そのフラッシュパッケージの仮想容量を増やす。データ格納量をより削減できるので、より多くのライトデータを格納することが期待されるからである。
【０２６６】
ストレージコントローラ又はパッケージコントローラが、フラッシュパッケージの圧縮率が減少した場合、そのフラッシュパッケージの仮想容量を減らす。データ格納量があまり削減されないので、あまり多くのライトデータを格納することができないことが期待されるからである。
【０２６７】
各実ページは、複数の仮想ブロックを含んでいる。ストレージコントローラは、フラッシュパッケージの仮想容量を増やす場合、そのフラッシュパッケージに基づく空きの実ページを増やし、そのフラッシュパッケージの仮想容量を減らす場合、そのフラッシュパッケージに基づく空きの実ページを減らす。このように、下位レベルの容量仮想化機能に加えて上位レベルの容量仮想化機能があれば、仮想ブロックと実ブロックの対応関係を変更することなく、仮想容量の増減を行うことができる。
【０２６８】
ライトデータの圧縮は、フラッシュチップへのライトのとき、リクラメーション処理のとき、或いは、ページ間のデータ移動のときの少なくとも１つのときに行われる。リクラメーション処理は、フラッシュパッケージにおいて必然的に行われる処理であるから、その処理のときに圧縮が行われるので、性能の低下が生じるのを抑えることが期待できる。
【０２６９】
ストレージコントローラが、フラッシュパッケージの圧縮率を基に、フラッシュパッケージ間で、移動元の実ページから移動先の実ページにデータを移動する。ストレージコントローラは、移動元の実ページに関連付けられている管理情報、移動先の実ページに関連付けられている管理情報に適用する。管理情報は、例えば、データが格納されているか、繰り返し情報が格納されているか等を含んで良い。また、フラッシュパッケージ間のデータ移動では、移動元のフラッシュパッケージが、移動元実ページに割り当てられている実ブロック内の有効な圧縮データを伸長して（又は伸長することなく）移動先のフラッシュパッケージに転送し、移動先のフラッシュパッケージが、受信したデータを圧縮して（又は圧縮済みであるため圧縮することなく）、移動先実ページに割り当てられている実ブロックに格納して良い。その際、移動元の実ページに対応する管理情報（例えば、データ格納量及び圧縮データ格納量を表す情報）はリセットされ、移動先の実ページに対応する管理情報（例えば、データ格納量及び圧縮データ格納量を表す情報）は、データ移動に伴い格納された圧縮データの量（及びその圧縮データの圧縮前のデータの量）を基に更新されて良い。
【０２７０】
パッケージコントローラは、そのパッケージコントローラにおいてリクラメーション処理を行うことができる。リクラメーション処理では、パッケージコントローラは、満杯になった移動元実ブロック内の有効なデータを移動先実ブロックに移し、移動元実ブロックに対する消去処理（移動元実ブロックに格納されているデータを消去する処理）を行うことで、移動元実ブロックを空きの実ブロックとする。このリクラメーション処理において、データの圧縮及び伸長が行われて良い。
【符号の説明】
【０２７１】
１００…ストレージシステム、１１０…ホスト、１２０…ストレージエリアネットワーク（SAN）、２００…ストレージコントローラ２００…キャッシュメモリ、２２０…共有メモリ、２３０…フラッシュパッケージ、２５０…接続装置、２６０…プロセッサ、２７０…メモリ、２８０…フラッシュパッケージグループ、３００…フラッシュチップ、３１０…パッケージプロセッサ、３２０…パッケージメモリ、３３０…バッファ、３４０…パッケージバス、３５０…パッケージ転送装置、３６０…圧縮・伸長回路、２０００…論理ボリューム情報、２１００…実ページ情報、２３００…フラッシュパッケージグループ情報、２５００…フラッシュパッケージ情報、３０００…パッケージ情報、３１００…チップ情報、３２００…仮想ブロック情報、３３００…実ブロック情報、４０００…リード処理実行部、４１００…ライト処理受付部、４２００…ライトアフタ処理実行部、４３００…ライトセイムコマンド処理実行部、４４００…実ページ移動処理実行部、１２０００…データリード処理実行部、１２１００…データライト処理実行部、１２２００…実ブロック解放処理実行部、１２３００…仮想ブロック移動処理実行部、１２４００…仮想ブロック格納処理実行部、１２５００…仮想容量判定処理部
【図１】
0005792313.tif 000002
【図２】
0005792313.tif 000003
【図３】
0005792313.tif 000004
【図４】
0005792313.tif 000005
【図５】
0005792313.tif 000006
【図６】
0005792313.tif 000007
【図７】
0005792313.tif 000008
【図８】
0005792313.tif 000009
【図９】
0005792313.tif 000010
【図１０】
0005792313.tif 000011
【図１１】
0005792313.tif 000012
【図１２】
0005792313.tif 000013
【図１３】
0005792313.tif 000014
【図１４】
0005792313.tif 000015
【図１５】
0005792313.tif 000016
【図１６】
0005792313.tif 000017
【図１７】
0005792313.tif 000018
【図１８】
0005792313.tif 000019
【図１９】
0005792313.tif 000020
【図２０】
0005792313.tif 000021
【図２１】
0005792313.tif 000022
【図２２】
0005792313.tif 000023
【図２３】
0005792313.tif 000024
【図２４】
0005792313.tif 000025
【図２５】
0005792313.tif 000026
【図２６】
0005792313.tif 000027
【図２７】
0005792313.tif 000028
【図２８】
0005792313.tif 000029
【図２９】
0005792313.tif 000030
【図３０】
0005792313.tif 000031
【図３１】
0005792313.tif 000032
【図３２】
0005792313.tif 000033
【図３３】
0005792313.tif 000034