以下、図面を参照して、実施形態を説明する。
まず、図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は論理物理アドレス変換テーブルとして機能するルックアップテーブルを管理するが、ホスト2はデータが書き込まれるべきブロックのブロック番号とこのデータに対応する論理アドレスだけを指定し、このデータが書き込まれるべきこのブロック内の位置(書き込み先位置)はフラッシュストレージデバイス3によって決定される。決定されたこのブロック内の位置(書き込み先位置)を示すブロック内物理アドレスは、フラッシュストレージデバイス3からホスト2に通知される。
このように、ホスト2はブロックのみをハンドリングし、ブロック内の位置(例えば、ページ、ページ内の位置)はフラッシュストレージデバイス3によってハンドリングされる。
フラッシュストレージデバイス3にデータを書き込む必要がある時、ホスト2は、ブロック番号を選択(またはフラッシュストレージデバイス3にフリーブロックを割り当てるように要求)し、論理アドレスと、選択したブロックのブロック番号(またはフラッシュストレージデバイス3によって通知される割り当てられたブロックのブロック番号)とを指定するライト要求(ライトコマンド)をフラッシュストレージデバイス3に送信する。フラッシュストレージデバイス3は、指定されたブロック番号を有するブロックにホスト2からのデータを書き込む。この場合、フラッシュストレージデバイス3は、このブロック内の位置(書き込み先位置)を決定し、ホスト2からのデータをこのブロック内の位置(書き込み先位置)に書き込む。そして、フラッシュストレージデバイス3は、このブロック内の位置(書き込み先位置)を示すブロック内物理アドレスを、ライト要求に対するレスポンス(返り値)としてホスト2に通知する。以下では、ホスト2に移されたFTL機能をグローバルFTLと称する。
ホスト2のグローバルFTLは、ストレージサービスを実行する機能、ウェアー制御機能、高可用性を実現するための機能、同じ内容を有する複数の重複データ部がストレージに格納されることを防止する重複排除(De-duplication)機能、ガベージコレクション(GC)ブロック選択機能、QoS制御機能等を有する。QoS制御機能には、QoSドメイン毎(またはブロック毎)にアクセス単位を決める機能が含まれる。アクセス単位は、ホスト2がライト/リードすることが可能な最小データサイズ(Grain)を示す。フラッシュストレージデバイス3は単一、あるいは複数のアクセス単位(Grain)をサポートしており、ホスト2は、フラッシュストレージデバイス3が複数のアクセス単位をサポートしている場合にはQoSドメイン毎(またはブロック毎)に、使用すべきアクセス単位をフラッシュストレージデバイス3に指示することができる。
また、QoS制御機能には、QoSドメイン間の性能干渉をできるだけ防ぐための機能が含まれている。この機能は、基本的には、安定したレイテンシを保つための機能である。
一方、フラッシュストレージデバイス3は、ローレベルアブストラクション(LLA)を実行することができる。LLAはNAND型フラッシュメモリのアブストラクションのための機能である。LLAは、不良ページ(バッドページ)を隠蔽する機能、ページ書き込み順序制約を守る機能を含む。LLAは、GC実行機能も含む。GC実行機能は、ホスト2によって指定されたコピー元ブロック(GCソースブロック)内の有効データを、ホスト2によって指定されたコピー先ブロック(GCデスティネーションブロック)にコピーする。フラッシュストレージデバイス3のGC実行機能は、有効データを書き込むべき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)411を含む。ここで、論理アドレスとは、アクセス対象のデータを識別可能な識別子を意味する。この論理アドレスは、論理アドレス空間上の位置を指定する論理ブロックアドレス(LBA)であってもよいし、あるいは、キー・バリュー・ストアのキー(タグ)であってもよいし、キーのハッシュ値であってもよい。
LBAベースのブロックI/Oサービスにおいては、論理アドレス(LBA)それぞれとフラッシュストレージデバイス3の物理アドレスそれぞれとの間のマッピングを管理するLUT411が使用されてもよい。
キー・バリュー・ストアサービスにおいては、論理アドレス(つまり、キーのようなタグ)それぞれとこれら論理アドレス(つまり、キーのようなタグ)に対応するデータが格納されているフラッシュストレージデバイス3内の物理記憶位置を示す物理アドレスそれぞれとの間のマッピングを管理するLUT411が使用されてもよい。このLUT411においては、タグと、このタグによって識別されるデータが格納されている物理アドレスと、このデータのデータ長との対応関係が管理されてもよい。
各エンドユーザは、使用すべきアドレッシング方法(LBA、キー・バリュー・ストアのキー、等)を選択することができる。
これら各LUT411は、ユーザアプリケーション402からの論理アドレスそれぞれをフラッシュストレージデバイス3用の論理アドレスそれぞれに変換するのではなく、ユーザアプリケーション402からの論理アドレスそれぞれをフラッシュストレージデバイス3の物理アドレスそれぞれに変換する。つまり、これら各LUT411は、フラッシュストレージデバイス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ドメインに対応する複数のガベージコレクション(GC)機能602、NAND型フラッシュメモリ(NANDフラッシュアレイ)603を含む。
この図2の右部に示す構成においては、上位階層(ホスト2)はブロック境界を認識することができるので、ブロック境界/ブロックサイズを考慮してユーザデータを各ブロックに書き込むことができる。つまり、ホスト2はNAND型フラッシュメモリ(NANDフラッシュアレイ)603の個々のブロックを認識することができ、これにより、例えば、一つのブロック全体に一斉にデータを書き込む、一つのブロック内のデータ全体を削除または更新によって無効化する、といった制御を行うことが可能となる。この結果、一つのブロックに有効データと無効データが混在されるという状況を起こりにくくすることが可能となる。したがって、GCを実行することが必要となる頻度を低減することができる。GCの頻度を低減することにより、ライトアンプリフィケーションが低下され、フラッシュストレージデバイス3の性能の向上、フラッシュストレージデバイス3の寿命の最大化を実現できる。このように、上位階層(ホスト2)がブロック番号を認識可能な構成は有用である。
一方、データが書き込まれるべきブロック内の位置は、上位階層(ホスト2)ではなく、フラッシュストレージデバイス3によって決定される。したがって、不良ページ(バッドページ)を隠蔽することができ、またページ書き込み順序制約を守ることができる。
図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のローレベルアブストラクション(LLA)は、不良ページ(バッドページ)を隠蔽する機能、ページ書き込み順序制約を守る機能、ライトバッファを管理する機能、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は、この書き込み先ブロックの上述の書き込み先位置を示すブロック内物理アドレスをホスト2に通知する。このブロック内物理アドレスは、この書き込み先ブロック内の書き込み先位置を示すブロック内オフセットによって表される。
この場合、このブロック内オフセットは、書き込み先ブロックの先頭から書き込み先位置までのオフセット、つまり書き込み先ブロックの先頭に対する書き込み先位置のオフセットを示す。書き込み先ブロックの先頭から書き込み先位置までのオフセットのサイズは、ページサイズとは異なるサイズを有する粒度(Grain)の倍数で示される。粒度(Grain)は、上述のアクセス単位である。粒度(Grain)のサイズの最大値は、ブロックサイズまでに制限される。換言すれば、ブロック内オフセットは、書き込み先ブロックの先頭から書き込み先位置までのオフセットをページサイズとは異なるサイズを有する粒度の倍数で示す。
粒度(Grain)は、ページサイズよりも小さいサイズを有していてもよい。例えば、ページサイズが16Kバイトである場合、粒度(Grain)は、そのサイズが4Kバイトであってもよい。この場合、ある一つのブロックにおいては、各々サイズが4Kバイトである複数のオフセット位置が規定される。ブロック内の最初のオフセット位置に対応するブロック内オフセットは、例えば0であり、ブロック内の次のオフセット位置に対応するブロック内オフセットは、例えば1である、ブロック内のさらに次のオフセット位置に対応するブロック内オフセットは、例えば2である。
あるいは、粒度(Grain)は、ページサイズよりも大きなサイズを有していてもよい。例えば、粒度(Grain)は、ページサイズの数倍のサイズであってもよい。ページサイズが16Kバイトである場合、粒度は、32Kバイトのサイズであってもよい。
このように、ライト動作制御部21は、ホスト2からのブロック番号を有するブロック内の書き込み先位置を自身で決定し、そしてホスト2からのライトデータをこのブロック内のこの書き込み先位置に書き込む。そして、ライト動作制御部21は、この書き込み先位置を示すブロック内物理アドレス(ブロック内オフセット)をライト要求に対応するレスポンス(返り値)としてホスト2に通知する。あるいは、ライト動作制御部21は、ブロック内物理アドレス(ブロック内オフセット)のみをホスト2に通知するのではなく、論理アドレスとブロック番号とブロック内物理アドレス(ブロック内オフセット)との組をホスト2に通知してもよい。
したがって、フラッシュストレージデバイス3は、ブロック番号をホスト2にハンドリングさせつつ、ページ書き込み順序制約、バッドページ、ページサイズ等を隠蔽することができる。
この結果、ホスト2は、ブロック境界は認識できるが、ページ書き込み順序制約、バッドページ、ページサイズについては意識することなく、どのユーザデータがどのブロック番号に存在するかを管理することができる。
リード動作制御部22は、物理アドレス(すなわち、ブロック番号およびブロック内オフセット)を指定するリード要求(リードコマンド)をホスト2から受信した場合、これらブロック番号およびブロック内オフセットに基づいて、リード対象のブロック内のリード対象の物理記憶位置からデータをリードする。リード対象のブロックは、ブロック番号によって特定される。このブロック内のリード対象の物理記憶位置は、ブロック内オフセットによって特定される。このブロック内オフセットを使用することにより、ホスト2は、NAND型フラッシュメモリの世代毎の異なるページサイズをハンドリングする必要がない。
リード対象の物理記憶位置を得るために、リード動作制御部22は、まず、このブロック内オフセットを、ページサイズを表す粒度の数(ページサイズが16Kバイトで粒度(Grain)が4Kバイトである場合には、ページサイズを表す粒度の数は4)で除算し、そしてこの除算によって得られる商および余りを、リード対象のページ番号およびリード対象のページ内オフセットとしてそれぞれ決定してもよい。
GC動作制御部23は、NAND型フラッシュメモリ5のガベージコレクションのためのコピー元ブロック番号(GCソースブロック番号)およびコピー先ブロック番号(GCデスティネーションブロック番号)を指定するGC制御コマンドをホスト2から受信した場合、NAND型フラッシュメモリ5の複数のブロックから、指定されたコピー元ブロック番号を有するブロックと指定されたコピー先ブロック番号を有するブロックとをコピー元ブロック(GCソースブロック)およびコピー先ブロック(GCデスティネーションブロック)として選択する。GC動作制御部23は、選択されたGCソースブロックに格納されている有効データを書き込むべきGCデスティネーションブロック内のコピー先位置を決定し、有効データをGCデスティネーションブロック内のコピー先位置にコピーする。
そして、GC動作制御部23は、有効データの論理アドレスと、コピー先ブロック番号と、GCデスティネーションブロック内のコピー先位置を示すブロック内物理アドレス(ブロック内オフセット)とを、ホスト2に通知する。
有効データ/無効データの管理は、ブロック管理テーブル32を使用して実行されてもよい。このブロック管理テーブル32は、例えば、ブロック毎に存在してもよい。あるブロックに対応するブロック管理テーブル32においては、このブロック内のデータそれぞれの有効/無効を示すビットマップフラグが格納されている。ここで、有効データとは、論理アドレスから最新のデータとして紐付けられているデータであって、後にホスト2からリードされる可能性があるデータを意味する。無効データとは、もはやホスト2からリードされる可能性が無いデータを意味する。例えば、ある論理アドレスに関連付けられているデータは有効データであり、どの論理アドレスにも関連付けられていないデータは無効データである。
上述したように、GC動作制御部23は、コピー元ブロック(GCソースブロック)内に格納されている有効データを書き込むべきコピー先ブロック(GCデスティネーションブロック)内の位置(コピー先位置)を決定し、有効データをコピー先ブロック(GCデスティネーションブロック)のこの決定された位置(コピー先位置)にコピーする。この場合、GC動作制御部23は、有効データとこの有効データの論理アドレスの双方を、コピー先ブロック(GCデスティネーションブロック)にコピーしてもよい。
本実施形態では、上述したように、ライト動作制御部21は、ホスト2からのデータ(ライトデータ)とホスト2からの論理アドレスの双方を書き込み先ブロックに書き込むことができる。このため、GC動作制御部23は、コピー元ブロック(GCソースブロック)内の各データの論理アドレスをこのコピー元ブロック(GCソースブロック)から容易に取得することができるので、コピーされた有効データの論理アドレスをホスト2に容易に通知することができる。
NANDインタフェース13は、CPU12の制御の下、NAND型フラッシュメモリ5を制御するように構成されたメモリ制御回路である。DRAMインタフェース14は、CPU12の制御の下、DRAM6を制御するように構成されたDRAM制御回路である。DRAM6の記憶領域の一部は、内部バッファ(共有キャッシュ)31の格納のために使用される。また、DRAM6の記憶領域の他の一部は、ブロック管理テーブル32の格納のために使用される。なお、これら内部バッファ(共有キャッシュ)31、およびブロック管理テーブル32は、コントローラ4内の図示しないSRAMに格納されてもよい。
図7は、ホスト2が論理アドレスとブロック番号とを指定し且つフラッシュストレージデバイス3がブロック内物理アドレス(ブロック内オフセット)を決定するデータ書き込み動作と、ホスト2がブロック番号とブロック内物理アドレス(ブロック内オフセット)とを指定するデータ読み出し動作とを示す。
データ書き込み動作は以下の手順で実行される。
(1)ホスト2のライト処理部412がフラッシュストレージデバイス3にデータ(ライトデータ)を書き込むことが必要な時、ライト処理部412は、フリーブロックを割り当てるようにフラッシュストレージデバイス3に要求してもよい。フラッシュストレージデバイス3のコントローラ4は、NAND型フラッシュメモリ5のフリーブロック群を管理するブロック割り当て部701を含む。ブロック割り当て部701がライト処理部412からこの要求(ブロック割り当て要求)を受信した時、ブロック割り当て部701は、フリーブロック群の一つのフリーブロックをホスト2に割り当て、割り当てられたブロックのブロック番号(BLK#)をホスト2に通知する。
あるいは、ライト処理部412がフリーブロック群を管理する構成においては、ライト処理部412が自身で書き込み先ブロックを選択してもよい。
(2)ライト処理部412は、ライトデータに対応する論理アドレス(例えばLBA)と書き込み先ブロックのブロック番号(BLK#)とを指定するライト要求をフラッシュストレージデバイス3に送信する。
(3)フラッシュストレージデバイス3のコントローラ4は、データ書き込み用のページを割り当てるページ割り当て部702を含む。ページ割り当て部702がライト要求を受信した時、ページ割り当て部702は、ライト要求によって指定されたブロック番号を有するブロック(書き込み先ブロック)内の書き込み先位置を示すブロック内物理アドレス(ブロック内PBA)を決定する。ブロック内物理アドレス(ブロック内PBA)は、上述のブロック内オフセット(単にオフセットとしても参照される)によって表すことができる。コントローラ4は、ライト要求によって指定されたブロック番号と、ブロック内物理アドレス(ブロック内PBA)とに基づいて、ホスト2からのライトデータを、書き込み先ブロック内の書き込み先位置に書き込む。
(4)コントローラ4は、書き込み先位置を示すブロック内物理アドレス(ブロック内PBA)をライト要求に対するレスポンスとしてホスト2に通知する。あるいは、コントローラ4は、ライトデータに対応する論理アドレス(LBA)と、書き込み先ブロックのブロック番号(BLK#)と、書き込み先位置を示すブロック内PBA(オフセット)との組を、ライト要求に対するレスポンスとしてホスト2に通知してもよい。換言すれば、コントローラは、ブロック内物理アドレス、または論理アドレスとブロック番号とブロック内物理アドレスとの組のいずれかを、ホスト2に通知する。ホスト2においては、ライトデータが書き込まれた物理記憶位置を示す物理アドレス(ブロック番号、ブロック内物理アドレス(ブロック内オフセット))が、このライトデータの論理アドレスにマッピングされるように、LUT411が更新される。
データリード動作は以下の手順で実行される。
(1)’ホスト2がフラッシュストレージデバイス3からデータをリードすることが必要な時、ホスト2は、LUT411を参照して、リードすべきデータの論理アドレスに対応する物理アドレス(ブロック番号、ブロック内物理アドレス(ブロック内オフセット))をLUT411から取得する。
(2)’ホスト2は、取得されたブロック番号およびブロック内物理アドレス(ブロック内オフセット)を指定するリード要求をフラッシュストレージデバイス3に送出する。フラッシュストレージデバイス3のコントローラ4がこのリード要求をホスト2から受信した時、コントローラ4は、ブロック番号およびブロック内物理アドレスに基づいて、リード対象のブロックおよびリード対象の物理記憶位置を特定し、このリード対象のブロック内のリード対象の物理記憶位置からデータをリードする。
図8は、フラッシュストレージデバイス3に適用されるライトコマンドを示す。
ライトコマンドは、フラッシュストレージデバイス3にデータの書き込みを要求するコマンドである。このライトコマンドは、コマンドID、ブロック番号BLK#、論理アドレス、長さ、等を含んでもよい。
コマンドIDはこのコマンドがライトコマンドであることを示すID(コマンドコード)であり、ライトコマンドにはライトコマンド用のコマンドIDが含まれる。
ブロック番号BLK#は、データが書き込まれるべきブロックを一意に識別可能な識別子(ブロックアドレス)である。
論理アドレスは、書き込まれるべきライトデータを識別するための識別子である。この論理アドレスは、上述したように、LBAであってもよいし、キー・バリュー・ストアのキーであってもよいし、キーのハッシュ値であってもよい。論理アドレスがLBAである場合には、このライトコマンドに含まれる論理アドレス(開始LBA)は、ライトデータが書き込まれるべき論理位置(最初の論理位置)を示す。
長さは、書き込まれるべきライトデータの長さを示す。この長さ(データ長)は、粒度(Grain)の数によって指定されてもよいし、LBAの数によって指定されてもよいし、あるいはそのサイズがバイトによって指定されてもよい。
ホスト2からライトコマンドを受信した時、コントローラ4は、ライトコマンドによって指定されたブロック番号を有するブロック内の書き込み先位置を決定する。この書き込み先位置は、ページ書き込み順序の制約およびバッドページ等を考慮して決定される。そして、コントローラ4は、ホスト2からのデータを、ライトコマンドによって指定されたブロック番号を有するこのブロック内のこの書き込み先位置に書き込む。
図9は、図8のライトコマンドに対するレスポンスを示す。
このレスポンスは、ブロック内物理アドレス、長さを含む。ブロック内物理アドレスは、データが書き込まれたブロック内の位置(物理記憶位置)を示す。ブロック内物理アドレスは、上述したように、ブロック内オフセットによって指定可能である。長さは、書き込まれたデータの長さを示す。この長さ(データ長)は、粒度(Grain)の数によって指定されてもよいし、LBAの数によって指定されてもよいし、あるいはそのサイズがバイトによって指定されてもよい。
あるいは、このレスポンスは、ブロック内物理アドレスおよび長さだけでなく、論理アドレスおよびブロック番号をさらに含んでいてもよい。論理アドレスは、図8のライトコマンドに含まれていた論理アドレスである。ブロック番号は、図8のライトコマンドに含まれていた論理アドレスである。
図10は、フラッシュストレージデバイス3に適用されるTrimコマンドを示す。
このTrimコマンドは、無効にすべきデータが格納されている物理記憶位置を示すブロック番号およびブロック内物理アドレス(ブロック内オフセット)を含むコマンドである。つまり、このTrimコマンドは、LBAのような論理アドレスではなく、物理アドレスを指定可能である。このTrimコマンドは、コマンドID、物理アドレス、長さを含む。
コマンドIDはこのコマンドがTrimコマンドであることを示すID(コマンドコード)であり、TrimコマンドにはTrimコマンド用のコマンドIDが含まれる。
物理アドレスは、無効化すべきデータが格納されている最初の物理記憶位置を示す。本実施形態では、この物理アドレスは、ブロック番号とオフセット(ブロック内オフセット)との組み合わせによって指定される。
長さは、無効化すべきデータの長さを示す。この長さ(データ長)は、粒度(Grain)の数によって指定されてもよいし、バイトによって指定されてもよい。
コントローラ4は、複数のブロックの各々に含まれるデータそれぞれの有効/無効を示すフラグ(ビットマップフラグ)をブロック管理テーブル32を使用して管理する。無効にすべきデータが格納されている物理記憶位置を示すブロック番号およびオフセット(ブロック内オフセット)を含むTrimコマンドをホスト2から受信した場合、コントローラ4は、ブロック管理テーブル32を更新して、Trimコマンドに含まれるブロック番号およびブロック内オフセットに対応する物理記憶位置のデータに対応するフラグ(ビットマップフラグ)を無効を示す値に変更する。
図11は、ブロック内物理アドレスを規定するブロック内オフセットを示す。
ブロック番号はある一つのブロックBLKを指定する。各ブロックBLKは、図11に示されているように、複数のページ(ここでは、ページ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領域を示す。
図12は、ライトコマンドに応じて実行される書き込み動作を示す。
いま、ブロックBLK#1が書き込み先ブロックとして割り当てられている場合を想定する。コントローラ4は、ページ0、ページ1、ページ2、…ページnという順序で、データをページ単位でブロックBLK#1に書き込む。
図12においては、ブロックBLK#1のページ0に16Kバイト分のデータがすでに書き込まれている状態で、ブロック番号(=BLK#1)、論理アドレス(LBAx)および長さ(=4)を指定するライトコマンドがホスト2から受信された場合が想定されている。コントローラ4は、ブロックBLK#1のページ1を書き込み先位置として決定し、ホスト2から受信される16Kバイト分のライトデータをブロックBLK#1のページ1に書き込む。そして、コントローラ4は、このライトコマンドに対するレスポンスとして、オフセット(ブロック内オフセット)、長さをホスト2に返す。このケースにおいては、オフセット(ブロック内オフセット)は+5であり、長さは4である。あるいは、コントローラ4は、このライトコマンドに対するレスポンスとして、論理アドレス、ブロック番号、オフセット(ブロック内オフセット)、長さをホスト2に返してもよい。このケースにおいては、論理アドレスはLBAxであり、ブロック番号はBLK#1であり、オフセット(ブロック内オフセット)は+5であり、長さは4である。
図13は、不良ページ(バッドページ)をスキップする書き込み動作を示す。
図13においては、ブロックBLK#1のページ0、ページ1にデータがすでに書き込まれている状態で、ブロック番号(=BLK#1)、論理アドレス(LBAx+1)および長さ(=4)を指定するライトコマンドがホスト2から受信された場合が想定されている。もしブロックBLK#1のページ2が不良ページであるならば、コントローラ4は、ブロックBLK#1のページ3を書き込み先位置として決定し、ホスト2から受信される16Kバイト分のライトデータをブロックBLK#1のページ3に書き込む。そして、コントローラ4は、このライトコマンドに対するレスポンスとして、オフセット(ブロック内オフセット)、長さをホスト2に返す。このケースにおいては、オフセット(ブロック内オフセット)は+12であり、長さは4である。あるいは、コントローラ4は、このライトコマンドに対するレスポンスとして、論理アドレス、ブロック番号、オフセット(ブロック内オフセット)、長さをホスト2に返してもよい。このケースにおいては、論理アドレスはLBAx+1であり、ブロック番号はBLK#1であり、オフセット(ブロック内オフセット)は+12であり、長さは4である。
図14は、不良ページをスキップする書き込み動作の別の例を示す。
図14においては、不良ページを挟む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は、このライトコマンドに対するレスポンスとして、2つのオフセット(ブロック内オフセット)と、2つの長さをホスト2に返す。このケースにおいては、このレスポンスは、オフセット(=+10)、長さ(=2)、オフセット(=+16)、長さ(=4)を含んでもよい。あるいは、コントローラ4は、このライトコマンドに対するレスポンスとして、LBAy、ブロック番号(=BLK#2)、オフセット(=+10)、長さ(=2)、ブロック番号(=BLK#2)、オフセット(=+16)、長さ(=4)をホスト2に返してもよい。
図15、図16は、論理アドレスとデータのペアをブロック内のページに書き込む動作を示す。
各ブロックにおいて、各ページは、ユーザデータを格納するためのユーザデータ領域と管理データを格納するための冗長領域とを含んでもよい。ページサイズは16KB+アルファである。
コントローラ4は、4KBユーザデータとこの4KBユーザデータに対応する論理アドレス(例えばLBA)との双方を書き込み先ブロックBLKに書き込む。この場合、図15に示すように、各々がLBAと4KBユーザデータとを含む4つのデータセットが同じページに書き込まれてもよい。ブロック内オフセットは、セット境界を示してもよい。
あるいは、図16に示されているように、4つの4KBユーザデータがページ内のユーザデータ領域に書き込まれ、これら4つの4KBユーザデータに対応する4つのLBAがこのページ内の冗長領域に書き込まれてもよい。
図17は、スーパーブロックが使用されるケースにおけるブロック番号とオフセット(ブロック内オフセット)との関係を示す。以下では、ブロック内オフセットは単にオフセットとしても参照される。
ここでは、図示を簡単化するために、ある一つのスーパーブロック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領域を示す。
図18は、フラッシュストレージデバイス3に適用される最大ブロック番号ゲットコマンドを示す。
最大ブロック番号ゲットコマンドは、フラッシュストレージデバイス3から最大ブロック番号を取得するためのコマンドである。ホスト2は、フラッシュストレージデバイス3に最大ブロック番号ゲットコマンドに送信することにより、フラッシュストレージデバイス3に含まれるブロックの数を示す最大ブロック番号を認識することができる。最大ブロック番号ゲットコマンドは、最大ブロック番号ゲットコマンド用のコマンドIDを含み、パラメータは含まない。
図19は、最大ブロック番号ゲットコマンドに対するレスポンスを示す。
最大ブロック番号ゲットコマンドをホスト2から受信した時、フラッシュストレージデバイス3は、図19に示すレスポンスをホスト2に返す。このレスポンスは、最大ブロック番号(つまり、フラッシュストレージデバイス3に含まれる利用可能なブロックの総数)を示すパラメータを含む。
図20は、フラッシュストレージデバイス3に適用されるブロックサイズゲットコマンドを示す。
ブロックサイズゲットコマンドは、フラッシュストレージデバイス3からブロックサイズを取得するためのコマンドである。ホスト2は、フラッシュストレージデバイス3にブロックサイズゲットコマンドに送信することにより、フラッシュストレージデバイス3に含まれるNAND型フラッシュメモリ5のブロックサイズを認識することができる。
なお、別の実施形態では、ブロックサイズゲットコマンドは、ブロック番号を指定するパラメータを含んでいてもよい。あるブロック番号を指定するブロックサイズゲットコマンドをホスト2から受信した場合、フラッシュストレージデバイス3は、このブロック番号を有するブロックのブロックサイズをホスト2に返す。これにより、たとえNAND型フラッシュメモリ5に含まれるブロックそれぞれのブロックサイズが不均一である場合であっても、ホスト2は、個々のブロックそれぞれのブロックサイズを認識することができる。
図21は、ブロックサイズゲットコマンドに対するレスポンスを示す。
ブロックサイズゲットコマンドをホスト2から受信した時、フラッシュストレージデバイス3は、ブロックサイズ(NAND型フラッシュメモリ5に含まれるブロックそれぞれの共通のブロックサイズ)をホスト2に返す。この場合、もしブロック番号がブロックサイズゲットコマンドによって指定されていたならば、フラッシュストレージデバイス3は、上述したように、このブロック番号を有するブロックのブロックサイズをホスト2に返す。
図22は、フラッシュストレージデバイス3に適用されるブロックアロケートコマンドを示す。
ブロックアロケートコマンドは、フラッシュストレージデバイス3にブロック(フリーブロック)の割り当てを要求するコマンド(ブロック割り当て要求)である。ホスト2は、ブロックアロケートコマンドをフラッシュストレージデバイス3に送信することによって、フリーブロックを割り当てるようにフラッシュストレージデバイス3に要求し、これによってブロック番号(割り当てられたフリーブロックのブロック番号)を取得することができる。
フラッシュストレージデバイス3がフリーブロック群をフリーブロックリストによって管理し、ホスト2はフリーブロック群を管理しないケースにおいては、ホスト2は、フリーブロックを割り当てるようにフラッシュストレージデバイス3に要求し、これによってブロック番号を取得する。一方、ホスト2がフリーブロック群を管理するケースにおいては、ホスト2は、フリーブロック群の一つを自身で選択することができるので、ブロックアロケートコマンドをフラッシュストレージデバイス3に送信する必要は無い。
図23は、ブロックアロケートコマンドに対するレスポンスを示す。
ブロックアロケートコマンドをホスト2から受信した時、フラッシュストレージデバイス3は、フリーブロックリストから、ホスト2に割り当てるべきフリーブロックを選択し、選択したフリーブロックのブロック番号を含むレスポンスをホスト2に返す。
図24は、ホスト2とフラッシュストレージデバイス3とによって実行されるブロック情報取得処理を示す。
ホスト2がフラッシュストレージデバイス3の使用を開始する時、ホスト2は、まず、最大ブロック番号ゲットコマンドをフラッシュストレージデバイス3に送信する。フラッシュストレージデバイス3のコントローラは、最大ブロック番号をホスト2に返す。最大ブロック番号は、利用可能なブロックの総数を示す。なお、上述のスーパーブロックが使用されるケースにおいては、最大ブロック番号は、利用可能なスーパーブロックの総数を示してもよい。
次いで、ホスト2は、ブロックサイズゲットコマンドをフラッシュストレージデバイス3に送信して、ブロックサイズを取得する。この場合、ホスト2は、ブロック番号1を指定するブロックサイズゲットコマンド、ブロック番号2を指定するブロックサイズゲットコマンド、ブロック番号3を指定するブロックサイズゲットコマンド、…をフラッシュストレージデバイス3にそれぞれ送信して、全てのブロックそれぞれのブロックサイズを個別に取得してもよい。
このブロック情報取得処理により、ホスト2は、利用可能ブロック数、個々のブロックのブロックサイズを認識することができる。
図25は、ホスト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#に対応するブロック管理テーブル32を更新して、書き込まれたデータに対応するビットマップフラグ(つまり、このデータが書き込まれたオフセット(ブロック内オフセット)に対応するビットマップフラグ)を0から1に変更する(ステップS12)。
例えば、図26に示されているように、開始LBAがLBAxである16Kバイト更新データがブロックBLK#1のオフセット+4~+7に対応する物理記憶位置に書き込まれた場合を想定する。この場合、図27に示されているように、ブロックBLK#1用のブロック管理テーブルにおいては、オフセット+4~+7に対応するビットマップフラグそれぞれが0から1に変更される。
そして、図25に示すように、コントローラ4は、このライトコマンドに対するレスポンスをホスト2に返す(ステップS13)。このレスポンスは、このデータが書き込まれたオフセット(ブロック内オフセット)を少なくとも含む。
ホスト2がこのレスポンスを受信した時、ホスト2は、ホスト2によって管理されているLUT411を更新して、書き込まれたライトデータに対応する論理アドレスそれぞれに物理アドレスをマッピングする。図28に示されているように、LUT411は、複数の論理アドレス(例えばLBA)それぞれに対応する複数のエントリを含む。ある論理アドレス(例えばあるLBA)に対応するエントリには、このLBAに対応するデータが格納されているNAND型フラッシュメモリ5内の位置(物理記憶位置)を示す物理アドレスPBA、つまりブロック番号、オフセット(ブロック内オフセット)が格納される。図26に示されているように、開始LBAがLBAxである16Kバイト更新データがブロックBLK#1のオフセット+4~+7に対応する物理記憶位置に書き込まれたならば、図28に示されているように、LUT411が更新されて、LBAxに対応するエントリにBLK#1、オフセット+4が格納され、LBAx+1に対応するエントリにBLK#1、オフセット+5が格納され、LBAx+2に対応するエントリにBLK#1、オフセット+6が格納され、LBAx+3に対応するエントリにBLK#1、オフセット+7が格納される。
図25に示すように、この後、ホスト2は、上述の更新データの書き込みによって不要になった以前のデータを無効化するためのTrimコマンドをフラッシュストレージデバイス3に送信する。図26に示されているように、以前のデータがブロックBLK#0のオフセット+0、オフセット+1、オフセット+2、オフセット+3に対応する位置に格納されている場合には、図29に示すように、ブロック番号(=BLK#0)、オフセット(=+0)、長さ(=4)を指定するTrimコマンドがホスト2からフラッシュストレージデバイス3に送信される。フラッシュストレージデバイス3のコントローラ4は、このTrimコマンドに応じて、ブロック管理テーブル32を更新する(図25、ステップS14)。ステップS15においては、図29に示すように、ブロックBLK#0用のブロック管理テーブルにおいて、オフセット+0~+3に対応するビットマップフラグそれぞれが1から0に変更される。
図30は、フラッシュストレージデバイス3に適用されるリードコマンドを示す。
リードコマンドは、フラッシュストレージデバイス3にデータの読み出しを要求するコマンドである。このリードコマンドは、コマンドID、物理アドレスPBA、長さ、転送先ポインタを含む。
コマンドIDはこのコマンドがリードコマンドであることを示すID(コマンドコード)であり、リードコマンドにはリードコマンド用のコマンドIDが含まれる。
物理アドレスPBAは、データが読み出されるべき最初の物理記憶位置を示す。物理アドレスPBAは、ブロック番号、オフセット(ブロック内オフセット)によって指定される。
長さは、リードすべきデータの長さを示す。このデータ長は、Grainの数によって指定可能である。
転送先ポインタは、読み出されたデータが転送されるべきホスト2内のメモリ上の位置を示す。
一つのリードコマンドは、物理アドレスPBA(ブロック番号、オフセット)と長さの組を複数指定することができる。
図31は、リード動作を示す。
ここでは、ブロック番号(=BLK#2)、オフセット(=+5)、長さ(=3)を指定するリードコマンドがホスト2から受信された場合が想定されている。フラッシュストレージデバイス3のコントローラ4は、ブロック番号(=BLK#2)、オフセット(=+5)、長さ(=3)に基づいて、BLK#2からデータd1~d3をリードする。この場合、コントローラ4は、BLK#2のページ1から1ページサイズ分のデータをリードし、このリードデータからデータd1~データd3を抽出する。次いで、コントローラ4は、データd1~データd3を、転送先ポインタによって指定されるホストメモリ上に転送する。
図32は、ホスト2からのリードコマンドに応じて、異なる物理記憶位置にそれぞれ格納されているデータ部をリードする動作を示す。
ここでは、ブロック番号(=BLK#2)、オフセット(=+10)、長さ(=2)、ブロック番号(=BLK#2)、オフセット(=+16)、長さ(=4)を指定するリードコマンドがホスト2から受信された場合が想定されている。フラッシュストレージデバイス3のコントローラ4は、ブロック番号(=BLK#2)、オフセット(=+10)、長さ(=2)に基づいて、BLK#2のページ2から1ページサイズ分のデータをリードし、このリードデータからデータd1~データd2を抽出する。次いで、コントローラ4は、ブロック番号(=BLK#2)、オフセット(=+16)、長さ(=4)に基づいて、BLK#2のページ4から1ページサイズ分のデータ(データd3~データd6)をリードする。そして、コントローラ4は、データd1~データd2とデータd3~データd6とを結合することによって得られる長さ(=6)のリードデータを、リードコマンド内の転送先ポインタによって指定されるホストメモリ上に転送する。
これにより、たとえブロック内に不良ページが存在する場合であっても、リードエラーを引き起こすことなく、別個の物理記憶位置からデータ部をリードすることができる。また、たとえデータが2つのブロックに跨がって書き込まれている場合であっても、このデータを一つのリードコマンドの発行によってリードすることができる。
図33は、ホスト2とフラッシュストレージデバイス3とによって実行されるリード処理のシーケンスを示す。
ホスト2は、ホスト2によって管理されているLUT411を参照して、ユーザアプリケーションからのリード要求に含まれる論理アドレスをブロック番号、オフセットに変換する。そして、ホスト2は、このブロック番号、オフセット、長さを指定するリードコマンドをフラッシュストレージデバイス3に送信する。
フラッシュストレージデバイス3のコントローラ4がリードコマンドをホスト2から受信した時、コントローラ4は、このリードコマンドによって指定されたブロック番号に対応するブロックをリード対象のブロックとして決定するとともに、このリードコマンドによって指定されたオフセットに基づいてリード対象のページを決定する(ステップS31)。ステップS31では、コントローラ4は、まず、リードコマンドによって指定されたオフセットを、ページサイズを表す粒度の数(ここでは、4)で除算してもよい。そして、コントローラ4は、この除算によって得られる商および余りを、リード対象のページ番号およびリード対象のページ内オフセット位置としてそれぞれ決定してもよい。
コントローラ4は、ブロック番号、オフセット、長さによって規定されるデータをNAND型フラッシュメモリ5からリードし(ステップS32)、このリードデータをホスト2に送信する。
図34は、フラッシュストレージデバイス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制御コマンドに設定してもよい。
図35は、GC用コールバックコマンドを示す。
GC用コールバックコマンドは、GCによってコピーされた有効データの論理アドレスとこの有効データのコピー先位置を示すブロック番号およびオフセットとをホスト2に通知するために使用される。
GC用コールバックコマンドは、コマンドID、論理アドレス、長さ、デスティネーション物理アドレスを含んでよい。
コマンドIDはこのコマンドがGC用コールバックコマンドであることを示すID(コマンドコード)であり、GC用コールバックコマンドにはGC用コールバックコマンド用のコマンドIDが含まれる。
論理アドレスは、GCによってGCソースブロックからGCデスティネーションブロックにコピーされた有効データの論理アドレスを示す。
長さは、このコピーされたデータの長さを示す。このデータ長は、粒度(Grain)の数によって指定されてもよい。
デスティネーション物理アドレスは、有効データがコピーされたGCデスティネーションブロック内の位置を示す。デスティネーション物理アドレスは、ブロック番号、オフセット(ブロック内オフセット)によって指定される。
図36は、ガベージコレクション(GC)動作の手順を示す。
例えば、ホスト2は、ホスト2によって管理されているフリーブロックリストに含まれている残りフリーブロックの数が閾値以下に低下した場合、GCソースブロックおよびGCデスティネーションブロックを選択し、選択されたGCソースブロックおよび選択されたGCデスティネーションブロックを指定するGC制御コマンドをフラッシュストレージデバイス3に送信する(ステップS41)。あるいは、ライト処理部412がフリーブロック群を管理する構成においては、残りフリーブロックの数が閾値以下に低下した際にライト処理部412がホスト2にその旨通知を行ない、通知を受信したホスト2がブロック選択およびGC制御コマンドの送信を行なってもよい。
このGC制御コマンドを受信すると、フラッシュストレージデバイス3のコントローラ4は、GCソースブロック内の有効データを書き込むべきGCデスティネーションブロック内の位置(コピー先位置)を決定する動作と、GCソースブロック内の有効データをGCデスティネーションブロック内のコピー先位置にコピーする動作とを含むデータコピー動作を実行する(ステップS51)。ステップS51では、コントローラ4は、GCソースブロック(コピー元ブロック)内の有効データのみならず、この有効データとこの有効データに対応する論理アドレスの双方を、GCソースブロック(コピー元ブロック)からGCデスティネーションブロック(コピー先ブロック)にコピーする。これにより、GCデスティネーションブロック(コピー先ブロック)内にデータと論理アドレスとのペアを保持することができる。
また、ステップS51では、GCソースブロック内の全ての有効データのコピーが完了するまでデータコピー動作が繰り返し実行される。複数のGCソースブロックがGC制御コマンドによって指定された場合には、全てのGCソースブロック内の全ての有効データのコピーが完了するまでデータコピー動作が繰り返し実行される。
そして、コントローラ4は、コピーされた有効データ毎に、その有効データの論理アドレス(LBA)と、その有効データのコピー先位置を示すデスティネーション物理アドレス等を、GC用コールバックコマンドを使用してホスト2に通知する(ステップS52)。ある有効データに対応するデスティネーション物理アドレスは、この有効データがコピーされたコピー先ブロック(GCデスティネーションブロック)のブロック番号と、この有効データがコピーされたコピー先ブロック内の物理記憶位置を示すブロック内物理アドレス(ブロック内オフセット)とによって表される。
ホスト2がこのGC用コールバックコマンドを受信した時、ホスト2は、ホスト2によって管理されているLUT411を更新して、コピーされた各有効データに対応する論理アドレスにデスティネーション物理アドレス(ブロック番号、ブロック内オフセット)をマッピングする(ステップS42)。
図37は、GCのために実行されるデータコピー動作の例を示す。
図37では、GCソースブロック(ここではブロックBLK#50)のオフセット+4に対応する位置に格納されている有効データ(LBA=10)が、GCデスティネーションブロック(ここではブロックBLK#100)のオフセット+0に対応する位置にコピーされ、GCソースブロック(ここではブロックBLK#50)のオフセット+10に対応する位置に格納されている有効データ(LBA=20)が、GCデスティネーションブロック(ここではブロックBLK#100)のオフセット+1に対応する位置にコピーされた場合が想定されている。この場合、コントローラ4は、{LBA10、BLK#100、オフセット(=+0)、LBA20、BLK#100、オフセット(=+1)}をホストに通知する(GC用コールバック処理)。
図38は、図37のデータコピー動作の結果に基づいて更新されるホスト2のLUT411の内容を示す。
このLUT411においては、LBA10に対応するブロック番号およびオフセットは、BLK#50、オフセット(=+4)から、BLK#100、オフセット(=+0)に更新される。同様に、LBA20に対応するブロック番号およびオフセットは、BLK#50、オフセット(=+10)から、BLK#100、オフセット(=+1)に更新される。
LUT411が更新された後、ホスト2は、BLK#50およびオフセット(=+4)を指定するTrimコマンドをフラッシュストレージデバイス3に送信して、BLK#50のオフセット(=+4)に対応する位置に格納されているデータを無効化してもよい。さらに、ホスト2は、BLK#50およびオフセット(=+10)を指定するTrimコマンドをフラッシュストレージデバイス3に送信して、BLK#50のオフセット(=+10)に対応する位置に格納されているデータを無効化してもよい。あるいは、ホスト2からTrimコマンドを送信せず、GC処理の一環としてコントローラ4がブロック管理テーブル32を更新してこれらのデータを無効化してもよい。
以上説明したように、本実施形態によれば、第1の論理アドレスと第1のブロック番号とを指定するライト要求をホスト2から受信した場合、フラッシュストレージデバイス3のコントローラ4は、ホスト2からのデータを書き込むべき、第1のブロック番号を有するブロック(書き込み先ブロック)内の位置(書き込み先位置)を決定し、ホスト2からのデータを書き込み先ブロックの書き込み先位置に書き込み、第1の位置を示す第1のブロック内物理アドレス、または第1の論理アドレスと第1のブロック番号と第1のブロック内物理アドレスとの組のいずれかを、ホスト2に通知する。
したがって、ホスト2がブロック番号をハンドリングし、フラッシュストレージデバイス3がページ書き込み順序制約/バッドページ等を考慮して、ホスト2によって指定されるブロック番号を有するブロック内の書き込み先位置(ブロック内オフセット)を決定するという構成を実現できる。ホスト2がブロック番号をハンドリングすることにより、上位階層(ホスト2)のアプリケーションレベルアドレス変換テーブルと従来型SSDのLUTレベルアドレス変換テーブルとのマージを実現できる。また、フラッシュストレージデバイス3は、NAND型フラッシュメモリ5の特徴/制約を考慮してNAND型フラッシュメモリ5を制御することができる。さらに、ホスト2はブロック境界を認識することができるので、ブロック境界/ブロックサイズを考慮してユーザデータを各ブロックに書き込むことができる。これにより、ホスト2が同一ブロック内のデータをデータ更新等によって一斉に無効化する等の制御を行うことが可能となるので、GCが実行される頻度を下げることが可能となる。この結果、ライトアンプリフィケーションが低下され、フラッシュストレージデバイス3の性能の向上、フラッシュストレージデバイス3の寿命の最大化を実現できる。
したがって、ホスト2とフラッシュストレージデバイス3との間の適切な役割分担を実現でき、これによってホスト2とフラッシュストレージデバイス3とを含むシステム全体のI/O性能の向上を図ることができる。
また、ガベージコレクションのためのコピー元ブロック番号およびコピー先ブロック番号を指定する制御コマンドをホスト2から受信した場合、フラッシュストレージデバイス3のコントローラ4は、複数のブロックから、コピー元ブロック番号を有する第2のブロックとコピー先ブロック番号を有する第3のブロックとを選択し、第2のブロックに格納されている有効データを書き込むべき第3のブロック内のコピー先位置を決定し、有効データを第3のブロックのコピー先位置にコピーする。そして、コントローラは、有効データの論理アドレスと、コピー先ブロック番号と、第3のブロック内のコピー先位置を示す第2のブロック内物理アドレスとを、ホスト2に通知する。これにより、GCにおいても、ホスト2がブロック番号(コピー元ブロック番号、コピー先ブロック番号)のみをハンドリングし、フラッシュストレージデバイス3がコピー先ブロック内のコピー先位置を決定する、という構成を実現できる。
なお、フラッシュストレージデバイス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)のような他の様々な不揮発性メモリにも適用できる。
図39は、ホスト2とフラッシュストレージデバイス3とのシステムアーキテクチャを示す。具体的には、図39は、ホスト2に含まれるライトデータバッファ51およびフラッシュトランスレーション部52と、フラッシュストレージデバイス3に含まれるライト動作制御部21、リード動作制御部22および(GC動作制御部23を含む)最適化処理部53との関係を示す。
ホスト2は、ライトデータをホストメモリ上のライトデータバッファ51に格納し、そしてライトコマンドをフラッシュストレージデバイス3に発行する。このライトコマンドは、このライトデータが存在するライトデータバッファ51上の位置を示すデータポインタと、このライトデータを識別するタグ(例えばLBA)と、このライトデータの長さと、ライトデータが書き込まれるべきブロックを示す識別子(ブロックアドレス、またはストリームID)とを含んでいてもよい。
フラッシュストレージデバイス3は、以下のタイプ#1-ストレージデバイス、タイプ#2-ストレージデバイス、タイプ#3-ストレージデバイスのうちの任意のストレージデバイスとして実現されうる。
タイプ#1-ストレージデバイスは、ホスト2が、データが書き込まれるべきブロックとこのデータが書き込まれるべきページアドレスの双方を指定するタイプのストレージデバイスである。タイプ#1-ストレージデバイスに適用されるライトコマンドは、ブロックアドレス、ページアドレス、データポインタ、長さを含む。ブロックアドレスは、ホスト2から受信されるライトデータが書き込まれるべきブロックを指定する。ページアドレスは、このライトデータが書き込まれるべきこのブロック内のページを指定する。データポインタは、このライトデータが存在するホスト2内のメモリ上の位置を示す。長さは、このライトデータの長さを示す。
タイプ#2-ストレージデバイスは、ホスト2がデータが書き込まれるべきブロックを指定し、ストレージデバイスがこのデータが書き込まれるべきこのブロック内の位置(ページ)を指定するタイプのストレージデバイスである。タイプ#2-ストレージデバイスに適用されるライトコマンドは、書き込まれるべきライトデータを識別するためのタグ(例えば、LBA、キー)、ブロックアドレス、データポインタ、長さを含む。さらに、ライトコマンドは、QoSドメインIDを含んでもよい。QoSドメインIDは、NAND型フラッシュメモリを論理的に分割することによって得られる複数の領域の一つを指定する。複数の領域の各々は、複数のブロックを含む。タイプ#2-ストレージデバイスは、不良ページ、ページ書き込み順序の制約を考慮して、データが書き込まれるべきページを決定することができる。
つまり、フラッシュストレージデバイス3がタイプ#2-ストレージデバイスとして実現されているケースにおいては、フラッシュストレージデバイス3は、ブロックをホスト2にハンドリングさせつつ、ページ書き込み順序制約、バッドページ、ページサイズ等を隠蔽することができる。この結果、ホスト2は、ブロック境界を認識でき、且つページ書き込み順序制約、バッドページ、ページサイズについては意識することなく、どのユーザデータがどのブロックに存在するかを管理することができる。
タイプ#3-ストレージデバイスは、ホスト2がデータを識別するタグ(例えばLBA)を指定し、ストレージデバイスがこのデータが書き込まれるべきブロックおよびページの双方を決定するタイプのストレージデバイスである。タイプ#3-ストレージデバイスに適用されるライトコマンドは、書き込まれるべきライトデータを識別するためのタグ(例えば、LBA、キー)、ストリームID、データポインタ、長さを含む。ストリームIDは、このライトデータに関連付けられたストリームの識別子である。フラッシュストレージデバイス3がタイプ#3-ストレージデバイスとして実現されているケースにおいては、フラッシュストレージデバイス3は、ストリームIDそれぞれとブロックアドレスそれぞれとの間のマッピングを管理する管理テーブルを参照して、このライトデータが書き込まれるべきブロックを決定する。さらに、フラッシュストレージデバイス3は、論理物理アドレス変換テーブルと称されるアドレス変換テーブルを使用して、タグ(LBA)それぞれとNAND型フラッシュメモリの物理アドレスそれぞれとの間のマッピングを管理する。
フラッシュストレージデバイス3がタイプ#1-ストレージデバイスとして実現されている場合、フラッシュストレージデバイス3においては、ライト動作制御部21の制御の下、このブロックの識別子によって指定される書き込み先ブロックの書き込み動作の進行に合わせて、ライトデータバッファ51から内部バッファ(共有キャッシュ)31へのデータ転送がDMACによって実行される。このデータ転送は、NAND型フラッシュメモリ5のデータ書き込み単位と同じデータサイズの単位で実行される。ライト動作制御部21の制御の下、書き込むべきライトデータが、内部バッファ(共有キャッシュ)31から、この書き込み先ブロックを含むNAND型フラッシュメモリチップ15に転送され、そして、ライト動作制御部21からこのNAND型フラッシュメモリチップ15に書き込み指示用のNANDコマンドが送出される。
フラッシュストレージデバイス3がタイプ#2-ストレージデバイスとして実現されている場合には、ライト動作制御部21は、ホスト2から受信されるブロック割り当て要求に応答して、フリーブロックの一つを書き込み先ブロックとしてホスト2に割り当てる処理も実行する。ブロック割り当て要求は、QoSドメインIDを含んでいてもよい。ライト制御部21は、このQoSドメインIDに属するフリーブロックの一つを書き込み先ブロックとして決定し、この書き込み先ブロックのブロックアドレスをホスト2に通知する。これにより、ホスト2は、このブロックアドレスと、データポインタと、タグ(例えばLBA)と、長さとを指定するライトコマンドを発行することができる。このライトデータがこの書き込み先ブロックに書き込まれた後、ライト動作制御部21は、このライトデータが書き込まれた書き込み先ブロックを示すブロックアドレスと、このライトデータが書き込まれたこの書き込み先ブロック内のページを示すページアドレスと、このライトデータのタグ(例えばLBA)とをホスト2に通知する。ホスト2のフラッシュトランスレーション部52は、タグ(例えばLBA)それぞれとNAND型フラッシュメモリ5の物理アドレス(ブロックアドレス、ページアドレス、等)それぞれとの間のマッピングを管理するアドレス変換テーブルであるLUT411を含む。ブロックアドレス、ページアドレス、およびタグ(例えばLBA)がフラッシュストレージデバイス3から通知された場合、フラッシュトランスレーション部52は、LUT411を更新し、通知されたタグ(例えばLBA)に、通知された物理アドレス(ブロックアドレス、ページアドレス)をマッピングする。フラッシュトランスレーション部52は、LUT411を参照することによって、リード要求に含まれるタグ(例えばLBA)を物理アドレス(ブロックアドレス、ページアドレス)に変換することができ、これによって物理アドレスを含むリードコマンドをフラッシュストレージデバイス3に発行することができる。
フラッシュストレージデバイス3がタイプ#1-ストレージデバイスまたはタイプ#2-ストレージデバイスとして実現されている場合、リード動作制御部22は、リードコマンドに含まれる物理アドレスに基づき、NAND型フラッシュメモリチップ15に読み出し指示用のNANDコマンドを送出する。フラッシュストレージデバイス3がタイプ#3-ストレージデバイスとして実現されている場合には、リード動作制御部22は、アドレス変換テーブルを参照して、リードコマンドに含まれるタグ(LBA)に対応する物理アドレスを取得し、取得した物理アドレスに基づき、NAND型フラッシュメモリチップ15に読み出し指示用のNANDコマンドを送出する。
リード動作制御部22の制御の下、NAND型フラッシュメモリチップ15から読み出されたデータは、内部バッファ(共有キャッシュ)31に転送される。そして、リード動作制御部22の制御の下、内部バッファ(共有キャッシュ)31からホスト2へのデータ転送がDMACによって実行される。また、リード動作制御部22は、読み出すべきリードデータがホスト2のライトデータバッファ51内に存在する場合、ライトデータバッファ51からリードデータを取得することができる。あるいは、ホスト2に対して、リードデータをライトデータバッファ51から取得することを指示してもよい。なお、ライトデータバッファ51上のライトデータが格納される領域は、ライト動作制御部21によるNAND型フラッシュメモリ5への書き込みが完了した場合にライト動作制御部21からホスト2へ送信される解放可能通知により、ホスト2側において解放される。たとえば、ライト動作制御部21によるNAND型フラッシュメモリ5への書き込みが失敗し、ライトデータが別の場所(異なるページやブロック)に書き込まれる場合、その書き込みに必要なデータについて、まだ解放されていない、ホスト2のライトデータバッファ51の領域からフラッシュストレージデバイス3の内部バッファ(共有キャッシュ)31へのデータ転送が再実行される。データの再書き込みは、エラーが検出された範囲で実行されてもよいし、ライトコマンドの範囲すべてで実行されてもよい。解放可能通知は、ライトコマンド単位でホスト2に通知されてもよいし、ホスト2のデータ使用単位でホスト2に通知されてもよい。
(GC動作制御部23を含む)最適化処理部53は、たとえば、ホスト2から受信されるブロック解放要求に応答して、割り当て済みのブロックをフリーブロックに戻す処理などを実行する。ホスト2は、ブロック解放要求を、ブロックリユースコマンドとしてフラッシュストレージデバイス3に送信する。ブロックリユースコマンドで指定され得る割り当て済みのブロックは、フラッシュストレージデバイス3がタイプ#1-ストレージデバイスとして実現され、かつ、ホスト2がフリーブロック群を管理しない場合、または、フラッシュストレージデバイス3がタイプ#2-ストレージデバイスとして実現されている場合において、ブロックアロケートコマンドとしてホスト2から受信したブロック割り当て要求に応答して、フリーブロックの中から割り当てたブロックである。また、最適化処理部53は、たとえば、ホスト2から受信されるGC制御コマンドに応答して、あるブロックのデータを別のブロックにコピーする処理などを実行する。
また、フラッシュストレージデバイス3がホスト2から受信する各種コマンドには、優先度が含まれ得る。つまり、フラッシュストレージデバイス3は、先にホスト2から受信したコマンドに優先して、後からホスト2から受信したコマンドを実行し得る。コマンドの実行順の制御は、たとえば、ホスト2から受信される各種コマンドが一時的に格納されるI/Oコマンドキューからコマンドを取り出す際にコマンド間の優先度を比較することによって実現できる。I/Oコマンドキューは、QoSドメイン毎に設けられるものであってもよいし、後述する仮想ストレージデバイス(VD:Virtual Device)毎に設けられるものであってもよいし、各フラッシュストレージデバイス3に1つずつ設けられるものであってもよい。
NAND型フラッシュメモリ5が複数のNAND型フラッシュメモリチップ15を含むフラッシュストレージデバイス3においては、1以上の仮想ストレージデバイスを定義することができる。図40は、フラッシュストレージデバイス3上における仮想ストレージデバイスの定義例を示す。
図40中、(A)は、仮想ストレージデバイス間でNANDインタフェース13に接続されるチャンネルが共有される、複数の仮想ストレージデバイスの定義例を示す。(B)は、仮想ストレージデバイス間でNANDインタフェース13に接続されるチャンネルが共有されない、複数の仮想ストレージデバイスの定義例を示す。(C)は、NAND型フラッシュメモリ5が含む複数のNAND型フラッシュメモリチップ15すべてを用いた、1つの仮想ストレージデバイスの定義例を示す。(D)は、NAND型フラッシュメモリ5が含む複数のNAND型フラッシュメモリチップ15それぞれを個別に用いた、NAND型フラッシュメモリチップ15と同数、つまり最大数の仮想ストレージデバイスの定義例を示す。
このように、フラッシュストレージデバイス3上には、様々な形態で、1以上の仮想ストレージデバイスを定義することができる。仮想ストレージデバイスを定義すると、たとえばNAND型フラッシュメモリチップ15の消耗度を監視するためのウェアー監視などを、この仮想ストレージデバイス毎に実行することができる。
また、1以上の仮想ストレージデバイスを定義し得るフラッシュストレージデバイス3においては、仮想ストレージデバイス毎にQoSドメインを管理することができる。図41は、仮想ストレージデバイス毎にQoSドメインが管理される例を示す。
フラッシュストレージデバイス3のブロックは、同一の仮想ストレージデバイス上に定義されるQoSドメイン間で共有される。ブロックを取り扱う単位は、複数のブロックで構成されるスーパーブロックの単位であってもよい。つまり、スーパーブロックが、QoSドメイン間で共有されてもよい。たとえばエンドユーザ毎にQoSドメインが割り当てられている場合において、QoSドメインを示すQoSドメインIDを含むブロックアロケートコマンドがホスト2から受信されると、仮想ストレージデバイス内で共有されるフリーブロック群の中の1つのフリーブロックが、QoSドメインIDで示されるQoSドメインに割り当てられる。
一方、QoSドメインIDとブロックアドレスとを含むブロックリユースコマンドがホスト2から受信されると、QoSドメインIDで示されるQoSドメインに割り当てられているブロックの中のブロックアドレスで示されるブロックが、フリーブロックとしてフリーブロック群に戻される。QoSドメインに割り当てられているブロックをフリーブロックとしてフリーブロック群に戻すことは、ブロックを解放するとも称される。解放されたブロックは、その後、たとえばホスト2からのブロックアロケートコマンドなどによって、その仮想ストレージデバイス内のいずれのQoSドメインにも割り当てられ得る。
ところで、あるQoSドメイン内のあるブロックを対象とするブロックリユースコマンドがホスト2から受信された際、フラッシュストレージデバイス3内において、そのブロックを対象とするリードコマンドが実行中または未実行の状態であった場合、そのリードコマンドよりも先にブロックリユースコマンドが実行されてしまうと、たとえば値が不定のデータがホスト2に返却されるなどのおそれがある。前述したように、フラッシュストレージデバイス3がホスト2から受信する各種コマンドには、優先度が含まれ得るので、フラッシュストレージデバイス3においては、先にホスト2から受信したリードコマンドに優先して、後からホスト2から受信したブロックリユースコマンドが実行され得る。また、リードコマンドのほか、たとえば、GC制御コマンドに応答して、そのブロック内のデータを他のブロックにコピーする場合にも、同様の事態が発生し得る。つまり、そのブロックを対象とするデータの読み出し処理を実行中または未実行の状態にある場合、この実行中または未実行のデータの読み出し処理において意図しないデータが読み出されてしまうおそれがある。
このような事態をホスト2側の制御によって防止するためには、ホスト2において、たとえば仕掛り中のデータの読み出し処理の有無をブロック毎に管理することなどが必要となる。そこで、このフラッシュストレージデバイス3は、このような事態を防止するための仕組みを備えて、ホスト2の負担を軽減するようにしてもよい。
フラッシュストレージデバイス3は、ホスト2からブロックリユースコマンドが受信された場合において、そのブロックリユースコマンドで指定されるブロックを対象とするデータの読み出し処理が実行中または未実行の状態であるならば、ホスト2に対してエラーを通知し、あるいは、実行中または未実行の処理が終了するまでブロックリユースコマンドの実行を保留し、実行中または未実行の処理が終了したら、ブロックリユースコマンドを実行する。
この仕組みをフラッシュストレージデバイス3が備えることで、ホスト2は、たとえば解放しようとするブロックを対象とする仕掛り中のデータの読み出し処理の有無などを気にせずに、ブロックリユースコマンドをフラッシュストレージデバイス3に送信することができるようになる。つまり、ホスト2の負担を軽減することが実現される。
この仕組みは、たとえば、最適化処理部53が、ブロックリユースコマンドの受信時またはブロックリユースコマンドの実行時、そのブロックリユースコマンドで指定されるブロックを対象とするリードコマンドやGC制御コマンドがI/Oコマンドキュー42に格納されていないかを検索することによって実現できる。図41においては、I/Oコマンドキュー42がQoSドメイン毎に設けられる例が示されており、この場合は、最適化処理部53は、ブロックリユースコマンドに含まれるQoSドメインIDで示されるQoSドメインに対して設けられるI/Oコマンドキュー42について、ブロックリユースコマンドに含まれるブロックアドレスで示されるブロックを対象とするリードコマンドまたはGC制御コマンドが存在していないかどうかを調べる。I/Oコマンドキュー42が仮想ストレージデバイス毎または各フラッシュストレージデバイスに1つずつ設けられる場合には、最適化処理部53は、そのI/Oコマンドキュー42について、ブロックリユースコマンドに含まれるQoSドメインIDで示されるQoSドメインの中のブロックリユースコマンドに含まれるブロックアドレスで示されるブロックを対象とするリードコマンドまたはGC制御コマンドが存在していないかどうかを調べる。存在する場合、最適化処理部53は、ホスト2に対してエラーを通知し、あるいは、I/Oコマンドキュー42に存在する、ブロックリユースコマンドで指定されるブロックを対象とするリードコマンドまたはGC制御コマンドが終了するまでブロックリユースコマンドの実行を保留し、それらが終了したら、ブロックリユースコマンドを実行する。
あるいは、この仕組みは、たとえば、フリーブロック群から選ばれてQoSドメインに割り当てられたブロックそれぞれについて、そのブロックを対象として実行中のリードコマンドの数、および、そのブロックをコピー元として実行中のGC制御コマンドの数を示すカウンタをメタデータなどとして設けることによって実現できる。たとえば、リード動作制御部21や(GC動作制御部23を含む)最適化処理部53は、あるブロックを対象とするデータの読み出し処理を実行する場合、そのブロックのカウンタの値を1つ加算する。また、リード動作制御部21や最適化処理部53は、データの読み出し処理を終了した場合、そのブロックのカウンタの値を1つ減算する。最適化処理部53は、ブロックリユースコマンドの受信時またはブロックリユースコマンドの実行時、そのブロックリユースコマンドで指定されるブロックのカウンタの値が0でない場合、ホスト2に対してエラーを通知し、あるいは、カウンタの値が0になるまでブロックリユースコマンドの実行を保留し、カウンタの値が0になったら、ブロックリユースコマンドを実行する。
図42は、ブロックリユースコマンド受信時におけるフラッシュストレージデバイス3の動作手順(第1ケース)を示すフローチャートである。なお、ここでは、ブロックリユースコマンド受信時を想定するが、以下に説明する動作は、ブロックリユースコマンド実行時に行われるものであってもよい。
最適化処理部23は、ブロックリユースコマンドがホスト2から受信された場合(ステップA1)、そのブロックリユースコマンドで指定されるブロックを対象とする実行中または実行待ちの読み出し処理が存在するか否かを判定する(ステップA2)。存在しない場合(ステップA2:NO)、最適化処理部23は、指定されたブロックをフリーブロック化(解放)し、リユース完了を示すレスポンスをホスト2に返す(ステップA3)。
一方、存在する場合(ステップA2:YES)、最適化処理部23は、エラーをホスト2に通知する(ステップA4)。
図43は、ブロックリユースコマンド受信時におけるフラッシュストレージデバイス3の動作手順(第2ケース)を示すフローチャートである。ここでも、ブロックリユースコマンド受信時を想定するが、以下に説明する動作は、ブロックリユースコマンド実行時に行われるものであってもよい。
最適化処理部23は、ブロックリユースコマンドがホスト2から受信された場合(ステップA11)、そのブロックリユースコマンドで指定されるブロックを対象とする実行中または実行待ちの読み出し処理が存在するか否かを判定する(ステップA12)。
存在しない場合(ステップA12:NO)、最適化処理部23は、即時的に、指定されたブロックをフリーブロック化(解放)し、リユース完了を示すレスポンスをホスト2に返す(ステップA14)。一方、存在する場合(ステップA12:YES)、続いて、最適化処理部23は、該当する読み出し処理がすべて完了したか否かの判定を行い(ステップA13)、すべて完了したら(ステップA13:YES)、指定されたブロックをフリーブロック化(解放)し、リユース完了を示すレスポンスをホスト2に返す(ステップA14)。
なお、以上では、ブロックリユースコマンドがホスト2から受信された際、そのブロックリユースコマンドで指定されるブロックを対象とする実行中または実行待ちのリードコマンドやGC制御コマンドを受信済みである場合におけるブロックリユースコマンドの取り扱いを説明した。このフラッシュストレージデバイス3は、さらに、ブロックリユースコマンドがホスト2から受信された後、そのブロックリユースコマンドで指定されるブロックを対象とするリードコマンドやGC制御コマンドがホスト2から受信された場合、エラーをホスト2に返却するようにしてもよい。
また、図41を参照して説明したように、フラッシュストレージデバイス3のブロックは、たとえば仮想ストレージデバイス毎に管理されるQoSドメイン間で共有される。つまり、たとえば仮想ストレージデバイス毎にフリーブロック群が管理され、そのフリーブロック群の中から各QoSドメインへフリーブロックが割り当てられていく。
ブロックにデータを書き込むケースは、大きく分けて、ホスト2から受信されるライトコマンドに応じて、ホスト2のライトデータバッファ51に格納されているデータを書き込むケースと、ホスト2から受信されるGC制御コマンドに応じて、フラッシュストレージデバイス3の別のブロックに格納されているデータを書き込むケースとが存在する。ホスト2のライトデータバッファ51に格納されているデータは新しく、フラッシュストレージデバイス3の別のブロックに格納されているデータは古い。したがって、これらのデータを同一のブロックに混在させると、ライトアンプリフィケーションが悪化するおそれがある。そこで、このフラッシュストレージデバイス3は、データが書き込まれるべきブロックおよびページの双方をストレージデバイスが決定するタイプ#3-ストレージデバイスとして実現されている場合、QoSドメイン毎に、ホスト2からのデータを書き込むためのブロックと、フラッシュストレージデバイス3内のデータをコピーするためのブロックとに分離する仕組みを備えてもよい。ブロックがスーパーブロックの単位で取り扱われる場合には、スーパーブロックを、ホスト2からのデータを書き込むためのスーパーブロックと、フラッシュストレージデバイス3内のデータをコピーするためのスーパーブロックとに分離する。つまり、QoSドメイン毎に、空きページを含むブロックとして、ホスト2からのデータを書き込むためのブロックと、フラッシュストレージデバイス3内のデータをコピーするためのブロックとを各々確保する。
このブロックの分離は、たとえば、フリーブロック群から選ばれてQoSドメインに割り当てられるブロックそれぞれについて、その用途を示す属性情報をメタデータなどとして保持することによって実現できる。QoSドメインが利用を開始された時、ホスト2からのデータを書き込むためのブロックと、フラッシュストレージデバイス3内のデータをコピーするためのブロックとのいずれも確保されていない。なお、ブロックが確保されているとは、空きページを含むブロックが割り当てられていることである。
たとえば、ライト動作制御部21は、あるQoSドメインに関してホスト2からのデータの書き込みを実行する場合、そのQoSドメインにおいて属性情報がホスト2からのデータを書き込むためのブロックであることを示すブロックが確保されていなければ、フリーブロック群の中の1つのフリーブロックをそのQoSドメイン用に取得して、取得したブロックにデータを書き込む。この取得時、ライト動作制御部21は、そのブロックがホスト2からのデータを書き込むためのブロックであることを示す属性情報をメタデータとして記録する。一方、属性情報がホスト2からのデータを書き込むためのブロックであることを示す、ホスト2からのデータを書き込むためのブロックが確保されているならば、ライト動作制御部21は、そのブロック中の最後に書き込みが行われたページに続くページからデータの書き込みを実行する。データの書き込み途中で、そのブロックの最後のページまでデータが書き込まれると、ブロック未確保の状態に戻るので、ライト動作制御部21は、フリーブロック群の中の1つのフリーブロックをそのQoSドメイン用に取得して、取得したブロックに続きのデータを書き込む。この取得時にも、ライト動作制御部21は、そのブロックがホスト2からのデータを書き込むためのブロックであることを示す属性情報をメタデータとして記録する。
また、たとえば、(GC動作制御部23を含む)最適化処理部53は、あるQoSドメインに関してデータのコピーを実行する場合、そのQoSドメインにおいて属性情報がフラッシュストレージデバイス3内のデータをコピーするためのブロックが確保されていなければ、フリーブロック群の中の1つのフリーブロックをそのQoSドメイン用に取得して、取得したブロックにデータを書き込む(コピーする)。この取得時、最適化処理部53は、そのブロックがフラッシュストレージデバイス3内のデータをコピーするためのブロックであることを示す属性情報をメタデータとして記録する。一方、属性情報がフラッシュストレージデバイス3内のデータをコピーするためのブロックであることを示す、フラッシュストレージデバイス3内のデータをコピーするためのブロックが確保されているならば、最適化処理部53は、そのブロック中の最後に書き込みが行われたページに続くページからデータの書き込みを実行する。データの書き込み途中で、そのブロックの最後のページまでデータが書き込まれると、ブロック未確保の状態に戻るので、最適化処理部53は、フリーブロック群の中の1つのフリーブロックをそのQoSドメイン用に取得して、取得したブロックにデータを書き込む。この取得時にも、最適化処理部53は、そのブロックがフラッシュストレージデバイス3内のデータをコピーするためのブロックであることを示す属性情報をメタデータとして記録する。
このように、このフラッシュストレージデバイス3は、ホスト2からの新しいデータを書き込むためのブロックと、フラッシュストレージデバイス3内の古いデータをコピーするためのブロックとを分離することによって、ライトアンプリフィケーションの悪化を防ぐことができる。
また、図39を参照して説明したように、リード動作制御部22は、読み出すべきリードデータがホスト2のライトデータバッファ51内に存在する場合、ライトデータバッファ51からリードデータを取得することができる。一方、ライトデータバッファ51上のライトデータが格納される領域は、ライト動作制御部21からホスト2へ解放可能通知が送信されると、ホスト2側において解放される。そこで、このフラッシュストレージデバイス3は、ライトデータバッファ51内に存在するライトデータ中のデータが対象となるリードコマンドがホスト2から受信された場合、そのリードコマンドが終了するまで、そのデータが格納される領域についての解放可能通知をホスト2へ送信しないようにする仕組みを備えてもよい。
この仕組みは、たとえば、ホスト2のライトデータバッファ51に格納されるライトデータに対し、ホスト2から受信されるライトコマンド単位またはホスト2のデータ使用単位で、データの書き込み処理数および読み出し処理数の残数を示すカウンタをメタデータなどとして設けることによって実現できる。カウンタは、たとえば、解放可能通知がホスト2に通知される単位と一致させて設けられる。解放可能通知がライトコマンド単位でホスト2に通知される場合において、カウンタがホスト2のデータ使用単位で設けられてもよい。
カウンタがホスト2のデータ使用単位で設けられるものと想定すると、ライト動作制御部21は、各カウンタの初期値として、NAND型フラッシュメモリ5へのデータの書き込みに必要なデータの転送回数+1をセットする。+1は、エラーが検出された場合の再書き込み処理のために加算しておくものである。
ライト動作制御部21は、NAND型フラッシュメモリ5へデータを転送する都度、対応するカウンタの値を1ずつ減算する。あるデータ使用単位についてデータの転送が終了したとすると、その時点で、一般的には、カウンタの値は1となる。ライト動作制御部21は、転送したデータすべてがNAND型フラッシュメモリ5に書き込まれ、エラーが検出された場合の再書き込み処理が不要となったことが確定すると、対応するカウンタの値をさらに1減算する。この時点で、一般的には、カウンタの値は0となる。仮に、解放可能通知がホスト2のデータ使用単位でホスト2に通知されるものと想定すると、ライト動作制御部21は、カウンタの値が0になったことを検知した場合、対応する領域についての解放可能通知をホスト2へ通知する。なお、エラーが検出された場合、ライト動作制御部21は、再書き込み処理に必要なデータの転送回数をカウンタに再加算する。NAND型フラッシュメモリ5にデータを転送し終えた後にエラーが検出されても、カウンタの値が0になっていないことから、解放可能通知はホスト2へ通知されておらず、再書き込み処理に必要なデータはホスト2のライトデータバッファ51に存在する。したがって、ホスト2のライトデータバッファ51からフラッシュストレージデバイス3の内部バッファ(共有キャッシュ)31へのデータ転送を再実行することができる。
リード動作制御部21も、ホスト2のライトデータバッファ51に存在するライトデータ中のデータが対象となるリードコマンドがホスト2から受信された場合、そのデータに対応するカウンタの値を1加算する。そして、その読み出し処理が終了したら、リード動作制御部21は、対応するカウンタの値を1減算する。
ライトデータバッファ51上に存在するライトデータ中の読み出し処理の対象となるデータについては、NAND型フラッシュメモリ5への書き込みが終了しても、対応するカウンタの値は0にはならず、解放可能通知がホスト2へ通知されない。つまり、カウンタの値を1加算することで、リード動作制御部21は、ライトデータバッファ51上の目的の領域を解放禁止状態とする。したがって、ホスト2のライトデータバッファ51に存在するライトデータ中のデータが対象となるリードコマンドがホスト2から受信されている状況下において、そのデータを含むライトデータバッファ51上の領域がホスト2側において解放されてしまうことがない。
なお、ホスト2のライトデータバッファ51に存在するライトデータ中のデータが対象となるリードコマンドがホスト2から受信された場合、リード動作制御部21は、そのデータを必ずしもライトデータバッファ51から読み出さなくてもよく、ライトデータのNAND型フラッシュメモリ5への書き込みが終了し、読み出し可能な状態になっているならば、NAND型フラッシュメモリ5から読み出してもよい。この場合、ライトデータバッファ51上のライトデータは、たとえば、予備のデータなどとして活用し得る。
解放可能通知がライトコマンド単位でホスト2に通知され、カウンタがホスト2のデータ使用単位で設けられる場合、ライト動作制御部21は、ライトコマンドで書き込まれるべきライトデータに対応する複数のカウンタすべての値が0になった時点で、解放可能通知をホスト2に通知する。
また、リード動作制御部22が、ライトデータバッファ51からリードデータを取得することができる点に着目し、このフラッシュストレージデバイス3は、タイプ#2-ストレージデバイスとして実現されている場合、ホスト2からのライトデータを書き込み予定のページアドレスを、NAND型フラッシュメモリ5への書き込みの終了を待機することなく、ホスト2に通知する仕組みを備えてもよい。この仕組みをフラッシュストレージデバイス3が備える場合、ホスト2は、たとえば、ライトコマンドで書き込んだデータがフラッシュストレージデバイス3において読み出し可能な状態となるまで待たされることなどがなく、ライトコマンドで書き込んだデータ中のデータを対象とするリードコマンドを速やかに発行することが可能となる。
この仕組みは、たとえば、ライト動作制御部21が、ライトコマンドの受信時にホスト2から通知されるライトデータバッファ51上のライトデータに関する情報を、たとえばメタデータなどとして設ける書き込み先ブロック毎のライトバッファリストに登録し、ホスト2のデータ使用単位毎に、ライトデータを書き込み予定のページアドレスをホスト2に通知することによって実現できる。ライトバッファリストに登録されたライトデータのサイズが、書き込み先ブロックの残り書き込み領域のサイズより大きくても構わない。この場合、ライト動作制御部21は、まず、その書き込み先ブロックに書き込み可能な分について書き込み予定のページアドレスをホスト2に通知し、その書き込み先ブロックへの書き込みが終了して、新たな書き込み先ブロックが確保された後、残りの分について書き込み予定のページアドレスをホスト2に通知する。ライトデータはすべてライトデータバッファ51上に存在し、書き込み先ブロックの確保は極めて短時間で済むので、ライトデータの書き込みがブロックを跨ぐ場合であっても実用上の問題はない。
NAND型フラッシュメモリ5への書き込み時にエラーが検出された場合、ライト動作制御部21は、新たに決定される書き込み予定のページアドレスをホスト2に改めて通知する。なお、ページアドレスのホスト2への通知は、前述したように、書き込み予定のページアドレスが決定した時点で行ってもよいし、ホスト2のデータ使用単位で書き込みが終了する毎に行ってもよい。前者の場合、エラーが検出された場合にホスト2への通知が複数回発生し得るが、ホスト2への通知が速い。後者の場合、ホスト2への通知が前者の場合よりも遅くはなるが、NAND型フラッシュメモリ5への書き込み時にエラーが検出された場合であっても、その回数に関係なく、1度の通知で済むことになる。
次に、ホスト2のライトデータバッファ51を用いるライトコマンド処理を含む、このフラッシュストレージデバイス3によって実行される各種I/Oコマンド処理について詳細に説明する。
図44は、フラッシュストレージデバイス3によって実行されるI/Oコマンド処理を示す。
上述したように、本実施形態では、フラッシュストレージデバイス3はタイプ#1-ストレージデバイス、タイプ#2-ストレージデバイス、タイプ#3-ストレージデバイスのいずれであってもよいが、図44では、フラッシュストレージデバイス3がタイプ#1-ストレージデバイスである場合を例示する。
ホスト2によって発行される各ライトコマンドは、ブロックアドレス、ページアドレス、データポインタ、長さを含む。発行された各ライトコマンドはI/Oコマンドキュー42に入れられる。ホスト2によって発行される各リードコマンドも、ブロックアドレス、ページアドレス、データポインタ、長さを含む。発行された各リードコマンドもI/Oコマンドキュー42に入れられる。
ホスト2がライトデータの書き込みをフラッシュストレージデバイス3に要求することを望む場合、ホスト2は、まず、このライトデータをホストメモリ上のライトデータバッファ51に格納し、そして、ライトコマンドをフラッシュストレージデバイス3に発行する。このライトコマンドは、このライトデータが書き込まれるべき書き込み先ブロックを示すブロックアドレスと、このライトデータが書き込まれるべきこの書き込み先ブロック内のページを示すページアドレスと、このライトデータが存在するライトデータバッファ51内の位置を示すデータポインタと、このライトデータの長さとを含む。
フラッシュストレージデバイス3は、プログラム/リードシーケンサ41を含む。このプログラム/リードシーケンサ41は、上述のライト制御部21およびリード制御部22によって実現される。プログラム/リードシーケンサ41は、I/Oコマンドキュー42に入れられたコマンドそれぞれを任意の順序で実行することができる。
プログラム/リードシーケンサ41が、ある同じ書き込み先ブロックを指定する1以上のライトコマンドをI/Oコマンドキュー42から取得した後、プログラム/リードシーケンサ41は、この書き込み先ブロックの書き込み動作の進行に合わせて、この書き込み先ブロックに書き込むべき次のライトデータ(例えば、1ページサイズ分のライトデータ)を内部バッファ(共有キャッシュ)31またはライトデータバッファ51から取得するための転送要求を内部バッファ(共有キャッシュ)31に送出する。この転送要求は、データポインタと長さとを含んでいてもよい。この転送要求に含まれるデータポインタは、1つのライトコマンドに関連付けられたライトデータを分割、または同じ書き込み先ブロックを指定する2以上のライトコマンドに関連付けられた2以上のライトデータを結合する処理によって算出される。つまり、プログラム/リードシーケンサ41は、同じ書き込み先ブロックを示す識別子を有する一つ以上のライトコマンドに関連付けられたライトデータの集合を、その先頭からNAND型フラッシュメモリ5のデータ書き込み単位と同じサイズを有する境界で区切り、各境界に対応するホストメモリ内の位置を特定する。これによって、プログラム/リードシーケンサ41は、書き込み単位と同じサイズの単位でライトデータをホスト2から取得することができる。
この転送要求に含まれるデータポインタは、この1ページサイズ分のライトデータが存在するライトデータバッファ51上の位置を示す。この1ページサイズ分のライトデータは、この書き込み先ブロックを指定する複数のライトコマンドに関連付けられた複数の小さなサイズのライトデータの集合であってもよいし、この書き込み先ブロックを指定する一つのライトコマンドに関連付けられた大きなサイズのライトデータの一部分であってもよい。
さらに、プログラム/リードシーケンサ41は、この1ページサイズ分のライトデータが書き込まれるべき書き込み先ブロックのブロックアドレスと、この1ページサイズ分のライトデータが書き込まれるべきページのページアドレスとを内部バッファ(共有キャッシュ)31に送出する。
フラッシュストレージデバイス3のコントローラ4は内部バッファ(共有キャッシュ)31を制御するキャッシュコントローラを含んでいてもよい。この場合、このキャッシュコントローラは内部バッファ(共有キャッシュ)31をあたかも制御ロジックであるかのように動作させることができる。内部バッファ(共有キャッシュ)31と複数の書き込み先ブロック#0、#1、#2、…、#nとの間には、複数のフラッシュコマンドキュー43が存在する。これらフラッシュコマンドキュー43は、複数のNAND型フラッシュメモリチップにそれぞれ対応づけられている。
内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、転送要求によって指定されたこの1ページサイズ分のライトデータが内部バッファ(共有キャッシュ)31に存在するか否かを判定する。
この転送要求によって指定されたこの1ページサイズ分のライトデータが内部バッファ(共有キャッシュ)31に存在するならば、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、この1ページサイズ分のライトデータを、このライトデータが書き込まれるべき書き込み先ブロックを含むNAND型フラッシュメモリチップに転送する。さらに、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、このライトデータが書き込まれるべき書き込み先ブロックを含むNAND型フラッシュメモリチップに、この書き込み先ブロックのブロックアドレス、このライトデータが書き込まれるべきページアドレス、書き込み指示用のNANDコマンド(フラッシュライトコマンド)を、フラッシュコマンドキュー43を介して送出する。フラッシュコマンドキュー43は、NAND型フラッシュメモリチップ毎に設けられている。このため、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、このライトデータが書き込まれるべき書き込み先ブロックを含むNAND型フラッシュメモリチップに対応するフラッシュコマンドキュー43に、この書き込み先ブロックのブロックアドレス、このライトデータが書き込まれるべきページアドレス、書き込み指示用のNANDコマンド(フラッシュライトコマンド)を入れる。
なお、内部バッファ(共有キャッシュ)31からNAND型フラッシュメモリチップへのこの1ページサイズ分のライトデータの転送が、このライトデータをNAND型フラッシュメモリチップに書き込むために必要な最終回のデータ転送であるならば、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、このライトデータを内部バッファ(共有キャッシュ)31から破棄し、このライトデータが格納されていた領域を空き領域として確保する。NAND型フラッシュメモリチップにデータを一回転送することを伴う書き込み動作(例えば、フル・シーケンス書き込み動作、等)によってライトデータを書き込み先ブロックに書き込むケースにおいては、NAND型フラッシュメモリチップへの初回のデータ転送が最終回のデータ転送となる。一方、NAND型フラッシュメモリチップにデータを複数回転送することを伴う書き込み動作(例えば、フォギー・ファイン書き込み動作)によってライトデータを書き込み先ブロックに書き込むケースにおいては、最後のファイン書き込みのために必要なNAND型フラッシュメモリチップへのデータ転送が最終回のデータ転送となる。
次に、転送要求によって指定されたこの1ページサイズ分のライトデータが内部バッファ(共有キャッシュ)31に存在しない場合について説明する。
この転送要求によって指定されたこの1ページサイズ分のライトデータが内部バッファ(共有キャッシュ)31に存在しないならば、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、この転送要求(データポインタ、長さ)をDMAC15に送出する。この転送要求(データポインタ、長さ)に基づいて、DMAC15は、この1ページサイズ分のライトデータをホストメモリ上のライトデータバッファ51から内部バッファ(共有キャッシュ)31に転送する。このデータ転送が終了すると、DMAC15は、転送完了(Done)と、このデータポインタ、この長さとを、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラに通知する。
内部バッファ(共有キャッシュ)31に空き領域が存在するならば、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、DMA転送によってライトデータバッファ51から取得されたライトデータを、この空き領域に格納する。
内部バッファ(共有キャッシュ)31に空き領域が存在しないならば、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、内部バッファ(共有キャッシュ)31内の最も古いライトデータを内部バッファ(共有キャッシュ)31から破棄し、最も古いライトデータが格納されていた領域を空き領域として確保する。そして、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、DMA転送によってライトデータバッファ51から取得されたライトデータを、この空き領域に格納する。
フォギー・ファイン書き込み動作のような多段階の書き込み動作が使用されるケースにおいては、キャッシュコントローラは、フォギー書き込み動作のような第1段階の書き込み動作が終了している内部バッファ(共有キャッシュ)31内のライトデータのうちで、最も古いライトデータを破棄する。
データ書き込み量の少ない書き込み先ブロックへのデータ書き込み動作の進行速度に比べ、データ書き込み量の多い書き込み先ブロックへのデータ書き込み動作の進行速度は速くなる傾向がある。このため、データ書き込み量の多い書き込み先ブロックに書き込まれるべきライトデータは頻繁にライトデータバッファ51から内部バッファ(共有キャッシュ)31に転送される。この結果、この最も古いライトデータは、ホスト2から書き込まれるデータ量が比較的少ない書き込み先ブロックへのライトデータである可能性が高い。したがって、フォギー書き込み動作のような第1段階の書き込み動作が終了している内部バッファ(共有キャッシュ)31内のライトデータのうちで最も古いライトデータを破棄するという方法を使用することにより、ホスト2とフラッシュストレージデバイス3との間のデータトラフィックを効率よく低減することが可能となる。
なお、フォギー書き込み動作のような第1段階の書き込み動作が終了している内部バッファ(共有キャッシュ)31内のライトデータの中から破棄すべきライトデータを選択するためのアルゴリズムは、最も古いデータを選択するファースト・イン・ファースト・アウトに限定されず、LRU、ランダムのような他のアルゴリズムを使用してもよい。
プログラム/リードシーケンサ41は、各NAND型フラッシュメモリチップからステータス、つまり、書き込み完了(Done)、書き込み失敗(Error)、ブロックアドレス、ページアドレス、を受信する。そして、これらステータスに基づいて、プログラム/リードシーケンサ41は、ライトコマンド毎に、このライトコマンドに関連付けられたライトデータ全体に対する書き込み動作(NAND型フラッシュメモリチップに同じデータを1回または複数回転送する書き込み動作)の全てが終了したか否かを判定する。あるライトコマンドに関連付けられたライトデータ全体に対する書き込み動作の全てが終了したならば、プログラム/リードシーケンサ41は、このライトコマンドのコマンド完了を示すレスポンス(Done)をホスト2に送信する。このコマンド完了を示すレスポンス(Done)は、このライトコマンドを一意に識別するコマンドIDを含む。
次に、リードコマンドの処理について説明する。
リードコマンドは、リードすべきデータが格納されているブロックを示すブロックアドレスと、このデータが格納されているページを示すページアドレスと、このデータが転送されるべきホストメモリ上のリードデータバッファ53内の位置を示すデータポインタと、このデータの長さとを含む。
プログラム/リードシーケンサ41は、リードコマンドによって指定されたブロックアドレスおよびページアドレスを内部バッファ(共有キャッシュ)31に送出し、リードコマンドによって指定されたデータの読み出しを内部バッファ(共有キャッシュ)31に要求する。
内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、NAND型フラッシュメモリチップに、このブロックアドレスと、このページアドレスと、リード指示用のNANDコマンド(フラッシュリードコマンド)を、フラッシュコマンドキュー43を介して送出する。NAND型フラッシュメモリチップから読み出されたデータは、DMAC15によってリードデータバッファ53に転送される。
なお、リードコマンドによって指定されたデータが、書き込み動作が終了していないデータ、または書き込み動作の全てが終了しているがNAND型フラッシュメモリ5からまだ読み出し可能となっていないデータである場合、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、内部バッファ(共有キャッシュ)31にこのデータが存在するか否かを判定してもよい。内部バッファ(共有キャッシュ)31にこのデータが存在するならば、このデータが内部バッファ(共有キャッシュ)31から読み出され、そしてDMAC15によってリードデータバッファ53に転送される。
一方、内部バッファ(共有キャッシュ)31にこのデータが存在しないならば、このデータは、まず、DMAC15によってライトデータバッファ51から内部バッファ(共有キャッシュ)31に転送される。そして、このデータが内部バッファ(共有キャッシュ)31から読み出され、そしてDMAC15によってリードデータバッファ53に転送される。
図45は、フラッシュストレージデバイス3によって実行される複数段階の書き込み動作を示す。
ここでは、4つのワード線を往復する場合のフォギー・ファイン書き込み動作を例示する。また、ここでは、NAND型フラッシュメモリ5が、メモリセル当たりに4ビットのデータを格納するQLC-フラッシュである場合を想定する。NAND型フラッシュメモリ5内の一つの特定の書き込み先ブロック(ここでは、書き込み先ブロックBLK#1)に対するフォギー・ファイン書き込み動作は以下のように実行される。
(1)まず、4ページ(P0~P3)分のライトデータがページ単位でNAND型フラッシュメモリ5に転送され、この書き込み先ブロックBLK#1内のワード線WL0に接続された複数のメモリセルに、これら4ページ(P0~P3)分のライトデータを書き込むためのフォギー書き込み動作が実行される。
(2)次いで、次の4ページ(P4~P7)分のライトデータがこのNAND型フラッシュメモリ5にページ単位で転送され、この書き込み先ブロックBLK#1内のワード線WL1に接続された複数のメモリセルに、これら4ページ(P4~P7)分のライトデータを書き込むためのフォギー書き込み動作が実行される。
(3)次いで、次の4ページ(P8~P11)分のライトデータがこのNAND型フラッシュメモリ5にページ単位で転送され、この書き込み先ブロックBLK#1内のワード線WL2に接続された複数のメモリセルに、これら4ページ(P8~P11)分のライトデータを書き込むためのフォギー書き込み動作が実行される。
(4)次いで、次の4ページ(P12~P15)分のライトデータがこのNAND型フラッシュメモリ5にページ単位で転送され、この書き込み先ブロックBLK#1内のワード線WL3に接続された複数のメモリセルに、これら4ページ(P12~P15)分のライトデータを書き込むためのフォギー書き込み動作が実行される。
(5)ワード線WL3に接続された複数のメモリセルに対するフォギー書き込み動作が終了すると、書き込み対象のワード線はワード線WL0に戻り、ワード線WL0に接続された複数のメモリセルに対するファイン書き込み動作の実行が可能となる。そして、ワード線WL0に対するフォギー書き込み動作で使用された4ページ(P0~P3)分のライトデータと同じ4ページ(P0~P3)分のライトデータがページ単位でNAND型フラッシュメモリ5に再び転送され、この書き込み先ブロックBLK#1内のワード線WL0に接続された複数のメモリセルに、これら4ページ(P0~P3)分のライトデータを書き込むためのファイン書き込み動作が実行される。これにより、ページP0~P3に対するフォギー・ファイン書き込み動作が終了する。
(6)次いで、次の4ページ(P16~P19)分のライトデータがこのNAND型フラッシュメモリ5にページ単位で転送され、この書き込み先ブロックBLK#1内のワード線WL4に接続された複数のメモリセルに、これら4ページ(P16~P19)分のライトデータを書き込むためのフォギー書き込み動作が実行される。
(7)ワード線WL4に接続された複数のメモリセルに対するフォギー書き込み動作が終了すると、書き込み対象のワード線はワード線WL1に戻り、ワード線WL1に接続された複数のメモリセルに対するファイン書き込み動作の実行が可能となる。そして、ワード線WL1に対するフォギー書き込み動作で使用された4ページ(P4~P7)分のライトデータと同じ4ページ(P4~P7)分のライトデータがページ単位でNAND型フラッシュメモリ5に再び転送され、この書き込み先ブロックBLK#1内のワード線WL1に接続された複数のメモリセルに、これら4ページ(P4~P7)分のライトデータを書き込むためのファイン書き込み動作が実行される。これにより、ページP4~P7に対するフォギー・ファイン書き込み動作が終了する。
(8)次いで、次の4ページ(P20~P23)分のライトデータがこのNAND型フラッシュメモリ5にページ単位で転送され、この書き込み先ブロックBLK#1内のワード線WL5に接続された複数のメモリセルに、これら4ページ(P20~P23)分のライトデータを書き込むためのフォギー書き込み動作が実行される。
(9)ワード線WL5に接続された複数のメモリセルに対するフォギー書き込み動作が終了すると、書き込み対象のワード線はワード線WL2に戻り、ワード線WL2に接続された複数のメモリセルに対するファイン書き込み動作の実行が可能となる。そして、ワード線WL2に対するフォギー書き込み動作で使用された4ページ(P8~P11)分のライトデータと同じ4ページ(P8~P11)分のライトデータがページ単位でNAND型フラッシュメモリ5に再び転送され、この書き込み先ブロックBLK#1内のワード線WL2に接続された複数のメモリセルに、これら4ページ(P8~P11)分のライトデータを書き込むためのファイン書き込み動作が実行される。これにより、ページP8~P11に対するフォギー・ファイン書き込み動作が終了する。
図46は、書き込み先ブロックBLK#1へのデータの書き込み順序を示す。
ここでは、図7と同様に、4つのワード線を往復する場合のフォギー・ファイン書き込み動作が実行される場合を想定する。
図46の左部に示されるデータd0、データd1、データd2、データd3、データd4、データd5、データd6、データd7、…、データd252、データd253、データd254、データd255は、書き込み先ブロックBLK#1を指定する複数のライトコマンドそれぞれに対応する複数のライトデータを示している。ここでは、図示の簡単化のために、全てのライトデータが同じサイズを有している場合が想定されている。
図46の右部は、書き込み先ブロックBLK#1へのデータの書き込み順序を示している。書き込み動作は、ワード線WL0に接続された複数のメモリセルへのデータd0の書き込み(フォギー書き込み)、ワード線WL1に接続された複数のメモリセルへのデータd1の書き込み(フォギー書き込み)、ワード線WL2に接続された複数のメモリセルへのデータd2の書き込み(フォギー書き込み)、ワード線WL3に接続された複数のメモリセルへのデータd3の書き込み(フォギー書き込み)、ワード線WL0に接続された複数のメモリセルへのデータd0の書き込み(ファイン書き込み)、ワード線WL4に接続された複数のメモリセルへのデータd4の書き込み(フォギー書き込み)、ワード線WL1に接続された複数のメモリセルへのデータd1の書き込み(ファイン書き込み)、ワード線WL5に接続された複数のメモリセルへのデータd5の書き込み(フォギー書き込み)、ワード線WL2に接続された複数のメモリセルへのデータd2の書き込み(ファイン書き込み)、…という順序で実行される。
図47は、NAND型フラッシュメモリ5のデータ書き込み単位と同じサイズの単位でライトデータをホスト2からフラッシュストレージデバイス3に転送する動作を示す。
図47の左部に示されるデータd1、データd2、データd3、データd4、データd5、データd6、データd7、データd8、データd9、データd10、…は、書き込み先ブロックBLK#1を指定する10個のライトコマンドにそれぞれ対応する10個のライトデータを示している。ライトデータの長さ(サイズ)は、個々のライトコマンド毎に異なる。図47では、データd1、データd2、データd3、データd4の各々が4Kバイトのサイズを有し、データd5が8Kバイトのサイズを有し、データd6が40Kバイトのサイズを有し、データd7が16Kバイトのサイズを有し、データd8、データd9の各々が8Kバイトのサイズを有し、データd10が1Mバイトのサイズを有する場合が想定されている。
ホスト2から受信される各ライトコマンドはデータポインタ、長さ、ブロック識別子(例えばブロックアドレス)を含むので、フラッシュストレージデバイス3のコントローラ4は、ホスト2から受信されるライトコマンドを、複数の書き込み先ブロックにそれぞれ対応する複数のグループに分類することができる。上述のデータd1、データd2、データd3、データd4、データd5、データd6、データd7、データd8、データd9、データd10、…は、書き込み先ブロックBLK#1に対応するグループに分類された10個のライトコマンドにそれぞれ対応している。これら10個のライトコマンドは、書き込み先ブロックBLK#1を示すブロック識別子(例えばブロックアドレス)を含むライトコマンドである。
フラッシュストレージデバイス3のコントローラ4は、書き込み先ブロックBLK#1を指定するこれらライトコマンド内のデータポインタおよび長さに基づいて、データd1、データd2、データd3、データd4、データd5、データd6、データd7、データd8、データd9、データd10がそれぞれ存在するライトデータバッファ51上の位置、およびデータd1、データd2、データd3、データd4、データd5、データd6、データd7、データd8、データd9、データd10それぞれの長さを管理する。そして、コントローラ4は、一つのライトコマンドに関連付けられた大きなサイズのライトデータを複数のライトデータ(複数のデータ部)に分割、または2以上のライトコマンドにそれぞれ関連付けられた小さなサイズの2以上のライトデータを互いに結合することによって得られる、NAND型フラッシュメモリ5のデータ書き込み単位と同じサイズを有するライトデータを、ホスト2から取得する。
図47では、コントローラ4は、最初に、各々が4Kバイトのサイズを有するデータd1、データd2、データd3、データd4を互いに結合することによって得られる16Kバイトライトデータをホスト2のライトデータバッファ51から取得する。この場合、コントローラ4は、これに限定されないが、例えば、4回のDMA転送によって、この16Kバイトライトデータをホスト2のライトデータバッファ51から内部バッファ31に転送してもよい。最初のDMA転送では、データd1の先頭位置を指定する転送元アドレスと、データ長=4KBがDMAC15にセットされてもよい。データd1の先頭位置を指定する転送元アドレスは、データd1に対応するライトコマンド内のデータポインタによって表される。2回目のDMA転送では、データd2の先頭位置を指定する転送元アドレスと、データ長=4KBがDMAC15にセットされてもよい。データd2の先頭位置を指定する転送元アドレスは、データd2に対応するライトコマンド内のデータポインタによって表される。3回目のDMA転送では、データd3の先頭位置を指定する転送元アドレスと、データ長=4KBがDMAC15にセットされてもよい。データd3の先頭位置を指定する転送元アドレスは、データd3に対応するライトコマンド内のデータポインタによって表される。4回目のDMA転送では、データd4の先頭位置を指定する転送元アドレスと、データ長=4KBがDMAC15にセットされてもよい。データd4の先頭位置を指定する転送元アドレスは、データd4に対応するライトコマンド内のデータポインタによって表される。
そして、コントローラ4は、DMA転送によって取得されるこの16Kバイトライトデータ(d1、d2、d3、d4)を、書き込み先ブロックBLK#1のページP0に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。
コントローラ4は、書き込み先ブロックBLK#1の次の書き込み先ページをページP1に変更し、8Kバイトのサイズを有するデータd3と、データd6内の先頭の8Kバイトデータd6-1とを互いに結合することによって得られる16Kバイトライトデータをホスト2のライトデータバッファ51から取得する。この場合、コントローラ4は、これに限定されないが、例えば、2回のDMA転送によって、この16Kバイトライトデータをホスト2のライトデータバッファ51から内部バッファ31に転送してもよい。最初のDMA転送では、データd5の先頭位置を指定する転送元アドレスと、データ長=8KBがDMAC15にセットされてもよい。データd5の先頭位置を指定する転送元アドレスは、データd5に対応するライトコマンド内のデータポインタによって表される。2回目のDMA転送では、データd6-1の先頭位置を指定する転送元アドレスと、データ長=8KBがDMAC15にセットされてもよい。データd6-1の先頭位置を指定する転送元アドレスは、データd6に対応するライトコマンド内のデータポインタによって表される。
そして、コントローラ4は、この16Kバイトライトデータ(d5、d6-1)を、書き込み先ブロックBLK#1のページP1に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。
コントローラ4は、書き込み先ブロックBLK#1の次の書き込み先ページをページP2に変更し、データd6の残りの32Kバイトデータのうちの最初の16Kバイトデータd6-2をホスト2のライトデータバッファ51から取得する。この場合、コントローラ4は、これに限定されないが、例えば、1回のDMA転送によって、この16Kバイトライトデータをホスト2のライトデータバッファ51から内部バッファ31に転送してもよい。このDMA転送では、データd6-2の先頭位置を指定する転送元アドレスと、データ長=16KBがDMAC15にセットされてもよい。データd6-2の先頭位置を指定する転送元アドレスは、データd6に対応するライトコマンド内のデータポインタの値に8KB分のオフセットを加算することによって求めることができる。
そして、コントローラ4は、この16Kバイトライトデータ(d6-2)を、書き込み先ブロックBLK#1のページP2に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。
コントローラ4は、書き込み先ブロックBLK#1の次の書き込み先ページをページP3に変更し、データd6の残りの16Kバイトデータd6-3をホスト2のライトデータバッファ51から取得する。この場合、コントローラ4は、これに限定されないが、例えば、1回のDMA転送によって、この16Kバイトライトデータをホスト2のライトデータバッファ51から内部バッファ31に転送してもよい。このDMA転送では、データd6-3の先頭位置を指定する転送元アドレスと、データ長=16KBがDMAC15にセットされてもよい。データd6-3の先頭位置を指定する転送元アドレスは、データd6に対応するライトコマンド内のデータポインタの値に24KB分のオフセットを加算することによって求めることができる。
そして、コントローラ4は、この16Kバイトライトデータ(d6-3)を、書き込み先ブロックBLK#1のページP3に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。
そして、コントローラ4は、フォギー書き込み動作によって4ページ分のデータ(P0~P3)を書き込み先ブロックBLK#1のワード線WL0に接続された複数のメモリセルに書き込む。
コントローラ4は、書き込み先ブロックBLK#1の次の書き込み先ページをページP4に変更し、16Kバイトのサイズを有するデータd7をホスト2のライトデータバッファ51から取得する。この場合、コントローラ4は、これに限定されないが、例えば、1回のDMA転送によって、この16Kバイトライトデータをホスト2のライトデータバッファ51から内部バッファ31に転送してもよい。このDMA転送では、データd7の先頭位置を指定する転送元アドレスと、データ長=16KBがDMAC15にセットされてもよい。データ7の先頭位置を指定する転送元アドレスは、データd7に対応するライトコマンド内のデータポインタによって表される。
そして、コントローラ4は、この16Kバイトライトデータ(d7)を、書き込み先ブロックBLK#1のページP4に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。
コントローラ4は、書き込み先ブロックBLK#1の次の書き込み先ページをページP5に変更し、8Kバイトのサイズを有するデータd8と、8Kバイトのサイズを有するデータd9とを互いに結合することによって得られる16Kバイトライトデータをホスト2のライトデータバッファ51から取得する。この場合、コントローラ4は、これに限定されないが、例えば、2回のDMA転送によって、この16Kバイトライトデータをホスト2のライトデータバッファ51から内部バッファ31に転送してもよい。最初のDMA転送では、データd8の先頭位置を指定する転送元アドレスと、データ長=8KBがDMAC15にセットされてもよい。データd8の先頭位置を指定する転送元アドレスは、データd8に対応するライトコマンド内のデータポインタによって表される。2回目のDMA転送では、データd9の先頭位置を指定する転送元アドレスと、データ長=8KBがDMAC15にセットされてもよい。データd9の先頭位置を指定する転送元アドレスは、データd9に対応するライトコマンド内のデータポインタによって表される。
そして、コントローラ4は、この16Kバイトライトデータ(d8、d9)を、書き込み先ブロックBLK#1のページP5に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。
コントローラ4は、書き込み先ブロックBLK#1の次の書き込み先ページをページP6に変更し、データd10内の先頭の16Kバイトデータd10-1をホスト2のライトデータバッファ51から取得する。この場合、コントローラ4は、これに限定されないが、例えば、1回のDMA転送によって、この16Kバイトライトデータをホスト2のライトデータバッファ51から内部バッファ31に転送してもよい。このDMA転送では、データd10-1の先頭位置を指定する転送元アドレスと、データ長=16KBがDMAC15にセットされてもよい。データd10-1の先頭位置を指定する転送元アドレスは、データd10に対応するライトコマンド内のデータポインタによって表される。
そして、コントローラ4は、この16Kバイトライトデータ(d10-1)を、書き込み先ブロックBLK#1のページP6に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。
コントローラ4は、書き込み先ブロックBLK#1の次の書き込み先ページをページP7に変更し、データd10内の次の16Kバイトデータd10-2をホスト2のライトデータバッファ51から取得する。この場合、コントローラ4は、これに限定されないが、例えば、1回のDMA転送によって、この16Kバイトライトデータをホスト2のライトデータバッファ51から内部バッファ31に転送してもよい。このDMA転送では、データd10-2の先頭位置を指定する転送元アドレスと、データ長=16KBがDMAC15にセットされてもよい。データd10-2の先頭位置を指定する転送元アドレスは、データd10に対応するライトコマンド内のデータポインタの値に16KB分のオフセットを加算することによって求めることができる。
そして、コントローラ4は、この16Kバイトライトデータ(d10-2)を、書き込み先ブロックBLK#1のページP7に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。
そして、コントローラ4は、フォギー書き込み動作によって4ページ分のデータ(P4~P7)を書き込み先ブロックBLK#1のワード線WL1に接続された複数のメモリセルに書き込む。
このように、コントローラ4は、書き込み先ブロックBLK#1の書き込み動作の進行に合わせて、書き込み先ブロックBLK#1の書き込み先ページに転送すべき16Kバイトデータをホスト2から取得する。
そして、ワード線WL3に接続された複数のメモリセルに対するフォギー書き込み動作が終了すると、ワード線WL0に接続された複数のメモリセルに対するファイン書き込み動作の実行が可能となる。コントローラ4は、書き込み先ブロックBLK#1の次の書き込み先ページをページP1に変更し、上述と同様の手順で、ライトデータ(P0~P3)をページ単位でNAND型フラッシュメモリ5に再び転送し、そしてファイン書き込み動作によってこれら4ページ分のライトデータ(P0~P3)を書き込み先ブロックBLK#1のワード線WL0に接続された複数のメモリセルに書き込む。
これにより、最初の6つのライトコマンド、つまりデータd1に対応するライトコマンド、データd2に対応するライトコマンド、データd3に対応するライトコマンド、データd4に対応するライトコマンド、データd5に対応するライトコマンド、データd6に対応するライトコマンドの各々に関しては、各ライトコマンドに関連付けせけたライトデータ全体に対するフォギー・ファイン書き込み動作の全てが終了し、且つデータd1~d6の各々はNAND型フラッシュメモリ5から読み出し可能となる。このため、コントローラ4は、最初の6つのライトコマンドにそれぞれに対応する6つのコマンド完了レスポンスをホスト2に返す。
なお、図47では、書き込み先ブロックBLK#1を指定するライトコマンドそれぞれに関連づけられたライトデータを、書き込み先ブロックBLK#1の書き込み動作の進行に合わせて16Kバイトの単位でホスト2からフラッシュストレージデバイス3に転送する動作を説明したが、他の各書き込み先ブロックBLK#に関しても、図9で説明した動作と同様の動作が実行される。
図48のフローチャートは、フラッシュストレージデバイス3によって実行されるデータ書き込み処理の手順を示す。ここでは、フラッシュストレージデバイス3が、タイプ#2-ストレージデバイスとして実現されており、かつ、ホスト2からのライトデータを書き込み予定のページアドレスを、NAND型フラッシュメモリ5への書き込みの終了を待機することなく、ホスト2に通知する仕組みを備えていることを想定する。
フラッシュストレージデバイス3のコントローラ4は、データポインタ、長さ、ブロック識別子(例えばブロックアドレス)を各々が含むライトコマンドそれぞれをホスト2から受信する(ステップB1)。
次いで、コントローラ4は、特定の書き込み先ブロックを指定する一つのライトコマンドに対応する大きなサイズのライトデータを2以上のデータ部に分割、またはこの特定の書き込み先ブロックを指定する2以上のライトコマンドに対応する2以上のライトデータを結合し、これによってNAND型フラッシュメモリ5の書き込み単位(データ転送サイズ)と同じサイズの単位でデータをホスト2からフラッシュストレージデバイス3に転送する(ステップB2)。ステップB2では、図47で説明したように、例えば、小さなサイズを有する幾つかのライトデータ部を互いに結合することによって得られる一つの16Kバイトデータ、あるいは大きなサイズを有するライトデータを分割することによって得られる幾つかの16Kバイトデータの一つが、ホスト2からフラッシュストレージデバイス3に転送される。フラッシュストレージデバイス3が内部バッファ31を含む構成であるケースにおいては、ホスト2からフラッシュストレージデバイス3に転送される各16バイトライトデータは内部バッファ31に格納される。また、ステップB2では、小さなサイズを有する幾つかのライトデータ部を互いに結合するために、コントローラ4は、ある書き込み先ブロックを指定する識別子を有する先行するライトコマンドに関連付けられたライトデータのサイズが書き込み単位(例えば16Kバイト)よりも小さい場合、この書き込み先ブロックを指定する識別子を有する後続のライトコマンドの受信を待つ。
コントローラ4は、ホスト2から転送された16Kバイトデータについて、この16Kバイトデータを特定の書き込み先ブロックに書き込む前に、この16Kバイトデータの書き込み先に割り当てた特定の書き込み先ブロック内のアドレスをホスト2に通知する(ステップB3)。それから、コントローラ4は、ホスト2から転送された16KバイトデータをNAND型フラッシュメモリ5に転送し、この16Kバイトデータを、この特定の書き込み先ブロック内の書き込み先に割り当てたアドレスに書き込む(ステップB4)。コントローラ4は、この書き込みが成功したか否かを判定し(ステップB5)、エラーの場合(ステップB5:NO)、ステップB3から処理を繰り返す。つまり、同一のデータについてのホスト2へのアドレスの通知は複数回発生し得る。成功の場合は(ステップB5:YES)、ステップB6へと進む。
そして、コントローラ4は、この特定の書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作(NAND型フラッシュメモリ5に同じデータを1回または複数回転送することを伴う書き込み動作)の全てが終了したか否かを判定する(ステップB6)。
この特定の書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作の全てが終了したならば、コントローラ4は、このライトコマンドのコマンド完了を示すレスポンスをホスト2に返す(ステップB7)。ライトデータが格納されるライトデータバッファ51上の領域に関する解放可能通知のホスト2への送信タイミングについては後述する。
図49のフローチャートは、フラッシュストレージデバイス3によって実行されるデータ書き込み処理の別の手順を示す。ここでも、フラッシュストレージデバイス3が、タイプ#2-ストレージデバイスとして実現されており、かつ、ホスト2からのライトデータを書き込み予定のページアドレスを、NAND型フラッシュメモリ5への書き込みの終了を待機することなく、ホスト2に通知する仕組みを備えていることを想定する。
フラッシュストレージデバイス3のコントローラ4は、データポインタ、長さ、ブロック識別子(例えばブロックアドレス)を各々が含むライトコマンドそれぞれをホスト2から受信する(ステップB11)。
次いで、コントローラ4は、特定の書き込み先ブロックを指定する一つのライトコマンドに対応する大きなサイズのライトデータを2以上のデータ部に分割、またはこの特定の書き込み先ブロックを指定する2以上のライトコマンドに対応する2以上のライトデータを結合し、これによってNAND型フラッシュメモリ5の書き込み単位(データ転送サイズ)と同じサイズの単位でデータをホスト2からフラッシュストレージデバイス3に転送する(ステップB12)。ステップB12では、図47で説明したように、例えば、小さなサイズを有する幾つかのライトデータ部を互いに結合することによって得られる一つの16Kバイトデータ、あるいは大きなサイズを有するライトデータを分割することによって得られる幾つかの16Kバイトデータの一つが、ホスト2からフラッシュストレージデバイス3に転送される。フラッシュストレージデバイス3が内部バッファ31を含む構成であるケースにおいては、ホスト2からフラッシュストレージデバイス3に転送される各16バイトライトデータは内部バッファ31に格納される。また、ステップB2では、小さなサイズを有する幾つかのライトデータ部を互いに結合するために、コントローラ4は、ある書き込み先ブロックを指定する識別子を有する先行するライトコマンドに関連付けられたライトデータのサイズが書き込み単位(例えば16Kバイト)よりも小さい場合、この書き込み先ブロックを指定する識別子を有する後続のライトコマンドの受信を待つ。
コントローラ4は、ホスト2から転送された16KバイトデータをNAND型フラッシュメモリ5に転送し、この16Kバイトデータを、この特定の書き込み先ブロックに書き込む(ステップB13)。
コントローラ4は、この書き込みが成功したか否かを判定し(ステップB14)、エラーの場合(ステップB14:NO)、ステップB13から処理を繰り返す。成功の場合は(ステップB14:YES)、ステップB15へと進む。
コントローラ4は、ホスト2から転送された16Kバイトデータの書き込み先に割り当てた特定の書き込み先ブロック内のアドレスをホスト2に通知する(ステップB15)。
そして、コントローラ4は、この特定の書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作(NAND型フラッシュメモリ5に同じデータを1回または複数回転送することを伴う書き込み動作)の全てが終了したか否かを判定する(ステップB16)。
この特定の書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作の全てが終了したならば、コントローラ4は、このライトコマンドのコマンド完了を示すレスポンスをホスト2に返す(ステップB17)。ライトデータが格納されるライトデータバッファ51上の領域に関する解放可能通知のホスト2への送信タイミングについては後述する。
図50のフローチャートは、フラッシュストレージデバイス3によって実行されるホスト2への解放可能通知の送信処理の手順を示す。
コントローラ4は、第1に、特定の書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作の全てが終了したか否かを判定する(ステップC1)。また、コントローラ4は、第2に、このライトデータを対象とするリードコマンドが存在するか否かを判定する(ステップC2)。なお、ステップC1の処理とステップC2の処理とは、並列的に実行される。そして、コントローラ4は、特定の書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作の全てが終了し(ステップC1:YES)、かつ、このライトデータを対象とするリードコマンドが存在しない場合に(ステップC2:NO)、このライトデータが格納されるライトデータバッファ51上の領域に関する解放可能通知をホスト2に送信する(ステップC3)。
図51のフローチャートは、ホスト2によって実行されるライトデータ破棄処理の手順を示す。
ホスト2は、ライトコマンドのコマンド完了を示すレスポンスをフラッシュストレージデバイス3から受信したか否かを判定する(ステップD1)。あるライトコマンドのコマンド完了を示すレスポンスをフラッシュストレージデバイス3から受信した場合(ステップD1:YES)、ホスト2は、さらに、このライトコマンドに関連付けられたライトデータに関する解放可能通知をフラッシュストレージデバイス3から受信したか否かを判定する(ステップD2)。このライトデータに関する解放可能通知をフラッシュストレージデバイス3から受信した場合(ステップD2:YES)、ホスト2は、このライトコマンドに関連付けられたライトデータをライトデータバッファ51から破棄する(ステップD3)。
図52は、ある書き込み先ブロックを指定する最後のライトコマンドが受信されてから閾期間、この書き込み先ブロックを指定する次のライトコマンドが受信されない場合に、フラッシュストレージデバイス3によって実行されるダミーデータ書き込み処理を示す。
図52の左部に示されるデータd1、データd2、データd3、データd4は、書き込み先ブロックBLK#1を指定する4個のライトコマンドそれぞれに対応する4個のライトデータを示している。図52では、データd1、データd2、データd3、データd4の各々が4Kバイトのサイズを有する場合が想定されている。
(1)コントローラ4は、データd1、データd2、データd3、データd4を互いに結合することによって得られる16Kバイトライトデータをホスト2のライトデータバッファ51から取得する。そして、コントローラ4は、この16Kバイトライトデータを、書き込み先ブロックBLK#1のページP0に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。書き込み先ブロックBLK#1を指定する最後のライトコマンド、つまりデータd4の書き込みを要求したライトコマンド、が受信されてから閾期間、書き込み先ブロックBLK#1を指定する後続のライトコマンドが受信されない場合、コントローラ4は、最後のライトコマンドのコマンド完了を示すレスポンスを所定時間内にホスト2に返すことを可能にするために、書き込み先ブロックBLK#1内の1以上のページにダミーデータを書き込み、次のライトデータが書き込まれるべき書き込み先ブロックBLK#1内の書き込み先ページの位置を進める。例えば、コントローラ4は、ページP1~P3に対応する3ページ分のダミーデータをページ単位でNAND型フラッシュメモリ5に転送し、フォギー書き込み動作によって4ページ分のデータ(P0~P3)を書き込み先ブロックBLK#1のワード線WL0に接続された複数のメモリセルに書き込む。
(2)次いで、コントローラ4は、ページP4~P7に対応する4ページ分のダミーデータをページ単位でNAND型フラッシュメモリ5に転送し、フォギー書き込み動作によって4ページ分のデータ(P4~P7)を書き込み先ブロックBLK#1のワード線WL1に接続された複数のメモリセルに書き込む。
(3)次いで、コントローラ4は、ページP8~P11に対応する4ページ分のダミーデータをページ単位でNAND型フラッシュメモリ5に転送し、フォギー書き込み動作によって4ページ分のデータ(P8~P11)を書き込み先ブロックBLK#1のワード線WL2に接続された複数のメモリセルに書き込む。
(4)次いで、コントローラ4は、ページP12~P15に対応する4ページ分のダミーデータをページ単位でNAND型フラッシュメモリ5に転送し、フォギー書き込み動作によって4ページ分のデータ(P12~P15)を書き込み先ブロックBLK#1のワード線WL3に接続された複数のメモリセルに書き込む。
(5)次いで、コントローラ4は、データd1、データd2、データd3、データd4を互いに結合することによって得られる16Kバイトライトデータをライトデータバッファ51または内部バッファ31からNAND型フラッシュメモリ5に転送し、さらに、WL0のフォギー書き込み動作で使用した3ページ分のダミーデータ(P0~P3)と同じ3ページ分のダミーデータ(P0~P3)をページ単位でNAND型フラッシュメモリ5に転送する。そして、コントローラ4は、ファイン書き込み動作によって4ページ分のデータ(P0~P3)を書き込み先ブロックBLK#1のワード線WL0に接続された複数のメモリセルに書き込む。これにより、データd1、データd2、データd3、データd4の複数段階の書き込み動作が全て完了し、データd1、データd2、データd3、データd4がNAND型フラッシュメモリ5読み出し可能となる。コントローラ4は、データd1の書き込みを要求した最初のライトコマンドのコマンド完了を示すレスポンスと、データd2の書き込みを要求した2番目のライトコマンドのコマンド完了を示すレスポンスと、データd3の書き込みを要求した3番目のライトコマンドのコマンド完了を示すレスポンスと、データd4の書き込みを要求した4番目のライトコマンドのコマンド完了を示すレスポンスとをホスト2に返す。
本実施形態では、NAND型フラッシュメモリ5のデータ書き込み単位と同じデータサイズの単位でライトデータがホスト2からフラッシュストレージデバイス3に転送され、あるライトコマンドのライトデータ全体の書き込み動作の全てが終了した時点で、またはこのライトデータ全体の書き込み動作の全てが終了し且つこのライトデータ全体が読み出し可能となった時点で、このライトコマンドのコマンド完了を示すレスポンスがホスト2に返される。このため、例えば、小さなライトデータをある書き込み先ブロックに書き込むことを要求するライトコマンドがホスト2からフラッシュストレージデバイス3に発行された後にしばらくの間、この書き込み先ブロックを指定する後続のライトコマンドがホスト2から発行されない場合には、このライトコマンドのタイムアウトエラーが起こる可能性がある。本実施形態では、コントローラ4は、あるブロック識別子を有する最後のライトコマンドがホスト2から受信されてから閾期間このブロック識別子を有する次のライトコマンドが受信されない場合、ダミーデータを、このブロック識別子に対応する書き込み先ブロック内の次の1以上の未書き込みページに書き込む。したがって、必要に応じて、この書き込み先ブロックの書き込み動作を進行させることができるので、ライトコマンドのタイムアウトエラーが起こることを防止することができる。
図53のフローチャートは、フラッシュストレージデバイス3によって実行されるダミーデータ書き込み処理の手順を示す。ここでは、フォギー・ファイン書き込み動作のような複数段階の書き込み動作によってデータが書き込み先ブロックに書き込まれる場合を想定する。
フラッシュストレージデバイス3のコントローラ4は、ある書き込み先ブロックを指定する最後のライトコマンドに関連付けられたライトデータをフォギー書き込み動作のような第1段階の書き込み動作によってこの書き込み先ブロックに書き込む。この最後のライトコマンドの受信から閾期間(Th)、この書き込み先ブロックを指定する次のライトコマンドが受信されない場合(ステップS31のYES)、コントローラ4は、最後のライトコマンドに関連付けられたライトデータが書き込まれた書き込み先ブロック内のページに後続する1以上のページにダミーデータを書き込み、これによって、次のライトデータが書き込まれるべきこの書き込み先ブロック内の書き込み先ページの位置を進める(ステップS32)。この書き込み先ブロックへのダミーデータの書き込みによって書き込み先ページの位置が進み、これによって最後のライトコマンドに関連付けられたライトデータのファイン書き込み動作(第2段階の書き込み動作)が実行可能となると、コントローラ4は、最後のライトコマンドに関連付けられたライトデータをライトデータバッファ51または内部バッファ(共有キャッシュ)31からNAND型フラッシュメモリ5に再び転送し、このライトデータのファイン書き込み動作を実行する(ステップS33)。
最後のライトコマンドに関連付けられたライトデータのファイン書き込み動作が終了すると、つまりこのライトデータ全体の複数段階の書き込み動作の全てが終了すると、コントローラ4は、この最後のライトコマンドのコマンド完了を示すレスポンスをホスト2に返す(ステップS34)。
このように、複数段階の書き込み動作によってライトデータを書き込み先ブロックに書き込むケースにおいては、コントローラ4は、最後のライトコマンドに関連付けられたライトデータの第2段階の書き込み動作が実行可能になるように、ダミーデータをこの書き込み先ブロック内の1以上のページに書き込み、次のライトデータが書き込まれるべきこの書き込み先ブロック内の書き込み先ページの位置を進める。
図54は、内部バッファ(共有キャッシュ)31を使用してコントローラ4によって実行されるデータ転送動作を示す。
内部バッファ(共有キャッシュ)31は、複数の書き込み先ブロックBLK#1、BLK#2、…、BLK#nによって共有される。フラッシュストレージデバイス3のコントローラ4は、書き込み先ブロックBLK#1、BLK#2、…、BLK#nの各々について以下の処理を実行する。
以下では、書き込み先ブロックBLK#1を例示して説明する。
コントローラ4が、書き込み先ブロックBLK#1を指定する1以上のライトコマンドを受信した後、コントローラ4は、書き込み先ブロックBLK#1を指定する一つのライトコマンドに関連付けられたライトデータを複数のライトデータに分割、または書き込み先ブロックBLK#1を指定する2以上のライトコマンドにそれぞれ関連付けられたライトデータを互いに結合することによって得られる、NAND型フラッシュメモリ5の書き込み単位と同じサイズを有するライトデータを、ライトデータバッファ51から取得する。そして、コントローラ4は、ライトデータバッファ51から取得される、各々がNAND型フラッシュメモリ5の書き込み単位と同じサイズを有する複数のライトデータを内部バッファ(共有キャッシュ)31に格納する。
ライトデータバッファ51は、必ずしも、ホストメモリ上の連続する一つの領域から構成される必要は無く、図54に示されているように、複数のライトデータバッファ51-1、51-2、…、51-nによって実現されてもよい。
コントローラ4は、書き込み先ブロックBLK#1に次に書き込むべきライトデータ(第1のライトデータ)を内部バッファ(共有キャッシュ)31から取得し、第1のライトデータをNAND型フラッシュメモリ5に転送し、フォギー書き込み動作のような第1段階の書き込み動作によってこのライトデータを書き込み先ブロックBLK#1に書き込む。
内部バッファ(共有キャッシュ)31にホスト2からのライトデータを効率よく蓄積できるようにするため、ホスト2から取得されるライトデータを格納するための空き領域が内部バッファ(共有キャッシュ)31に無い場合には、コントローラ4は、フォギー書き込み動作のような第1段階の書き込み動作が終了している内部バッファ(共有キャッシュ)31内のライトデータ(フォギーステートのライトデータ)を破棄して、空き領域を内部バッファ(共有キャッシュ)31に確保する。
例えば、内部バッファ(共有キャッシュ)31に空き領域がない状態でホスト2から任意の書き込み先ブロックを指定する新たなライトコマンドを受信した場合に、コントローラ4は、フォギー書き込み動作のような第1段階の書き込み動作が終了している内部バッファ(共有キャッシュ)31内のライトデータ(フォギーステートのライトデータ)を破棄して、新たなライトコマンドに対応するライトデータを格納可能な空き領域を内部バッファ(共有キャッシュ)31に確保してもよい。
例えば、内部バッファ(共有キャッシュ)31全体が多数のフォギーステートのライトデータで満たされている状態でホスト2から新たなライトコマンドを受信した場合には、コントローラ4は、これらフォギーステートのライトデータの中から破棄すべき特定のライトデータを選択してもよく、この選択したライトデータを破棄してもよい。これにより、制限された容量を有する内部バッファ(共有キャッシュ)31を、複数の書き込み先ブロック間で効率よく共有することができる。
コントローラ4は、第1のライトデータのファイン書き込み動作のような第2段階の書き込み動作を実行すべき時点において第1のライトデータが内部バッファ(共有キャッシュ)31に存在しない場合には、第1のライトデータを取得するための要求(転送要求:DMA転送要求)をホスト2に送信することによってホスト2のライトデータバッファ51から再び取得する。この取得された第1のライトデータは内部バッファ(共有キャッシュ)31に格納されてもよい。そして、コントローラ4は、取得された第1のライトデータをNAND型フラッシュメモリ5に転送し、ファイン書き込み動作のような第2段階の書き込み動作によってこの第1のライトデータを書き込み先ブロックBLK#1に書き込む。
第1のライトデータのファイン書き込み動作のような第2段階の書き込み動作を実行すべき時点において第1のライトデータが内部バッファ(共有キャッシュ)31に存在している場合には、コントローラ4は、この内部バッファ(共有キャッシュ)31から第1のライトデータを取得し、取得された第1のライトデータをNAND型フラッシュメモリ5に転送し、ファイン書き込み動作のような第2段階の書き込み動作によってこの第1のライトデータを書き込み先ブロックBLK#1に書き込む。
NAND型フラッシュメモリ5への第1のライトデータの最終回のデータ転送(ここでは、ファイン書き込み動作のためのデータ転送)を行った後、コントローラ4は、この第1のライトデータを内部バッファ(共有キャッシュ)31から破棄することによって内部バッファ(共有キャッシュ)31に空き領域を確保する。あるいは、コントローラ4はこの第1のライトデータのファイン書き込み動作が終了した場合に、この第1のライトデータを内部バッファ(共有キャッシュ)31から破棄してもよい。
さらに、コントローラ4は、あるライトコマンドに関連付けられたライトデータ全体のファイン書き込み動作が終了した場合、あるいはこのライトデータ全体のファイン書き込み動作が終了し且つこのライトデータ全体がNAND型フラッシュメモリ5から読み出し可能となった場合に、このライトコマンドのコマンド完了を示すレスポンスをホスト2に返す。
内部バッファ(共有キャッシュ)31はある限られた容量を有しているが、書き込み先ブロックの数がある一定数以下であるならば、第2段階の書き込み動作を実行すべき時点において第1のライトデータが内部バッファ(共有キャッシュ)31に存在する確率(ヒット率)は比較的高い。したがって、同じライトデータをホスト2からフラッシュストレージデバイス3に複数回転送すること無く、フォギー・ファイン書き込み動作のような複数段階の書き込み動作を実行することができる。これにより、ホスト2とフラッシュストレージデバイス3との間のデータトラフィックを削減できるので、データ書き込みの度に同じライトデータをホスト2からフラッシュストレージデバイス3に複数回転送する場合に比し、フラッシュストレージデバイス3のI/O性能を向上することができる。
書き込み先ブロックの数は、ホスト2を利用するクライアントの数と同数であってよい。この場合、あるクライアントに対応するデータはこのクライアントに対応する書き込み先ブロックに書き込まれ、他のクライアントに対応するデータは別の書き込み先ブロックに書き込まれる。したがって、ホスト2を利用するクライアントの数が増えるにつれて、内部バッファ(共有キャッシュ)31のヒット率は低下する。しかし、第1のライトデータが内部バッファ(共有キャッシュ)31に存在しない場合(ミス)には、コントローラ4はこの第1のライトデータをホスト2から取得する。したがって、クライアントの数が増加しても、フォギー・ファイン書き込み動作のような複数段階の書き込み動作を正常に実行することができる。
よって、フラッシュストレージデバイス3は、フラッシュストレージデバイス3を共有するクライアントの数の増加(つまり、同時に利用可能な書き込み先ブロックの数の増加)に柔軟に対応でき且つホスト2とフラッシュストレージデバイス3との間のデータトラフィックを削減することができる。
ここでは、書き込み先ブロックBLK#1にデータを書き込むための書き込み処理について説明したが、他の全ての書き込み先ブロックの各々に対しても同様の書き込み処理が実行される。
図55のフローチャートは、内部バッファ(共有キャッシュ)31を使用してコントローラ4によって実行されるデータ書き込み処理の手順を示す。
コントローラ4は、データポインタと、ライトデータの長さと、複数の書き込み先ブロックのいずれか一つを指定する識別子(例えばブロックアドレス)とを各々が含む1つ以上のライトコマンドをホスト2から受信する(ステップS101)。同じ書き込み先ブロックを示す識別子を有する一つ以上のライトコマンドを受信した後、コントローラ4は、これらライトコマンド内の一つのライトコマンドに関連付けられたライトデータを複数のライトデータに分割、または同じ書き込み先ブロックを示す識別子を有する2以上のライトコマンドにそれぞれ関連付けられたライトデータを互いに結合することによって得られる、NAND型フラッシュメモリ5の書き込み単位と同じサイズを有するライトデータを、ライトデータバッファ51から内部バッファ(共有キャッシュ)31に転送する(ステップS102)。
コントローラ4は、この書き込み先ブロックに次に書き込むべきライトデータを内部バッファ(共有キャッシュ)31から取得し、このライトデータをNAND型フラッシュメモリ5に転送し、フォギー書き込み動作によってこの第1のライトデータをこの書き込み先ブロックに書き込む(ステップS103、S104)。NAND型フラッシュメモリ5がQLC-フラッシュとして実現されている場合には、ステップS103では、4ページ分のライトデータがページ単位でNAND型フラッシュメモリ5に転送され、ステップS104では、4ページ分のライトデータがフォギー書き込み動作によってこの書き込み先ブロック内の書き込み対象の一つのワード線に接続された複数のメモリセルに書き込まれる。
なお、ライトデータバッファ51から内部バッファ(共有キャッシュ)31へのライトデータの転送は、各書き込み先ブロックの書き込み動作の進行に合わせて実行される。例えば、ある書き込み先ブロックのあるページに書き込むべきライトデータをNAND型フラッシュメモリチップに転送する動作が終了した場合に、この書き込み先ブロックの次のページに書き込むべきライトデータがライトデータバッファ51から内部バッファ(共有キャッシュ)31へ転送されてもよい。あるいは、ある書き込み先ブロックのあるページに書き込むべきライトデータをこの書き込み先ブロックを含むNAND型フラッシュメモリチップに転送する動作が終了し、且つこのライトデータをこの書き込み先ブロックに書き込む動作が終了した場合に、この書き込み先ブロックの次のページに書き込むべきライトデータがライトデータバッファ51から内部バッファ(共有キャッシュ)31へ転送されてもよい。
フォギー書き込み動作が行われたこのライトデータのファイン書き込み動作を開始すべき時点において、コントローラ4は、このライトデータが、内部バッファ(共有キャッシュ)31に存在するか否かを判定する。
このライトデータが内部バッファ(共有キャッシュ)31に存在するならば(ステップS106のYES)、コントローラ4は、このライトデータを内部バッファ(共有キャッシュ)31から取得し、このライトデータをNAND型フラッシュメモリ5に転送し、ファイン書き込み動作によってこのライトデータをこの書き込み先ブロックに書き込む(ステップS107、S108、S109)。これにより、このライトデータはNAND型フラッシュメモリ5から読み出し可能となる。
コントローラ4は、ライトコマンド毎に、そのライトデータ全体のフォギー・ファイン書き込み動作が終了し且つそのライトデータ全体がNAND型フラッシュメモリ5から読み出し可能となったか否かを判定する。そして、コントローラ4は、フォギー・ファイン書き込み動作が終了し且つNAND型フラッシュメモリ5から読み出し可能となったライトデータに対応するライトコマンドのコマンド完了を示すレスポンスをホスト2に返す(ステップS110)。もしステップS109の処理によってあるライトコマンドに関連付けられたライトデータ全体のファイン書き込み動作が終了したならば、ステップS110では、このライトコマンドのコマンド完了を示すレスポンスがホスト2に返されてもよい。
図56のフローチャートは、コントローラ4によって実行されるデータ読み出し処理の手順を示す。ここでは、フラッシュストレージデバイス3が、ホスト2のライトデータバッファ51内に存在するライトデータ中のデータが対象となるリードコマンドがホスト2から受信された場合、そのリードコマンドが終了するまで、そのデータが格納される領域についての解放可能通知をホスト2へ送信しないようにする仕組みを備えていることを想定する。
上述したように、コントローラ4は、ホスト2から受信されるリードコマンドによって指定されたデータが、その書き込み動作(NAND型フラッシュメモリ5に同じデータを1回または複数回転送する書き込み動作)の全てが終了していないデータ、またはその書き込み動作の全てが終了しているがNAND型フラッシュメモリ5からまだ読み出し可能となっていないデータである場合、このデータが内部バッファ(共有キャッシュ)31に存在するか否かを判定する。このデータが内部バッファ(共有キャッシュ)31に存在しない場合、コントローラ4は、このデータをライトデータバッファ51から取得し、このデータを内部バッファ(共有キャッシュ)31に格納し、このデータを内部バッファ(共有キャッシュ)31からホスト2に返す。
具体的には、以下のデータ読み出し処理が実行される。
コントローラ4がホスト2からリードコマンドを受信した場合(ステップE1:YES)、コントローラ4は、このリードコマンドによって指定されたデータが、その書き込み動作の全てが終了し、且つNAND型フラッシュメモリ5から読み出し可能なデータであるか否かを判定する(ステップE2)。
このデータがNAND型フラッシュメモリ5から読み出し可能であるならば(ステップE2:YES)、コントローラ4は、このデータをNAND型フラッシュメモリ5から読み出し、読み出されたデータをホスト2に返す(ステップE3)。ステップE3では、コントローラ4は、この読み出されたデータを、リードコマンドに含まれるデータポインタによって指定されるリードデータバッファ53内の位置に転送する。
このデータがNAND型フラッシュメモリ5から読み出し可能でないならば(ステップE2:NO)、コントローラ4は、まず、ライトデータバッファ51上のデータが破棄されないように、解放可能通知のホスト2への送信が禁止される状態に設定する(ステップE5)。そして、コントローラ4は、このデータが内部バッファ(共有キャッシュ)31に存在するか否かを判定する(ステップE5)。
このデータが内部バッファ(共有キャッシュ)31に存在するならば(ステップE5:YES)、コントローラ4は、このデータを内部バッファ(共有キャッシュ)31から読み出し、この読み出したデータをホスト2に返す(ステップE6)。
ステップE6では、コントローラ4は、この読み出されたデータを、リードコマンドに含まれるデータポインタによって指定されるリードデータバッファ53内の位置に転送する。
このデータが内部バッファ(共有キャッシュ)31に存在しないならば(ステップE5:NO)、コントローラ4は、このデータをライトデータバッファ51から取得し、内部バッファ(共有キャッシュ)31に格納する(ステップE7)。ステップE7では、DMAC15によってこのデータがライトデータバッファ51から内部バッファ(共有キャッシュ)31の空き領域に転送される。内部バッファ(共有キャッシュ)31の空き領域が無い場合には、内部バッファ(共有キャッシュ)31の空き領域を確保する処理が実行される。そして、コントローラ4は、このデータを内部バッファ(共有キャッシュ)31から読み出し、この読み出したデータをホスト2に返す(ステップE6)。ステップE6では、コントローラ4は、この読み出されたデータを、リードコマンドに含まれるデータポインタによって指定されるリードデータバッファ53内の位置に転送する。そして、コントローラ4は、ステップE4で設定した、解放可能通知のホスト2への送信が禁止される状態を解除する(ステップE8)。
図57は、フラッシュストレージデバイス3に適用されるブロックリユースコマンドを示す。
ブロックリユースコマンドは、たとえば無効データや不要データのみが格納されているなどの理由で不要となった割り当て済みのブロックをフリーブロックに戻すことをフラッシュストレージデバイス3に対して要求するコマンド(ブロック解放要求)である。ブロックリユースコマンドは、QoSドメインを指定するQoSドメインIDと、フリーブロック化(解放)するブロックを指定するブロックアドレスとを含む。
また、図58は、フラッシュストレージデバイス3に適用されるライトコマンドの別の例を示す。具体的には、図8に示したライトコマンドが、フラッシュストレージデバイス3がタイプ#1-ストレージデバイスとして実現されている場合において適用されるものであるのに対して、図58に示すライトコマンドは、フラッシュストレージデバイス3がタイプ#2-ストレージデバイスとして実現されている場合において適用されるものである。図58中に施されているハッチングは、図8との相違点を示している。
ライトコマンドは、フラッシュストレージデバイス3にデータの書き込みを要求するコマンドである。このライトコマンドは、コマンドID、QoSドメインID、論理アドレス、長さ、等を含んでもよい。
コマンドIDはこのコマンドがライトコマンドであることを示すID(コマンドコード)であり、ライトコマンドにはライトコマンド用のコマンドIDが含まれる。
QoSドメインIDは、データが書き込まれるべきQoSドメインを一意に識別可能な識別子である。あるエンドユーザからのライト要求に応じてホスト2から送信されるライトコマンドは、このエンドユーザに対応するQoSドメインを指定するQoSドメインIDを含んでもよい。ネームスペースIDがQoSドメインIDとして扱われてもよい。
論理アドレスは、書き込まれるべきライトデータを識別するための識別子である。この論理アドレスは、上述したように、LBAであってもよいし、キー・バリュー・ストアのキーであってもよい。論理アドレスがLBAである場合には、このライトコマンドに含まれる論理アドレス(開始LBA)は、ライトデータが書き込まれるべき論理位置(最初の論理位置)を示す。
長さは、書き込まれるべきライトデータの長さを示す。この長さ(データ長)は、粒度(Grain)の数によって指定されてもよいし、LBAの数によって指定されてもよいし、あるいはそのサイズがバイトによって指定されてもよい。
上述したように、コントローラ4は、NAND型フラッシュメモリ5内の多数のブロックの各々が一つのグループのみに属するようにNAND型フラッシュメモリ5内の多数のブロックを複数のグループ(複数のQoSドメイン)に分類することができる。そして、コントローラ4は、グループ(QoSドメイン)毎に、フリーブロックリスト(フリーブロックプール)とアクティブブロックリスト(アクティブブロックプール)とを管理することができる。
各ブロックの状態は、有効データを格納しているアクティブブロックと、有効データを格納していないフリーブロックとに大別される。アクティブブロックである各ブロックは、アクティブブロックリストによって管理される。一方、フリーブロックである各ブロックは、フリーブロックリストによって管理される。
ホスト2からライトコマンドを受信した時、コントローラ4は、ホスト2からのデータが書き込まれるべきブロック(書き込み先ブロック)およびこの書き込み先ブロック内の位置(書き込み先位置)を決定する。コントローラ4は、QoSドメインIDに対応するQoSドメインに属するフリーブロック群の一つを書き込み先ブロックとして決定してもよい。書き込み先位置は、ページ書き込み順序の制約およびバッドページ等を考慮して決定される。そして、コントローラ4は、ホスト2からのデータを、書き込み先ブロック内の書き込み先位置に書き込む。
なお、この書き込み先ブロック全体がユーザデータで満たされたならば、コントローラ4は、この書き込み先ブロックをアクティブブロックリスト(アクティブブロックプール)に移動する。そして、コントローラ4は、このQoSドメインに対応するフリーブロックリストからフリーブロックを再び選択し、この選択したフリーブロックを新たな書き込み先ブロックとして割り当てる。
もしフリーブロックリストによって管理されている残りフリーブロックの数が所定のポリシーによって定められる閾値以下に低下した場合あるいはホスト2からガベージコレクションを実施する指示があった場合、コントローラ4は、このQoSドメインのガベージコレクションを開始してもよい。
このQoSドメインのガベージコレクションでは、コントローラ4は、このQoSドメインに対応するアクティブブロック群からコピー元ブロック(GCソースブロック)とコピー先ブロック(GCデスティネーションブロック)を選択する。どのブロックをGC候補(コピー元ブロック)として選択するかは、ホスト2によって指定される上述のポリシーに従って決定されてもよいし、ホスト2から指定されても良い。ポリシーも基づく場合には例えば、有効データ量が最も少ないブロックがGC候補(コピー元ブロック)として選択されてもよい。
図59は、図58のライトコマンドに対するレスポンスを示す。なお、図59中に施されているハッチングも、図9との相違点を示している。
このレスポンスは、論理アドレス、物理アドレス、長さを含む。
論理アドレスは、図7のライトコマンドに含まれていた論理アドレスである。
物理アドレスは、図7のライトコマンドに応じてデータが書き込まれたNAND型フラッシュメモリ5内の物理記憶位置を示す。本実施形態では、この物理アドレスは、ブロック番号とページ番号との組み合わせではなく、上述したように、ブロック番号とオフセット(ブロック内オフセット)との組み合わせによって指定される。ブロック番号は、フラッシュストレージデバイス3内の全てのブロックの任意の一つを一意に識別可能な識別子である。全てのブロックに異なるブロック番号が付与されている場合には、これらブロック番号を直接使用してもよい。あるいは、ブロック番号は、ダイ番号と、ダイ内ブロック番号との組み合わせによって表現されてもよい。長さは、書き込まれるべきライトデータの長さを示す。この長さ(データ長)は、粒度(Grain)の数によって指定されてもよいし、LBAの数によって指定されてもよいし、あるいはそのサイズがバイトによって指定されてもよい。
図60は、ホスト2とフラッシュストレージデバイス3とによって実行される書き込み動作処理のシーケンスの別の例を示す。具体的には、図25に示したシーケンスが、フラッシュストレージデバイス3がタイプ#1-ストレージデバイスとして実現されている場合におけるものであるのに対して、図60に示すシーケンスは、フラッシュストレージデバイス3がタイプ#2-ストレージデバイスとして実現されている場合におけるものである。
ホスト2は、QoSドメインID、LBA、長さを含むライトコマンドをフラッシュストレージデバイス3に送信する。フラッシュストレージデバイス3のコントローラ4がこのライトコマンドを受信した時、コントローラ4は、ホスト2からのライトデータを書き込むべき書き込み先ブロックおよびこの書き込み先ブロック内の位置を決定する。より詳しくは、コントローラ4は、フリーブロックリストから一つのフリーブロックを選択し、選択したフリーブロックを書き込み先ブロックとして割り当てる(ステップS11)。つまり、この選択されたフリーブロックおよびこの選択されたフリーブロック内の利用可能な最初のページが、ホスト2からのライトデータを書き込むべき書き込み先ブロックおよびこの書き込み先ブロック内の位置として決定される。もし書き込み先ブロックがすでに割り当てられている場合には、このステップ12における書き込み先ブロック割り当て処理を実行する必要は無い。すでに割り当てられている書き込み先ブロック内の利用可能な次のページが、ホスト2からのライトデータを書き込むべき書き込み先ブロック内の位置として決定される。
コントローラ4は、複数のQoSドメインに対応する複数のフリーブロックリストを管理してもよい。あるQoSドメインに対応するフリーブロックリストにおいては、このQoSドメインに対して予約されたブロック群のみが登録されてもよい。この場合、ステップS12では、コントローラ4は、ライトコマンドのQoSドメインIDによって指定されるQoSドメインに対応するフリーブロックリストを選択し、この選択したフリーブロックリストから一つのフリーブロックを選択し、この選択したフリーブロックを書き込み先ブロックとして割り当ててもよい。これにより、異なるQoSドメインに対応するデータが同じブロックに混在されてしまうことを防止することができる。
コントローラ4は、ホスト2から受信されるライトデータを書き込み先ブロックに書き込む(ステップS12)。ステップS12では、コントローラ4は、論理アドレス(ここではLBA)とライトデータの双方を書き込み先ブロックに書き込む。
コントローラ4は、ブロック管理テーブル32を更新して、書き込まれたデータに対応するビットマップフラグ(つまり、このデータが書き込まれた物理記憶位置の物理アドレスに対応するビットマップフラグ)を0から1に変更する(ステップS13)。例えば、図26に示されているように、開始LBAがLBAxである16Kバイト更新データがブロックBLK#1のオフセット+4~+7に対応する物理記憶位置に書き込まれた場合を想定する。この場合、図27に示されているように、ブロックBLK#1用のブロック管理テーブルにおいては、オフセット+4~+7に対応するビットマップフラグそれぞれが0から1に変更される。
コントローラ4は、このライトコマンドに対するレスポンスをホスト2に返す(ステップS14)。例えば、図26に示されているように、開始LBAがLBAxである16Kバイト更新データがブロックBLK#1のオフセット+4~+7に対応する物理記憶位置に書き込まれたならば、LBAx、ブロック番号(=BLK1)、オフセット(=+4)、長さ(=4)を含むレスポンスがコントローラ4からホスト2に送信される。
ホスト2がこのレスポンスを受信した時、ホスト2は、ホスト2によって管理されているLUTを更新して、書き込まれたライトデータに対応する論理アドレスそれぞれに物理アドレスをマッピングする。図28に示されているように、LUTは、複数の論理アドレス(例えばLBA)それぞれに対応する複数のエントリを含む。ある論理アドレス(例えばあるLBA)に対応するエントリには、このLBAに対応するデータが格納されているNAND型フラッシュメモリ5内の位置(物理記憶位置)を示す物理アドレスPBA、つまりブロック番号、オフセット(ブロック内オフセット)が格納される。図26に示されているように、開始LBAがLBAxである16Kバイト更新データがブロックBLK#1のオフセット+4~+7に対応する物理記憶位置に書き込まれたならば、図28に示されているように、LUTが更新されて、LBAxに対応するエントリにBLK#1、オフセット+4が格納され、LBAx+1に対応するエントリにBLK#1、オフセット+5が格納され、LBAx+2に対応するエントリにBLK#1、オフセット+6が格納され、LBAx+3に対応するエントリにBLK#1、オフセット+7が格納される。
この後、ホスト2は、上述の更新データの書き込みによって不要になった以前のデータを無効化するためのTrimコマンドをフラッシュストレージデバイス3に送信する(ステップS21)。図26に示されているように、以前のデータがブロックBLK#0のオフセット+0、オフセット+1、オフセット+2、オフセット+3に対応する位置に格納されている場合には、図29に示すように、ブロック番号(=BLK#0)、オフセット(=+0)、長さ(=4)を指定するTrimコマンドがホスト2からフラッシュストレージデバイス3に送信される。フラッシュストレージデバイス3のコントローラ4は、このTrimコマンドに応じて、ブロック管理テーブル32を更新する(ステップS15)。ステップS15においては、図29に示すように、ブロックBLK#0用のブロック管理テーブルにおいて、オフセット+0~+3に対応するビットマップフラグそれぞれが1から0に変更される。
図61は、フラッシュストレージデバイス3に適用されるGC制御コマンドの別の例を示す。具体的には、図34に示したGC制御コマンドが、フラッシュストレージデバイス3がタイプ#1-ストレージデバイスとして実現されている場合において適用されるものであるのに対して、図61に示すGC制御コマンドは、フラッシュストレージデバイス3がタイプ#2-ストレージデバイスとして実現されている場合において適用されるものである。図61中に施されているハッチングは、図34との相違点を示している。
GC制御コマンドは、コマンドID、ポリシー、ソースQoSドメインID、デスティネーションQoSドメインID、等を含んでもよい。
コマンドIDはこのコマンドがGC制御コマンドであることを示すID(コマンドコード)であり、GC制御コマンドにはGC制御コマンド用のコマンドIDが含まれる。
ポリシーは、GC候補ブロック(GCソースブロック)を選択するための条件(GCポリシー)を指定するパラメータである。フラッシュストレージデバイス3のコントローラ4は、複数のGCポリシーをサポートしている。
コントローラ4によってサポートされているGCポリシーには、有効データ量が少ないブロックを優先的にGC候補ブロック(GCソースブロック)として選択するというポリシー(Greedy)が含まれてもよい。
また、コントローラ4によってサポートされているGCポリシーには、低い更新頻度を有するデータ(コールドデータ)が集められているブロックを、高い更新頻度を有するデータ(ホットデータ)が集められているブロックよりも優先的にGC候補ブロック(GCソースブロック)として選択するというポリシーが含まれていてもよい。
さらに、GCポリシーは、GC開始条件を指定してもよい。GC開始条件は、例えば、残りフリーブロックの個数を示してもよい。
コントローラ4は、有効データを含むブロック群をアクティブブロックリストによって管理しており、GCを実行する場合には、GC制御コマンドによって指定されたGCポリシーに基づいて、アクティブブロックリストによって管理されているブロック群から一つ以上のGC候補ブロック(GCソースブロック)を選択する。
QoSドメインIDは、GCを実行すべきQoSドメインを指定するパラメータである。コントローラ4は、QoSドメインIDによって指定されるQoSドメインに属するブロック群、つまりこのQoSドメインに対応するアクティブブロックリストから、一つ以上のGC候補ブロック(GCソースブロック)を選択する。また、コントローラ4は、QoSドメインIDによって指定されるQoSドメインに属するフリーブロック群内の一つ以上のフリーブロックをGCデスティネーションブロックとして選択する。
コントローラ4は、QoSドメインに対応する残りフリーブロックの数がポリシーによって指定される閾値以下になった場合に、GCを開始してもよい。もしGCの強制実行を指定するポリシーを含むGC制御コマンドを受信したならば、コントローラ4は、ホスト2からこのGC制御コマンドを受信した時にGCを即座に開始してもよい。
図62は、ガベージコレクション(GC)動作の手順の別の例を示す。具体的には、図36に示した手順が、フラッシュストレージデバイス3がタイプ#1-ストレージデバイスとして実現されている場合におけるものであるのに対して、図62に示す手順は、フラッシュストレージデバイス3がタイプ#2-ストレージデバイスとして実現されている場合におけるものである。図62中に施されているハッチングは、図36との相違点を示している。
フラッシュストレージデバイス3のコントローラ4は、ホスト2によって指定されたポリシーに基づいて、QoSドメインIDによって指定されるQoSドメインに属するブロック群から、有効データと無効データとが混在する一つ以上のGCソースブロック(コピー元ブロック)を選択する(ステップS41)。次いで、コントローラ4は、QoSドメインIDによって指定されるQoSドメインに属するフリーブロック群から一つ以上のフリーブロックを選択し、選択したフリーブロックをGCデスティネーションブロック(コピー先ブロック)として割り当てる(ステップS42)。
コントローラ4は、GCソースブロック(コピー元ブロック)内の全ての有効データをGCデスティネーションブロック(コピー先ブロック)にコピーする(ステップS44)。ステップS44では、コントローラ4は、GCソースブロック(コピー元ブロック)内の有効データのみならず、この有効データとこの有効データに対応する論理アドレスの双方を、GCソースブロック(コピー元ブロック)からGCデスティネーションブロック(コピー先ブロック)にコピーする。これにより、GCデスティネーションブロック(コピー先ブロック)内にデータと論理アドレスとのペアを保持することができる。
そして、コントローラ4は、コピーされた有効データの論理アドレスと、この有効データがコピーされたGCデスティネーションブロック(コピー先ブロック)内の位置を示すデスティネーション物理アドレス(ブロック番号、オフセット(ブロック内オフセット))を、GC用コールバックコマンドを使用してホスト2に通知する(ステップS44)。なお、ステップS44では、コントローラ4は、コピーされた有効データの論理アドレスとデスティネーション物理アドレスとみならず、ソース物理アドレスもホスト2に通知してもよい。
ホスト2がこのGC用コールバックコマンドを受信した時、ホスト2は、ホスト2によって管理されているLUTを更新して、コピーされた有効データに対応する論理アドレスそれぞれにデスティネーション物理アドレスをマッピングする(ステップS51)。
図63および図64のフローチャートは、フラッシュストレージデバイス3が、ホスト2からのデータを書き込むためのブロックと、フラッシュストレージデバイス3内のデータをコピーするためのブロックとに分離する仕組みを備えている場合における、フリーブロックの割り当ての手順を示す。
図63に示す手順は、図60に示す書き込み動作処理のシーケンス中のステップS11(書き込み先ブロックの割り当て)におけるフリーブロックの割り当ての手順である。
フラッシュストレージデバイス3のコントローラ4は、ホスト2からのライトデータを書き込むためのブロック(書き込み先ブロック)が割り当てられているか否かを判定する(ステップF1)。仮に、空きページを含むブロックが割り当てられていても、そのブロックが、フラッシュストレージデバイス3内のデータをコピーするためのブロックであったならば、コントローラ4は、ホスト2からのライトデータを書き込むためのブロックは割り当てられていないと判定する。この判定は、たとえば、ブロックのメタデータなどとして保持される、そのブロックの用途を示す属性情報に基づいて実行される。
ホスト2からのライトデータを書き込むためのブロックは割り当てられていないと判定した場合(ステップF1:NO)、コントローラ4は、たとえば同一の仮想ストレージデバイス内のQoSドメイン間で共有されるフリーブロック群の中の1つのフリーブロックを、ホスト2からのライトデータを書き込むためのブロックとして割り当てる(ステップF2)。このとき、コントローラ4は、このブロックのメタデータなどとして、ホスト2からのライトデータを書き込むためのブロックであることを示す属性情報を記録する。
一方、図64に示す手順は、図62に示すガベージコレクション(GC)動作の手順中のステップS42(GCデスティネーションブロックの割り当て)におけるフリーブロックの割り当ての手順である。
フラッシュストレージデバイス3のコントローラ4は、GCソースブロック(コピー元ブロック)内の有効データをコピーするためのブロック(GCデスティネーションブロック)、つまり、フラッシュストレージデバイス3内のデータをコピーするためのブロックが割り当てられているか否かを判定する(ステップF11)。仮に、空きページを含むブロックが割り当てられていても、そのブロックが、ホスト2からのライトデータを書き込むためのブロックであったならば、コントローラ4は、フラッシュストレージデバイス3内のデータをコピーするためのブロックは割り当てられていないと判定する。
フラッシュストレージデバイス3内のデータをコピーするためのブロックは割り当てられていないと判定した場合(ステップF11:NO)、コントローラ4は、たとえば同一の仮想ストレージデバイス内のQoSドメイン間で共有されるフリーブロック群の中の1つのフリーブロックを、フラッシュストレージデバイス3内のデータをコピーするためのブロックとして割り当てる(ステップF12)。このとき、コントローラ4は、このブロックのメタデータなどとして、フラッシュストレージデバイス3内のデータをコピーするためのブロックであることを示す属性情報を記録する。
以上のように、本実施形態のフラッシュストレージデバイス3によれば、I/O性能の改善を図ることができる。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。