以下、図面を参照して、実施形態を説明する。
まず、図1を参照して、一実施形態に係るメモリシステムを含む計算機システムの構成を説明する。
このメモリシステムは、不揮発性メモリにデータを書き込み、不揮発性メモリからデータを読み出すように構成された半導体ストレージデバイスである。このメモリシステムは、NANDフラッシュ技術ベースのフラッシュストレージデバイス3として実現されている。
この計算機システムは、ホスト(ホストデバイス)2と、複数のフラッシュストレージデバイス3とを含んでいてもよい。ホスト2は、複数のフラッシュストレージデバイス3によって構成されるフラッシュアレイをストレージとして使用するように構成されたサーバであってもよい。ホスト(サーバ)2と複数のフラッシュストレージデバイス3は、インタフェース50を介して相互接続される(内部相互接続)。この内部相互接続のためのインタフェース50としては、これに限定されないが、PCI Express(PCIe)(登録商標)、NVM Express(NVMe)(登録商標)、Ethernet(登録商標)、NVMe over Fabrics(NVMeOF)等を使用し得る。
ホスト2として機能するサーバの典型例としては、データセンター内のサーバが挙げられる。
ホスト2がデータセンター内のサーバによって実現されるケースにおいては、このホスト(サーバ)2は、ネットワーク51を介して複数のエンドユーザ端末(クライアント)61に接続されてもよい。ホスト2は、これらエンドユーザ端末61に対して様々なサービスを提供することができる。
ホスト(サーバ)2によって提供可能なサービスの例には、(1)システム稼働プラットフォームを各クライアント(各エンドユーザ端末61)に提供するプラットホーム・アズ・ア・サービス(PaaS)、(2)仮想サーバのようなインフラストラクチャを各クライアント(各エンドユーザ端末61)に提供するインフラストラクチャ・アズ・ア・サービス(IaaS)、等がある。
複数の仮想マシンが、このホスト(サーバ)2として機能する物理サーバ上で実行されてもよい。ホスト(サーバ)2上で走るこれら仮想マシンの各々は、対応する幾つかのクライアント(エンドユーザ端末61)に各種サービスを提供するように構成された仮想サーバとして機能することができる。
ホスト(サーバ)2は、フラッシュアレイを構成する複数のフラッシュストレージデバイス3を管理するストレージ管理機能と、エンドユーザ端末61それぞれに対してストレージアクセスを含む様々なサービスを提供するフロントエンド機能とを含む。
従来型SSDにおいては、NAND型フラッシュメモリのブロック/ページの階層構造はSSD内のフラッシュトランスレーション層(FTL)によって隠蔽されている。つまり、従来型SSDのFTLは、(1)論理物理アドレス変換テーブルとして機能するルックアップテーブルを使用して、論理アドレスそれぞれとNAND型フラッシュメモリの物理アドレスそれぞれとの間のマッピングを管理する機能、(2)ページ単位のリード/ライトとブロック単位の消去動作とを隠蔽するための機能と、(3)NAND型フラッシュメモリのガベージコレクション(GC)を実行する機能、等を有している。論理アドレスそれぞれとNAND型フラッシュメモリの物理アドレスの間のマッピングは、ホストからは見えない。NAND型フラッシュメモリのブロック/ページ構造もホストからは見えない。
一方、ホストにおいても、一種のアドレス変換(アプリケーションレベルアドレス変換)が実行されることがある。このアドレス変換は、アプリケーションレベルアドレス変換テーブルを使用して、アプリケーションレベルの論理アドレスそれぞれとSSD用の論理アドレスそれぞれとの間のマッピングを管理する。また、ホストにおいても、SSD用の論理アドレス空間上に生じるフラグメントの解消のために、この論理アドレス空間上のデータ配置を変更する一種のGC(アプリケーションレベルGC)が実行される。
しかし、ホストおよびSSDがそれぞれアドレス変換テーブルを有するという冗長な構成(SSDは論理物理アドレス変換テーブルとして機能するルックアップテーブルを有し、ホストはアプリケーションレベルアドレス変換テーブルを有する)においては、これらアドレス変換テーブルを保持するために膨大なメモリリソースが消費される。さらに、ホスト側のアドレス変換とSSD側のアドレス変換とを含む2重のアドレス変換は、I/O性能を低下させる要因にもなる。
さらに、ホスト側のアプリケーションレベルGCは、SSDへのデータ書き込み量を実際のユーザデータ量の数倍(例えば2倍)程度に増やす要因となる。このようなデータ書き込み量の増加は、SSDのライトアンプリフィケーションとあいまってシステム全体のストレージ性能を低下させ、またSSDの寿命も短くする。
このような問題点を解消するために、従来型SSDのFTLの機能の全てをホストに移すという対策も考えられる。
しかし、この対策を実装するためには、NAND型フラッシュメモリのブロックおよびページをホストが直接的にハンドリングすることが必要となる。NAND型フラッシュメモリにおいては、ページ書き込み順序制約があるため、ホストがページを直接ハンドリングすることは困難である。また、NAND型フラッシュメモリにおいては、ブロックが不良ページ(バッドページ)を含む場合がある。バッドページをハンドリングすることはホストにとってはなおさら困難である。
そこで、本実施形態では、FTLの役割はホスト2とフラッシュストレージデバイス3との間で分担される。概していえば、ホスト2は、ブロックを割り当てるためのブロックレベルFTLを実行し、フラッシュストレージデバイス3は、ブロック内のページを割り当てるためのブロック内FTLを実行する。
ホスト2は、論理アドレスそれぞれとブロック番号それぞれとの間のマッピングを管理するためのブロックレベルアドレス変換テーブルであるブロックレベルルックアップテーブル(ブロックレベルLUT)を管理し、フラッシュストレージデバイス3は、論理アドレスそれぞれと各ブロックのブロック内物理アドレスとの間のマッピングを管理するためのページレベルアドレス変換テーブルであるブロック内ルックアップテーブル(ブロック内LUT)を管理する。
フラッシュストレージデバイス3にデータを書き込む必要がある時、ホスト2は、ブロック番号を選択(またはフラッシュストレージデバイス3にフリーブロックを割り当てるように要求)し、論理アドレスと、選択したブロックのブロック番号(またはフラッシュストレージデバイス3によって通知される割り当てられたブロックのブロック番号)とを指定するライト要求(ライトコマンド)をフラッシュストレージデバイス3に送信する。フラッシュストレージデバイス3は、ライト要求(ライトコマンド)内の指定されたブロック番号に対応するブロックにホスト2からのデータを書き込む。この場合、フラッシュストレージデバイス3、このブロック内の書き込み先位置を決定し、ホスト2からのデータをこの書き込み先位置に書き込む。
ホスト2のブロックレベルFTLは、ストレージサービスを実行する機能、ウェアー制御機能、高可用性を実現するための機能、同じ内容を有する複数の重複データ部がストレージに格納されることを防止する重複排除(De-duplication)機能、ガベージコレクション(GC)ブロック選択機能、QoS制御機能等を有する。QoS制御機能には、QoSドメイン毎(またはブロック毎)にアクセス単位を決める機能が含まれる。アクセス単位は、ホスト2がライト/リードすることが可能な最小データサイズ(Grain)を示す。フラッシュストレージデバイス3は単一、あるいは複数のアクセス単位(Grain)をサポートしており、ホスト2は、フラッシュストレージデバイス3が複数のアクセス単位をサポートしている場合にはQoSドメイン毎(またはブロック毎)に、使用すべきアクセス単位をフラッシュストレージデバイス3に指示することができる。
また、QoS制御機能には、QoSドメイン間の性能干渉をできるだけ防ぐための機能が含まれている。この機能は、基本的には、安定したレイテンシを保つための機能である。
一方、フラッシュストレージデバイス3のブロック内FTLは、ブロック内のページを割り当てる機能に加え、GC実行機能を有する。GC実行機能は、ホスト2によって選択されたコピー元ブロック(GCソースブロック)内の有効データを、ホスト2によって選択されたコピー先ブロック(GCデスティネーションブロック)にコピーする。フラッシュストレージデバイス3のブロック内FTLは、有効データを書き込むべきGCデスティネーションブロック内の位置(コピー先位置)を決定し、GCソースブロック内の有効データを、GCデスティネーションブロック内のコピー先位置にコピーする。
図2は、従来型SSDとホストとの間の役割分担と、本実施形態のフラッシュストレージデバイス3とホスト2との間の役割分担とを示す。
図2の左部は、従来型SSDと仮想ディスクサービスを実行するホストとを含む計算機システム全体の階層構造を表している。
ホスト(サーバ)においては、複数のエンドユーザに複数の仮想マシンを提供するための仮想マシンサービス101が実行される。仮想マシンサービス101上の各仮想マシンにおいては、対応するエンドユーザによって使用されるオペレーティングシステムおよびユーザアプリケーション102が実行される。
また、ホスト(サーバ)においては、複数のユーザアプリケーション102に対応する複数の仮想ディスクサービス103が実行される。各仮想ディスクサービス103は、従来型SSD内のストレージリソースの容量の一部を、対応するユーザアプリケーション102用のストレージリソース(仮想ディスク)として割り当てる。各仮想ディスクサービス103においては、アプリケーションレベルアドレス変換テーブルを使用して、アプリケーションレベルの論理アドレスをSSD用の論理アドレスに変換するアプリケーションレベルアドレス変換も実行される。さらに、ホストにおいては、アプリケーションレベルGC104も実行される。
ホスト(サーバ)から従来型SSDへのコマンドの送信および従来型SSDからホスト(サーバ)へのコマンド完了のレスポンスの返送は、ホスト(サーバ)および従来型SSDの各々に存在するI/Oキュー200を介して実行される。
従来型SSDは、ライトバッファ(WB)301、ルックアップテーブル(LUT)302、ガベージコレクション機能303、NAND型フラッシュメモリ(NANDフラッシュアレイ)304を含む。従来型SSDは、一つのルックアップテーブル(LUT)302のみを管理しており、NAND型フラッシュメモリ(NANDフラッシュアレイ)304のリソースは複数の仮想ディスクサービス103によって共有される。
この構成においては、仮想ディスクサービス103下のアプリケーションレベルGC104と従来型SSD内のガベージコレクション機能303(LUTレベルGC)とを含む重複したGCにより、ライトアンプリフィケーションが大きくなる。また、従来型SSDにおいては、あるエンドユーザまたはある仮想ディスクサービス103からのデータ書き込み量の増加によってGCの頻度が増加し、これによって他のエンドユーザまたは他の仮想ディスクサービス103に対するI/O性能が劣化するというノイジーネイバー問題が生じうる。
また、各仮想ディスクサービス内のアプリケーションレベルアドレス変換テーブルと従来型SSD内のLUT302とを含む重複したリソースの存在により、多くのメモリリソースが消費される。
図2の右部は、本実施形態のフラッシュストレージデバイス3とホスト2とを含む計算機システム全体の階層構造を表している。
ホスト(サーバ)2においては、複数のエンドユーザに複数の仮想マシンを提供するための仮想マシンサービス401が実行される。仮想マシンサービス401上の各仮想マシンにおいては、対応するエンドユーザによって使用されるオペレーティングシステムおよびユーザアプリケーション402が実行される。
また、ホスト(サーバ)2においては、複数のユーザアプリケーション402に対応する複数のI/Oサービス403が実行される。これらI/Oサービス403には、LBAベースのブロックI/Oサービス、キー・バリュー・ストアサービスなどが含まれてもよい。各I/Oサービス403は、論理アドレスそれぞれとフラッシュストレージデバイス3のブロック番号それぞれとの間のマッピングを管理するブロックレベルLUTを含む。ここで、論理アドレスとは、アクセス対象のデータを識別可能な識別子を意味する。この論理アドレスは、論理アドレス空間上の位置を指定する論理ブロックアドレス(LBA)であってもよいし、あるいは、キー・バリュー・ストアのキー(タグ)であってもよいし、キーのハッシュ値であってもよい。
LBAベースのブロックI/Oサービスにおいては、論理アドレス(LBA)それぞれとフラッシュストレージデバイス3のブロック番号それぞれとの間のマッピングを管理するブロックレベルLUTが使用されてもよい。
キー・バリュー・ストアサービスにおいては、論理アドレス(つまり、キーのようなタグ)それぞれとこれら論理アドレス(つまり、キーのようなタグ)に対応するデータが格納されているフラッシュストレージデバイス3のブロック番号それぞれとの間のマッピングを管理するブロックレベルLUTが使用されてもよい。このブロックレベルLUTにおいては、タグと、このタグによって識別されるデータが格納されているブロック番号と、このデータのデータ長との対応関係が管理されてもよい。
各エンドユーザは、使用すべきアドレッシング方法(LBA、キー・バリュー・ストアのキー、等)を選択することができる。
これら各ブロックレベルLUTは、ユーザアプリケーション402からの論理アドレスそれぞれをフラッシュストレージデバイス3用の論理アドレスそれぞれに変換するのではなく、ユーザアプリケーション402からの論理アドレスそれぞれをフラッシュストレージデバイス3のブロック番号それぞれに変換する。つまり、これら各ブロックレベルLUTは、フラッシュストレージデバイス3用の論理アドレスをブロック番号に変換するテーブルとアプリケーションレベルアドレス変換テーブルとが統合(マージ)されたテーブルである。
また、各I/Oサービス403は、GCブロック選択機能を含む。GCブロック選択機能は、対応するブロックレベルLUTを使用して各ブロックの有効データ量を管理することができ、これによってGCソースブロックを選択することができる。
ホスト(サーバ)2においては、上述のQoSドメイン毎にI/Oサービス403が存在してもよい。あるQoSドメインに属するI/Oサービス403は、対応するQoSドメイン内のユーザアプリケーション402によって使用される論理アドレスそれぞれと対応するQoSドメインに割り当てられたリソースグループに属するブロック群のブロック番号それぞれとの間のマッピングを管理する。
ホスト(サーバ)2からフラッシュストレージデバイス3へのコマンドの送信およびフラッシュストレージデバイス3からホスト(サーバ)2へのコマンド完了のレスポンス等の返送は、ホスト(サーバ)2およびフラッシュストレージデバイス3の各々に存在するI/Oキュー500を介して実行される。これらI/Oキュー500も、複数のQoSドメインに対応する複数のキューグループに分類されていてもよい。
フラッシュストレージデバイス3は、複数のQoSドメインに対応する複数のライトバッファ(WB)601、複数のQoSドメインに対応する複数のブロック内LUT602、複数のQoSドメインに対応する複数のガベージコレクション(GC)機能603、NAND型フラッシュメモリ(NANDフラッシュアレイ)604を含む。
この図2の右部に示す構成においては、上位階層(ホスト2)はブロック境界を認識することができるので、ブロック境界/ブロックサイズを考慮してユーザデータを各ブロックに書き込むことができる。つまり、ホスト2はNAND型フラッシュメモリ(NANDフラッシュアレイ)604の個々のブロックを認識することができ、これにより、例えば、一つのブロック全体に一斉にデータを書き込む、一つのブロック内のデータ全体を削除または更新によって無効化する、といった制御を行うことが可能となる。この結果、一つのブロックに有効データと無効データが混在されるという状況を起こりにくくすることが可能となる。したがって、GCを実行することが必要となる頻度を低減することができる。GCの頻度を低減することにより、ライトアンプリフィケーションが低下され、フラッシュストレージデバイス3の性能の向上、フラッシュストレージデバイス3の寿命の最大化を実現できる。このように、上位階層(ホスト2)がブロック番号を認識可能な構成は有用である。
一方、ページ書き込み順序制約により、現在書き込み可能なページはブロックあたり1ページのみである。このため、ページ番号を上位階層に見せることは、ブロック番号を上位階層に見せることに比較して有用ではない。
図3は、図1のシステム構成の変形例を示す。
図3においては、複数のホスト2Aと複数のフラッシュストレージデバイス3との間のデータ転送がネットワーク機器(ここでは、ネットワークスイッチ1)を介して実行される。
すなわち、図3の計算機システムにおいては、図1のサーバ2のストレージ管理機能がマネージャ2Bに移され、且つサーバ2のフロントエンド機能が複数のホスト(エンドユーザサービス用ホスト)2Aに移されている。
マネージャ2Bは、複数のフラッシュストレージデバイス3を管理し、各ホスト(エンドユーザサービス用ホスト)2Aからの要求に応じて、これらフラッシュストレージデバイス3のストレージリソースを各ホスト(エンドユーザサービス用ホスト)2Aに割り当てる。
各ホスト(エンドユーザサービス用ホスト)2Aは、ネットワークを介して一つ以上のエンドユーザ端末61に接続される。各ホスト(エンドユーザサービス用ホスト)2Aは、上述のブロックレベルLUTを管理する。各ホスト(エンドユーザサービス用ホスト)2Aは、自身のブロックレベルLUTを使用して、対応するエンドユーザによって使用される論理アドレスそれぞれと自身に割り当てられたリソースのブロック番号それぞれとの間のマッピングのみを管理する。したがって、この構成は、システムを容易にスケールアウトすることを可能にする。
各ホスト2AのブロックレベルFTLは、ブロックレベルLUTを管理する機能、高可用性を実現するための機能、QoS制御機能、GCブロック選択機能等を有する。
マネージャ2Bは、複数のフラッシュストレージデバイス3を管理するための専用のデバイス(計算機)である。マネージャ2Bは、各ホスト2Aから要求された容量分のストレージリソースを予約するグローバルリソース予約機能を有する。さらに、マネージャ2Bは、各フラッシュストレージデバイス3の消耗度を監視するためのウェアー監視機能、予約されたストレージリソース(NANDリソース)を各ホスト2Aに割り当てるNANDリソース割り当て機能、QoS制御機能、グローバルクロック管理機能、等を有する。
各フラッシュストレージデバイス3のブロック内FTLは、ライトバッファを管理する機能、GC実行機能等を有する。
図3のシステム構成によれば、各フラッシュストレージデバイス3の管理はマネージャ2Bによって実行されるので、各ホスト2Aは、自身に割り当てられた一つ以上のフラッシュストレージデバイス3にI/O要求を送信する動作と、フラッシュストレージデバイス3からのレスポンスを受信するという動作とのみを実行すればよい。つまり、複数のホスト2Aと複数のフラッシュストレージデバイス3との間のデータ転送はスイッチ1のみを介して実行され、マネージャ2Bはこのデータ転送には関与しない。また、上述したように、ホスト2Aそれぞれによって管理されるブロックレベルLUTの内容は互いに独立している。よって、容易にホスト2Aの数を増やすことができるので、スケールアウト型のシステム構成を実現することができる。
図4は、フラッシュストレージデバイス3の構成例を示す。
フラッシュストレージデバイス3は、コントローラ4および不揮発性メモリ(NAND型フラッシュメモリ)5を備える。フラッシュストレージデバイス3は、ランダムアクセスメモリ、例えば、DRAM6も備えていてもよい。
NAND型フラッシュメモリ5は、マトリクス状に配置された複数のメモリセルを含むメモリセルアレイを含む。NAND型フラッシュメモリ5は、2次元構造のNAND型フラッシュメモリであってもよいし、3次元構造のNAND型フラッシュメモリであってもよい。
NAND型フラッシュメモリ5のメモリセルアレイは、複数のブロックBLK0~BLKm-1を含む。ブロックBLK0~BLKm-1の各々は多数のページ(ここではページP0~Pn-1)によって編成される。ブロックBLK0~BLKm-1は、消去単位として機能する。ブロックは、「消去ブロック」、「物理ブロック」、または「物理消去ブロック」と称されることもある。ページP0~Pn-1の各々は、同一ワード線に接続された複数のメモリセルを含む。ページP0~Pn-1は、データ書き込み動作およびデータ読み込み動作の単位である。
コントローラ4は、Toggle、オープンNANDフラッシュインタフェース(ONFI)のようなNANDインタフェース13を介して、不揮発性メモリであるNAND型フラッシュメモリ5に電気的に接続されている。コントローラ4は、NAND型フラッシュメモリ5を制御するように構成されたメモリコントローラ(制御回路)である。
NAND型フラッシュメモリ5は、図5に示すように、複数のNAND型フラッシュメモリダイを含む。各NAND型フラッシュメモリダイは、複数のブロックBLKを含むメモリセルアレイとこのメモリセルアレイを制御する周辺回路とを含む不揮発性メモリダイである。個々のNAND型フラッシュメモリダイは独立して動作可能である。このため、NAND型フラッシュメモリダイは、並列動作単位として機能する。NAND型フラッシュメモリダイは、「NAND型フラッシュメモリチップ」または「不揮発性メモリチップ」とも称される。図5においては、NANDインタフェース13に16個のチャンネルCh1、Ch2、…Ch16が接続されており、これらチャンネルCh1、Ch2、…Ch16の各々に、同数(例えばチャンネル当たり2個のダイ)のNAND型フラッシュメモリダイそれぞれが接続されている場合が例示されている。各チャンネルは、対応するNAND型フラッシュメモリダイと通信するための通信線(メモリバス)を含む。
コントローラ4は、チャンネルCh1、Ch2、…Ch16を介してNAND型フラッシュメモリダイ#1~#32を制御する。コントローラ4は、チャンネルCh1、Ch2、…Ch16を同時に駆動することができる。
チャンネルCh1~Ch16に接続された16個のNAND型フラッシュメモリダイ#1~#16は第1のバンクとして編成されてもよく、またチャンネルCh1~Ch16に接続された残りの16個のNAND型フラッシュメモリダイ#17~#32は第2のバンクとして編成されてもよい。バンクは、複数のメモリモジュールをバンクインタリーブによって並列動作させるための単位として機能する。図5の構成例においては、16チャンネルと、2つのバンクを使用したバンクインタリーブとによって、最大32個のNAND型フラッシュメモリダイを並列動作させることができる。
本実施形態では、コントローラ4は、各々が複数のブロックBLKから構成される複数のブロック(以下、スーパーブロックと称する)を管理してもよく、スーパーブロックの単位で消去動作を実行してもよい。
スーパーブロックは、これに限定されないが、NAND型フラッシュメモリダイ#1~#32から一つずつ選択される計32個のブロックBLKを含んでいてもよい。なお、NAND型フラッシュメモリダイ#1~#32の各々はマルチプレーン構成を有していてもよい。例えば、NAND型フラッシュメモリダイ#1~#32の各々が、2つのプレーンを含むマルチプレーン構成を有する場合には、一つのスーパーブロックは、NAND型フラッシュメモリダイ#1~#32に対応する64個のプレーンから一つずつ選択される計64個のブロックBLKを含んでいてもよい。図6には、一つのスーパーブロックSBが、NAND型フラッシュメモリダイ#1~#32から一つずつ選択される計32個のブロックBLK(図5においては太枠で囲まれているブロックBLK)から構成される場合が例示されている。
図4に示されているように、コントローラ4は、ホストインタフェース11、CPU12、NANDインタフェース13、およびDRAMインタフェース14等を含む。これらCPU12、NANDインタフェース13、DRAMインタフェース14は、バス10を介して相互接続される。
このホストインタフェース11は、ホスト2との通信を実行するように構成されたホストインタフェース回路である。このホストインタフェース11は、例えば、PCIeコントローラ(NVMeコントローラ)であってよい。ホストインタフェース11は、ホスト2から様々な要求(コマンド)を受信する。これら要求(コマンド)には、ライト要求(ライトコマンド)、リード要求(リードコマンド)、他の様々な要求(コマンド)が含まれる。
CPU12は、ホストインタフェース11、NANDインタフェース13、DRAMインタフェース14を制御するように構成されたプロセッサである。CPU12は、フラッシュストレージデバイス3の電源オンに応答してNAND型フラッシュメモリ5または図示しないROMから制御プログラム(ファームウェア)をDRAM6にロードし、そしてこのファームウェアを実行することによって様々な処理を行う。なお、ファームウェアはコントローラ4内の図示しないSRAM上にロードされてもよい。このCPU12は、ホスト2からの様々なコマンドを処理するためのコマンド処理等を実行することができる。CPU12の動作は、CPU12によって実行される上述のファームウェアによって制御される。なお、コマンド処理の一部または全部は、コントローラ4内の専用ハードウェアによって実行してもよい。
CPU12は、ライト動作制御部21、リード動作制御部22、およびGC動作制御部23として機能することができる。これらライト動作制御部21、リード動作制御部22、およびGC動作制御部23においては、図2の右部に示すシステム構成を実現するためのアプリケーションプログラムインタフェース(API)が実装されている。
ライト動作制御部21は、ブロック番号と論理アドレスを指定するライト要求(ライトコマンド)をホスト2から受信する。論理アドレスは、書き込むべきデータ(ユーザデータ)を識別可能な識別子であり、例えば、LBAであってもよいし、あるいはキー・バリュー・ストアのキーのようなタグであってもよいし、キーのハッシュ値であってもよい。ブロック番号は、このデータが書き込まれるべきブロックを指定する識別子である。ブロック番号としては、複数のブロック内の任意の一つを一意に識別可能な様々な値を使用し得る。ブロック番号によって指定されるブロックは、物理ブロックであってもよいし、上述のスーパーブロックであってもよい。ライトコマンドを受信した場合、ライト動作制御部21は、まず、ホスト2からのデータを書き込むべき、この指定されたブロック番号を有するブロック(書き込み先ブロック)内の位置(書き込み先位置)を決定する。次いで、ライト動作制御部21は、ホスト2からのデータ(ライトデータ)を、この書き込み先ブロックの書き込み先位置に書き込む。この場合、ライト動作制御部21は、ホスト2からのデータのみならず、このデータとこのデータの論理アドレスの双方を書き込み先ブロックに書き込むことができる。
そして、ライト動作制御部21は、論理アドレスそれぞれとこのブロックのブロック内物理アドレスそれぞれとの間のマッピングを管理するブロック内LUT32を更新して、この書き込み先ブロックの上述の書き込み先位置を示すブロック内物理アドレスをライトデータの論理アドレスにマッピングする。
この場合、このブロック内物理アドレスは、この書き込み先ブロック内の書き込み先位置を示すブロック内オフセットによって表される。
この場合、このブロック内オフセットは、書き込み先ブロックの先頭から書き込み先位置までのオフセット、つまり書き込み先ブロックの先頭に対する書き込み先位置のオフセットを示す。書き込み先ブロックの先頭から書き込み先位置までのオフセットのサイズは、ページサイズとは異なるサイズを有する粒度(Grain)の倍数で示される。粒度(Grain)は、上述のアクセス単位である。粒度(Grain)のサイズの最大値は、ブロックサイズまでに制限される。換言すれば、ブロック内オフセットは、書き込み先ブロックの先頭から書き込み先位置までのオフセットをページサイズとは異なるサイズを有する粒度の倍数で示す。
粒度(Grain)は、ページサイズよりも小さいサイズを有していてもよい。例えば、ページサイズが16Kバイトである場合、粒度(Grain)は、そのサイズが4Kバイトであってもよい。この場合、ある一つのブロックにおいては、各々サイズが4Kバイトである複数のオフセット位置が規定される。ブロック内の最初のオフセット位置に対応するブロック内オフセットは、例えば0であり、ブロック内の次のオフセット位置に対応するブロック内オフセットは、例えば1である、ブロック内のさらに次のオフセット位置に対応するブロック内オフセットは、例えば2である。
あるいは、粒度(Grain)は、ページサイズよりも大きなサイズを有していてもよい。例えば、粒度(Grain)は、ページサイズの数倍のサイズであってもよい。ページサイズが16Kバイトである場合、粒度は、32Kバイトのサイズであってもよい。
このように、ライト動作制御部21は、ホスト2からのブロック番号を有するブロック内の書き込み先位置を自身で決定し、そしてホスト2からのライトデータをこのブロック内のこの書き込み先位置に書き込む。そして、ライト動作制御部21は、このブロックに対応するブロック内LUT32を更新して、書き込み先位置を示すブロック内物理アドレス(ブロック内オフセット)をライトデータの論理アドレスにマッピングする。これにより、フラッシュストレージデバイス3は、ブロック番号をホスト2にハンドリングさせつつ、ページ書き込み順序制約、バッドページ、ページサイズ等を隠蔽することができる。
この結果、ホスト2は、ブロック境界は認識できるが、ページ書き込み順序制約、バッドページ、ページサイズについては意識することなく、どのユーザデータがどのブロック番号に存在するかを管理することができる。
リード動作制御部22は、論理アドレスとブロック番号を指定するリード要求(リードコマンド)をホスト2から受信した場合、この論理アドレスを使用して、このリード要求によって指定されたブロック番号を有するブロックに対応するブロック内LUT32を参照する。これにより、リード動作制御部22は、この論理アドレスに対応するデータが格納されている、このブロックのブロック内物理アドレス(ブロック内オフセット)を取得することができる。そして、リード動作制御部22は、リード要求によって指定されたブロック番号と、取得されたブロック内物理アドレスとに基づいて、この論理アドレスに対応するデータをNAND型フラッシュメモリ5からリードする。
この場合、リード対象のブロックは、ブロック番号によって特定される。このブロック内のリード対象の物理記憶位置は、ブロック内オフセットによって特定される。リード対象の物理記憶位置を得るために、リード動作制御部22は、まず、このブロック内オフセットを、ページサイズを表す粒度の数(ここでは、4)で除算し、そしてこの除算によって得られる商および余りを、リード対象のページ番号およびリード対象のページ内オフセットとしてそれぞれ決定してもよい。
GC動作制御部23は、NAND型フラッシュメモリ5のガベージコレクションのためのコピー元ブロック番号(GCソースブロック番号)およびコピー先ブロック番号(GCデスティネーションブロック番号)を指定するGC制御コマンドをホスト2から受信した場合、NAND型フラッシュメモリ5の複数のブロックから、指定されたコピー元ブロック番号を有するブロックと指定されたコピー先ブロック番号を有するブロックとをコピー元ブロック(GCソースブロック)およびコピー先ブロック番号(GCデスティネーションブロック)として選択する。GC動作制御部23は、選択されたGCソースブロックに格納されている有効データを書き込むべきGCデスティネーションブロック内のコピー先位置を決定し、有効データをGCデスティネーションブロック内のコピー先位置にコピーする。
そして、GC動作制御部23は、有効データの論理アドレスにマッピングされているブロック内物理アドレス(ブロック内オフセット)が、この有効データが格納されているGCソースブロック内のコピー元位置を示すブロック内物理アドレスから、GCデスティネーションブロック内のコピー先位置を示すブロック内物理アドレスに変更されるように、GCソースブロックに対応するブロック内LUTとGCデスティネーションブロックに対応するブロック内LUTを更新する。
有効データ/無効データの管理は、ブロック管理テーブル33を使用して実行されてもよい。このブロック管理テーブル33は、例えば、ブロック毎に存在してもよい。あるブロックに対応するブロック管理テーブル33においては、このブロック内のデータそれぞれの有効/無効を示すビットマップフラグが格納されている。ここで、有効データとは、論理アドレスから最新のデータとして紐付けられているデータであって、後にホスト2からリードされる可能性があるデータを意味する。無効データとは、もはやホスト2からリードされる可能性が無いデータを意味する。例えば、ある論理アドレスに関連付けられているデータは有効データであり、どの論理アドレスにも関連付けられていないデータは無効データである。
上述したように、GC動作制御部23は、コピー元ブロック(GCソースブロック)内に格納されている有効データを書き込むべきコピー先ブロック(GCデスティネーションブロック)内の位置(コピー先位置)を決定し、有効データをコピー先ブロック(GCデスティネーションブロック)のこの決定された位置(コピー先位置)にコピーする。この場合、GC動作制御部23は、有効データとこの有効データの論理アドレスの双方を、コピー先ブロック(GCデスティネーションブロック)にコピーしてもよい。
本実施形態では、上述したように、ライト動作制御部21は、ホスト2からのデータ(ライトデータ)とホスト2からの論理アドレスの双方を書き込み先ブロックに書き込むことができる。このため、GC動作制御部23は、コピー元ブロック(GCソースブロック)内の各データの論理アドレスをこのコピー元ブロック(GCソースブロック)から容易に取得することができるので、コピー元ブロックに対応するブロック内LUTおよびコピー先ブロックに対応するブロック内LUTを容易に更新することができる。
NANDインタフェース13は、CPU12の制御の下、NAND型フラッシュメモリ5を制御するように構成されたメモリ制御回路である。DRAMインタフェース14は、CPU12の制御の下、DRAM6を制御するように構成されたDRAM制御回路である。DRAM6の記憶領域の一部は、ライトバッファ(WB)31の格納のために使用される。また、DRAM6の記憶領域の他の一部は、ブロック内LUT32、ブロック管理テーブル32の格納のために使用される。なお、これらライトバッファ(WB)31、ブロック内LUT32、およびブロック管理テーブル32は、コントローラ4内の図示しないSRAMに格納されてもよい。
図7は、ホスト2によって管理されるブロックレベルLUT(ブロックレベルアドレス変換テーブル)とフラッシュストレージデバイス3によって管理されるブロック内LUT(ブロック内アドレス変換テーブル)を示す。
ブロックレベルLUTは、論理アドレスそれぞれとフラッシュストレージデバイス3の複数のブロックそれぞれに対応するブロック番号それぞれとの間のマッピングを管理する。このブロックレベルLUTは、ある論理アドレスをあるブロック番号BLK#に変換するテーブルである。
フラッシュストレージデバイス3においては、複数のブロックそれぞれに対応する複数のブロック内LUTが管理される。各ブロック内LUTは、論理アドレスそれぞれと対応するブロック内のブロック内物理アドレス(フロック内オフセット)それぞれの間のマッピングを管理する。各ブロック内LUTは、ある論理アドレスをあるブロック内物理アドレス(ブロック内PBA)に変換するテーブルである。ブロック内物理アドレス(ブロック内PBA)は、上述したようにブロック内オフセットによって表される。
アドレス変換は以下のように実行される。
例えば、リード動作においては、ホスト2は、ある論理アドレス(例えば、あるLBA)を使用してブロックレベルLUTを参照して、この論理アドレス(LBA)をブロック番号BLK#に変換する。この論理アドレスおよびブロック番号BLK#がホスト2からフラッシュストレージデバイス3に送信される。本実施形態においては、各ブロックに特定の論理アドレス範囲を割り当てるのではなく、どのブロックに対しても任意の論理アドレスに対応するデータを格納できるようにするために、この論理アドレスそのものがブロック番号BLK#と一緒にホスト2からフラッシュストレージデバイス3に送信される。
フラッシュストレージデバイス3においては、コントローラ4は、ブロック番号BLK#に対応するブロック内LUTを選択する。例えば、ホスト2からのブロック番号BLK#がブロック番号BLK#0を示すならば、ブロック番号BLK#0に対応するブロック内LUTが選択され、ホスト2からのブロック番号BLK#がブロック番号BLK#1を示すならば、ブロック番号BLK#1に対応するブロック内LUTが選択され、ホスト2からのブロック番号BLK#がブロック番号BLK#2を示すならば、ブロック番号BLK#2に対応するブロック内LUTが選択される。
選択されたブロック内LUTは、ホスト2からの論理アドレスによって参照される。そして、この論理アドレスに対応するブロック内PBAが選択されたブロック内LUTから取得される。
図8は、フラッシュストレージデバイス3に適用されるライトコマンドを示す。
ライトコマンドは、フラッシュストレージデバイス3にデータの書き込みを要求するコマンドである。このライトコマンドは、コマンドID、ブロック番号BLK#、論理アドレス、長さ、等を含んでもよい。
コマンドIDはこのコマンドがライトコマンドであることを示すID(コマンドコード)であり、ライトコマンドにはライトコマンド用のコマンドIDが含まれる。
ブロック番号BLK#は、データが書き込まれるべきブロックを一意に識別可能な識別子(ブロックアドレス)である。
論理アドレスは、書き込まれるべきライトデータを識別するための識別子である。この論理アドレスは、上述したように、LBAであってもよいし、キー・バリュー・ストアのキーであってもよいし、キーのハッシュ値であってもよい。論理アドレスがLBAである場合には、このライトコマンドに含まれる論理アドレス(開始LBA)は、ライトデータが書き込まれるべき論理位置(最初の論理位置)を示す。
長さは、書き込まれるべきライトデータの長さを示す。この長さ(データ長)は、粒度(Grain)の数によって指定されてもよいし、LBAの数によって指定されてもよいし、あるいはそのサイズがバイトによって指定されてもよい。
ホスト2からライトコマンドを受信した時、コントローラ4は、ライトコマンドによって指定されたブロック番号を有するブロック内の書き込み先位置を決定する。この書き込み先位置は、ページ書き込み順序の制約およびバッドページ等を考慮して決定される。そして、コントローラ4は、ホスト2からのデータを、ライトコマンドによって指定されたブロック番号を有するこのブロック内のこの書き込み先位置に書き込む。
図8は、フラッシュストレージデバイス3に適用されるTrimコマンドを示す。
このTrimコマンドは、無効にすべきデータが格納されているブロックのブロック番号およびこのデータの論理アドレスを含むコマンドである。このTrimコマンドは、コマンドID、ブロック番号BLK#、論理アドレス、長さを含む。
コマンドIDはこのコマンドがTrimコマンドであることを示すID(コマンドコード)であり、TrimコマンドにはTrimコマンド用のコマンドIDが含まれる。
ブロック番号は、無効化すべきデータが格納されているブロックを示す。
論理アドレスは、無効化すべきデータの最初の論理位置を示す。
長さは、無効化すべきデータの長さを示す。この長さ(データ長)は、論理アドレスの数によって指定されてもよいし、粒度(Grain)の数によって指定されてもよいし、バイトによって指定されてもよい。
コントローラ4は、複数のブロックの各々に含まれるデータそれぞれの有効/無効を示すフラグ(ビットマップフラグ)をブロック管理テーブル33を使用して管理する。無効にすべきデータが格納されているブロックを示すブロック番号および論理アドレスを含むTrimコマンドをホスト2から受信した場合、コントローラ4は、ブロック管理テーブル33を更新して、Trimコマンドに含まれるブロック番号および論理アドレスによって特定されるブロック内物理アドレスに対応するフラグ(ビットマップフラグ)を無効を示す値に変更する。
図10は、ブロック内物理アドレスを規定するブロック内オフセットを示す。
ブロック番号はある一つのブロックBLKを指定する。各ブロックBLKは、図10に示されているように、複数のページ(ここでは、ページ0~ページn)を含む。
ページサイズ(各ページのユーザデータ格納領域)が16Kバイトであり、粒度(Grain)が4KBのサイズであるケースにおいては、このブロックBLKは、4×(n+1)個の領域に論理的に分割される。
オフセット+0はページ0の最初の4KB領域を示し、オフセット+1はページ0の2番目の4KB領域を示し、オフセット+2はページ0の3番目の4KB領域を示し、オフセット+3はページ0の4番目の4KB領域を示す。
オフセット+4はページ1の最初の4KB領域を示し、オフセット+5はページ1の2番目の4KB領域を示し、オフセット+6はページ1の3番目の4KB領域を示し、オフセット+7はページ1の4番目の4KB領域を示す。
図11は、ライトコマンドに応じて実行される書き込み動作を示す。
いま、ブロックBLK#1が書き込み先ブロックとして割り当てられている場合を想定する。コントローラ4は、ページ0、ページ1、ページ2、…ページnという順序で、データをページ単位でブロックBLK#1に書き込む。
図11においては、ブロックBLK#1のページ0に16Kバイト分のデータがすでに書き込まれている状態で、ブロック番号(=BLK#1)、論理アドレス(LBAx)および長さ(=4)を指定するライトコマンドがホスト2から受信された場合が想定されている。コントローラ4は、ブロックBLK#1のページ1を書き込み先位置として決定し、ホスト2から受信される16Kバイト分のライトデータをブロックBLK#1のページ1に書き込む。そして、コントローラ4は、ブロックBLK#1に対応するブロック内LUT32を更新して、オフセット+5、オフセット+6、オフセット+7、オフセット+8をLBAx、LBAx+1、LBAx+2、LBAx+3にそれぞれマッピングする。
図12は、不良ページ(バッドページ)をスキップする書き込み動作を示す。
図12においては、ブロックBLK#1のページ0、ページ1にデータがすでに書き込まれている状態で、ブロック番号(=BLK#1)、論理アドレス(LBAx+1)および長さ(=4)を指定するライトコマンドがホスト2から受信された場合が想定されている。もしブロックBLK#1のページ2が不良ページであるならば、コントローラ4は、ブロックBLK#1のページ3を書き込み先位置として決定し、ホスト2から受信される16Kバイト分のライトデータをブロックBLK#1のページ3に書き込む。そして、コントローラ4は、ブロックBLK#1に対応するブロック内LUT32を更新して、オフセット+12、オフセット+13、オフセット+14、オフセット+15をLBAx+1、LBAx+2、LBAx+3、LBAx+4にそれぞれマッピングする。
図13は、不良ページをスキップする書き込み動作の別の例を示す。
図13においては、不良ページを挟む2つのページに跨がってデータが書き込まれる場合が想定されている。いま、ブロックBLK#2のページ0、ページ1にデータがすでに書き込まれており、且つライトバッファ31に未書き込みの8Kバイト分のライトデータが残っている場合を想定する。この状態で、ブロック番号(=BLK#2)、論理アドレス(LBAy)および長さ(=6)を指定するライトコマンドが受信されたならば、コントローラ4は、未書き込みの8Kバイトライトデータと、ホスト2から新たに受信される24Kバイトライトデータ内の最初の8Kバイトライトデータとを使用して、ページサイズに対応する16Kバイトライトデータを準備する。そして、コントローラ4は、この準備した16KバイトライトデータをブロックBLK#2のページ2に書き込む。
もしブロックBLK#2の次のページ3が不良ページであるならば、コントローラ4は、ブロックBLK#2のページ4を次の書き込み先位置として決定し、ホスト2から受信された24Kバイトライトデータ内の残りの16Kバイトライトデータを、ブロックBLK#2のページ4に書き込む。
そして、コントローラ4は、ブロックBLK#2に対応するブロック内LUT32を更新して、オフセット+10、オフセット+11をLBAy、LBAy+1にマッピングし、且つオフセット+16、オフセット+17、オフセット+18、オフセット+19をLBAy+2、LBAy+3、LBAy+4、LBAy+5にそれぞれマッピングする。
図14、図15は、論理アドレスとデータのペアをブロック内のページに書き込む動作を示す。
各ブロックにおいて、各ページは、ユーザデータを格納するためのユーザデータ領域と管理データを格納するための冗長領域とを含んでもよい。ページサイズは16KB+アルファである。
コントローラ4は、4KBユーザデータとこの4KBユーザデータに対応する論理アドレス(例えばLBA)との双方を書き込み先ブロックBLKに書き込む。この場合、図14に示すように、各々がLBAと4KBユーザデータとを含む4つのデータセットが同じページに書き込まれてもよい。ブロック内オフセットは、セット境界を示してもよい。
あるいは、図15に示されているように、4つの4KBユーザデータがページ内のユーザデータ領域に書き込まれ、これら4つの4KBユーザデータに対応する4つのLBAがこのページ内の冗長領域に書き込まれてもよい。
図16は、スーバーブロックが使用されるケースにおけるブロック番号とオフセット(ブロック内オフセット)との関係を示す。以下では、ブロック内オフセットは単にオフセットとしても参照される。
ここでは、図示を簡単化するために、ある一つのスーパーブロックSB#1が4つのブロックBLK#11、BLK#21、BLK#31、BLK#41から構成されている場合が想定されている。コントローラ4は、ブロックBLK#11のページ0、ブロックBLK#21のページ0、ブロックBLK#31のページ0、ブロックBLK#41のページ0、ブロックBLK#11のページ1、ブロックBLK#21のページ1、ブロックBLK#31のページ1、ブロックBLK#41のページ1、…という順序でデータを書き込む。
オフセット+0はブロックBLK#11のページ0の最初の4KB領域を示し、オフセット+1はブロックBLK#11のページ0の2番目の4KB領域を示し、オフセット+2はブロックBLK#11のページ0の3番目の4KB領域を示し、オフセット+3はブロックBLK#11のページ0の4番目の4KB領域を示す。
オフセット+4はブロックBLK#21のページ0の最初の4KB領域を示し、オフセット+5はブロックBLK#21のページ0の2番目の4KB領域を示し、オフセット+6はブロックBLK#21のページ0の3番目の4KB領域を示し、オフセット+7はブロックBLK#21のページ0の4番目の4KB領域を示す。
同様に、オフセット+12はブロックBLK#41のページ0の最初の4KB領域を示し、オフセット+13はブロックBLK#41のページ0の2番目の4KB領域を示し、オフセット+14はブロックBLK#41のページ0の3番目の4KB領域を示し、オフセット+15はブロックBLK#41のページ0の4番目の4KB領域を示す。
オフセット+16はブロックBLK#11のページ1の最初の4KB領域を示し、オフセット+17はブロックBLK#11のページ1の2番目の4KB領域を示し、オフセット+18はブロックBLK#11のページ1の3番目の4KB領域を示し、オフセット+19はブロックBLK#11のページ1の4番目の4KB領域を示す。
オフセット+20はブロックBLK#21のページ1の最初の4KB領域を示し、オフセット+21はブロックBLK#21のページ1の2番目の4KB領域を示し、オフセット+22はブロックBLK#21のページ1の3番目の4KB領域を示し、オフセット+23はブロックBLK#21のページ1の4番目の4KB領域を示す。
同様に、オフセット+28はブロックBLK#41のページ1の最初の4KB領域を示し、オフセット+29はブロックBLK#41のページ1の2番目の4KB領域を示し、オフセット+30はブロックBLK#41のページ1の3番目の4KB領域を示し、オフセット+31はブロックBLK#41のページ1の4番目の4KB領域を示す。
図17は、フラッシュストレージデバイス3に適用される最大ブロック番号ゲットコマンドを示す。
最大ブロック番号ゲットコマンドは、フラッシュストレージデバイス3から最大ブロック番号を取得するためのコマンドである。ホスト2は、フラッシュストレージデバイス3に最大ブロック番号ゲットコマンドに送信することにより、フラッシュストレージデバイス3に含まれるブロックの数を示す最大ブロック番号を認識することができる。最大ブロック番号ゲットコマンドは、最大ブロック番号ゲットコマンド用のコマンドIDを含み、パラメータは含まない。
図18は、最大ブロック番号ゲットコマンドに対するレスポンスを示す。
最大ブロック番号ゲットコマンドをホスト2から受信した時、フラッシュストレージデバイス3は、図18に示すレスポンスをホスト2に返す。このレスポンスは、最大ブロック番号(つまり、フラッシュストレージデバイス3に含まれる利用可能なブロックの総数)を示すパラメータを含む。
図19は、フラッシュストレージデバイス3に適用されるブロックサイズゲットコマンドを示す。
ブロックサイズゲットコマンドは、フラッシュストレージデバイス3からブロックサイズを取得するためのコマンドである。ホスト2は、フラッシュストレージデバイス3にブロックサイズゲットコマンドに送信することにより、フラッシュストレージデバイス3に含まれるNAND型フラッシュメモリ5のブロックサイズを認識することができる。
なお、別の実施形態では、ブロックサイズゲットコマンドは、ブロック番号を指定するパラメータを含んでいてもよい。あるブロック番号を指定するブロックサイズゲットコマンドをホスト2から受信した場合、フラッシュストレージデバイス3は、このブロック番号を有するブロックのブロックサイズをホスト2に返す。これにより、たとえNAND型フラッシュメモリ5に含まれるブロックそれぞれのブロックサイズが不均一である場合であっても、ホスト2は、個々のブロックそれぞれのブロックサイズを認識することができる。
図20は、ブロックサイズゲットコマンドに対するレスポンスを示す。
ブロックサイズゲットコマンドをホスト2から受信した時、フラッシュストレージデバイス3は、ブロックサイズ(NAND型フラッシュメモリ5に含まれるブロックそれぞれの共通のブロックサイズ)をホスト2に返す。この場合、もしブロック番号がブロックサイズゲットコマンドによって指定されていたならば、フラッシュストレージデバイス3は、上述したように、このブロック番号を有するブロックのブロックサイズをホスト2に返す。
図21は、フラッシュストレージデバイス3に適用されるブロックアロケートコマンドを示す。
ブロックアロケートコマンドは、フラッシュストレージデバイス3にブロック(フリーブロック)の割り当てを要求するコマンドである。ホスト2は、ブロックアロケートコマンドをフラッシュストレージデバイス3に送信することによって、フリーブロックを割り当てるようにフラッシュストレージデバイス3に要求し、これによってブロック番号(割り当てられたフリーブロックのブロック番号)を取得することができる。
フラッシュストレージデバイス3がフリーブロック群をフリーブロックリストによって管理し、ホスト2はフリーブロック群を管理しないケースにおいては、ホスト2は、フリーブロックを割り当てるようにフラッシュストレージデバイス3に要求し、これによってブロック番号を取得する。一方、ホスト2がフリーブロック群を管理するケースにおいては、ホスト2は、フリーブロック群の一つを自身で選択することができるので、ブロックアロケートコマンドをフラッシュストレージデバイス3に送信する必要は無い。
図22は、ブロックアロケートコマンドに対するレスポンスを示す。
ブロックアロケートコマンドをホスト2から受信した時、フラッシュストレージデバイス3は、フリーブロックリストから、ホスト2に割り当てるべきフリーブロックを選択し、選択したフリーブロックのブロック番号を含むレスポンスをホスト2に返す。
図23は、ホスト2とフラッシュストレージデバイス3とによって実行されるブロック情報取得処理を示す。
ホスト2がフラッシュストレージデバイス3の使用を開始する時、ホスト2は、まず、最大ブロック番号ゲットコマンドをフラッシュストレージデバイス3に送信する。フラッシュストレージデバイス3のコントローラは、最大ブロック番号をホスト2に返す。最大ブロック番号は、利用可能なブロックの総数を示す。なお、上述のスーパーブロックが使用されるケースにおいては、最大ブロック番号は、利用可能なスーパーブロックの総数を示してもよい。
次いで、ホスト2は、ブロックサイズゲットコマンドをフラッシュストレージデバイス3に送信して、ブロックサイズを取得する。この場合、ホスト2は、ブロック番号1を指定するブロックサイズゲットコマンド、ブロック番号2を指定するブロックサイズゲットコマンド、ブロック番号3を指定するブロックサイズゲットコマンド、…をフラッシュストレージデバイス3にそれぞれ送信して、全てのブロックそれぞれのブロックサイズを個別に取得してもよい。
このブロック情報取得処理により、ホスト2は、利用可能ブロック数、個々のブロックのブロックサイズを認識することができる。
図24は、ホスト2とフラッシュストレージデバイス3とによって実行される書き込み処理のシーケンスを示す。
ホスト2は、まず、書き込みのために使用すべきブロック(フリーブロック)を自身で選択するか、またはブロックアロケートコマンドをフラッシュストレージデバイス3に送信することによってフリーブロックを割り当てるようにフラッシュストレージデバイス3に要求する。そして、ホスト2は、自身で選択したブロックのブロック番号BLK#(またはフラッシュストレージデバイス3によって割り当てられたフリーブロックのブロック番号BLK#)と、論理アドレス(LBA)と、長さとを含むライトコマンドをフラッシュストレージデバイス3に送信する(ステップS20)。
フラッシュストレージデバイス3のコントローラ4がこのライトコマンドを受信した時、コントローラ4は、ホスト2からのライトデータを書き込むべき、このブロック番号BLK#を有するブロック(書き込み先ブロックBLK#)内の書き込み先位置を決定し、この書き込み先ブロックBLK#の書き込み先位置にライトデータを書き込む(ステップS11)。ステップS11では、コントローラ4は、論理アドレス(ここではLBA)とライトデータの双方を書き込み先ブロックに書き込んでもよい。
コントローラ4は、書き込み先ブロックBLK#に対応するブロック内LUTを更新して、書き込み先位置を示すオフセット(ブロック内オフセット)をこの論理アドレスにマッピングする(ステップS12)。
次いで、コントローラ4は、書き込み先ブロックBLK#に対応するブロック管理テーブル32を更新して、書き込まれたデータに対応するビットマップフラグ(つまり、このデータが書き込まれたオフセット(ブロック内オフセット)に対応するビットマップフラグ)を0から1に変更する(ステップS13)。
例えば、図25に示されているように、開始LBAがLBAxである16Kバイト更新データがブロックBLK#1のオフセット+4~+7に対応する物理記憶位置に書き込まれた場合を想定する。この場合、図26に示されているように、ブロックBLK#1用のブロック内LUTにおいては、オフセット+4~+7がLBAx~LBAx+3にマッピングされる。また、図27に示されているように、ブロックBLK#1用のブロック管理テーブルにおいては、オフセット+4~+7に対応するビットマップフラグそれぞれが0から1に変更される。
コントローラ4は、このライトコマンドに対するレスポンス(成功/失敗)をホスト2に返す(ステップS14)。
ホスト2がこのレスポンスを受信した時、ホスト2は、ホスト2によって管理されているブロックレベルLUTを更新して、書き込み先ブロックBLK#のブロック番号BLK#を、書き込まれたライトデータに対応する論理アドレスにマッピングする(ステップS21)。図28に示されているように、ブロックレベルLUTは、複数の論理アドレス(例えばLBA)それぞれに対応する複数のエントリを含む。ある論理アドレス(例えばあるLBA)に対応するエントリには、このLBAに対応するデータが格納されているNAND型フラッシュメモリ5のブロック番号が格納される。図25に示されているように、開始LBAがLBAxである16Kバイト更新データがブロックBLK#1に書き込まれたならば、図28に示されているように、ブロック内LUTが更新されて、LBAx~LBAx+3に対応するブロック番号がBLK#0からBLK#1に変更される。
この後、図24に示すように、ホスト2は、上述の更新データの書き込みによって不要になった以前のデータを無効化するためのTrimコマンドをフラッシュストレージデバイス3に送信する。フラッシュストレージデバイス3のコントローラ4は、このTrimコマンドに応じて、ブロック内LUT、ブロック管理テーブルを更新する(ステップS15、S16)。
もし図25に示されているように、以前のデータがブロックBLK#0に格納されている場合には、図29に示すように、ブロック番号(=BLK#0)、LBAx、長さ(=4)を指定するTrimコマンドがホスト2からフラッシュストレージデバイス3に送信される。フラッシュストレージデバイス3のコントローラ4は、このTrimコマンドに応じて、BLK#0に対応するブロック内LUTを更新して、LBAx~LBAx+3それぞれとオフセット+1~+3それぞれとの間のマッピングを示す情報を削除する。この場合、コントローラ4は、これらLBAx~LBAx+3とオフセット+1~+3を無効を示す値(null)に変更してもよい。さらに、コントローラ4は、BLK#0に対応するブロック管理テーブル32を更新して、オフセット+0~+3に対応するビットマップフラグそれぞれを1から0に変更する。
図30は、フラッシュストレージデバイス3に適用されるリードコマンドを示す。
リードコマンドは、フラッシュストレージデバイス3にデータの読み出しを要求するコマンドである。このリードコマンドは、コマンドID、ブロック番号BLK#、論理アドレス、長さ、転送先ポインタを含む。
コマンドIDはこのコマンドがリードコマンドであることを示すID(コマンドコード)であり、リードコマンドにはリードコマンド用のコマンドIDが含まれる。
ブロック番号BLK#は、リードされるべきデータが格納されているブロックのブロック番号を示す。論理アドレスは、リードされるべきデータの論理アドレスである。
長さは、リードすべきデータの長さを示す。このデータ長は、LBAの数によって示されてもよいし、Grainの数によって示されてもよい。
転送先ポインタは、読み出されたデータが転送されるべきホスト2内のメモリ上の位置を示す。
図31は、ホスト2とフラッシュストレージデバイス3とによって実行されるリード処理のシーケンスを示す。
ホスト2は、ホスト2によって管理されているブロック内LUTを参照して、ユーザアプリケーションからのリード要求に含まれる論理アドレス(LBA)をブロック番号に変換する。そして、ホスト2は、このブロック番号、LBA、長さを指定するリードコマンドをフラッシュストレージデバイス3に送信する。
フラッシュストレージデバイス3のコントローラ4がリードコマンドをホスト2から受信した時、コントローラ4は、このリードコマンドによって指定されたブロック番号に対応するブロック内LUTを選択し、この選択したブロック内LUTをリードコマンド内のLBAを使用して参照して、このLBAに対応するオフセット(ブロック内オフセット)を取得する(ステップS31)。コントローラ4は、リードコマンドによって指定されたブロック番号と、取得したオフセット(ブロック内オフセット)とに基づいて、このLBAに対応するデータをNAND型フラッシュメモリ5からリードし(ステップS32)、このリードデータをホスト2に送信する。
図32は、フラッシュストレージデバイス3に適用されるGC制御コマンドを示す。
GC制御コマンドは、GCソースブロック番号およびGCデスティネーションブロック番号をフラッシュストレージデバイス3に通知するために使用される。ホスト2は、各ブロックの有効データ量/無効データ量を管理しており、有効データ量がより少ない幾つかのブロックをGCソースブロックとして選択することができる。また、ホスト2は、フリーブロックリストを管理しており、幾つかのフリーブロックをGCデスティネーションブロックとして選択することができる。このGC制御コマンドは、コマンドID、GCソースブロック番号、GCデスティネーションブロック番号、等を含んでもよい。
コマンドIDはこのコマンドがGC制御コマンドであることを示すID(コマンドコード)であり、GC制御コマンドにはGC制御コマンド用のコマンドIDが含まれる。
GCソースブロック番号は、GCソースブロックを示すブロック番号である。ホスト2は、どのブロックをGCソースブロックとすべきかを指定することができる。ホスト2は、複数のGCソースブロック番号を一つのGC制御コマンドに設定してもよい。
GCデスティネーションブロック番号は、GCデスティネーションブロックを示すブロック番号である。ホスト2は、どのブロックをGCデスティネーションブロックとすべきかを指定することができる。ホスト2は、複数のGCデスティネーションブロック番号を一つのGC制御コマンドに設定してもよい。
図33は、GC用コールバックコマンドを示す。
GC用コールバックコマンドは、論理アドレス(LBA)とデスティネーションブロック番号との複数のペアを含むリストをホスト2に通知するために使用される。あるペアに含まれる論理アドレス(LBA)は、コピーされた有効データの論理アドレスである。このペアに含まれるデスティネーションブロック番号は、この有効データがコピーされたGCデスティネーションブロックのブロック番号である。このGC用コールバックコマンドは、GC制御コマンドによって複数のGCソースブロック番号および複数のデスティネーションブロック番号が指定された場合にのみ、フラッシュストレージデバイス3からホスト2に送信されてもよい。
図28は、ガベージコレクション(GC)動作の手順を示す。
例えば、ホスト2は、ホスト2によって管理されているフリーブロックリストに含まれている残りフリーブロックの数が閾値以下に低下した場合、GCソースブロックおよびGCデスティネーションブロックを選択し、GC制御コマンドをフラッシュストレージデバイス3に送信する(ステップS41)。
このGC制御コマンドを受信すると、フラッシュストレージデバイス3のコントローラ4は、GCソースブロック内の有効データを書き込むべきGCデスティネーションブロック内の位置(コピー先位置)を決定する動作と、GCソースブロック内の有効データをGCデスティネーションブロック内のコピー先位置にコピーする動作とを含むデータコピー動作を実行する(ステップS51)。ステップS51では、GCソースブロック内の全ての有効データのコピーが完了するまでデータコピー動作が繰り返し実行される。複数のGCソースブロックがGC制御コマンドによって指定された場合には、全てのGCソースブロック内の全ての有効データのコピーが完了するまでデータコピー動作が繰り返し実行される。
そして、コントローラ4は、論理アドレス(LBA)とデスティネーションブロック番号との複数のペアを含むリストをGC用コールバックコマンドを使用してホスト2に通知するとともに(ステップS52)、コピーされた有効データの論理アドレスにマッピングされているオフセット(ブロック内オフセット)が、GCソースブロック内のコピー元位置を示すオフセット(ブロック内オフセット)からGCデスティネーションブロック内のコピー先位置を示すオフセット(ブロック内オフセット)に変更されるように、GCソースブロックに対応するブロック内LUTおよびGCデスティネーションブロックに対応するブロック内LUTを更新する(ステップS53)。
ホスト2は、フラッシュストレージデバイス3から通知されるリストに基づいて、ブロック内LUTを更新する(ステップS42)。
図35は、複数のGCソースブロック内の全ての有効データを複数のGCデスティネーションブロックにコピーする動作を示す。
ここでは、ブロックBLK#1、ブロックBLK#2、ブロックBLK#3がホスト2によってGCソースブロックとして指定され、ブロックBLK#50、ブロックBLK#51がホスト2によってGCデスティネーションブロックとして指定された場合が想定されている。ブロックBLK#1、ブロックBLK#2、ブロックBLK#3の各々においては、有効データと無効データとが混在されている。
まず、ブロックBLK#1内の全ての有効データがブロックBLK#50にコピーされる。次いで、ブロックBLK#2の全ての有効データの一部がブロックBLK#50の残り空き領域にコピーされ、ブロックBLK#2の残りの有効データがブロックBLK#51にコピーされる。そして、ブロックBLK#3の全ての有効データがブロックBLK#51にコピーされる。
なお、コントローラ4は、各GCソースブロック内の有効データのみならず、この有効データとこの有効データに対応する論理アドレスの双方を、GCソースブロック(コピー元ブロック)からGCデスティネーションブロック(コピー先ブロック)にコピーしてもよい。これにより、GCデスティネーションブロック(コピー先ブロック)内にデータと論理アドレスとのペアを保持することができる。
図36は、GCのために実行されるデータコピー動作の例を示す。
図36では、GCソースブロック(ここではブロックBLK#1)のオフセット+0に対応する位置に格納されている有効データ(LBA=10)が、GCデスティネーションブロック(ここではブロックBLK#50)のオフセット+0に対応する位置にコピーされ、GCソースブロック(ここではブロックBLK#1)のオフセット+1に対応する位置に格納されている有効データ(LBA=11)が、GCデスティネーションブロック(ここではブロックBLK#50)のオフセット+1に対応する位置にコピーされた場合が想定されている。
この場合、コントローラ4は、図37に示すように、ブロックBLK#50に対応するブロック内LUTを更新して、LBA10とオフセット+0のペアと、LBA11とオフセット+1のペアをブロックBLK#50に対応するブロック内LUTに格納する。これにより、オフセット+0がLBA10にマッピングされ、オフセット+1がLBA10にマッピングされる。また、コントローラ4は、図38に示すように、ブロックBLK#10に対応するブロック内LUTを更新して、LBA10とオフセット+0のペアと、LBA11とオフセット+1のペアを、ブロックBLK#1に対応するブロック内LUTから削除する。さらに、コントローラ4は、LBA10とデスティネーションブロック番号(BLK#50)とのペアと、LBA11とデスティネーションブロック番号(BLK#50)とのペアとをホスト2に通知する。
ホスト2は、この通知に基づき、図39に示すように、ブロックレベルLUTを更新して、LBA10にマッピングされているブロック番号をBLK#1からBLK#50に変更し、LBA11にマッピングされているブロック番号もBLK#1からBLK#50に変更する。
以上説明したように、本実施形態によれば、第1のブロック番号と第1の論理アドレスを指定するライト要求をホスト2から受信した場合、フラッシュストレージデバイス3のコントローラ4は、ホスト2からのデータを書き込むべき、第1のブロック番号を有するブロック(書き込み先ブロック)内の位置(書き込み先位置)を決定し、ホスト2からのデータを書き込み先ブロックの書き込み先位置に書き込み、論理アドレスそれぞれとこの書き込み先ブロックのブロック内物理アドレス(ブロック内オフセット)それぞれとの間のマッピングを管理するブロック内LUTを更新して、書き込み先位置を示すブロック内オフセットを第1の論理アドレスにマッピングする。また、上述の第1のブロック番号と上述の第1の論理アドレスを指定するリード要求をホスト2から受信した場合、コントローラ4は、第1の論理アドレスを使用してブロック内LUTを参照して、第1の論理アドレスに対応するデータが書き込まれているブロック内物理アドレス(ブロック内オフセット)を取得し、第1のブロック番号と取得されたブロック内物理アドレス(ブロック内オフセット)とに基づいて、第1の論理アドレスに対応するデータをNAND型フラッシュメモリ5からリードする。
したがって、ホスト2がブロック番号をハンドリングし、フラッシュストレージデバイス3がページ書き込み順序制約/バッドページ等を考慮して、ホスト2によって指定されるブロック番号を有するブロック内の書き込み先位置を決定するという構成を実現できる。ホスト2がブロック番号をハンドリングすることにより、上位階層(ホスト2)のアプリケーションレベルアドレス変換テーブルと従来型SSDのLUTレベルアドレス変換テーブルとのマージを実現できる。また、フラッシュストレージデバイス3は、NAND型フラッシュメモリ5の特徴/制約を考慮してNAND型フラッシュメモリ5を制御することができる。さらに、ホスト2はブロック境界を認識することができるので、ブロック境界/ブロックサイズを考慮してユーザデータを各ブロックに書き込むことができる。これにより、ホスト2が同一ブロック内のデータをデータ更新等によって一斉に無効化する等の制御を行うことが可能となるので、GCが実行される頻度を下げることが可能となる。この結果、ライトアンプリフィケーションが低下され、フラッシュストレージデバイス3の性能の向上、フラッシュストレージデバイス3の寿命の最大化を実現できる。
したがって、ホスト2とフラッシュストレージデバイス3との間の適切な役割分担を実現でき、これによってホスト2とフラッシュストレージデバイス3とを含むシステム全体のI/O性能の向上を図ることができる。
また、本実施形態によれば、コントローラ4は、有効データを書き込むべき、コピー先ブロック内のコピー先位置を決定し、有効データをコピー先ブロック内のこのコピー先位置にコピーする。したがって、ホスト2はコピー元ブロックとコピー先ブロックとを選択するという動作のみを行うだけでよい。また、アプリケーションレベルGCをフラッシュストレージデバイス3のGCとマージすることができので、ライトアンプリフィケーションを大幅に低減することができる。
なお、フラッシュストレージデバイス3は、ストレージアレイ内に設けられる複数のフラッシュストレージデバイス3の一つとして利用されてもよい。ストレージアレイは、サーバ計算機のような情報処理装置にケーブルまたはネットワークを介して接続されてもよい。ストレージアレイは、このストレージアレイ内の複数のフラッシュストレージデバイス3を制御するコントローラを含む。フラッシュストレージデバイス3がストレージアレイに適用された場合には、このストレージアレイのコントローラが、フラッシュストレージデバイス3のホスト2として機能してもよい。
また、本実施形態では、不揮発性メモリとしてNAND型フラッシュメモリを例示した。しかし、本実施形態の機能は、例えば、MRAM(Magnetoresistive
Random Access Memory)、PRAM(Phase change
Random Access Memory)、ReRAM(Resistive Random Access Memory)、又は、FeRAM(Ferroelectric Random Access Memory)のような他の様々な不揮発性メモリにも適用できる。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。