(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2022-10-14
(45)【発行日】2022-10-24
(54)【発明の名称】メモリシステムおよび制御方法
(51)【国際特許分類】
G06F 12/02 20060101AFI20221017BHJP
G06F 12/00 20060101ALI20221017BHJP
G06F 3/08 20060101ALI20221017BHJP
G06F 3/06 20060101ALI20221017BHJP
【FI】
G06F12/02 530E
G06F12/00 560D
G06F12/00 597U
G06F3/08 H
G06F3/06 301J
(21)【出願番号】P 2019013223
(22)【出願日】2019-01-29
【審査請求日】2021-09-14
(73)【特許権者】
【識別番号】318010018
【氏名又は名称】キオクシア株式会社
(74)【代理人】
【識別番号】110001737
【氏名又は名称】弁理士法人スズエ国際特許事務所
(72)【発明者】
【氏名】菅野 伸一
【審査官】北村 学
(56)【参考文献】
【文献】特開2017-162067(JP,A)
【文献】特開2017-228172(JP,A)
【文献】国際公開第2015/075837(WO,A1)
【文献】特開2012-221251(JP,A)
【文献】特開2011-128998(JP,A)
【文献】特開2016-212580(JP,A)
【文献】国際公開第2015/177849(WO,A1)
(58)【調査した分野】(Int.Cl.,DB名)
IPC G06F 3/06 - 3/08
G06F 12/00 - 12/06
(57)【特許請求の範囲】
【請求項1】
ホストに接続可能なメモリシステムであって、
複数のブロックを含む不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、前記複数のブロックのうちの読み出し対象のブロックのブロックアドレスと前記読み出し対象のブロック内の読み出し対象の記憶位置を示すオフセットとを指定するリードコマンドそれぞれを前記ホストから受信し、受信された各リードコマンドに応じてデータ読み出し動作を実行するように構成されたコントローラとを具備し、
前記コントローラは、
前記ホストから既に受信され且つ未完了のリードコマンドの数を示すカウンタ値を、既にデータが書き込まれているブロック毎に管理し、
前記ホストからリードコマンドを受信する度に、前記受信されたリードコマンド内のブロックアドレスによって指定されるブロックに対応するカウンタ値を1増やし、
前記受信されたリードコマンドの実行が完了する度に、前記完了したリードコマンド内のブロックアドレスによって指定されるブロックに対応するカウンタ値を1減らし、
既にデータが書き込まれている第1のブロックを新たな書き込み先ブロックとして再使用可能な状態に遷移させるための第1のコマンドを前記ホストから受信した場合、
前記第1のブロックに対応するカウンタ値がゼロであるか否かに応じて、前記ホストから既に受信され且つ前記第1のブロックのブロックアドレスを指定する未完了のリードコマンドが存在するか否かを判定し、
前記第1のブロックのブロックアドレスを指定する前記未完了のリードコマンドが存在する場合、前記第1のブロックのブロックアドレスを指定する前記未完了のリードコマンドの実行が完了した後に、前記第1のコマンドを実行して前記第1のブロックを前記再使用可能な状態に遷移させるように構成されている、メモリシステム。
【請求項2】
前記コントローラは、前記第1のブロックが前記新たな書き込み先ブロックとして再使用可能な状態に遷移された後に、前記第1のブロックのブロックアドレスを指定する新たなリードコマンドが前記ホストから受信された場合、前記受信された新たなリードコマンドを実行せずに、前記受信された新たなリードコマンドの失敗を示す応答を前記ホストに返すように構成されている請求項1記載のメモリシステム。
【請求項3】
前記コントローラは、
各々が前記複数のブロックの部分集合である複数の領域
に1対1の関係でそれぞれ対応付けられた複数の識別子のうちの第1の識別子を指定するライトコマンドを前記ホストから受信した場合、前記複数の領域によって共有される共通フリーブロック群のうちの一つのブロックを前記第1の識別子に対応する領域用の書き込み先ブロックとして割り当て、前記ライトコマンドに関連付けられたデータを前記書き込み先ブロックに書き込むように構成され、
前記共通フリーブロック群は、前記複数のブロックのうちのフリーブロックの集合であり、
前記第1のコマンドは、前記複数の領域の一つに書き込み先ブロックとして割り当て済みのブロックのうちの一つのブロックを、前記共通フリーブロック群に返却して任意の領域用の新たな書き込み先ブロックとして再使用可能にするためのコマンド、または前記複数のブロックのうちの一つのブロックに対する消去動作を実行するためのコマンドである請求項1記載のメモリシステム。
【請求項4】
前記コントローラは、
前記第1のブロックを前記再使用可能な状態に遷移させるための前記第1のコマンドを前記ホストから受信した場合、前記ホストから既に受信され且つ前記第1のブロックのブロックアドレスをコピー元ブロックのブロックアドレスとして指定する未完了のコピーコマンドが存在するか否かをさらに判定し、
前記第1のブロックのブロックアドレスを指定する前記未完了のリードコマンドと、前記第1のブロックのブロックアドレスをコピー元ブロックのブロックアドレスとして指定する前記未完了のコピーコマンドの双方の実行が完了した後に、前記第1のコマンドを実行して前記第1のブロックを前記再使用可能な状態に遷移させるように構成されている請求項1記載のメモリシステム。
【請求項5】
ホストに接続可能なメモリシステムであって、
複数のブロックを含む不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、前記複数のブロックのうちの読み出し対象のブロックのブロックアドレスと前記読み出し対象のブロック内の読み出し対象の記憶位置を示すオフセットとを指定するリードコマンドそれぞれを前記ホストから受信し、受信された各リードコマンドに応じてデータ読み出し動作を実行するように構成されたコントローラとを具備し、
前記コントローラは、
既にデータが書き込まれている第1のブロックを新たな書き込み先ブロックとして再使用可能な状態に遷移させるための第1のコマンドを前記ホストから受信した場合、前記ホストから既に受信され且つ前記第1のブロックのブロックアドレスを指定する未完了のリードコマンドが存在するか否かを判定し、
前記第1のブロックのブロックアドレスを指定する前記未完了のリードコマンドが存在しない場合、前記第1のコマンドを実行して前記第1のブロックを前記再使用可能な状態に遷移させ、
前記第1のブロックのブロックアドレスを指定する前記未完了のリードコマンドが存在する場合、前記第1のコマンドを実行せずに、前記第1のコマンドの失敗を示す応答を前記ホストに返すように構成されているメモリシステム。
【請求項6】
前記コントローラは、前記第1のブロックが前記新たな書き込み先ブロックとして再使用可能な状態に遷移された後に、前記第1のブロックのブロックアドレスを指定する新たなリードコマンドが前記ホストから受信された場合、前記受信された新たなリードコマンドを実行せずに、前記受信された新たなリードコマンドの失敗を示す応答を前記ホストに返すように構成されている請求項
5記載のメモリシステム。
【請求項7】
前記コントローラは、各々が前記複数のブロックの部分集合である複数の領域
に1対1の関係でそれぞれ対応付けられた複数の識別子のうちの第1の識別子を指定するライトコマンドを前記ホストから受信した場合、前記複数の領域によって共有される共通フリーブロック群のうちの一つのブロックを前記第1の識別子に対応する領域用の書き込み先ブロックとして割り当て、前記ライトコマンドに関連付けられたデータを前記書き込み先ブロックに書き込むように構成され、
前記共通フリーブロック群は、前記複数のブロックのうちのフリーブロックの集合であり、
前記第1のコマンドは、前記複数の領域の一つに書き込み先ブロックとして割り当て済みのブロックのうちの一つのブロックを、前記共通フリーブロック群に返却して任意の領域用の新たな書き込み先ブロックとして再使用可能にするためのコマンド、または前記複数のブロックのうちの一つのブロックに対する消去動作を実行するためのコマンドである請求項
5記載のメモリシステム。
【請求項8】
前記コントローラは、
前記ホストから既に受信され且つ未完了のリードコマンドの数を示すカウンタ値を、既にデータが書き込まれているブロック毎に管理し、
前記ホストからリードコマンドを受信する度に、前記受信されたリードコマンド内のブロックアドレスによって指定されるブロックに対応するカウンタ値を1増やし、
前記受信されたリードコマンドの実行が完了する度に、前記完了したリードコマンド内のブロックアドレスによって指定されるブロックに対応するカウンタ値を1減らし、
前記第1のブロックを前記再使用可能な状態に遷移させるための前記第1のコマンドを前記ホストから受信した場合、前記第1のブロックに対応するカウンタ値がゼロであるか否かに応じて、前記ホストから既に受信され且つ前記第1のブロックのブロックアドレスを指定する前記未完了のリードコマンドが存在するか否かを判定するように構成されている請求項
5記載のメモリシステム。
【請求項9】
前記コントローラは、前記第1のブロックを前記再使用可能な状態に遷移させるための前記第1のコマンドを前記ホストから受信した場合、未完了のコマンドそれぞれが格納されている前記コントローラ内のコマンドキューを参照して、前記ホストから既に受信され且つ前記第1のブロックのブロックアドレスを指定する前記未完了のリードコマンドが存在するか否かを判定するように構成されている請求項
5記載のメモリシステム。
【請求項10】
前記コントローラは、
前記第1のブロックを前記再使用可能な状態に遷移させるための前記第1のコマンドを前記ホストから受信した場合、前記ホストから既に受信され且つ前記第1のブロックのブロックアドレスをコピー元ブロックのブロックアドレスとして指定する未完了のコピーコマンドが存在するか否かをさらに判定し、
前記第1のブロックのブロックアドレスを指定する前記未完了のリードコマンド、または前記第1のブロックのブロックアドレスをコピー元ブロックのブロックアドレスとして指定する前記未完了のコピーコマンドが存在する場合、前記第1のコマンドを実行せずに、前記第1のコマンドの失敗を示す応答を前記ホストに返すように構成されている請求項
5記載のメモリシステム。
【請求項11】
複数のブロックを含む不揮発性メモリを制御する制御方法であって、
前記複数のブロックのうちの読み出し対象のブロックのブロックアドレスと前記読み出し対象のブロック内の読み出し対象の記憶位置を示すオフセットとを指定するリードコマンドそれぞれをホストから受信することと、
受信された各リードコマンドに応じてデータ読み出し動作を実行することと、
前記ホストから既に受信され且つ未完了のリードコマンドの数を示すカウンタ値を、既にデータが書き込まれているブロック毎に管理することと、
前記ホストからリードコマンドを受信する度に、前記受信されたリードコマンド内のブロックアドレスによって指定されるブロックに対応するカウンタ値を1増やすことと、
前記受信されたリードコマンドの実行が完了する度に、前記完了したリードコマンド内のブロックアドレスによって指定されるブロックに対応するカウンタ値を1減らすことと、
既にデータが書き込まれている第1のブロックを新たな書き込み先ブロックとして再使用可能な状態に遷移させるための第1のコマンドを前記ホストから受信した場合、
前記第1のブロックに対応するカウンタ値がゼロであるか否かに応じて、前記ホストから既に受信され且つ前記第1のブロックのブロックアドレスを指定する未完了のリードコマンドが存在するか否かを判定することと、
前記第1のブロックのブロックアドレスを指定する前記未完了のリードコマンドが存在する場合、前記第1のブロックのブロックアドレスを指定する前記未完了のリードコマンドの実行が完了した後に、前記第1のコマンドを実行して前記第1のブロックを前記再使用可能な状態に遷移させることとを具備する制御方法。
【請求項12】
前記第1のブロックが前記新たな書き込み先ブロックとして再使用可能な状態に遷移された後に、前記第1のブロックのブロックアドレスを指定する新たなリードコマンドが前記ホストから受信された場合、前記受信された新たなリードコマンドを実行せずに、前記受信された新たなリードコマンドの失敗を示す応答を前記ホストに返すことをさらに具備する請求項
11記載の制御方法。
【請求項13】
各々が前記複数のブロックの部分集合である複数の領域
に1対1の関係でそれぞれ対応付けられた複数の識別子のうちの第1の識別子を指定するライトコマンドを前記ホストから受信した場合、前記複数の領域によって共有される共通フリーブロック群のうちの一つのブロックを前記第1の識別子に対応する領域用の書き込み先ブロックとして割り当て、前記ライトコマンドに関連付けられたデータを前記書き込み先ブロックに書き込むことをさらに具備し、
前記共通フリーブロック群は、前記複数のブロックのうちのフリーブロックの集合であり、
前記第1のコマンドは、前記複数の領域の一つに書き込み先ブロックとして割り当て済みのブロックのうちの一つのブロックを、前記共通フリーブロック群に返却して任意の領域用の新たな書き込み先ブロックとして再使用可能にするためのコマンド、または前記複数のブロックのうちの一つのブロックに対する消去動作を実行するためのコマンドである請求項
11記載の制御方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、不揮発性メモリを制御する技術に関する。
【背景技術】
【0002】
近年、不揮発性メモリを備えるメモリシステムが広く普及している。このようなメモリシステムの一つとして、NANDフラッシュ技術ベースのソリッドステートドライブ(SSD)が知られている。
データセンターのサーバにおいても、ストレージデバイスとしてSSDが使用されている。
【0003】
サーバのようなホスト計算機システムにおいて利用されるストレージデバイスにおいては、高いI/O性能が求められている。
このため、最近では、ホストがストレージデバイス内の不揮発性メモリを直接的に制御することを可能にする新たな技術が提案され始めている。
【先行技術文献】
【非特許文献】
【0004】
【文献】Yiying Zhang, 外, "De-indirection for flash-based SSDs with nameless writes." FAST. 2012, [online], [平成29年9月13日検索], インターネット<URL: https://www.usenix.org/system/files/conference/fast12/zhang.pdf >
【発明の概要】
【発明が解決しようとする課題】
【0005】
しかし、ストレージデバイス内の不揮発性メモリをホストから直接的に制御するという構成を採用すると、ストレージデバイスをアクセスするためのホスト側の負担が増加され、これによって十分なI/O性能が得られなくなる場合がある。このため、ホスト側の負担を軽減できるようにするための新たな技術の実現が要求される。
【0006】
本発明が解決しようとする課題は、ホスト側の負担を軽減することができるメモリシステムおよび制御方法を提供することである。
【課題を解決するための手段】
【0007】
実施形態によれば、ホストに接続可能なメモリシステムは、複数のブロックを含む不揮発性メモリと、前記不揮発性メモリに電気的に接続され、前記複数のブロックのうちの読み出し対象のブロックのブロックアドレスと前記読み出し対象のブロック内の読み出し対象の記憶位置を示すオフセットとを指定するリードコマンドそれぞれを前記ホストから受信し、受信された各リードコマンドに応じてデータ読み出し動作を実行するように構成されたコントローラとを具備する。前記コントローラは、前記ホストから既に受信され且つ未完了のリードコマンドの数を示すカウンタ値を、既にデータが書き込まれているブロック毎に管理する。前記コントローラは、前記ホストからリードコマンドを受信する度に、前記受信されたリードコマンド内のブロックアドレスによって指定されるブロックに対応するカウンタ値を1増やす。前記コントローラは、前記受信されたリードコマンドの実行が完了する度に、前記完了したリードコマンド内のブロックアドレスによって指定されるブロックに対応するカウンタ値を1減らす。前記コントローラは、既にデータが書き込まれている第1のブロックを新たな書き込み先ブロックとして再使用可能な状態に遷移させるための第1のコマンドを前記ホストから受信した場合、前記第1のブロックに対応するカウンタ値がゼロであるか否かに応じて、前記ホストから既に受信され且つ前記第1のブロックのブロックアドレスを指定する未完了のリードコマンドが存在するか否かを判定する。前記コントローラは、前記第1のブロックのブロックアドレスを指定する前記未完了のリードコマンドが存在する場合、前記第1のブロックのブロックアドレスを指定する前記未完了のリードコマンドの実行が完了した後に、前記第1のコマンドを実行して前記第1のブロックを前記再使用可能な状態に遷移させる。
【図面の簡単な説明】
【0008】
【
図1】ホストと実施形態に係るメモリシステムとの関係を示すブロック図。
【
図2】同実施形態のメモリシステムとホストとの間の役割分担を説明するための図。
【
図3】同実施形態のメモリシステムの構成例を示すブロック図。
【
図4】同実施形態のメモリシステムに設けられた、NANDインタフェースと複数のNAND型フラッシュメモリチップとの関係を示すブロック図。
【
図5】複数の物理ブロックの集合によって構築される一つのブロック(スーパーブロック)の構成例を示す図。
【
図6】同実施形態のメモリシステムに適用されるライトコマンドを説明するための図。
【
図7】同実施形態のメモリシステムからホストに送られるアドレス記録要求を説明するための図。
【
図8】同実施形態のメモリシステムに適用されるリードコマンドを説明するための図。
【
図9】同実施形態のメモリシステムに適用されるリユースコマンドを説明するための図。
【
図10】同実施形態のメモリシステムに適用されるQoSドメインクリエートコマンドを説明するための図。
【
図11】アドレス記録要求およびリードコマンドの各々に含まれる物理アドレスを規定するブロックアドレスおよびオフセットを説明するための図。
【
図12】スーパーブロックが使用される場合におけるブロックアドレスとオフセットとの関係を説明するための図。
【
図13】同実施形態のメモリシステムによって管理される複数のQoSドメインを説明するための図。
【
図14】ホストと同実施形態のメモリシステムとによって実行されるデータ書き込み処理を説明するためのブロック図。
【
図15】ホストと同実施形態のメモリシステムとによって実行されるデータ読み出し処理を説明するためのブロック図。
【
図16】同実施形態のメモリシステムによって管理される、複数のQoSドメインと共通フラッシュブロックプールとの関係を示すブロック図。
【
図17】ホストから受信されるリユースコマンド(またはイレーズコマンド)によって指定されたブロックを、新たな書き込み先ブロックとして再使用可能な状態に遷移させる動作を説明するための図。
【
図18】同実施形態のメモリシステムによってブロック毎に管理される、コマンド数カウンタを含むブロック管理テーブルを説明するための図。
【
図19】同実施形態のメモリシステムによって実行されるコマンド数カウンタ更新処理の手順を示すフローチャート。
【
図20】同実施形態のメモリシステムによって実行されるコマンド数カウンタ更新処理の別の手順を示すフローチャート。
【
図21】リユースコマンドによって指定されたブロックと同じブロックのブロックアドレスを指定する未完了のリードコマンドが存在するか否かを判定するために同実施形態のメモリシステムによって実行されるコマンドキューチェック動作を説明するための図。
【
図22】リユースコマンドによって指定されたブロックと同じブロックのブロックアドレスを指定する未完了のリードコマンドが存在するか否かを判定するために同実施形態のメモリシステムによって実行される別のコマンドキューチェック動作を説明するための図。
【
図23】ホストからリユースコマンドを受信した場合に同実施形態のメモリシステムによって実行される処理の手順を示すフローチャート。
【
図24】ホストからリユースコマンドを受信した場合に同実施形態のメモリシステムによって実行される処理の別の手順を示すフローチャート。
【
図25】ホストからリユースコマンドを受信した場合に同実施形態のメモリシステムによって実行される処理のさらに別の手順を示すフローチャート。
【
図26】ホストからリユースコマンドを受信した場合に同実施形態のメモリシステムによって実行される処理のさらに別の手順を示すフローチャート。
【発明を実施するための形態】
【0009】
以下、図面を参照して、実施形態を説明する。
まず、
図1を参照して、本実施形態に係るメモリシステムとホストとの関係を説明する。
このメモリシステムは、不揮発性メモリにデータを書き込み、不揮発性メモリからデータを読み出すように構成された半導体ストレージデバイスである。このメモリシステムは、NANDフラッシュ技術ベースのフラッシュストレージデバイス3として実現されている。
【0010】
ホスト(ホストデバイス)2は、複数のフラッシュストレージデバイス3を制御するように構成されている。ホスト2は、複数のフラッシュストレージデバイス3によって構成されるフラッシュアレイをストレージとして使用するように構成された情報処理装置によって実現される。この情報処理装置はパーソナルコンピュータであってもよいし、サーバコンピュータであってもよい。
【0011】
なお、フラッシュストレージデバイス3は、ストレージアレイ内に設けられる複数のストレージデバイスの一つとして利用されてもよい。ストレージアレイは、サーバコンピュータのような情報処理装置にケーブルまたはネットワークを介して接続されてもよい。ストレージアレイは、このストレージアレイ内の複数のストレージ(例えば複数のフラッシュストレージデバイス3)を制御するコントローラを含む。フラッシュストレージデバイス3がストレージアレイに適用された場合には、このストレージアレイのコントローラが、フラッシュストレージデバイス3のホストとして機能してもよい。
【0012】
以下では、サーバコンピュータのような情報処理装置がホスト2として機能する場合を例示して説明する。
ホスト(サーバ)2と複数のフラッシュストレージデバイス3は、インタフェース50を介して相互接続される(内部相互接続)。この相互接続のためのインタフェース50としては、これに限定されないが、PCI Express(PCIe)(登録商標)、NVM Express(NVMe)(登録商標)、Ethernet(登録商標)、NVMe over Fabrics(NVMeOF)等を使用し得る。
【0013】
ホスト2として機能するサーバコンピュータの典型例としては、データセンター内のサーバコンピュータ(以下、サーバと称する)が挙げられる。
ホスト2がデータセンター内のサーバによって実現されるケースにおいては、このホスト(サーバ)2は、ネットワーク60を介して複数のエンドユーザ端末(クライアント)61に接続されてもよい。ホスト2は、これらエンドユーザ端末61に対して様々なサービスを提供することができる。
【0014】
ホスト(サーバ)2によって提供可能なサービスの例には、(1)システム稼働プラットフォームを各クライアント(各エンドユーザ端末61)に提供するプラットホーム・アズ・ア・サービス(PaaS)、(2)仮想サーバのようなインフラストラクチャを各クライアント(各エンドユーザ端末61)に提供するインフラストラクチャ・アズ・ア・サービス(IaaS)、等がある。
【0015】
複数の仮想マシンが、このホスト(サーバ)2として機能する物理サーバ上で実行されてもよい。ホスト(サーバ)2上で走るこれら仮想マシンの各々は、この仮想マシンに対応するクライアント(エンドユーザ端末61)に各種サービスを提供するように構成された仮想サーバとして機能することができる。各仮想マシンにおいては、この仮想マシンに対応するエンドユーザ端末61によって使用される、オペレーティングシステムおよびユーザアプリケーションが実行される。
【0016】
ホスト(サーバ)2においては、フラッシュトランスレーションレイヤ(ホストFTL)も実行される。このホストFTLは、アクセス対象のデータを識別するためのデータ識別子(タグ)それぞれとフラッシュストレージデバイス3内の不揮発性メモリの物理アドレスそれぞれとの間のマッピングを管理するアドレス変換テーブルであるルックアップテーブル(LUT)を含む。ホストFTLは、このLUTを使用することによって、フラッシュストレージデバイス3内の不揮発性メモリ上のデータ配置を知ることができる。
【0017】
フラッシュストレージデバイス3は、NAND型フラッシュメモリのような不揮発性メモリを含む。不揮発性メモリは、各々が複数のページを含む複数のブロックを含む。これらブロックの各々はデータを消去する単位であり、複数のページの各々はデータの書き込みおよび読み出しの単位である。
【0018】
フラッシュストレージデバイス3は、ローレベルアブストラクションを実行することができる。ローレベルアブストラクションは不揮発性メモリのアブストラクションのための機能である。ローレベルアブストラクションは、データ配置を補助する機能等を含む。データ配置を補助する機能の例は、ホスト2からのユーザデータが書き込まれるべき書き込み先ブロックを割り当てる機能、ユーザデータの書き込み先位置(書き込み先ブロック、この書き込み先ブロック内の位置)を決定する機能、ユーザデータが書き込まれたこの書き込み先位置(ブロックアドレス、オフセット)を上位階層(ホスト2)に通知する機能、等を含んでいてもよい。
【0019】
また、データ配置を補助する機能の例は、不揮発性メモリに既に書き込まれているユーザデータがコピーされるべきコピー先ブロックを割り当てる機能、ユーザデータのコピー先位置(コピー先ブロック、このコピー先ブロック内の位置)を決定する機能、ユーザデータがコピーされたこのコピー先位置(ブロックアドレス、オフセット)を上位階層(ホスト2)に通知する機能、等を含んでいてもよい。
【0020】
フラッシュストレージデバイス3は、ホスト2から受信される様々なコマンドを実行する。これらコマンドには、フラッシュストレージデバイス3内の不揮発性メモリにデータを書き込むためのライトコマンド、不揮発性メモリからデータを読み出すためのリードコマンドが含まれる。本実施形態においては、各リードコマンドは、読み出すべきデータが格納されている記憶位置を示す物理アドレスを指定する。この物理アドレスは、読み出し対象のブロックのブロックアドレスと、この読み出し対象のブロック内の読み出し対象の記憶位置を示すオフセット(ブロック内オフセット)とによって表される。
【0021】
フラッシュストレージデバイス3は、読み出し対象のブロックのブロックアドレスとこの読み出し対象のブロック内の読み出し対象の記憶位置を示すオフセットとを指定するリードコマンドそれぞれをホスト2から受信し、受信された各リードコマンドに応じてデータ読み出し動作を実行する。
【0022】
図2はフラッシュストレージデバイス3とホスト2との間の役割分担を示す。
ホスト(サーバ)2においては、複数のエンドユーザにそれぞれ対応する複数の仮想マシン401が実行される。各仮想マシン401においては、対応するエンドユーザによって使用される、オペレーティングシステムおよびユーザアプリケーション402が実行される。
【0023】
また、ホスト(サーバ)2においては、複数のユーザアプリケーション402にそれぞれ対応する複数のI/Oサービス403が実行される。これらI/Oサービス403には、論理ブロックアドレス(LBA)ベースのブロックI/Oサービス、キー・バリュー・ストアサービスなどが含まれてもよい。各I/Oサービス403は、タグそれぞれとフラッシュストレージデバイス3の物理アドレスそれぞれとの間のマッピングを管理するルックアップテーブル(LUT)を含む。
【0024】
ここで、タグとは、アクセス対象のデータを識別可能な識別子を意味する。このタグの典型的な例は、これに限定されないが、LBAのような論理アドレスである。あるいは、キー・バリュー・ストアのキー、またはこのキーのハッシュ値、等がタグとして利用されてもよい。
【0025】
フラッシュストレージデバイス3の物理アドレスは、フラッシュストレージデバイス3に含まれる不揮発性メモリ内の記憶位置(物理記憶位置)を特定するためのアドレスである。
LBAベースのブロックI/Oサービスにおいては、論理アドレス(LBA)それぞれとフラッシュストレージデバイス3の物理アドレスそれぞれとの間のマッピングを管理するLUTが使用されてもよい。
【0026】
一方、キー・バリュー・ストアサービスにおいては、キー(またはキーのハッシュ値)それぞれとこれらキーに対応するデータが格納されているフラッシュストレージデバイス3の物理アドレスそれぞれとこれらキーに対応するデータそれぞれのデータ長との間のマッピングを管理するLUTが使用されてもよい。
【0027】
各エンドユーザは、使用すべきアドレッシング方法(LBA、キー・バリュー・ストアのキー、このキーのハッシュ値、等)を選択することができる。
ホスト(サーバ)2においては、複数の仮想マシン401にそれぞれ対応する複数のライトバッファ(WB)404が管理されていてもよい。あるユーザアプリケーション402からのライトデータは、このユーザアプリケーション402に対応する仮想マシン401用のライトバッファ(WB)404に一時的に格納されてもよい。
【0028】
ホスト(サーバ)2からフラッシュストレージデバイス3へのコマンドの送信およびフラッシュストレージデバイス3からホスト(サーバ)2へのコマンド完了のレスポンス等の返送は、ホスト(サーバ)2およびフラッシュストレージデバイス3の各々に存在するI/Oキュー500を介して実行される。
【0029】
フラッシュストレージデバイス3は、フラッシュストレージデバイス3内の不揮発性メモリを論理的に分割することによって得られる複数の領域それぞれをQoSドメイン601として管理する。これらQoSドメイン601の各々は、不揮発性メモリに含まれる複数のブロックの部分集合である。不揮発性メモリに含まれる複数のブロックの各々は一つのQoSドメイン601のみに属し、同じブロックが異なるQoSドメイン601に同時に属することはない。
【0030】
これらQoSドメイン601は、QoSドメインIDと称される識別子によってそれぞれ識別される。これらQoSドメインIDは、これら複数の領域(複数のQoSドメイン)をそれぞれアクセスするための複数の識別子として使用される。
本実施形態においては、各ライトコマンドは、データが書き込まれるべき領域(QoSドメイン)の識別子(QoSドメインID)を指定する。あるQoSドメインIDを指定するライトコマンドをホスト2から受信した場合、フラッシュストレージデバイス3は、複数のQoSドメイン601によって共有される共通ブロック群602のうちの一つのブロックを選択し、この選択したブロックを、このQoSドメインIDを有するQoSドメイン用の書き込み先ブロックとして割り当てる。
【0031】
ここで、書き込み先ブロックとは、データが書き込まれるべきブロックを意味する。共通ブロック群602は、複数のQoSドメイン601によって共有されるフリーブロックの集合を含む共通フリーブロック群である。
フリーブロックとは、新たな書き込み先ブロックとして再使用(再割り当て)可能な状態(フリー状態)のブロックを意味する。フリーブロックの典型的な例は、有効データを格納していないブロックである。有効データとは、LBAのようなタグに関連付けられている最新のデータを意味する。つまり、ホスト2のLUTから最新のデータとしてリンクされているデータは有効データである。また、無効データとは、LBAのようタグに関連付けられていないデータを意味する。ホスト2のLUTからリンクされていないデータは無効データである。例えば、あるLBAに対応する更新データがフラッシュストレージデバイス3に書き込まれた場合には、このLBAに対応する以前のデータは無効データとなる。
【0032】
そして、フラッシュストレージデバイス3は、受信されたライトコマンドに関連付けられたデータを、このQoSドメイン用に割り当てられた書き込み先ブロックに書き込む。なお、利用可能な書き込み先ブロックが既にこのQoSドメイン用に割り当てられているならば、共通ブロック群602のうちの一つのブロック(フリーブロック)をこのQoSドメイン用の書き込み先ブロックとして割り当てるという上述の動作を行う必要は無い。フラッシュストレージデバイス3は、受信されたライトコマンドに関連付けられたデータを、既に割り当てられているこの書き込み先ブロック内の次の利用可能ページに書き込む。
【0033】
受信されたライトコマンドに関連付けられたデータが書き込み先ブロックに書き込まれると、フラッシュストレージデバイス3は、このデータのタグと、このデータが書き込まれた不揮発性メモリ内の記憶位置を示す物理アドレス(ブロックアドレス、オフセット)とをホスト2にアドレス記録要求として送出する。ブロックアドレスは、この書き込み先ブロックを識別するための識別子である。通常、不揮発性メモリは複数の不揮発性メモリチップによって構成されるので、あるブロックのブロックアドレスは、不揮発性メモリチップのチップ番号と、このチップ内のブロック番号とによって表されてもよい。オフセットは、この書き込み先ブロック内の記憶位置を示す。
【0034】
このアドレス記録要求に応じて、ホスト2は、このデータのタグにこの物理アドレス(ブロックアドレス、オフセット)が関連付けられるようにLUTを更新することができる。
各QoSドメインに含まれるブロックの各々について、ホスト2は、各ブロックに格納されているデータが有効データまたは無効データのいずれであるかを、LUTを使用して管理することができる。また、ホスト2は、既にデータが書き込まれている一つのブロックを新たな書き込み先ブロックとして再使用可能な状態(フリーブロック)に遷移させるためのコマンドをフラッシュストレージデバイス3に送信することができる。このコマンドは、フリーブロック群から割り当て済みの一つのブロックをフリーブロックとしてフリーブロック群に返却するために使用される。つまり、このコマンドは、フリーブロック群から割り当て済みの一つのブロックを新たな書き込み先ブロックとして再使用可能な状態に遷移させるためにこのブロックをフリーブロック群に返却するために使用される。
【0035】
例えば、データの更新によって、既にデータが書き込まれている一つのブロック内のデータ全てが無効データになった場合、ホスト2は、このブロックを再使用可能な状態(フリーブロック)に遷移させるためのコマンドをフラッシュストレージデバイス3に送信してもよい。あるいは、データコピー動作によってコピー元ブロック内のデータ全てが無効データになった場合、ホスト2は、このコピー元ブロックを新たな書き込み先ブロックとして再使用可能な状態(フリーブロック)に遷移させるための上述のコマンドをフラッシュストレージデバイス3に送信してもよい。
【0036】
本実施形態においては、既にデータが書き込まれているブロックを新たな書き込み先ブロックとして再使用可能な状態(フリーブロック)に遷移させるための専用のコマンドとして、リユースコマンドを使用することができる。
このリユースコマンドは、特定のQoSドメインに書き込み先ブロックとして割り当て済みのブロックのうちの一つのブロックを、共通ブロック群602に返却して任意のQoSドメイン用の新たな書き込み先ブロックとして再使用可能にするためのコマンドである。このリユースコマンドは、特定の領域(QoSドメイン)の識別子(QoSドメインID)と、共通ブロック群602に返却すべきブロックのブロックアドレスとを指定する。リユースコマンドによって指定されたブロックは共通ブロック群602にフリーブロックとして返却される。この返却されたブロックは、その消去動作が実行された後に、任意のQoSドメイン用の新たな書き込み先ブロックとして再使用(再割り当て)することができる。
【0037】
また、上述の再使用可能な状態(フリーブロック)に遷移させるためのコマンドとして、ある特定のブロックに対する消去動作を実行するためのイレーズコマンドが使用されてもよい。イレーズコマンドも、QoSドメインID、ブロックアドレスを含んでもよい。イレーズコマンドによって指定されたブロックは、その消去動作が実行され、且つ共通ブロック群602にフリーブロックとして返却される。このブロックも、任意のQoSドメイン用の新たな書き込み先ブロックとして再使用(再割り当て)することができる。
【0038】
図3は、フラッシュストレージデバイス3の構成例を示す。
フラッシュストレージデバイス3は、コントローラ4および不揮発性メモリ(NAND型フラッシュメモリ)5を備える。フラッシュストレージデバイス3は、ランダムアクセスメモリ、例えば、DRAM6も備えていてもよい。
【0039】
NAND型フラッシュメモリ5は、マトリクス状に配置された複数のメモリセルを含むメモリセルアレイを含む。NAND型フラッシュメモリ5は、2次元構造のフラッシュメモリであってもよいし、3次元構造のフラッシュメモリであってもよい。
NAND型フラッシュメモリ5のメモリセルアレイは、複数のブロックBLK0~BLKm-1を含む。ブロックBLK0~BLKm-1の各々は複数のページ(ここではページP0~Pn-1)を含む。ブロックBLK0~BLKm-1は、消去単位として機能する。ブロックは、「消去ブロック」、「物理ブロック」、または「物理消去ブロック」と称されることもある。ページP0~Pn-1は、データ書き込み動作およびデータ読み込み動作の単位である。
【0040】
コントローラ4は、ToggleNANDフラッシュインタフェース、オープンNANDフラッシュインタフェース(ONFI)のような、NANDインタフェース13を介して、不揮発性メモリであるNAND型フラッシュメモリ5に電気的に接続されている。コントローラ4は、NAND型フラッシュメモリ5を制御するように構成されたメモリコントローラとして動作する。このコントローラ4は、System-on-a-chip(SoC)のような回路によって実現されてもよい。
【0041】
NAND型フラッシュメモリ5は、
図4に示すように、複数のNAND型フラッシュメモリチップ(NAND型フラッシュメモリダイ)を含んでいてもよい。個々のNAND型フラッシュメモリチップは独立して動作可能である。このため、NAND型フラッシュメモリチップは、並列動作可能な単位として機能する。
図4においては、NANDインタフェース13に16個のチャンネルCh.1~Ch.16が接続されており、16個のチャンネルCh.1~Ch.16の各々に2つのNAND型フラッシュメモリチップが接続されている場合が例示されている。この場合、チャンネルCh.1~Ch.16に接続された16個のNAND型フラッシュメモリチップ#1~#16がバンク#0として編成されてもよく、またチャンネルCh.1~Ch.16に接続された残りの16個のNAND型フラッシュメモリチップ#17~#32がバンク#1として編成されてもよい。バンクは、複数のメモリモジュールをバンクインタリーブによって並列動作させるための単位として機能する。
図4の構成例においては、16個のチャンネルと、2つのバンクを使用したバンクインタリーブとによって、最大32個のNAND型フラッシュメモリチップを並列動作させることができる。
【0042】
消去動作は、一つのブロック(物理ブロック)の単位で実行されてもよいし、並列動作可能な複数の物理ブロックの集合を含むブロックグループ(スーパーブロック)の単位で実行されてもよい。一つのブロックグループ(一つのスーパーブロック)は、これに限定されないが、NAND型フラッシュメモリチップ#1~#32から一つずつ選択される計32個の物理ブロックを含んでいてもよい。なお、NAND型フラッシュメモリチップ#1~#32の各々はマルチプレーン構成を有していてもよい。例えば、NAND型フラッシュメモリチップ#1~#32の各々が、2つのプレーンを含むマルチプレーン構成を有する場合には、一つのスーパーブロックは、NAND型フラッシュメモリチップ#1~#32に対応する64個のプレーンから一つずつ選択される計64個の物理ブロックを含んでいてもよい。
【0043】
図5には、32個の物理ブロック(ここでは、NAND型フラッシュメモリチップ#1内の物理ブロックBLK2、NAND型フラッシュメモリチップ#2内の物理ブロックBLK3、NAND型フラッシュメモリチップ#3内の物理ブロックBLK7、NAND型フラッシュメモリチップ#4内の物理ブロックBLK4、NAND型フラッシュメモリチップ#5内の物理ブロックBLK6、…、NAND型フラッシュメモリチップ#32内の物理ブロックBLK3)を含む一つのスーパーブロック(SB)が例示されている。
【0044】
書き込み先ブロックは一つの物理ブロックであってもよいし、一つのスーパーブロックであってもよい。なお、一つのスーパーブロックが一つの物理ブロックのみを含む構成が利用されてもよく、この場合には、一つのスーパーブロックは一つの物理ブロックと等価である。
【0045】
次に、
図3のコントローラ4の構成について説明する。
コントローラ4は、ホストインタフェース11、CPU12、NANDインタフェース13、およびDRAMインタフェース14、直接メモリアクセスコントローラ(DMAC)15、ECCエンコード/デコード部16等を含む。これらホストインタフェース11、CPU12、NANDインタフェース13、DRAMインタフェース14、DMAC15、ECCエンコード/デコード部16は、バス10を介して相互接続される。
【0046】
このホストインタフェース11は、ホスト2との通信を実行するように構成されたホストインタフェース回路である。このホストインタフェース11は、例えば、PCIeコントローラ(NVMeコントローラ)であってもよい。あるいは、フラッシュストレージデバイス3がEthernet(登録商標)を介してホスト2に接続される構成においては、ホストインタフェース11は、NVMe over Fabrics(NVMeOF)コントローラであってもよい。
【0047】
ホストインタフェース11は、ホスト2から様々なコマンドを受信する。これらコマンドには、ライトコマンド、リードコマンド、イレーズコマンド、リユースコマンド、QoSドメインクリエートコマンド、他の様々なコマンドが含まれる。
CPU12は、ホストインタフェース11、NANDインタフェース13、DRAMインタフェース14、DMAC15、ECCエンコード/デコード部16を制御するように構成されたプロセッサである。CPU12は、フラッシュストレージデバイス3の電源オンに応答してNAND型フラッシュメモリ5または図示しないROMから制御プログラム(ファームウェア)をDRAM6にロードし、そしてこのファームウェアを実行することによって様々な処理を行う。なお、ファームウェアはコントローラ4内の図示しないSRAM上にロードされてもよい。このCPU12は、ホスト2からの様々なコマンドを実行するためのコマンド処理等を実行することができる。CPU12の動作は、CPU12によって実行される上述のファームウェアによって制御される。なお、コマンド処理の一部または全部は、コントローラ4内の専用ハードウェアによって実行してもよい。
【0048】
CPU12は、ライト制御部21、リード制御部22、コピー制御部23、およびブロック管理部24として機能することができる。なお、これらライト制御部21、リード制御部22、コピー制御部23、およびブロック管理部24の各々一部または全部も、コントローラ4内の専用ハードウェアによって実現されてもよい。
【0049】
ライト制御部21は、QoSドメインIDとタグとを指定するライトコマンドをホスト2から受信する。タグは、書き込むべきデータ(ユーザデータ)を識別可能な識別子であり、例えば、LBAであってもよいし、あるいはキー・バリュー・ストアのキーであってもよいし、このキーのハッシュ値であってもよい。ライトコマンドを受信した場合、ライト制御部21は、共通ブロック群602のうちの一つのブロックを選択し、選択したブロックを、ライトコマンドによって指定されたQoSドメインIDに対応するQoSドメイン用の書き込み先ブロックとして割り当てる。このQoSドメイン用の書き込み先ブロックとして割り当てられるブロックは、物理ブロックであってもよいし、スーパーブロックであってもよい。
【0050】
この場合、ライト制御部21は、共通ブロック群602から、最小プログラム/イレーズサイクルカウントを有するブロック(物理ブロックまたはスーパーブロック)を選択してもよい。これにより、QoSドメイン間でウェアレベリングを実行することができる。利用可能な書き込み先ブロックが既にこのQoSドメイン用に割り当てられているならば、共通ブロック群602のうちの一つのブロックをこのQoSドメイン用の書き込み先ブロックとして割り当てる動作は実行されない。
【0051】
ライト制御部21は、ページ書き込み順序の制約、およびこの書き込み先ブロック内の不良ページ等を考慮して、データが書き込まれるべき、この書き込み先ブロック内の位置(書き込み先位置)を決定する。次いで、ライト制御部21は、ホスト2からのデータ(ライトデータ)を、この書き込み先ブロックの書き込み先位置に書き込む。この場合、ライト制御部21は、ホスト2からのデータのみならず、このデータとこのデータのタグの双方を書き込み先ブロックに書き込むことができる。
【0052】
あるQoSドメイン用の書き込み先ブロック全体がデータで満たされると、ライト制御部21は、共通ブロック群602のうちの一つのブロックをこのQoSドメイン用の新たな書き込み先ブロックとして割り当てる。例えば、あるライトコマンドに関連付けられたライトデータの一部分の書き込みによって現在の書き込み先ブロック全体がデータで満たされると、ライト制御部21は、共通ブロック群602のうちの一つのブロックをこのQoSドメイン用の新たな書き込み先ブロックとして割り当て、このライトコマンドに関連付けられたライトデータの残り部分をこの新たな書き込み先ブロックに書き込む。
【0053】
ライトデータが書き込み先ブロックに書き込まれると、ライト制御部21は、このデータが書き込まれたNAND型フラッシュメモリ5内の記憶位置を示す物理アドレス(ブロックアドレス、オフセット)をホスト2にアドレス記録要求として送出する。
一つの物理ブロックが書き込み先ブロックとして割り当てられたケースにおいては、ブロックアドレスは、この物理ブロックを識別するためのブロックアドレスである。このブロックアドレスはチップ番号とこのチップ内のブロック番号とによって表されてもよい。
【0054】
一つのスーパーブロックが書き込み先ブロックとして割り当てられたケースにおいては、ブロックアドレスは、このスーパーブロックを識別するためのブロックアドレス(スーパーブロックアドレスとも云う)である。フラッシュストレージデバイス3内の全てのスーパーブロックに異なるスーパーブロックアドレスが付与されていてもよい。
【0055】
オフセットは、書き込み先ブロックの先頭から書き込み先位置までのオフセット、つまり書き込み先ブロックの先頭に対する書き込み先位置のオフセットを示す。書き込み先ブロックの先頭から書き込み先位置までのオフセットのサイズは、あるサイズを有する粒度の倍数で表されてもよい。あるいは、オフセットは、一つのページのページアドレスと、このページ内のオフセットとによって表されてもよい。
【0056】
リード制御部22は、物理アドレス(すなわち、ブロックアドレスおよびオフセット)を指定するリードコマンドをホスト2から受信した場合、これらブロックアドレスおよびオフセットに基づいてNAND型フラッシュメモリ5からデータをリードする。リード対象のブロックは、ブロックアドレスによって特定される。このブロック内のリード対象の記憶位置は、オフセットによって特定される。リードコマンドは、さらに、リード対象のQoSドメインのQoSドメインIDを含んでいてもよい。
【0057】
コピー制御部23は、ホスト2から受信されるコピーコマンドに応じて、あるQoSドメイン用に割り当てられているあるブロック内に格納されているデータを、このQoSドメイン用のまたは別のQoSドメイン用のブロック(コピー先ブロック)にコピーする。コピー先ブロックは、不揮発性メモリ内に既に書き込まれているデータが書き込まれるべき(コピーされるべき)書き込み先ブロックである。このコピーコマンドは、コピー元QoSドメインのQoSドメインIDと、コピー元ブロックのブロックアドレスと、コピー先QoSドメインのQoSドメインIDとを指定してもよい。コピー元ブロックは一つの物理ブロックであってもよいし、一つのスーパーブロックであってもよい。
【0058】
また、ホスト2は、所定の管理サイズ(例えば4KB)単位でコピー元ブロック内の各データが有効データまたは無効データのいずれであるかを示す管理データ(マップデータ)をフラッシュストレージデバイス3に送信することができる。このマップデータはコピーコマンドに含まれていてもよいし、コピーコマンドとは別にホスト2からフラッシュストレージデバイス3に送信されてもよい。コピー制御部23は、ホスト2から受信されるマップデータおよびコピーコマンドに応じて、コピー元ブロック内に格納されている有効データそれぞれを、このQoSドメイン用のまたは別のQoSドメイン用のブロック(コピー先ブロック)にコピーすることができる。
【0059】
コピー元ブロックからコピー先ブロックへのデータ(有効データ)それぞれのコピーが完了すると、コピー制御部23は、コピーされたデータ毎にこのデータのタグとこのデータのコピー先物理アドレス(ブロックアドレス、オフセット)とをホスト2に通知する。
【0060】
ブロック管理部24は、ホスト2から受信されるリユースコマンドによって指定されるブロックを共通ブロック群602に返却し、これによってこのブロックを、任意のQoSドメイン用の新たな書き込み先ブロックとして再使用可能な状態に遷移させる。リユースコマンドによって指定されるブロックは一つの物理ブロックであってもよいし、一つのスーパーブロックであってもよい。
【0061】
また、ブロック管理部24は、ホスト2から受信されるイレーズコマンドによって指定されるブロックに対する消去動作を実行し、さらに、このブロックを共通ブロック群602に返却し、これによってこのブロックを、任意のQoSドメイン用の新たな書き込み先ブロックとして再使用可能な状態に遷移させる。イレーズコマンドによって指定されるブロックも一つの物理ブロックであってもよいし、一つのスーパーブロックであってもよい。
【0062】
NANDインタフェース13は、CPU12の制御の下、NAND型フラッシュメモリ5を制御するように構成されたメモリ制御回路である。
DRAMインタフェース14は、CPU12の制御の下、DRAM6を制御するように構成されたDRAM制御回路である。DRAM6の記憶領域は、コマンドキュー31、ブロック管理テーブル32を格納するために使用される。また、DRAM6の記憶領域は、ライトデータ等を一時的に格納するための内部バッファとしても利用され得る。なお、内部バッファがフラッシュストレージデバイス3内に存在しない、または内部バッファの容量がほぼゼロに近い、というバッファレス構成がフラッシュストレージデバイス3に適用されてもよい。
【0063】
コマンドキュー31は、例えば待ちの状態のコマンドそれぞれを格納するために利用されてもよい。このコマンドキュー31は、QoSドメイン#0~#n-1間で共有される共通コマンドキューであってもよいし、QoSドメイン#0~#n-1に対応する複数のコマンドキュー#0~#n-1に分割されていてもよい。これら複数のコマンドキュー#0~#n-1が用意されている場合においては、QoSドメイン#0のQoSドメインID#0を指定する待ちの状態のコマンドはコマンドキュー#0に入れられ、QoSドメイン#1のQoSドメインID#1を指定する待ちの状態のコマンドはコマンドキュー#1に入れられ、同様に、QoSドメイン#n-1のQoSドメインID#n-1を指定する待ちの状態のコマンドはコマンドキュー#n-1に入れられる。
【0064】
ブロック管理テーブル32は、NAND型フラッシュメモリ5内の複数のブロックそれぞれに対応する複数の管理テーブルを含む。各管理テーブルは、この管理テーブルに対応するブロックを管理するための管理情報(メタデータ)を格納するために使用される。メタデータは、これに限定されないが、書き換え回数(プログラム/イレーズサイクルの数)、オープン/クローズ状態、書き込み先ページ範囲、等を含んでいてもよい。オープン/クローズ状態は、このブロックがオープン状態またはクローズ状態のいずれであるかを示す。オープン状態は、このブロックが書き込み先ブロックとして使用中の状態を示す。書き込み先ブロックには、ホスト2からのデータが書き込まれるホスト書き込み用の書き込み先ブロックと、不揮発性メモリ内に既に書き込まれているデータのコピー用の書き込み先ブロックとがある。データコピー用の書き込み先ブロックはコピー先ブロックと称される。
【0065】
クローズ状態は、ブロックがデータで満たされてアクティブブロックとして管理されている状態を示す。書き込み先ページ範囲は、どのページからどのページまでが現在書き込み(プログラム)動作中であるかを示す。
DMAC15は、CPU12の制御の下、ホスト2内のメモリ(ライトバッファ)とDRAM6(内部バッファ)との間のデータ転送を実行する。ホスト2のライトバッファから内部バッファにライトデータを転送すべき場合には、CPU12は、ライトバッファ上の位置を示す転送元アドレス、データサイズ、内部バッファ上の位置を示す転送先アドレスをDMAC15に対して指定する。
【0066】
ECCエンコード/デコード部16は、NAND型フラッシュメモリ5にデータをライトすべき時、書き込むべきライトデータをエンコード(ECCエンコード)することによってこのデータにエラー訂正コード(ECC)を付加する。NAND型フラッシュメモリ5からデータがリードされた時、ECCエンコード/デコード部16は、リードされたデータに付加されているECCを使用して、このデータのエラー訂正を行う(ECCデコード)。
【0067】
図6は、フラッシュストレージデバイス3に適用されるライトコマンドを示す。
ライトコマンドは、フラッシュストレージデバイス3にデータの書き込みを要求するコマンドである。このライトコマンドは、コマンドID、QoSドメインID、タグ、長さ、ライトバッファアドレス、等を含んでもよい。
【0068】
コマンドIDはこのコマンド(このライトコマンド)の固有の識別子である。QoSドメインIDは、データが書き込まれるべきQoSドメインを一意に識別可能な識別子である。あるエンドユーザに対応するアプリケーションからのライト要求に応じてホスト2から送信されるライトコマンドは、このエンドユーザに対応するQoSドメインを指定するQoSドメインIDを含む。
【0069】
タグは、書き込まれるべきライトデータを識別するための識別子である。このタグは、上述したように、LBAのような論理アドレスであってもよいし、キー・バリュー・ストアのキーであってもよいし、このキーのハッシュ値であってもよい。
長さは、書き込まれるべきライトデータの長さを示す。この長さ(データ長)は、上述の粒度(Grainとしても参照される)の数によって指定されてもよいし、LBAの数によって指定されてもよいし、あるいはバイトによって指定されてもよい。
【0070】
ライトバッファアドレスは、書き込まれるべきライトデータが格納されているホストメモリ(ホスト2のライトバッファ)内の位置を示す。ライトバッファアドレスは、データポインタとしても参照される。
コントローラ4は、ホスト2から受信されるQoSドメインクリエートコマンドに基づいて、QoSドメインクリエートコマンドによって指定された容量を有するQoSドメインを作成することができる。この場合、コントローラ4は、
図2の共通ブロック群602のうちの、指定された容量に対応する個数のブロックを、このQoSドメイン用に確保(予約)してもよい。ホスト2がQoSドメインクリエートコマンドを送信する度に、新たなQoSドメインが作成される。
【0071】
コントローラ4は、共通ブロック群602に加え、各QoSドメインに対応するアクティブブロックリスト(アクティブブロックプール)も管理することができる。
各ブロックの状態は、有効データを格納しているアクティブブロック(クローズ状態のブロック)と、有効データを格納しておらず書き込み先ブロックとして再使用可能なフリーブロックとに大別される。あるQoSドメインにおいては、アクティブブロックである各ブロックは、このQoSドメインに対応するアクティブブロックリストによって管理される。一方、各QoSドメインの各フリーブロックは、共通ブロック群602によって管理される。
【0072】
あるQoSドメインIDを指定するライトコマンドをホスト2から受信した時、コントローラ4は、共通ブロック群602内の一つのブロック(フリーブロック)を選択し、選択されたブロックを、このQoSドメインに書き込み先ブロックとして割り当てる。さらに、コントローラ4は、この書き込み先ブロック内の位置(書き込み先位置)を決定する。書き込み先ブロック内の書き込み先位置は、ページ書き込み順序の制約および不良ページ等を考慮して決定される。そして、コントローラ4は、ホスト2からのデータを、書き込み先ブロック内の書き込み先位置に書き込む。
【0073】
この書き込み先ブロック全体がユーザデータで満たされたならば、コントローラ4は、この書き込み先ブロックをこのQoSドメインのアクティブブロックリスト(アクティブブロックプール)に移動する。そして、コントローラ4は、共通ブロック群602内の一つのブロック(フリーブロック)を再び選択し、選択されたブロックをこのQoSドメインに新たな書き込み先ブロックとして割り当てる。
【0074】
あるQoSドメインに割り当て可能なブロックの数の上限は、このQoSドメインの容量に対応するブロックの個数までに制限される。共通ブロック群602から一つのブロックがこのQoSドメインに割り当てられると、コントローラ4は、このQoSドメインに割り当て可能なブロックの現在の個数を1だけ減らす。このQoSドメインの一つのブロックを指定する上述のリユースコマンドまたはイレーズコマンドによってこのブロックが共通ブロック群602に返却されると、コントローラ4は、このQoSドメインに割り当て可能なブロックの現在の個数を1だけ増やす。
【0075】
図7は、フラッシュストレージデバイス3からホスト2に送られるアドレス記録要求を示す。
アドレス記録要求は、ライトコマンドに関連付けられたライトデータが書き込まれたNAND型フラッシュメモリ5内の記憶位置(物理記憶位置)を示す物理アドレスをホスト2に通知するために使用される。このアドレス記録要求は、QoSドメインID、タグ、物理アドレス、長さを含んでもよい。
【0076】
QoSドメインIDは、ライトデータが書き込まれたQoSドメインを識別する識別子である。タグは、
図6のライトコマンドに含まれていたタグである。物理アドレスは、ライトコマンドに関連付けられたライトデータが書き込まれた物理記憶位置を示す。物理アドレスは、ブロックアドレスとオフセットとによって表される。長さは、書き込まれたライトデータの長さを示す。
【0077】
フラッシュストレージデバイス3から受信されるアドレス記録要求に基づいて、ホスト2は、ライトデータが書き込まれた記憶位置を示す物理アドレス(ブロックアドレス、オフセット)がこのライトデータのタグ(例えばLBA)に関連付けられるように、このQoSドメインに対応するLUTを更新することができる。また、ホスト2は、各QoSドメインに対応するLUTの内容に基づいて、各QoSドメインで使用されているブロック毎に有効/無効管理情報を管理することができる。あるブロックに対応する有効/無効管理情報は、このブロックに格納されている複数のデータそれぞれが有効データであるか無効データであるかを示す。
【0078】
図8は、フラッシュストレージデバイス3に適用されるリードコマンドを示す。
リードコマンドは、フラッシュストレージデバイス3にデータの読み出しを要求するコマンドである。このリードコマンドは、コマンドID、QoSドメインID、物理アドレス、長さ、リードバッファアドレスを含んでもよい。
【0079】
コマンドIDはこのコマンド(このリードコマンド)の固有の識別子である。QoSドメインIDは、読み出されるべきデータが格納されているQoSドメインを識別する識別子である。物理アドレスは、読み出されるべきデータが格納されている物理記憶位置を示す。物理アドレスは、ブロックアドレスとオフセットとによって表される。このブロックアドレスは、読み出し対象のブロックのブロックアドレスである。オフセットは、読み出し対象のブロック内の読み出し対象の記憶位置を示す。長さは、読み出されるべきデータの長さを示す。リードバッファアドレスは、読み出されたデータが転送されるべきホストメモリ(ホスト2のリードバッファ)内の位置を示す。
【0080】
図9は、リユースコマンドを示す。
リユースコマンドは、既にデータが書き込まれているブロックを共通ブロック群602に返却してこのブロックを任意のQoSドメイン用の新たな書き込み先ブロックとして再使用可能な状態(フリーブロック)にするためのコマンドである。
【0081】
このリユースコマンドは、コマンドID、QoSドメインID、物理アドレスを含んでもよい。
コマンドIDはこのコマンド(このリユースコマンド)の固有の識別子である。QoSドメインIDは、再使用可能な状態にするためのブロックが現在属しているQoSドメインを識別するための識別子である。物理アドレスは、再使用可能な状態にするためのブロックのブロックアドレスである。
【0082】
あるQoSドメインの一つのブロック内の全てのデータが更新データの書き込み動作またはデータコピー動作によって無効化された時、ホスト2は、このブロックを指定するリユースコマンドまたはイレーズコマンドをフラッシュストレージデバイス3に送信する。イレーズコマンドも、リユースコマンドと同様に、コマンドID、QoSドメインID、物理アドレス(ブロックアドレス)を含んでもよい。
【0083】
図10は、QoSドメインクリエートコマンドを示す。
QoSドメインクリエートコマンドは、QoSドメインを作成するためのコマンドである。このQoSドメインクリエートコマンドは、コマンドID、QoSドメインID、容量を含んでもよい。
コマンドIDはこのコマンド(このQoSドメインクリエートコマンド)の固有の識別子である。QoSドメインIDは、作成すべきQoSドメインの識別子である。容量は、作成すべきQoSドメイン用に確保すべき容量を示す。コントローラ4は、この容量に対応する個数のブロックを共通ブロック群602から確保し、このQoSドメインIDを指定するライトコマンドに応じて、この確保されたブロックのうちの一つのブロックをこのQoSドメイン用の書き込み先ブロックとして割り当てる。
【0084】
図11は、物理アドレスを規定するブロックアドレスおよびオフセットを示す。
ブロックアドレスはある一つのブロックBLKを指定する。各ブロックBLKは、
図11に示されているように、複数のページ(ここでは、ページ0~ページn)を含む。
ページサイズ(各ページのユーザデータ格納領域)が16Kバイトであり、粒度(Grain)が4KBのサイズであるケースにおいては、このブロックBLKは、4×(n+1)個の領域に論理的に分割される。
【0085】
オフセット+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領域を示す。
【0086】
図12は、スーパーブロックが使用されるケースにおけるブロックアドレスとオフセットとの関係を示す。
ここでは、図示を簡単化するために、ある一つのスーパーブロックSB#1が4つのブロックBLK#11、BLK#21、BLK#31、BLK#41から構成されている場合が想定されている。スーパーブロックSB#1のブロックアドレス(スーパーブロックアドレス)はSB#1である。4つのブロックBLK#11、BLK#21、BLK#31、BLK#41は、異なる4個のNAND型フラッシュメモリチップからそれぞれ選択されたブロックであってもよい。
【0087】
コントローラ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、…という順序でデータを書き込む。
【0088】
オフセット+0はブロックBLK#11のページ0の最初の4KB領域を示し、オフセット+1はブロックBLK#11のページ0の2番目の4KB領域を示し、オフセット+2はブロックBLK#11のページ0の3番目の4KB領域を示し、オフセット+3はブロックBLK#11のページ0の4番目の4KB領域を示す。
【0089】
オフセット+4はブロックBLK#21のページ0の最初の4KB領域を示し、オフセット+5はブロックBLK#21のページ0の2番目の4KB領域を示し、オフセット+6はブロックBLK#21のページ0の3番目の4KB領域を示し、オフセット+7はブロックBLK#21のページ0の4番目の4KB領域を示す。
【0090】
同様に、オフセット+12はブロックBLK#41のページ0の最初の4KB領域を示し、オフセット+13はブロックBLK#41のページ0の2番目の4KB領域を示し、オフセット+14はブロックBLK#41のページ0の3番目の4KB領域を示し、オフセット+15はブロックBLK#41のページ0の4番目の4KB領域を示す。
【0091】
オフセット+16はブロックBLK#11のページ1の最初の4KB領域を示し、オフセット+17はブロックBLK#11のページ1の2番目の4KB領域を示し、オフセット+18はブロックBLK#11のページ1の3番目の4KB領域を示し、オフセット+19はブロックBLK#11のページ1の4番目の4KB領域を示す。
【0092】
オフセット+20はブロックBLK#21のページ1の最初の4KB領域を示し、オフセット+21はブロックBLK#21のページ1の2番目の4KB領域を示し、オフセット+22はブロックBLK#21のページ1の3番目の4KB領域を示し、オフセット+23はブロックBLK#21のページ1の4番目の4KB領域を示す。
【0093】
同様に、オフセット+28はブロックBLK#41のページ1の最初の4KB領域を示し、オフセット+29はブロックBLK#41のページ1の2番目の4KB領域を示し、オフセット+30はブロックBLK#41のページ1の3番目の4KB領域を示し、オフセット+31はブロックBLK#41のページ1の4番目の4KB領域を示す。
【0094】
例えば、あるLBA(LBAx)を指定するライトコマンドに対応する4Kバイトデータをオフセット+8に対応する位置に書き込む場合には、コントローラ4は、タグ(=LBAx)、ブロック番号(=SB#1)、オフセット(=+8)、長さ(=1)をこのライトコマンドに対するアドレス記録要求としてホスト2に返してもよい。
【0095】
図13は、フラッシュストレージデバイス3によって管理される複数のQoSドメインを示す。
図13では、QoSドメイン#0、QoSドメイン#1、QoSドメイン#2、…、QoSドメイン#n-1が既に作成されている場合が明示されている。
図13では、これらQoSドメインは四角によって表されている。あるQoSドメインを表す四角の縦幅は、このQoSドメインの容量を表している。
【0096】
ユーザアプリケーション#0は、QoSドメイン#0のQoSドメインID#0を含むリード/ライトコマンドを使用して、QoSドメイン#0をリード/ライトアクセスすることができる。同様に、ユーザアプリケーション#n-1は、QoSドメイン#n-1のQoSドメインID#n-1を含むリード/ライトコマンドを使用して、QoSドメイン#n-1をリード/ライトアクセスすることができる。
【0097】
図14は、ホスト2とフラッシュストレージデバイス3とによって実行されるデータ書き込み処理を示す。
(1)ホスト2においては、ホストFTL701が実行される。このホストFTL701は、LBAのようなタグとフラッシュストレージデバイス3の物理アドレスそれぞれとの間のマッピングをLUTを使用して管理する。あるユーザアプリケーションからのライト要求に応じて、ホストFTL701は、このユーザアプリケーションに対応するQoSドメインのQoSドメインIDを指定するライトコマンドをフラッシュストレージデバイス3に送信する。ホストFTL701は、QoSドメインIDのみを指定すればよく、データが書き込まれるべきブロックおよびデータが書き込まれるべきページを指定する必要は無い。このため、ホストFTL701は、フラッシュストレージデバイス3内の不良ブロック、不良ページなどを管理する必要がなくなる。
【0098】
(2)フラッシュストレージデバイス3のコントローラ4は、複数のQoSドメイン601によって共有される共通ブロック群(フリーブロック群)602のうちの一つのブロックを選択する。コントローラ4は、この選択したブロックを、受信されたライトコマンドによって指定されたQoSドメインIDを有するQoSドメイン用の書き込み先ブロックとして割り当てる。共通ブロック群(フリーブロック群)602においては、不良ブロック以外のフリーブロック群のみが管理されていてもよい。例えば、最小プログラム/イレーズサイクル数を有するブロックが共通ブロック群602から選択されてもよい。そして、コントローラ4は、この書き込み先ブロックをデータが書き込まれるべきブロックとして決定し、さらに、データが書き込まれるべき、この書き込み先ブロック内の書き込み先位置を決定する。なお、上述したように、既にこのQoSドメイン用の書き込み先ブロックが割り当てられているならば、コントローラ4は、この既に割り当てられている書き込み先ブロックをデータが書き込まれるべきブロックとして決定すればよく、共通ブロック群602から一つのブロックをこのQoSドメイン用の書き込み先ブロックとして割り当てる動作を実行する必要は無い。
【0099】
(3)コントローラ4は、決定された書き込み先ブロックを示すブロックアドレスと決定した書き込み先位置を示すオフセットとを含む物理アドレス記録要求をホスト2に送信して、このライトコマンドに関連付けられたライトデータが書き込まれる物理アドレスをホスト2に通知する。
【0100】
(4)コントローラ4は、ライトコマンドに含まれるライトバッファアドレスに基づいて、ホスト2のライトバッファ702からライトデータを取得する。ライトバッファ702からのライトデータの取得はDMA転送を使用して実行されてもよい。そして、コントローラ4は、ライトデータを書き込み先ブロック内の書き込み先位置に書き込むデータ書き込み動作を実行する。
【0101】
(5)ライトデータの書き込みが完了してこのライトデータがNAND型フラッシュメモリ5から読み出し可能になった後、コントローラ4は、このライトデータが格納されているライトバッファ702内の領域を解放するための解放要求をホスト2に送出する。この解放要求は、書き込みが完了したライトデータに対応するライトコマンドの識別子を含んでいてもよい。あるいは、この解放要求は、このライトデータの格納位置を示すライトバッファアドレス、このライトデータの長さを含んでいてもよい。ホスト2は、この解放要求に応じて、このライトデータが格納されているライトバッファ702内の領域を解放する。このライトバッファ702内の解放された領域は他のライトデータの格納等のために利用可能となる。
【0102】
図15は、ホスト2とフラッシュストレージデバイス3とによって実行されるデータ読み出し処理を示す。
(1)ホストFTL701があるユーザアプリケーションからのリード要求を受信した場合、ホストFTL701は、ホストFTL701内のLUTを参照して、このリード要求によって指定されるLBAのようなタグに対応する物理アドレスを取得する。ホストFTL701は、このユーザアプリケーションに対応するQoSドメインのQoSドメインIDと、取得した物理アドレス(ブロックアドレスとオフセット)と、長さと、リードバッファアドレスとを指定するリードコマンドを、フラッシュストレージデバイス3に送信する。
【0103】
(2)コントローラ4がこのリードコマンドを受信した場合、コントローラ4は、このリードコマンドによって指定されるブロックアドレスとオフセットに基づいて、NAND型フラッシュメモリ5からデータを読み出す。そして、コントローラ4は、この読み出したデータを、DMA転送を使用して、リードバッファアドレスによって指定されるホスト2のリードバッファ703内の位置に転送する。
【0104】
図16は、フラッシュストレージデバイス3のコントローラ4によって管理される、複数のQoSドメインと共通フラッシュブロックプールとの関係を示す。
図16においては、図示の簡単化のために、QoSドメイン#0とQoSドメイン#n-1の2つのQoSドメインのみが例示されている。共通フラッシュブロックプール801は、複数のQoSドメインによって共有される上述の共通ブロック群602を管理するためのリストである。
【0105】
QoSドメイン#0のフラッシュブロックプール#0は、QoSドメイン#0に属するアクティブブロックそれぞれを管理するための上述のアクティブブロックリストである。
コントローラ4がQoSドメイン#0のQoSドメインID#0を指定するライトコマンドを受信した場合、コントローラ4は、QoSドメイン#0用の書き込み先ブロック(オープンブロック)が割り当て済みであるか否かを判定する。
【0106】
書き込み先ブロック(オープンブロック)が割り当て済みでないならば、コントローラ4は、共通フラッシュブロックプール801の内のフリーブロックをQoSドメイン#0用の書き込み先ブロック(オープンブロック)として割り当てる。そして、コントローラ4は、この書き込み先ブロック内の書き込み先位置を決定し、このライトコマンドに関連付けられたライトデータを、この書き込み先ブロック内のこの書き込み先位置に書き込む。
【0107】
一方、書き込み先ブロック(オープンブロック)が既に割り当て済みならば、コントローラ4は、この書き込み先ブロック内の書き込み先位置を決定し、このライトコマンドに関連付けられたライトデータを、この書き込み先ブロック内のこの書き込み先位置に書き込む。
【0108】
この書き込み先ブロック全体がホストからのデータで満たされると、コントローラ4は、この書き込み先ブロックをフラッシュブロックプール#0によって管理するとともに(クローズ)、共通フラッシュブロックプール801の内のフリーブロックをQoSドメイン#0用の新たな書き込み先ブロック(オープンブロック)として割り当てる。
【0109】
コントローラ4がQoSドメインID#0を示すコピー元QoSドメインと、コピー元ブロックのブロックアドレスと、QoSドメインID#0を示すコピー先QoSドメインとを指定するコピーコマンドを受信した場合、コントローラ4は、QoSドメイン#0用のコピー先ブロック(オープンブロック)が割り当て済みであるか否かを判定する。
【0110】
コピー先ブロック(オープンブロック)が割り当て済みでないならば、コントローラ4は、共通フラッシュブロックプール801の内のフリーブロックをQoSドメイン#0用のコピー先ブロック(オープンブロック)として割り当てる。そして、コントローラ4は、コピー元ブロックのブロックアドレスに基づいて、フラッシュブロックプール#0内のブロックをコピー元ブロックとして選択し、この選択したコピー元ブロック内のデータをコピー先ブロックにコピーする。上述のマップデータがホスト2から受信されている場合には、このマップデータに基づき、コントローラ4は、選択したコピー元ブロック内の有効データそれぞれをコピー先ブロックにコピーする。
【0111】
一方、コピー先ブロックが既に割り当て済みならば、コントローラ4は、選択したコピー元ブロック内のデータをこのコピー先ブロックにコピーする。
コピー先ブロック全体がホストからのデータで満たされると、コントローラ4は、このコピー先ブロックをフラッシュブロックプール#0によって管理するとともに(クローズ)、共通フラッシュブロックプール801の内のフリーブロックをQoSドメイン#0用の新たなコピー先ブロック(オープンブロック)として割り当てる。
【0112】
更新データの書き込みまたはデータコピー動作によってQoSドメイン#0に属する一つのブロック内のデータ全てが無効データになった場合、ホスト2は、このブロックのブロックアドレスを指定するリユースコマンドをフラッシュストレージデバイス3に送信する。
【0113】
コントローラ4がこのリユースコマンドをホスト2から受信した場合、コントローラ4は、このリユースコマンドによって指定されるフラッシュブロックプール#0内のブロックを共通フラッシュブロックプール801に返却して、このブロックを任意のQoSドメイン用の新たな書き込み先ブロック(またはコピー先ブロック)として再使用可能な状態にする。
【0114】
なお、更新データの書き込みまたはデータコピー動作によってQoSドメイン#0に属する一つのブロック内のデータ全てが無効データになった場合、ホスト2は、このブロックのブロックアドレスを指定するイレーズコマンドをフラッシュストレージデバイス3に送信してもよい。コントローラ4がこのイレーズコマンドをホスト2から受信した場合、コントローラ4は、このイレーズコマンドによって指定されるフラッシュブロックプール#0内のブロックに対する消去動作を実行し、且つこのブロックを共通フラッシュブロックプール801に返却して、このブロックを任意のQoSドメイン用の新たな書き込み先ブロック(またはコピー先ブロック)として再使用可能な状態にする。
【0115】
QoSドメイン#n-1においても、コントローラ4は、書き込み先ブロック/コピー先ブロックの割り当て、データで満たされた書き込み先ブロック/コピー先ブロックをフラッシュブロックプール#n-1によって管理する処理、リユースコマンド/イレーズコマンドによって指定されるブロックを共通フラッシュブロックプール801に返却する処理等を実行する。
【0116】
このように、ホスト2は、リードコマンドそれぞれとライトコマンドそれぞれとリユースコマンド/イレーズコマンドそれぞれをフラッシュストレージデバイス3に送出する。また、通常、ホスト2からフラッシュストレージデバイス3に送出される各コマンドは優先度を含んでおり、リユースコマンド/イレーズコマンドの優先度は、リードコマンド/ライトコマンドのようなデータアクセス用のコマンドの優先度よりも高い場合もあり得る。
【0117】
このため、あるブロックからデータを読み出すためのリードコマンドが完了していないにもかかわらず、このブロックを指定するリユースコマンド/イレーズコマンドがホスト2からフラッシュストレージデバイス3に送出されてしまう可能性がある。
この場合、このリードコマンドが実際に実行される時点では、このブロックは共通フラッシュブロックプール801にフリーブロックとして既に返却されてしまっているので、このリードコマンドを正常に実行することはできなくなる。場合によっては、不定値がリードデータとしてホスト2に返されてしまうかもしれない。
【0118】
例えば、コピー元ブロックからコピー先ブロックへのデータコピー動作の実行途中に、コピー元ブロック内のデータの読み出しを要求する幾つかのリードコマンドが発行されるかもしれない。そして、コピー元ブロックの全てのデータが無効データとなると、ホスト2は、このコピー元ブロックを指定するリユースコマンド/イレーズコマンドを発行するかもしれない。この場合、もし、ホスト2によって既に発行されている、コピー元ブロックを指定するリードコマンドが未完了であったならば、リードコマンドとリユースコマンド(またはイレーズコマンド)との衝突が生じる。
【0119】
ホストFTL701が、発行済みの全てのコマンドについてその完了の有無をチェックしながら新たなコマンドの発行を制御するという処理を行えば、このようなリードコマンド/リユースコマンド(イレーズコマンド)衝突を回避することができるかもしれない。しかし、このようなチェック処理を行うと、ホストFTL701がコマンドを発行しようとする度に待ち時間が生じることとなり、I/O性能が低下される要因となり得る。
【0120】
そこで、本実施形態では、コントローラ4は、あるブロックを指定するリユースコマンド/イレーズコマンドがホスト2から受信した場合、ホスト2から既に受信され且つこのブロックのブロックアドレスを指定する未完了のリードコマンドが存在するか否かを判定する処理を実行する。
【0121】
図17に示されているように、QoSドメイン#0のブロックBLK#1のブロックアドレスを指定するリユースコマンド/イレーズコマンドがホスト2から受信された場合には、コントローラ4は、ホスト2から既に受信され且つこのブロックBLK#1のブロックアドレスを指定する未完了のリードコマンドが存在するか否かを判定する。
【0122】
ブロックBLK#1のブロックアドレスを指定する未完了のリードコマンドが存在する場合には、コントローラ4は、ブロックBLK#1のブロックアドレスを指定する未完了のリードコマンドの実行が完了した後に、ブロックBLK#1のブロックアドレスを指定するリユースコマンド/イレーズコマンドを実行してブロックBLK#1を再使用可能な状態(フリーブロック)に遷移させる。
【0123】
一方、ブロックBLK#1のブロックアドレスを指定する未完了のリードコマンドが存在する場合には、コントローラ4は、ブロックBLK#1のブロックアドレスを指定するリユースコマンド/イレーズコマンドを即座に実行することができる。
図18は、コントローラ4によって管理される、コマンド数カウンタを含むブロック管理テーブル32を示す。
【0124】
例えば、ブロックBLK#1に対応するブロック管理テーブル32においては、ブロックBLK#1の状態を管理するためのメタデータとして、コマンド数カウンタ(以下、イン・フライトコマンド数カウンタと称する)が追加されている。
イン・フライトコマンド数カウンタの値は、ホスト2から既に受信され且つ未完了のリードコマンドの数を示すカウンタ値として使用される。コントローラ4は、共通フラッシュブロックプール801に入っているフリーブロック群(再使用可能状態のブロック群)以外の各ブロックについてイン・フライトコマンド数カウンタを管理する。
【0125】
ホスト2からリードコマンドを受信する度に、コントローラ4は、受信されたリードコマンド内のブロックアドレスによって指定されるブロックに対応するイン・フライトコマンド数カウンタ値を1増やす。
受信されたリードコマンドの実行が完了する度に、つまりこのリードコマンドに対応するデータ読み出し動作が完了する度に、コントローラ4は、完了したリードコマンド内のブロックアドレスによって指定されるブロックに対応するイン・フライトコマンド数カウンタ値を1減らす。
【0126】
あるブロックを再使用可能な状態に遷移させるためのコマンド(リユースコマンドまたはイレーズコマンド)をホスト2から受信した場合、コントローラ4は、このブロックに対応するイン・フライトコマンド数カウンタ値がゼロであるか否かに応じて、ホスト2から既に受信され且つこのブロックのブロックアドレスを指定する未完了のリードコマンドが存在するか否かを判定する。
【0127】
例えば、ブロックBLK#1に関しては、コントローラ4は、このブロックBLK#1をQoSドメイン#0用の書き込み先ブロックとして割り当てる場合、コントローラ4は、ブロックBLK#1に対応するイン・フライトコマンド数カウンタ値をゼロにする。
【0128】
ブロックBLK#1のブロックアドレスを指定するリードコマンドが到着したら、コントローラ4は、ブロックBLK#1に対応するイン・フライトコマンド数カウンタ値を1増やす。
ブロックBLK#1のブロックアドレスを指定するリードコマンドの実行が完了したら、コントローラ4は、ブロックBLK#1に対応するイン・フライトコマンド数カウンタ値を1減らす。
【0129】
なお、コピーコマンドもコピー元ブロックからデータを読み出すことを必要とするコマンドであるので、未完了のコピーコマンドが存在する状態で、コピー元ブロックを指定するリユースコマンド(またはイレーズコマンド)がホスト2から受信されたならば、コピーコマンドとリユースコマンド(またはイレーズコマンド)との衝突が起こる。このため、コントローラ4は、あるブロックを再使用可能な状態に遷移させるためのコマンド(リユースコマンドまたはイレーズコマンド)をホスト2から受信した場合、ホスト2から既に受信され且つこのブロックのブロックアドレスを指定する未完了のリードコマンドが存在するか否かのみならず、ホスト2から既に受信され且つこのブロックのブロックアドレスをコピー元ブロックのブロックアドレスとして指定する未完了のコピーコマンドが存在するか否かをさらに判定してもよい。
【0130】
このブロックのブロックアドレスを指定する未完了のリードコマンドと、このブロックのブロックアドレスをコピー元ブロックのブロックアドレスとして指定する未完了のコピーコマンドの双方の実行が完了した後に、コントローラ4は、このブロックを再使用可能な状態に遷移させるためのコマンド(リユースコマンドまたはイレーズコマンド)を実行してこのブロックを再使用可能な状態に遷移させる。
【0131】
未完了のコピーコマンドの数もイン・フライトコマンド数カウンタによって次のように管理することができる。
例えば、ブロックBLK#1に関しては、コントローラ4は、このブロックBLK#1をQoSドメイン#0用の書き込み先ブロックとして割り当てる場合、コントローラ4は、ブロックBLK#1に対応するイン・フライトコマンド数カウンタ値をゼロにする。
【0132】
ブロックBLK#1のブロックアドレスを指定するリードコマンドが到着したら、コントローラ4は、ブロックBLK#1に対応するイン・フライトコマンド数カウンタ値を1増やす。
ブロックBLK#1のブロックアドレスを指定するリードコマンドの実行が完了したら、コントローラ4は、ブロックBLK#1に対応するイン・フライトコマンド数カウンタ値を1減らす。
【0133】
ブロックBLK#1のブロックアドレスをコピー元ブロックのブロックアドレスとして指定するコピーコマンドが到着したら、コントローラ4は、ブロックBLK#1に対応するイン・フライトコマンド数カウンタ値を1増やす。
ブロックBLK#1のブロックアドレスをコピー元ブロックのブロックアドレスとして指定するコピーコマンドの実行が完了したら、コントローラ4は、ブロックBLK#1に対応するイン・フライトコマンド数カウンタ値を1減らす。
【0134】
図19のフローチャートは、コントローラ4によって実行されるイン・フライトコマンド数カウンタ更新処理の手順を示す。
コントローラ4は、ホスト2から受信されたコマンドかリードコマンドであるか否かを判定する(ステップS11)。
受信されたコマンドがリードコマンドであるならば(ステップS11のYES)、このリードコマンド内のブロックアドレスによって指定されるリード対象のブロックに対応するイン・フライトコマンド数カウンタ値を1増やす(ステップS12)。このリードコマンドの実行が完了すると(ステップS13のYES)、コントローラ4は、このリードコマンド内のブロックアドレスによって指定されるリード対象のブロックに対応するイン・フライトコマンド数カウンタ値を1減らす(ステップS14)。
【0135】
図20のフローチャートは、コントローラ4によって実行されるイン・フライトコマンド数カウンタ更新処理の別の手順を示す。
図20のイン・フライトコマンド数カウンタ更新処理においては、
図19のステップS11~S14の処理に加え、ステップS21~S24の処理が追加されている。
【0136】
ホスト2から受信されたコマンドがリードコマンドではないならば(ステップS11のNO)、コントローラ4は、このコマンドがコピーコマンドであるか否かを判定する(ステップS21)。
このコマンドがコピーコマンドであるならば(ステップS21のYES)、コントローラ4は、このコピーコマンド内のコピー元ブロックアドレスによって指定されるコピー元ブロックに対応するイン・フライトコマンド数カウンタ値を1増やす(ステップS22)。このコピーコマンドの実行が完了すると(ステップS23のYES)、コントローラ4は、このコピーコマンド内のコピー元ブロックアドレスによって指定されるコピー元ブロックに対応するイン・フライトコマンド数カウンタ値を1減らす(ステップS24)。
【0137】
図21は、リユースコマンドによって指定されたブロックと同じブロックのブロックアドレスを指定する未完了のリードコマンドが存在するか否かを判定するために、コントローラ4によって実行されるコマンドキューチェック動作を示す。
上述のイン・フライトコマンド数カウンタを使用する代わりに、コントローラ4は、未完了のコマンドそれぞれが格納されているコントローラ4内のコマンドキュー31を参照して、ホスト2から既に受信され且つリユースコマンドによって指定されたブロックアドレスを指定する未完了のリードコマンドが存在するか否かを判定してもよい。コマンドキュー31が複数のQoSドメインに対応する複数のコマンドキューに分割されている場合には、リユースコマンドによって指定されたQoSドメインに対応するコマンドキューのみが参照されればよい。
【0138】
図21では、リユースコマンドによってQoSドメインID#0、ブロックアドレスBLK#Xが指定された場合が想定されている。コントローラ4は、QoSドメインID#0に対応する未完了のコマンド(未実行のコマンド、実行途中のコマンド)が格納されているコマンドキュー#0を参照して、ブロックアドレスBLK#Xを指定するリードコマンドを探す。コマンドキュー#0にブロックアドレスBLK#Xを指定するリードコマンドが存在するならば、コントローラ4は、このリードコマンドの実行が完了した後に、リユースコマンドを実行する。
【0139】
図22は、リユースコマンドによって指定されたブロックと同じブロックのブロックアドレスを指定する未完了のリードコマンドが存在するか否かを判定するために、コントローラ4によって実行される別のコマンドキューチェック動作を示す。
図22では、リユースコマンドによってQoSドメインID#0、ブロックアドレスBLK#Xが指定された場合が想定されている。コントローラ4は、QoSドメインID#0に対応する未完了のコマンド(未実行のコマンド、実行途中のコマンド)が格納されているコマンドキュー#0を参照して、ブロックアドレスBLK#Xを指定するリードコマンドと、ソースブロックアドレスBLK#Xを指定するコピーコマンドとを探す。コマンドキュー#0に、ブロックアドレスBLK#Xを指定するリードコマンド、またはソースブロックアドレスBLK#Xを指定するコピーコマンドが存在するならば、コントローラ4は、これら未完了のコマンドの実行が完了した後に、リユースコマンドを実行する。
【0140】
図23のフローチャートは、ホスト2からリユースコマンドを受信した場合にコントローラ4によって実行される処理の手順を示す。
コントローラ4はホスト2から様々なコマンドを受信し(ステップS31)、受信されたコマンドそれぞれを実行する(ステップS32)。例えば、読み出し対象のブロックのブロックアドレスとこの読み出し対象のブロック内の読み出し対象の記憶位置を示すオフセットとを指定するリードコマンドそれぞれをホスト2から受信した場合には、コントローラ4は、受信された各リードコマンドに応じてデータ読み出し動作を実行する。
【0141】
ホスト2から受信されたコマンドがリユースコマンドである場合には(ステップS33のYES)、コントローラ4は、リユースコマンドによって指定されたブロックアドレスBLK#Xを指定する受信済みの全てのリードコマンドの実行が完了しているか否かを判定する(ステップS34)。ステップS34では、コントローラ4は、ブロックアドレスBLK#Xを有するブロックに対応するイン・フライトコマンド数カウンタ値を参照することによって、あるいはコマンドキューを参照することによって、ブロックアドレスBLK#Xを指定する受信済みの全てのリードコマンドの実行が完了しているか否かを判定することができる。
【0142】
ブロックアドレスBLK#Xを指定する未完了のリードコマンドが存在するならば(ステップS34のNO)、コントローラ4は、ブロックアドレスBLK#Xを指定する未完了の全てのリードコマンドの実行が完了するまで待つ(ステップS35、S36)。
【0143】
ブロックアドレスBLK#Xを指定する未完了の全てのリードコマンドの実行が完了すると(ステップS36のYES)、コントローラ4は、ブロックアドレスBLK#Xを指定するリユースコマンドを実行し、ブロックアドレスBLK#Xを有するブロックを共通フラッシュブロックプール801に返却して任意のQoSドメイン用の新たな書き込み先ブロックとして再使用可能な状態にする(ステップS37)。
【0144】
ブロックアドレスBLK#Xを有するブロックが共通フラッシュブロックプール801に返却された後に、この共通フラッシュブロックプール801内に存在するこのブロックのブロックアドレスBLK#Xを指定する新たなリードコマンドがホスト2から受信された場合(ステップS38のYES)、コントローラ4は、この受信された新たなリードコマンドを実行せずに、この受信された新たなリードコマンドの失敗を示す応答(例えば、このリードコマンドが不正なコマンドであることを示すエラー通知)をホスト2に返す(ステップS39)。
【0145】
図24のフローチャートは、ホスト2からリユースコマンドを受信した場合にコントローラ4によって実行される処理の別の手順を示す。
コントローラ4はホスト2から様々なコマンドを受信し(ステップS41)、受信されたコマンドそれぞれを実行する(ステップS42)。例えば、読み出し対象のブロックのブロックアドレスとこの読み出し対象のブロック内の読み出し対象の記憶位置を示すオフセットとを指定するリードコマンドそれぞれをホスト2から受信した場合には、コントローラ4は、受信された各リードコマンドに応じてデータ読み出し動作を実行する。
【0146】
ホスト2から受信されたコマンドがリユースコマンドである場合には(ステップS43のYES)、コントローラ4は、リユースコマンドによって指定されたブロックアドレスBLK#Xを指定する受信済みの全てのリードコマンドと、ブロックアドレスBLK#Xをコピー元ブロックアドレスとして指定する受信済みの全てのコピーコマンドの実行が完了しているか否かを判定する(ステップS44)。ステップS44では、コントローラ4は、ブロックアドレスBLK#Xを有するブロックに対応するイン・フライトコマンド数カウンタ値を参照することによって、あるいはコマンドキューを参照することによって、ブロックアドレスBLK#Xを指定する受信済みの全てのリードコマンドとブロックアドレスBLK#Xをコピー元ブロックアドレスとして指定する受信済みの全てのコピーコマンドの実行が完了しているか否かを判定することができる。
【0147】
ブロックアドレスBLK#Xを指定する未完了のリードコマンドまたはブロックアドレスBLK#Xをコピー元ブロックアドレスとして指定する未完了のコピーコマンドが存在するならば(ステップS44のNO)、コントローラ4は、ブロックアドレスBLK#Xを指定する未完了の全てのリードコマンドと、ブロックアドレスBLK#Xをコピー元ブロックアドレスとして指定する未完了の全てのコピーコマンドとの実行が完了するまで待つ(ステップS45、S46)。
【0148】
ブロックアドレスBLK#Xを指定する未完了の全てのリードコマンドとブロックアドレスBLK#Xをコピー元ブロックアドレスとして指定する未完了の全てのコピーコマンドの実行が完了すると(ステップS46のYES)、コントローラ4は、ブロックアドレスBLK#Xを指定するリユースコマンドを実行し、ブロックアドレスBLK#Xを有するブロックを共通フラッシュブロックプール801に返却して任意のQoSドメイン用の新たな書き込み先ブロックとして再使用可能な状態にする(ステップS47)。
【0149】
ブロックアドレスBLK#Xを有するブロックが共通フラッシュブロックプール801に返却された後に、この共通フラッシュブロックプール801内に存在するこのブロックのブロックアドレスBLK#Xを指定する新たなリードコマンドがホスト2から受信された場合(ステップS48のYES)、コントローラ4は、この受信された新たなリードコマンドを実行せずに、この受信された新たなリードコマンドの失敗を示す応答(例えば、このリードコマンドが不正なコマンドであることを示すエラー通知)をホスト2に返す(ステップS49)。
【0150】
なお、この共通フラッシュブロックプール801内に存在するこのブロックのブロックアドレスBLK#Xをコピー元ブロックアドレスとして指定する新たなコピーコマンドがホスト2から受信された場合も、コントローラ4は、この受信された新たなコピーコマンドを実行せずに、この受信された新たなコピーコマンドの失敗を示す応答(例えば、このコピーコマンドが不正なコマンドであることを示すエラー通知)をホスト2に返す。
【0151】
図25のフローチャートは、ホスト2からリユースコマンドを受信した場合にコントローラ4によって実行される処理のさらに別の手順を示す。
コントローラ4はホスト2から様々なコマンドを受信し(ステップS51)、受信されたコマンドそれぞれを実行する(ステップS52)。例えば、読み出し対象のブロックのブロックアドレスとこの読み出し対象のブロック内の読み出し対象の記憶位置を示すオフセットとを指定するリードコマンドそれぞれをホスト2から受信した場合には、コントローラ4は、受信された各リードコマンドに応じてデータ読み出し動作を実行する。
【0152】
ホスト2から受信されたコマンドがリユースコマンドである場合には(ステップS53のYES)、コントローラ4は、リユースコマンドによって指定されたブロックアドレスBLK#Xを指定する受信済みの全てのリードコマンドの実行が完了しているか否かを判定する(ステップS54)。ステップS54では、コントローラ4は、ブロックアドレスBLK#Xを有するブロックに対応するイン・フライトコマンド数カウンタ値を参照することによって、あるいはコマンドキューを参照することによって、ブロックアドレスBLK#Xを指定する受信済みの全てのリードコマンドの実行が完了しているか否かを判定することができる。
【0153】
ブロックアドレスBLK#Xを指定する未完了のリードコマンドが存在するならば(ステップS54のNO)、コントローラ4は、このリユースコマンドを実行せずに、このリユースコマンドの失敗を示す応答(例えば、このリユースコマンドが不正なコマンドであることを示すエラー通知)をホスト2に返す(ステップS55)。このリユースコマンドの失敗を示す応答を受信に応答して、ホスト2は、このリユースコマンドをフラッシュストレージデバイス3に再送信してもよい。
【0154】
ブロックアドレスBLK#Xを指定する全てのリードコマンドの実行が完了しているならば(ステップS54のYES)、コントローラ4は、このリユースコマンドを実行し、ブロックアドレスBLK#Xを有するブロックを共通フラッシュブロックプール801に返却して任意のQoSドメイン用の新たな書き込み先ブロックとして再使用可能な状態にする(ステップS56)。
【0155】
ブロックアドレスBLK#Xを有するブロックが共通フラッシュブロックプール801に返却された後に、この共通フラッシュブロックプール801内に存在するこのブロックのブロックアドレスBLK#Xを指定する新たなリードコマンドがホスト2から受信された場合(ステップS57のYES)、コントローラ4は、この受信された新たなリードコマンドを実行せずに、この受信された新たなリードコマンドの失敗を示す応答(例えば、このリードコマンドが不正なコマンドであることを示すエラー通知)をホスト2に返す(ステップS58)。
【0156】
図26のフローチャートは、ホスト2からリユースコマンドを受信した場合にコントローラ4によって実行される処理のさらに別の手順を示す。
コントローラ4はホスト2から様々なコマンドを受信し(ステップS61)、受信されたコマンドそれぞれを実行する(ステップS62)。例えば、読み出し対象のブロックのブロックアドレスとこの読み出し対象のブロック内の読み出し対象の記憶位置を示すオフセットとを指定するリードコマンドそれぞれをホスト2から受信した場合には、コントローラ4は、受信された各リードコマンドに応じてデータ読み出し動作を実行する。
【0157】
ホスト2から受信されたコマンドがリユースコマンドである場合には(ステップS63のYES)、コントローラ4は、リユースコマンドによって指定されたブロックアドレスBLK#Xを指定する受信済みの全てのリードコマンドと、ブロックアドレスBLK#Xをコピー元ブロックアドレスとして指定する受信済みの全てのコピーコマンドとの実行が完了しているか否かを判定する(ステップS64)。ステップS64では、コントローラ4は、ブロックアドレスBLK#Xを有するブロックに対応するイン・フライトコマンド数カウンタ値を参照することによって、あるいはコマンドキューを参照することによって、ブロックアドレスBLK#Xを指定する受信済みの全てのリードコマンドと、ブロックアドレスBLK#Xをコピー元ブロックアドレスとして指定する受信済みの全てのコピーコマンドとの実行が完了しているか否かを判定することができる。
【0158】
ブロックアドレスBLK#Xを指定する未完了のリードコマンド、またはブロックアドレスBLK#Xをコピー元ブロックアドレスとして指定する未完了のコピーコマンドが存在するならば(ステップS64のNO)、コントローラ4は、このリユースコマンドを実行せずに、このリユースコマンドの失敗を示す応答(例えば、このリユースコマンドが不正なコマンドであることを示すエラー通知)をホスト2に返す(ステップS65)。このリユースコマンドの失敗を示す応答を受信に応答して、ホスト2は、このリユースコマンドをフラッシュストレージデバイス3に再送信してもよい。
【0159】
ブロックアドレスBLK#Xを指定する全てのリードコマンドとブロックアドレスBLK#Xをコピー元ブロックアドレスとして指定する全てのコピーコマンドとの実行が完了しているならば(ステップS64のYES)、コントローラ4は、このリユースコマンドを実行し、ブロックアドレスBLK#Xを有するブロックを共通フラッシュブロックプール801に返却して任意のQoSドメイン用の新たな書き込み先ブロックとして再使用可能な状態にする(ステップS66)。
【0160】
ブロックアドレスBLK#Xを有するブロックが共通フラッシュブロックプール801に返却された後に、この共通フラッシュブロックプール801内に存在するこのブロックのブロックアドレスBLK#Xを指定する新たなリードコマンドがホスト2から受信された場合(ステップS67のYES)、コントローラ4は、この受信された新たなリードコマンドを実行せずに、この受信された新たなリードコマンドの失敗を示す応答(例えば、このリードコマンドが不正なコマンドであることを示すエラー通知)をホスト2に返す(ステップS68)。
【0161】
なお、この共通フラッシュブロックプール801内に存在するこのブロックのブロックアドレスBLK#Xをコピー元ブロックアドレスとして指定する新たなコピーコマンドがホスト2から受信された場合も、コントローラ4は、この受信された新たなコピーコマンドを実行せずに、この受信された新たなコピーコマンドの失敗を示す応答(例えば、このコピーコマンドが不正なコマンドであることを示すエラー通知)をホスト2に返す。
【0162】
図23~
図26のフローチャートではリユースコマンドを受信した場合に実行される処理の手順を説明したが、ホスト2からイレーズコマンドを受信した場合も、
図23~
図26で説明した、リユースコマンドを受信した場合に実行される処理と同様の処理が実行される。
【0163】
また、本実施形態のフラッシュストレージデバイス3においては、上述のライトコマンドのみならず、以下のタイプのライトコマンドを適用することもできる。
<ブロックアドレスを指定するライトコマンド>
このライトコマンドは、コマンドID、QoSドメインID、物理アドレス、タグ、長さ、ライトバッファアドレス、等を含んでもよい。
【0164】
コマンドIDはこのコマンド(このライトコマンド)の固有の識別子である。QoSドメインIDは、データが書き込まれるべきQoSドメインを一意に識別可能な識別子である。あるエンドユーザに対応するアプリケーションからのライト要求に応じてホスト2から送信されるライトコマンドは、このエンドユーザに対応するQoSドメインを指定するQoSドメインIDを含む。
【0165】
物理アドレスは、データが書き込まれるべきブロックのブロックアドレスを指定し、このブロック内の位置(例えば、ページアドレスおよびページ内のオフセット)は指定しない。
タグは、書き込まれるべきライトデータを識別するための識別子である。このタグは、上述したように、LBAのような論理アドレスであってもよいし、キー・バリュー・ストアのキーであってもよいし、このキーのハッシュ値であってもよい。
【0166】
長さは、書き込まれるべきライトデータの長さを示す。この長さ(データ長)は、上述の粒度(Grain)の数によって指定されてもよいし、LBAの数によって指定されてもよいし、あるいはバイトによって指定されてもよい。
ライトバッファアドレスは、書き込まれるべきライトデータが格納されているホストメモリ(ホスト2のライトバッファ)内の位置を示す。ライトバッファアドレスは、データポインタとしても参照される。
【0167】
ホスト2からライトコマンドを受信した時、コントローラ4は、ライトコマンドによって指定されたブロックアドレスを有するブロック内の書き込み先位置を決定する。この書き込み先位置は、ページ書き込み順序の制約およびバッドページ等を考慮して決定される。そして、コントローラ4は、ホスト2からのデータを、ライトコマンドによって指定されたブロックアドレスを有するこのブロック内のこの決定された書き込み先位置に書き込む。
【0168】
このタイプのライトコマンドを使用するケースにおいては、ホスト2は、ブロック割り当てコマンドをフラッシュストレージデバイス3に送出することによって、特定のQoSドメイン用のブロックの割り当てをフラッシュストレージデバイス3に要求してもよい。ブロック割り当てコマンドはQoSドメインIDを指定する。コントローラ4がブロック割り当てコマンドを受信した場合、コントローラ4は、共通ブロック群602内の一つのブロック(フリーブロック)を選択し、選択されたブロックを、このQoSドメインに書き込み先ブロックとして割り当てる。そして、コントローラ4は、この割り当てられたブロックのブロックアドレスをホスト2に通知する。ホスト2は、この割り当てられたブロックのブロックアドレスを指定するライトコマンドをフラッシュストレージデバイス3に送信することができる。
【0169】
<ブロックアドレスおよびオフセットを指定するライトコマンド>
このライトコマンドは、コマンドID、QoSドメインID、物理アドレス、タグ、長さ、ライトバッファアドレス、等を含んでもよい。
コマンドIDはこのコマンド(このライトコマンド)の固有の識別子である。QoSドメインIDは、データが書き込まれるべきQoSドメインを一意に識別可能な識別子である。あるエンドユーザに対応するアプリケーションからのライト要求に応じてホスト2から送信されるライトコマンドは、このエンドユーザに対応するQoSドメインを指定するQoSドメインIDを含む。
【0170】
物理アドレスは、データが書き込まれるべきブロックのブロックアドレスと、このブロック内書き込み先の位置を示すオフセット(例えば、ページアドレスおよびページ内のオフセット)とを指定する。
タグは、書き込まれるべきライトデータを識別するための識別子である。このタグは、上述したように、LBAのような論理アドレスであってもよいし、キー・バリュー・ストアのキーであってもよいし、このキーのハッシュ値であってもよい。
【0171】
長さは、書き込まれるべきライトデータの長さを示す。この長さ(データ長)は、上述の粒度(Grain)の数によって指定されてもよいし、LBAの数によって指定されてもよいし、あるいはバイトによって指定されてもよい。
ライトバッファアドレスは、書き込まれるべきライトデータが格納されているホストメモリ(ホスト2のライトバッファ)内の位置を示す。
【0172】
以上説明したように、本実施形態によれば、既にデータが書き込まれているブロックを新たな書き込み先ブロックとして再使用可能な状態に遷移させるためのコマンド(リユースコマンドまたはイレーズコマンド)がホスト2から受信された場合、ホスト2から既に受信され且つこのブロックのブロックアドレスを指定する未完了のリードコマンドが存在するか否かが判定される。そして、このブロックのブロックアドレスを指定する未完了のリードコマンドが存在する場合には、このブロックのブロックアドレスを指定する未完了のリードコマンドの実行が完了した後に、このブロックを再使用可能な状態に遷移させるためのコマンド(リユースコマンドまたはイレーズコマンド)が実行される。したがって、ホスト2が、発行済みの全てのコマンドについてその完了の有無をチェックしながら新たなコマンドの発行を制御するという処理を行うことなく、リードコマンド/リユースコマンド(イレーズコマンド)衝突を回避することができる。よって、ホスト2側の負担を軽減することができる。
【0173】
また、本実施形態では、既にデータが書き込まれているブロックを新たな書き込み先ブロックとして再使用可能な状態に遷移させるためのコマンド(リユースコマンドまたはイレーズコマンド)がホスト2から受信された場合、ホスト2から既に受信され且つこのブロックのブロックアドレスを指定する未完了のリードコマンドが存在するか否かが判定される。そして、このブロックのブロックアドレスを指定する未完了のリードコマンドが存在しない場合には、このブロックを再使用可能な状態に遷移させるためのコマンド(リユースコマンドまたはイレーズコマンド)が実行される。一方、このブロックのブロックアドレスを指定する未完了のリードコマンドが存在する場合には、このブロックを再使用可能な状態に遷移させるためのコマンド(リユースコマンドまたはイレーズコマンド)は実行されずに、このコマンドの失敗を示す応答がホスト2に返される。したがって、ホスト2が、発行済みの全てのコマンドについてその完了の有無をチェックしながら新たなコマンドの発行を制御するという処理を行うことなく、リードコマンド/リユースコマンド(イレーズコマンド)衝突を回避することができる。
【0174】
なお、本実施形態では、不揮発性メモリとしてNAND型フラッシュメモリを例示した。しかし、本実施形態の機能は、例えば、MRAM(Magnetoresistive Random Access Memory)、PRAM(Phase change Random Access Memory)、ReRAM(Resistive Random Access Memory)、又は、FeRAM(Ferroelectric Random Access Memory)のような他の様々な不揮発性メモリにも適用できる。
【0175】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0176】
2…ホスト、3…フラッシュストレージデバイス、4…コントローラ、5…NAND型フラッシュメモリ、21…ライト制御部、22…リード制御部、23…コピー制御部、24…ブロック管理部。