IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 東芝メモリ株式会社の特許一覧

<>
  • 特開-メモリシステム 図1
  • 特開-メモリシステム 図2
  • 特開-メモリシステム 図3
  • 特開-メモリシステム 図4
  • 特開-メモリシステム 図5
  • 特開-メモリシステム 図6
  • 特開-メモリシステム 図7
  • 特開-メモリシステム 図8
  • 特開-メモリシステム 図9
  • 特開-メモリシステム 図10
  • 特開-メモリシステム 図11
  • 特開-メモリシステム 図12
  • 特開-メモリシステム 図13
  • 特開-メモリシステム 図14
  • 特開-メモリシステム 図15
  • 特開-メモリシステム 図16
  • 特開-メモリシステム 図17
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024103198
(43)【公開日】2024-08-01
(54)【発明の名称】メモリシステム
(51)【国際特許分類】
   G06F 12/00 20060101AFI20240725BHJP
【FI】
G06F12/00 560A
【審査請求】未請求
【請求項の数】25
【出願形態】OL
(21)【出願番号】P 2023007399
(22)【出願日】2023-01-20
(71)【出願人】
【識別番号】318010018
【氏名又は名称】キオクシア株式会社
(74)【代理人】
【識別番号】110001737
【氏名又は名称】弁理士法人スズエ国際特許事務所
(72)【発明者】
【氏名】渡邊 秀一
【テーマコード(参考)】
5B160
【Fターム(参考)】
5B160AA14
5B160AA15
5B160CD04
(57)【要約】
【課題】アクセス性能を向上できるメモリシステムを実現する。
【解決手段】メモリシステムのコントローラは、前記複数のコマンドキューのそれぞれの用途を、前記複数のコマンドキューのそれぞれからフェッチされた一つ以上のコマンドの種類に基づいて推定する。前記コントローラは、前記複数のコマンドキューのそれぞれの用途と、前記メモリシステムにおけるリソースの使用状況とに基づいて、前記複数のコマンドキューから、次にコマンドがフェッチされるべきコマンドキューを決定する。前記コントローラは、前記決定されたコマンドキューからコマンドをフェッチする。
【選択図】図7
【特許請求の範囲】
【請求項1】
ホストに接続可能なメモリシステムであって、
不揮発性メモリと、
前記不揮発性メモリを制御し、
前記ホストから前記メモリシステムに対して発行されたコマンドをそれぞれ格納する複数のコマンドキューからコマンドをフェッチし、
前記フェッチされたコマンドに対応する処理を実行するように構成されたコントローラと、を具備し、
前記コントローラは、
第1のタイミングにおいて前記複数のコマンドキューのそれぞれの用途を、前記複数のコマンドキューのそれぞれからフェッチされた一つ以上のコマンドの種類に基づいて推定し、
前記複数のコマンドキューのそれぞれの用途と、前記メモリシステムにおけるリソースの使用状況とに基づいて、前記複数のコマンドキューから、次にコマンドがフェッチされるべきコマンドキューを決定し、
前記決定されたコマンドキューからコマンドをフェッチし、
第2のタイミングにおいて、前記複数のコマンドキューのそれぞれの用途を、前記複数のコマンドキューのそれぞれからフェッチされた一つ以上のコマンドの種類に基づいて再度推定するように構成される、
メモリシステム。
【請求項2】
前記コントローラは、前記不揮発性メモリから読み出されたデータを一時的に記憶するリードバッファと、前記不揮発性メモリに書き込まれるべきデータを一時的に記憶するライトバッファとを管理するように構成され、
前記コマンドの種類毎のカウンタは、前記リードバッファを新たに使用するコマンドをカウントする第1リードカウンタと、前記ライトバッファを新たに使用するコマンドをカウントする第1ライトカウンタと、前記リードバッファおよび前記ライトバッファのいずれも新たに使用しないコマンドをカウントする第1汎用カウンタとを含み、
前記コントローラは、前記第1リードカウンタ、前記第1ライトカウンタ、および前記第1汎用カウンタを用いて、前記複数のコマンドキューのそれぞれの用途を推定するように構成される、
請求項1に記載のメモリシステム。
【請求項3】
前記第2のタイミングは、前記第1のタイミングから、前記複数のコマンドキューからフェッチされたコマンドの総数が第1閾値に達したタイミングである、
請求項2に記載のメモリシステム。
【請求項4】
前記第2のタイミングは、第1のタイミングから第1時間が経過したタイミングである、
請求項2に記載のメモリシステム。
【請求項5】
前記コントローラは、前記次にコマンドがフェッチされるべきキューが前記複数のコマンドキューの内の第1コマンドキューである場合、前記第1コマンドキューの用途と、前記メモリシステムにおけるリソースの使用状況とに基づいて、前記第1コマンドキューからコマンドをフェッチするか否かを決定するように構成される、
請求項1に記載のメモリシステム。
【請求項6】
前記コントローラは、
前記複数のコマンドキューのそれぞれに対応するコマンドの種類毎のカウンタを管理し、
前記コマンドの種類毎のカウンタを用いて、前記複数のコマンドキューのそれぞれからフェッチされた前記一つ以上のコマンドの種類毎の数を取得し、
前記取得された一つ以上のコマンドの種類毎の数に基づいて、対応するコマンドキューの用途を推定するように構成される、
請求項1に記載のメモリシステム。
【請求項7】
前記コントローラは、前記第1のタイミングで、前記第1リードカウンタ、前記第1ライトカウンタ、および前記第1汎用カウンタを用いて、前記複数のコマンドキューのそれぞれの用途を推定するように構成される、
請求項2に記載のメモリシステム。
【請求項8】
前記コントローラは、前記複数のコマンドキューの内の第1コマンドキューに対応する前記第1リードカウンタ、前記第1ライトカウンタ、および前記第1汎用カウンタを用いて、前記第1コマンドキューの用途を推定するように構成され、
前記コントローラは、
前記第1リードカウンタの値、前記第1ライトカウンタの値、および前記第1汎用カウンタの値の中で前記第1リードカウンタの値が最大である場合、前記リードバッファを新たに使用するコマンドを示す第1情報を、前記第1コマンドキューに関連付け、
前記第1リードカウンタの値、前記第1ライトカウンタの値、および前記第1汎用カウンタの値の中で前記第1ライトカウンタの値が最大である場合、前記ライトバッファを新たに使用するコマンドを示す第2情報を、前記第1コマンドキューに関連付け、
前記第1リードカウンタの値、前記第1ライトカウンタの値、および前記第1汎用カウンタの値の中で前記第1汎用カウンタの値が最大である場合、前記リードバッファおよび前記ライトバッファのいずれも新たに使用しないコマンドを示す第3情報を、前記第1コマンドキューに関連付けるように構成される、
請求項2に記載のメモリシステム。
【請求項9】
前記コントローラは、
前記次にコマンドがフェッチされるべきコマンドキューが前記第1コマンドキューであり、且つ前記第1コマンドキューに前記第1情報が関連付けられている場合、前記リードバッファ内の空き領域のサイズに基づいて、前記第1コマンドキューからコマンドをフェッチするか否かを決定し、
前記次にコマンドがフェッチされるべきコマンドキューが前記第1コマンドキューであり、且つ前記第1コマンドキューに前記第2情報が関連付けられている場合、前記ライトバッファ内の空き領域のサイズに基づいて、前記第1コマンドキューからコマンドをフェッチするか否かを決定し、
前記次にコマンドがフェッチされるべきコマンドキューが前記第1コマンドキューであり、且つ前記第1コマンドキューに前記第3情報が関連付けられている場合、前記第1コマンドキューからコマンドをフェッチするように構成される、
請求項8に記載のメモリシステム。
【請求項10】
前記コントローラは、
前記リードバッファを新たに使用するコマンドが前記第1コマンドキューからフェッチされた場合、前記第1コマンドキューに対応する前記第1リードカウンタをインクリメントし、
前記ライトバッファを新たに使用するコマンドが前記第1コマンドキューからフェッチされた場合、前記第1コマンドキューに対応する前記第1ライトカウンタをインクリメントし、
前記リードバッファおよび前記ライトバッファのいずれも新たに使用しないコマンドが前記第1コマンドキューからフェッチされた場合、前記第1コマンドキューに対応する前記第1汎用カウンタをインクリメントするように構成される、
請求項8に記載のメモリシステム。
【請求項11】
前記コントローラは、前記複数のコマンドキューそれぞれに前記第1情報、前記第2情報、および前記第3情報のうちのいずれかの情報を関連付けたことに応じて、前記複数のコマンドキューそれぞれに対応する前記第1リードカウンタ、前記第1ライトカウンタ、および前記第1汎用カウンタのそれぞれを初期値にリセットするように構成される、
請求項8に記載のメモリシステム。
【請求項12】
前記リソースの使用状況は、前記不揮発性メモリから読み出されたデータを一時的に記憶するリードバッファの空き領域のサイズと、前記不揮発性メモリに書き込まれるべきデータを一時的に記憶するライトバッファの空き領域のサイズとを含む、
請求項1に記載のメモリシステム。
【請求項13】
前記リソースの使用状況は、前記メモリシステムの消費電力である、
請求項1に記載のメモリシステム。
【請求項14】
前記コマンドの種類毎のカウンタは、前記不揮発性メモリからデータを読み出す動作に対応するコマンドをカウントする第2リードカウンタと、前記不揮発性メモリにデータを書き込む動作に対応するコマンドをカウントする第2ライトカウンタと、前記不揮発性メモリからデータを読み出す動作および前記不揮発性メモリにデータを書き込む動作のいずれにも対応しないコマンドをカウントする第2汎用カウンタとを含み、
前記コントローラは、前記第2リードカウンタ、前記第2ライトカウンタ、および前記第2汎用カウンタを用いて、前記複数のコマンドキューのそれぞれの用途を推定するように構成される、
請求項6に記載のメモリシステム。
【請求項15】
前記コントローラは、
前記第1のタイミングで、前記複数のコマンドキューのうちの第1コマンドキューに対応する第2リードカウンタ、第2ライトカウンタ、および第2汎用カウンタを参照し、
前記第2リードカウンタの値、前記第2ライトカウンタの値、および前記第2汎用カウンタの値の中で、前記第2リードカウンタの値が最大である場合、前記不揮発性メモリからデータを読み出す動作に対応するコマンドを示す第4情報を、前記第1コマンドキューに関連付け、
前記第2リードカウンタの値、前記第2ライトカウンタの値、および前記第2汎用カウンタの値の中で、前記第2ライトカウンタの値が最大である場合、前記不揮発性メモリにデータを書き込む動作に対応するコマンドを示す第5情報を、前記第1コマンドキューに関連付け、
前記第2リードカウンタの値、前記第2ライトカウンタの値、および前記第2汎用カウンタの値の中で、前記第2汎用カウンタの値が最大である場合、前記不揮発性メモリからデータを読み出す動作および前記不揮発性メモリにデータを書き込む動作のいずれにも対応しないコマンドを示す第6情報を、前記第1コマンドキューに関連付けるように構成される、
請求項14に記載のメモリシステム。
【請求項16】
前記コントローラは、
前記次にコマンドがフェッチされるべきコマンドキューが前記第1コマンドキューであり、且つ前記第1コマンドキューに前記第4情報、あるいは前記第5情報が関連付けられている場合、前記メモリシステムの消費電力に基づいて、前記第1コマンドキューからコマンドをフェッチするか否かを決定し、
前記次にコマンドがフェッチされるべきコマンドキューが前記第1コマンドキューであり、且つ前記第1コマンドキューに前記第6情報が関連付けられている場合、前記第1コマンドキューからコマンドをフェッチするように構成される、
請求項15に記載のメモリシステム。
【請求項17】
前記複数のコマンドキューは、前記ホストに設けられる、
請求項1乃至請求項16のいずれか一項に記載のメモリシステム。
【請求項18】
前記コントローラは、NVM express規格に準拠して、前記ホストと前記メモリシステムとの通信を制御するように構成される、
請求項17に記載のメモリシステム。
【請求項19】
ホストに接続可能なメモリシステムであって、
不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、前記不揮発性メモリにデータを書き込む処理と、前記不揮発性メモリからデータを読み出す処理とを制御するように構成されたコントローラと、を具備し、
前記コントローラは、
前記ホストから前記メモリシステムに対して発行されたコマンドをそれぞれ格納する複数のコマンドキューからコマンドをフェッチし、
前記フェッチされたコマンドに対応する処理を実行し、
前記コントローラは、
前記複数のコマンドキューのそれぞれの用途を前記ホストから取得し、
前記取得した用途と、前記メモリシステムにおけるリソースの使用状況とに基づいて、前記複数のコマンドキューから、次にコマンドがフェッチされるべきコマンドキューを決定し、
前記決定されたコマンドキューからコマンドをフェッチするように構成される、
メモリシステム。
【請求項20】
前記コントローラは、特定のタイミングで、前記複数のコマンドキューのそれぞれの用途を、前記複数のコマンドキューのそれぞれからフェッチされた一つ以上のコマンドの種類に基づいて推定するように構成される、
請求項19に記載のメモリシステム。
【請求項21】
前記特定のタイミングは、第1のタイミングから、前記複数のコマンドキューからフェッチされたコマンドの総数が第1閾値に達したタイミングである、
請求項20に記載のメモリシステム。
【請求項22】
前記特定のタイミングは、第1のタイミングから第1時間が経過したタイミングである、
請求項20に記載のメモリシステム。
【請求項23】
前記コントローラは前記第1のタイミングの後、前記第1ライトカウンタ、前記第1リードカウンタおよび前記第1汎用カウンタをリセットし、
前記第2のタイミングで、前記複数のコマンドキューのそれぞれの用途を再度推定する、
請求項3に記載のメモリシステム。
【請求項24】
前記第2のタイミングは、前記第1ライトカウンタ、前記第1リードカウンタおよび前記第1汎用カウンタがリセットされた後、複数のコマンドキューからフェッチされたコマンドの総数が前記第1閾値に再び達したタイミングである、
請求項23に記載のメモリシステム。
【請求項25】
前記第2のタイミングは、前記第1ライトカウンタ、前記第1リードカウンタおよび前記第1汎用カウンタがリセットされた後、第1時間が再び経過したタイミングである、
請求項23に記載のメモリシステム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、不揮発性メモリを制御する技術に関する。
【背景技術】
【0002】
近年、不揮発性メモリを備えるメモリシステムが広く普及している。このようなメモリシステムの一つとして、NAND型フラッシュメモリを備えるソリッドステートドライブ(SSD)が知られている。
【0003】
メモリシステムは、ホストによって発行されたコマンドをそれぞれ格納している複数のコマンドキューから、コマンドがフェッチされるべきコマンドキューを選択する。メモリシステムは、選択されたコマンドキューからコマンドをフェッチする。そして、メモリシステムは、フェッチされたコマンドに基づいて、例えば、不揮発性メモリに対するデータの書き込み処理、あるいは不揮発性メモリからデータを読み出す処理を実行する。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】米国特許第11188255号明細書
【特許文献2】米国特許第10896131号明細書
【特許文献3】米国特許出願公開第2021/0048947号明細書
【特許文献4】米国特許第10642500号明細書
【発明の概要】
【発明が解決しようとする課題】
【0005】
フェッチされたコマンドは、メモリシステムの動作状態に適していないことがある。この場合、ホストからメモリシステムへのアクセス性能が低下する可能性がある。
【0006】
本発明の一実施形態が解決しようとする課題は、アクセス性能を向上できるメモリシステムを提供することである。
【課題を解決するための手段】
【0007】
実施形態によれば、メモリシステムは、ホストに接続可能である。前記メモリシステムは、不揮発性メモリと、コントローラとを具備する。前記コントローラは、前記不揮発性メモリを制御する。前記コントローラは、前記不揮発性メモリにデータを書き込む処理と、前記ホストから前記メモリシステムに対して発行されたコマンドをそれぞれ格納する複数のコマンドキューからコマンドをフェッチする。前記コントローラは、前記フェッチされたコマンドに対応する処理を実行する。前記コントローラは、前記複数のコマンドキューのそれぞれの用途を、前記複数のコマンドキューのそれぞれからフェッチされた一つ以上のコマンドの種類に基づいて推定する。前記コントローラは、前記複数のコマンドキューのそれぞれの用途と、前記メモリシステムにおけるリソースの使用状況とに基づいて、前記複数のコマンドキューから、次にコマンドがフェッチされるべきコマンドキューを決定する。前記コントローラは、前記決定されたコマンドキューからコマンドをフェッチする。
【図面の簡単な説明】
【0008】
図1】実施形態に係るメモリシステムを含む情報処理システムの構成例を示すブロック図。
図2】実施形態に係るメモリシステムを含む情報処理システムにおいて実行されるコマンド処理の手順の例を示す図。
図3】実施形態に係るメモリシステムにおいて実行される(a)アービトレーション動作と(b)アービトレーション動作により選択されるサブミッションキューの例を示す図。
図4】実施形態に係るメモリシステムにおいて使用されるサブミッションキュー-タグテーブルの構成例を示す図。
図5】実施形態に係るメモリシステムにおいて使用されるカウンタテーブルの構成例を示す図。
図6】比較例に係るメモリシステムにおいてサブミッションキューからフェッチされるコマンドを示す図。
図7】実施形態に係るメモリシステムにおいて実行されるコマンドフェッチ・処理動作の例を示す図。
図8】実施形態に係るメモリシステムにおいて行われるサブミッションキューの用途を推定する動作の一例を示すシーケンス図。
図9】実施形態に係るメモリシステムにおいて使用されるカウンタテーブルの第1の例を示す図。
図10】実施形態に係るメモリシステムにおいて使用されるカウンタテーブルの第2の例を示す図。
図11】実施形態に係るメモリシステムにおいて使用されるカウンタテーブルの第3の例を示す図。
図12】実施形態に係るメモリシステムにおいて使用されるカウンタテーブルの第4の例を示す図。
図13】実施形態に係るメモリシステムにおいて使用されるカウンタテーブルの第5の例を示す図。
図14】実施形態に係るメモリシステムにおいて使用される、図13のカウンタテーブルに基づくサブミッションキュー-タグテーブルの例を示す図。
図15】実施形態に係るメモリシステムにおいて実行されるフェッチ管理・制御処理の手順を示すフローチャート。
図16】実施形態に係るメモリシステムにおいて実行されるフェッチ制御処理の手順の第1の例を示すフローチャート。
図17】実施形態の変形例に係るメモリシステムにおいて実行されるフェッチ制御処理の手順の第2の例を示すフローチャート。
【発明を実施するための形態】
【0009】
以下、図面を参照して、実施形態を説明する。
以下では、実施形態に係るメモリシステムがSSDとして実現されている場合を想定する。図1は、実施形態に係るメモリシステムを含む情報処理システム1の構成例を示すブロック図である。情報処理システム1は、ホスト(ホストデバイス)2と、ソリッドステートドライブ(SSD)3とを含む。ホスト2と、SSD3とは、バス7を介して接続可能である。
【0010】
ホスト2は、情報処理装置である。ホスト2は、例えば、パーソナルコンピュータ、サーバコンピュータ、または携帯端末である。ホスト2は、SSD3にアクセスする。具体的には、ホスト2は、SSD3に対して、様々なコマンドを送信する。様々なコマンドは、例えば、リードコマンド、ライトコマンド、コピーコマンド、およびフラッシュ(flush)コマンドを含む。リードコマンドは、データを読み出すためのコマンドである。ライトコマンドは、データを書き込むためのコマンドである。ライトコマンドによって指定される書き込まれるべきデータは、ホスト2からSSD3に初めて送られるデータである。コピーコマンドは、データをコピーするためのコマンドである。フラッシュコマンドは、データを不揮発化するためのコマンドである。フラッシュコマンドによって指定される不揮発化されるべきデータは、ホスト2からSSD3に既に送られていたデータである。
【0011】
SSD3は、ホスト2に接続可能なストレージデバイスである。SSD3は、不揮発性メモリを含む。SSD3は、不揮発性メモリにデータを書き込む。SSD3は、不揮発性メモリからデータを読み出す。
【0012】
SSD3とホスト2との間の通信はバス7を介して実行される。バス7は、ホスト2とSSD3とを接続する伝送路である。バス7は、例えば、PCI expressTM(PCIeTM)バスである。PCIeバスは全二重伝送路である。全二重伝送路は、ホスト2からSSD3へデータを送信する伝送路とSSD3からホスト2へデータを送信する伝送路との双方を含む。
【0013】
ホスト2とSSD3とを接続するための論理インタフェースの規格としては、例えば、NVM ExpressTM(NVMeTM)規格が使用され得る。
【0014】
次に、ホスト2の構成について説明する。
【0015】
ホスト2は、セントラルプロセッシングユニット(CPU)21と、ランダムアクセスメモリ(RAM)22とを含む。CPU21およびRAM22は、内部バス20を介して相互接続される。
【0016】
CPU21は、例えば、少なくとも一つのプロセッサである。CPU21は、SSD3、またはホスト2に接続された他のストレージデバイスからRAM22にロードされるソフトウェア(ホストソフトウェア)を実行する。ホストソフトウェアは、例えば、オペレーティングシステム(OS)、ファイルシステム、およびアプリケーションプログラムを含む。
【0017】
RAM22は、例えば揮発性のメモリである。RAM22は、メインメモリ、システムメモリ、またはホストメモリとも称される。RAM22は、例えばダイナミックランダムアクセスメモリ(DRAM)である。RAM22の記憶領域は、データバッファ221として利用されるバッファ領域、一つ以上のサブミッションキューSQの領域、および一つ以上のコンプリーションキューCQの領域、が割り当てられる。一つ以上のサブミッションキューSQは、例えば、サブミッションキューSQ0、SQ1、…を含む。一つ以上のコンプリーションキューCQは、例えば、コンプリーションキューCQ0、…を含む。以下では、一つ以上のサブミッションキューSQの内の特定しない一つを指して、サブミッションキューSQとも称する。一つ以上のコンプリーションキューCQの内の特定しない一つを指して、コンプリーションキューCQとも称する。
【0018】
データバッファ221は、SSD3に書き込まれるべきユーザデータ、およびSSD3から読み出されたユーザデータを一時的に記憶する記憶領域である。
【0019】
サブミッションキューSQは、SSD3にコマンドを発行するために使用されるコマンドキューである。サブミッションキューSQは、ホスト2からSSD3に発行されたコマンドを格納する。サブミッションキューSQは、それぞれがコマンドを格納可能な複数のスロットを含む。
【0020】
CPU21は、サブミッションキューSQをRAM22に作成する。また、CPU21は、サブミッションキュークリエイトコマンドをSSD3に発行する。サブミッションキュークリエイトコマンドは、サブミッションキューSQが作成されたRAM22内の記憶位置を示すアドレス、このサブミッションキューSQのサイズ、このサブミッションキューSQに関連付けられたコンプリーションキューCQの識別情報、等を含んでいる。これらの情報は、サブミッションキュークリエイトコマンドによってSSD3に通知される。
【0021】
コンプリーションキューCQは、コマンドの完了を示す完了応答をSSD3から受信するために使用されるキューである。完了応答は、完了したコマンドのステータスを示す情報を含む。完了応答は、コマンド完了、またはコマンド完了通知とも称される。コンプリーションキューCQは、それぞれが完了応答を格納可能な複数のスロットを含む。CPU21は、コンプリーションキューCQをホスト2のRAM22に作成する。また、CPU21は、コンプリーションキュークリエイトコマンドをSSD3に発行する。コンプリーションキュークリエイトコマンドは、コンプリーションキューCQが作成されたRAM22内の記憶位置を示すアドレス、およびこのコンプリーションキューCQのサイズ、等を含んでいる。これらの情報は、コンプリーションキュークリエイトコマンドによってSSD3に通知される。一つのコンプリーションキューCQに対して、一つのサブミッションキューSQが関連付けられてもよいし、二つ以上のサブミッションキューSQが関連付けられてもよい。
【0022】
NVMe規格のインタフェースでは、少なくとも一つのサブミッションキューSQと、この少なくとも一つのサブミッションキューSQに関連付けられたコンプリーションキューCQとを含む対のキューを用いて、ホスト2とSSD3との間の通信が行われる。この対のキューは、サブミッション/コンプリーションキューペア(SQ/CQペア)と称される。
【0023】
なお、各サブミッションキューSQは用途が決められていてもよい。この場合、ホスト2は、ある用途のサブミッションキューSQに対して、その用途に対応する種類のコマンドを格納するように、あるいはその用途に対応するコマンドを優先的に格納するように制御する。例えば、サブミッションキューSQ0の用途がリードであり、サブミッションキューSQ1の用途がライトである場合を想定する。この場合、例えば、ホスト2は、発行されたリードコマンドをサブミッションキューSQ0に優先的に格納する。また、ホスト2は、発行されたライトコマンドをサブミッションキューSQ1に優先的に格納する。
【0024】
次に、SSD3の内部構成について説明する。
【0025】
SSD3は、コントローラ4と、NAND型フラッシュメモリ5(以下、単にNANDメモリ5と称する)とを含む。また、SSD3は、RAM、例えば、ダイナミックランダムアクセスメモリ(DRAM)6をさらに含んでいてもよい。
【0026】
コントローラ4は、メモリコントローラである。コントローラ4は、例えば、System-on-a-chip(SoC)のような制御回路によって実現される。コントローラ4は、NANDメモリ5に電気的に接続されている。コントローラ4は、NANDメモリ5を制御する。コントローラ4は、NANDメモリ5へのデータの書き込みと、NANDメモリ5からのデータの読み出しとを実行する。コントローラ4の各部の機能は、専用ハードウェア、プログラムを実行するプロセッサ、またはこれらの組み合わせにより実現され得る。また、コントローラ4は、DRAM6と通信可能に接続されている。コントローラ4は、DRAM6へのデータの書き込みと、DRAM6からのデータの読み出しとを実行する。また、コントローラ4は、バス7を介して、ホスト2との通信を実行する。
【0027】
NANDメモリ5は、不揮発性メモリである。NANDメモリ5は、メモリセルアレイ51を含む。メモリセルアレイ51は、マトリクス状に配置された複数のメモリセルを含む。NANDメモリ5は、2次元構造のフラッシュメモリであってもよいし、3次元構造のフラッシュメモリであってもよい。
【0028】
メモリセルアレイ51は、複数のブロックBLK0~BLKm-1を含む。ブロックBLK0~BLKm-1の各々は、複数のページP0~Pn-1を含む。複数のページP0~Pn-1の各々は、同一ワード線に接続された複数のメモリセルを含む。複数のブロックBLK0~BLKm-1の各々は、データを消去するデータ消去動作の最小単位として機能する。複数のページP0~Pn-1の各々は、データ書き込み動作およびデータ読み出し動作の単位として機能する。
【0029】
DRAM6は、揮発性メモリである。DRAM6には、例えば、リードバッファ61として用いられる記憶領域と、ライトバッファ62として用いられる記憶領域と、論理物理アドレス変換テーブル(logical-to-physical address translation table:L2Pテーブル)63のキャッシュ領域とが設けられる。
【0030】
リードバッファ61は、NANDメモリ5から読み出されたデータを一時的に記憶する記憶領域である。
【0031】
ライトバッファ62は、ホスト2から受信された、NANDメモリ5に書き込まれるべきデータを一時的に記憶する記憶領域である。
【0032】
L2Pテーブル63は、マッピング情報を格納するテーブルである。マッピング情報は、論理アドレスそれぞれとNANDメモリ5の物理アドレスそれぞれとの間のマッピングを所定の管理サイズの単位で示す情報である。論理アドレスは、SSD3にアクセスするためにホスト2によって使用されるアドレスである。論理アドレスとしては、例えば、論理ブロックアドレス(LBA)が使用される。物理アドレスは、NANDメモリ5内の記憶位置を示すアドレスである。
【0033】
次に、コントローラ4の内部構成を説明する。コントローラ4は、ホストインタフェース回路(ホストI/F)41と、SRAM42と、CPU43と、直接メモリアクセスコントローラ(DMAC)44と、NANDインタフェース回路(NAND I/F)45と、DRAMインタフェース回路(DRAM I/F)46とを含む。これらホストI/F41と、SRAM42と、CPU43と、DMAC44と、NAND I/F45と、DRAM I/F46とは、バス40を介して相互接続される。
【0034】
ホストI/F41は、ホスト2との通信を実行するホストインタフェース回路である。ホストI/F41は、例えば、PCIeコントローラである。ホストI/F41は、アービトレーション(調停)機構を含む。アービトレーション機構は、後述するCPU43がコマンドをフェッチする際、ホスト2の複数のサブミッションキューSQ0、SQ1、…から、次にコマンドがフェッチされるべきサブミッションキューSQを選択する機構である。以下では、ホストI/F41によって選択された、次にコマンドがフェッチされるべきサブミッションキューSQを、対象サブミッションキューSQとも称する。
【0035】
例えば、NVMe規格では、アービトレーション機構として、ラウンドロビン(RR)アービトレーション機構、重み付きラウンドロビン(WRR)アービトレーション機構、およびベンダー・スペシフィック・アービトレーション機構が規定されている。アービトレーション機構の具体的な例については、図3を参照して後述する。
【0036】
ホストI/F41は、ホスト2に対して、ラウンドロビン(RR)アービトレーション機構、重み付きラウンドロビン(WRR)アービトレーション機構、およびベンダー・スペシフィック・アービトレーション機構のうちのいずれのアービトレーション機構をサポートしているかを通知する。通知を受けたホスト2は、ホストI/F41がサポートしているアービトレーション機構のうち、任意のアービトレーション機構を選択する。ホストI/F回路41は、ホスト2によってベンダー固有のアービトレーション機構が選択されたことによって、後述のコマンドフェッチ・処理動作を伴うサブミッションキューSQの調停が有効化される。
【0037】
SRAM42は、揮発性メモリである。SRAM42の記憶領域は、CPU43の作業領域として使用される。例えば、SRAM42の記憶領域には、カウンタテーブル421の格納領域と、SQ-タグテーブル422の格納領域と、が割り当てられる。
【0038】
カウンタテーブル421は、サブミッションキューSQからフェッチされたコマンドの数を、コマンドの種類に基づいて管理するためのテーブルである。カウンタテーブル421の具体的な構成については、図5を参照して後述する。
【0039】
SQ-タグテーブル422は、複数のサブミッションキューSQのそれぞれに関連付けられたタグを管理するテーブルである。複数のサブミッションキューSQのそれぞれに関連付けられるタグは、例えば、カウンタテーブル421に基づいて決定される。SQ-タグテーブル422は、サブミッションキューSQと、そのサブミッションキューSQに対して決定されたタグとの間の対応関係を管理する。SQ-タグテーブル422の具体的な構成については、図4を参照して後述する。
【0040】
CPU43は、少なくとも一つのプロセッサである。CPU43は、ホストI/F41と、SRAM42と、DMAC44と、NAND I/F45と、DRAM I/F46とを制御する。CPU43は、NANDメモリ5または図示しないROMに格納されている制御プログラム(ファームウェア)をDRAM6にロードする。そして、CPU43は、ロードされたファームウェアを実行することによって様々な処理を行う。なお、ファームウェアはSRAM42にロードされてもよい。
【0041】
CPU43は、フラッシュトランスレーション層(FTL)として、NANDメモリ5に記憶されたデータの管理およびNANDメモリ5に含まれるブロックの管理を実行する。データの管理は、論理アドレスそれぞれと物理アドレスそれぞれとの間の対応関係を示すマッピング情報の管理を含む。CPU43は、L2Pテーブル63を使用して、論理アドレスそれぞれと物理アドレスそれぞれとの間の対応関係を管理する。NANDメモリ5に含まれるブロックの管理は、NANDメモリ5に含まれる不良ブロック(バッドブロック)の管理と、ウェアレベリングと、ガベージコレクションとを含む。
【0042】
DMAC44は、直接メモリアクセスを実行する回路である。DMAC44は、ホスト2のRAM22とSRAM42またはDRAM6との間のデータ転送を実行する。例えば、DMAC44は、リードバッファ61に格納されているデータをデータバッファ221に転送する。また、DMAC44は、データバッファ221に格納されているデータをライトバッファ62に転送する。
【0043】
NAND I/F45は、コントローラ4とNAND型メモリ5とを電気的に接続する。NAND I/F45は、Toggle DDR、Open NAND Flash Interface(ONFI)等のインタフェース規格に対応する。
【0044】
NAND I/F45は、NANDメモリ5を制御する回路である。NANDメモリ5が複数のNAND型フラッシュメモリチップ(NAND型フラッシュメモリダイ)から構成されている場合、NAND I/F45は、複数のチャンネル(Ch)を介してこれらNAND型フラッシュメモリチップそれぞれと接続されていてもよい。
【0045】
DRAM I/F46は、DRAM6へのアクセスを制御する回路である。
【0046】
次に、CPU43の機能構成を説明する。CPU43は、SQ判定部431、コマンドフェッチ制御部432、およびコマンド処理部433として機能する。CPU43は、例えばファームウェアを実行することにより、これら各部として機能する。SQ判定部431、コマンドフェッチ制御部432、およびコマンド処理部433の各々の一部または全部は、コントローラ4内の専用ハードウェアによって実現されてもよい。例えば、コマンドフェッチ制御部432は、ホストI/F41によって実現されてもよい。
【0047】
SQ判定部431は、カウンタテーブル421を用いて、複数のサブミッションキューSQのそれぞれの用途を推定する。具体的には、SQ判定部431は、カウンタテーブル421を用いて、複数のサブミッションキューSQのそれぞれからフェッチされた一つ以上のコマンドの数を、コマンドの種類毎に取得する。SQ判定部431は、種類毎に取得されたコマンドの数に基づいて、複数のサブミッションキューSQそれぞれの用途を推定する。
【0048】
コマンドフェッチ制御部432は、ホストI/F41を介した対象サブミッションキューSQからのコマンドのフェッチを制御する。コマンドフェッチ制御部432は、複数のサブミッションキューSQそれぞれの用途と、SSD3におけるリソースの使用状況とに基づいて、コマンドをフェッチすべきサブミッションキューSQを決定する。SSD3のリソースは、例えば、ライトバッファやリードバッファである。例えば、対象サブミッションキューSQがサブミッションキューSQ0である場合、コマンドフェッチ制御部432は、サブミッションキューSQ0の用途と、SSD3のリソースの使用状況とに基づいて、サブミッションキューSQ0からコマンドをフェッチするか否かを判定する。コマンドフェッチ制御部432は、コマンドをフェッチすると判定された対象サブミッションキューSQから、コマンドをフェッチする。コマンドフェッチ制御部432は、フェッチされたコマンドをコマンド処理部433に送出する。
【0049】
ここでは、SQ判定部431、およびコマンドフェッチ部432によって、ホスト2の複数のサブミッションキューSQからのコマンドのフェッチが制御される場合について説明したが、ホスト2の複数のサブミッションキューSQの代わりに、SSD3の複数のコマンドキュー(不図示)からのコマンドのフェッチが制御されてもよい。SSD3の複数のコマンドキューは、例えば、ホスト2の複数のサブミッションキューSQからフェッチされたコマンドが一時的に格納されるキューである。このとき、SQ判定部431はカウンタテーブル421を用いて、SSD3の複数のコマンドキューからフェッチされたコマンドの数を、コマンドの種類に基づいて管理する。また、SQ-タグテーブル422は、SSD3の複数のコマンドキューのそれぞれに関連付けられたタグを管理する。
【0050】
コマンド処理部433は、フェッチされたコマンドの各々を解釈し、およびフェッチされたコマンドに対応する処理を実行する。コマンド処理部433は、フェッチされたコマンドに対応する処理が完了すると、コマンドの完了を示す完了応答を、ホストI/F41を介してホスト2に送信する。コマンド処理部433は、完了応答を、対象サブミッションキューSQに関連付けられたコンプリーションキューCQに格納する。
【0051】
SQ判定部431、コマンドフェッチ制御部432、およびコマンド処理部433のより具体的な動作については、図7から図14を参照して後述する。
【0052】
次に、情報処理システム1におけるコマンド処理について説明する。コマンド処理は、ホスト2からSSD3へのコマンドが発行されてから、コマンドに対応する完了応答がホスト2よって処理されるまでの手順を含む。
【0053】
図2は、情報処理システム1において実行されるコマンド処理の手順の例を示す図である。
【0054】
ステップ1: ホスト2は、SSD3に送信すべき一つ以上の新たなコマンドをサブミッションキューSQの一つ以上の空きスロットに格納する。これら一つ以上の新たなコマンドは、サブミッションキューテールポインタ(SQTP)の現在の値によって示されるスロットから始まる一つ以上の空きスロットに格納される。サブミッションキューSQに格納される新たなコマンドは、ライトコマンドであってもよいし、リードコマンドであってもよいし、他のコマンドであってもよい。図2では、サブミッションキューSQに格納されている各コマンドは「CMD」として表記されている。
【0055】
ステップ2: サブミッションキューSQに一つ以上の新たなコマンドが格納されたことをSSD3のコントローラ4に通知するために、ホスト2は、このサブミッションキューSQに対応するSSD3内のサブミッションキューテールドアベルレジスタにライトアクセスして、このサブミッションキューSQに対応するサブミッションキューテールポインタ(SQTP)の値を更新する。サブミッションキューテールポインタ(SQTP)の値は、サブミッションキューSQに格納された新たなコマンドの数だけインクリメントされる。このようなサブミッションキューテールポインタ(SQTP)の更新は、サブミッションキューSQに格納されたコマンドそれぞれの処理をコントローラ4に開始させるトリガーとなる。
【0056】
ステップ3: コントローラ4は、サブミッションキューテールポインタ(SQTP)の新たな値とサブミッションキューヘッドポインタ(SQHP)の値との間の差分から、サブミッションキューSQに格納された新たなコマンドの数を認識することができる。コントローラ4は、サブミッションキューSQから一つ以上の任意の数のコマンドをフェッチする。フェッチされた各コマンドは、コントローラ4のSRAM42に一時的に格納される。
【0057】
ステップ4: コントローラ4は、このサブミッションキューSQに対応するサブミッションキューヘッドポインタ(SQHP)の値がステップ3でフェッチしたコマンドの数だけ増えるように、このサブミッションキューヘッドポインタ(SQHP)の値を更新する。
【0058】
ステップ5: コントローラ4は、フェッチしたコマンドそれぞれを実行する。これらコマンドが実行される順序は制限されず、これらコマンドは、これらコマンドがフェッチされた順序と異なる順序で実行されてもよい。各コマンドを実行する処理においては、コントローラ4は、必要に応じて、ホスト2のデータバッファ221からコントローラ4のライトバッファ62へのデータの転送、またはリードバッファ61からホスト2のデータバッファ221へのデータの転送を行う。
【0059】
ステップ6: ある一つのコマンドの実行が完了すると、コントローラ4は、まず、この完了したコマンドがフェッチされたサブミッションキューSQに関連付けられたコンプリーションキューCQに対応するコンプリーションキューテールポインタ(CQTP)を更新して、このコンプリーションキューテールポインタ(CQTP)の値を1増やす。
【0060】
ステップ7: コントローラ4は、この完了したコマンドのステータスを示す新たな完了応答を、このコンプリーションキューCQの次の空きスロットに格納する。図2では、コンプリーションキューCQに格納されている完了応答の各々は「CPL」として表記されている。
【0061】
ステップ8: コントローラ4は、割り込みをホスト2に送信する。コントローラ4は、ステップ7で完了応答が格納されたコンプリーションキューCQに対応する割り込みベクタを含む割り込みをホスト2に送信して、新たな完了応答がコンプリーションキューCQに格納されたことをホスト2に通知する。
【0062】
ステップ9: ホスト2は、コンプリーションキューヘッドポインタ(CQHP)の現在の値によって示されるCQスロットから完了応答を取得し、取得した完了応答を処理する。
【0063】
ステップ10: ホスト2は、このコンプリーションキューCQに対応するSSD3内のコンプリーションキューヘッドドアベルレジスタにライトアクセスして、コンプリーションキューヘッドポインタ(CQHP)の値を更新する。コンプリーションキューヘッドポインタ(CQHP)の値は、ステップ9で処理された完了応答の数だけインクリメントされる。
【0064】
ホスト2に複数のサブミッションキューSQが設けられる場合、前述した図2のステップ3でコマンドがフェッチされるべき一つのサブミッションキューSQは、アービトレーション動作によって決定される。
【0065】
図3は、SSD3において実行される(a)アービトレーション動作と(b)アービトレーション動作により選択されるサブミッションキューSQの例を示す図である。ここでは、アービトレーション動作がラウンドロビンアービトレーション機構に基づく場合を例示する。また、ホスト2には四つのサブミッションキューSQ0、SQ1、SQ2、およびSQ3が設けられていることを想定する。
【0066】
図3の(a)で示すように、ラウンドロビンアービトレーション機構では、四つのサブミッションキューSQ0、SQ1、SQ2、およびSQ3が均等な優先度で扱われる。コントローラ4は、ラウンド毎に、サブミッションキューSQ0、SQ1、SQ2、およびSQ3の一つを順に選択する。
【0067】
具体的には、図3の(b)で示すように、コントローラ4は、例えば、サブミッションキューSQ0、SQ1、SQ2、およびSQ3の順番で、それぞれのサブミッションキューをフェッチ対象のサブミッションキューSQとして選択する。コントローラ4は、サブミッションキューSQ3をフェッチ対象のサブミッションキューSQとして選択した後、再度、サブミッションキューSQ0から順番にフェッチ対象のサブミッションキューSQとして選択する。
【0068】
コントローラ4がフェッチ対象のサブミッションキューSQから、N個のコマンドをフェッチし得る。Nは、1以上の整数である。
【0069】
したがって、例えば、コントローラ4は、サブミッションキューSQ0からN個のコマンドをフェッチする。次いで、コントローラ4は、サブミッションキューSQ1からN個のコマンドをフェッチする。コントローラ4は、サブミッションキューSQ2からN個のコマンドをフェッチする。コントローラ4は、サブミッションキューSQ3からN個のコマンドをフェッチする。そして、コントローラ4は、再び、サブミッションキューSQ0からN個のコマンドをフェッチする。
【0070】
このような動作により、コントローラ4は、複数のサブミッションキューSQを均等な優先度で扱って、フェッチ対象のサブミッションキューSQからコマンドをフェッチできる。
【0071】
ここで、SSD3で用いられるテーブルの構成について説明する。
【0072】
まず、SQ-タグテーブル422について説明する。図4は、SSD3において使用されるSQ-タグテーブル422の構成例を示す。
【0073】
SQ-タグテーブル422は、複数のサブミッションキューSQにそれぞれ対応する複数のエントリを含む。複数のエントリのそれぞれは、SQ識別情報フィールドと、タグフィールドとを含む。
【0074】
SQ識別情報フィールドは、対応するサブミッションキューSQの識別情報を示す。サブミッションキューSQの識別情報により、複数のサブミッションキューSQの内の一つを特定可能である。
【0075】
タグフィールドは、対応するサブミッションキューSQに関連付けられたタグを示す。タグは、対応するサブミッションキューSQの用途を表す情報である。サブミッションキューSQの用途を表す情報は、例えば、そのサブミッションキューSQに格納されるコマンドの種類の傾向を表す情報を含む。より具体的には、タグフィールドには、例えば、リード用、ライト用、および汎用のいずれか一つのタグが設定される。
【0076】
リード用を示すタグは、対応するサブミッションキューSQに、リードバッファ61を新たに使用するコマンドが格納されやすい傾向があることを示す。つまり、リード用を示すタグが関連付けられたサブミッションキューSQは、リードバッファ61を新たに使用するコマンドを主に格納する用途であると推定されたサブミッションキューSQである。リードバッファ61を新たに使用するコマンドは、例えば、リードコマンド、およびコピーコマンドである。
【0077】
リードコマンドに応じた動作では、NANDメモリ5からユーザデータが読み出され、読み出されたユーザデータがリードバッファ61の空き領域に格納される。ユーザデータが格納されたリードバッファ61内の記憶領域は、このユーザデータがホスト2に転送されるまで、使用中の記憶領域になる。したがって、リードコマンドは、リードバッファ61を新たに使用するコマンドである。
【0078】
ライト用を示すタグは、対応するサブミッションキューSQに、ライトバッファ62を新たに使用するコマンドが格納されやすい傾向があることを示す。つまり、ライト用を示すタグが関連付けられたサブミッションキューSQは、ライトバッファ62を新たに使用するコマンドを主に格納する用途であると推定されたサブミッションキューSQである。ライトバッファ62を新たに使用するコマンドは、例えば、ライトコマンド、およびコピーコマンドである。
【0079】
ライトコマンドに応じた動作では、NANDメモリ5に書き込まれるべきユーザデータがホスト2から受信され、受信されたユーザデータがライトバッファ62内の空き領域に一時的に格納される。ユーザデータが格納されたライトバッファ62内の記憶領域は、このユーザデータのNANDメモリ5への書き込みが完了するまで、使用中の記憶領域になる。したがって、ライトコマンドは、ライトバッファ62の記憶領域を新たに使用するコマンドである。
【0080】
コピーコマンドに応じた動作では、NANDメモリ5からユーザデータが読み出され、読み出されたユーザデータがリードバッファ61の空き領域に格納される。格納されたユーザデータはさらに、ライトバッファ62の空き領域に格納(移動)される。ユーザデータが格納されたリードバッファ61内の記憶領域は、このユーザデータがライトバッファ62に移動されるまで、使用中の記憶領域になる。また、ユーザデータが格納されたライトバッファ62内の記憶領域は、このユーザデータのNANDメモリ5への書き込みが完了するまで、使用中の記憶領域になる。したがって、コピーコマンドは、リードバッファ61の記憶領域を新たに使用するコマンドであり、且つライトバッファ62の記憶領域を新たに使用するコマンドである。
【0081】
汎用を示すタグは、リードバッファ61およびライトバッファ62のいずれも新たに使用しないコマンドが格納されやすい傾向があることを示す。つまり、汎用を示すタグが関連付けられたサブミッションキューSQは、リードバッファ61およびライトバッファ62のいずれも新たに使用しないコマンドを主に格納する用途であると推定されたサブミッションキューSQである。リードバッファ61およびライトバッファ62のいずれも新たに使用しないコマンドは、例えば、フラッシュコマンドである。
【0082】
フラッシュコマンドに応じた動作では、ライトバッファ62に既に格納されているデータがNANDメモリ5に書き込まれる。したがって、フラッシュコマンドは、リードバッファ61およびライトバッファ62のいずれも新たに使用しないコマンドである。
【0083】
図4に示すSQ-タグテーブル422の例では、サブミッションキューSQ0は、リード用を示すタグに関連付けられている。サブミッションキューSQ1は、ライト用を示すタグに関連付けられている。サブミッションキューSQ2およびサブミッションキューSQ3のそれぞれは、汎用を示すタグに関連付けられている。
【0084】
なお、複数のサブミッションキューSQが作成された直後の初期状態では、SQ-タグテーブル422において、全てのサブミッションキューSQに関連付けられるタグは、例えば、汎用を示すタグである。
【0085】
次に、カウンタテーブル421について説明する。図5は、SSD3において使用されるカウンタテーブル421の構成例を示す図である。
【0086】
カウンタテーブル421は、複数のサブミッションキューSQのそれぞれに対応する複数のカウンタを管理するためのテーブルである。各サブミッションキューSQに対応する複数のカウンタは、例えば、前述したサブミッションキューSQに関連付けられ得る複数のタグにそれぞれ対応する。したがって、各サブミッションキューSQに対応するカウンタの数は、例えば、前述したタグの数に相当する。なお、各サブミッションキューSQに対応する複数のカウンタは、NVMe規格で規定されているコマンド毎のカウンタであってもよい。
【0087】
例えば、サブミッションキューSQに関連付けられ得る複数のタグがリード用、ライト用、および汎用の三つのタグである場合、カウンタテーブル421には、サブミッションキューSQ毎に、これら三つのタグにそれぞれ対応する三つのカウンタが含まれる。三つのカウンタは、第1リードカウンタ#Readと、第1ライトカウンタ#Writesと、第1汎用カウンタ#Non-RWsとを含む。
【0088】
第1リードカウンタ#Readは、リードバッファ61を新たに使用するコマンドをカウントする。第1リードカウンタ#Readは、対応するサブミッションキューSQから、リードバッファ61を新たに使用するコマンドがフェッチされたことに応じ、コマンドフェッチ制御部432によってインクリメントされる。例えば、一つのコマンドがフェッチされたことに応じて、第1リードカウンタ#Readに、1が加算される。
【0089】
第1ライトカウンタ#Writesは、ライトバッファ62を新たに使用するコマンドをカウントする。第1ライトカウンタ#Writesは、対応するサブミッションキューSQから、ライトバッファ62を新たに使用するコマンドがフェッチされたことに応じ、コマンドフェッチ制御部432によってインクリメントされる。
【0090】
第1汎用カウンタ#Non-RWsは、リードバッファ61およびライトバッファ62のいずれも新たに使用しないコマンドをカウントする。第1汎用カウンタ#Non-RWsは、対応するサブミッションキューSQから、リードバッファ61およびライトバッファ62のいずれも新たに使用しないコマンドがフェッチされたことに応じ、コマンドフェッチ制御部432によってインクリメントされる。
【0091】
図5に示す例では、サブミッションキューSQ0に対応する第1リードカウンタ#Readsの値は、100である。サブミッションキューSQ0に対応する第1ライトカウンタ#Writesの値は、5である。サブミッションキューSQ0に対応する汎用カウンタ#Non-RWsの値は、10である。
【0092】
サブミッションキューSQ1に対応する第1リードカウンタ#Readsは、20である。サブミッションキューSQ1に対応する第1ライトカウンタ#Writesは、90である。サブミッションキューSQ1に対応する第1汎用カウンタ#Non-WRsは、5である。
【0093】
サブミッションキューSQ2に対応する第1リードカウンタ#Readsは、30である。サブミッションキューSQ2に対応する第1ライトカウンタ#Writesは、30である。サブミッションキューSQ2に対応する第1汎用カウンタ#Non-WRsは、55である。
【0094】
なお、カウンタテーブル421、および各サブミッションキューSQに対応するカウンタの構成は、前述した例に限られず、複数のサブミッションキューSQそれぞれからフェッチされた一つ以上のコマンドの種類毎の数が取得できる構成であればよい。
【0095】
ここで、図6を参照して、比較例に係るSSD3Aにおいて、サブミッションキューSQAからフェッチされるコマンドについて説明する。SSD3Aには、リードバッファ61Aとライトバッファ62Aとが設けられている。SSD3Aは、ホスト2Aに接続されている。ホスト2Aには、三つのサブミッションキューSQ0A、SQ1A、およびSQ2Aが設けられている。
【0096】
ここでは、サブミッションキューSQ0Aには主にリードコマンドが格納され、サブミッションキューSQ1Aには主にライトコマンドが格納され、サブミッションキューSQ2Aには種々のコマンドが格納されることを想定する。また、リードバッファ61Aはリードコマンドに応じた処理に必要な空き領域が不足していて、ライトバッファ62Aはライトコマンドに応じた処理に必要な空き領域が十分にあるものとする。
【0097】
SSD3Aのコントローラは、例えば、ラウンドロビンアービトレーション機構に従って、サブミッションキューSQ0A、SQ1A、およびSQ2Aから、フェッチ対象のサブミッションキューSQAを選択する。
【0098】
フェッチ対象のサブミッションキューSQAとして、サブミッションキューSQ0Aが選択された場合、コントローラは、サブミッションキューSQ0Aの先頭のリードコマンドをフェッチする。リードバッファ61Aの空き領域が不足している場合(例えば、リードバッファ61Aの空き領域のサイズが、フェッチされたリードコマンドに応じてNANDメモリから読み出されるユーザデータのサイズよりも小さい場合)、コントローラは、リードバッファ61Aの空き領域が十分に確保されるまで、フェッチされたリードコマンドに応じた処理を開始できない。そのため、ホスト2AからSSD3Aへのアクセス性能が低下する。
【0099】
サブミッションキューSQ0Aには主にリードコマンドが格納されるので、サブミッションキューSQ0Aからフェッチされるコマンドは、リードコマンドである可能性が高い。したがって、リードバッファ61Aの空き領域が不足している場合に、サブミッションキューSQ0Aからコマンドがフェッチされたならば、ホスト2AからSSD3Aへのアクセス性能が低下する。
【0100】
これに対して、フェッチ対象のサブミッションキューSQAとして、サブミッションキューSQ1Aが選択された場合、コントローラは、サブミッションキューSQ1Aの先頭のライトコマンドをフェッチする。ライトバッファ62Aの空き領域が十分にある場合(例えば、ライトバッファ62Aの空き領域のサイズが、フェッチされたライトコマンドに応じてNANDメモリに書き込まれるべきユーザデータのサイズよりも大きい場合)、コントローラは、書き込まれるべきユーザデータをライトバッファ62Aに格納できる。
【0101】
サブミッションキューSQ1Aには主にライトコマンドが格納されるので、サブミッションキューSQ1Aからフェッチされるコマンドは、ライトコマンドである可能性が高い。したがって、ライトバッファ62Aの空き領域が十分である場合には、サブミッションキューSQ1Aからコマンドがフェッチされることが望ましい。
【0102】
このように、リードバッファ61Aの空き領域が不足していて、且つライトバッファ62Aの空き領域が十分にある場合に、リードコマンドがフェッチされると、リードコマンドに対応する処理が完了するまでに要する時間が長くなってしまう恐れがある。つまり、この場合には、リードコマンドが格納されている可能性が高いサブミッションキューSQ0Aからコマンドをフェッチすることを避けることが望ましい。
【0103】
そのため、本実施形態のSSD3では、SSD3におけるリソースの使用状況に適したサブミッションキューSQからコマンドをフェッチするように制御する。具体的には、例えば、フェッチ対象のサブミッションキューSQが、リードバッファ61を新たに使用するコマンドを主に格納するサブミッションキューSQであり、且つリードバッファ61の空き領域が十分である場合、そのサブミッションキューSQからコマンドをフェッチする。フェッチ対象のサブミッションキューSQが、リードバッファ61を新たに使用するコマンドを主に格納するサブミッションキューSQであり、且つリードバッファ61の空き領域が不足している場合、そのサブミッションキューSQからコマンドをフェッチしない。フェッチ対象のサブミッションキューSQが、ライトバッファ62を新たに使用するコマンドを主に格納するサブミッションキューSQであり、且つライトバッファ62の空き領域が十分である場合、そのサブミッションキューSQからコマンドをフェッチする。フェッチ対象のサブミッションキューSQが、ライトバッファ62を新たに使用するコマンドを主に格納するサブミッションキューSQであり、且つライトバッファ62の空き領域が不足している場合、そのサブミッションキューSQからコマンドをフェッチしない。また、フェッチ対象のサブミッションキューSQが、リードバッファ61とライトバッファ62のいずれも新たに使用しないコマンドを主に格納するサブミッションキューSQである場合、そのサブミッションキューSQからコマンドをフェッチする。これにより、ホスト2からSSD3へのアクセス性能を向上できる。
【0104】
図7は、SSD3において実行されるコマンドフェッチ・処理動作の例を示す図である。
【0105】
まず、ホストI/F41は、アービトレーション機構(ここでは、ラウンドロビンアービトレーション機構)に従って、複数のサブミッションキューSQからフェッチ対象のサブミッションキューSQを選択する。以下では、選択されたフェッチ対象のサブミッションキューSQを、対象サブミッションキューSQと称する。ホストI/F41は、対象サブミッションキューSQを示す情報をコマンドフェッチ制御部432に通知する。
【0106】
コマンドフェッチ制御部432は、ホストI/F41からの通知に基づき、SQ-タグテーブル422において、対象サブミッションキューSQに対応するエントリを特定する。コマンドフェッチ制御部432は、特定されたエントリからタグを取得する。
【0107】
次いで、コマンドフェッチ制御部432は、SSD3におけるリソースの使用状況を取得する。SSD3のリソースの使用状況は、リードバッファ61の空き領域に関する指標と、ライトバッファ62の空き領域に関する指標とを含む。また、SSD3のリソースの使用状況は、SSD3の消費電力を含んでいてもよい。リードバッファ61の空き領域は、リードバッファ61として割り当てられた記憶領域の内、リードデータを新たに格納可能な記憶領域である。リードバッファ61の空き領域に関する指標としては、例えば、空き領域のサイズ、またはリードバッファ61の記憶領域全体に対する空き領域の割合が用いられる。ライトバッファ62の空き領域は、ライトバッファ62として割り当てられた記憶領域の内、ライトデータを新たに格納可能な記憶領域である。ライトバッファ62の空き領域に関する指標としては、例えば、空き領域のサイズ、またはライトバッファ62の記憶領域全体に対する空き領域の割合が用いられる。
【0108】
コマンドフェッチ制御部432は、取得されたタグと、SSD3におけるリソースの使用状況とに基づいて、対象サブミッションキューSQからコマンドをフェッチするか否かを判定する。
【0109】
具体的には、コマンドフェッチ制御部432は、取得されたタグがリード用を示す場合、リードバッファ61の空き領域に関する指標を取得する。そして、コマンドフェッチ制御部432は、リードバッファ61の空き領域に関する指標に基づいて、対象サブミッションキューSQからコマンドをフェッチするか否かを制御する。具体的には、対象サブミッションキューSQがサブミッションキューSQ0であって、リードバッファ61の空き領域に関する指標が第2閾値以上である場合、コマンドフェッチ制御部432は、サブミッションキューSQ0からコマンドをフェッチする。リードバッファ61の空き領域に関する指標が第2閾値未満である場合、コマンドフェッチ制御部432は、サブミッションキューSQ0からのコマンドのフェッチをスキップする。そして、コマンドフェッチ制御部432は、次にコマンドがフェッチされるべきサブミッションキューSQの選択をホストI/F41に要求する。
【0110】
コマンドフェッチ制御部432は、取得されたタグがライト用を示す場合、ライトバッファ62の空き領域に関する指標を取得する。そして、コマンドフェッチ制御部432は、ライトバッファ62の空き領域に関する指標に基づいて、対象サブミッションキューSQからコマンドをフェッチするか否かを制御する。具体的には、対象サブミッションキューSQがサブミッションキューSQ1であって、ライトバッファ62の空き領域に関する指標が第3閾値以上である場合、コマンドフェッチ制御部432は、サブミッションキューSQ1からコマンドをフェッチする。ライトバッファ62の空き領域に関する指標が第3閾値未満である場合、コマンドフェッチ制御部432は、サブミッションキューSQ1からのコマンドのフェッチをスキップする。そして、コマンドフェッチ制御部432は、次にコマンドがフェッチされるべきサブミッションキューSQの選択をホストI/F41に要求する。
【0111】
なお、コマンドフェッチ制御部432は、取得されたタグが汎用を示す場合、対象サブミッションキューSQからコマンドをフェッチする。これは、汎用を示すタグが関連付けられたサブミッションキューSQが、リードバッファ61とライトバッファ62のいずれも新たに使用しないコマンドを主に格納しているためである。
【0112】
コマンドフェッチ制御部432は、対象サブミッションキューSQからコマンドをフェッチした場合、フェッチされたコマンドの種類に基づいてカウンタテーブル421を更新する。具体的には、コマンドフェッチ制御部432は、フェッチされたコマンドが、リードバッファ61を新たに使用するコマンドである場合、カウンタテーブル421において、対象サブミッションキューSQに対応する第1リードカウンタ#Readsをインクリメントする。コマンドフェッチ制御部432は、フェッチされたコマンドが、ライトバッファ62を新たに使用するコマンドである場合、カウンタテーブル421において、対象サブミッションキューSQに対応する第1ライトカウンタ#Writesをインクリメントする。コマンドフェッチ制御部432は、フェッチされたコマンドが、リードバッファ61とライトバッファ62のいずれも新たに使用しないコマンドである場合、カウンタテーブル421において、対象サブミッションキューSQに対応する第1汎用カウンタ#Non-WRsをインクリメントする。
【0113】
また、コマンドフェッチ制御部432は、フェッチされたコマンドをコマンド処理部433に送出する。
【0114】
コマンド処理部433は、フェッチされたコマンドに応じた処理を行う。例えば、コマンド処理部433は、リードコマンドに応じて、NANDメモリ5からユーザデータを読み出し、読み出されたユーザデータをリードバッファ61に格納する。コマンド処理部433は、ライトコマンドに応じて、NANDメモリ5に書き込まれるべきユーザデータをライトバッファ62に格納し、このユーザデータをNANDメモリ5に書き込む。コマンド処理部433は、フラッシュコマンドに応じて、ライトバッファ62に既に格納されている未書き込みのユーザデータを、NANDメモリ5に書き込む。コマンド処理部433は、コマンドに応じた処理が完了した場合、ホストI/F41を介して、対象サブミッションキューSQに対応するコンプリーションキューCQに完了応答を格納する。
【0115】
SQ判定部431は、カウンタテーブル421に基づき複数のサブミッションキューSQのそれぞれの用途を推定して、SQ-タグテーブル422を更新する。SQ判定部431は、特定のタイミング以降に、複数のサブミッションキューSQからフェッチされたコマンドの総数が第1閾値に達したことに応じて、あるいは特定のタイミングから第1時間が経過した場合に、カウンタテーブル421に基づき複数のサブミッションキューSQそれぞれの用途を推定する。第1閾値、および第1時間のそれぞれには、任意の値が設定され得る。第1閾値、および第1時間を設定することによって、複数のサブミッションキューSQそれぞれの用途を推定するタイミングを制御できる。特定のタイミングは、例えば、カウンタテーブル421内の全てのカウンタが、直前にリセットされた(例えば、初期値である0に設定された)時刻である。
【0116】
複数のサブミッションキューSQのそれぞれの用途が推定されると、SQ判定部431はカウンタテーブル421をリセットする。その後、複数のサブミッションキューSQからフェッチされたコマンドの総数が第1閾値に達したことに応じて、あるいは第1時間が経過した場合に、SQ判定部431は再びカウンタテーブル421に基づき複数のサブミッションキューSQそれぞれの用途を推定する。このことで、一定の間隔でサブミッションキューSQは用途を推定され直し、最新の使用用途を正しく推定されやすくなる。
【0117】
また、複数のサブミッションキューSQのそれぞれの用途を推定する代わりに、コントローラ4は、複数のサブミッションキューSQのそれぞれの用途をホスト2から取得して、SQ-タグテーブル422を更新してもよい。また、各サブミッションキューSQの用途は、ホスト2およびメモリシステム3の製品仕様としてホスト2のベンダーとメモリシステム3のベンダーの間で決定されていてもよい。SQ判定部431は、ホスト2から取得した用途または製品仕様として決定されている用途を、任意の間隔で推定し直してもよい。任意の間隔は、複数のサブミッションキューSQからフェッチされたコマンドの総数が第1閾値に達するごと、あるいは第1時間が経過するごとである。
【0118】
図7では、サブミッションキューSQ0は、リードコマンドが優先して格納される傾向があり、サブミッションキューSQ1は、ライトコマンドが優先して格納される傾向があり、サブミッションキューSQ2は、フラッシュコマンドが優先して格納される傾向がある。また、リードバッファ61の空き領域が不足しており、且つライトバッファ62の空き領域が十分にある場合が示されている。
【0119】
この場合、ホストI/F41は、サブミッションキューSQ0を対象サブミッションキューSQとして選択すると、サブミッションキューSQ0を示す情報をコマンドフェッチ制御部432に通知する。
【0120】
通知を受けたコマンドフェッチ制御部432は、SQ-タグテーブル422から、サブミッションキューSQ0に対応するタグを取得する。取得したタグは、リード用を示す。
【0121】
そして、コマンドフェッチ制御部432は、リードバッファ61の空き領域のサイズを取得する。
【0122】
リードバッファ61の空き領域が不足しており、且つ対象サブミッションキューSQのタグがリード用を示していることに応じて、コマンドフェッチ制御部432は、サブミッションキューSQ0からのコマンドのフェッチをスキップする。そして、コマンドフェッチ制御部432は、次にコマンドがフェッチされるべきサブミッションキューSQを選択することをホストI/F41に要求する。
【0123】
また、ホストI/F41は、サブミッションキューSQ1を対象サブミッションキューSQとして選択すると、サブミッションキューSQ1を示す情報をコマンドフェッチ制御部432に通知する。
【0124】
通知を受けたコマンドフェッチ制御部432は、SQ-タグテーブル422から、サブミッションキューSQ1に対応するタグを取得する。取得したタグは、ライト用を示す。
【0125】
そして、コマンドフェッチ制御部432は、ライトバッファ62の空き領域のサイズを取得する。
【0126】
ライトバッファ62の空き領域が十分にあり、且つ対象サブミッションキューSQのタグがライト用を示していることに応じて、コマンドフェッチ制御部432は、サブミッションキューSQ1からコマンドをフェッチする。
【0127】
またさらに、ホストI/F41は、サブミッションキューSQ2を対象サブミッションキューSQとして選択すると、サブミッションキューSQ2を示す情報をコマンドフェッチ制御部432に通知する。
【0128】
通知を受けたコマンドフェッチ制御部432は、SQ-タグテーブル422から、サブミッションキューSQ2に対応するタグを取得する。取得したタグは、汎用を示す。
【0129】
対象サブミッションキューSQ2のタグが汎用を示していることに応じて、コマンドフェッチ制御部432は、サブミッションキューSQ2からコマンドをフェッチする。
【0130】
このように、コントローラ4は、SSD3のリソースの使用状況と、各サブミッションキューSQに対応するタグとに基づいて、対象サブミッションキューSQからコマンドをフェッチするか否かを判定することができる。これにより、コントローラ4は、SSD3におけるリソースの使用状況に適したコマンドがフェッチされる可能性が高いサブミッションキューSQを選んで、コマンドをフェッチすることができる。
【0131】
図8から図14を参照して、サブミッションキューSQの用途を推定する動作について説明する。ここでは、ホスト2に設けられるサブミッションキューSQが、サブミッションキューSQ0と、サブミッションキューSQ1とである場合について例示する。この場合、サブミッションキューSQ0とサブミッションキューSQ1とは、交互に、フェッチ対象のサブミッションキューSQとして選択される。また、サブミッションキューSQ0およびSQ1のそれぞれに対応するカウンタが、第1リードカウンタ、第1ライトカウンタ、および第1汎用カウンタであることを想定する。
【0132】
図8は、SSD3のコントローラ4において行われるサブミッションキューSQの用途を推定する動作の一例を示すシーケンス図である。この動作は、サブミッションキューSQに対応するカウンタを制御する動作と、サブミッションキューSQにタグを関連付ける動作とを含む。
【0133】
まず、コントローラ4内のSQ判定部431は、例えば、複数のサブミッションキューSQが作成された直後の初期状態において、全てのサブミッションキューSQのタグを汎用に設定する初期化を行う(S100)。つまり、SQ判定部431は、全てのサブミッションキューSQのタグが汎用に設定されていることを示すように、SQ-タグテーブル422を生成(または更新)する。より詳しくは、SQ判定部431は、SQ-タグテーブル422に含まれる全てのエントリにおいて、タグを汎用に設定する。
【0134】
そして、SQ判定部431は、全てのサブミッションキューSQのそれぞれに対応する全てのカウンタをクリアする(ステップS101)。つまり、SQ判定部431は、全てのサブミッションキューSQのそれぞれに対応する全てのカウンタが初期値(例えば、0)に設定されていることを示すように、カウンタテーブル421を更新する。
【0135】
図9は、S101の動作により更新されたカウンタテーブル421を示す。図9に示すカウンタテーブル421では、全てのサブミッションキューSQのそれぞれに対応する全てのカウンタが0に設定されている。具体的には、サブミッションキューSQ0に対応する第1リードカウンタ#Reads、第1ライトカウンタ#Writes、および第1汎用カウンタ#Non-RWsのそれぞれが0に設定されている。また、サブミッションキューSQ1に対応する第1リードカウンタ#Reads、第1ライトカウンタ#Writes、および第1汎用カウンタ#Non-RWsのそれぞれが0に設定されている。
【0136】
次いで、ホストI/F41は、フェッチ対象のサブミッションキューSQとしてサブミッションキューSQ0を選択し、コマンドフェッチ制御部432は、サブミッションキューSQ0からリードコマンドをフェッチする(ステップS102)。コマンドフェッチ制御部432は、フェッチされたリードコマンドに応じて、サブミッションキューSQ0に対応する第1リードカウンタ#Readsをインクリメントする(ステップS103)。
【0137】
図10は、S103の動作により更新されたカウンタテーブル421を示す。図10に示すカウンタテーブル421では、サブミッションキューSQ0に対応する第1リードカウンタ#Readsが、サブミッションキューSQ0からフェッチされたリードコマンドに基づいてインクリメントされたことにより、0から1に更新されている。
【0138】
次いで、ホストI/F41は、フェッチ対象のサブミッションキューSQとしてサブミッションキューSQ1を選択し、コマンドフェッチ制御部432は、サブミッションキューSQ1からライトコマンドをフェッチする(ステップS104)。コマンドフェッチ制御部432は、フェッチされたライトコマンドに応じて、サブミッションキューSQ1に対応する第1ライトカウンタ#Writesをインクリメントする(ステップS105)。
【0139】
図11は、S105の動作により更新されたカウンタテーブル421を示す。図11に示すカウンタテーブル421では、サブミッションキューSQ1に対応する第1ライトカウンタ#Writesが、サブミッションキューSQ1からフェッチされたライトコマンドに基づいてインクリメントされたことにより、0から1に更新されている。
【0140】
次いで、ホストI/F41は、フェッチ対象のサブミッションキューSQとしてサブミッションキューSQ0を選択し、コマンドフェッチ制御部432は、サブミッションキューSQ0からフラッシュコマンドをフェッチする(ステップS106)。コマンドフェッチ制御部432は、フェッチされたフラッシュコマンドに応じて、サブミッションキューSQ0に対応する第1汎用カウンタ#Non-RWsをインクリメントする(ステップS107)。
【0141】
図12は、S107の動作により更新されたカウンタテーブル421を示す。図12に示すカウンタテーブル421では、サブミッションキューSQ0に対応する第1汎用カウンタ#Non-RWsが、サブミッションキューSQ0からフェッチされたフラッシュコマンドに基づいてインクリメントされたことにより、0から1に更新されている。
【0142】
同様にして、各サブミッションキューSQからコマンドをフェッチする動作と、フェッチされたコマンドに対応するカウンタをインクリメントする動作とが繰り返し実行される。ここでは、一度のコマンドフェッチ処理で1個のコマンドがフェッチされる場合について説明したが、一度のコマンドフェッチ処理で2個以上のコマンドがフェッチされてもよい。一度のコマンドフェッチ処理で2個以上のコマンドがフェッチされる場合には、コントローラ4は、フェッチされたコマンドの数と同じ値だけ、カウンタの値をインクリメントする。
【0143】
そして、S101でカウンタがクリアされた後にフェッチされたコマンドの総数が第1閾値に達した場合、あるいはS101でカウンタがクリアされてから第1時間が経過した場合、SQ判定部431は、カウンタテーブル422を用いて、サブミッションキューSQ0およびSQ1のそれぞれのタグを更新する(ステップS108)。
【0144】
図13は、S101でカウンタがクリアされた後にフェッチされたコマンドの総数が第1閾値に達した場合、あるいはS101でカウンタがクリアされてから一定時間が経過した場合、におけるカウンタテーブル421の例を示す。
【0145】
具体的には、サブミッションキューSQ0に対応する第1リードカウンタ#Readsは、100である。サブミッションキューSQ0に対応する第1ライトカウンタ#Writesは、5である。サブミッションキューSQ0に対応する汎用カウンタ#Non-WRsは、10である。
【0146】
また、サブミッションキューSQ1に対応する第1リードカウンタ#Readsは、5である。サブミッションキューSQ1に対応する第1ライトカウンタ#Writesは、100である。サブミッションキューSQ1に対応する汎用カウンタ#Non-WRsは、10である。
【0147】
S108において、SQ判定部431は、複数のサブミッションキューSQのそれぞれの用途を、複数のサブミッションキューSQのそれぞれからフェッチされた一つ以上のコマンドの種類に基づいて推定する。例えば、サブミッションキューSQ1からフェッチされた一つ以上のコマンドの種類に基づいて、サブミッションキューSQ0の用途を推定する。SQ判定部431は、サブミッションキューSQ1からフェッチされた一つ以上のコマンドの種類に基づいて、サブミッションキューSQ1の用途を推定する。
【0148】
具体的には、SQ判定部431は、一つのサブミッションキューSQに対応する三つのカウンタから最大の値を有するカウンタを特定し、特定されたカウンタに対応するタグをそのサブミッションキューSQに関連付ける動作を、サブミッションキューSQ毎に行う。例えば、サブミッションキューSQ0に対応する第1リードカウンタ#Reads、第1ライトカウンタ#Writes、および第1汎用カウンタ#Non-RWsの内、第1リードカウンタ#Readsの値が最大である場合、SQ判定部431は、リード用を示すタグをサブミッションキューSQ0に関連付ける。サブミッションキューSQ0に対応する第1リードカウンタ#Reads、第1ライトカウンタ#Writes、および第1汎用カウンタ#Non-RWsの内、第1ライトカウンタ#Writesの値が最大である場合、SQ判定部431は、ライト用を示すタグをサブミッションキューSQ0に関連付ける。サブミッションキューSQ0に対応する第1リードカウンタ#Reads、第1ライトカウンタ#Writes、および第1汎用カウンタ#Non-RWsのうち、第1汎用カウンタ#Non-RWsの値が最大である場合、SQ判定部431は、汎用を示すタグをサブミッションキューSQ0に関連付ける。他のサブミッションキューSQについても、同様にしてタグが関連付けられる。
【0149】
サブミッションキューSQ0に対応する複数のカウンタの内、最大の値を有するカウンタが複数存在する場合、SQ判定部431は、汎用を示すタグをサブミッションキューSQ0に関連付けてもよい。また、SQ判定部431は、カウンタの最大値と二番目に大きい値との差が閾値以上である場合にサブミッションキューSQ0にタグを関連付けてもよい。
【0150】
SQ判定部431は、複数のサブミッションキューSQのそれぞれに新たに関連付けられたタグに基づいて、SQ-タグテーブル422を更新する。具体的には、例えば、SQ判定部431は、SQ-タグテーブル422において、サブミッションキューSQ0に対応するエントリを特定する。そして、SQ判定部431は、特定されたエントリのタグフィールドに設定されているタグを、サブミッションキューSQ0に新たに関連付けられたタグに書き換える。
【0151】
図13に示したカウンタテーブル421が用いられる場合、SQ判定部431は、サブミッションキューSQ0に対応する三つのカウンタから、最大の値を有する第1リードカウンタ#Readsを特定する。そして、SQ判定部431は、特定された第1リードカウンタ#Readsに対応するリード用を示すタグを、サブミッションキューSQ0に関連付ける。また、SQ判定部431は、サブミッションキューSQ1に対応する三つのカウンタから、最大の値を有する第1ライトカウンタ#Writesを特定する。そして、SQ判定部431は、特定された第1ライトカウンタ#Writesに対応するライト用を示すタグを、サブミッションキューSQ1に関連付ける。
【0152】
図14は、S108の動作により更新されたSQ-タグテーブル422を示す。図14に示すSQ-タグテーブル422では、サブミッションキューSQ0に関連付けられたタグが、汎用からリード用に更新されている。また、サブミッションキューSQ1に関連付けられたタグが、汎用からライト用に更新されている。
【0153】
その後、SQ判定部431は、S101に戻り、再度全てのサブミッションキューSQのそれぞれに対応する全てのカウンタをリセットすることにより、サブミッションキューSQの用途を判定する動作を繰り返し行う。したがって、コントローラ4は、サブミッションキューSQからフェッチされたコマンドの種類の傾向に応じて、そのサブミッションキューSQに関連付けられるタグを動的に更新できる。
【0154】
次いで、図15および図16を参照して、SSD3において実行されるフェッチ管理・制御処理について説明する。
【0155】
図15は、SSD3において実行されるフェッチ管理・制御処理の手順の例を示すフローチャートである。
【0156】
まず、コントローラ4は、複数のサブミッションキューSQからフェッチ対象のサブミッションキューSQ(対象サブミッションキューSQ)を選択する(ステップS201)。具体的には、コントローラ4は、特定のアービトレーション機構(例えば、ラウンドロビン)に従って、対象サブミッションキューSQを選択する。
【0157】
コントローラ4は、SQ-タグテーブル422から、対象サブミッションキューSQに関連付けられたタグを取得する(ステップS202)。具体的には、コントローラ4は、SQ-タグテーブル422において、対象サブミッションキューSQに対応するエントリを特定する。そして、コントローラ4は、特定されたエントリからタグを取得する。タグは、例えば、リード用、ライト用、および汎用のいずれかを示す情報である。
【0158】
コントローラ4は、SSD3におけるリソースの使用状況を取得する(ステップS203)。SSD3におけるリソースの使用状況は、例えば、リードバッファ61の空き領域に関する情報、ライトバッファ62の空き領域に関する情報、およびSSD3の消費電力の情報を含む。
【0159】
コントローラ4はフェッチ制御処理を実行する(ステップS204)。フェッチ制御処理は、S202で取得されたタグと、S203で取得されたリソースの使用状況とに基づいて、対象SQからのコマンドのフェッチを制御する処理である。フェッチ制御処理の具体的な手順の例については、図16を参照して後述する。
【0160】
次いで、コントローラ4は、サブミッションキューSQのタグを更新するタイミングであるか否かを判定する(ステップS205)。例えば、コントローラ4は、複数のサブミッションキューSQに対応する全てのカウンタがリセットされてから、フェッチされたコマンドの総数が閾値に達した場合に、サブミッションキューSQのタグを更新するタイミングであると判定する。コントローラ4は、複数のサブミッションキューSQに対応する全てのカウンタがリセットされてから一定時間が経過した場合に、サブミッションキューのSQタグを更新するタイミングであると判定する。
【0161】
サブミッションキューSQのタグを更新するタイミングでない場合(S205でNo)、コントローラ4は、S201に戻り、次の対象サブミッションキューSQを選択して、コマンドのフェッチを制御する処理を行う。
【0162】
サブミッションキューSQのタグを更新するタイミングである場合(S205でYes)、コントローラ4は、カウンタテーブル421を用いてSQ-タグテーブル422を更新する(ステップS206)。カウンタテーブル421を用いてSQ-タグテーブル422を更新する方法については、図8から図14を参照して前述した通りである。そして、コントローラ4は、全てのカウンタをリセットする(ステップS207)。各カウンタの値は、例えば、0に設定される。そして、コントローラ4は、S201に戻り、次の対象SQを選択して、コマンドのフェッチを制御する処理を行う。
【0163】
図16は、SSD3において実行されるフェッチ制御処理の手順の第1の例を示すフローチャートである。フェッチ制御処理は、対象サブミッションキューSQに関連付けられたタグと、SSD3のリソースの使用状況とに基づいて、対象サブミッションキューSQからのコマンドのフェッチを制御する処理である。フェッチ制御処理は、図15を参照して前述したフェッチ管理・制御処理のステップS204に相当する。ここでは、SSD3におけるリソースの使用状況として、リードバッファ61の空き領域に関する指標、およびライトバッファ62の空き領域に関する指標が使用される場合を例示する。また、各サブミッションキューSQに対応する複数のカウンタとして、第1リードカウンタ、第1ライトカウンタ、および第1汎用カウンタの三つのカウンタが使用される。
【0164】
まず、コントローラ4は、対象サブミッションキューSQに関連付けられているタグに基づき処理を分岐する(ステップS301)。対象サブミッションキューSQに関連付けられているタグは、図15を参照して前述したフェッチ管理・制御処理のS202で取得されたタグである。
【0165】
対象サブミッションキューSQに関連付けられているタグが汎用を示す場合(S301で汎用)、コントローラ4は、対象サブミッションキューSQからコマンドをフェッチする(ステップS302)。SSD3では、フェッチされたコマンドに応じた処理が行われる。コントローラ4は、対象サブミッションキューSQに対応する三つのカウンタの内、フェッチされたコマンドの種類に対応するカウンタをインクリメントし(ステップS303)、フェッチ制御処理を終了する。
【0166】
対象サブミッションキューSQに関連付けられているタグがリード用を示す場合(S301でリード用)、コントローラ4は、SSD3のリソースの使用状況に基づいて、リードバッファ61の空き領域が十分にあるか否かを判定する(ステップS304)。具体的には、コントローラ4は、例えば、リードバッファ61の空き領域のサイズが第2閾値以上であるか否かを判定する。
【0167】
リードバッファ61の空き領域が十分にある(例えばリードバッファ61の空き領域のサイズが第2閾値以上である)場合(S304でYes)、コントローラ4は、対象サブミッションキューSQからコマンドをフェッチする(ステップS302)。そして、コントローラ4は、対象サブミッションキューSQに対応する三つのカウンタの内、フェッチされたコマンドの種類に対応するカウンタをインクリメントし(ステップS303)、フェッチ制御処理を終了する。
【0168】
リードバッファ61の空き領域が十分にない(例えばリードバッファ61の空き領域のサイズが第2閾値未満である)場合(S304でNo)、コントローラ4は、対象サブミッションキューSQからのコマンドのフェッチをスキップし(ステップS305)、フェッチ制御処理を終了する。つまり、コントローラ4は、対象サブミッションキューSQからコマンドをフェッチすることなく、フェッチ制御処理を終了する。
【0169】
対象サブミッションキューSQに関連付けられているタグがライト用を示す場合(S301でライト用)、コントローラ4は、SSD3のリソースの使用状況に基づいて、ライトバッファ62の空き領域が十分であるか否かを判定する(ステップS306)。具体的には、コントローラ4は、例えば、ライトバッファ62の空き領域のサイズが第3閾値以上であるか否かを判定する。
【0170】
ライトバッファ62の空き領域が十分にある(例えばライトバッファ62の空き領域のサイズが第3閾値以上である)場合(S306でYes)、コントローラ4は、対象サブミッションキューSQからコマンドをフェッチする(ステップS307)。そして、コントローラ4は、対象サブミッションキューSQに対応する三つのカウンタの内、フェッチされたコマンドの種類に対応するカウンタをインクリメントし(ステップS303)、フェッチ制御処理を終了する。
【0171】
ライトバッファ62の空き領域が十分にない(例えばライトバッファ62の空き領域のサイズが第3閾値未満である)場合(S306でNo)、コントローラ4は、対象サブミッションキューSQからのコマンドのフェッチをスキップし(ステップS307)、フェッチ制御処理を終了する。
【0172】
また、フェッチ制御処理を終了した後、再び、図15のS201の動作が実行されるとき、全てのサブミッションキューSQに対するコマンドのフェッチが連続してスキップされた後である場合、コントローラ4は、最初に選択された対象サブミッションキューSQからコマンドをフェッチするように決められていてもよい。あるいは、この場合に、コントローラ4は、いずれのサブミッションキューSQからもコマンドをフェッチしないことを決定してもよい。
【0173】
以上のフェッチ管理・制御処理により、コントローラ4は、対象サブミッションキューSQに関連付けられたタグと、SSD3のリソースの使用状況とに基づいて、対象サブミッションキューSQからのコマンドのフェッチを制御できる。具体的には、コントローラ4は、対象サブミッションキューSQのタグがリード用を示す場合、リードバッファ61の空き領域が十分にあるか否かに応じて、対象サブミッションキューSQからのコマンドのフェッチを実行するか、それともスキップするかを制御できる。コントローラ4は、対象サブミッションキューSQのタグがライト用を示す場合、ライトバッファ62の空き領域が十分にあるか否かに応じて、対象サブミッションキューSQからのコマンドのフェッチを実行するか、それともスキップするかを制御できる。コントローラ4は、対象サブミッションキューSQのタグが汎用を示す場合には、対象サブミッションキューSQからコマンドをフェッチできる。また、コントローラ4は、フェッチされたコマンドの種類に対応するカウンタをインクリメントできる。
【0174】
これにより、SSD3におけるリソースの使用状況に適したサブミッションキューSQからコマンドがフェッチされるので、ホスト2からSSD3へのアクセス性能を向上できる。
【0175】
(変形例)
SSD3におけるリソースの使用状況は、前述したリードバッファ61およびライトバッファ62の空き領域に関する指標に限らず、SSD3における様々なリソースの情報を含み得る。例えば、SSD3におけるリソースの使用状況は、SSD3の消費電力に関する指標であってもよい。以下では、SSD3におけるリソースの使用状況として、SSD3の消費電力に関する指標が用いられる変形例について説明する。
【0176】
変形例のSSD3において、複数のサブミッションキューSQのそれぞれには、例えば、リード用、ライト用、および汎用のいずれか一つのタグが関連付けられる。
【0177】
リード用を示すタグは、対応するサブミッションキューSQに、NANDメモリ5からユーザデータを読み出す動作(リード動作)を生じさせるコマンドが格納されやすい傾向があることを示す。リード動作を生じさせるコマンドは、例えば、リードコマンド、およびコピーコマンドである。
【0178】
ライト用を示すタグは、対応するサブミッションキューSQに、NANDメモリ5にユーザデータを書き込む動作(ライト動作)を生じさせるコマンドが格納されやすい傾向があることを示す。ライト動作を生じさせるコマンドは、例えば、ライトコマンド、コピーコマンド、およびフラッシュコマンドである。
【0179】
汎用を示すタグは、リード動作とライト動作のいずれも生じさせないコマンドが格納されやすい傾向があることを示す。リード動作とライト動作のいずれも生じさせないコマンドは、例えば、SSD3のログを取得するためのコマンドである。SSD3のログを取得するためのコマンドはリード動作やライト動作を行うコマンドよりも、消費電力が少ないコマンドである。
【0180】
サブミッションキューSQに関連付けられ得る複数のタグが、前述したリード用、ライト用、および汎用の三つのタグである場合、カウンタテーブル421には、サブミッションキューSQ毎に、これら三つのタグにそれぞれ対応する三つのカウンタが含まれる。三つのカウンタは、第2リードカウンタ#Readと、第2ライトカウンタ#Writesと、第2汎用カウンタ#Non-RWsとを含む。
【0181】
図7を参照して前述した通り、コマンドフェッチ制御部432は、ホストI/F41からの対象サブミッションキューSQが通知された場合、SQ-タグテーブル422から、対象サブミッションキューSQに関連付けられたタグを取得する。また、コマンドフェッチ制御部432は、SSD3の消費電力に関する指標を取得する。SSD3の消費電力に関する指標は、SSD3の現在の消費電力そのものを示していてもよいし、SSD3の現在の消費電力に基づくパラメータであってもよい。
【0182】
コマンドフェッチ制御部432は、取得されたタグと、SSD3の消費電力に関する指標とに基づいて、対象サブミッションキューSQからコマンドをフェッチするか否かを判定する。
【0183】
具体的には、コマンドフェッチ制御部432は、対象サブミッションキューSQから取得されたタグがリード用またはライト用を示し、且つSSD3の消費電力に関する指標が第4閾値未満である場合、対象サブミッションキューSQからコマンドをフェッチする。コマンドフェッチ制御部432は、対象サブミッションキューSQから取得されたタグがリード用またはライト用を示し、且つSSD3の消費電力に関する指標が第4閾値以上である場合、対象サブミッションキューSQからのコマンドのフェッチをスキップする。
【0184】
また、コマンドフェッチ制御部432は、対象サブミッションキューSQから取得されたタグが汎用を示す場合、対象サブミッションキューSQからコマンドをフェッチする。
【0185】
これにより、SSD3の消費電力が第4閾値以上である場合には、リード用とライト用のいずれかを示すタグが関連付けられたサブミッションキューSQから、コマンドがフェッチされないように制御される。したがって、リード動作およびライト動作を生じさせる可能性が高いコマンドがフェッチされないので、SSD3の消費電力が高い場合に、消費電力がさらに上昇することを回避できる。
【0186】
また、SQ判定部431は、特定のタイミング以降に、複数のサブミッションキューSQからフェッチされたコマンドの総数が第1閾値に達したことに応じて、あるいは特定のタイミングから第1時間が経過した場合に、カウンタテーブル421に基づき複数のサブミッションキューSQそれぞれの用途を推定する。
【0187】
具体的には、SQ判定部431は、一つのサブミッションキューSQに対応する三つのカウンタから最大の値を有するカウンタを特定し、特定されたカウンタに対応するタグをそのサブミッションキューSQに関連付ける動作を、サブミッションキューSQ毎に行う。例えば、サブミッションキューSQ0に対応する第2リードカウンタ#Reads、第2ライトカウンタ#Writes、および第2汎用カウンタ#Non-RWsの内、第2リードカウンタ#Readsの値が最大である場合、SQ判定部431は、リード用を示すタグをサブミッションキューSQ0に関連付ける。サブミッションキューSQ0に対応する第2リードカウンタ#Reads、第2ライトカウンタ#Writes、および第2汎用カウンタ#Non-RWsの内、第2ライトカウンタ#Writesの値が最大である場合、SQ判定部431は、ライト用を示すタグをサブミッションキューSQ0に関連付ける。サブミッションキューSQ0に対応する第2リードカウンタ#Reads、第2ライトカウンタ#Writes、および第2汎用カウンタ#Non-RWsのうち、第2汎用カウンタ#Non-RWsの値が最大である場合、SQ判定部431は、汎用を示すタグをサブミッションキューSQ0に関連付ける。
【0188】
なお、サブミッションキューSQに対応する複数のカウンタの内、最大の値をとるカウンタが複数存在する場合、SQ判定部431は、汎用を示すタグをサブミッションキューSQに関連づける。
【0189】
したがって、SQ判定部431は、サブミッションキューSQからフェッチされた一つ以上のコマンドの種類に基づいて、サブミッションキューSQの用途を推定し、推定された用途を示すタグをサブミッションキューSQに関連付けることができる。
【0190】
図17は、変形例のSSD3において実行されるフェッチ制御処理の手順の第2の例を示すフローチャートである。このフェッチ制御処理は、図15を参照して前述したフェッチ管理・制御処理のステップS204に相当する。
【0191】
まず、コントローラ4は、対象サブミッションキューSQに関連付けられているタグに基づき処理を分岐する(ステップS401)。
【0192】
対象サブミッションキューSQに関連付けられているタグが汎用を示す場合(S401で汎用)、コントローラ4は、対象サブミッションキューSQからコマンドをフェッチする(ステップS402)。そして、コントローラ4は、対象サブミッションキューSQに対応する三つのカウンタの内、フェッチされたコマンドの種類に対応するカウンタをインクリメントし(ステップS403)、フェッチ制御処理を終了する。
【0193】
対象サブミッションキューSQに関連付けられているタグがリード用、あるいはライト用を示す場合(S401でリード用またはライト用)、コントローラ4は、SSD3の消費電力が第4閾値未満であるか否かを判定する(ステップS404)。
【0194】
SSD3の消費電力が第4閾値未満である場合(S404でYes)、コントローラ4は、対象サブミッションキューSQからコマンドをフェッチする(ステップS402)。そして、コントローラ4は、対象サブミッションキューSQに対応する三つのカウンタの内、フェッチされたコマンドの種類に対応するカウンタをインクリメントし(ステップS403)、フェッチ制御処理を終了する。
【0195】
SSD3の消費電力が第4閾値以上である場合(S404でNo)、コントローラ4は、対象サブミッションキューSQからのコマンドのフェッチをスキップし、フェッチ制御処理を終了する(ステップS405)。
【0196】
以上のフェッチ制御処理の第2の例により、コントローラ4は、対象サブミッションキューSQに関連付けられたタグと、SSD3のリソースの使用状況とに基づいて、対象サブミッションキューSQからのコマンドのフェッチを制御できる。具体的には、コントローラ4は、対象サブミッションキューSQのタグがリード用またはライト用を示す場合、SSD3の消費電力が第4閾値以上であるか否かに応じて、対象サブミッションキューSQからのコマンドのフェッチを実行するか、それともスキップするかを制御できる。コントローラ4は、対象サブミッションキューSQのタグが汎用を示す場合には、対象サブミッションキューSQからコマンドをフェッチできる。また、コントローラ4は、フェッチされたコマンドの種類に対応するカウンタをインクリメントできる。
【0197】
これにより、SSD3におけるリソースの使用状況に適したサブミッションキューSQからコマンドがフェッチされるので、ホスト2からSSD3へのアクセス性能を向上できる。
【0198】
以上説明したように、本実施形態によれば、コントローラ4は、あるサブミッションキューSQがコマンドフェッチの対象として選択された際に、SSD3のリソースの使用状況と、そのサブミッションキューSQの用途とに基づいて、そのサブミッションキューSQからコマンドをフェッチするか否かを決定する。コントローラ4は、サブミッションキューSQそれぞれからフェッチされたコマンドに基づいて、サブミッションキューSQの用途を推定する。SSD3のリソースの使用状況は、例えば、リードバッファ61の空き領域に関する指標、あるいはライトバッファ62の空き領域に関する指標である。
【0199】
これにより、コントローラ4は、SSD3のリソースの使用状況に適した種類のコマンドをフェッチできる可能性が高いサブミッションキューSQから、コマンドをフェッチできる。したがって、SSD3に対するアクセス性能を向上できる。
【0200】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0201】
1…情報処理システム、2…ホスト、3…SSD、4…コントローラ、5…NAND型フラッシュメモリ、6…DRAM、7…バス、20…内部バス、21…CPU、22…RAM、40…内部バス、41…ホストインタフェース回路、42…SRAM、43…CPU、44…DMAC、45…NANDインタフェース回路、46…DRAMインタフェース回路、51…メモリセルアレイ、61…リードバッファ、62…ライトバッファ、63…L2Pテーブル、221…データバッファ、421…カウンタテーブル、422…SQ-タグテーブル、431…SQ判定部、432…コマンドフェッチ制御部、433…コマンド処理部。
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16
図17