(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-07-19
(45)【発行日】2024-07-29
(54)【発明の名称】メモリシステム
(51)【国際特許分類】
G06F 12/00 20060101AFI20240722BHJP
【FI】
G06F12/00 571B
G06F12/00 597U
(21)【出願番号】P 2023130115
(22)【出願日】2023-08-09
(62)【分割の表示】P 2020035746の分割
【原出願日】2020-03-03
【審査請求日】2023-08-09
(73)【特許権者】
【識別番号】318010018
【氏名又は名称】キオクシア株式会社
(74)【代理人】
【識別番号】110001737
【氏名又は名称】弁理士法人スズエ国際特許事務所
(72)【発明者】
【氏名】菅野 伸一
【審査官】松平 英
(56)【参考文献】
【文献】米国特許第06157963(US,A)
【文献】国際公開第2017/141413(WO,A1)
【文献】特開2010-152571(JP,A)
【文献】特開2016-189209(JP,A)
【文献】特開2011-192260(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 3/06-3/08
12/00-12/128
13/00-13/42
(57)【特許請求の範囲】
【請求項1】
不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、前記不揮発性メモリを制御するように構成されたコントローラと
、を具備し、
前記コントローラは、
前記不揮発性メモリをアクセスするための複数のコマンドが各々に格納される複数のキューと、前記複数のキューにそれぞれ対応する複数の第1の重みと、前記複数のキューにそれぞれ対応する複数の第2の重みとを管理し、
前記複数の第2の重みに基づいて、前記複数のキューのうちの一つのキューをコマンド実行対象キューとして選択し、
前記コマンド実行対象キューに格納されているコマンドの実行を開始し、
前記コマンド実行対象キューに対応する前記第1の重みに基づいて、前記コマンド実行対象キューに対応する前記第2の重みを更新するように構成され
、
前記コントローラは、
前記複数のキューの各々について、イレーズコマンドに関連付けられた重みと、プログラムコマンドに関連付けられた重みと、リードコマンドに関連付けられた重みを、前記第1の重みとして管理し、
前記コマンド実行対象キューに格納されている前記コマンドのタイプに応じて、前記コマンド実行対象キューの前記イレーズコマンドに関連付けられている前記重み、前記コマンド実行対象キューの前記プログラムコマンドに関連付けられている前記重み、または前記コマンド実行対象キューの前記リードコマンドに関連付けられている前記重みを前記第1の重みとして選択するように構成されている、メモリシステム。
【請求項2】
前記コントローラは、
前記コマンド実行対象キューに格納されている前記コマンドの実行を開始したことに応じ、前記コマンド実行対象キューに対応する前記第2の重みから前記コマンド実行対象キューに対応する前記第1の重みを減算することによって、前記コマンド実行対象キューに対応する前記第2の重みを更新し、
前記複数のキューのうち前記第2の重みが最も大きいキューを、前記コマンド実行対象キューとして選択するように構成されている請求項1に記載のメモリシステム。
【請求項3】
前記コントローラは、
前記コマンド実行対象キューに格納されている前記コマンドの実行を開始したことに応じ、前記コマンド実行対象キューに対応する前記第2の重みに前記コマンド実行対象キューに対応する前記第1の重みを加算することによって、前記コマンド実行対象キューに対応する前記第2の重みを更新し、
前記複数のキューのうち前記第2の重みが最も小さいキューを、前記コマンド実行対象キューとして選択するように構成されている請求項1記載のメモリシステム。
【請求項4】
前記複数のキューは、ホストからのデータを前記不揮発性メモリに書き込むために使用される第1のキューと、前記不揮発性メモリのガベージコレクションのためにコピーすべき有効データを前記不揮発性メモリに書き込むために使用される第2のキューとを含み、
前記コントローラは、
前記不揮発性メモリの複数のブロックから選択される一つ以上のコピー元ブロックに格納されている、有効データと無効データの割合を求め、
前記有効データと前記無効データの割合に基づいて、前記第1のキューの前記プログラムコマンドに関連付けられた前記重みと前記第2のキューの前記プログラムコマンドに関連付けられた前記重みをそれぞれ設定するように構成されている請求項
1記載のメモリシステム。
【請求項5】
前記コントローラは、2つ以上のキューに対応する前記第2の重みが同じであり且つ前記2つ以上のキューに対応する前記第2の重みが最も大きいまたは最も小さい場合、前記2つ以上のキューのうち、より小さいキュー識別子またはより大きいキュー識別子を有するキューを前記コマンド実行対象キューとして選択するように構成されている請求項1記載のメモリシステム。
【請求項6】
不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、前記不揮発性メモリを制御するように構成されたコントローラと、を具備し、
前記コントローラは、
前記不揮発性メモリをアクセスするための複数のコマンドが各々に格納される複数のキューと、前記複数のキューにそれぞれ対応する複数の第1の重みと、前記複数のキューにそれぞれ対応する複数の第2の重みとを管理し、
前記複数の第2の重みに基づいて、前記複数のキューのうちの一つのキューをコマンド実行対象キューとして選択し、
前記コマンド実行対象キューに格納されているコマンドの実行を開始し、
前記コマンド実行対象キューに対応する前記第1の重みに基づいて、前記コマンド実行対象キューに対応する前記第2の重みを更新するように構成され、
前記コントローラは、
リードコマンドが次の実行対象コマンドとして格納されており且つ前記複数のキューのうちで最も大きいまたは最も小さい第2の重みを有する、という条件を満たすキューが存在し、且つ前記不揮発性メモリにおいて実行中のコマンドがイレーズコマンドまたはプログラムコマンドである場合、
前記不揮発性メモリにサスペンドコマンドを送信することによって前記イレーズコマンドまたはプログラムコマンドの実行を中断し、
前記条件を満たす前記キューに格納されている前記リードコマンドの実行を開始するように構成されてい
る、メモリシステム。
【請求項7】
前記コントローラは、
前記条件を満たす前記キューに格納されている前記リードコマンドの実行の完了後、前記条件を満たす別のキューが存在する場合、前記別のキューに格納されているリードコマンドの実行を開始し、前記条件を満たす別のキューが存在しない場合、前記中断されたイレーズコマンドまたはプログラムコマンドの実行を再開するように構成されている請求項6記載のメモリシステム。
【請求項8】
不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、前記不揮発性メモリを制御するように構成されたコントローラと、を具備し、
前記コントローラは、
前記不揮発性メモリをアクセスするための複数のコマンドが各々に格納される複数のキューと、前記複数のキューにそれぞれ対応する複数の第1の重みと、前記複数のキューにそれぞれ対応する複数の第2の重みとを管理し、
前記複数の第2の重みに基づいて、前記複数のキューのうちの一つのキューをコマンド実行対象キューとして選択し、
前記コマンド実行対象キューに格納されているコマンドの実行を開始し、
前記コマンド実行対象キューに対応する前記第1の重みに基づいて、前記コマンド実行対象キューに対応する前記第2の重みを更新するように構成され、
前記複数のキューは、ホストからのデータを前記不揮発性メモリに書き込むために使用される第1のキューと、前記不揮発性メモリのガベージコレクションのためにコピーすべきデータを前記不揮発性メモリに書き込むために使用される第2のキューとを含み、
前記コントローラは、
前記不揮発性メモリの複数のブロックから選択される一つ以上のコピー元ブロックに格納されている、有効データと無効データの割合を求め、
前記有効データと前記無効データの割合に基づいて、前記第1のキューに対応する前記第1の重みと前記第2のキューに対応する前記第1の重みをそれぞれ設定するように構成されてい
る、メモリシステム。
【請求項9】
不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、前記不揮発性メモリを制御するように構成されたコントローラと、を具備し、
前記コントローラは、
前記不揮発性メモリをアクセスするための複数のコマンドが各々に格納される複数のキューと、前記複数のキューにそれぞれ対応する複数の第1の重みと、前記複数のキューにそれぞれ対応する複数の第2の重みとを管理し、
前記複数の第2の重みに基づいて、前記複数のキューのうちの一つのキューをコマンド実行対象キューとして選択し、
前記コマンド実行対象キューに格納されているコマンドの実行を開始し、
前記コマンド実行対象キューに対応する前記第1の重みに基づいて、前記コマンド実行対象キューに対応する前記第2の重みを更新するように構成され、
前記コントローラは、第1の時間が経過する度にまたは一つのコマンドが実行される度に、第1の値を前記複数の第2の重みの各々に加算または前記複数の第2の重みの各々から減算することによって前記複数の第2の重みの各々を各第2の重みの初期値に近づける動作を実行するように構成されてい
る、メモリシステム。
【請求項10】
不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、前記不揮発性メモリを制御するように構成されたコントローラと、を具備し、
前記コントローラは、
前記不揮発性メモリをアクセスするための複数のコマンドが各々に格納される複数のキューと、前記複数のキューにそれぞれ対応する複数の第1の重みと、前記複数のキューにそれぞれ対応する複数の第2の重みとを管理し、
前記複数の第2の重みに基づいて、前記複数のキューのうちの一つのキューをコマンド実行対象キューとして選択し、
前記コマンド実行対象キューに格納されているコマンドの実行を開始し、
前記コマンド実行対象キューに対応する前記第1の重みに基づいて、前記コマンド実行対象キューに対応する前記第2の重みを更新するように構成され、
前記コントローラは、一つのコマンドを実行する度に、前記実行された前記一つのコマンドが格納されていた第1のキューに対応する前記第1の重みを前記第1のキュー以外の他のキューにそれぞれ対応する前記第2の重みに分配することによって前記第1のキュー以外の他のキューにそれぞれ対応する前記第2の重みの各々を各第2の重みの初期値に近づける動作を実行するように構成されてい
る、メモリシステム。
【請求項11】
不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、前記不揮発性メモリを制御するように構成されたコントローラと、を具備し、
前記コントローラは、
前記不揮発性メモリをアクセスするための複数のコマンドが各々に格納される複数のキューと、前記複数のキューにそれぞれ対応する複数の第1の重みと、前記複数のキューにそれぞれ対応する複数の第2の重みとを管理し、
前記複数の第2の重みに基づいて、前記複数のキューのうちの一つのキューをコマンド実行対象キューとして選択し、
前記コマンド実行対象キューに格納されているコマンドの実行を開始し、
前記コマンド実行対象キューに対応する前記第1の重みに基づいて、前記コマンド実行対象キューに対応する前記第2の重みを更新するように構成され、
前記コマンド実行対象キューに対応する前記第1の重みは、前記コマンド実行対象キューに格納されているコマンドのタイプに応じて異なる、メモリシステム。
【請求項12】
不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、前記不揮発性メモリを制御するように構成されたコントローラと、を具備し、
前記コントローラは、
前記不揮発性メモリをアクセスするための複数のコマンドが各々に格納される複数のキューと、前記複数のキューにそれぞれ対応する複数の第1の重みと、前記複数のキューにそれぞれ対応する複数の第2の重みとを管理し、
前記複数の第2の重みに基づいて、前記複数のキューのうちの一つのキューをコマンド実行対象キューとして選択し、
前記コマンド実行対象キューに格納されているコマンドの実行を開始し、
前記コマンド実行対象キューに対応する前記第1の重みに基づいて、前記コマンド実行対象キューに対応する前記第2の重みを更新するように構成され、
前記コマンド実行対象キューに対応する前記第1の重みは、前記複数のキューのそれぞれに格納されている同一のタイプのコマンド間において異なる、メモリシステム。
【請求項13】
前記コントローラは、
前記コマンド実行対象キューに格納されている前記コマンドの実行を開始したことに応じ、前記コマンド実行対象キューに対応する前記第2の重みから前記コマンド実行対象キューに対応する前記第1の重みを減算することによって、または、前記コマンド実行対象キューに対応する前記第2の重みに前記コマンド実行対象キューに対応する前記第1の重みを加算することによって、前記コマンド実行対象キューに対応する前記第2の重みを更新し、
前記複数のキューのうち前記第2の重みが最も大きいキュー、または、前記複数のキューのうち前記第2の重みが最も小さいキューを、前記コマンド実行対象キューとして選択するように構成されている請求項6乃至12のいずれか一項に記載のメモリシステム。
【請求項14】
前記コマンドのタイプは、イレーズコマンド、プログラムコマンド、リードコマンドを少なくとも含む、請求項11または12に記載のメモリシステム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、不揮発性メモリを制御する技術に関する。
【背景技術】
【0002】
近年、不揮発性メモリを備えるメモリシステムが広く普及している。このようなメモリシステムの一つとして、NAND型フラッシュメモリを備えるソリッドステートドライブ(SSD)が知られている。
【0003】
SSDは、データセンターのサーバのような様々なホスト計算機システムのストレージデバイスとして使用されている。
【0004】
SSDにおいては、不揮発性メモリに対するアクセスを柔軟に制御可能にするための新たな技術の実現が必要とされる。
【先行技術文献】
【特許文献】
【0005】
【文献】特開2019-164487号公報
【文献】特開2019-053795号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
本発明が解決しようとする課題は、不揮発性メモリに対するアクセスを柔軟に制御可能なメモリシステムおよび制御方法を提供することである。
【課題を解決するための手段】
【0007】
実施形態によれば、メモリシステムは、不揮発性メモリと、前記不揮発性メモリに電気的に接続され、前記不揮発性メモリを制御するように構成されたコントローラとを具備する。前記コントローラは、前記不揮発性メモリをアクセスするための複数のコマンドが各々に格納される複数のキューと、前記複数のキューにそれぞれ対応する複数の第1の重みと、前記複数のキューにそれぞれ対応する複数の第2の重みとを管理する。前記コントローラは、前記複数の第2の重みに基づいて、前記複数のキューのうちの一つのキューをコマンド実行対象キューとして選択する。前記コントローラは、前記コマンド実行対象キューに格納されているコマンドの実行を開始する。前記コントローラは、前記コマンド実行対象キューに対応する前記第1の重みに基づいて、前記コマンド実行対象キューに対応する前記第2の重みを更新する。前記コントローラは、前記複数のキューの各々について、イレーズコマンドに関連付けられた重みと、プログラムコマンドに関連付けられた重みと、リードコマンドに関連付けられた重みを、前記第1の重みとして管理する。前記コントローラは、前記コマンド実行対象キューに格納されている前記コマンドのタイプに応じて、前記コマンド実行対象キューの前記イレーズコマンドに関連付けられている前記重み、前記コマンド実行対象キューの前記プログラムコマンドに関連付けられている前記重み、または前記コマンド実行対象キューの前記リードコマンドに関連付けられている前記重みを前記第1の重みとして選択する。
【図面の簡単な説明】
【0008】
【
図1】実施形態に係るメモリシステムとホストとの関係を示すブロック図。
【
図2】実施形態に係るメモリシステムの構成例を示すブロック図。
【
図3】実施形態に係るメモリシステムにおいて使用される、複数のチャンネルと複数のNAND型フラッシュメモリダイとの関係を示すブロック図。
【
図4】複数のキューの各々に対応する2種類のパラメータ(第1の重み、第2の重み)を用いて、複数のキューから最も高優先度のキューを選択するスケジューリング動作を実行するための構成例を示すブロック図。
【
図5】複数のキューの内の一つのキューに格納されているコマンドの実行が開始された場合にこのキューに対応する重み(第2の重み)を更新する動作を示す図。
【
図6】複数のキューの第2の重みを比較することによって最も高優先度のキューを選択する動作を説明するための図。
【
図7】同じ優先度の2以上のキューから最も高優先度のキューを選択する動作を説明するための図。
【
図8】ある時間の経過の度またはコマンドの実行の度に実行される重み回復動作を説明するための図。
【
図9】最も高優先度のキューとして選択されたキューの第2の重みを更新(消費)する重み消費動作と各キューの第2の重みを回復する重み回復動作を説明するための図。
【
図10】コマンドの実行の度に、最も高優先度のキューとして選択されたキューの第1の重みを他のキューにそれぞれ対応する第2の重みに分配する別の重み回復動作を説明するための図。
【
図11】先行するプログラムコマンドの実行を中断してリードコマンドを実行する動作を説明するための図。
【
図12】先行するプログラムコマンドの実行を継続する動作を説明するための図。
【
図13】先行するプログラムコマンドの実行を中断した後にプログラムコマンドの実行を再開する動作を説明するための図。
【
図14】ホストからのデータを書き込むために使用される第1のキューに付与すべき第1の重みとガベージコレクションのためにコピーすべきデータを書き込むために使用される第2のキューに付与すべき第2の重みを設定する動作を説明するための図。
【
図15】実施形態に係るメモリシステムにおいて実行されるスケジューリング動作の手順を示すフローチャート。
【
図16】イレーズコマンド、プログラムコマンドおよびリードコマンドにそれぞれ関連付けられた重みを使用して、第2の重みを更新する動作の手順を示すフローチャート。
【
図17】実施形態に係るメモリシステムにおいて実行されるサスペンド動作の手順を示すフローチャート。
【
図18】実施形態に係るメモリシステムにおいて実行される、ホストからのデータを書き込むために使用される第1のキューに付与すべき第1の重みとガベージコレクションのためにコピーすべきデータを書き込むために使用される第2のキューに付与すべき第2の重みを設定する動作の手順を示すフローチャート。
【発明を実施するための形態】
【0009】
以下、図面を参照して、実施形態を説明する。
図1は、実施形態に係るメモリシステムとホストとの関係を示すブロック図である。
【0010】
このメモリシステムは、不揮発性メモリにデータを書き込み、不揮発性メモリからデータを読み出すように構成された半導体ストレージデバイスである。このメモリシステムは、NAND型フラッシュメモリを含むソリッドステートドライブ(SSD)3として実現されている。
【0011】
ホスト(ホストデバイス)2は、複数のSSD3を制御するように構成されている。ホスト2は、複数のSSD3を含むストレージアレイをストレージとして使用するように構成された情報処理装置によって実現され得る。この情報処理装置はパーソナルコンピュータであってもよいし、サーバコンピュータであってもよい。
【0012】
なお、SSD3は、ストレージアレイ内に設けられる複数のストレージデバイスの一つとして利用されてもよい。ストレージアレイは、サーバコンピュータのような情報処理装置にケーブルまたはネットワークを介して接続されてもよい。ストレージアレイは、このストレージアレイ内の複数のストレージ(例えば複数のSSD3)を制御するコントローラを含んでもよい。SSD3がストレージアレイに適用された場合には、このストレージアレイのコントローラが、SSD3のホストとして機能してもよい。
【0013】
以下では、サーバコンピュータのような情報処理装置がホスト2として機能する場合を例示して説明する。
【0014】
ホスト(サーバ)2と複数のSSD3は、インタフェース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によって使用される、オペレーティングシステムおよびユーザアプリケーションが実行される。各仮想マシンに対応するオペレーティングシステムは、I/Oサービスを含む。このI/Oサービスは、論理ブロックアドレス(LBA)ベースのブロックI/Oサービスであってもよいし、あるいは、キー・バリュー・ストアサービスであってもよい。
【0019】
各仮想マシンに対応するオペレーティングシステムにおいては、I/Oサービスは、ユーザアプリケーションからのデータのライトまたはリードに関する要求に応答して、I/Oコマンド(ライトコマンド、リードコマンド)を発行する。これらI/Oコマンドはホスト2内の一つ以上のサブミッションキューに入れられる。
【0020】
SSD3のコントローラは、I/Oコマンド(ライトコマンド、リードコマンド)をホスト2から受信し、これら受信したライトコマンド、リードコマンドに基づいてSSD3内の不揮発性メモリを制御し、不揮発性メモリへのデータの書き込み、不揮発性メモリからのデータの読み出しを実行する。
【0021】
図2は、SSD3の構成例を示す。
SSD3は、コントローラ4と、不揮発性メモリ(例えば、NAND型フラッシュメモリ5)とを備える。SSD3は、ランダムアクセスメモリ、例えば、DRAM6も備えていてもよい。
【0022】
NAND型フラッシュメモリ5は、マトリクス状に配置された複数のメモリセルを含むメモリセルアレイを含む。NAND型フラッシュメモリ5は、2次元構造のNAND型フラッシュメモリであってもよいし、3次元構造のNAND型フラッシュメモリであってもよい。
【0023】
NAND型フラッシュメモリ5のメモリセルアレイは、複数のブロックBLK0~BLKx-1を含む。ブロックBLK0~BLKx-1の各々は複数のページ(ここではページP0~Py-1)を含む。ブロックBLK0~BLKx-1は、データを消去する消去動作の単位である。ブロックは、「消去ブロック」、「物理ブロック」、または「物理消去ブロック」と称されることもある。ページP0~Py-1は、データの書き込みおよび読み出し動作の単位である。
【0024】
コントローラ4は、Toggle NANDフラッシュインタフェース、オープンNANDフラッシュインタフェース(ONFI)のようなNANDインタフェース13を介して、不揮発性メモリであるNAND型フラッシュメモリ5に電気的に接続されている。コントローラ4は、NAND型フラッシュメモリ5を制御するように構成されたメモリコントローラとして動作する。このコントローラ4は、System-on-a-chip(SoC)のような回路によって実現されてもよい。
【0025】
NAND型フラッシュメモリ5は、
図3に示すように、複数のNAND型フラッシュメモリダイを含んでいてもよい。個々のNAND型フラッシュメモリダイは独立して動作可能である。このため、NAND型フラッシュメモリダイは、並列動作可能な単位として機能する。
図3においては、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として構成されてもよい。バンクは、複数のメモリダイをバンクインタリーブによって並列動作させるための単位として機能する。
図2の構成例においては、16チャンネルと、2つのバンクを使用したバンクインタリーブとによって、最大32個のNAND型フラッシュメモリダイを並列動作させることができる。
【0026】
次に、
図2のコントローラ4の構成について説明する。
コントローラ4は、NAND型フラッシュメモリ5のデータ管理およびブロック管理を実行するように構成されたフラッシュトランスレーション層(FTL)として機能し得る。このFTLによって実行されるデータ管理には、(1)論理アドレスそれぞれとNAND型フラッシュメモリ5の物理アドレスそれぞれとの間の対応関係を示すマッピング情報の管理、(2)NAND型フラッシュメモリ5の制約(例えば、ページ単位のリード/ライト動作とブロック単位の消去動作)を隠蔽するための処理、等が含まれる。論理アドレスは、SSD3の論理アドレス空間内の論理アドレスをアドレス指定するためにホスト2によって使用されるアドレスである。この論理アドレスとしては、通常、論理ブロックアドレス(LBA)が使用される。
【0027】
SSD3をアクセスするためにホスト2によって使用される論理アドレスそれぞれとNAND型フラッシュメモリ5の物理アドレスそれぞれとの間のマッピングの管理は、アドレス変換テーブル(論理物理アドレス変換テーブル:L2Pテーブル)31を用いて実行される。コントローラ4は、L2Pテーブル31を使用して、論理アドレスそれぞれと物理アドレスそれぞれとの間のマッピングを所定の管理サイズ単位で管理してもよい。ある論理アドレスに対応する物理アドレスは、この論理アドレスに対応するデータが書き込まれたNAND型フラッシュメモリ5内の最新の物理記憶位置を示す。L2Pテーブル31は、SSD3の電源オン時にNAND型フラッシュメモリ5からDRAM6にロードされてもよい。
【0028】
ブロック管理には、バッドブロック(不良ブロック)の管理と、ウェアレベリングと、ガベージコレクション(GC)等が含まれる。ウェアレベリングは、ブロックそれぞれの書き換え回数(プログラム/イレーズサイクルの数)を均一化するための動作である。
【0029】
GCは、フリーブロックの個数を増やすための動作である。フリーブロックとは、有効データを含まないブロックを意味する。GCにおいては、コントローラ4は、有効データと無効データとが混在する幾つかのブロック内の有効データを別のブロック(例えばフリーブロック)にコピーする。ここで、有効データとは、ある論理アドレスに関連付けられているデータを意味する。例えば、L2Pテーブル31から参照されているデータ(すなわち最新のデータとして論理アドレスに関連付けられているデータ)は有効データであり、後にホスト2からリードされる可能性がある。無効データとは、どの論理アドレスにも関連付けられていないデータを意味する。どの論理アドレスにも関連付けられていないデータは、もはやホスト2からリードされる可能性が無いデータである。そして、コントローラ4は、L2Pテーブル31を更新して、コピーされた有効データのコピー先の物理アドレスそれぞれを、コピーされた有効データの論理アドレスそれぞれにマッピングする。有効データが別のブロックにコピーされることによって無効データのみになったブロックはフリーブロックとして解放される。これによって、このブロックは、このブロックに対する消去動作が実行された後にデータの書き込みに再利用することが可能となる。
【0030】
コントローラ4は、SSD3をアクセスするためにホスト2によって使用される複数のネームスペースを管理する機能を有していてもよい。
【0031】
複数のネームスペースは互いに独立した論理アドレス範囲であり、一つのストレージデバイスをあたかも複数のストレージデバイスであるかのように動作させるために使用される。コントローラ4は、SSD3の論理アドレス空間に複数のネームスペースをマッピングしてもよい。各ネームスペースは連続する複数の論理アドレス(LBA)の集合を含む。各ネームスペースに対応する論理アドレス範囲は、LBA0から始まる。各ネームスペースは任意のサイズに設定可能である。
【0032】
コントローラ4は、ホストインタフェース11、CPU12、NANDインタフェース13、DRAMインタフェース14、直接メモリアクセスコントローラ(DMAC)15、スタティックRAM(SRAM)16、ECCエンコード/デコード部17、等を含む。これらホストインタフェース11、CPU12、NANDインタフェース13、DRAMインタフェース14、DMAC15、SRAM16、ECCエンコード/デコード部17は、バス10を介して相互接続される。
【0033】
ホストインタフェース11は、ホスト2との通信を実行するように構成されたホストインタフェース回路である。このホストインタフェース11は、例えば、PCIeコントローラ(NVMeコントローラ)であってもよい。あるいは、SSD3がEthernet(登録商標)を介してホスト2に接続される構成においては、ホストインタフェース11は、NVMe over Fabrics(NVMeOF)コントローラであってもよい。
【0034】
ホストインタフェース11は、ホスト2から様々なコマンドを受信する。これらコマンドには、ライトコマンド(プログラムコマンド)およびリードコマンドが含まれる。
【0035】
ライトコマンドは書き込むべきデータ(ライトデータ)をNAND型フラッシュメモリ5に書き込むコマンド(ライト要求)であり、例えば、ネームスペースを識別するためのネームスペース識別子(NSID)、ライトデータに関連付けられた論理アドレス(開始LBA)、このライトデータのデータサイズ、このライトデータが格納されているホスト2のメモリ(ライトバッファ)内の位置を示すデータポインタ(バッファアドレス)、等を含む。ホスト2のメモリは以下では単にホストメモリとも称する。
【0036】
リードコマンドはNAND型フラッシュメモリ5からデータを読み出すコマンド(リード要求)である。リードコマンドは、例えば、ネームスペースを識別するためのネームスペース識別子(NSID)、データ(読み出し対象データ)に関連付けられた論理アドレス(開始LBA)、読み出し対象データのデータサイズ、この読み出し対象データが転送されるべきホストメモリ(リードバッファ)内の位置を示すデータポインタ(バッファアドレス)、等を含む。
【0037】
これらライトコマンドおよびリードコマンドはNAND型フラッシュメモリ5をアクセスするためのコマンドとして使用される。
【0038】
CPU12は、ホストインタフェース11、NANDインタフェース13、DRAMインタフェース14、DMAC15、SRAM16、ECCエンコード/デコード部17を制御するように構成されたプロセッサである。CPU12は、SSD3の電源オンに応答してNAND型フラッシュメモリ5または図示しないROMから制御プログラム(ファームウェア)をDRAM6にロードし、そしてこのファームウェアを実行することによって様々な処理を行う。なお、ファームウェアはSRAM16上にロードされてもよい。
【0039】
CPU12は、ホスト2からの様々なコマンドを処理するためのコマンド処理等を実行することができる。コマンド処理においては、CPU12は、ホスト2から受信した各ライトコマンドおよび各リードコマンドに基づいて、NAND型フラッシュメモリ5にデータを書き込むライト制御動作、NAND型フラッシュメモリ5からデータを読み出すリード制御動作を制御する。
【0040】
さらに、上述のGCを実行するために、CPU12は、一つ以上コピー元ブロックから有効データをコピー対象データとして読み出すためのリード制御動作と、コピー対象データをコピー先ブロック(フリーブロック)に書き込むためのライト制御動作とを実行する。またさらに、CPU12は、必要に応じて、NAND型フラッシュメモリ5内のブロックに対する消去動作の実行も制御する。
【0041】
CPU12の動作は、上述のファームウェアによって制御される。なお、コマンド処理の一部または全部は、コントローラ4内の専用ハードウェアによって実行してもよい。
【0042】
さらに、CPU12は、スケジューラ21として機能することができる。なお、スケジューラ21の一部または全部も、コントローラ4内の専用ハードウェアによって実現されてもよい。
【0043】
スケジューラ21は、NAND型フラッシュメモリ5をアクセスするための複数のコマンドが各々に格納される複数のキューを用いて、NAND型フラッシュメモリ5に対するアクセスを制御するように構成されている。これら複数のキューはSRAM16の記憶領域の一部によって実現されてもよいし、DRAM6の記憶領域の一部によって実現されてもよい。
【0044】
複数のキューの各々においては、NAND型フラッシュメモリ5をアクセスするための様々なコマンドが格納される。NAND型フラッシュメモリ5のアクセスには、NAND型フラッシュメモリ5にデータを書き込むライト動作(プログラム動作)、NAND型フラッシュメモリ5からデータを読み出すリード動作、NAND型フラッシュメモリ5に既に書き込まれているデータをブロック単位で消去する消去動作が含まれる。
【0045】
したがって、複数のキューの各々に格納されるコマンドは、イレーズコマンド、ブログラムコマンド、リードコマンドに大別される。
【0046】
イレーズコマンドはデータをブロック単位で消去する消去動作を実行するために使用される、ブログラムコマンドはホスト2から受信したデータまたはGCのためにコピーすべきデータをNAND型フラッシュメモリ5に書き込むために使用される。リードコマンドはホスト2から要求されたリード対象データまたはGCのためにコピーすべきデータをNAND型フラッシュメモリ5から読み出すために使用される。
【0047】
複数のキューの各々は先入れ先出しバッファ(FIFOバッファ)として実現される。スケジューラ21は、複数のキューの各々に対応する2種類のパラメータ(第1の重み、第2の重み)を用いて、コマンドが実行されるべきキューを決定するスケジューリング動作を実行する。ここで、コマンドの実行とは、このコマンドに対応する動作を実行するためのコマンドシーケンスをNAND型フラッシュメモリ5に送信することによってこのコマンドに対応する動作をNAND型フラッシュメモリ5に実行させることを意味する。
【0048】
スケジューラ21は、複数のキューにそれぞれ対応する複数の第1の重みと、複数のキューにそれぞれ対応する複数の第2の重みとを管理する。複数の第2の重みは、複数のキュー間の優先順位を定めるために使用される。
【0049】
複数の第1の重みの各々は任意の値に設定可能であり、個々のキューに格納されるコマンドが実行される頻度を制御するためのパラメータとして使用される。
【0050】
例えば、複数のキューのうちで最も大きい第2の重みを有するキューを最も高優先度のキューとして選択するというポリシー(ポリシー#1)を利用するケースにおいては、一つのキューに格納されているコマンドの実行が開始される度に、スケジューラ21は、この一つのキューに対応する第2の重みからこの一つのキューに対応する第1の重みを減算すことによって、この一つのキューに対応する第2の重みを更新する。従って、キューに付与される第1の重みが大きいほど、このキューに格納されるコマンドが実行される頻度は少なくなり、キューに付与される第1の重みが大きいほど、このキューに格納されるコマンドが実行される頻度は多くなる。
【0051】
一方、複数のキューのうちで最も小さい第2の重みを有するキューを最も高優先度のキューとして選択するというポリシー(ポリシー#2)を利用するケースにおいては、一つのキューに格納されているコマンドの実行が開始される度に、スケジューラ21は、この一つのキューに対応する第2の重みにこの一つのキューに対応する第1の重みを加算すことによって、この一つのキューに対応する第2の重みを更新する。従って、キューに付与される第1の重みが大きいほど、このキューに格納されるコマンドが実行される頻度は減少され、キューに付与される第1の重みが大きいほど、このキューに格納されるコマンドが実行される頻度は増加される。
【0052】
このように、複数のキューのうちの一つのキューに対応する第2の重みは、この一つのキューに格納されているコマンドの実行が開始される場合に、この一つのキューに対応する第1の重みをこの一つのキューに対応する第2の重みから減算またはこの一つのキューに対応する第2の重みに加算することによって得られる値に更新される。
【0053】
スケジューラ21は、複数のキューのうち第2の重みが最も大きいまたは最も小さいキューを最も高優先度のキューとして選択する。ポリシー#1が適用される場合には、スケジューラ21は、複数のキューのうち第2の重みが最も大きいキューを最も高優先度のキューとして選択する。一方、ポリシー#2が適用される場合には、スケジューラ21は、複数のキューのうち第2の重みが最も小さいキューを最も高優先度のキューとして選択する。
【0054】
スケジューラ21は、最も高優先度のキューとして選択したキューに格納されているコマンドの実行を開始し、これによってNAND型フラッシュメモリ5へのデータの書き込み、NAND型フラッシュメモリ5からのデータの読み出し、またはNAND型フラッシュメモリ5に格納されているデータの消去を実行する。
【0055】
より詳しくは、スケジューラ21は、まず、選択したキューに格納されている次の実行対象コマンドをフェッチする。次の実行対象コマンドは、選択したキューに格納されているコマンドのうち、例えば、最初に格納されたコマンドである最も古いコマンドである。
【0056】
フェッチしたコマンドがプログラムコマンドである場合、スケジューラ21は、このプログラムコマンドに対応するプログラム動作を実行するためのコマンドシーケンスをNAND型フラッシュメモリ5に送信し、これによってNAND型フラッシュメモリ5にプログラム動作を開始させる。このコマンドシーケンスは、例えば、第1プログラムコマンド、ライトデータ、アドレス、第2プログラムコマンドを含む。
【0057】
フェッチしたコマンドがイレーズコマンドである場合、スケジューラ21は、このイレーズコマンドに対応する消去動作を実行するためのコマンドシーケンスをNAND型フラッシュメモリ5に送信し、これによってこのコマンドシーケンスで指定されたブロックに対する消去動作をNAND型フラッシュメモリ5に開始させる。このコマンドシーケンスは、例えば、第1イレーズコマンド、アドレス、第2イレーズコマンドを含む。
【0058】
フェッチしたコマンドがリードコマンドである場合、スケジューラ21は、このリードコマンドに対応するリード動作を実行するためのコマンドシーケンスをNAND型フラッシュメモリ5に送信し、これによってNAND型フラッシュメモリ5にリード動作を開始させる。このコマンドシーケンスは、例えば、第1のリードコマンド、アドレス、第2のリードコマンドを含む。
【0059】
また、スケジューラ21は、最も高優先度のキューとして選択したキューに対応する第2の重みを更新する。第2の重みを更新する動作は、最も高優先度のキューとして選択したキューに格納されているコマンドの実行を開始する時、例えば、最も高優先度のキューが決定された時に実行される。
【0060】
ポリシー#1が適用される場合には、スケジューラ21は、選択したキューに対応する第2の重みからこの選択したキューに対応する第1の重みを減算することによって、第2の重みを更新する。ポリシー#2が適用される場合には、スケジューラ21は、この選択したキューに対応する第2の重みにこの選択したキューに対応する第1の重みを加算することによって、第2の重みを更新する。
【0061】
このように、あるキューが最も高優先度のキューとして選択されると、このキューに対応する第2の重みがこのキューに対応する第1の重みだけ減少または増加される。
【0062】
したがって、あるキューに対応する第1の重みを大きな値に設定した場合には、このキューが最も高優先度のキューとして一旦選択されると、このキューに対応する第2の重みが大きく減少(または大きく増加)され、これによってしばらくの間は、このキューは最も高優先度のキューとして選択され難くなる。一方、あるキューに対応する第1の重みを小さな値に設定した場合には、このキューが最も高優先度のキューとして一旦選択されても、このキューに対応する第2の重みは大きく減少(または大きく増加)されないので、このキューが最も高優先度のキューとして再び選択され易くなる。
【0063】
例えば、NAND型フラッシュメモリ5に対するリードコマンドをNAND型フラッシュメモリ5に対するプログラムコマンドよりも高い頻度で実行したいケースにおいては、コントローラ4は、あるキュー(キュー#1)に複数のリードコマンドを含む第1のコマンドグループを格納し、別のキュー(キュー#2)に複数のプログラムコマンドを含む第2のコマンドグループを格納し、さらに、キュー#1に対応する第1の重みを例えば1に設定し、キュー#2に対応する第1の重みを例えば5に設定してもよい。
【0064】
例えば、ポリシー#1が適用される場合には、キュー#2に対応する第2の重みはキュー#2のプログラムコマンドの実行が開始される度に5だけ減少され、キュー#1に対応する第2の重みはキュー#1のリードコマンドの実行が開始される度に1だけ減少される。この結果、キュー#1に格納されている第1のコマンドグループ(リードコマンド)を、キュー#2に格納されている第2のコマンドグループ(プログラムコマンド)の5倍の頻度で実行することが可能となる。
【0065】
あるいは、ユーザアプリケーションAからの複数のコマンドを含む第1のコマンドグループをユーザアプリケーションBからの複数のコマンドを含む第2のコマンドグループよりも高い頻度で実行したいケースにおいては、コントローラ4は、第1のコマンドグループをあるキュー(キュー#1)に格納し、第2のコマンドグループを別のキュー(キュー#2)に格納し、キュー#1対応する第1の重みを例えば1に設定し、キュー#2に対応する第1の重みを例えば2に設定してもよい。この結果、キュー#1に格納されている第1のコマンドグループを、キュー#2に格納されている第2のコマンドグループの2倍の頻度で実行することが可能となる。
【0066】
NANDインタフェース13は、CPU12の制御の下、NAND型フラッシュメモリ5を制御するように構成されたメモリ制御回路である。
【0067】
DRAMインタフェース14は、CPU12の制御の下、DRAM6を制御するように構成されたDRAM制御回路である。DRAM6の記憶領域の一部は、L2Pテーブル31を格納するための記憶領域として利用されてもよい。
【0068】
DMAC15は、CPU12の制御の下、ホスト2のメモリと内部バッファ161との間のデータ転送を実行する。内部バッファ161は、例えば、ホスト2から受信したライトデータを一時的に格納するために使用される。ホスト2のメモリから内部バッファ161にライトデータを転送すべき場合には、CPU12は、ホスト2のメモリ内の位置を示す転送元アドレス、転送すべきライトデータのサイズ、内部バッファ161内の位置を示す転送先アドレスをDMAC15に対して指定する。
【0069】
ECCエンコード/デコード部17は、NAND型フラッシュメモリ5にデータをライトすべき時、データ(書き込むべきデータ)をエンコード(ECCエンコード)することによってこのデータにエラー訂正コード(ECC)を冗長コードとして付加する。NAND型フラッシュメモリ5からデータがリードされた時、ECCエンコード/デコード部17は、リードされたデータに付加されたECCを使用して、このデータのエラー訂正を行う(ECCデコード)。
【0070】
図4は、複数のキューの各々に対応する2種類のパラメータ(第1の重み、第2の重み)を用いて、複数のキューから最も高優先度のキューを選択するスケジューリング動作を実行するための構成例を示すブロック図である。以下では、上述のポリシー#1を使用する場合のスケジューリング動作を説明するが、上述のポリシー#2を使用する場合のスケジューリング動作も、以下に説明するポリシー#1を使用する場合のスケジューリング動作と同様にして実行することができる。
【0071】
例えば、一つのNAND型フラッシュメモリダイ当たりに8個のキュー(キュー#0、キュー#1、キュー#2、…、キュー#7)が設けられてもよい。あるNAND型フラッシュメモリダイをアクセスするための各コマンド(イレーズコマンド、プログラムコマンド、リードコマンド)は、このNAND型フラッシュメモリダイに対応する8個のキュー(キュー#0、キュー#1、キュー#2、…、キュー#7)のいずれかに格納される。
【0072】
例えば、コントローラ4は、あるライトコマンドをホスト2から受信した場合、この受信したライトコマンドに関連付けられたライトデータを書き込むべきNAND型フラッシュメモリダイを決定し、このライトコマンドを、この決定したNAND型フラッシュメモリダイに対応する8個のキューのうちの一つに、この決定したNAND型フラッシュメモリダイをアクセスするためのプログラムコマンドとして格納する。この場合、コントローラ4は、このライトコマンドを、8個のキューにそれぞれ対応する8個のコマンドグループのいちの一つのコマンドグループに分類し、一つのコマンドグループに対応するキューにこのNAND型フラッシュメモリダイに対するプログラムコマンドとして格納する。ライトコマンドを分類する方法は限定されず、任意の方法を使用し得る。
【0073】
例えば、複数のネームスペースのネームスペース識別子(NSID)それぞれと8個のキュー(キュー#0、キュー#1、キュー#2、…、キュー#7)のキュー識別子(キューID)それぞれとが関連付けられていてもよい。
【0074】
この場合、この受信したライトコマンドがネームスペース#1のNSID1を指定する場合には、コントローラ4は、このライトコマンドを、例えば、NSID1に関連付けられたキューID#0を有するキュー#0にこのNAND型フラッシュメモリダイをアクセスするためのプログラムコマンドとして格納してもよい。この受信したライトコマンドがネームスペース#2のNSID2を指定する場合には、コントローラ4は、このライトコマンドを、例えば、NSID2に関連付けられたキューID#1を有するキュー#1にこのNAND型フラッシュメモリダイをアクセスするためのプログラムコマンドとして格納してもよい。
【0075】
コントローラ4があるリードコマンドをホスト2から受信した場合、コントローラ4は、L2Pテーブル31を参照して、この受信したリードコマンドによって指定されたリード対象データが格納されているNAND型フラッシュメモリダイを決定し、そしてこのNAND型フラッシュメモリダイに対応する8個のキューのうちの一つにこのリードコマンドを格納する。
【0076】
例えば、ホスト2から受信したリードライトコマンドがNSID1を指定する場合には、コントローラ4は、このNAND型フラッシュメモリダイに対応する8個のキューのうち、例えば、NSID1に関連付けられたキューID#0を有するキュー#0にこのリードコマンドを格納してもよい。
【0077】
あるいは、NSIDそれぞれとキューIDそれぞれとを関連付ける代わりに、ホストメモリ内の複数のサブミッションキューを識別するサブミッションキュー識別子(SQID)それぞれと上述のキューIDそれぞれとが関連付けられていてもよい。
【0078】
この場合には、例えば、サブミッションキュー#1から取得されたライトコマンドは、このライトデータが書き込まれるべきNAND型フラッシュメモリダイに対応する8個の8個のキュー(キュー#0、キュー#1、キュー#2、…、キュー#7)のうち、例えば、サブミッションキュー#1のSQID#1に関連付けられたキューID1を有するキュー#1に格納されてもよい。
【0079】
また、例えば、サブミッションキュー#2から取得されたリードコマンドは、このリード対象データが格納されているNAND型フラッシュメモリダイに対応する8個の8個のキュー(キュー#0、キュー#1、キュー#2、…、キュー#7)のうち、サブミッションキュー#2のSQID#2に関連付けられたキューID#1を有するキュー#1に格納されてもよい。
【0080】
あるいは、各NAND型フラッシュメモリダイに対応する8個のキューのうちの一つ以上のキューをホスト2から受信されるリードコマンドを格納するためのリード用のキューとして使用し、別の一つ以上のキューをホスト2から受信されるライトコマンドを格納するためのライト用のキューとして使用してもよい。
【0081】
このように、スケジューラ21は、ホスト2から受信した各コマンドを上述の複数のキューに対応する複数のコマンドグループの一つのコマンドグループに分類し、受信した各コマンドを、この一つのコマンドグループに対応するキューに格納する。
【0082】
なお、ホスト2から受信した各コマンドをそのままキューに格納してもよいし、コントローラ4が、ホスト2から受信した各コマンドに対応する動作をNAND型フラッシュメモリダイに実こうさせるためのコマンドを生成し、この生成したコマンドをキューに格納してもよい。
【0083】
また、本実施形態では、複数のNAND型フラッシュメモリダイを並列にアクセスできるようにするために、個々のNAND型フラッシュメモリダイ毎に複数のキューを用意しているが、これら複数のキューが複数のNAND型フラッシュメモリダイによって共通に使用される構成が適用されてもよい。
【0084】
スケジューラ21は、キュー(#0~#7)にそれぞれ対応する重み管理テーブル(T#0~T#7)を用いて、キュー毎に第1の重みと第2の重みを管理する。
【0085】
例えば、キュー#0に対応する重み管理テーブルT#0においては、キュー#0に対応する第2の重みW0が格納されている。
【0086】
さらに、キュー#0に対応する重み管理テーブルT#0においては、イレーズコマンドに関連付けられた重みWe、プログラムコマンドに関連付けられた重みWp、リードコマンドに関連付けられた重みWrが、キュー#0に対応する第1の重みとして格納されている。
【0087】
重みWe、重みWp、重みWrの各々はキュー#0から取得されるコマンドのコマンドタイプに対応しており、例えば、キュー#0に格納されている次の実行対象コマンドがイレーズコマンドである場合には、第2の重みW0を更新するために重みWeが使用される。同様に、キュー#0に格納されている次の実行対象コマンドがプログラムコマンドである場合には、第2の重みW0を更新するために重みWpが使用され、キュー#0に格納されている次の実行対象コマンドがリードコマンドである場合には、第2の重みW0を更新するために重みWrが使用される。
【0088】
同様に、キュー#1に対応する重み管理テーブルT#1においては、キュー#1に対応する第2の重みW1が格納されている。さらに、キュー#1に対応する重み管理テーブルT#1においては、イレーズコマンドに関連付けられた重みWe、プログラムコマンドに関連付けられた重みWp、リードコマンドに関連付けられた重みWrが、キュー#1に対応する第1の重みとして格納されている。
【0089】
重みWe、重みWp、重みWrの各々はキュー#1から取得されるコマンドのコマンドタイプに対応しており、例えば、キュー#1に格納されている次の実行対象コマンドがイレーズコマンドである場合には、第2の重みW1を更新するために重みWeが使用される。同様に、キュー#1に格納されている次の実行対象コマンドがプログラムコマンドである場合には、第2の重みW1を更新するために重みWpが使用され、キュー#1に格納されている次の実行対象コマンドがリードコマンドである場合には、第2の重みW1を更新するために重みWrが使用される。
【0090】
NAND型フラッシュメモリダイの各々について、スケジューラ21は、8個の第2の重みW0~W7を互いに比較し、最も大きい第2の重みを有するキューを最も高優先度のキューとして選択する。そして、スケジューラ21は、選択したキューに格納されている次の実行対象コマンド(最も古いコマンド)をこの選択したキューからフェッチし、そしてフェッチしたコマンドの実行を開始する。
【0091】
この場合、スケジューラ21は、このフェッチしたコマンドに対応するコマンドシーケンスをNAND型フラッシュダイに送信することによって、このフェッチしたコマンドに対応する動作(ライト動作、リード動作、または消去動作)をNAND型フラッシュダイに実行させる。
【0092】
各キューに対応する重みWe、重みWp、重みWrは、任意の値に設定することができる。例えば、ホスト2が複数のキューの各々に対する重みWe、重みWp、重みWrの値を個別に指定できるようにしてもよい。
【0093】
ここで、各キューに対応する重みWe、重みWp、重みWrの設定例について説明する。
例えば、キュー#0をライト用のキューとして使用し、キュー#1をリード用のキューとして使用するケースにおいて、ライト用のキュー#0の重みWpを10、リード用のキュー#1の重みWrを1に設定した場合には、ライト用のキュー#0のプログラムコマンドが実行される度にW0から10が減算される。一方、W1については、リード用のキュー#1のリードコマンドが実行される度にW1から1が減算される。従って、リードコマンドをプログラムコマンドの10倍の頻度で実行することかできる。
【0094】
また、キュー#0およびキュー#1の各々をプログラムコマンド、イレーズコマンド、およびリードコマンドの格納に使用するケースにおいて、キュー#0のWe、Wp、Wrを10、10、1に設定し、キュー#1のWe、Wp、Wrを20、20、2に設定した場合には、キュー#1に格納されているコマンドを、キュー#2に格納されているコマンドの2倍の頻度で実行することができる。
【0095】
なお、2つ以上のキューに対応する第2の重みが同じであり且つこれら2つ以上のキューに対応する第2の重みが最も大きい場合(ポリシー#2の場合は最も小さい場合)、スケジューラ21は、これら2つ以上のキューのうち、より小さいキュー識別子またはより大きいキュー識別子を有するキューを最も高優先度のキューとして選択する。
図4では、より小さいキュー識別子を有するキューに対してより高優先度が与えられる場合が例示されている。
【0096】
図5は、キュー(#0~#7)内の一つのキューに格納されているコマンドの実行が開始される場合にこのキューに対応する重み(第2の重み)を更新する動作を示す図である。
【0097】
例えば、
図5の(A)に示されているように、キュー#0のWe、Wp、Wrが5、5、1に設定されている場合を想定する。最初に、キュー(#0~#7)の第2の重みW0~W7は初期値(例えば0)に設定される。
【0098】
キュー#0が最も高優先度のキューとして選択されると、キュー#0に格納されている次の実行対象コマンドの実行が開始される。次の実行対象コマンドがリードコマンドである場合、スケジューラ21は、重み管理テーブルT#0からリードコマンドに対応する重みWr(=1)を取得し、キュー#0に対応する第2の重みW0(=0)を、W0(=0)から1を減算した値(=-1)に更新する。
【0099】
そして、キュー#0が最も高優先度のキューとして再び選択されると、キュー#0に格納されている次の実行対象コマンドの実行が開始される。次の実行対象コマンドがプログラムコマンドである場合、スケジューラ21は、重み管理テーブルT#0からプログラムコマンドに対応する重みWp(=5)を取得し、キュー#0に対応する第2の重みW0(=-1)を、W0(=-1)から5を減算した値(=-6)に更新する。
【0100】
図5の(B)に示されているように、キュー#1のWe、Wp、Wrが10、10、2に設定されている場合を想定する。
【0101】
キュー#1が最も高優先度のキューとして選択されると、キュー#1に格納されている次の実行対象コマンドの実行が開始される。次の実行対象コマンドがリードコマンドである場合、スケジューラ21は、重み管理テーブルT#1からリードコマンドに対応する重みWr(=2)を取得し、キュー#1に対応する第2の重みW1(=0)を、W1(=0)から2を減算した値(=-2)に更新する。
【0102】
そして、キュー#1が最も高優先度のキューとして再び選択されると、キュー#1に格納されている次の実行対象コマンドの実行が開始される。次の実行対象コマンドがイレーズコマンドである場合、スケジューラ21は、重み管理テーブルT#1からイレーズコマンドに対応する重みWe(=10)を取得し、キュー#1に対応する第2の重みW0(==-2)を、W0(=-2)から10を減算した値(=-12)に更新する。
【0103】
図6は、キュー(#0~#7)に対応する第2の重みW0~W7を比較することによって最も高優先度のキューを選択する動作を説明するための図である。
【0104】
図6では、キュー#0~キュー#3にのみコマンドが格納されている場合が例示されている。W0、W1、W2、W3の現在の値が-5、-1、-4、-2である場合、スケジューラ21は、キュー#1を最も高優先度のキューとして選択し、キュー#1内のコマンドを実行する。
【0105】
図7は、同じ優先度の2以上のキューから最も高優先度のキューを選択する動作を説明するための図である。
【0106】
図7では、キュー#0~キュー#3にのみコマンドが格納されている場合が例示されている。W0、W1、W2、W3の現在の値が-5、-1、0、0である場合、スケジューラ21は、キュー#2とキュー#3のうち、より小さいキュー識別子を有するキュー#2を最も高優先度のキューとして選択し、キュー#2内のコマンドを実行する。
【0107】
図8は、ある時間の経過の度またはコマンドの実行の度に実行される重み回復動作を説明するための図である。
【0108】
図8では、キュー#0~キュー#3の4つのキューが設けられている場合が想定されている。
【0109】
スケジューラ21は、ある時間が経過する度にまたは一つのコマンドが実行される度に、予め設定された第1の値をキュー#0~キュー#3の第2の重みW0~W3の各々に加算することによって、第2の重みW0~W3の各々を初期値(例えば0)に近づける重み回復動作を実行する。
【0110】
例えば、ある時刻tにおいては、W0、W1、W2、W3の現在の値は-10、-5、-3、0である。時刻t+1において、W0、W1、W2、W3の現在の値にそれぞれ1が加算され、W0、W1、W2、W3の現在の値は-9、-4、-2、0になる。0が第2の重みの上限値として設定されている場合には、W3の現在の値は0に維持される。
【0111】
時刻t+2において、W0、W1、W2、W3の現在の値にそれぞれ1が加算され、W0、W1、W2、W3の現在の値は-8、-3、-1、0になる。時刻t+3において、W0、W1、W2、W3の現在の値にそれぞれ1が加算され、W0、W1、W2、W3の現在の値は-7、-2、0、0になる。時刻t+4において、W0、W1、W2、W3の現在の値にそれぞれ1が加算され、W0、W1、W2、W3の現在の値は-6、-1、0、0になる。
【0112】
このような重み回復動作により、各キューの第2の重みの絶対値が無制限に多くなることを抑制できるので、各キューの第2の重みの変動幅を実用的な範囲に収めることが可能となる。
【0113】
図9は、最も高優先度のキューとして選択されたキューの第2の重みを更新(消費)する重み消費動作と各キューの第2の重みを回復する重み回復動作を説明するための図である。
【0114】
図9では、キュー#0~キュー#3の4つのキューが設けられている場合が想定されている。
例えば、ある時刻tにおいては、W0、W1、W2、W3の現在の値は-10、-5、-3、0である。W3の現在の値が最も大きいので、キュー#3内のコマンドが実行される。
【0115】
このコマンドに対応する第1の重みWが3である場合(W=3)、時刻t+1において、W0、W1、W2、W3にそれぞれ1が加算され、さらにW3から3が減算される。この結果、W0、W1、W2、W3の現在の値は-9、-4、-2、-2になる。W2とW3の現在の値が最も大きいので、次に、よりキューIDが小さいキュー#2内のコマンドが実行される。
【0116】
このコマンドに対応する第1の重みWが6である場合(W=6)、時刻t+2において、W0、W1、W2、W3にそれぞれ1が加算され、さらにW2から6が減算される。この結果、W0、W1、W2、W3の現在の値は-8、-3、-7、-1になる。W3の現在の値が最も大きいので、次に、キュー#3内のコマンドが実行される。
【0117】
このコマンドに対応する第1の重みWが3である場合(W=3)、時刻t+3において、W0、W1、W2、W3にそれぞれ1が加算され、さらにW3から3が減算される。この結果、W0、W1、W2、W3の現在の値は-7、-2、-6、-3になる。W1の現在の値が最も大きいので、次に、キュー#1内のコマンドが実行される。
【0118】
このコマンドに対応する第1の重みWが7である場合(W=7)、時刻t+4において、W0、W1、W2、W3にそれぞれ1が加算され、さらにW1から7が減算される。この結果、W0、W1、W2、W3の現在の値は-6、-8、-5、-2になる。
【0119】
図10は、コマンドの実行の度に、最も高優先度のキューとして選択されたキューの第1の重みを他のキューにそれぞれ対応する第2の重みに分配する別の重み回復動作を説明するための図である。
【0120】
スケジューラ21は、一つのコマンドを実行する度に、実行された一つのコマンドが格納されていたキューに対応する第1の重みの値をこのキュー以外の他のキューにそれぞれ対応する第2の重みに均等に分配することによって、他のキューにそれぞれ対応する第2の重みの各々を初期値(例えば0)に近づける重み回復動作を実行する。
【0121】
図10では、キュー#0~キュー#3の4つのキューが設けられている場合が想定されている。
【0122】
例えば、ある時刻tにおいては、W0、W1、W2、W3の現在の値は-9、-5、-3、0である。W3の現在の値が最も大きいので、キュー#3内のコマンドが実行される。
【0123】
このコマンドに対応する第1の重みWが3である場合(W=3)、時刻t+1において、W3から3が減算され、この3がW0、W1、W2にそれぞれ例えば均等に分配される。この結果、W0、W1、W2、W3の現在の値は-8、-4、-2、-3になる。W2の現在の値が最も大きいので、次に、キュー#2内のコマンドが実行される。
【0124】
このコマンドに対応する第1の重みWが6である場合(W=6)、時刻t+2において、W2から6が減算され、この6がW0、W1、W3にそれぞれ例えば均等に分配される。この結果、W0、W1、W2、W3の現在の値は-6、-2、-8、-1になる。
【0125】
図11は、先行するプログラムコマンド(または先行するイレーズコマンド)の実行を中断してリードコマンドを実行する動作を説明するための図である。
【0126】
スケジューラ21は、リードコマンドが次の実行対象コマンドとして格納されており且つ複数のキューのうちで最も大きい第2の重み(ポリシー#2の場合は最も小さい第2の重み)を有する、という条件(サスペンド条件)を満たすキューが存在し、且つ対応するNAND型フラッシュメモリダイにおいて実行中のコマンドがイレーズコマンドまたはプログラムコマンドである場合、このリードコマンドを、先行するイレーズコマンドまたはプログラムコマンドよりも優先的に実行する。
【0127】
すなわち、スケジューラ21は、NAND型フラッシュメモリダイにサスペンドコマンドを送信することによって、イレーズコマンドまたはプログラムコマンドの実行を中断する。サスペンドコマンドは、NAND型フラッシュメモリダイに実行中の動作(ここでは、消去動作、プログラム動作)を一時的に中断させて、NAND型フラッシュメモリダイを他のコマンドを受付および実行可能な状態にするためのコマンドである。
【0128】
図11では、キュー#0~キュー#2の3つのキューが設けられている場合が想定されている。
例えば、ある時刻tにおいては、キュー#0に格納されていたプログラムコマンドに対応するプログラム動作がNAND型フラッシュメモリダイにおいて実行中である。W0の値はプログラムコマンドに対応する重みだけ既に減算されており、W0、W1、W2の現在の値は-5、-6、-4である。キュー#1に格納されている次の実行対象コマンドはリードコマンドであり、キュー#2に格納されている次の実行対象コマンドもリードコマンドである。
【0129】
キュー#2の次の実行対象コマンドはリードコマンドであり、且つキュー#2の第2の重みW2は最も大きいので、キュー#2は、サスペンド条件を満たしている。この場合、スケジューラ21は、NAND型フラッシュメモリダイにサスペンドコマンドを送信することによってプログラムコマンドの実行を中断し、代わりに、キュー#2から次の実行対象コマンド(リードコマンド)をフェッチし、このリードコマンドを実行する。
【0130】
このリードコマンドに対応する第1の重みWが3である場合(W=3)、時刻t+1において、W0、W1、W2にそれぞれ1が加算され、さらにW2から3が減算される。この結果、W0、W1、W2の現在の値は-4、-5、-6になる。
【0131】
一般に、プログラム動作および消去動作の各々の実行に要する時間はリード動作の実行に要する時間よりも長い。したがって、実行中のプログラムコマンド(またはイレーズコマンド)を中断してサスペンド条件を満たすキュー内のリードコマンドを、実行中のプログラムコマンド(またはイレーズコマンド)よりも優先して実行することにより、先行するプログラムコマンド(またはイレーズコマンド)によってリードコマンドの実行開始が遅くなることを防止することが可能となる。
【0132】
図12は、先行するプログラムコマンドの実行を継続する動作を説明するための図である。
【0133】
図12では、キュー#0~キュー#2の3つのキューが設けられている場合が想定されている。
例えば、ある時刻tにおいては、キュー#0に格納されていたプログラムコマンドに対応するプログラム動作がNAND型フラッシュメモリダイにおいて実行中である。W0の値はプログラムコマンドに対応する重みだけ既に減算されており、W0、W1、W2の現在の値は-5、-6、-7である。キュー#1に格納されている次の実行対象コマンドはリードコマンドであり、キュー#2に格納されている次の実行対象コマンドもリードコマンドである。
【0134】
しかし、キュー#1の第2の重みW1はW0よりも小さく、キュー#2の第2の重みW2はW0、W1よりも小さい。したがって、サスペンド条件を満たすキューは存在しない。この場合、スケジューラ21は、先行するプログラムコマンドの実行を継続する。
【0135】
時刻t+1において、W0、W1、W2にそれぞれ1が加算され、W0、W1、W2の現在の値は-4、-5、-5になる。
【0136】
図13は、先行するプログラムコマンドの実行を中断した後にプログラムコマンドの実行を再開する動作を説明するための図である。
【0137】
図13では、キュー#0~キュー#2の3つのキューが設けられている場合が想定されている。
例えば、ある時刻tにおいては、キュー#0に格納されていたプログラムコマンドに対応するプログラム動作がNAND型フラッシュメモリダイにおいて実行中である。W0の値はプログラムコマンドに対応する重みだけ既に減算されており、W0、W1、W2の現在の値は-5、-4、-4である。キュー#1に格納されている次の実行対象コマンドはリードコマンドであり、キュー#2に格納されている次の実行対象コマンドもリードコマンドである。
【0138】
キュー#2およびキュー#3はサスペンド条件を満たしている。この場合、スケジューラ21は、NAND型フラッシュメモリダイにサスペンドコマンドを送信することによってプログラムコマンドの実行を中断し、代わりに、よりキューIDが小さいキュー#1から次の実行対象コマンド(リードコマンド)をフェッチし、このリードコマンドの実行を開始する。
【0139】
このリードコマンドに対応する第1の重みWが3である場合(W=3)、時刻t+1において、W0、W1、W2にそれぞれ1が加算され、さらにW1から3が減算される。この結果、W0、W1、W2の現在の値は-4、-6、-3になる。時刻t+1において、キュー#2はサスペンド条件を満たしている。
【0140】
このため、キュー#1に格納されていたリードコマンドの実行の完了後、スケジューラ21は、キュー#2から次の実行対象コマンド(リードコマンド)をフェッチし、このリードコマンドの実行を開始する。
【0141】
このリードコマンドに対応する第1の重みWが3である場合(W=3)、時刻t+2において、W0、W1、W2にそれぞれ1が加算され、さらにW2から3が減算される。この結果、W0、W1、W2の現在の値は-3、-5、-5になる。
【0142】
もはやサスペンド条件を満たしているキューは存在しないので、キュー#1に格納されていたリードコマンドの実行の完了後、スケジューラ21は、中断していたコマンドの実行の再開を指示するコマンドをNAND型フラッシュメモリダイに送信し、これによって中断していたプログラムコマンドの実行を再開する。
【0143】
そして、時刻t+2において、W0、W1、W2にそれぞれ1が加算され、この結果、W0、W1、W2の現在の値は-2、-4、-4になる。
【0144】
本実施形態では、8個のキュー(キュー#0、キュー#1、キュー#2、…、キュー#7)にそれぞれ対応する第1の重みの設定に応じて、以下のような様々なスケジューリング動作を実行することができる。
【0145】
(1)8個のキューの全ての第1の重みを0に設定した場合には、どのキューのコマンドが実行された場合でも、W0~W7は変化せず、初期値に維持される。したがって、スケジューラ21は、8個のキューを8レベル-プライオリティ・キューイングとして機能させることができる。
【0146】
この場合、最初に、最も小さいキューIDを有するキュー#0が最も高優先度のキューとして選択される。キュー#0に格納されている各コマンドが実行される。このキュー#0内のコマンドが無くなると、次に最も小さいキューIDを有するキュー#1が最も高優先度のキューとして選択され、キュー#1に格納されている各コマンドが実行される。このキュー#1内のコマンドが無くなると、次に最も小さいキューIDを有するキュー#2が最も高優先度のキューとして選択される。
【0147】
(2)8個のキューの全ての第1の重みを同じ値に設定した場合には、スケジューラ21は、8個のキューをラウンド・ロビン・キューイングとして機能させることができる。
【0148】
この場合、最初に、最も小さいキューIDを有するキュー#0が最も高優先度のキューとして選択され、のキュー#0に格納されている一つのコマンドが実行される。W0は減少される。残りのキュー#1~キュー#7のうちで最も小さいキューIDを有するキュー#1が最も高優先度のキューとして選択される。このキュー#1に格納されている一つのコマンドが実行されると、W1も減少するので、キュー#2~キュー#7のうちで最も小さいキューIDを有するキュー#2が最も高優先度のキューとして選択される。
【0149】
(3)8個のキューに互いに異なる第1の重みを設定した場合には、スケジューラ21は、これら第1の重みに基づいて、8個のキューにそれぞれ格納される8個のコマンドグループの各々に、NAND型フラッシュメモリ5をアクセスするための時間を配分することができ、8個のキューを
図5~
図13で説明したように動作させることができる。
【0150】
図14は、ホスト2からのデータを書き込むために使用されるキューに付与すべき第1の重みとガベージコレクションのためにコピーすべきデータを書き込むために使用される第2のキューに付与すべき第1の重みを設定する動作を説明するための図である。
【0151】
図14の(A)に示すように、コントローラ4は、NAND型フラッシュメモリダイに対するコマンドを格納するためのキューとして、ホスト2からのデータをNAND型フラッシュメモリダイに書き込むために使用されるキュー(キュー#0)と、NANDフラッシュメモリ5のガベージコレクションのためにコピーすべきデータをこのNAND型フラッシュメモリダイに書き込むために使用されるキュー(キュー#n)とを割り当てる。
【0152】
SSD3においては、NANDフラッシュメモリ5に書き込まれるデータの量は、ホスト2によって書き込まれるデータの量と、ガベージコレクションによって書き込まれるデータの量の和である。このため、一般に、SSD3のライトアンプリフィケーションは1よりも大きな値となる。ライトアンプリフィケーション(WA)は、以下のように定義される。
【0153】
WA=「SSDにライトされたデータの総量」 / 「ホストからSSDにライトされたデータの総量」
「SSDにライトされたデータの総量」は、ホストからSSDにライトされたデータの総量とガベージコレクションによって内部的にSSDにライトされたデータの総量との和に相当する。
【0154】
例えば、ライトアンプリフィケーションが3である場合には、ホスト2によって書き込まれるデータの量とガベージコレクションによって書き込まれるデータの量との割合は、1:2である。この場合、ガベージコレクションによる書き込みをホスト2による書き込みの2倍のレートで実行することができれば、ホスト2による書き込みのレイテンシーを安定させることが可能となる。
【0155】
ライトアンプリフィケーションは、ガベージコレクションのためのコピー元ブロックに含まれる有効データと無効データの割合に応じて決定される。
【0156】
このため、コントローラ4は、不揮発性メモリの複数のブロックから選択される一つ以上のコピー元ブロック(GCソース)に格納されている、有効データと無効データの割合を求める。
図14の(B)では、GCソースに格納されている有効データはハッチングによって示されており、GCソースに格納されている無効データは空白によって示されている。
【0157】
そして、コントローラ4は、求めた割合に基づいて、ホスト2からのデータをNAND型フラッシュメモリダイに書き込むために使用されるキュー#0に付与すべき第1の重みと、ガベージコレクションのためにコピーすべきデータをこのNAND型フラッシュメモリダイに書き込むために使用されるキュー#nに付与すべき第1の重みとを設定する。
【0158】
より詳しくは、コントローラ4は、キュー#0に対応する第1の重みとキュー#nに対応する第1の重みの割合が一つ以上のコピー元ブロックに含まれる有効データと無効データの割合になるように、有効データと無効データの割合に基づいて、キュー#0に対応する第1の重みとキュー#nに対応する第1の重みをそれぞれ設定する。
【0159】
換言すれば、コントローラ4は、キュー#0に対応する第1の重みは有効データの量に比例した値に設定し、キュー#nに対応する第1の重みを無効データの量に比例した値に設定する。キュー#0に対応する第1の重みがw(>1)である場合には、キュー#nに対応する第1の重みは、以下の式で表される値によって設定されてもよい。
【0160】
w×Invalidated/Valid
ここで、Invalidated/Validは、有効データに対する無効データの割合を示す。
【0161】
例えば、一つ以上のコピー元ブロックに格納されている、有効データと無効データの割合が2(有効データ):1(無効データ)である場合には、キュー#0に対応する第1の重みとキュー#nに対応する第1の重みの割合が2:1となるようにキュー#0に対応する第1の重みとキュー#nに対応する第1の重みをそれぞれ設定すればよい。これにより、キュー#nに格納されるプログラムコマンド群をキュー#0に格納されるプログラムコマンド群の2倍の頻度で実行することが可能となる。
【0162】
キュー#0に対応する第1の重みとしてプログラムコマンドの重みとイレーズコマンドの重みとリードコマンドの重みが管理されており、さらにキュー#nに対応する第1の重みとしてプログラムコマンドの重みとイレーズコマンドの重みとリードコマンドの重みが管理されている場合には、コントローラ4は、キュー#0に対応するプログラムコマンドの重みとキュー#nに対応するプログラムコマンドの重みの割合が一つ以上のコピー元ブロックに含まれる有効データと無効データの割合になるように、有効データと無効データの割合に基づいて、キュー#0に対応するプログラムコマンドの重みとキュー#nに対応するプログラムコマンドの重みをそれぞれ設定すればよい。
【0163】
コントローラ4は、キュー#0とキュー#nのペア、つまりホスト書き込み用のキューとガベージコレクションのための書き込み用のキューとのペアを、ネームスペース毎に割り当ててもよい。
【0164】
この場合、コントローラ4は、ネームスペース毎に、一つ以上のコピー元ブロックに含まれる有効データと無効データの割合を求め、この割合に基づいて、各ネームスペースに対応する2つのキューそれぞれに対応する第1の重みを設定してもよい。
【0165】
このように、本実施形態では、コントローラ4は、キュー#0に対応する第1の重みとキュー#nに対応する第1の重みを制御することによって、ライトアンプリフィケーションが低い場合にはGCによって書き込まれるデータ量に対するホスト2によって書き込まれるデータ量の割合を上げ、ライトアンプリフィケーションが高い場合にはこの割合を下げることにより、ワークロード変動によるライトアンプリフィケーション変動に起因するライトレイテンシ変動を抑制することが可能となる。有効データと無効データの割合を算出するために使用するコピー元ブロックの数を少なくすれは、ワークロード変動に対する追従性を高めることができる。また、有効データと無効データの割合を算出するために使用するコピー元ブロックの数を多くすれば、性能変動を再策することができる。
【0166】
図15は、SSD3において実行されるスケジューリング動作の手順を示すフローチャートである。
【0167】
コントローラ4は、
図4で説明したキュー#0~キュー#7に対応する第2の重みW0~W7に基づいてキュー#0~キュー#7の優先度を決定し、キュー#0~キュー#7の中から最も高優先度のキューを選択する(ステップS101)。ステップS101では、コントローラ4は、キュー#0~キュー#7に対応する重み管理テーブルT#0~T#7から第2の重みW0~W7を取得し、これら第2の重みW0~W7を互いに比較することによって最も大きい第2の重みを有するキューを最も高優先度のキューとして選択する。
【0168】
コントローラ4は、選択したキューに格納されている次の実行対象コマンドをこの選択したキューからフェッチし、そしてこのフェッチしたコマンドの実行を開始する(ステップS102)。
【0169】
コントローラ4は、選択したキューに付与された第1の重みを、この選択したキューに対応する重み管理テーブルから取得する(ステップS103)。コントローラ4は、選択したキューの第2の重みから選択したキューの第1の重みを減算することによって、選択したキューの第2の重みを更新する(ステップS104)。選択したキューの第1の重みとして、イレーズコマンドに関連付けられた重みWe、プログラムコマンドに関連付けられた重みWp、リードコマンドに関連付けられた重みWrが管理されている場合には、コントローラ4は、実行が開始されたコマンド(つまり選択したキューからフェッチしたコマンド)のコマンドタイプに対応する重みを選択し、選択した重みを第1の重みとして使用することによって、選択したキューの第2の重みを更新する。
【0170】
そして、コントローラ4は、各キューに対応する第2の重みを増やして初期値(例えば0)に近づける重み回復動作を実行する(ステップS105)。
【0171】
図16は、イレーズコマンド、プログラムコマンドおよびリードコマンドにそれぞれ関連付けられた重みを使用して、第2の重みを更新する動作の手順を示すフローチャートである。
【0172】
コントローラ4は、最も高優先度のキューとして選択されたキューに格納されているコマンドがイレーズコマンド、プログラムコマンド、リードコマンドのいずれであるかを判定する(ステップS111、S112、S113)。
【0173】
選択されたキューに格納されているコマンドがイレーズコマンドである場合(ステップS111のYES)、コントローラ4は、イレーズコマンドに対応する重みを、選択されたキューに対応する重み管理テーブルから取得する(ステップS114)。そして、コントローラ4は、選択されたキューに対応する第2の重みからイレーズコマンドに対応する重みを減算することによって、選択されたキューに対応する第2の重みを更新する(ステップS115)。
【0174】
選択されたキューに格納されているコマンドがプログラムコマンドである場合(ステップS112のYES)、コントローラ4は、プログラムコマンドに対応する重みを、選択されたキューに対応する重み管理テーブルから取得する(ステップS116)。そして、コントローラ4は、選択されたキューに対応する第2の重みからプログラムコマンドに対応する重みを減算することによって、選択されたキューに対応する第2の重みを更新する(ステップS117)。
【0175】
選択されたキューに格納されているコマンドがリードコマンドである場合(ステップS113のYES)、コントローラ4は、リードコマンドに対応する重みを、選択されたキューに対応する重み管理テーブルから取得する(ステップS118)。そして、コントローラ4は、選択されたキューに対応する第2の重みからリードコマンドに対応する重みを減算することによって、選択されたキューに対応する第2の重みを更新する(ステップS119)。
【0176】
図17は、SSD3において実行されるサスペンド動作の手順を示すフローチャートである。
コントローラ4は、プログラムコマンド(またはイレーズコマンド)が実行中であるか否かを判定する(ステップS121)。ステップS121では、選択されたキューからフェッチされた先行するコマンドがプログラムコマンド(またはイレーズコマンド)である場合、プログラムコマンド(またはイレーズコマンド)が実行中であると判定されてもよい。
【0177】
プログラムコマンド(またはイレーズコマンド)が実行中である場合(ステップS121のYES)、コントローラ4は、サスペンド条件を満たすキューが存在するか否かを判定する(ステップS122)。サスペンド条件を満たすキューは、リードコマンドが次の実行対象コマンドとして格納されており且つ複数のキューのうちで最も大きい第2の重み(ポリシー#2の場合は最も小さい第2の重み)を有するキューである。
【0178】
サスペンド条件を満たすキューが存在する場合(ステップS122のYES)、コントローラ4は、プログラムコマンド(またはイレーズコマンド)の実行を中断し、サスペンド条件を満たすキューに格納されている次の実行対象コマンドの実行を開始する(ステップS123)。
【0179】
サスペンド条件を満たすキューが存在しない場合(ステップS122のNO)、コントローラ4は、プログラムコマンド(またはイレーズコマンド)の実行を中断せずに、プログラムコマンド(またはイレーズコマンド)の実行を継続する(ステップS124)。
【0180】
図18は、ホスト2からのデータを書き込むために使用される第1のキューに付与すべき第1の重みとガベージコレクションのためにコピーすべきデータを書き込むために使用される第2のキューに付与すべき第2の重みを設定する動作の手順を示すフローチャートである。
【0181】
コントローラ4は、有効データと無効データとが混在する複数のブロックの中から、GCのための一つ以上のコピー元ブロックを選択する(ステップS131)。コントローラ4は、選択した一つ以上のコピー元ブロックに格納されている、有効データと無効データの割合を求める(ステップS132)。
【0182】
そして、コントローラ4は、ホスト2からのデータを書き込むために使用される第1のキューに対応する第1の重みとガベージコレクションのためにコピーすべきデータを書き込むために使用される第2のキューに対応する第1の重みの割合が一つ以上のコピー元ブロックに含まれる有効データと無効データの割合になるように、一つ以上のコピー元ブロックに含まれる有効データと無効データの割合に基づいて、第1のキューに対応する第1の重みと第2のキューに対応する第1の重みをそれぞれ設定する(ステップS133)。
【0183】
なお、ステップS132では、コントローラ4は、一つ以上のコピー元ブロックに含まれる、有効データの量と無効データの量を求め、ステップ133では、コントローラ4は、求めた有効データの量に比例した値を第1のキューに対応する第1の重みとして付与し、求めた無効データの量に比例した値を第2のキューに対応する第1の重みとして付与してもよい。
【0184】
以上説明したように、本実施形態によれば、NAND型フラッシュメモリ5をアクセスするための複数のコマンドが各々に格納される複数のキューが管理され、あるキューが最も高優先度のキューとして選択されると、このキューに対応する第2の重みがこのキューに対応する第1の重みだけ減少される。したがって、あるキューに対応する第1の重みを大きな値に設定した場合には、このキューが最も高優先度のキューとして一旦選択されると、このキューに対応する第2の重みが大きく減少(または大きく増加)され、これによってこのキューは最も高優先度のキューとして選択され難くなる。一方、あるキューに対応する第1の重みを小さな値に設定した場合には、このキューが最も高優先度のキューとして一旦選択されても、このキューに対応する第2の重みは大きく減少(または大きく増加)されないので、これによってこのキューが最も高優先度のキューとして再び選択され易くなる。
【0185】
よって、これら第1の重みに基づいて、複数のキューにそれぞれ格納される複数のコマンドグループの各々に、NAND型フラッシュメモリ5をアクセスするための時間を配分することができ、NAND型フラッシュメモリ5に対するアクセスを柔軟に制御可能となる。
【0186】
また、プログラムコマンドに関連付けられた重みと、イレーズコマンドに関連付けられた重みと、リードコマンドに関連付けられた重みとを、第1の重みとして使用することにより、実行されるコマンドのタイプに応じて、第2の重みから減算される第1の重みの値を適応的に変化させることが可能となる。
【0187】
よって、例えば、比較的多くの時間を必要する消去動作(またはプログラム動作)を実行するためのイレーズコマンド(またはプログラムコマンド)の重みを大きくし、所要時間の短いリード動作を実行するためのリードコマンドの重みを小さくすることにより、コマンドの実行に要する時間を考慮して、複数のキューにそれぞれ格納される複数のコマンドグループの各々に、NAND型フラッシュメモリ5をアクセスするための時間を配分することが可能となる。
【0188】
また、一つ以上のコピー元ブロックに格納されている、有効データと無効データの割合に基づいて、ホスト2からのデータを書き込むために使用されるキューに付与すべき第1の重みとガベージコレクションのためにコピーすべきデータを書き込むために使用される第2のキューに付与すべき第1の重みが設定される。これにより、スケジューリングの仕組みを使用して、ホスト2からのデータを書き込みのために使用されるプログラムコマンド群が実行される頻度とGCのための使用されるプログラムコマンド群が実行される頻度を適切に調整することが可能となり、ライトアンプリフィケーション変動に起因するライトレイテンシ変動を抑制することが可能となる。
【0189】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0190】
2…ホスト、3…SSD、4…コントローラ、5…NAND型フラッシュメモリ、21…スケジューラ。