(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-02-26
(45)【発行日】2024-03-05
(54)【発明の名称】メモリシステムおよび制御方法
(51)【国際特許分類】
G06F 12/00 20060101AFI20240227BHJP
【FI】
G06F12/00 597U
(21)【出願番号】P 2020140065
(22)【出願日】2020-08-21
【審査請求日】2023-03-09
(73)【特許権者】
【識別番号】318010018
【氏名又は名称】キオクシア株式会社
(74)【代理人】
【識別番号】110001737
【氏名又は名称】弁理士法人スズエ国際特許事務所
(72)【発明者】
【氏名】菅野 伸一
【審査官】松平 英
(56)【参考文献】
【文献】特開2020-16954(JP,A)
【文献】特開2018-73038(JP,A)
【文献】特開2019-53795(JP,A)
【文献】特開2021-140306(JP,A)
【文献】特開2013-206229(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 3/06-3/08
12/00-12/128
13/16-13/18
(57)【特許請求の範囲】
【請求項1】
不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、累積重みに基づいて、前記不揮発性メモリに送出すべきリードコマンドそれぞれを受け付けるための第1の入力と、前記不揮発性メモリに送出すべき消去コマンドそれぞれと前記不揮発性メモリに送出すべきプログラムコマンドそれぞれとを受け付けるための第2の入力のうちから、コマンドが実行されるべき高優先度の入力を選択し、前記選択した高優先度の入力に対応する一つのコマンドの実行を開始し、前記一つのコマンドに関連付けられた重みを使用して前記累積重みを更新するように構成されたコントローラと、を具備し、
前記第1の入力および前記第2の入力のうちの一方の入力の一つのコマンドの実行が開始された場合、前記累積重みは、前記一方の入力の前記一つのコマンドに関連付けられた重みを前記累積重みから減算することによって得られる値に更新され、前記第1の入力および前記第2の入力のうちの他方の入力の一つのコマンドの実行が開始された場合、前記累積重みは、前記他方の入力の前記一つのコマンドに関連付けられた重みを前記累積重みに加算することによって得られる値に更新され、前記累積重みの値が第1の値よりも大きいという第1条件を満たしている間は、前記一方の入力が前記高優先度の入力として選択され、前記累積重みの値が前記第1の値よりも小さいという第2条件を満たしている間は、前記他方の入力が前記高優先度の入力として選択され、
前記コントローラは、
前記不揮発性メモリにおいて実行されているコマンドが一つの消去/プログラムコマンドであり、且つ前記累積重みの値が、前記第1条件および前記第2条件のうち、前記第1の入力が前記高優先度の入力として選択される一方の条件を満たしている場合、前記不揮発性メモリにサスペンドコマンドを送信することによって前記一つの消去/プログラムコマンドの実行を中断し、
前記第1の入力の一つのリードコマンドの実行を開始する動作と、前記一つリードコマンドに関連付けられた重みを使用して前記累積重みを更新する動作とを、前記第1の入力からリードコマンドがなくなるか、または前記累積重みが前記一方の条件を満たさなくなるまで繰り返し実行してから、中断されている前記一つの消去/プログラムコマンドの実行を再開するように構成されている、メモリシステム。
【請求項2】
前記不揮発性メモリにおいて、一つの消去/プログラムコマンドの実行中に許容される中断の回数または前記一つの消去/プログラムコマンドの実行中に許容される中断時間の合計についての上限値が規定されている場合、
前記コントローラは、実行中の一つの消去/プログラムコマンドに対する中断の回数または中断時間の合計が前記上限値に達した後は、前記累積重みの値にかかわらず、前記一つの消去/プログラムコマンドの実行を中断せずに前記一つの消去/プログラムコマンドの実行を継続するように構成されている請求項1に記載のメモリシステム。
【請求項3】
前記不揮発性メモリにおいて、前記一つの消去/プログラムコマンドの実行の再開から次回の中断までの間に確保すべきインターバル時間がさらに規定されている場合、
前記コントローラは、前記一つの消去/プログラムコマンドの実行の再開からの経過時間が前記インターバル時間に満たない間は、前記累積重みの値にかかわらず、前記一つの消去/プログラムコマンドの実行を中断せずに前記一つの消去/プログラムコマンドの実行を継続するように構成されている請求項2に記載のメモリシステム。
【請求項4】
前記コントローラは、前記不揮発性メモリに送出すべき一つ以上のリードコマンドを格納可能なコマンドキューを含み、
前記累積重みの値が、前記第1の入力が前記高優先度の入力として選択される前記一方の条件を満たしている場合、前記コマンドキューに格納可能なリードコマンドの数の上限を、前記累積重みの値に比例する数に設定し、
前記累積重みの値が前記一方の条件を満たさない場合、前記コマンドキューに格納可能なリードコマンドの数の上限を1に設定するように構成されている、請求項1または2に記載のメモリシステム。
【請求項5】
前記コマンドキューに複数のリードコマンドが格納されている場合、前記コントローラは、前記コマンドキューに格納されている前記複数のリードコマンドを、前記複数のリードコマンドが前記コマンドキューに格納された順に、または前記複数のリードコマンドにそれぞれ関連付けられた重みが小さい順に、前記不揮発性メモリに送出するように構成されている、請求項4に記載のメモリシステム。
【請求項6】
前記不揮発性メモリは、リードコマンド、消去コマンド、およびプログラムコマンドを実行するように構成され、前記リードコマンドの実行に要する時間は、消去/プログラムコマンドの実行に要する時間よりも短い、請求項1記載のメモリシステム。
【請求項7】
リードコマンド、消去コマンド、およびプログラムコマンドを実行するように構成され、且つ消去/プログラムコマンドの実行を中断し且つ前記消去/プログラムコマンドの実行の中断中に一つ以上のリードコマンドを実行する機能を有する不揮発性メモリであって、前記リードコマンドの実行に要する時間は、前記消去/プログラムコマンドの実行に要する時間よりも短い、不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、累積重みに基づいて、前記不揮発性メモリに送出すべきリードコマンドそれぞれを含む第1コマンドグループと、前記不揮発性メモリに送出すべき消去コマンドそれぞれと前記不揮発性メモリに送出すべきプログラムコマンドそれぞれとを含む第2コマンドグループのうちから、実行されるべき高優先度のコマンドグループを選択し、前記選択した高優先度のコマンドグループに対応する一つのコマンドの実行を開始し、前記一つのコマンドに関連付けられた重みを使用して前記累積重みを更新するように構成されたコントローラと、を具備し、
前記第1コマンドグループおよび前記第2コマンドグループのうちの一方のコマンドグループ内の一つのコマンドの実行が開始された場合、前記累積重みは、前記一方のコマンドグループの前記一つのコマンドに関連付けられた重みを前記累積重みから減算することによって得られる値に更新され、前記第1コマンドグループおよび前記第2コマンドグループのうちの他方のコマンドグループ内の一つのコマンドの実行が開始された場合、前記累積重みは、前記他方のコマンドグループの前記一つのコマンドに関連付けられた重みを前記累積重みに加算することによって得られる値に更新され、前記累積重みの値が第1の値よりも大きいという第1条件を満たしている間は、前記一方のコマンドグループが前記高優先度のコマンドグループとして選択され、前記累積重みの値が前記第1の値よりも小さいという第2条件を満たしている間は、前記他方のコマンドグループが前記高優先度の入力として選択され、
前記コントローラは、
前記不揮発性メモリにおいて実行されているコマンドが前記第2コマンドグループ内の一つの消去/プログラムコマンドであり、且つ前記累積重みの値が、前記第1条件および前記第2条件のうち、前記第1コマンドグループが前記高優先度のコマンドグループとして選択される一方の条件を満たしている場合、前記不揮発性メモリにサスペンドコマンドを送信することによって前記一つの消去/プログラムコマンドの実行を中断し、
前記第1コマンドグループ内の一つのリードコマンドの実行を開始する動作と、前記一つリードコマンドに関連付けられた重みを使用して前記累積重みを更新する動作とを、前記第1コマンドグループからリードコマンドがなくなるか、または前記累積重みが前記一方の条件を満たさなくなるまで繰り返し実行してから、中断されている前記一つの消去/プログラムコマンドの実行を再開するように構成されている、メモリシステム。
【請求項8】
不揮発性メモリを制御するように構成されたコントローラによって実行される制御方法であって、
累積重みに基づいて、前記不揮発性メモリに送出すべきリードコマンドそれぞれを受け付けるための第1の入力と、前記不揮発性メモリに送出すべき消去コマンドそれぞれと前記不揮発性メモリに送出すべきプログラムコマンドそれぞれとを受け付けるための第2の入力のうちから、コマンドが実行されるべき高優先度の入力を選択することと、
前記選択した高優先度の入力に対応する一つのコマンドの実行を開始することと、
前記一つのコマンドに関連付けられた重みを使用して前記累積重みを更新することと、前記第1の入力および前記第2の入力のうちの一方の入力の一つのコマンドの実行が開始された場合、前記累積重みは、前記一方の入力の前記一つのコマンドに関連付けられた重みを前記累積重みから減算することによって得られる値に更新され、前記第1の入力および前記第2の入力のうちの他方の入力の一つのコマンドの実行が開始された場合、前記累積重みは、前記他方の入力の前記一つのコマンドに関連付けられた重みを前記累積重みに加算することによって得られる値に更新され、前記累積重みの値が第1の値よりも大きいという第1条件を満たしている間は、前記一方の入力が前記高優先度の入力として選択され、前記累積重みの値が前記第1の値よりも小さいという第2条件を満たしている間は、前記他方の入力が前記高優先度の入力として選択され、
前記不揮発性メモリにおいて実行されているコマンドが一つの消去/プログラムコマンドであり、且つ前記累積重みの値が、前記第1条件および前記第2条件のうち、前記第1の入力が前記高優先度の入力として選択される一方の条件を満たしている場合、前記不揮発性メモリにサスペンドコマンドを送信することによって前記一つの消去/プログラムコマンドの実行を中断することと、
前記第1の入力の一つのリードコマンドの実行を開始する動作と、前記一つリードコマンドに関連付けられた重みを使用して前記累積重みを更新する動作とを、前記第1の入力からリードコマンドがなくなるか、または前記累積重みが前記一方の条件を満たさなくなるまで繰り返し実行してから、中断されている前記一つの消去/プログラムコマンドの実行を再開することと、を具備する制御方法。
【請求項9】
前記不揮発性メモリにおいて、一つの消去/プログラムコマンドの実行中に許容される中断の回数または前記一つの消去/プログラムコマンドの実行中に許容される中断時間の合計についての上限値が規定されている場合、
実行中の一つの消去/プログラムコマンドに対する中断の回数または中断時間の合計が前記上限値に達した後は、前記累積重みの値にかかわらず、前記一つの消去/プログラムコマンドの実行を中断せずに前記一つの消去/プログラムコマンドの実行を継続することをさらに具備する請求項8に記載の制御方法。
【請求項10】
前記不揮発性メモリにおいて、前記一つの消去/プログラムコマンドの実行の再開から次回の中断までの間に確保すべきインターバル時間がさらに規定されている場合、
前記一つの消去/プログラムコマンドの実行の再開からの経過時間が前記インターバル時間に満たない間は、前記累積重みの値にかかわらず、前記一つの消去/プログラムコマンドの実行を中断せずに前記一つの消去/プログラムコマンドの実行を継続することをさらに具備する請求項9に記載の制御方法。
【請求項11】
前記コントローラは、前記不揮発性メモリに送出すべき一つ以上のリードコマンドを格納可能なコマンドキューを含み、
前記累積重みの値が、前記第1の入力が前記高優先度の入力として選択される前記一方の条件を満たしている場合、前記コマンドキューに格納可能なリードコマンドの数の上限を、前記累積重みの値に比例する数に設定することと、
前記累積重みの値が前記一方の条件を満たさない場合、前記コマンドキューに格納可能なリードコマンドの数の上限を1に設定することと、をさらに具備する請求項8または9に記載の制御方法。
【請求項12】
前記コマンドキューに複数のリードコマンドが格納されている場合、前記コマンドキューに格納されている前記複数のリードコマンドを、前記複数のリードコマンドが前記コマンドキューに格納された順に、または前記複数のリードコマンドにそれぞれ関連付けられた重みが小さい順に、前記不揮発性メモリに送出することをさらに具備する請求項11に記載の制御方法。
【請求項13】
前記不揮発性メモリは、リードコマンド、消去コマンド、およびプログラムコマンドを実行するように構成され、前記リードコマンドの実行に要する時間は、消去/プログラムコマンドの実行に要する時間よりも短い、請求項8記載の制御方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、不揮発性メモリを制御する技術に関する。
【背景技術】
【0002】
近年、不揮発性メモリを備えるメモリシステムが広く普及している。このようなメモリシステムの一つとして、NAND型フラッシュメモリを備えるソリッドステートドライブ(SSD)が知られている。
【0003】
SSDは、データセンターのサーバのような様々なホスト計算機システムのストレージデバイスとして使用されている。
【0004】
SSDのようなストレージデバイスにおいては、不揮発性メモリに対するアクセスを柔軟に制御可能にするための新たな技術の実現が必要とされている。
【先行技術文献】
【特許文献】
【0005】
【発明の概要】
【発明が解決しようとする課題】
【0006】
本発明が解決しようとする課題は、不揮発性メモリに対するアクセスを柔軟に制御可能なメモリシステムおよび制御方法を提供することである。
【課題を解決するための手段】
【0007】
実施形態によれば、メモリシステムは、不揮発性メモリと、前記不揮発性メモリに電気的に接続されたコントローラとを具備する。前記コントローラは、累積重みに基づいて、前記不揮発性メモリに送出すべきリードコマンドそれぞれを受け付けるための第1の入力と、前記不揮発性メモリに送出すべき消去コマンドそれぞれと前記不揮発性メモリに送出すべきプログラムコマンドそれぞれとを受け付けるための第2の入力のうちから、コマンドが実行されるべき高優先度の入力を選択し、前記選択した高優先度の入力に対応する一つのコマンドの実行を開始し、前記一つのコマンドに関連付けられた重みを使用して前記累積重みを更新する。前記第1の入力および前記第2の入力のうちの一方の入力の一つのコマンドの実行が開始された場合、前記累積重みは、前記一方の入力の前記一つのコマンドに関連付けられた重みを前記累積重みから減算することによって得られる値に更新され、前記第1の入力および前記第2の入力のうちの他方の入力の一つのコマンドの実行が開始された場合、前記累積重みは、前記他方の入力の前記一つのコマンドに関連付けられた重みを前記累積重みに加算することによって得られる値に更新される。前記累積重みの値が第1の値よりも大きいという第1条件を満たしている間は、前記一方の入力が前記高優先度の入力として選択され、前記累積重みの値が前記第1の値よりも小さいという第2条件を満たしている間は、前記他方の入力が前記高優先度の入力として選択される。前記コントローラは、前記不揮発性メモリにおいて実行されているコマンドが一つの消去/プログラムコマンドであり、且つ前記累積重みの値が、前記第1条件および前記第2条件のうち、前記第1の入力が前記高優先度の入力として選択される一方の条件を満たしている場合、前記不揮発性メモリにサスペンドコマンドを送信することによって前記一つの消去/プログラムコマンドの実行を中断する。前記コントローラは、前記第1の入力の一つのリードコマンドの実行を開始する動作と、前記一つリードコマンドに関連付けられた重みを使用して前記累積重みを更新する動作とを、前記第1の入力からリードコマンドがなくなるか、または前記累積重みが前記一方の条件を満たさなくなるまで繰り返し実行してから、中断されている前記一つの消去/プログラムコマンドの実行を再開する。
【図面の簡単な説明】
【0008】
【
図1】実施形態に係るメモリシステムとホストとの関係を示すブロック図。
【
図2】実施形態のメモリシステムとホストとの間の役割分担を説明するための図。
【
図3】実施形態のメモリシステムの構成例を示すブロック図。
【
図4】実施形態に係るメモリシステムにおいて使用される、複数のチャンネルと複数のNAND型フラッシュメモリダイとの関係を示すブロック図。
【
図5】実施形態のメモリシステム内のスケジューラによって実行されるスケジューリング動作を示す図。
【
図6】スケジューラの第1の入力(input#0)のリードコマンドの実行が開始された場合に実行されるバーチャルタイム(VT)更新動作と、スケジューラの第2の入力(input#1)の消去/プログラムコマンドの実行が開始された場合に実行されるVT更新動作とを示す図。
【
図7】VTの値に基づいて、input#0とinput#1から、コマンドが実行されるべき高優先度の入力を選択する動作を示す図。
【
図8】input#0のリードコマンドの実行後にinput#1のプログラムコマンドを実行する動作を示す図。
【
図9】input#1のプログラムコマンドの実行を中断し、プログラムコマンドの実行が中断されている間にinput#0のリードコマンドを実行する動作を示す図。
【
図10】input#1のプログラムコマンドの実行を中断し、プログラムコマンドの実行が中断されている間にinput#0の複数のリードコマンドを実行する動作を示す図。
【
図11】input#1のプログラムコマンドの実行を複数回中断する動作を示す図。
【
図12】実施形態に係るメモリシステムにおいて実行されるスケジューリング動作の基本的な手順を示すフローチャート。
【
図13】
図12のスケジューリング動作においてVTに応じて実行される入力選択動作の手順を示すフローチャート。
【
図14】
図12のスケジューリング動作において実行されるサスペンド動作の手順を示すフローチャート。
【
図15】サスペンド動作と再開動作とを含むスケジューリング動作の手順の一部分を示すフローチャート。
【
図16】サスペンド動作と再開動作とを含むスケジューリング動作の手順の残り部分を示すフローチャート。
【発明を実施するための形態】
【0009】
以下、図面を参照して、実施形態を説明する。
まず、
図1を参照して、本実施形態に係るメモリシステムとホストとの関係を説明する。
【0010】
このメモリシステムは、不揮発性メモリにデータを書き込み、不揮発性メモリからデータを読み出すように構成された半導体ストレージデバイスである。このメモリシステムは、NAND型フラッシュメモリを含むフラッシュストレージデバイス3として実現されている。
【0011】
ホスト(ホストデバイス)2は、複数のフラッシュストレージデバイス3を制御するように構成されている。ホスト2は、複数のフラッシュストレージデバイス3を含むフラッシュアレイをストレージとして使用するように構成された情報処理装置によって実現されている。この情報処理装置はパーソナルコンピュータであってもよいし、サーバコンピュータであってもよい。
【0012】
なお、フラッシュストレージデバイス3は、ストレージアレイ内に設けられた複数のストレージデバイスの一つとして利用されてもよい。ストレージアレイは、サーバコンピュータのような情報処理装置にケーブルまたはネットワークを介して接続されてもよい。ストレージアレイは、このストレージアレイ内の複数のストレージデバイスを制御するコントローラを含む。フラッシュストレージデバイス3がストレージアレイ内の一つのストレージデバイスとして適用された場合には、このストレージアレイのコントローラが、フラッシュストレージデバイス3のホストとして機能してもよい。
【0013】
以下では、サーバコンピュータのような情報処理装置がホスト2として機能する場合を例示して説明する。
【0014】
ホスト(サーバ)2と複数のフラッシュストレージデバイス3は、インタフェース50を介して相互接続される(内部相互接続)。この相互接続のためのインタフェース50としては、これに限定されないが、PCI Express(PCIe)(登録商標)、NVM Express(NVMe)(登録商標)、Ethernet(登録商標)、NVMe over Fabrics(NVMeOF)等を使用し得る。
【0015】
ホスト2として機能するサーバコンピュータの典型例としては、データセンター内のサーバコンピュータ(以下、サーバと称する)が挙げられる。
【0016】
ホスト2がデータセンター内のサーバによって実現されるケースにおいては、このホスト(サーバ)2は、ネットワーク60を介して複数のエンドユーザ端末(クライアント)61に接続されてもよい。ホスト2は、これらエンドユーザ端末61に対して様々なサービスを提供することができる。
【0017】
ホスト(サーバ)2によって提供可能なサービスの例には、(1)システム稼働プラットフォームを各クライアント(各エンドユーザ端末61)に提供するプラットホーム・アズ・ア・サービス(PaaS)、(2)仮想サーバのようなインフラストラクチャを各クライアント(各エンドユーザ端末61)に提供するインフラストラクチャ・アズ・ア・サービス(IaaS)、等がある。
【0018】
複数の仮想マシンが、このホスト(サーバ)2として機能する物理サーバ上で実行されてもよい。ホスト(サーバ)2上で走るこれら仮想マシンの各々は、この仮想マシンに対応するクライアント(エンドユーザ端末61)に各種サービスを提供するように構成された仮想サーバとして機能することができる。各仮想マシンにおいては、この仮想マシンに対応するエンドユーザ端末61によって使用される、オペレーティングシステムおよびユーザアプリケーションが実行される。
【0019】
ホスト(サーバ)2においては、フラッシュトランスレーションレイヤ(ホストFTL)も実行される。このホストFTLは、アクセス対象のデータを識別するためのデータ識別子(タグ)それぞれとフラッシュストレージデバイス3内の不揮発性メモリの物理アドレスそれぞれとの間のマッピングを管理するアドレス変換テーブルであるルックアップテーブル(LUT)を含む。ホストFTLは、このLUTを使用することによって、フラッシュストレージデバイス3内の不揮発性メモリ上のデータ配置を知ることができる。
【0020】
フラッシュストレージデバイス3は、NAND型フラッシュメモリのような不揮発性メモリを含む。不揮発性メモリは、各々が複数のページを含む複数のブロックを含む。これらブロックの各々は、データを消去するデータ消去動作の単位である。データ消去動作は「消去動作」または「ブロック消去」としても参照される。各ブロックに含まれる複数のページの各々は、不揮発性メモリにデータを書き込むデータ書き込み動作、および不揮発性メモリからデータを読み出すデータ読み出し動作の単位である。
【0021】
フラッシュストレージデバイス3は、ローレベルアブストラクションを実行することができる。ローレベルアブストラクションは不揮発性メモリのアブストラクションのための機能である。ローレベルアブストラクションは、データ配置を補助する機能等を含む。データ配置を補助する機能の例は、ホスト2からのユーザデータが書き込まれるべき書き込み先ブロックを割り当てる機能、ユーザデータの書き込み先位置(書き込み先ブロック、この書き込み先ブロック内の位置)を決定する機能、ユーザデータが書き込まれたこの書き込み先位置を示す物理アドレス(ブロックアドレス、ブロック内オフセット)を上位階層(ホスト2)に通知する機能、等を含む。
【0022】
ブロックアドレスは、不揮発性メモリ内に含まれる複数のブロックのうちの特定の一つのブロックを識別するためのブロック識別子である。不揮発性メモリが複数の不揮発性メモリダイを含む場合には、ブロックアドレスは、ダイ識別子とブロックアドレスとの組み合わせによって表される。あるいは、各不揮発性メモリダイが複数のブレーンを含む場合には、ブロックアドレスは、ダイ識別子と、ブレーン識別子と、ブロックアドレスとの組み合わせによって表される。
【0023】
また、データ配置を補助する機能の例は、不揮発性メモリに既に書き込まれているユーザデータがコピーされるべきコピー先ブロックを割り当てる機能、ユーザデータのコピー先位置(コピー先ブロック、このコピー先ブロック内の位置)を決定する機能、ユーザデータがコピーされたこのコピー先位置を示す物理アドレス(ブロックアドレス、ブロック内オフセット)を上位階層(ホスト2)に通知する機能、等を含んでいてもよい。
【0024】
フラッシュストレージデバイス3は、ホスト2からの様々なコマンドを実行する。これらコマンドには、フラッシュストレージデバイス3内の不揮発性メモリにデータを書き込むためのライトコマンド、不揮発性メモリからデータを読み出すためのリードコマンド、不揮発性メモリに既に書き込まれているデータを不揮発性メモリ内の別の記憶位置にコピーするコピーコマンド、等が含まれる。
【0025】
図2はフラッシュストレージデバイス3とホスト2との間の役割分担を示す。
【0026】
ホスト(サーバ)2においては、複数のエンドユーザにそれぞれ対応する複数の仮想マシン401が実行される。各仮想マシン401においては、対応するエンドユーザによって使用される、オペレーティングシステムおよびユーザアプリケーション402が実行される。
【0027】
また、ホスト(サーバ)2においては、複数のユーザアプリケーション402にそれぞれ対応する複数のI/Oサービス403が実行される。これらI/Oサービス403には、論理ブロックアドレス(LBA)ベースのブロックI/Oサービス、キー・バリュー・ストアサービスなどが含まれてもよい。各I/Oサービス403は、タグそれぞれとフラッシュストレージデバイス3の物理アドレスそれぞれとの間のマッピングを管理するルックアップテーブル(LUT)を含む。
【0028】
ここで、タグとは、アクセス対象のデータを識別するためのデータ識別子を意味する。例えば、LBAのような論理アドレスがタグとして使用される。あるいは、ユーザアドレス(例えば、キー・バリュー・ストアのキー、またはこのキーのハッシュ値、等)がタグとして利用されてもよい。
【0029】
フラッシュストレージデバイス3の物理アドレスは、フラッシュストレージデバイス3に含まれる不揮発性メモリ内の物理記憶位置を特定するためのアドレスである。
【0030】
LBAベースのブロックI/Oサービスにおいては、論理アドレス(LBA)それぞれとフラッシュストレージデバイス3の物理アドレスそれぞれとの間のマッピングを管理するLUTが使用されてもよい。
【0031】
一方、キー・バリュー・ストアサービスにおいては、キー(またはキーのハッシュ値)それぞれとこれらキーに対応するデータが格納されているフラッシュストレージデバイス3の物理アドレスそれぞれとこれらキーに対応するデータそれぞれのデータ長との間のマッピングを管理するLUTが使用されてもよい。
【0032】
各エンドユーザは、使用すべきアドレッシング方法(LBA、キー・バリュー・ストアのキー、このキーのハッシュ値、等)を選択することができる。
【0033】
ホスト(サーバ)2においては、複数の仮想マシン401にそれぞれ対応する複数のライトバッファ(WB)404が管理されている。あるユーザアプリケーション402からのライトデータは、このユーザアプリケーション402に対応する仮想マシン401用のライトバッファ(WB)404に一時的に格納される。
【0034】
ホスト(サーバ)2からフラッシュストレージデバイス3へのコマンドの送信およびフラッシュストレージデバイス3からホスト(サーバ)2へのコマンド完了のレスポンス等の返送は、ホスト(サーバ)2およびフラッシュストレージデバイス3の各々に存在するI/Oキュー500を介して実行される。
【0035】
フラッシュストレージデバイス3は、フラッシュストレージデバイス3内の不揮発性メモリを論理的に分割することによって得られる複数の領域それぞれをQoSドメイン601として管理する。これらQoSドメイン601の各々は、不揮発性メモリに含まれる複数のブロックの部分集合である。不揮発性メモリに含まれる複数のブロックの各々は一つのQoSドメイン601のみに属し、同じブロックが異なるQoSドメイン601に同時に属することはない。
【0036】
これらQoSドメイン601は、QoSドメインIDと称される識別子によってそれぞれ識別される。これらQoSドメインIDは、これら複数の領域(複数のQoSドメイン)をそれぞれアクセスするための複数の識別子として使用される。
【0037】
本実施形態においては、ホスト2から発行される各ライトコマンド(ライト要求)は、例えば、QoSドメインIDと、ライトデータのタグ(例えば、ライトデータのLBA)と、ライトデータの長さと、ライトデータが格納されているホスト2のメモリ内の位置を示すバッファアドレスとを指定する。ホスト2のメモリは、以下では、単にホストメモリとしても参照される。
【0038】
ホスト2からライトコマンドを受信した場合、フラッシュストレージデバイス3は、ライトコマンドによって指定されたQoSドメインIDに対応するQoSドメインに含まれるフリープロック群のうちの一つのフリーブロックを選択し、この選択したフリーブロックに対する消去動作(データ消去動作)を実行し、そして消去動作が実行されたフリーブロックを、このQoSドメイン用の新たな書き込み先ブロックとして割り当てる。
【0039】
ここで、書き込み先ブロックとは、データが書き込まれるべきブロックを意味する。このQoSドメイン用の書き込み先ブロックが既に割り当てられている場合には、このQoSドメイン用の新たな書き込み先ブロックを割り当てる処理の実行は不要である。
【0040】
フラッシュストレージデバイス3は、ホスト2から受信したライトコマンドに関連付けられたライトデータをホストメモリから取得し、取得したライトデータをこのQoSドメイン用に新たに割り当てられた書き込み先ブロック(またはこのQoSドメイン用に既に割り当てられている書き込み先ブロック)に書き込む。
【0041】
この場合、フラッシュストレージデバイス3は、ホスト2から受信したライトデータを、このライトデータのタグ(例えば、ライトデータのLBA)と一緒に書き込み先ブロックに書き込む。
【0042】
受信したライトコマンドに関連付けられたライトデータが書き込み先ブロックに書き込まれると、フラッシュストレージデバイス3は、このデータのタグと、このデータの長さと、このデータが書き込まれた物理記憶位置を示す物理アドレス(ブロックアドレス、ブロック内オフセット)とをホスト2にアドレス記録要求として送信する。アドレス記録要求は、データが書き込まれた物理記憶位置を示す物理アドレスをホスト2に通知するための物理アドレス通知メッセージとして使用される。
【0043】
フラッシュストレージデバイス3からのアドレス記録要求の受信に応じて、ホスト2は、このデータのLBAのようなタグにこの物理アドレスが関連付けられるようにホスト2のLUT(論理物理アドレス変換テーブル)を更新する。
【0044】
ホスト2は、フラッシュストレージデバイス3の不揮発性メモリの物理記憶位置それぞれに格納されているデータが有効データまたは無効データのいずれであるかを、LUTを使用して管理することができる。ここで、有効データとは、LBAのようなタグに関連付けられている最新のデータを意味する。つまり、ホスト2のLUT(論理物理アドレス変換テーブル)から最新のデータとしてリンクされているデータは有効データである。また、無効データとは、LBAのようなタグに関連付けられていないデータを意味する。ホスト2のLUTからリンクされていないデータは無効データである。例えば、あるLBAに対応する更新データがフラッシュストレージデバイス3に書き込まれた場合には、このLBAに対応する以前のデータは無効データとなる。
【0045】
ホスト2から発行される各リードコマンド(リード要求)は、例えば、読み出し対象データが格納されている物理記憶位置を示す物理アドレス(ブロックアドレス、ブロック内オフセット)と、読み出し対象データの長さと、読み出し対象データが転送されるべきホストメモリ内の位置を示すバッファアドレスと、を指定する。
【0046】
ホスト2からリードコマンドを受信した場合、フラッシュストレージデバイス3は、受信したリードコマンドによって指定される物理アドレスによって示される不揮発性メモリ内の物理記憶位置から読み出し対象データを読み出し、読み出した読み出し対象データを、受信したリードコマンドによって指定されるバッファアドレスによって示されるホストメモリ内の位置に転送する。
【0047】
ホスト2から発行される各コピーコマンド(コピー要求)は、例えば、コピー元ブロックを示す物理アドレス(つまりコピー元ブロックのブロックアドレス)、コピー先ブロックを示す物理アドレス(つまりコピー先ブロックのブロックアドレス)、コピー元ブロックに対応するバリッドビットマップを示す。
【0048】
バリッドビットマップは、コピー元ブロック内の複数の物理記憶位置にそれぞれ対応する複数のビットを含む。これら複数のビットの各々は、このビットに対応する物理記憶位置に有効データが存在するか否かを示す。換言すれば、バリッドビットマップは、コピー元ブロックに格納されているデータそれぞれが有効データまたは無効データのいずれであるかを示す。
【0049】
ホスト2からコピーコマンドを受信したことに応じて、フラッシュストレージデバイス3は、バリッドビットマップに基づいて、コピー元ブロックに格納されている各有効データを特定し、コピー元ブロックに格納されている各有効データをコピー先ブロックにコピーする。この場合、フラッシュストレージデバイス3は、コピー元ブロックに格納されている各有効データを、各有効データに対応するタグ(例えば、有効データのLBA)と一緒に、コピー先ブロックにコピーする。
【0050】
そして、フラッシュストレージデバイス3は、例えば、コピーされた各有効データのタグ(例えばLBA)と、各有効データの長さと、各有効データのコピー元物理アドレスと、各有効データのコピー先物理アドレスとを指定するアドレス変更要求を、ホスト2に送信する。
【0051】
図3は、フラッシュストレージデバイス3の構成例を示す。
【0052】
フラッシュストレージデバイス3は、コントローラ4および不揮発性メモリ(例えばNAND型フラッシュメモリ5)を備える。フラッシュストレージデバイス3は、ランダムアクセスメモリ、例えば、DRAM6も備えていてもよい。
【0053】
NAND型フラッシュメモリ5は、マトリクス状に配置された複数のメモリセルを含むメモリセルアレイを含む。NAND型フラッシュメモリ5は、2次元構造のフラッシュメモリであってもよいし、3次元構造のフラッシュメモリであってもよい。
【0054】
NAND型フラッシュメモリ5のメモリセルアレイは、複数のブロックBLK0~BLKm-1を含む。ブロックBLK0~BLKm-1の各々は複数のページ(ここではページP0~Pn-1)を含む。ブロックBLK0~BLKm-1の各々は、データ消去動作の単位として機能する。ブロックは、「消去ブロック」、「物理ブロック」、または「物理消去ブロック」と称されることもある。ページP0~Pn-1の各々は、データ書き込み動作およびデータ読み込み動作の各々の単位である。
【0055】
コントローラ4は、ToggleNANDフラッシュインタフェース、オープンNANDフラッシュインタフェース(ONFI)のような、NANDインタフェース13を介して、不揮発性メモリであるNAND型フラッシュメモリ5に電気的に接続されている。コントローラ4は、NAND型フラッシュメモリ5を制御するように構成されたメモリコントローラとして動作する。このコントローラ4は、System-on-a-chip(SoC)のような回路によって実現されてもよい。
【0056】
NAND型フラッシュメモリ5は、
図4に示すように、複数のNAND型フラッシュメモリダイ(NAND型フラッシュメモリチップ)を含んでいてもよい。個々のNAND型フラッシュメモリダイは独立して動作可能である。このため、NAND型フラッシュメモリダイは、並列動作可能な単位として動作する。
図4においては、NANDインタフェース13に16個のチャンネルCh.0~Ch.15が接続されており、16個のチャンネルCh.0~Ch.15の各々に2つのNAND型フラッシュメモリダイが接続されている場合が例示されている。
【0057】
この場合、チャンネルCh.0~Ch.15に接続された16個のNAND型フラッシュメモリダイ#0~#15がバンク#0として編成されてもよく、またチャンネルCh.0~Ch.15に接続された残りの16個のNAND型フラッシュメモリダイ#16~#31がバンク#1として編成されてもよい。
【0058】
バンクは、複数のメモリダイをバンクインタリーブによって並列動作させるための単位として機能する。
図4の構成例においては、16個のチャンネルと、2つのバンクを使用したバンクインタリーブとによって、最大32個のNAND型フラッシュメモリダイを並列動作させることができる。
【0059】
データ消去動作およびブロック割り当て動作は、一つのブロックの単位で実行される。この場合、一つのブロックは一つの物理ブロックであってもよいし、並列動作可能な複数の物理ブロックの集合を含む一つのブロックグループであってもよい。ブロックグループはスーパーブロックとしても参照される。
【0060】
一つのブロックグループ、つまり複数の物理ブロックの集合を含む一つのスーパーブロックは、これに限定されないが、NAND型フラッシュメモリダイ#0~#31から一つずつ選択される計32個の物理ブロックを含んでいてもよい。なお、NAND型フラッシュメモリダイ#0~#31の各々はマルチプレーン構成を有していてもよい。例えば、NAND型フラッシュメモリダイ#0~#31の各々が、2つのプレーン(プレーン#0、プレーン#1)を含むマルチプレーン構成を有する場合には、NAND型フラッシュメモリ5に含まれるプレーンの総数は64個である。一つのスーパーブロックはNAND型フラッシュメモリ5に含まれるこれら64個のプレーンから一つずつ選択される計64個の物理ブロックを含んでいてもよい。
【0061】
一つのスーパーブロックにデータを書き込む動作においては、NAND型フラッシュメモリダイ#0~#31それぞれに対するデータ書き込み動作が並列に実行される。これにより、例えば、32ページ分のライトデータ(プレーン#0、プレーン#1を含むマルチプレーン構成を有する場合には、64ページ分のライトデータ)をNAND型フラッシュメモリ5内のNAND型フラッシュメモリダイ#1~#32に書き込む動作を並列に実行することができる。
【0062】
次に、
図3のコントローラ4の構成について説明する。
コントローラ4は、ホストインタフェース11、CPU12、NANDインタフェース13、DRAMインタフェース14、ダイレクトメモリアクセスコントローラ(DMAC)15、ECCエンコード/デコード部16、等を含む。これらホストインタフェース11、CPU12、NANDインタフェース13、DRAMインタフェース14、DMAC15、ECCエンコード/デコード部16は、バス10を介して相互接続される。
【0063】
ホストインタフェース11は、ホスト2との通信を実行するように構成されたホストインタフェース回路である。このホストインタフェース11は、例えば、PCIeコントローラ(NVMeコントローラ)であってもよい。あるいは、フラッシュストレージデバイス3がEthernet(登録商標)を介してホスト2に接続される構成においては、ホストインタフェース11は、NVMe over Fabrics(NVMeOF)コントローラであってもよい。
【0064】
ホストインタフェース11は、ホスト2から様々なコマンドを受信する。これらコマンドには、上述したライトコマンド、リードコマンド、コピーコマンド、等が含まれる。
【0065】
CPU12は、ホストインタフェース11、NANDインタフェース13、DRAMインタフェース14、DMAC15、ECCエンコード/デコード部16を制御するように構成されたプロセッサである。CPU12は、フラッシュストレージデバイス3の電源オンに応答してNAND型フラッシュメモリ5または図示しないROMから制御プログラム(ファームウェア)をDRAM6にロードし、そしてこのファームウェアを実行することによって様々な処理を行う。
【0066】
CPU12は、ホスト2からの様々なコマンドを処理するためのコマンド処理等を実行することができる。コマンド処理においては、CPU12は、ホスト2から受信した各ライトコマンドおよび各リードコマンドに基づいて、NAND型フラッシュメモリ5にデータを書き込むライト制御動作、NAND型フラッシュメモリ5からデータを読み出すリード制御動作を制御する。
【0067】
さらに、上述のコピーコマンドを実行するために、CPU12は、一つ以上コピー元ブロックから有効データをコピー対象データとして読み出すためのリード制御動作と、コピー対象データをコピー先ブロックに書き込むためのライト制御動作とを実行する。
【0068】
また、CPU12は、必要に応じて、NAND型フラッシュメモリ5内の各ブロックに対するデータ消去動作の実行も制御する。
【0069】
CPU12の動作は、上述のファームウェアによって制御される。なお、コマンド処理の一部または全部は、コントローラ4内の専用ハードウェアによって実行してもよい。
【0070】
さらに、CPU12は、スケジューラ21およびサスペンドマネージャ22として機能することができる。なお、スケジューラ21およびサスペンドマネージャ22の各々の一部または全部も、コントローラ4内の専用ハードウェアによって実現されてもよい。
【0071】
スケジューラ21は、NAND型フラッシュメモリ5へアクセスするための複数のコマンドを受け付け、これらコマンドのうちから、NAND型フラッシュメモリ5に送出すべきコマンドを決定するスケジューリング動作を行う。
【0072】
NAND型フラッシュメモリ5へのアクセスには、NAND型フラッシュメモリ5にデータを書き込むライト動作(プログラム動作)、NAND型フラッシュメモリ5からデータを読み出す読み出し動作、NAND型フラッシュメモリ5に既に書き込まれているデータをブロック単位で消去するデータ消去動作が含まれる。
【0073】
したがって、NAND型フラッシュメモリ5へアクセスするためにNAND型フラッシュメモリ5に送出されるべきコマンドは、消去コマンド、プログラムコマンド、リードコマンドに大別される。
【0074】
コントローラ4において、ホスト2から受信した各ライトコマンドは、NAND型フラッシュメモリ5に送出すべきプログラムコマンドとしてスケジューラ21に送られる。ホスト2から受信した各リードコマンドは、NAND型フラッシュメモリ5に送出すべきリードコマンドとしてスケジューラ21に送られる。
【0075】
また、コントローラ4においては、ホスト2から受信した各コピーコマンドに対応するデータ読み出し動作およびデータ書き込み動作を実行するためのリードコマンドおよびプログラムコマンドが生成される。コントローラ4によって生成されるリードコマンドおよびプログラムコマンドも、NAND型フラッシュメモリ5に送出すべきリードコマンドおよびプログラムコマンドとしてスケジューラ21に送られる。
【0076】
また、書き込み先ブロックを割り当てる動作において、コントローラ4は、フリーブロックに対する消去動作を実行するための消去コマンドを生成する。コントローラ4によって生成される消去コマンドは、NAND型フラッシュメモリ5に送出すべき消去コマンドとしてスケジューラ21に送られる。
【0077】
この消去コマンドはデータをブロック単位で消去する消去動作を実行するために使用される。プログラムコマンドはホスト2から受信したライトデータまたはホスト2からのコピーコマンドによって指定されたコピー対象データをNAND型フラッシュメモリ5に書き込むために使用される。リードコマンドはホスト2から要求されたリード対象データまたはホスト2からのコピーコマンドによって指定されたコピー対象データをNAND型フラッシュメモリ5から読み出すために使用される。
【0078】
このように、NAND型フラッシュメモリ5は、リードコマンド、消去コマンド、およびプログラムコマンドを実行するように構成されている。
【0079】
NAND型フラッシュメモリ5においては、リードコマンド(読み出し動作)の実行に要する時間は、消去コマンド(消去動作)またはプログラムコマンド(プログラム動作)の実行に要する時間よりも短い。
【0080】
リードコマンド(読み出し動作)の実行に要する時間は、例えば、数十μs~100μsである。消去コマンド(消去動作)またはプログラムコマンド(プログラム動作)の実行に要する時間は、例えば、1ms~数msである。
【0081】
このように、一つの消去/プログラムコマンド(一つの消去コマンドまたは一つのプログラムコマンド)の実行に要する時間は、一つのリードコマンドの実行に要する時間の10倍から数十倍である。
【0082】
また、ホスト2は、NAND型フラッシュメモリ5の総アクセス時間を読み出し動作とプログラム動作とに所定の比率で配分すべきことをフラッシュストレージデバイス3に要求する場合がある。
【0083】
例えば、ホスト2が、NAND型フラッシュメモリ5の総アクセス時間の50パーセントの時間を読み出し動作のために割り当て、残りの時間をプログラム動作に割り当てることを要求する場合、つまり読み出し動作とプログラム動作との間の時間配分を1:1にすることを要求する場合を想定する。一つのリードコマンドの実行に要する時間が100μsであり、一つのプログラムコマンドの実行に要する時間が3msであるケースにおいては、一つのプログラムコマンドの実行に要する時間は一つのリードコマンドの実行に要する時間の30倍である。したがって、この場合には、スケジューラ21は、リードコマンドがプログラムコマンドの30倍の頻度で実行されるようにスケジューリング動作を行う。これにより、読み出し動作とプログラム動作との間の時間配分を1:1にすることができる。
【0084】
また、ホスト2は、読み出し動作と消去動作とプログラム動作との間の時間配分を1:1:1にすることを要求する場合もあり得る。一つのリードコマンドの実行に要する時間が100μsであり、一つの消去コマンドの実行に要する時間が1msであり、一つのプログラムコマンドの実行に要する時間が3msであるケースにおいては、一つの消去コマンドの実行に要する時間は一つのリードコマンドの実行に要する時間の10倍であり、一つのプログラムコマンドの実行に要する時間は一つのリードコマンドの実行に要する時間の30倍である。したがって、スケジューラ21は、リードコマンドが消去コマンドの10倍の頻度で実行され、且つリードコマンドがプログラムコマンドの30倍の頻度で実行されようにスケジューリング動作を行う。これにより、読み出し動作と消去動作とプログラム動作との間の時間配分を1:1:1にすることができる。
【0085】
さらに、ホスト2は、リードコマンドのレイテンシー(リードレイテンシー)の変動量をある値以下に抑えるべきことをフラッシュストレージデバイス3に要求する場合がある。
【0086】
したがって、本実施形態では、一つの消去/プログラムコマンド(つまり、一つの消去コマンドまたは一つのプログラムコマンド)の実行に要する時間が一つのリードコマンドの実行に要する時間の10倍から数十倍であることを考慮し、スケジューラ21は、NAND型フラッシュメモリ5に送出すべきリードコマンドそれぞれを受け付けるための第1の入力と、NAND型フラッシュメモリ5に送出すべき消去コマンドそれぞれとNAND型フラッシュメモリ5に送出すべきプログラムコマンドそれぞれとを受け付けるための第2の入力のうちから、コマンドが実行されるべき高優先度の入力を選択する、というスケジューリング動作を行う。
【0087】
ここで、コマンドの実行とは、このコマンドに対応する動作を実行するためのコマンドシーケンスをNAND型フラッシュメモリ5に送信することによってこのコマンドに対応する動作をNAND型フラッシュメモリ5に実行させることを意味する。
【0088】
スケジューラ21は、このスケジューリング動作を制御するために、累積重みを管理する。累積重みは、第1の入力(第1コマンドグループ)と第2の入力(第2コマンドグループ)との間の優先順位を定めるために使用されるバラメータである。累積重みは、実行が開始された各コマンドに関連付けられた重みを使用して更新される。
【0089】
例えば、まず、累積重みが第1の値(例えば、初期値)よりも大きい場合に第1の入力(第1コマンドグループ)を高優先度の入力(コマンドグループ)として選択し、累積重みが初期値よりも小さい場合に第2の入力(第2コマンドグループ)を高優先度の入力(コマンドグループ)として選択するというポリシー(ポリシー#1)を利用するケースについて説明する。
【0090】
この場合、累積重みは、第1の入力の一つのリードコマンドの実行が開始された場合、一つのリードコマンドに関連付けられた重みをこの累積重みから減算することによって得られる値に更新される。
【0091】
また、第2の入力の一つの消去/プログラムコマンドの実行が開始された場合には、累積重みは、この一つの消去/プログラムコマンドに関連付けられた重みをこの累積重みに加算することによって得られる値に更新される。
【0092】
累積重みの値が第1の値よりも大きいという第1条件を満たしている間は、第1の入力が高優先度の入力として選択される。つまり、累積重みの値が第1の値よりも大きい間は、第1の入力に入力される各リードコマンドが第2の入力に入力される各消去コマンドおよび各プログラムコマンドよりも優先して実行される。一方、累積重みの値が第1の値よりも小さいという第2条件を満たしている間は、第2の入力が高優先度の入力として選択される。つまり、累積重みの値が第1の値よりも小さい間は、第2の入力に入力される各消去コマンドおよび各プログラムコマンドが第1の入力に入力される各リードコマンドよりも優先して実行される。
【0093】
したがって、例えば、各リードコマンドに関連付けられた重みを小さな値に設定した場合には、たとえ第1の入力が高優先度の入力として一旦選択されても、累積重みは僅かしか減少されない。第1の入力の一つのリードコマンドの実行が開始されても、累積重みは僅かに減少するだけであるので、累積重みは第1の値よりも大きい値に維持されやすくなり、この結果、第1の入力が高優先度の入力として再び選択されやすくなる。
【0094】
また、各消去/プログラムコマンドに関連付けられた重みを大きな値に設定した場合には、第2の入力が高優先度の入力として一旦選択されると、累積重みは大きく増加される。したがって、各消去/プログラムコマンドに関連付けられた重みを大きな値に設定した場合には、第2の入力が高優先度の入力として一旦選択されると、累積重みが大きく増加され、これによってしばらくの間は、第2の入力は高優先度の入力として選択され難くなる。
【0095】
よって、例えば、各リードコマンドに関連付けられた重みを1に設定し、且つ各消去/プログラムコマンドに関連付けられた重みを30に設定した場合には、第1の入力に入力されるリードコマンドを、第2の入力に入力される消去/プログラムコマンドの30倍の頻度で実行することが可能となる。
【0096】
なお、累積重みが第1の値に等しい場合には、第1の入力のリードコマンドと第2の入力の消去/プログラムコマンドのどちらが実行されてもよい。また、たとえ累積重みが第1の値よりも小さい場合であっても、第2の入力に消去/プログラムコマンドが入力されていない場合には、第1の入力のリードコマンドが実行される。同様に、たとえ累積重みが第1の値よりも大きい場合であっても、第1の入力にリードコマンドが入力されていない場合には、第2の入力の消去/プログラムコマンドが実行される。
【0097】
また、累積重みの値がある上限値に達した後は、たとえ新規の消去/プログラムコマンドの実行が開始されても、累積重みの値は増加されず、累積重みの値は上限値に維持される。同様に、累積重みの値がある下限値に達した後は、たとえ新規のリードコマンドの実行が開始されても、累積重みの値は減少されず、累積重みの値は下限値に維持される。
【0098】
これまでの説明ではポリシー#1を利用する場合を説明したが、ポリシー#1を利用する代わりに、ポリシー#2が利用されてもよい。
【0099】
ポリシー#2では、累積重みが初期値(例えば、0)よりも小さい場合に第1の入力(第1のコマンドグループ)が高優先度の入力(高優先度のコマンドグループ)として選択され、累積重みが初期値よりも大きい場合に第2の入力(第2のコマンドグループ)が高優先度の入力(高優先度のコマンドグループ)として選択される。
【0100】
ポリシー#2が利用されるケースにおいては、累積重みは、第1の入力の一つのリードコマンドの実行が開始された場合、一つのリードコマンドに関連付けられた重みをこの累積重みに加算することによって得られる値に更新される。また、第2の入力の一つの消去/プログラムコマンドの実行が開始された場合には、累積重みは、この一つの消去/プログラムコマンドに関連付けられた重みをこの累積重みから減算することによって得られる値に更新される。
【0101】
また、ポリシー#2が利用されるケースにおいては、累積重みの値が第1の値よりも小さいという第2条件を満たしている間は、第1の入力が高優先度の入力として選択される。つまり、累積重みの値が第1の値よりも小さい間は、第1の入力に入力される各リードコマンドが第2の入力に入力される各消去コマンドおよび各プログラムコマンドよりも優先して実行される。
【0102】
一方、累積重みの値が第1の値よりも大きいという第1条件を満たしている間は、第2の入力が高優先度の入力として選択される。つまり、累積重みの値が第1の値よりも大きい間は、第2の入力に入力される各消去/プログラムコマンドが第1の入力に入力される各リードコマンドよりも優先して実行される。
【0103】
このように、第1の入力および第2の入力のうちの一方の入力の一つのコマンドの実行が開始された場合には、累積重みは、一方の入力の一つのコマンドに関連付けられた重みを累積重みから減算することによって得られる値に更新される。また、第1の入力および第2の入力のうちの他方の入力の一つのコマンドの実行が開始された場合には、累積重みは、他方の入力の一つのコマンドに関連付けられた重みを累積重みに加算することによって得られる値に更新される。
【0104】
そして、累積重みの値が第1の値よりも大きいという第1条件を満たしている間は、一方の入力が高優先度の入力として選択され、累積重みの値が第1の値よりも小さいという第2条件を満たしている間は、他方の入力が高優先度の入力として選択される。
【0105】
第1の入力を高優先度の入力として選択する条件は、第1条件および第2条件のうちのどちらであってもよい。ここで、第1条件および第2条件のうちの一方の条件は第1の入力を高優先度の入力として選択する条件として使用され、他方の条件は第2の入力を高優先度の入力として選択する条件として使用される。
【0106】
この場合、累積重みの値が第1条件および第2条件のうちの一方の条件を満たしている間は、スケジューラ21は、第1の入力を高優先度の入力として選択する。そして、スケジューラ21は、第1の入力に入力されたリードコマンドの実行を開始し、これによってNAND型フラッシュメモリ5からのデータの読み出しを実行する。さらに、スケジューラ21は、加算または減算の一方の演算によって、このリードコマンドに関連付けられた重みを累積重みに加算または累積重みから減算し、これによって累積重みを更新する。
【0107】
累積重みの更新は、選択した入力に存在しているコマンドの実行を開始する時、例えば、コマンドが実行されるべき高優先度の入力が決定された時に実行される。
【0108】
累積重みの値が第1条件および第2条件のうちの他方の条件を満たしている間は、スケジューラ21は、第2の入力を高優先度の入力として選択する。そして、スケジューラ21は、第2の入力に入力された消去/プログラムコマンドの実行を開始し、これによってNAND型フラッシュメモリ5に格納されているデータの消去(ブロック消去)、またはNAND型フラッシュメモリ5へのデータの書き込みを実行する。さらに、スケジューラ21は、加算または減算の他方の演算によって、この消去/プログラムコマンドに関連付けられた重みを累積重みから減算または累積重みに加算し、これによって累積重みを更新する。
【0109】
例えば、第2の入力が高優先度の入力として選択された場合を想定する。第2の入力に到着したコマンドがプログラムコマンドである場合、スケジューラ21は、このプログラムコマンドに対応するプログラム動作を実行するためのコマンドシーケンスをNAND型フラッシュメモリ5に送信し、これによってNAND型フラッシュメモリ5にプログラム動作を開始させる。このコマンドシーケンスは、例えば、第1プログラムコマンド、アドレス、ライトデータ、第2プログラムコマンドを含む。第2の入力に到着したコマンドが消去コマンドである場合、スケジューラ21は、この消去コマンドに対応する消去動作を実行するためのコマンドシーケンスをNAND型フラッシュメモリ5に送信し、これによってこのコマンドシーケンスで指定されたブロックに対する消去動作をNAND型フラッシュメモリ5に開始させる。このコマンドシーケンスは、例えば、第1イレーズコマンド、アドレス、第2イレーズコマンドを含む。
【0110】
次に、第1の入力が高優先度の入力として選択された場合を想定する。スケジューラ21は、第1の入力に到着したリードコマンドに対応するリード動作を実行するためのコマンドシーケンスをNAND型フラッシュメモリ5に送信し、これによってNAND型フラッシュメモリ5にリード動作を開始させる。このコマンドシーケンスは、例えば、第1のリードコマンド、アドレス、第2のリードコマンドを含む。
【0111】
以下では、ポリシー#1が利用されるケースを例示して、スケジューリング動作を説明する。
【0112】
スケジューリング動作においては、スケジューラ21は、リードレイテンシーの変動量をある値以下に抑えるために、以下のサスペンド動作を実行する。
【0113】
サスペンド動作は、NAND型フラッシュメモリ5において実行中の消去/プログラムコマンドの実行を中断(サスペンド)し、代わりに第1の入力に入力されているリードコマンドの実行を開始する動作である。
【0114】
すなわち、NAND型フラッシュメモリ5において実行されているコマンドが第2の入力の消去/プログラムコマンド(消去コマンドまたはプログラムコマンド)であり、且つ現在の累積重みの値が第1の値よりも大きい、という条件(サスペンド条件としても参照される)を満たす場合(ポリシー#2が利用されるケースでは、現在の累積重みの値が第1の値よりも小さいという条件を満たす場合)、スケジューラ21は、NAND型フラッシュメモリ5にサスペンドコマンドを送信することによって消去コマンドまたはプログラムコマンドの実行を中断する。
【0115】
サスペンドコマンドは、NAND型フラッシュメモリダイに、実行中の動作(ここでは、消去動作、プログラム動作)を一時的に中断させて、NAND型フラッシュメモリダイを他のコマンドを受付および実行可能な状態にするためのコマンドである。
【0116】
NAND型フラッシュメモリ5、つまりNAND型フラッシュメモリ5に含まれる各NAND型フラッシュメモリダイは、消去/プログラムコマンドの実行を中断し且つこの消去/プログラムコマンドの実行の中断中に一つ以上のリードコマンドを実行する機能を有している。
【0117】
消去/プログラムコマンドの実行を中断した後、スケジューラ21は、第1の入力の一つのリードコマンドの実行を開始する動作と、この一つのリードコマンドに関連付けられた重みを使用して累積重みを更新する動作とを、第1の入力からリードコマンドがなくなるか、または累積重みが第1の値よりも大きいという条件を満たさなくなるまで(ポリシー#2が利用されるケースでは、現在の累積重みの値が第1の値よりも小さいという条件を満たさなくなるまで)、繰り返し実行してから、中断中の消去/プログラムコマンドの実行を再開する。
【0118】
これにより、たとえ消去/プログラムコマンドが実行されている間にホスト2からのリードコマンドがスケジューラ21に到着した場合であっても、このリードコマンドを、消去/プログラムコマンドの実行が完了するまで、例えば、3ms経過するまで待たせることなく、このリードコマンドの実行を即座に開始することが可能となる。
【0119】
例えば、消去/プログラムコマンドの実行の開始後にホスト2から複数のリードコマンド、例えば3つのリードコマンド、がスケジューラ21に入力された場合を想定する。消去/プログラムコマンドの実行が開始された時点で、累積重みの値は、消去/プログラムコマンドに関連付けられた重みだけ既に増加されている。
【0120】
例えば、増加後の累積重みが3である場合には、この累積重みの値は第1の値(例えば0)よりも大きいので、スケジューラ21は、NAND型フラッシュメモリ5にサスペンドコマンドを送信することによって消去コマンドまたはプログラムコマンドの実行を中断する。
【0121】
スケジューラ21は、3つのリードコマンドのうちの最初のリードコマンドに対応するコマンドシーケンスをNAND型フラッシュメモリ5に送信することによって最初のリードコマンドの実行を開始する動作と、最初のリードコマンドに関連付けられた重みを累積重みから減算することによって累積重みを更新する動作とを実行する。累積重みは3から2に減少されるが、累積重みは第1の値(例えば0)よりもまだ大きい。
【0122】
したがって、最初のリードコマンドの実行が完了すると、スケジューラ21は、3つのリードコマンドのうちの2番目のリードコマンドに対応するコマンドシーケンスをNAND型フラッシュメモリ5に送信することによって2番目のリードコマンドの実行を開始する動作と、2番目のリードコマンドに関連付けられた重みを累積重みから減算することによって累積重みを更新する動作とを実行する。累積重みは2から1に減少されるが、累積重みは第1の値(例えば0)よりもまだ大きい。
【0123】
したがって、2番目のリードコマンドの実行が完了すると、スケジューラ21は、3つのリードコマンドのうちの3番目のリードコマンドに対応するコマンドシーケンスをNAND型フラッシュメモリ5に送信することによって3番目のリードコマンドの実行を開始する動作と、3番目のリードコマンドに関連付けられた重みを累積重みから減算することによって累積重みを更新する動作とを実行する。累積重みは1から0に減少される。
【0124】
したがって、3番目のリードコマンドの実行が完了すると、スケジューラ21は、中断していたコマンドの実行の再開を指示するコマンド(レジュームコマンドとしても参照される)をNAND型フラッシュメモリ5に送信することによって、中断されている消去/プログラムコマンドの実行を再開する。
【0125】
このように、スケジューラ21は、第1の入力の一つのリードコマンドの実行を開始する動作と、この一つのリードコマンドに関連付けられた重みを使用して累積重みを更新する動作とを、第1の入力からリードコマンドがなくなるか、または累積重みが第1の値よりも大きいという条件を満たさなくなるまで繰り返し実行してから、中断中の消去/プログラムコマンドの実行を再開する。
【0126】
したがって、実行されるリードコマンドの数と実行される消去/プログラムコマンドの数との間の比率がホスト2の求める時間配分に対応する比率に近づくように制御しつつ、リードレイテンシーの変動量を低減ことが可能となる。
【0127】
換言すれば、本実施形態では、スケジューラ21は、累積重みに基づいて、NAND型フラッシュメモリ5に送出すべきリードコマンドそれぞれを含む第1コマンドグループ(第1の入力に入力されるコマンドの集合)と、NAND型フラッシュメモリ5に送出すべき消去コマンドそれぞれとNAND型フラッシュメモリ5に送出すべきプログラムコマンドそれぞれとを含む第2コマンドグループ(第2の入力に入力されるコマンドの集合)のうちから、実行されるべき高優先度のコマンドグループを選択する。スケジューラ21は、選択した高優先度のコマンドグループに対応する一つのコマンドの実行を開始し、この一つのコマンドに関連付けられた重みを使用して累積重みを更新する。
【0128】
NAND型フラッシュメモリ5において実行されているコマンドが第2コマンドグループ内の一つの消去/プログラムコマンドであり、且つ累積重みの値が第1コマンドグループを高優先度のコマンドグループとして選択するための条件を満たしている場合、スケジューラ21は、NAND型フラッシュメモリ5にサスペンドコマンドを送信することによって一つの消去/プログラムコマンドの実行を中断する。そして、スケジューラ21は、第1コマンドグループ内の一つのリードコマンドの実行を開始する動作と、一つリードコマンドに関連付けられた重みを使用して累積重みを更新する動作とを、第1コマンドグループからリードコマンドがなくなるか、または累積重みが第1コマンドグループを高優先度のコマンドグループとして選択するための条件を満たさなくなるまで繰り返し実行してから、中断されている一つの消去/プログラムコマンドの実行を再開する。
【0129】
なお、一つの消去/プログラムコマンドの実行中に許容される中断の回数または一つの消去/プログラムコマンドの実行中に許容される中断時間の合計は必ずしも無制限ではない。一つの消去/プログラムコマンドの実行中に許容される中断の回数または一つの消去/プログラムコマンドの実行中に許容される中断時間の合計は、NAND型フラッシュメモリ5の仕様で定められている。
【0130】
例えば、同一の消去/プログラムコマンドの実行中に許容される中断の回数が、5回までに制限されている場合を想定する。ある消去/プログラムコマンドに対する1回の中断中に複数のリードコマンドが連続して実行された場合であっても、この消去/プログラムコマンドの中断の回数は1回である。この消去/プログラムコマンドの実行が再開された後に、この消去/プログラムコマンドの実行が再び中断されると、この消去/プログラムコマンドの中断の回数は2回になる。
【0131】
したがって、同一の消去/プログラムコマンドに対する中断の回数が上限回数(ここでは5回)に達した後は、スケジューラ21は、累積重みの値にかかわらず、この消去/プログラムコマンドの実行を中断せずにこの消去/プログラムコマンドの実行を継続する。これにより、NAND型フラッシュメモリ5において許容される中断回数に関する制約の範囲内で、ある消去/プログラムコマンドの実行中に、この消去/プログラムコマンドよりも優先して幾つかのリードコマンドを実行することができる。
【0132】
なお、本実施形態では、スケジューラ21は、複数のリードコマンドが到着しており、且つ累積重みがこれらリードコマンドそれぞれの重みの総和以上である場合には、1回の中断中にこれら複数のリードコマンドを実行することができる。このため、限られた中断回数の下でも、リードレイテンシーの変動を効率よく低減することが可能となる。
【0133】
次に、同一の消去/プログラムコマンドの実行中に許容される中断時間の合計が、1msに制限されている場合を想定する。この場合、同一の消去/プログラムコマンドに対する中断時間の合計が1msに達した後は、スケジューラ21は、累積重みの値にかかわらず、この消去/プログラムコマンドの実行を中断せずにこの消去/プログラムコマンドの実行を継続する。
【0134】
例えば、一つのリードコマンドの実行に要する時間が100μsであり、ある消去/プログラムコマンドに対する1回目の中断中に10個のリードコマンドを実行した場合には、1回目の中断時間の合計は1ms(=100μs×10)になる。このため、この消去/プログラムコマンドの実行を再開した後は、スケジューラ21は、累積重みの値にかかわらず、この消去/プログラムコマンドの実行を中断せずにこの消去/プログラムコマンドの実行を継続する。
【0135】
また、例えば、一つのリードコマンドの実行に要する時間が100μsであり、ある消去/プログラムコマンドの実行を10回中断し、各中断時間に1個のリードコマンドを実行した場合にも、この消去/プログラムコマンドの中断時間の合計は1ms(=100μs×10)になる。このため、この消去/プログラムコマンドの10回目の中断の後にこの消去/プログラムコマンドの実行を再開した後は、スケジューラ21は、累積重みの値にかかわらず、この消去/プログラムコマンドの実行を中断せずにこの消去/プログラムコマンドの実行を継続する。
【0136】
このように、本実施形態では、NAND型フラッシュメモリ5において、一つの消去/プログラムコマンドの実行中に許容される中断の回数または一つの消去/プログラムコマンドの実行中に許容される中断時間の合計についての上限値が規定されている場合、スケジューラ21は、実行中の一つの消去/プログラムコマンドに対する中断の回数または中断時間の合計が上限値に達した後は、たとえ現在の累積重みが第1の値よりも大きい場合であっても、この一つの消去/プログラムコマンドの実行を中断せずにこの一つの消去/プログラムコマンドの実行を継続する。これにより、NAND型フラッシュメモリ5において許容される中断回数に関する制約または中断時間の合計に関する制約の範囲内で、ある消去/プログラムコマンドの実行中に、この消去/プログラムコマンドよりも優先して幾つかのリードコマンドを実行することができる。
【0137】
また、NAND型フラッシュメモリ5においては、消去コマンドについてのみ、許容される中断の回数の上限値が定められ、さらに、プログラムコマンドについてのみ、許容される中断時間の合計の上限値が定められているケースもある。この場合、実行中のコマンドが消去コマンドである場合には、スケジューラ21は、この消去コマンドに対する中断の回数が上限値に達した後は、現在の累積重みに無関係に、この消去コマンドの実行を中断せずにこの消去コマンドの実行を継続する。実行中のコマンドがプログラムコマンドである場合には、スケジューラ21は、このプログラムコマンドに対する中断時間の合計が上限値に達した後は、現在の累積重みに無関係に、このプログラムコマンドの実行を中断せずにこのプログラムコマンドの実行を継続する。
【0138】
さらに、NAND型フラッシュメモリ5においては、一つの消去/プログラムコマンドの実行の再開から次回の中断までの間に確保すべきインターバル時間がさらに規定されている場合がある。したがって、この場合には、スケジューラ21は、一つの消去/プログラムコマンドの実行の再開からの経過時間がインターバル時間に満たない間は、累積重みの値にかかわらず、この一つの消去/プログラムコマンドの実行を中断せずにこの一つの消去/プログラムコマンドの実行を継続する。
【0139】
このように、スケジューラ21は、各消去/プログラムコマンドの中断回数に関する制約、中断時間の合計に関する制約、実行の再開から次回の中断までのインターバル時間に関する制約の下でサスペンド動作を実行することにより、NAND型フラッシュメモリ5の動作の信頼性を保証することができる。
【0140】
また、スケジューラ21は、現在の累積重みに基づいて、一つ以上のリードコマンドを格納するためにコントローラ4内に設けられたコマンドキューに格納可能なリードコマンドの数を最適化する機能を有している。
【0141】
より詳しくは、累積重みが、第1の入力が高優先度の入力として選択される条件を満たしている場合、つまり累積重みが第1の値(例えば0)よりも大きい場合、スケジューラ21は、コマンドキューに格納可能なリードコマンドの数の上限を、累積重みの値に比例する数に設定する。
【0142】
例えば、消去/プログラムコマンドの実行が開始され、これによって累積重みの値が0から30に更新された場合を想定する。この場合、各リードコマンドに関連付けられている重みが1である場合には、コマンドキューに格納可能なリードコマンドの数の上限(最大数)は30に設定される。これにより、コマンドキューに格納可能なリードコマンドの数の上限を、実行されるリードコマンドの数と実行される消去/プログラムコマンドの数との間の比率をホスト2の求める時間配分に対応する比率30:1に回復するために必要な数に設定することができる。この結果、コマンドキューのサイズを必要以上に大きくすることなく、実行されるリードコマンドの数と実行される消去/プログラムコマンドの数との間の比率をホスト2の求める時間配分に対応する比率に近づけるための制御を効率よく実行することができる。
【0143】
コマンドキューに格納されているリードコマンドのうちの一つのリードコマンドの実行が開始されると、累積重みは30から29に更新される。コマンドキューに格納可能なリードコマンドの数の上限も30から29に更新される。このように、コマンドキューに格納可能なリードコマンドの数の上限は、累積重みの変化に応じて変化される。
【0144】
なお、ここでは、累積重みの値が30であり、且つ各リードコマンドに関連付けられている重みが1である場合を例示したが、累積重みの値が30であり、且つ各リードコマンドに関連付けられている重みが2である場合には、コマンドキューに格納可能なリードコマンドの数の上限(最大数)は15に設定される。
【0145】
これにより、消去/プログラムコマンドの実行中に、現在の累積重みの値に対応する数のリードコマンドがスケジューラ21に到着した場合には、これらリードコマンドを全てコマンドキューに蓄えることができる。
【0146】
あるいは、コマンドキューに格納されている複数のリードコマンドの各々に関連付けられている重みがそれぞれ異なる値である場合には、この複数のリードコマンドの重みの総和がVTの値以下になるようにコマンドキューに格納可能なリードコマンドの数の上限が設定されてもよい。
【0147】
消去/プログラムコマンドの実行が完了すると、スケジューラ21は、コマンドキューに既に格納されているこれら複数のリードコマンドを連続して実行することができる。よって、実行されるリードコマンドの数と実行される消去/プログラムコマンドの数との間の比率をホスト2の求める時間配分に対応する比率に即座に回復することが可能となる。
【0148】
例えば、中断回数の上限が5である場合において、ある消去/プログラムコマンドの実行を5回中断することによって5個のリードコマンドが実行された場合を想定する。この場合、累積重みの値は30から25に更新される。累積重みの値は0よりも大きいため、サスペンド条件は満たされている。しかし、中断回数は上限に達しているので、もはやこの消去/プログラムコマンドの実行を中断することはできない。
【0149】
しかしながら、本実施形態では、累積重みの値=25に対応する数のリードコマンドをコマンドキューに蓄えておくことができるので、この消去/プログラムコマンドの実行が完了した直後に、最大で25個のリードコマンドを連続して実行することが可能となる。
【0150】
一方、累積重みが、第1の入力が高優先度の入力として選択される条件を満たしていない場合、つまり累積重みが第1の値(例えば0)に等しいか、または0よりも小さい場合、スケジューラ21は、コマンドキューに格納可能なリードコマンドの数の上限を1に設定する。これにより、累積重みが、第1の入力が高優先度の入力として選択される条件を満たしていない間は、コマンドキューに格納可能なリードコマンドの最大数を1に維持することができる。よって、例えば、第2の入力から消去/プログラムコマンドが無くなった時に、コマンドキュー内のリードコマンドを即座に実行することができる。
【0151】
コマンドキューに格納可能なリードコマンドの最大数を制限するための方法としては、可変長のコマンドキューを用意し、このコマンドキューの長さ(深さ)を現在の累積重みの値に基づいて変更する方法を使用することができる。
【0152】
あるいは、固定長のコマンドキューを用意し、このコマンドキューに格納されたコマンドの数が、現在の累積重みの値に基づいて決定される最大数に達した後は、後続のリードコマンドがコマンドキューに格納されることを禁止するという方法を使用してもよい。
【0153】
また、コントローラ4は、コマンドキューに格納されている複数のリードコマンドをこれらリードコマンドがコマンドキューに格納された順にスケジューラ21に送出してもよいし、あるいは、各々に関連付けられた重みの小さい順にスケジューラ21に送出してもよい。
【0154】
実行中の消去/プログラムコマンドに対する中断の回数または中断時間の合計は、サスペンドマネージャ22によって管理される。
【0155】
NANDインタフェース13は、CPU12の制御の下、NAND型フラッシュメモリ5を制御するように構成されたメモリ制御回路である。
【0156】
DRAMインタフェース14は、CPU12の制御の下、DRAM6を制御するように構成されたDRAM制御回路である。DRAM6の記憶領域は、ブロック管理テーブル32を格納するために使用される。ブロック管理テーブル32は、NAND型フラッシュメモリ5内の複数のブロックそれぞれに対応する複数の管理テーブルを含む。各管理テーブルは、この管理テーブルに対応するブロックを管理するための管理情報(メタデータ)を格納するために使用される。メタデータは、これに限定されないが、対応するブロックの書き換え回数(プログラム/イレーズサイクルの数)、オープン/クローズ状態、等を含んでいてもよい。オープン/クローズ状態は、このブロックがオープン状態またはクローズ状態のいずれであるかを示す。オープン状態は、このブロックが書き込み先ブロックとして使用中の状態を示す。クローズ状態は、このブロックがデータで満たされているアクティブブロックとして管理されている状態を示す。
【0157】
DMAC15は、CPU12の制御の下、ホスト2のライトバッファとDRAM6(内部バッファ)との間のデータ転送を実行する。ホスト2のライトバッファから内部バッファにライトデータを転送すべき場合には、CPU12は、ライトバッファ上の位置を示す転送元アドレス、データサイズ、内部バッファ上の位置を示す転送先アドレスをDMAC15に対して指定する。
【0158】
ECCエンコード/デコード部16は、NAND型フラッシュメモリ5にデータをライトすべき時、NAND型フラッシュメモリ5に書き込むべきライトデータをエンコード(ECCエンコード)することによってこのライトデータにエラー訂正コード(ECC)を付加する。NAND型フラッシュメモリ5からデータがリードされた時、ECCエンコード/デコード部16は、リードされたデータに付加されているECCを使用して、このデータのエラー訂正を行う(ECCデコード)。
【0159】
図5は、スケジューラ21によって実行されるスケジューリング動作を示す図である。以下では、上述のポリシー#1を使用する場合のスケジューリング動作を主として説明するが、上述のポリシー#2を使用する場合のスケジューリング動作も、以下に説明するポリシー#1を使用する場合のスケジューリング動作と同様にして実行することができる。
【0160】
スケジューラ21は、NAND型フラッシュメモリ5に含まれるNAND型フラッシュメモリダイ毎に、スケジューリング動作を行う。以下では、あるNAND型フラッシュメモリダイに対するスケジューリング動作を例示するが、他のNAND型フラッシュメモリダイに対するスケジューリング動作も同様の手順で実行される。
【0161】
このNAND型フラッシュメモリダイへアクセスするための各コマンド(リードコマンド、消去コマンド、プログラムコマンド)は、スケジューラ21に入力される。
【0162】
スケジューラ21は、このNAND型フラッシュメモリダイにおいて実行されるべき第1コマンドグループ(リードコマンドの集合)と第2コマンドグループ(消去コマンドの集合とプログラムコマンドの集合)との間の比率を任意の比率に制御するためのスケジューリング動作を行う。このスケジューリング動作は、重み付け公平キューイング(WFQ)に、NAND型フラッシュメモリダイにおいて実行中の消去/プログラムコマンドを中断する制御を追加することによって実現される。
【0163】
スケジューラ21は、このNAND型フラッシュメモリダイに送出すべき第1コマンドグループを受け付けるための第1の入力(input#1)と、対応するNAND型フラッシュメモリダイに送出すべき第2コマンドグループを受け付けるための第2の入力(input#2)とを有する。
【0164】
スケジューリング動作は、このNAND型フラッシュメモリダイに対応する累積重みと、このNAND型フラッシュメモリダイに対する各コマンドに関連付けられた重みとを用いて実行される。
図5では、バーチャルタイム(VT)として参照されるパラメータが上述の累積重みとして使用される。
【0165】
スケジューラ21は、VTを累積重み管理テーブルT#0を用いて管理する。各リードコマンドは、そのリードコマンドに関連付けられた重みWrを示すパラメータを含む。同様に、各消去コマンドはその消去コマンドに関連付けられた重みWeを示すパラメータを含み、各プログラムコマンドはそのプログラムコマンドに関連付けられた重みWpを示すパラメータを含む。
【0166】
例えば、ホスト2が、読み出し動作と消去動作とプログラム動作との間の時間配分を1:1:1にすべきことをフラッシュストレージデバイス3に要求した場合を想定する。一つのリードコマンドの実行に要する時間が例えば100μs、一つの消去コマンドの実行に要する時間が例えば1ms、一つのプログラムコマンドの実行に要する時間が例えば3msである場合、コントローラ4は、例えば、リードコマンドに関連付けられた重みWrを1に設定し、消去コマンドに関連付けられた重みWeを10に設定し、ライトコマンドに関連付けられた重みWpを30に設定する。
【0167】
また、ホスト2は、例えば、エンドユーザAからのリードコマンドをエンドユーザBからのリードコマンドの2倍の頻度で実行し、且つエンドユーザAからのリードコマンドをエンドユーザCからのリードコマンドの3倍の頻度で実行すべきことをフラッシュストレージデバイス3に要求する場合もある。
【0168】
この場合には、コントローラ4は、エンドユーザAからの各リードコマンドに関連付けられた重みWrを1に設定し、エンドユーザBからの各リードコマンドに関連付けられた重みWrを2に設定し、エンドユーザCからの各リードコマンドに関連付けられた重みWrを3に設定してもよい。
【0169】
なお、全てのリードコマンドが同じ重みWrを有し、全てのプログラムコマンドが同じ重みWpを有し、全ての消去コマンドが同じ重みWeを有していてもよい。この場合には、スケジューラ21は、各リードコマンドに関連付けられた重みWr(例えば1)と、各プログラムコマンドに関連付けられた重みWp(例えば30)と、各消去コマンドに関連付けられた重みWe(例えば10)とを重み管理テーブルT#1を用いて管理する。
【0170】
スケジューラ21のinput#1の前段には、一つ以上のリードコマンドを格納するためのコマンドキュー30が配置される。コマンドキュー30は、例えば、先入れ先出しバッファ(FIFOバッファ)として実現される。コマンドキュー30に格納可能なリードコマンドの数の上限は、現在のVTの値に比例した値に制限される。
【0171】
サスペンドマネージャ22は、スケジューラ21からNAND型フラッシュメモリダイに出力されるコマンドシーケンスに基づいて、実行中の消去/プログラムコマンドに対する中断の回数または中断時間の合計を監視する。NAND型フラッシュメモリダイにおいて実行されているコマンドが消去コマンドまたはプログラムコマンドであり、且つ実行中の消去コマンドまたはプログラムコマンドに対する中断の回数または中断時間の合計が上限値未満である場合、サスペンドマネージャ22は、中断可能を示すフラグ(readable flag)をオン状態に設定する。
【0172】
VTが第1の値(例えば0)よりも大きく、且つreadable flagがオン状態である場合、スケジューラ21は、消去/プログラムコマンドの実行を中断し、代わりに、input#1に存在するリードコマンドの実行を開始する。
【0173】
一方、readable flagがオフ状態である場合には、たとえVTが第1の値(例えば0)よりも大きい場合であっても、スケジューラ21は、消去/プログラムコマンドの実行を中断せず、この消去/プログラムコマンドの実行を継続する。
【0174】
図6は、スケジューラのinput#0のリードコマンドの実行が開始された場合に実行されるVT更新動作と、スケジューラのinput#1の消去またはプログラムコマンドの実行が開始された場合に実行されるVT更新動作とを示す図である。
【0175】
最初に、
図6の(A)を参照して、input#0に3つのリードコマンドが連続して入力され、input#1に消去コマンドあるいはプログラムコマンドがまったく入力されない場合について説明する。input#0に入力される各リードコマンドにおいては、重みWr(=1)が設定されている。フラッシュストレージデバイス3は、これらのリードコマンドを連続的に実行する。
【0176】
最初に、時刻tにおいて、VTの値は初期値(例えば0)に設定される。この初期値は第1の値として使用される。ここでは、input#1に消去コマンドあるいはプログラムコマンドがまったく入力されない場合を想定しているため、次の実行対象のコマンドとしてinput#0の最初のリードコマンドが選択される。時刻t+1において、最初のリードコマンドの実行が開始されると、この最初のリードコマンドに対応する重みWrがVTから減算され、VT=0-1=-1になる。
【0177】
最初のリードコマンドの実行が完了すると、時刻t+2において、2番目のリードコマンドの実行が開始される。2番目のリードコマンドの実行が開始されると、この2番目のリードコマンドに対応する重みWrがVTから減算され、VT=-1-1=-2になる。
【0178】
2番目のリードコマンドの実行が完了すると、時刻t+3において、3番目のリードコマンドの実行が開始される。3番目のリードコマンドの実行が開始されると、この3番目のリードコマンドに対応する重みWrがVTから減算され、VT=-2-1=-3になる。
【0179】
このようにして、各リードコマンドの実行開始の度、各リードコマンドに対応する重みを使用してVTの値の更新が行われる。
【0180】
次に、
図6の(B)を参照して、input#0にリードコマンドがまったく入力されず、input#1にプログラムコマンド、消去コマンド、プログラムコマンドがこの順で入力される場合について説明する。
【0181】
最初に、時刻tにおいて、VTの値は初期値(例えば0)に設定される。ここでは、input#0にリードコマンドがまったく入力されない場合を想定しているため、次の実行対象のコマンドとしてinput#1の最初のコマンド(ここでは、プログラムコマンド)が選択される。時刻t+1において、プログラムコマンドの実行が開始されると、このプログラムコマンドに対応する重みWp(=30)がVTに加算され、VT=0+30=+30になる。
【0182】
このプログラムコマンドの実行が完了すると、時刻t+2において、次のコマンド(ここでは、消去コマンド)の実行が開始される。消去コマンドの実行が開始されると、この消去コマンドに対応する重みWe(=10)がVTに加算され、VT=30+10=+40になる。
【0183】
このプログラムコマンドの実行が完了すると、時刻t+3において、さらに次のコマンド(ここでは、プログラムコマンド)の実行が開始される。VTの上限値が+40に設定されている場合においては、このプログラムコマンドの実行が開始されても、VTの値は上限値(=+40)に維持される。
【0184】
このようにして、プログラムコマンドあるいは消去コマンドの実行が開始される度に、プログラムコマンドあるいは消去コマンドに対応する重みを使用してVTの値の更新が行われる。
【0185】
図7は、VTの値に基づいて、input#0とinput#1から、高優先度の入力を選択する動作を示す図である。
図7の(A)、(B)の各々においては、二つの入力input#0、input#1の各々にコマンドが入力されている場合が想定されている。
【0186】
図7の(A)では、VTの値が0より大きい場合が例示されている。VTが0より大きい場合、スケジューラ21は、input#0を高優先度の入力として選択し、input#0に入力されるコマンド(リードコマンド)の実行を開始する。
【0187】
図7の(B)では、VTの値が0より小さい場合が例示されている。VTが0より小さい場合、スケジューラ21は、input#1を高優先度の入力として選択し、input#1に入力されるコマンド(ここではプログラムコマンド)の実行を開始する。
【0188】
図8は、input#0に入力される幾つかのリードコマンドの実行が完了した後に、input#1に入力されるプログラムコマンドの実行を開始する動作を示す図である。
【0189】
最初に、時刻tにおいて、VTの値は初期値(例えば0)に設定される。ここで、input#0に2つのリードコマンドが連続して入力され、input#1に消去コマンドあるいはプログラムコマンドがまったく入力されない場合を想定する。
【0190】
時刻t+1において、input#0の最初のリードコマンドの実行が開始され、VTからこの最初のリードコマンドに対応するWr(=1)が減算され、VT=0-1=-1となる。次に、時刻t+2において、2番目のリードコマンドの実行が開始され、VTからこの2番目のリードコマンドに対応するWr(=1)が減算され、VT=-1-1=-2となる。ここで、input#1にプログラムコマンドが入力されると、スケジューラ21は、VT<0であるため、input#1を高優先度の入力として選択する。
【0191】
したがって、時刻t+3において、プログラムコマンドの実行が開始され、VTにこのプログラムコマンドに対応するWp(=30)が加算され、VT=-2+30=+28となる。ここで、input#0に後続のリードコマンドが入力された場合を想定する。この場合、このプログラムコマンドの実行が完了すると、スケジューラ21は、VT>0であるため、input#0を高優先度の入力として選択する。
【0192】
そして、時刻t+4において、この後続のリードコマンドの実行が開始され、VTからこの後続のリードコマンドに対応するWr(=1)が減算され、VT=+28-1=+27となる。
【0193】
このように、各コマンドの重みに応じて累積重みVTの値の更新を行いながら、各コマンドが実行される。
【0194】
図9は、input#1のプログラムコマンドの実行を中断し、プログラムコマンドの実行が中断されている間にinput#0のリードコマンドを実行する動作を示す図である。
【0195】
ある時刻tにおいて、VT=-5であったとき、VT<0であるため、スケジューラ21は、input#1を高優先度の入力として選択する。時刻t+1において、プログラムコマンドの実行が開始され、VTにこのプログラムコマンドに対応するWp(=30)が加算され、VT=-5+30=+25となる。
【0196】
プログラムコマンドが実行中であり、且つVT>0であるため、サスペンド条件が満たされる。この時、input#0に1つのリードコマンドが到着した場合を想定する。この場合、時刻t+2において、スケジューラ21は、NAND型フラッシュメモリダイにサスペンドコマンドを送信することによってプログラムコマンドの実行を中断(サスペンド)し、代わりにinput#0に入力されたリードコマンドの実行を開始する。リードコマンドの実行の開始に伴い、VTからこのリードコマンドに対応するWr(=1)が減算され、VT=+25-1=+24となる。
【0197】
ここで、後続のリードコマンドがinput#0に入力されていない場合を想定する。VT>0であるが、input#0には実行可能なリードコマンドが存在しない。このため、リードコマンドの実行が完了すると、時刻t+3において、スケジューラ21は、中断していたプログラムコマンドの実行の再開を指示するコマンドをNAND型フラッシュメモリダイに送信し、これによって中断していたプログラムコマンドの実行を再開する。このプログラムコマンドの重みは既にVTに加算済みであるため、時刻t+3においては、VTの更新は行われない。
【0198】
一般に、プログラム動作および消去動作の各々の実行に要する時間は読み出し動作の実行に要する時間よりも長い。従って、サスペンド条件を満たす場合には、実行中のプログラムコマンドあるいは消去コマンドを中断してリードコマンドを優先的に実行することにより、先行するプログラムコマンドあるいは消去コマンドによってリードコマンドの実行開始が遅くなることを防止することが可能となる。
【0199】
図10は、input#1のプログラムコマンドの実行を中断し、プログラムコマンドの実行が中断されている間にinput#0の複数のリードコマンドを実行する動作を示す図である。
【0200】
ある時刻tにおいて、VT=-27<0であったとき、スケジューラ21は、次に実行するコマンドとして、input#1に入力されているコマンド(プログラムコマンドまたは消去コマンド)を優先的に選択する。時刻t+1において、プログラムコマンドの実行が開始され、VTにこのプログラムコマンドに対応するWp(=30)が加算され、VT=-27+30=+3となる。
【0201】
プログラムコマンドが実行されている間に、input#0に例えば3つのリードコマンドが連続して入力される場合を想定する。この場合、プログラムコマンドが実行中であり、且つVT>0であるため、サスペンド条件が満たされる。したがって、時刻t+2において、スケジューラ21は、NAND型フラッシュメモリダイにサスペンドコマンドを送信することによってプログラムコマンドの実行を中断(サスペンド)し、代わりにinput#0に入力される最初のリードコマンドの実行を開始する。最初のリードコマンドの実行の開始に伴い、VTからこのリードコマンドに対応するWr(=1)が減算され、VT=+3-1=+2となる。VT>0であるため、まだサスペンド条件が満たされている。
【0202】
最初のリードコマンドの実行が完了すると、時刻t+3において、2番目のリードコマンドの実行が開始され、VTから2番目のリードコマンドに対応するWr(=1)が減算され、VT=+2-1=+1となる。VT>0であるため、まだサスペンド条件が満たされている。
【0203】
2番目のリードコマンドの実行が完了すると、時刻t+4において、3番目のリードコマンドの実行が開始され、VTから3番目のリードコマンドに対応するWr(=1)が減算され、VT=+1-1=0となる。VT=0であるため、サスペンド条件が満たされなくなる。
【0204】
したがって、3番目のリードコマンドの実行が完了すると、時刻t+5において、スケジューラ21は、中断していたプログラムコマンドの実行の再開を指示するコマンドをNAND型フラッシュメモリダイに送信し、これによって中断していたプログラムコマンドの実行を再開する。このプログラムコマンドの重みは既にVTに加算済みであるため、時刻t+5においては、VTの更新は行われない。
【0205】
ここでは、プログラムコマンドが中断されている間に3つのリードコマンドが実行される場合について説明したが、ここで実行されるリードコマンドの数は1つであってもよいし4つ以上であってもよい。
【0206】
図11は、input#1のプログラムコマンドの実行を複数回中断する動作を示す図である。
【0207】
ある時刻tにおいて、VT=-3であったとき、VT<0であるため、スケジューラ21は、input#1を高優先度の入力として選択する。時刻t+1において、プログラムコマンドの実行が開始され、VTにこのプログラムコマンドに対応するWp(=30)が加算され、VT=-3+30=+27となる。
【0208】
プログラムコマンドが実行中であり、且つVT>0であるため、サスペンド条件が満たされる。この時、input#0に1つのリードコマンドが入力された場合を想定する。この場合、時刻t+2において、スケジューラ21は、NAND型フラッシュメモリダイにサスペンドコマンドを送信することによってプログラムコマンドの実行を中断(サスペンド)し、代わりにinput#0に入力されたリードコマンドの実行を開始する。リードコマンドの実行の開始に伴い、VTからこのリードコマンドに対応するWr(=1)が減算され、VT=+27-1=+26となる。
【0209】
ここで、後続のリードコマンドがinput#0に入力されない場合を想定する。VT>0であるが、input#0には実行可能なリードコマンドが存在しない。このため、リードコマンドの実行が完了すると、時刻t+3において、スケジューラ21は、中断していたプログラムコマンドの実行の再開を指示するコマンドをNAND型フラッシュメモリダイに送信し、これによって中断していたプログラムコマンドの実行を再開する。このプログラムコマンドの重みは既にVTに加算済みであるため、時刻t+3においては、VTの更新は行われない。
【0210】
プログラムコマンドが実行中であり、且つVT>0であるため、またサスペンド条件が満たされている。この時、input#0に1つの後続のリードコマンドが入力された場合を想定する。この場合、時刻t+4において、スケジューラ21は、NAND型フラッシュメモリダイにサスペンドコマンドを送信することによってプログラムコマンドの実行を再度中断(サスペンド)し、代わりにinput#0に入力された1つの後続のリードコマンドの実行を開始する。1つの後続のリードコマンドの実行の開始に伴い、VTからこの1つの後続のリードコマンドに対応するWr(=1)が減算され、VT=+26-1=+25となる。
【0211】
ここで、別の後続のリードコマンドがinput#0に入力されない場合を想定する。VT>0であるが、input#0には実行可能なリードコマンドが存在しない。このため、1つの後続のリードコマンドの実行が完了すると、時刻t+5において、スケジューラ21は、中断していたプログラムコマンドの実行の再開を指示するコマンドをNAND型フラッシュメモリダイに送信し、これによって中断していたプログラムコマンドの実行を再開する。このプログラムコマンドの重みは既にVTに加算済みであるため、時刻t+5においては、VTの更新は行われない。
【0212】
ここでは、一つのプログラムコマンドの実行を2回中断する場合について説明したが、3回以上の中断が行われてもよい。しかし、中断回数の上限回数が規定されている場合には、一つのプログラムコマンドに対する中断回数が上限回数に達した後は、たとえサスペンド条件が満たされていても、スケジューラ21は、この一つのプログラムコマンドの実行を中断せずに、この一つのプログラムコマンドの実行を継続する。
【0213】
図12は、フラッシュストレージデバイス3において実行されるスケジューリング動作の基本的な手順を示すフローチャートである。以下では、ある特定の一つのNAND型フラッシュメモリダイに送出すべきコマンドのうちから、ある特定の一つのNAND型フラッシュメモリダイに実行させるコマンドを決定するスケジューリング動作について説明するが、他の各NAND型フラッシュメモリダイについても同様の手順でスケジューリング動作が実行される。
【0214】
スケジューラ21は、ある特定の一つのNAND型フラッシュメモリダイに対応するVTの値によって決定される二つの入力(input#0、input#1)間の優先順位に基づき、これら二つの入力(input#0、input#1)のうちから、コマンドが実行されるべき高優先度の入力を選択する(ステップS11)。ステップS11では、スケジューラ21は、NAND型フラッシュメモリダイに対応する累積重み管理テーブルT#0からVTの値を取得し、VTの値が第1の値(例えば0)よりも大きい場合は、input#0を高優先度の入力として選択し、VTの値が第1の値(例えば0)よりも小さい場合は、input#1を高優先度の入力として選択する。
【0215】
スケジューラ21は、選択した高優先度の入力に対応する一つのコマンドの実行を開始する(ステップS12)。ステップS12では、スケジューラ21は、選択した高優先度の入力に対応する一つのコマンドに対応する動作を指示するコマンドシーケンスをNAND型フラッシュメモリダイに送信する。
【0216】
スケジューラ21は、実行が開始された一つのコマンドに関連付けられた重みを取得する(ステップS13)。この一つのコマンド自体に重みが含まれている場合には、スケジューラ21は、この一つのコマンドからこのコマンドに関連付けられた重みを取得する。また、リードコマンドに関連付けられた重みWrと、プログラムコマンドに関連付けられた重みWpと、消去コマンドに関連付けられた重みWeとが管理テーブルT#1によって管理されている場合には、スケジューラ21は、実行が開始された一つのコマンドの種類に対応する重みを管理テーブルT#1から取得する。
【0217】
スケジューラ21は、ステップS13で取得した重みを使用してVTの値を更新する(ステップS14)。実行が開始された一つのコマンドがリードコマンドであった場合には、VTは、VTの値からこのリードコマンドに関連付けられた重みWrを減算することによって得られる値に更新される(VT=VT-Wr)。実行が開始された一つのコマンドがプログラムコマンドあるいは消去コマンドであった場合には、VTは、VTの値にこのコマンドに関連付けられた重み(WpあるいはWe)を加算することによって得られる値に更新される(VT=VT+Wr、あるいはVT=VT+We)。
【0218】
図13は、
図12のスケジューリング動作においてVTに応じて実行される入力選択動作の手順を示すフローチャートである。
【0219】
スケジューラ21は、VTの値が閾値(例えば0)より大きいか、小さいかあるいは等しいかのいずれであるかを判定する(ステップS21,22)。
【0220】
VTの値が0より大きい場合(ステップS21のYES)、スケジューラ21は、input#0を高優先度の入力として選択し、この選択したinput#0に対応する一つのリードコマンドの実行を開始する(ステップS23)。そして、スケジューラ21は、VTの値からこのリードコマンドに対応する重みWrを減算することによって、VTの値を更新する(VT=VT-Wr)(ステップS24)。
【0221】
VTの値が0より小さい場合(ステップS22のYES)、スケジューラ21は、input#1を高優先度の入力として選択し、この選択したinput#1に対応する一つの消去/プログラムコマンドの実行を開始する(ステップS25)。そして、スケジューラ21は、VTの値にこの消去/プログラムコマンドに対応する重み(WpあるいはWe)を加算することによって、VTの値を更新する(VT=VT+Wp、あるいはVT=VT+We)(ステップS26)。
【0222】
VTの値が0と等しい場合(ステップS22のNO)、スケジューラ21は、input#0またはinput#1のいずれかを選択し、input#0に対応する一つのリードコマンド、または、input#1に対応する一つの消去/プログラムコマンドの実行を開始する(ステップS27)。このとき、優先して選択されるべき入力は、あらかじめ決められていてもよい。
【0223】
そして、スケジューラ21は、実行が開始されたコマンドに関連付けられた重みを使用してVTの値を更新する(ステップS28)。ステップS27において実行が開始されたコマンドがリードコマンドであった場合には、スケジューラ21は、VTの値から実行対象のリードコマンドに対応する重みWrを減算することによって、VTの値を更新する(VT=VT-Wr)。ステップS27において実行が開始されたコマンドがプログラムコマンドまたは消去コマンドであった場合には、スケジューラ21は、VTの値にプログラムコマンドまたは消去コマンドに対応する重みWpまたはWeを加算することによって、VTの値を更新する(VT=VT+Wp、またはVT=VT+We)。
【0224】
図14は、
図12のスケジューリング動作において実行されるサスペンド動作の手順を示すフローチャートである。
【0225】
スケジューラ21は、NAND型フラッシュメモリダイにおいてプログラムコマンドあるいは消去コマンドが実行中であるか否かを判定する(ステップS31)。プログラムコマンドあるいは消去コマンドが実行中である場合(ステップS31のYES)、スケジューラ21は、VTの値が0より大きいか否かを判定する(ステップS32)。つまり、スケジューラ21は、サスペンド条件が満たされているか否かを判定する。
【0226】
VTの値が0より大きい場合(ステップS32のYES)、スケジューラ21は、実行中のプログラムコマンドあるいは消去コマンドに対する中断の回数(または中断時間の合計)が上限未満であるか否かを判定する(ステップS33)。
【0227】
実行中のプログラムコマンドあるいは消去コマンドに対する中断の回数(または中断時間の合計)が上限未満であるならば(ステップS33のYES)、スケジューラ21は、NAND型フラッシュメモリダイにサスペンドコマンドを送信することによって、実行中のプログラムコマンドあるいは消去コマンドの実行を中断させ、リードコマンドの実行を開始する(ステップS34)。そして、スケジューラ21は、VTの値から実行対象のリードコマンドに対応する重みWrを減算することによって、VTの値を更新する(VT=VT-Wr)(ステップS35)。
【0228】
VTの値が0以下であった場合(ステップS32のNO)、あるいは、実行中のプログラムコマンドあるいは消去コマンドに対する中断の回数(または中断時間の合計)が上限に到達している場合(ステップS33のNO)、スケジューラ21は、プログラムコマンドあるいは消去コマンドの実行を中断せずに、プログラムコマンドあるいは消去コマンドの実行を継続する(ステップS36)。
【0229】
スケジューラ21は、VTの値に応じてコマンドキュー(FIFO)30に格納可能なリードコマンドの数の上限を決定し、後続のリードコマンドをコマンドキュー(FIFO)30にこの上限数まで格納する(ステップS37)。例えば、VTの値が0より大きく、且つリードコマンドに関連付けられた重みが1である場合には、コマンドキュー(FIFO)30に格納可能なリードコマンドの上限数はVTの値と等しい値に設定され、VTの値が0以下の場合には、コマンドキュー(FIFO)30に格納可能なリードコマンドの上限数は1に設定される。
【0230】
スケジューラ21は、プログラムコマンドあるいは消去コマンドの実行が完了したか否かを判定する(ステップS38)。
【0231】
プログラムコマンドあるいは消去コマンドの実行が完了していない場合(ステップS38のNO)、プログラムコマンドあるいは消去コマンドの実行が継続される(ステップS36)。
【0232】
プログラムコマンドあるいは消去コマンドの実行が完了した場合(ステップS38のYES)、スケジューラ21は、コマンドキュー(FIFO)30に格納されている全てのリードコマンドを連続して実行する(ステップS39)。
【0233】
図15は、サスペンド動作と再開動作とを含むスケジューリング動作の手順の一部分を示すフローチャートである。
【0234】
スケジューラ21は、VTの値が0より小さいか、あるいは、input#0にリードコマンドが存在しない、という条件が満たされているか否かを判定する(ステップS41)。
【0235】
VTの値が0より小さい、あるいは、input#0にリードコマンドが存在しない場合(ステップS41のYES)、スケジューラ21は、中断されているプログラムコマンドあるいは消去コマンドが存在するか否かを判定する(ステップS42)。
【0236】
中断されているプログラムコマンドあるいは消去コマンドがある場合(ステップS42のYES)、スケジューラ21は、中断されているプログラムコマンドあるいは消去コマンドの実行を再開する(ステップS43)。このとき、中断されたコマンドの再開であるため、VTの値の更新は行われない。
【0237】
その後、サスペンドマネージャ22は、readable flagを制御する(ステップS44)。ステップS44では、中断されたコマンドの再開からインターバル時間が経過するまでの間は、readable flagをオフ状態に維持される。この再開されたプログラムコマンドあるいは消去コマンドに対する中断の回数または中断時間の合計が上限値に達していない場合には、インターバル時間が経過した後にreadable flagはオン状態に変更される(ステップS44)。
【0238】
中断されているプログラムコマンドあるいは消去コマンドが無い場合(ステップS42のNO)、スケジューラ21は、input#1に入力される新規プログラムコマンドあるいは新規消去コマンドの実行を開始する(ステップS45)。そして、スケジューラ21は、VTの値にこの新規プログラムコマンドあるいは新規消去コマンドに対応する重みWpまたはWeを加算することによって、VTの値を更新する(VT=VT+Wp、またはVT=VT+We)(ステップS46)。その後、サスペンドマネージャ22は、readable flagを制御し、例えば、実行が開始されたプログラムコマンドあるいは消去コマンドに対する中断の回数または中断時間の合計が上限値に達している場合には、readable flagをオフ状態に設定し、上限値に達していない場合には、readable flagをオン状態に設定する(ステップS44)。
【0239】
VTの値が0より小さいか、あるいは、input#0にリードコマンドが存在しない、という条件が満たされていない場合(ステップS41のNO)、処理は、
図16のステップS51に進む(ステップS47)。
【0240】
図16は、サスペンド動作と再開動作とを含むスケジューリング動作の手順の残り部分を示すフローチャートである。
【0241】
スケジューラ21は、VTの値が0より大きいか、あるいは、input#1にプログラムコマンドあるいは消去コマンドが存在しない、という条件が満たされているか否かを判定する(ステップS51)。
【0242】
VTの値が0より大きい、あるいは、input#1にプログラムコマンドあるいは消去コマンドが存在しない場合(ステップS51のYES)、スケジューラ21は、実行中のプログラムコマンドあるいは実行中の消去コマンドが存在するか否かを判定する(ステップS52)。
【0243】
実行中のプログラムコマンドあるいは実行中の消去コマンドが存在する場合(ステップS52のYES)、スケジューラ21は、NAND型フラッシュメモリダイにサスペンドコマンドを送信することによって、リードコマンドを実行するために、実行中のプログラムコマンドあるいは実行中の消去コマンドを中断させる(ステップS53)。
【0244】
ステップS53の後、または、実行中のプログラムコマンドあるいは実行中の消去コマンドが存在しない場合(ステップS52のNO)、サスペンドマネージャ22は、リードコマンドの実行に備えてreadable flagをオフ状態に切り替え、そしてスケジューラ21はinput#0に対応する一つのリードコマンドの実行を開始する(ステップS54、S55)。そして、スケジューラ21は、VTの値からこのリードコマンドに対応する重みWrを減算することによって、VTの値を更新する(VT=VT-Wr)(ステップS56)。
【0245】
VTの値が0より大きいか、あるいは、input#1にプログラムコマンドあるいは消去コマンドが存在しない、という条件が満たされていない場合(ステップS51のNO)、処理は、先に説明した
図15におけるステップS41に進む(ステップS57)。
【0246】
以上説明したように、本実施形態によれば、累積重みに基づいて、NAND型フラッシュメモリ5に送出すべきリードコマンドそれぞれを受け付けるためのinput#0と、NAND型フラッシュメモリ5に送出すべき消去コマンドそれぞれとNAND型フラッシュメモリ5に送出すべきプログラムコマンドそれぞれとを受け付けるためのinput#1のうちから、コマンドが実行されるべき高優先度の入力が選択される。そして、選択した高優先度の入力に対応する一つのコマンドの実行が開始され、この一つのコマンドに関連付けられた重みを使用して累積重み(VT)が更新される。
【0247】
例えば、ポリシー#1が利用されるケースについては、累積重みは、input#0の一つのリードコマンドの実行が開始された場合、一つのリードコマンドに関連付けられた重みをこの累積重みから減算することによって得られる値に更新される。また、input#1の一つの消去/プログラムコマンドの実行が開始された場合には、累積重みは、この一つの消去/プログラムコマンドに関連付けられた重みをこの累積重みに加算することによって得られる値に更新される。したがって、各リードコマンドに関連付けられた重みを例えば1に設定し、各消去/プログラムコマンドに関連付けられた重みを例えば30に設定した場合には、リードコマンドの集合を消去/プログラムコマンドの集合の30倍の頻度で実行することが可能となる。よって、実行されるリードコマンドの数と実行される消去/プログラムコマンドの数との間の比率がホスト2の求める時間配分に対応する比率になるようにスケジューリング動作を行うことができる。
【0248】
また、NAND型フラッシュメモリ5において実行されているコマンドが消去/プログラムコマンドであり、且つ現在の累積重みの値が第1の値よりも大きいという条件(サスペンド条件)を満たす場合(ポリシー#2が利用されるケースでは、現在の累積重みの値が第1の値よりも小さいという条件を満たす場合)、消去/プログラムコマンドの実行が中断される。消去/プログラムコマンドの実行を中断された後、一つのリードコマンドの実行を開始する動作と、この一つのリードコマンドに関連付けられた重みを使用して累積重みを更新する動作とが、input#0からリードコマンドがなくなるか、または累積重みが第1の値よりも大きいという条件を満たさなくなるまで(ポリシー#2が利用されるケースでは、累積重みの値が第1の値よりも小さいという条件を満たさなくなるまで)、繰り返し実行されてから、中断中の消去/プログラムコマンドの実行が再開される。
【0249】
したがって、実行されるリードコマンドの数と実行される消去/プログラムコマンドの数との間の比率がホスト2の求める時間配分に対応する比率に近づくように制御しつつ、リードレイテンシーの変動量を低減ことが可能となる。
【0250】
なお、input#0に複数のリードコマンドが到着しており、且つ累積重みがこれらリードコマンドそれぞれの重みの総和以上である場合には、1回の中断中にこれら複数のリードコマンドを実行することができる。このため、限られた中断回数の下でも、リードレイテンシーの変動を効率よく低減することが可能となる。
【0251】
さらに、本実施形態では、累積重みの値が、input#0が高優先度の入力として選択される条件を満たしている場合、コマンドキュー30に格納可能なリードコマンドの数の上限は、累積重みの値に比例する数に設定される。この結果、コマンドキュー30のサイズを必要以上に大きくすることなく、実行されるリードコマンドの数と実行される消去/プログラムコマンドの数との間の比率をホスト2の求める時間配分に対応する比率に近づけるための制御を効率よく実行することができる。また、累積重みの値が、input#0が高優先度の入力として選択されるという条件を満たさない場合、コマンドキュー30に格納可能なリードコマンドの数の上限は、1に設定される。これにより、累積重みが、第1の入力が高優先度の入力として選択される条件を満たしていない間は、コマンドキューに格納可能なリードコマンドの最大数を1に維持することができる。よって、例えば、input#1から消去/プログラムコマンドが無くなった直後に、コマンドキュー30内のリードコマンドを即座に実行することができる。
【0252】
以上のように、本実施形態では、NAND型フラッシュメモリ5に対するアクセスを柔軟に制御可能となる。
【0253】
なお、本実施形態では、NAND型フラッシュメモリ5において実行されているコマンドが消去/プログラムコマンドであり、且つ累積重みの値が第1の値よりも大きい場合に、消去/プログラムコマンドの実行を中断したが、NAND型フラッシュメモリ5において実行されているコマンドが消去/プログラムコマンドであり、且つ累積重みの値が第1の値以上である場合に、消去/プログラムコマンドの実行を中断してもよい。
【0254】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0255】
2…ホスト、3…フラッシュストレージデバイス、4…コントローラ、5…NAND型フラッシュメモリ、21…スケジューラ、22…サスペンドマネージャ。