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

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

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

<>
  • 特開-メモリシステムおよび制御方法 図1
  • 特開-メモリシステムおよび制御方法 図2
  • 特開-メモリシステムおよび制御方法 図3
  • 特開-メモリシステムおよび制御方法 図4
  • 特開-メモリシステムおよび制御方法 図5
  • 特開-メモリシステムおよび制御方法 図6
  • 特開-メモリシステムおよび制御方法 図7A
  • 特開-メモリシステムおよび制御方法 図7B
  • 特開-メモリシステムおよび制御方法 図7C
  • 特開-メモリシステムおよび制御方法 図7D
  • 特開-メモリシステムおよび制御方法 図8A
  • 特開-メモリシステムおよび制御方法 図8B
  • 特開-メモリシステムおよび制御方法 図8C
  • 特開-メモリシステムおよび制御方法 図8D
  • 特開-メモリシステムおよび制御方法 図8E
  • 特開-メモリシステムおよび制御方法 図9
  • 特開-メモリシステムおよび制御方法 図10
  • 特開-メモリシステムおよび制御方法 図11
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2022094705
(43)【公開日】2022-06-27
(54)【発明の名称】メモリシステムおよび制御方法
(51)【国際特許分類】
   G06F 12/00 20060101AFI20220620BHJP
   G06F 12/02 20060101ALI20220620BHJP
   G06F 13/10 20060101ALI20220620BHJP
   G06F 13/12 20060101ALI20220620BHJP
   G06F 3/06 20060101ALI20220620BHJP
   G06F 3/08 20060101ALI20220620BHJP
【FI】
G06F12/00 560B
G06F12/00 597U
G06F12/02 510A
G06F13/10 340A
G06F13/12 330G
G06F3/06 301S
G06F3/08 H
【審査請求】未請求
【請求項の数】10
【出願形態】OL
(21)【出願番号】P 2020207741
(22)【出願日】2020-12-15
(71)【出願人】
【識別番号】318010018
【氏名又は名称】キオクシア株式会社
(74)【代理人】
【識別番号】110001737
【氏名又は名称】特許業務法人スズエ国際特許事務所
(72)【発明者】
【氏名】石黒 孝
【テーマコード(参考)】
5B160
【Fターム(参考)】
5B160CB01
(57)【要約】
【課題】必要なメモリリソースの量を削減可能なメモリシステムを実現する。
【解決手段】コントローラは、第1のゾーンにデータをシーケンシャルに書き込むための第1のコマンドをホストから受信する。コントローラは、第1のゾーンが割り当てられている第1のバッファが存在する場合、第1のバッファに第1のデータを格納する。コントローラは、第1のバッファが存在せず、且つ、フリーのバッファが存在する場合、第1のゾーンをフリーのバッファに割り当て、第1のゾーンが割り当てられたフリーのバッファに第1のデータを格納する。コントローラは、第1のバッファが存在せず、且つ、フリーのバッファが存在しない場合、複数のバッファのうち、データの格納のための最後の更新が最も古いバッファに、第1のゾーンを追加的に割り当て、第1のゾーンが追加的に割り当てられたバッファに、第1のデータを格納する。
【選択図】図6
【特許請求の範囲】
【請求項1】
不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、NVM express規格によって規定された、複数のゾーンに分割されたゾーンド・ネームスペースを使用して、前記不揮発性メモリを制御するように構成されたコントローラと、を具備し、
前記コントローラは、
複数のバッファを管理し、前記複数のバッファの数は前記複数のゾーンの数よりも少なく、
前記複数のゾーンのうちの第1のゾーンにデータをシーケンシャルに書き込むためのコマンドであって第1のデータに関連付けられた第1のコマンド、をホストから受信したことに応じ、
前記第1のゾーンが割り当てられている第1のバッファが前記複数のバッファの中に存在する場合、前記第1のバッファに前記第1のデータを格納し、
前記第1のバッファが前記複数のバッファの中に存在せず、且つ、どのゾーンも割り当てられていないフリーのバッファが前記複数のバッファの中に存在する場合、前記第1のゾーンを前記フリーのバッファに割り当て、前記第1のゾーンが割り当てられた前記フリーのバッファに前記第1のデータを格納し、
前記第1のバッファが前記複数のバッファの中に存在せず、且つ、どのゾーンも割り当てられていないフリーのバッファが前記複数のバッファの中に存在しない場合、前記複数のバッファのうち、データの格納のための最後の更新が最も古いバッファに、前記第1のゾーンを追加的に割り当て、前記第1のゾーンが追加的に割り当てられた前記バッファに、前記第1のデータを格納するように構成されている
メモリシステム。
【請求項2】
前記コントローラは、
前記複数のバッファがデータの格納のために更新された順序を示す履歴情報を管理し、
前記第1のバッファが前記複数のバッファの中に存在せず、且つ、どのゾーンも割り当てられていないフリーのバッファが前記複数のバッファの中に存在しない場合、前記履歴情報を参照することによって、前記複数のバッファのうち、データの格納のための最後の更新が最も古いバッファを決定するように構成されている請求項1に記載のメモリシステム。
【請求項3】
前記コントローラは、
前記複数のバッファのうちの第2のバッファに、前記複数のゾーンのうちの第2のゾーンに関連付けられている第2のデータと、前記複数のゾーンのうちの前記第2のゾーンとは異なる第3のゾーンに関連付けられている第3のデータとが格納されており、前記第2のデータのサイズが前記不揮発性メモリへの書き込み単位以上である場合、
前記第3のデータを前記第2のバッファに維持した状態で、前記第2のデータを前記第2のバッファから抽出し、
前記第2のゾーンに割り当てられた前記不揮発性メモリ内の記憶領域に、前記抽出した第2のデータを書き込むようにさらに構成されている
請求項1に記載のメモリシステム。
【請求項4】
前記コントローラは、
前記複数のバッファのうちのフル状態である第3のバッファに、前記複数のゾーンのうちの第4のゾーンに関連付けられている第4のデータと、前記複数のゾーンのうちの前記第4のゾーンとは異なる第5のゾーンに関連付けられている第5のデータとが格納されており、前記第4のデータのサイズが前記第5のデータのサイズよりも大きい場合、
前記第5のデータを前記第3のバッファに維持した状態で、前記第4のデータを前記第3のバッファから抽出し、
前記第4のゾーンに割り当てられた前記不揮発性メモリ内の記憶領域に、前記抽出した第4のデータを書き込むようにさらに構成されている
請求項3に記載のメモリシステム。
【請求項5】
前記複数のバッファの各々は、先入れ先出しバッファと、前記先入れ先出しバッファにデータを入力するための入力ポートと、前記先入れ先出しバッファからデータを出力するための出力ポートと、前記出力ポートを前記入力ポートに接続するためのパスとを含み、
前記コントローラは、
前記第2のバッファの前記先入れ先出しバッファから読み出し可能な次のデータが前記第3のデータである場合、前記パスを有効にし、前記第3のデータを前記第2のバッファの前記先入れ先出しバッファから読み出す動作と、前記読み出された前記第3のデータを前記第2のバッファの前記先入れ先出しバッファに書き戻す動作とを実行することによって、前記第3のデータを前記第2のバッファに維持するようにさらに構成されている
請求項3に記載のメモリシステム。
【請求項6】
前記コントローラは、
前記第2のバッファの前記先入れ先出しバッファから読み出し可能な前記次のデータが前記第2のデータである場合、前記パスを無効にし、前記第2のバッファの前記先入れ先出しバッファからの読み出し動作を実行することによって、前記第2のデータを前記第2のバッファから抽出するようにさらに構成されている
請求項5に記載のメモリシステム。
【請求項7】
前記不揮発性メモリは、各々が複数のページを含む複数のブロックを含み、前記複数のブロックの各々はデータ消去動作の単位であり、前記複数のページの各々はデータ書き込み動作およびデータ読み出し動作の単位であり、
前記書き込み単位は、前記複数のページの各々のサイズの倍数、または前記複数のブロックの各々のサイズの倍数である
請求項3に記載のメモリシステム。
【請求項8】
前記第1のコマンドは、前記NVM express規格において規定されたゾーンアペンドコマンドである
請求項1に記載のメモリシステム。
【請求項9】
前記第1のコマンドは、前記NVM express規格においてアドレス・スペシフィック・ライトコマンドとして規定されたライトコマンドである
請求項1に記載のメモリシステム。
【請求項10】
NVM express規格によって規定された、複数のゾーンに分割されたゾーンド・ネームスペースを使用して、不揮発性メモリを制御する制御方法であって、
前記複数のゾーンの数よりも少ない数の複数のバッファを管理することと、
前記複数のゾーンのうちの第1のゾーンにデータをシーケンシャルに書き込むためのコマンドであって第1のデータに関連付けられた第1のコマンド、をホストから受信することと、
前記第1のゾーンが割り当てられている第1のバッファが前記複数のバッファの中に存在する場合、前記第1のバッファに前記第1のデータを格納することと、
前記第1のバッファが前記複数のバッファの中に存在せず、且つ、どのゾーンも割り当てられていないフリーのバッファが前記複数のバッファの中に存在する場合、前記第1のゾーンを前記フリーのバッファに割り当て、前記第1のゾーンが割り当てられた前記フリーのバッファに前記第1のデータを格納することと、
前記第1のバッファが前記複数のバッファの中に存在せず、且つ、どのゾーンも割り当てられていないフリーのバッファが前記複数のバッファの中に存在しない場合、前記複数のバッファのうち、データの格納のための最後の更新が最も古いバッファに、前記第1のゾーンを追加的に割り当て、前記第1のゾーンが追加的に割り当てられた前記バッファに、前記第1のデータを格納することと、
前記複数のバッファのうちの第2のバッファに、前記複数のゾーンのうちの第2のゾーンに関連付けられている第2のデータと、前記複数のゾーンのうちの前記第2のゾーンとは異なる第3のゾーンに関連付けられている第3のデータとが格納されており、前記第2のデータのサイズが前記不揮発性メモリへの書き込み単位以上である場合、前記第3のデータを前記第2のバッファに維持した状態で、前記第2のデータを前記第2のバッファから抽出し、前記第2のゾーンに割り当てられた前記不揮発性メモリ内の記憶領域に、前記抽出した第2のデータを書き込むことと、
前記複数のバッファのうちのフル状態である第3のバッファに、前記複数のゾーンのうちの第4のゾーンに関連付けられている第4のデータと、前記複数のゾーンのうちの前記第4のゾーンとは異なる第5のゾーンに関連付けられている第5のデータとが格納されており、前記第4のデータのサイズが前記第5のデータのサイズよりも大きい場合、前記第5のデータを前記第3のバッファに維持した状態で、前記第4のデータを前記第3のバッファから抽出し、前記第4のゾーンに割り当てられた前記不揮発性メモリ内の記憶領域に、前記抽出した第4のデータを書き込むことと、
を具備する制御方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、不揮発性メモリを制御する技術に関する。
【背景技術】
【0002】
近年、不揮発性メモリを備えるメモリシステムが広く普及している。このようなメモリシステムの一つとして、NAND型フラッシュメモリを備えるソリッドステートドライブ(SSD)が知られている。
【0003】
SSDのようなメモリシステムとホストとの間の通信のための論理的なインタフェース用の規格としては、NVM ExpressTM(NVMeTM)が知られている。NVMe規格のインタフェースにおいては、ゾーンド・ネームスペースが規定されている。ゾーンド・ネームスペースでは、メモリシステムの論理アドレス範囲は、複数のゾーンに分割されている。
【0004】
メモリシステムにおいては、異なるゾーンにそれぞれ書き込むべきデータをゾーン毎にバッファリングするために、ゾーンの数と同数のバッファが用意される場合がある。この場合、メモリシステムにおいて管理することが必要なゾーンの数が多い場合には、これらゾーンのために多くの量のメモリリソースが消費されることになる。
【0005】
したがって、メモリシステムにおいては、必要なメモリリソースの量を削減可能な新たな技術の実現が要求されている。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】米国特許第10,698,635号明細書
【特許文献2】米国特許出願公開第2020/0167274号明細書
【特許文献3】米国特許出願公開第2020/0257449号明細書
【発明の概要】
【発明が解決しようとする課題】
【0007】
本発明の一実施形態が解決しようとする課題は、必要なメモリリソースの量を削減可能なメモリシステムおよび制御方法を提供することである。
【課題を解決するための手段】
【0008】
実施形態によれば、メモリシステムは、不揮発性メモリと、不揮発性メモリに電気的に接続され、NVM express規格によって規定された、複数のゾーンに分割されたゾーンド・ネームスペースを使用して、不揮発性メモリを制御するように構成されたコントローラと、を具備する。コントローラは、複数のバッファを管理する。複数のバッファの数は複数のゾーンの数よりも少ない。コントローラは、複数のゾーンのうちの第1のゾーンにデータをシーケンシャルに書き込むためのコマンドであって第1のデータに関連付けられた第1のコマンドをホストから受信する。コントローラは、第1のコマンドを受信したことに応じ、第1のゾーンが割り当てられている第1のバッファが複数のバッファの中に存在する場合、第1のバッファに第1のデータを格納する。コントローラは、第1のコマンドを受信したことに応じ、第1のバッファが複数のバッファの中に存在せず、且つ、どのゾーンも割り当てられていないフリーのバッファが複数のバッファの中に存在する場合、第1のゾーンをフリーのバッファに割り当て、第1のゾーンが割り当てられたフリーのバッファに第1のデータを格納する。コントローラは、第1のコマンドを受信したことに応じ、第1のバッファが複数のバッファの中に存在せず、且つ、どのゾーンも割り当てられていないフリーのバッファが複数のバッファの中に存在しない場合、複数のバッファのうち、データの格納のための最後の更新が最も古いバッファに、第1のゾーンを追加的に割り当て、第1のゾーンが追加的に割り当てられたバッファに、第1のデータを格納する。
【図面の簡単な説明】
【0009】
図1】実施形態に係るメモリシステムを含む情報処理システムの構成例を示すブロック図。
図2】NVMe規格によって規定されたゾーンド・ネームスペースの構成例を示す図。
図3】実施形態に係るメモリシステムにおいて実行される、ライトポインタの更新動作を示す図。
図4】比較例に係るメモリシステムにおいて実行されるバッファリング処理を示す図。
図5】比較例に係るメモリシステムにおいて実行される別のバッファリング処理を示す図。
図6】実施形態に係るメモリシステムに設けられた、複数のバッファと、データ/バッファ振り分け制御部と、データ/ゾーン振り分け制御部との関係を示す図。
図7A】実施形態に係るメモリシステムにおいて実行されるバッファリング処理の一つ目の処理を示す図。
図7B】実施形態に係るメモリシステムにおいて実行されるバッファリング処理の二つ目の処理を示す図。
図7C】実施形態に係るメモリシステムにおいて実行されるバッファリング処理の三つ目の処理を示す図。
図7D】実施形態に係るメモリシステムにおいて実行されるバッファリング処理の四つ目の処理を示す図。
図8A】実施形態に係るメモリシステムにおいて実行される追い越し処理の一つ目の処理を示す図。
図8B】実施形態に係るメモリシステムにおいて実行される追い越し処理の二つ目の処理を示す図。
図8C】実施形態に係るメモリシステムにおいて実行される追い越し処理の三つ目の処理を示す図。
図8D】実施形態に係るメモリシステムにおいて実行される追い越し処理の四つ目の処理を示す図。
図8E】実施形態に係るメモリシステムにおいて実行される追い越し処理の五つ目の処理を示す図。
図9】実施形態に係るメモリシステムにおいて実行されるコマンド処理の手順を示すフローチャート。
図10】実施形態に係るメモリシステムにおいて実行されるデータ/バッファ振り分け処理の手順を示すフローチャート。
図11】実施形態に係るメモリシステムにおいて実行される追い越し処理の手順を示すフローチャート。
【発明を実施するための形態】
【0010】
以下、図面を参照して、実施形態を説明する。
図1は、実施形態に係るメモリシステムを含む情報処理システム1の構成例を示すブロック図である。情報処理システム1は、ホスト(ホストデバイス)2と、SSD3とを含む。
【0011】
メモリシステムは、不揮発性メモリにデータを書き込み、不揮発性メモリからデータを読み出すように構成された半導体ストレージデバイスである。メモリシステムは、例えば、NAND型フラッシュメモリ5を含むSSD3として実現され得る。
【0012】
SSD3は、ホスト2にケーブルまたはネットワークを介して接続されてもよい。あるいは、SSD3は、ホスト2に内蔵されてもよい。ホスト2とSSD3とを接続するための論理インタフェースの規格としては、NVMe規格が使用され得る。
【0013】
ホスト2は、SSD3を制御するように構成された情報処理装置である。ホスト2の例には、パーソナルコンピュータ、サーバコンピュータ、携帯端末、車載機器、が含まれる。
【0014】
ホスト2は、プロセッサ101と、メモリ102を含む。プロセッサ101は、ホスト2内の各コンポーネントの動作を制御するように構成されたCPU(Central Processing Unit)である。プロセッサ101は、ホスト2に接続される他のストレージデバイスまたはSSD3からメモリ102にロードされるソフトウェア(ホストソフトウェア)を実行する。ホストソフトウェアには、オペレーティングシステム、ファイルシステム、デバイスドライバ、アプリケーションプログラム等が含まれる。
【0015】
メモリ102は、ホスト2に設けられたメインメモリである。メモリ102は、例えば、DRAM(Dynamic Random Access Memory)のようなランダムアクセスメモリによって実現される。メモリ102の記憶領域の一部は、一つ以上のSQ/CQペアを格納するために使用される。各SQ/CQペアは、一つ以上のサブミッションキュー(SQ)とこの一つ以上のサブミッションキュー(SQ)に関連付けられたコンプリーションキュー(CQ)とを含む。
【0016】
サブミッションキュー(SQ)は、SSD3にコマンドを発行するために使用されるキューである。コンプリーションキュー(CQ)は、完了したコマンドのステータスを示すコマンド完了をSSD3から受信するために使用されるキューである。
【0017】
ホスト2は、各SQ/CQペアに含まれる一つ以上のサブミッションキュー(SQ)を経由してSSD3に様々なコマンドを送信する。
【0018】
SSD3は、ホスト2との通信をNVMe規格に準拠して実行するように構成されている。
【0019】
このNVMe規格のインタフェースには、PCI expressTM(PCIeTM)バスを経由したインタフェース(NVMe over PCIe)と、イーサネットTMのようなネットワークを経由したインタフェース(NVMe over Fabrics:NVMe-oF)とが含まれる。SSD3が準拠するインタフェース規格は、NVMe over PCIeであってもよいし、NVMe-oFであってもよい。
【0020】
NVMe規格においては、複数のネームスペースが使用され得る。複数のネームスペースは、互いに独立した論理アドレス範囲である。論理アドレスは、SSD3のメモリ空間内を論理的にアドレス指定するためにホスト2によって使用されるアドレスである。この論理アドレスとしては、論理ブロックアドレス(logical block address)が使用され得る。各ネームスペースは、SSD3にアクセスするためにホスト2によって使用される。複数のネームスペースを使用することにより、一つのストレージデバイスをあたかも複数のストレージデバイスであるかのように動作させることができる。
【0021】
さらに、NVMe規格では、ゾーンド・ネームスペースが規定されている。ゾーンド・ネームスペースは、複数のゾーンに分割されたネームスペースである。各ゾーンは、連続する論理アドレスを含む。
【0022】
SSD3は、NVMe規格によって規定されたゾーンド・ネームスペースをサポートしている。SSD3は、ゾーンド・ネームスペースに含まれる複数のゾーンの各々に、データをシーケンシャルに書き込むように構成されている。
【0023】
SSD3は、コントローラ4と、不揮発性メモリ(例えば、NAND型フラッシュメモリ5)とを備える。SSD3は、ランダムアクセスメモリ、例えば、DRAM6も備えていてもよい。
【0024】
NAND型フラッシュメモリ5は、マトリクス状に配置された複数のメモリセルを含むメモリセルアレイを含む。NAND型フラッシュメモリ5は、2次元構造のフラッシュメモリであってもよいし、3次元構造のフラッシュメモリであってもよい。
【0025】
NAND型フラッシュメモリ5のメモリセルアレイは、複数のブロックBLK0~BLKx-1を含む。ブロックBLK0~BLKx-1の各々は、複数のページ(ここではページP0~Py-1)を含む。各ページは、同一ワード線に接続された複数のメモリセルを含む。ブロックBLK0~BLKx-1の各々は、データを消去するデータ消去動作の単位である。ページP0~Py-1の各々は、データ書き込み動作およびデータ読み出し動作の単位である。
【0026】
コントローラ4は、System-on-a-chip(SoC)のような回路によって実現されてもよい。
【0027】
コントローラ4は、NAND型フラッシュメモリ5を制御することによって、ホスト2から受信したデータをNAND型フラッシュメモリ5に書き込むデータ書き込み動作と、ホスト2によって要求された読み出し対象データをNAND型フラッシュメモリ5から読み出すデータ読み出し動作とを制御する。
コントローラ4は、これに限定されないが、Toggle NANDフラッシュインタフェースまたはオープンNANDフラッシュインタフェース(ONFI)に準拠するNANDインタフェース13を介して、NAND型フラッシュメモリ5に電気的に接続されている。コントローラ4は、NAND型フラッシュメモリ5を制御するように構成されたメモリコントローラとして動作する。
【0028】
コントローラ4は、NAND型フラッシュメモリ5のデータ管理及びブロック管理を実行するように構成されたフラッシュトランスレーション層(FTL)として機能し得る。
【0029】
FTLによって実行されるデータ管理は、(1)論理アドレスそれぞれとNAND型フラッシュメモリ5の物理アドレスそれぞれとの間の対応関係を示すマッピング情報の管理、(2)NAND型フラッシュメモリ5の制約(例えば、ページ単位のリード/ライト動作とブロック単位の消去動作)を隠蔽するための処理、等が含まれる。ある論理アドレスに対応する物理アドレスは、この論理アドレスに対応するデータが書き込まれた不揮発性メモリ5内の物理的な記憶位置を示す。コントローラ4は、論理物理アドレス変換テーブル(logical―to―physical address translation table:L2Pテーブル)31を使用して、論理アドレスそれぞれと物理アドレスそれぞれとの間の対応関係を管理する。上述したように、論理アドレスとしては、論理ブロックアドレス(LBA)が使用され得る。
【0030】
さらに、コントローラ4は、NVMe規格によって規定されたゾーンド・ネームスペースを使用して、NAND型フラッシュメモリ5を制御するように構成されている。
【0031】
図2は、NVMe規格によって規定された一つのゾーンド・ネームスペースの構成例を示す図である。
【0032】
各ゾーンド・ネームスペースの論理ブロックアドレス範囲は、LBA 0から始まる。例えば、図2のゾーンド・ネームスペースの論理ブロックアドレス範囲は、LBA 0からLBA z-1までの連続するz個のLBAを含んでいる。このゾーンド・ネームスペースは、ゾーン0からゾーンkまでのk+1個のゾーンに分割されている。これらゾーンの各々は、連続する非重複の論理ブロックアドレスを含む。
【0033】
より詳しくは、ゾーン0、ゾーン1、…、ゾーンkがゾーンド・ネームスペースに割り当てられている。LBA 0は、ゾーン0の最小のLBAを示し、LBA z-1はゾーンkの最大のLBAを示す。ゾーン1は、LBA m、LBA m+1、…、LBA n-2、LBA n-1を含む。LBA mはゾーン1の最小のLBAを示し、LBA n-1はゾーン1の最大のLBAを示す。
【0034】
コントローラ4は、例えば、NAND型フラッシュメモリ5内の複数の記憶領域(物理記憶領域)の各々と複数のゾーンの各々との間のマッピングを管理し得る。この場合、コントローラ4は、NAND型フラッシュメモリ5に含まれる複数のブロックのうちの少なくとも一つのブロックを、一つのゾーン用の物理記憶領域として割り当ててもよい。
【0035】
特定のゾーンにデータを書き込むことを要求するコマンドをコントローラ4がホスト2から受信した場合、コントローラ4は受信したコマンドによって指定されたゾーン、つまりこの特定のゾーンに割り当てられたNAND型フラッシュメモリ5内の特定の物理記憶領域に、データをシーケンシャルに書き込む。この結果、この特定のゾーンに含まれる連続するLBAに対応するデータは、この特定のゾーンに割り当てられた特定の物理記憶領域内の連続する物理記憶位置にシーケンシャルに書き込まれる。
【0036】
したがって、あるゾーンに含まれる連続するLBAに対応するデータのシーケンシャルリードを行う際には、コントローラ4は、このゾーン用の物理記憶領域として割り当てられた少なくとも一つのブロックのみをリードアクセスするだけで、これらデータのシーケンシャルリードを効率よく実行することができる。
【0037】
図3は、SSD3において実行される、ライトポインタの更新動作を示す図である。
【0038】
SSD3のコントローラ4は、複数のゾーンにそれぞれ対応する複数のライトポインタを管理する。各ライトポインタは、そのライトポインタに対応するゾーン内の次の書き込み可能LBAを示す。あるゾーンにデータをシーケンシャルに書き込むと、コントローラ4は、このゾーンに対応するライトポインタの値を、データが書き込まれた論理ブロックの数だけ増やす。
【0039】
ここでは、ゾーン1を例に、ライトポインタの更新動作を説明する。ゾーン1は、LBA mからLBA n-1までの論理ブロックアドレス範囲を含む。LBA mは、ゾーン1の最小の論理ブロックアドレス、つまりゾーン1のゾーン・スタート・論理ブロックアドレス(ZSLBA)である。
【0040】
ゾーン1が有効データを含まないエンプティ状態である場合、ゾーン1に対応するライトポインタは、ゾーン1のゾーン・スタート・論理ブロックアドレスであるLBA mを示す。ゾーン1にデータを書き込むためのコマンドによって指定された書き込み先位置(開始LBA)がゾーン1のライトポインタ(ここでは、LBA m)に等しい場合、コントローラ4は、その指定された開始LBAから始まるLBA範囲、例えば、LBA mと、LBA m+1、にデータを書き込む。コントローラ4は、データが書き込まれた論理ブロックの数だけゾーン1のライトポインタの値が増えるように、ゾーン1のライトポインタを更新する。例えば、LBA mと、LBA m+1にデータが書き込まれた場合、コントローラ4は、ライトポインタの値をLBA m+2に更新する。LBA m+2は、ゾーン1内の未書き込みLBAのうちの最小のLBA、つまりゾーン1内の次の書き込み可能LBAを示す。
【0041】
図1の説明に戻る。コントローラ4は、上述したNANDインタフェース13の他、ホストインタフェース11と、CPU12と、DRAMインタフェース14と、直接メモリアクセスコントローラ(DMAC)15と、バッファ回路16と、ECC(Error Correction Code)エンコード/デコード部17とを含む。これらホストインタフェース11と、CPU12と、NANDインタフェース13と、DRAMインタフェース14と、DMAC15と、バッファ回路16と、ECCエンコード/デコード部17とは、バス10を介して相互接続される。
【0042】
ホストインタフェース11は、ホスト2との通信を実行するように構成されたホストインタフェース回路である。ホストインタフェース11は、例えば、PCIeコントローラである。あるいは、SSD3がネットワークインタフェースコントローラを内蔵する構成である場合には、ホストインタフェース11は、ネットワークインタフェースコントローラの一部として実現されてもよい。
【0043】
ホストインタフェース11は、ホスト2との通信をNVMe規格に準拠して実行する。ホストインタフェース11は、アービトレーション機構を含む。このアービトレーション機構は、コマンドがフェッチされるべきサブミッションキューを、ホスト2のメモリ102上に存在する複数のサブミッションキューから選択するための機構である。アービトレーション機構は、ラウンドロビンアービトレーション機構であってもよいし、重み付きラウンドロビンアービトレーション機構であってもよい。
【0044】
ホストインタフェース11は、ホスト2から様々なコマンドを受信(フェッチ)する。これらコマンドには、NVMe規格によって規定されたゾーンド・ネームスペース・コマンドセットが含まれる。ゾーンド・ネームスペース・コマンドセットは、ホスト2がゾーンド・ネームスペースを使用してSSD3を制御することを可能にするための複数種類のコマンドを含む。
【0045】
これら複数種類のコマンドには、ゾーンにデータをシーケンシャルに書き込むためのコマンドが含まれる。このコマンドは、少なくとも、データが書き込まれるべきゾーンを指定するパラメータを含む。
【0046】
例えば、NVMe規格のゾーンド・ネームスペース・コマンドセットによって規定されたアドレス・スペシフィック・ライトコマンドは、データが書き込まれるべきゾーンと、このゾーン内の書き込み先位置(開始LBA)との双方を指定する。アドレス・スペシフィック・ライトコマンドの例は、ライトコマンド、ライト・ゼロコマンド、コピーコマンド、を含む。
【0047】
例えば、アドレス・スペシフィック・ライトコマンドとして使用されるライトコマンドは、書き込むべきデータ(ユーザデータ)をNAND型フラッシュメモリ5に書き込むためのコマンド(ライト要求)である。このライトコマンドは、データが書き込まれるべきネームスペースを指定するネームスペース識別子と、開始LBAと、このデータのサイズ(書き込まれるべき論理ブロックの数)と、このデータが格納されているホスト2のメモリ102内の位置を示すデータポインタ(バッファアドレス)、等を含む。ライトコマンドはゾーン・スタート・論理ブロックアドレス(ZSLBA)を指定する専用のパラメータ(フィールド)を含まないので、ライトコマンドに含まれる開始LBAは、データが書き込まれるべきゾーンとこのゾーン内の書き込み先位置との双方を指定するパラメータとして使用される。この場合、ライトコマンドに含まれる開始LBAの上位ビット部は、このライトコマンドに関連付けられたライトデータが書き込まれるべきゾーンのZSLBAとして使用される。ライトコマンドに含まれる開始LBAの下位ビット部は、このゾーン内の書き込み先位置を示す。以下では、アドレス・スペシフィック・ライトコマンドとして使用されるライトコマンドを単にライトコマンドと称する。
【0048】
ゾーン1への書き込みを要求するライトコマンドによって指定される開始LBAがゾーン1のライトポインタが示すLBAと等しくない場合、コントローラ4は、このライトコマンドの処理をアボートする。この場合、コントローラ4は、このライトコマンドに対応するライト処理のエラーを示すコマンド完了をホスト2に返す。これによって、各ゾーンにおいてシーケンシャルではないライト処理が実行されることを防ぐことができる。
【0049】
ホスト2は、あるゾーンへの書き込みを要求するライトコマンドをSSD3に発行した場合、このライトコマンドに対応するコマンド完了をSSD3から受信するまで、このゾーンと同じゾーンへの次のライトコマンドを発行できない。なぜなら、NVMe規格においてはストレージデバイスが任意の順序でコマンドを実行することが許容されているので、複数のライトコマンドが処理される順序がストレージデバイスによって入れ替えられると、このゾーン内のライト処理においてエラーが発生する場合があるためである。
【0050】
次に、NVMe規格のゾーンド・ネームスペース・コマンドセットによって規定されたゾーンアペンドコマンドについて説明する。
【0051】
ゾーンアペンドコマンドは、ライトコマンドと同様に、書き込むべきデータ(ユーザデータ)をNAND型フラッシュメモリ5に書き込むためのコマンド(ライト要求)である。しかし、ゾーンアペンドコマンドは、ライトコマンドとは異なり、データが書き込まれるべきゾーンのみを指定し、このゾーン内の書き込み先位置を指定しない。
【0052】
ゾーン内の書き込み先位置は、このゾーン内の書き込みがシーケンシャルに実行されるようにSSD3のコントローラ4によって自動的に決定される。ホスト2は、同じゾーンを指定する複数のゾーンアペンドコマンドを同時的にSSD3に発行することが許される。したがって、ライトコマンドを使用する場合と比較して、書き込み性能の向上を図ることが可能となる。
【0053】
ゾーンアペンドコマンドは、例えば、データが書き込まれるべきネームスペースを指定するネームスペース識別子と、データが書き込まれるべきゾーンの最小LBAを示すゾーン・スタート・論理ブロックアドレス(ZSLBA)と、このデータのサイズ(書き込まれるべき論理ブロックの数)と、このデータが格納されているホスト2のメモリ102内の位置を示すデータポインタ(バッファアドレス)、等を含む。ホスト2は、同じゾーンを指定する複数のゾーンアペンドコマンドを、一つ以上のサブミッションキューを経由して、SSD3に同時的に発行することができる。
【0054】
あるゾーンアペンドコマンドをホスト2から受信した場合、コントローラ4は、この受信したゾーンアペンドコマンドによって指定されたゾーンに対応するライトポインタを参照する。そして、コントローラ4は、このライトポインタによって示される次の書き込み可能論理ブロックアドレスを、この指定されたゾーン内の書き込み先位置として決定する。コントローラ4は、この受信したゾーンアペンドコマンドに関連付けられたデータを、この指定されたゾーン内の決定された書き込み先位置に書き込む。そして、コントローラ4は、このデータが書き込まれた書き込み先位置(LBA)を示す情報を含むコマンド完了をホスト2に送信する。コントローラ4は、これによって、受信したゾーンアペンドコマンドに関連付けられたデータが書き込まれたLBAをホスト2に通知する。
【0055】
以降の説明では、ゾーンにデータをシーケンシャルに書き込むためのコマンドとして、ゾーンアペンドコマンドが使用される場合を主として説明する。なお、ゾーンアペンドコマンドの代わりに、ゾーンとゾーン内の書き込み先位置との双方を指定するライトコマンドが、このゾーンにデータをシーケンシャルに書き込むためのコマンドとして使用されてもよい。
【0056】
NANDインタフェース13は、CPU12の制御の下、NAND型フラッシュメモリ5を制御するように構成されたNANDコントローラである。NAND型フラッシュメモリ5が複数のNAND型フラッシュメモリチップ(NAND型フラッシュメモリダイ)から構成されている場合、NANDインタフェース13は、複数のチャンネル(Ch)を介してこれらNAND型フラッシュメモリチップそれぞれと接続されていてもよい。
【0057】
バッファ回路16は、複数のバッファ(バッファ#0、バッファ#1、…、バッファ#q)を含む。バッファ#0~#qは、例えばSRAM(Static Random Access Memory)である。バッファ#0~#qは、バッファ回路16の記憶領域内に割り当てられている。あるいは、バッファ#0~#qは、DRAM6の記憶領域内に割り当てられていてもよい。
【0058】
バッファ#0~#qの数は、ゾーンド・ネームスペースに含まれるゾーンの数よりも少ない数に設定され得る。バッファ#0~#qの各々は、任意の一つ以上のゾーンに書き込まれるべきデータを一時的に格納するために使用される。
【0059】
DRAMインタフェース14は、CPU12の制御の下、DRAM6を制御するように構成されたDRAMコントローラである。
【0060】
DRAM6の記憶領域の一部は、L2Pテーブル31およびバッファ更新履歴テーブル32を記憶する領域として利用されてもよい。バッファ更新履歴テーブル32は、履歴情報を管理するために使用される。履歴情報は、バッファ#0~#qがデータの格納のために更新された順序を示す。
【0061】
DMAC15は、CPU12の制御の下、ホスト2のメモリ102とバッファ#0~#qの各々との間のデータ転送を実行する。
【0062】
ECCエンコード/デコード部17は、NAND型フラッシュメモリ5にデータをライトすべき時、データ(書き込むべきデータ)をエンコードすることによってこのデータにエラー訂正コード(ECC)を冗長コードとして付加する。NAND型フラッシュメモリ5からデータがリードされた時、ECCエンコード/デコード部17は、リードされたデータに付加されたECCを使用して、このデータのエラー訂正を行う。
【0063】
CPU12は、ホストインタフェース11と、NANDインタフェース13と、DRAMインタフェース14と、DMAC15と、バッファ回路16と、ECCエンコード/デコード部17を制御するように構成されたプロセッサである。CPU12は、NAND型フラッシュメモリ5または図示しないROMに格納されている制御プログラム(ファームウェア)をDRAM6にロードし、そしてこのファームウェアを実行することによって様々な処理を行う。
【0064】
CPU12は、データ/バッファ振り分け制御部21、およびデータ/ゾーン振り分け制御部22として機能することができる。これらデータ/バッファ振り分け制御部21、およびデータ/ゾーン振り分け制御部22の各々の一部または全部は、コントローラ4内の専用のハードウェアによって実現されてもよい。
【0065】
コントローラ4がホスト2からゾーンアペンドコマンドを受信したとき、データ/バッファ振り分け制御部21は、受信したゾーンアペンドコマンドに関連付けられているデータを一時的に格納するために使用されるべきバッファ(格納先バッファ)を決定する。この場合、データが特定のバッファに偏らずにバッファ#0~#qに分散されることを可能にし、且つ同じゾーンに書き込まれるべきデータが同じバッファに格納されることを可能にするために、データ/バッファ振り分け制御部21は、以下の処理を実行する。
【0066】
受信したゾーンアペンドコマンドによって指定されたゾーンが既に割り当てられているバッファがバッファ#0~#qの中に存在せず、且つ、フリーのバッファがバッファ#0~#qの中に存在する場合、データ/バッファ振り分け制御部21は、このフリーのバッファを格納先バッファとして決定し、受信したゾーンアペンドコマンドによって指定されたゾーンを、このフリーのバッファに割り当てる。フリーのバッファは、どのゾーンも割り当てられていないバッファである。そして、データ/バッファ振り分け制御部21は、受信したゾーンアペンドコマンドに関連付けられたデータをホスト2のメモリ102から取得し、取得したデータを、格納先バッファとして決定されたこのフリーのバッファに格納する。
【0067】
受信したゾーンアペンドコマンドによって指定されたゾーンが既に割り当てられているバッファがバッファ#0~#qの中に存在する場合、データ/バッファ振り分け制御部21は、このバッファを格納先バッファとして決定する。そして、データ/バッファ振り分け制御部21は、受信したゾーンアペンドコマンドに関連付けられたデータをホスト2のメモリ102から取得し、取得したデータを、格納先バッファとして決定されたこのバッファに格納する。
【0068】
バッファ#0~#qの各々にゾーンが既に割り当てられており、且つ、受信したゾーンアペンドコマンドによって指定されたゾーンが既に割り当てられているバッファがバッファ#0~#qの中に存在しない場合、データ/バッファ振り分け制御部21は、バッファ#0~#qのうちで、データの格納のための最後の更新が最も古いバッファを、受信したゾーンアペンドコマンドに関連付けられたデータが格納されるべき格納先バッファとして決定する。ここで、データの格納のための最後の更新が最も古いバッファは、バッファ#0~#qのうちの、データの格納のための最後の更新から最も長い時間が経過しているバッファを意味する。データ/バッファ振り分け制御部21は、受信したゾーンアペンドコマンドによって指定されたゾーンを、決定した格納先バッファに追加的に割り当てる。そして、データ/バッファ振り分け制御部21は、受信したゾーンアペンドコマンドに関連付けられたデータをホスト2のメモリ102から取得し、取得したデータを、決定した格納先バッファに格納する。
【0069】
データ/ゾーン振り分け制御部22は、(i)バッファ#0~#qのいずれか一つに格納されているデータの総サイズがNAND型フラッシュメモリ5への書き込み単位(以降では単に書き込み単位と称する)以上になったゾーン、または(ii)対応するデータがフル状態のバッファに格納されている全てのゾーンのうちで対応するデータの総サイズが最も大きいゾーンを、フラッシュ(flush)対象ゾーンとして選択する。
【0070】
ここで、フル状態のバッファは、そのバッファ全体がデータで満たされているバッファである。バッファ#0~#qのうちのいずれか一つのバッファにそのバッファサイズ分のデータが蓄積されると、このバッファはフル状態のバッファになる。フラッシュ対象ゾーンは、フラッシュ(flush)処理が実行されるべきゾーンを意味する。フラッシュ処理は、バッファに格納されているデータをバッファから読み出して、NAND型フラッシュメモリ5に書き込む処理である。
【0071】
書き込み単位は、例えば、ページサイズの倍数を示すサイズに設定され得る。ページサイズは、一つのページに格納可能なデータのサイズを示す。書き込み単位は、ページサイズと同じサイズに設定されていてもよいし、ページサイズの2倍のサイズに設定されていてもよいし、またはページサイズの3倍以上のサイズに設定されていてもよい。
【0072】
あるいは、書き込み単位は、例えば、ブロックサイズの倍数に設定されていてもよい。ブロックサイズは、一つのブロックに格納可能なデータのサイズを示す。書き込み単位は、ブロックサイズと同じサイズに設定されていてもよいし、ブロックサイズの2倍のサイズに設定されていてもよいし、またはブロックサイズの3倍以上のサイズに設定されていてもよい。
【0073】
バッファ#0~#qの各々のサイズは、書き込み単位よりも大きなサイズに設定されている。あるバッファに格納されているあるゾーンのデータの総サイズが書き込み単位以上になった場合、データ/ゾーン振り分け制御部22は、このゾーンをフラッシュ対象ゾーンとして選択する。
【0074】
あるバッファ内のどのゾーンのデータのサイズも書き込み単位に満たない状態で、このバッファがフルになる場合もある。この場合には、データ/ゾーン振り分け制御部22は、このフル状態のバッファに格納されている全てのゾーンのうちで、対応するデータの総サイズが最も大きいゾーンを、フラッシュ対象ゾーンとして選択する。
【0075】
フラッシュ対象ゾーンを選択した後、データ/ゾーン振り分け制御部22は、選択したフラッシュ対象ゾーンのデータが格納されているバッファに格納されている全てのゾーンのデータから、フラッシュ対象ゾーンのデータのみを抽出する。この場合、データ/ゾーン振り分け制御部22は、フラッシュ対象ゾーン以外の他のゾーンのデータをこのバッファに維持した状態で、フラッシュ対象ゾーンのデータのみを抽出する。そして、データ/ゾーン振り分け制御部22は、フラッシュ対象ゾーンに割り当てられたNAND型フラッシュメモリ5内の特定の物理記憶領域に、抽出したデータを書き込む。
【0076】
フラッシュ対象ゾーン以外の他のゾーンのデータをバッファに維持した状態でフラッシュ対象ゾーンのデータのみを抽出するという処理を実現するために、バッファ#0~#qの各々は、追い越し制御機能付きの先入れ先出しバッファ(FIFOバッファ)として実現されていてもよい。
【0077】
追い越し制御機能付きのFIFOバッファは、例えば、データを入力するための入力ポートと、データを出力するための出力ポートと、出力ポートを入力ポートに接続するためのパスとを含む。このパスは、ループバックパスとも称される。
【0078】
あるFIFOバッファがフル状態である場合、または、あるFIFOバッファに格納されている特定のゾーンのデータの総サイズが書き込み単位以上になった場合、データ/ゾーン振り分け制御部22は、このFIFOバッファから読み出し可能な次のデータが、フラッシュ対象ゾーンのデータであるか否かを判定する。このFIFOバッファから読み出し可能な次のデータは、このFIFOバッファに格納されているデータのうちで最も古いデータを意味する。
【0079】
FIFOバッファから読み出し可能な次のデータがフラッシュ対象ゾーン以外の他のゾーンのデータである場合、データ/ゾーン振り分け制御部22は、他のゾーンのデータをFIFOバッファに書き戻すための処理を実行する。この場合、データ/ゾーン振り分け制御部22は、FIFOバッファのループバックパスを有効にした状態でFIFOバッファに対する読み出し動作および書き込み動作を実行する。これによって、データ/ゾーン振り分け制御部22は、他のゾーンのデータをFIFOバッファから読み出す動作と、読み出された当該他のゾーンのデータをFIFOバッファに書き戻す動作とを並列に実行する。
【0080】
FIFOバッファから読み出し可能な次のデータがフラッシュ対象ゾーンのデータである場合、データ/ゾーン振り分け制御部22は、フラッシュ対象ゾーンのデータをFIFOバッファに書き戻すことなく、フラッシュ対象ゾーンのデータをFIFOバッファから読み出すための通常の読み出しを実行する。この場合、データ/ゾーン振り分け制御部22は、FIFOバッファのループバックパスを無効にした状態で読み出し動作を実行することによって、フラッシュ対象ゾーンのデータをFIFOバッファから読み出す。
【0081】
このFIFOバッファからフラッシュ対象ゾーンのデータの全てが読み出されるまで、データ/ゾーン振り分け制御部22は、必要に応じて、上述の書き戻しのための処理と上述の通常の読み出し処理とを選択的に実行する。
【0082】
このように、FIFOバッファのループバックパスを有効または無効にすることによって、データ/ゾーン振り分け制御部22は、フラッシュ対象ゾーンのデータよりも古いデータをFIFOバッファに維持した状態でフラッシュ対象ゾーンのデータのみをFIFOバッファから読み出す処理(追い越し処理)を実行することができる。この追い越し処理により、フラッシュ対象ゾーン以外の他のゾーンのデータをFIFOバッファに維持した状態で、フラッシュ対象ゾーンのデータのみをFIFOバッファから抽出することが可能となる。
【0083】
次に、本実施形態のバッファリング処理の詳細について説明する。本実施形態のバッファリング処理の詳細の説明に先立ち、まず、比較例に係るバッファリング処理について説明する。
【0084】
図4は、比較例に係るメモリシステムにおいて実行されるバッファリング処理を示す。ここでは、ゾーンの数と同じ数のバッファを使用するバッファリング処理を、比較例に係るメモリシステム(SSD)において実行されるバッファリング処理として説明する。
【0085】
図4に示すように、比較例では、複数のゾーンと複数のバッファとが一対一で対応している。比較例に係るSSDにおいて管理されるゾーンは、ゾーン0からゾーンkまでのk+1個のゾーンである。この場合、バッファ#0からバッファ#kまでのk+1個のバッファを比較例に係るSSD内に用意することが必要とされる。
【0086】
バッファ#0はゾーン0に書き込むべきデータのみを格納するために使用される。バッファ#1はゾーン1に書き込むべきデータのみを格納するために使用される。バッファ#2はゾーン2に書き込むべきデータのみを格納するために使用される。バッファ#3はゾーン3に書き込むべきデータのみを格納するために使用される。バッファ#kはゾーンkに書き込むべきデータのみを格納するために使用される。
【0087】
ゾーン0を指定するゾーンアペンドコマンドがホストから比較例に係るSSDに発行されると、比較例に係るSSDの入力制御部は、このゾーンアペンドコマンドに関連付けられたデータをバッファ#0に格納する。同様に、ゾーン1を指定するゾーンアペンドコマンドがホストからSSDに発行されると、入力制御部は、このゾーンアペンドコマンドに関連付けられたデータをバッファ#1に格納する。バッファ#0~#kのうちのいずれか一つのバッファに所定量以上のデータが蓄積されると、このいずれか一つのバッファに対応するゾーンへのシーケンシャルライトが開始される。
【0088】
図4に示す比較例のバッファリング処理では、ゾーンの数と同数のバッファが必要とされるため、SSDにおいて管理することが必要なゾーンの数が多い場合には、多くのバッファ、つまり多くの量のメモリリソースが必要とされることになる。
【0089】
次に、SSD内に用意されるべきバッファの数を単純に減らす構成を採用した場合のバッファリング処理を、比較例に係る別のバッファリング処理として説明する。図5は、比較例に係るメモリシステムにおいて実行される別のバッファリング処理を示す。
【0090】
図5に示すように、比較例では、SSDにおいて管理されるゾーンは、ゾーン0からゾーンkまでのk+1個のゾーンである。SSDに用意されるバッファは、バッファ#0からバッファ#3までの4個のバッファである。ここでは、バッファの数(=4)は、ゾーンの数(k+1)よりも少ないものとする。このため、バッファ#0~#3の各々は、幾つかのゾーンによって共有されることになる。
【0091】
バッファ#0~#3の各々を幾つかのゾーンによって共有することを可能にするための方法としては、細かい単位で各ゾーンのデータをNAND型フラッシュメモリに書き込む第1の方法と、所定量のデータがバッファに蓄積されるまで待ち、所定量のデータの単位で各ゾーンのデータをNAND型フラッシュメモリに書き込む第2の方法とがある。
【0092】
第1の方法では、例えば、ゾーン0~3のデータがバッファ#0~#3にそれぞれ格納されている状態で、ゾーン0~3以外のゾーン(例えばゾーン#k)を指定するゾーンアペンドコマンドがホスト2から受信された場合、バッファ#0~#3のいずれか一つに格納されているデータに対するフラッシュ処理を実行することが必要とされる。
【0093】
例えば、ゾーン#kのデータがバッファ#0に格納されるべき場合には、出力制御部は、バッファ#0に既に格納されているゾーン0のデータに対するフラッシュ処理を実行する。この場合、たとえバッファ#0に既に格納されているゾーン0のデータのサイズが比較的小さい場合であっても、このゾーン0のデータは、バッファ#0から読み出される。そして、読み出されたゾーン0のデータは、ゾーン0に割り当てられたNAND型フラッシュメモリ5内のブロックに書き込まれる。
【0094】
第1の方法では、一つのバッファに、異なるゾーンのデータが混在することを防ぐことができる。しかし、第1の方法では、細かい単位で各ゾーンのデータがNAND型フラッシュメモリのブロックに書き込まれる。このため、あるブロックへの書き込みが開始されてからこのブロック全体がデータで満たされるまでに、比較的多くの時間が要される可能性がある。あるブロックが部分的に書き込まれた状態に長い間維持されると、このブロックに書き込まれたデータの信頼性が低下する場合がある。また、部分的に書き込まれた状態のブロックの数が増えると、新たな書き込み先ブロックとして利用可能なブロックが枯渇する恐れも生じる。
【0095】
第2の方法では、各バッファに所定量のデータを蓄えた後にNAND型フラッシュメモリへの書き込みを行う。そのため、一つのバッファに、異なるゾーンのデータが混在することになる。この場合、異なるゾーンのデータの混在は、同じゾーンのデータが一つのバッファ内の異なる様々な位置に分散されてしまうという断片化を引き起こす可能性がある。このような断片化が生じると、第1の方法と同様に、出力制御部は、細かい単位で各ゾーンのデータをNAND型フラッシュメモリに書き込むことが必要となる。
【0096】
次に、実施形態に係るバッファリング処理について説明する。図6は、実施形態に係るSSD3において実行されるバッファリング処理を示す図である。
【0097】
図6では、SSD3によって管理されるゾーンは、ゾーン0からゾーン7までの8個のゾーンである。SSD3に用意されるバッファは、バッファ#0からバッファ#3までの4個のバッファである。ここで示したゾーンの数およびバッファの数は例示であり、ゾーンの数およびバッファの数は、ここで示した数よりも大きい数であってもよいし、小さい数であってもよい。ただし、バッファの数はゾーンの数よりも少ない。
【0098】
バッファ#0は、先入れ先出し(FIFO)バッファ201と、フラッシュ(flush)制御部202と、割り当て管理テーブル203とを含む。同様に、バッファ#1はFIFOバッファ211と、フラッシュ制御部212と、割り当て管理テーブル213とを含む。バッファ#2はFIFOバッファ221と、フラッシュ制御部222と、割り当て管理テーブル223とを含む。バッファ#3はFIFOバッファ231と、フラッシュ制御部232と、割り当て管理テーブル233とを含む。
【0099】
FIFOバッファ201~231の各々は、ゾーン0~7のうちの任意の一つ以上のゾーンに書き込まれるべきデータを一時的に格納するために使用される。FIFOバッファ201~231の各々は、追い越し制御機能付きのFIFOバッファとして実現され得る。
【0100】
フラッシュ制御部202~232の各々は、データ/ゾーン振り分け制御部22と共同して、FIFOバッファに格納されているデータをNAND型フラッシュメモリ5に書き込むためのフラッシュ処理を実行する。本実施形態では、バッファ#0~#3のうちの任意の一つのバッファに格納されている一つのゾーンのデータの総サイズが書き込み単位以上になった場合、つまり、バッファ#0~#3にそれぞれ含まれるFIFOバッファ201~231のうちの任意の一つのFIFOバッファに格納されている一つのゾーンのデータの総サイズが書き込み単位以上になった場合、フラッシュ処理が開始される。
【0101】
フラッシュ処理は、バッファ#0~#3のうちのあるバッファがフルになった場合にも、つまりバッファ#0~#3にそれぞれ含まれるFIFOバッファ201~231のうちのあるFIFOバッファがフルになった場合にも実行される。つまり、任意の一つのFIFOバッファがフルになった場合、このFIFOバッファに格納されている全てのゾーンのデータのうちで、対応するデータの総サイズが最も大きいゾーンのデータが、NAND型フラッシュメモリ5に書き込まれる。
【0102】
フラッシュ制御部202~232の各々は、バッファ#0~#3のうちの対応するバッファがフラッシュ開始条件を満たすか否かを判定し得る。本実施形態では、バッファ#0~#3のうちのあるバッファに格納されている一つのゾーンのデータの総サイズが書き込み単位以上であるという条件が満たされた場合、このバッファはフラッシュ開始条件を満たしている判定される。また、バッファ#0~#3のうちのあるバッファ全体がデータで満たされたフル状態になった場合も、このバッファはフラッシュ開始条件を満たしている判定される。
【0103】
なお、バッファ#0~#3の各々はそのバッファ内に含まれるFIFOバッファにデータを格納するように構成されているので、バッファ#0~#3のそれぞれの状態は、バッファ#0~#3に含まれるFIFOバッファ201~231のそれぞれの状態と同じである。したがって、バッファ#0~#3の各々がフラッシュ条件を満たすか否かを判定する処理は、FIFOバッファ201~231の各々がフラッシュ条件を満たすか否かを判定することによっても実行し得る。以下では、フラッシュ制御部202~232の各々が、FIFOバッファ201~231のうちの対応するFIFOバッファがフラッシュ開始条件を満たすか否かを判定する場合を主として例示して、本実施形態のバッファリング処理を説明する。
【0104】
つまり、フラッシュ制御部202~232の各々は、対応するFIFOバッファがフラッシュ開始条件を満たすか否かを判定する。本実施形態では、あるFIFOバッファに格納されている一つのゾーンのデータの総サイズが書き込み単位以上であるという条件が満たされた場合、このFIFOバッファはフラッシュ開始条件を満たすと判定される。また、あるFIFOバッファ全体がデータで満たされたフル状態になった場合も、このFIFOバッファはフラッシュ開始条件を満たすと判定される。
【0105】
割り当て管理テーブル203~233の各々は、対応するFIFOバッファに割り当てられた一つ以上のゾーンの識別子を管理するための管理テーブルである。例えば、FIFOバッファ201が、ゾーン0のデータが格納されるべき格納先バッファとして決定されると、ゾーン0がFIFOバッファ201に割り当てられる。そして、ゾーン0を示す識別子が、FIFOバッファ201に対応する割り当て管理テーブル203に格納される。
【0106】
初期状態においては、バッファ#0~#3の各々は、フリーのバッファである。つまり、バッファ#0~#3に含まれるFIFOバッファ201~231の各々は、フリーのFIFOバッファである。フリーのFIFOバッファは、どのゾーンも割り当てられていないFIFOバッファである。
【0107】
FIFOバッファ201~231の各々がフリーである状態、つまりバッファ#0~#3の各々がフリーである状態で、コントローラ4がある特定のゾーンを指定するゾーンアペンドコマンドをホスト2から受信した場合、データ/バッファ振り分け制御部21は、ある一つのフリーのバッファ、例えば、バッファ#0を、この特定のゾーンのデータが格納されるべき格納先バッファとして決定する。データ/バッファ振り分け制御部21は、バッファ#0に、この特定のゾーンを割り当てる。そして、データ/バッファ振り分け制御部21は、受信したゾーンアペンドコマンドに関連付けられたデータをバッファ#0のFIFOバッファ201に格納する。さらに、データ/バッファ振り分け制御部21は、バッファ#0の割り当て管理テーブル203にこの特定のゾーンを示す識別子を格納する。またさらに、データ/バッファ振り分け制御部21は、バッファ更新履歴管理テーブル32に、データの格納のために最後に更新されたバッファを示す情報(ここでは、バッファ#0を示す識別子)を格納する。
【0108】
コントローラ4が別の特定のゾーンを指定する新たなゾーンアペンドコマンドをホスト2から受信した場合、データ/バッファ振り分け制御部21は、ある一つのフリーのバッファ、例えばバッファ#1を、この別の特定のゾーンのデータが格納されるべき格納先バッファとして決定する。データ/バッファ振り分け制御部21は、バッファ#1に、この別の特定のゾーンを割り当てる。そして、データ/バッファ振り分け制御部21は、受信した新たなゾーンアペンドコマンドに関連付けられたデータをバッファ#1のFIFOバッファ211に格納する。さらに、データ/バッファ振り分け制御部21は、バッファ#1の割り当て管理テーブル213にこの別の特定のゾーンを示す識別子を格納する。またさらに、データ/バッファ振り分け制御部21は、バッファ更新履歴管理テーブル32に、データの格納のために最後に更新されたバッファを示す情報(ここでは、バッファ#1を示す識別子)を格納する。
【0109】
このようにして、4つのゾーンが4つのバッファ#0~#3、つまり4つのFIFOバッファ201~231にそれぞれ割り当てられる。
【0110】
コントローラ4がバッファ#0~#3のいずれかに既に割り当てられている特定のゾーンを指定するゾーンアペンドコマンドをホスト2から受信した場合、データ/バッファ振り分け制御部21は、受信したゾーンアペンドコマンドに関連付けられたデータを、この特定のゾーンが既に割り当てられているバッファのFIFOバッファに格納する。
【0111】
例えば、コントローラ4がバッファ#0に既に割り当てられているゾーンと同じゾーンを指定するゾーンアペンドコマンドをホスト2から受信した場合、データ/バッファ振り分け制御部21は、この受信したゾーンアペンドコマンドに関連付けられたデータをバッファ#0のFIFOバッファ201に格納する。そして、データ/バッファ振り分け制御部21は、バッファ更新履歴管理テーブル32に、データの格納のために最後に更新されたバッファを示す情報(ここでは、バッファ#0を示す識別子)を格納する。
【0112】
コントローラ4が、4つのバッファ#0~3に既に割り当てられている4つのゾーンとは異なる新たなゾーンを指定するゾーンアペンドコマンドをホスト2から受信した場合、データ/バッファ振り分け制御部21は、バッファ更新履歴テーブル32を参照することによって、データの格納のための最後の更新が最も古いバッファを決定する。データ/バッファ振り分け制御部21は、この決定されたバッファに、この新たなゾーンを追加的に割り当てる。
【0113】
例えば、データ格納のための最後の更新が最も古いバッファがバッファ#0である場合、データ/バッファ振り分け制御部21は、バッファ#0に、この新たなゾーンを追加的に割り当てる。そして、データ/バッファ振り分け制御部21は、受信したゾーンアペンドコマンドに関連付けられたデータをバッファ#0のFIFOバッファ201に格納する。さらに、データ/バッファ振り分け制御部21は、バッファ#0の割り当て管理テーブル203にこの新たなゾーンを示す識別子を格納する。またさらに、データ/バッファ振り分け制御部21は、バッファ更新履歴管理テーブル32に、データの格納のために最後に更新されたバッファを示す情報(ここでは、バッファ#0を示す識別子)を格納する。
【0114】
このように、データの格納のための最後の更新が最も古いバッファに新たなゾーンを追加的に割り当てることにより、データの格納のために使用されるバッファが特定のバッファに偏るのを防ぐことができ、この結果、ゾーン0~7に書き込むべきデータをバッファ#0~#3に分散させることが可能となる。
【0115】
FIFOバッファ201~231のいずれか一つがフラッシュ開始条件を満たした場合、データ/ゾーン振り分け制御部22は、このFIFOバッファに格納されているフラッシュ対象ゾーン以外のゾーンのデータをこのFIFOバッファに維持した状態で、このFIFOバッファに格納されているデータから、フラッシュ対象ゾーンのデータのみを抽出する。フラッシュ対象ゾーンのデータは、フラッシュ対象ゾーンを指定する一つ以上のゾーンアペンドコマンドに関連付けられたライトデータである。そして、データ/ゾーン振り分け制御部22は、抽出されたデータを、つまりフラッシュ対象ゾーンを指定する幾つかのゾーンアペンドコマンドに関連付けられたライトデータを、フラッシュ対象ゾーンの次の書き込み可能LBAから始まる論理ブロック範囲に書き込む。これにより、フラッシュ対象ゾーンに対するシーケンシャルライトが実行される。
【0116】
上述したように、ゾーン0~7の各々には、NAND型フラッシュメモリ5内の物理記憶領域の一つが割り当てられている。したがって、フラッシュ対象ゾーンに対する書き込み動作では、データ/ゾーン振り分け制御部22は、まず、フラッシュ対象ゾーンに割り当てられている物理記憶領域と、この物理記憶領域内の書き込み先位置とを決定する。そして、データ/ゾーン振り分け制御部22は、これらゾーンアペンドコマンドに関連付けられたデータが、これらゾーンアペンドコマンドが発行された順序と同じ順序でこの物理記憶領域上に配置されるように、このライトデータを、この物理記憶領域内の書き込み先位置から始まる連続する物理記憶位置に書き込む。
【0117】
次に、図7A図7Dを参照して、実施形態に係るバッファリング処理の例を説明する。以下では、図6と同様に、SSD3によって管理されるゾーンがゾーン0からゾーン7までの8個のゾーンであり、SSD3に用意されているバッファがバッファ#0からバッファ#3までの4個のバッファである場合を例示して、実施形態に係るバッファリング処理について説明する。
【0118】
図7Aは、SSD3において実行されるバッファリング処理の一つ目の処理を示す図である。
【0119】
ここでは、コントローラ4が、ゾーン1を指定する二つのゾーンアペンドコマンドと、ゾーン0を指定する三つのゾーンアペンドコマンドと、ゾーン3を指定する一つのゾーンアペンドコマンドと、ゾーン4を指定する一つのゾーンアペンドコマンドとを、この順で、ホスト2から受信した場合を想定する。
【0120】
データ/バッファ振り分け制御部21は、これら受信したゾーンアペンドコマンドによって指定された最初の四つのゾーン、つまりゾーン1、ゾーン0、ゾーン3、およびゾーン4を、バッファ#0、バッファ#1、バッファ#2、およびバッファ#3にそれぞれ割り当てる。
【0121】
より詳しくは、コントローラ4は、まず、ゾーン1を指定する一つ目のゾーンアペンドコマンドをホスト2から受信する。ゾーン1が既に割り当てられているバッファは存在しない。このため、データ/バッファ振り分け制御部21は、いずれのゾーンも割り当てられていないバッファ#0にゾーン1を割り当てる。データ/バッファ振り分け制御部21は、バッファ#0の割り当て管理テーブル203に、ゾーン1を示す識別子を追加する。そして、データ/バッファ振り分け制御部21は、ゾーン1を指定する一つ目のゾーンアペンドコマンドに関連付けられたデータである「zone1―D1」をホスト2のメモリ102から取得し、取得したデータ「zone1―D1」をFIFOバッファ201に格納する。その後、データ/バッファ振り分け制御部21は、バッファ更新履歴テーブル32に、データの格納のために最後に更新されたバッファを示す情報(ここでは、バッファ#0を示す識別子)を追加する。
【0122】
コントローラ4は、ゾーン1を指定する二つ目のゾーンアペンドコマンドをホスト2から受信する。バッファ#0に既にゾーン1が割り当てられているため、データ/バッファ振り分け制御部21は、バッファ#0を、ゾーン1を指定する二つ目のゾーンアペンドコマンドに関連付けられたデータ用の格納先バッファとして決定する。データ/バッファ振り分け制御部21は、ゾーン1を指定する二つ目のゾーンアペンドコマンドに関連付けられたデータである「zone1―D2」をホスト2のメモリ102から取得し、取得したデータ「zone1―D2」をFIFOバッファ201に格納する。このとき、バッファ更新履歴テーブル32に最後に追加されたバッファの識別子は、バッファ#0の識別子である。このため、ここでは、データ「zone1―D2」が格納されたバッファ#0の識別子をバッファ更新履歴テーブル32に追加する処理は省略し得る。
【0123】
なお、データの格納のために最後に更新されたバッファの識別子が、バッファ更新履歴テーブル32に最後に追加されたバッファの識別子と同じ場合であっても、データの格納のために最後に更新されたバッファの識別子をバッファ更新履歴テーブル32に追加してもよい。以下では、これに限定されないが、データの格納のために最後に更新されたバッファの識別子が、バッファ更新履歴テーブル32に最後に追加されたバッファの識別子と異なる場合にのみ、データの格納のために最後に更新されたバッファの識別子をバッファ更新履歴テーブル32に追加する場合を想定する。
【0124】
コントローラ4は、ゾーン0を指定する一つ目のゾーンアペンドコマンドをホスト2から受信する。ゾーン0が既に割り当てられているバッファは存在しないため、データ/バッファ振り分け制御部21は、いずれのゾーンも割り当てられていないバッファ#1にゾーン0を割り当てる。データ/バッファ振り分け制御部21は、バッファ#1の割り当て管理テーブル213に、ゾーン0を示す識別子を追加する。そして、データ/バッファ振り分け制御部21は、ゾーン0を指定する一つ目のゾーンアペンドコマンドに関連付けられたデータである「zone0―D1」をホスト2のメモリ102から取得し、取得したデータ「zone0―D1」をFIFOバッファ211に格納する。その後、データ/バッファ振り分け制御部21は、バッファ更新履歴テーブル32に、データの格納のために最後に更新されたバッファを示す情報(ここでは、バッファ#1を示す識別子)を追加する。
【0125】
コントローラ4は、ゾーン0を指定する二つ目のゾーンアペンドコマンドをホスト2から受信する。バッファ#1に既にゾーン0が割り当てられているため、データ/バッファ振り分け制御部21は、バッファ#1を、ゾーン0を指定する二つ目のゾーンアペンドコマンドに関連付けられたデータ用の格納先バッファとして決定する。データ/バッファ振り分け制御部21は、ゾーン0を指定する二つ目のゾーンアペンドコマンドに関連付けられたデータである「zone0―D2」をホスト2のメモリ102から取得し、取得したデータ「zone0―D2」をFIFOバッファ211に格納する。
【0126】
コントローラ4は、ゾーン0を指定する三つ目のゾーンアペンドコマンドをホスト2から受信する。バッファ#1に既にゾーン0が割り当てられているため、データ/バッファ振り分け制御部21は、バッファ#1を、ゾーン0を指定する三つ目のゾーンアペンドコマンドに関連付けられたデータ用の格納先バッファとして決定する。データ/バッファ振り分け制御部21は、ゾーン0を指定する三つ目のゾーンアペンドコマンドに関連付けられたデータである「zone0―D3」をホスト2のメモリ102から取得し、取得したデータ「zone0―D3」をFIFOバッファ211に格納する。
【0127】
コントローラ4は、ゾーン3を指定する一つ目のゾーンアペンドコマンドをホスト2から受信する。ゾーン3が既に割り当てられているバッファは存在しないため、データ/バッファ振り分け制御部21は、いずれのゾーンも割り当てられていないバッファ#2にゾーン3を割り当てる。データ/バッファ振り分け制御部21は、バッファ#2の割り当て管理テーブル223に、ゾーン3を示す識別子を追加する。そして、データ/バッファ振り分け制御部21は、ゾーン3を指定する一つ目のゾーンアペンドコマンドに関連付けられたデータである「zone3―D1」をホスト2のメモリ102から取得し、取得したデータ「zone3―D1」をFIFOバッファ221に格納する。その後、データ/バッファ振り分け制御部21は、バッファ更新履歴テーブル32に、データの格納のために最後に更新されたバッファを示す情報(ここでは、バッファ#2を示す識別子)を追加する。
【0128】
コントローラ4は、ゾーン4を指定する一つ目のゾーンアペンドコマンドをホスト2から受信する。ゾーン4が既に割り当てられているバッファは存在しないため、データ/バッファ振り分け制御部21は、いずれのゾーンも割り当てられていないバッファ#3にゾーン4を割り当てる。データ/バッファ振り分け制御部21は、バッファ#3の割り当て管理テーブル233に、ゾーン4を示す識別子を追加する。そして、データ/バッファ振り分け制御部21は、ゾーン4を指定する一つ目のゾーンアペンドコマンドに関連付けられたデータである「zone4―D1」をホスト2のメモリ102から取得し、取得したデータ「zone4―D1」をFIFOバッファ231に格納する。その後、データ/バッファ振り分け制御部21は、バッファ更新履歴テーブル32に、データの格納のために最後に更新されたバッファを示す情報(ここでは、バッファ#3を示す識別子)を追加する。
【0129】
図7Bは、実施形態に係るバッファリング処理の二つ目の処理を示す図である。
【0130】
ここでは、図7Aで説明した七つのゾーンアペンドコマンドを受信した後に、コントローラ4が、ゾーン1を指定する一つのゾーンアペンドコマンドと、ゾーン3を指定する一つのゾーンアペンドコマンドと、ゾーン4を指定する一つのゾーンアペンドコマンドと、ゾーン3を指定する一つのゾーンアペンドコマンドとを、この順で、ホスト2から受信した場合を想定する。
【0131】
ゾーン1、ゾーン3、およびゾーン4は、バッファ#0、バッファ#2、およびバッファ#3に既にそれぞれ割り当てられている。したがって、データ/バッファ振り分け制御部21は、図7Aで説明した手順と同様の手順を実行することによって、ゾーン1を指定するゾーンアペンドコマンドに関連付けられたデータ「zone1―D3」、ゾーン3を指定するゾーンアペンドコマンドに関連付けられたデータ「zone3―D2」、ゾーン4を指定するゾーンアペンドコマンドに関連付けられたデータ「zone4―D2」、およびゾーン3を指定するゾーンアペンドコマンドに関連付けられたデータ「zone3―D3」を、バッファ#0のFIFOバッファ201、バッファ#2のFIFOバッファ221、バッファ#3のFIFOバッファ231、およびバッファ#2のFIFOバッファ221にそれぞれ格納する。そして、データ/バッファ振り分け制御部21は、バッファ#0の識別子、バッファ#2の識別子、バッファ#3の識別子、およびバッファ#2の識別子を、この順で、バッファ更新履歴テーブル32に追加する。
【0132】
次いで、コントローラ4が、ゾーン2を指定する一つ目のゾーンアペンドコマンドをホスト2から受信した場合を想定する。
【0133】
ゾーン2が既に割り当てられているバッファは存在せず、且つフリーのバッファも存在しない。このため、データ/バッファ振り分け制御部21は、バッファ更新履歴テーブル32を参照することによって、データ格納のための最後の更新が最も古いバッファを決定する。バッファ更新履歴テーブル32には、「最後の更新が最も古いバッファがバッファ#1であり、最後の更新が次に古いバッファがバッファ#0であり、さらに最後の更新が次に古いバッファがバッファ#3であり、最後の更新が最も新しいバッファがバッファ#2である」ことを示す情報が履歴情報として格納されている。
【0134】
したがって、データ/バッファ振り分け制御部21は、データ格納のための最後の更新が最も古いバッファであるバッファ#1に、ゾーン2を追加的に割り当てる。この場合、データ/バッファ振り分け制御部21は、バッファ#1の割り当て管理テーブル213に、ゾーン2を示す識別子を追加する。そして、データ/バッファ振り分け制御部21は、ゾーン2を指定する一つ目のゾーンアペンドコマンドに関連付けられたデータである「zone2―D1」をFIFOバッファ211に格納する。その後、データ/バッファ振り分け制御部21は、バッファ更新履歴テーブル32に、データの格納のために最後に更新されたバッファを示す情報(ここでは、バッファ#1を示す識別子)を追加する。
【0135】
次いで、コントローラ4が、ゾーン2を指定する二つ目のゾーンアペンドコマンドをホスト2から受信した場合を想定する。
【0136】
バッファ#1に既にゾーン2が割り当てられている。このため、データ/バッファ振り分け制御部21は、バッファ#1を、ゾーン2を指定する二つ目のゾーンアペンドコマンドに関連付けられたデータの格納先バッファとして決定する。データ/バッファ振り分け制御部21は、ゾーン2を指定する二つ目のゾーンアペンドコマンドに関連付けられたデータである「zone2―D2」をホスト2のメモリ102から取得し、取得したデータ「zone2―D2」をFIFOバッファ211に格納する。
【0137】
図7Cは、実施形態に係るバッファリング処理の三つ目の処理を示す図である。
【0138】
ここでは、図7Aで説明した七つのゾーンアペンドコマンドおよび図7Bで説明した六つのゾーンアペンドコマンドの受信の後に、コントローラ4が、まず、ゾーン1を指定する二つのゾーンアペンドコマンドと、ゾーン4を指定する二つのゾーンアペンドコマンドと、ゾーン2を指定する一つのゾーンアペンドコマンドとを、この順で、ホスト2から受信した場合を想定する。
【0139】
ゾーン1、ゾーン4、およびゾーン2は、バッファ#0、バッファ#3、およびバッファ#1に既にそれぞれ割り当てられている。したがって、データ/バッファ振り分け制御部21は、ゾーン1を指定する二つのゾーンアペンドコマンドにそれぞれ関連付けられたデータ「zone1―D4」およびデータ「zone1―D5」をバッファ#0のFIFOバッファ201に格納し、ゾーン4を指定する二つのゾーンアペンドコマンドにそれぞれ関連付けられたデータ「zone4―D3」およびデータ「zone4―D4」をバッファ#3のFIFOバッファ231に格納し、ゾーン2を指定する一つのゾーンアペンドコマンドに関連付けられたデータ「zone2―D3」をバッファ#1のFIFOバッファ211に格納する。そして、データ/バッファ振り分け制御部21は、バッファ#0の識別子、バッファ#3の識別子、およびバッファ#1の識別子を、この順で、バッファ更新履歴テーブル32に追加する。
【0140】
次いで、コントローラ4が、ゾーン5を指定する一つ目のゾーンアペンドコマンドをホスト2から受信した場合を想定する。
【0141】
ゾーン5が既に割り当てられているバッファは存在せず、且つフリーのバッファも存在しない。このため、データ/バッファ振り分け制御部21は、バッファ更新履歴テーブル32を参照することによって、データ格納のための最後の更新が最も古いバッファを決定する。データ格納のための最後の更新が最も古いバッファは、バッファ#2である。
【0142】
したがって、データ/バッファ振り分け制御部21は、データ格納のための最後の更新が最も古いバッファであるバッファ#2に、ゾーン5を追加的に割り当てる。この場合、データ/バッファ振り分け制御部21は、バッファ#2の割り当て管理テーブル223に、ゾーン5を示す識別子を追加する。そして、データ/バッファ振り分け制御部21は、ゾーン5を指定する一つ目のゾーンアペンドコマンドに関連付けられたデータである「zone5―D1」をFIFOバッファ221に格納する。その後、データ/バッファ振り分け制御部21は、バッファ更新履歴テーブル32に、データの格納のために最後に更新されたバッファを示す情報(ここでは、バッファ#2を示す識別子)を追加する。
【0143】
次いで、コントローラ4は、ゾーン5を指定する二つ目のゾーンアペンドコマンドと、ゾーン5を指定する三つ目のゾーンアペンドコマンドとをホスト2から受信する。
【0144】
バッファ#2に既にゾーン5が割り当てられている。このため、データ/バッファ振り分け制御部21は、ゾーン5を指定する二つ目のゾーンアペンドコマンドに関連付けられたデータである「zone5―D2」と、ゾーン5を指定する三つ目のゾーンアペンドコマンドに関連付けられたデータである「zone5―D3」を、FIFOバッファ221に格納する。
【0145】
次いで、コントローラ4が、ゾーン0を指定する二つのゾーンアペンドコマンドをホスト2から受信した場合を想定する。
【0146】
ゾーン0は、バッファ#1に既に割り当てられている。したがって、データ/バッファ振り分け制御部21は、ゾーン0を指定する2つのゾーンアペンドコマンドにそれぞれ関連付けられたデータ「zone0―D4」および「zone0―D5」をFIFOバッファ211に格納する。その後、データ/バッファ振り分け制御部21は、バッファ更新履歴テーブル32に、データの格納のために最後に更新されたバッファを示す情報(ここでは、バッファ#1を示す識別子)を追加する。
【0147】
このデータ「zone0―D5」がバッファ#1のFIFOバッファ221に格納されたことで、FIFOバッファ221は、これ以上データを格納することができないフル状態になる。FIFOバッファ221がフル状態になったため、FIFOバッファ221はフラッシュ開始条件を満たす。
【0148】
図7Dは、実施形態に係るバッファリング処理の四つ目の処理を示す図である。
【0149】
データ/ゾーン振り分け制御部22は、バッファ#1からフラッシュ対象ゾーンを選択し、バッファ#1に格納されている全てのデータの中から、フラッシュ対象ゾーンに関連付けられたデータのみを抽出する。
【0150】
バッファ#1(つまり、FIFOバッファ221)には、ゾーン0に関連付けられたデータ「zone0-D1」~「zone0-D5」と、ゾーン2に関連付けられたデータ「zone2-D1」~「zone2-D3」とが格納されている。バッファ#1において、ゾーン0が、関連付けられたデータの総サイズが最も大きいゾーンである。よって、データ/ゾーン振り分け制御部22は、ゾーン0をフラッシュ対象ゾーンとして決定する。
【0151】
データ/ゾーン振り分け制御部22は、バッファ#1の中からゾーン0に関連付けられたデータのみを抽出する。このとき、データ/ゾーン振り分け制御部22は、フラッシュ対象ゾーン以外のゾーンに関連付けられたデータがバッファ#1に維持されるように制御する。つまり、データ/ゾーン振り分け制御部22は、バッファ#1にデータ「zone2―D1」~「zone2―D3」を維持したまま、バッファ#1からデータ「zone0―D1」~「zone0―D5」を抽出する。そして、データ/ゾーン振り分け制御部22は、書き込み先のゾーンを決定し、決定した書き込み先のゾーン(ここでは、ゾーン0)にデータ「zone0―D1」~「zone0―D5」をシーケンシャルに書き込む。バッファ#1からゾーン0のデータがなくなると、データ/ゾーン振り分け制御部22は、割り当て管理テーブル213からゾーン0の識別子を削除する。これにより、バッファ#1に対するゾーン0の割り当ては解消される。
【0152】
したがって、バッファ#1からゾーン0のデータがなくなった後に、ゾーン0を指定するゾーンアペンドコマンドが受信された場合には、ゾーン0が既に割り当てられているバッファは存在しない。したがって、データ/バッファ振り分け制御部21は、バッファ更新履歴テーブル32を参照することによって、データの格納のための最後の更新が最も古いバッファを決定し、この決定されたバッファに、この受信されたゾーンアペンドコマンドに関連付けられたデータを格納する。
【0153】
次に、図8A図8Eを参照して、バッファ#1からゾーン0に関連付けられたデータを抽出するための追い越し処理の例を説明する。
【0154】
図8Aは、SSD3において実行される追い越し処理の一つ目の処理を示す図である。
【0155】
バッファ#1のFIFOバッファ211は、入力ポート211Aと、出力ポート211Bと、ループバックパス211Cと、入力セレクタ211Dと、出力セレクタ211Eとを含む。ループバックパス211Cは、FIFOバッファ211の出力ポート211BとFIFOバッファ211の入力ポート211Aとを接続するパスである。入力セレクタ211Dおよび出力セレクタ211Eは、ループバックパス211Cを有効または無効にするためのスイッチ回路である。
【0156】
FIFOバッファ211の入力ポート211Aは、入力セレクタ211Dに接続されている。FIFOバッファ211の出力ポート211Bは、出力セレクタ211Eに接続されている。入力セレクタ211Dは、外部入力またはループバックパス211Cのいずれか一方を選択し、選択した外部入力またはループバックパス211Cのいずれか一方を入力ポート211Aに接続する。出力セレクタ211Eは、ループバックパス211Cまたは外部出力のいずれか一方を選択し、出力ポート211Bを、選択したループバックパス211Cまたは外部出力のいずれか一方に接続する。外部出力は、図1のNANDインタフェース13を介してNAND型フラッシュメモリ5に接続される。
【0157】
データ/ゾーン振り分け制御部22は、FIFOバッファ211から読み出し可能な次のデータ、つまりFIFOバッファ211内の最も古いデータ、がフラッシュ対象ゾーン以外のゾーンのデータである場合、入力セレクタ211Dと出力セレクタ211Eとを制御することでループバックパス211Cを有効にし、出力ポート211Bを入力ポート211Aに接続する。また、FIFOバッファ211から読み出し可能な次のデータがフラッシュ対象ゾーンのデータである場合、データ/ゾーン振り分け制御部22は、出力セレクタ211Eを制御することでループバックパス211Cを無効にし、出力ポート211Bを外部出力に接続する。この場合、データ/ゾーン振り分け制御部22は、入力セレクタ211Dを制御することで、入力ポート211Aをループバックパス211Cに接続してもよい。
【0158】
フラッシュ処理を開始する際、図8Aに示すように、データ/ゾーン振り分け制御部22は、まず、FIFOバッファ211に新たなデータが格納されることを防ぐため、入力セレクタ211Dを制御して入力ポート211Aと外部入力との接続を解除し、入力ポート211Aをループバック側、つまりループバックパス211C、に接続する。
【0159】
図8Bは、実施形態に係る追い越し処理の二つ目の処理を示す図である。
【0160】
データ/ゾーン振り分け制御部22は、FIFOバッファ211から読み出し可能な次のデータがフラッシュ対象ゾーンのデータであるか否かを判定する。データ「zone0―D1」~「zone0―D3」の読み出しが完了されるまでは、読み出し可能な次のデータは、フラッシュ対象ゾーンであるゾーン0に関連付けられたデータである。そのため、データ/ゾーン振り分け制御部22は、出力セレクタ211Eを制御することによって出力ポート211Bを外部出力に接続して、ループバックパス211Cを無効にする。その後、データ/ゾーン振り分け制御部22は、FIFOバッファ211からデータ「zone0―D1」、データ「zone0―D2」、およびデータ「zone0―D3」を読み出す。
【0161】
図8Cは、実施形態に係る追い越し処理の三つ目の処理を示す図である。
【0162】
データ「zone0―D1」~「zone0―D3」が読み出された後は、データ「zone2―D1」~「zone2―D3」がFIFOバッファ211から読み出されるまでは、FIFOバッファ211から読み出し可能な次のデータは、フラッシュ対象ゾーンのデータではない。そのため、データ/ゾーン振り分け制御部22は、出力セレクタ211Eを制御することによって出力ポート211Bをループバックパス211Cに接続して、ループバックパス211Cを有効にする。
【0163】
ループバックパス211Cを有効にした状態で、データ/ゾーン振り分け制御部22は、FIFOバッファ211からデータを読み出す読み出し動作と、FIFOバッファ211にデータを書き込む書き込み動作とを実行する。これにより、FIFOバッファ211の出力ポート211Bからデータ「zone2―D1」~「zone2―D3」を読み出す動作と、読み出されたデータ「zone2―D1」~「zone2―D3」をループバックパス211Cおよび入力ポート211Aを介してFIFOバッファ211に書き戻す動作とが並列に実行される。この結果、データ「zone2―D1」~「zone2―D3」は、FIFOバッファ211に維持される。
【0164】
図8Dは、実施形態に係る追い越し処理の四つ目の処理を示す図である。
【0165】
データ「zone2―D1」~「zone2―D3」が読み出された後は、FIFOバッファ211から読み出し可能な次のデータは、フラッシュ対象ゾーンのデータである。
【0166】
データ/ゾーン振り分け制御部22は、FIFOバッファ211から読み出し可能な次のデータがフラッシュ対象ゾーンのデータであるため、出力セレクタ211Eを制御してループバックパス211Cを無効にし、出力ポート211Bを外部出力に接続する。その後、データ/ゾーン振り分け制御部22は、FIFOバッファ211を制御して、出力ポート211Bからデータ「zone0―D4」、およびデータ「zone0―D5」を読み出す。
【0167】
図8Eは、実施形態に係る追い越し処理の五つ目の処理を示す図である。
【0168】
データ/ゾーン振り分け制御部22は、FIFOバッファ211の中にフラッシュ対象ゾーンのデータが残っていないことを確認する。FIFOバッファ211にフラッシュ対象ゾーンのデータが残っていないことがわかると、データ/ゾーン振り分け制御部22は、入力セレクタ211Dを制御して、入力ポート211Aを外部入力に接続する。これにより、FIFOバッファ211は、外部入力から新たなデータを受け付けることができる状態になる。
【0169】
ここで説明した追い越し処理によって、データ/ゾーン振り分け制御部22は、バッファ#1からフラッシュ対象ゾーンのデータのみを抽出する。そして、フラッシュ対象ゾーン以外のゾーンに関連付けられたデータはバッファ#1に格納されたままの状態が維持される。
【0170】
ここでは、あるバッファがフルになった場合に実行される追い越し処理について説明したが、あるバッファに格納されている特定のゾーンのデータの総サイズが書き込み単位以上になった場合も、同様の手順で、特定のゾーンのデータのみを抽出する追い越し処理が実行される。
【0171】
図9は、実施形態に係るSSD3において実行されるコマンド処理の手順を示すフローチャートである。
【0172】
このコマンド処理は、ゾーンド・ネームスペースの複数のゾーンのうちの任意のゾーンにデータをシーケンシャルに書き込むためのコマンドを実行するための処理である。このコマンドは、ゾーンアペンドコマンドであってもよいし、アドレス・スペシフィック・ライトコマンドとして使用されるライトコマンドであってもよい。以下では、ゾーンアペンドコマンドに対する処理を例示して、コマンド処理の手順を説明する。
【0173】
まず、コントローラ4は、ゾーンアペンドコマンドをホスト2から受信する(ステップS11)。コントローラ4は、データ/バッファ振り分け制御部21によって、受信したゾーンアペンドコマンドに関連付けられているデータが格納されるべき格納先バッファを決定し、決定した格納先バッファにデータを格納する(ステップS12)。ここでの、データ/バッファ振り分け制御部21によるデータ/バッファ振り分け処理の詳細な手順については、図10で説明を行う。
【0174】
コントローラ4は、バッファ更新履歴テーブル32を更新する(ステップS13)。ステップS13では、コントローラ4は、ステップS12で決定された格納先バッファの識別子を、データの格納のために最後に更新されたバッファを示す情報として、バッファ更新履歴テーブル32に追加する。なお、このとき、バッファ更新履歴テーブル32に追加されるべき識別子がバッファ更新履歴テーブルに最後に追加されたバッファの識別子と同じである場合、バッファの識別子をバッファ更新履歴テーブル32に追加する処理は、省略されてもよい。
【0175】
コントローラ4は、あるバッファがフルであるか、または、あるバッファにおいてあるゾーンのデータの総サイズが書き込み単位以上になったかどうかを判定する(ステップS14)。つまり、コントローラ4は、フラッシュ開始条件を満たしているバッファが存在するか否かを判定する。
【0176】
フル状態であるバッファが存在せず、且つ、あるゾーンのデータの総サイズが書き込み単位以上になったバッファも存在しない場合(ステップS14でNo)、コントローラ4は、次のゾーンアペンドコマンドをホスト2から受信するまで待機する。
【0177】
フル状態であるバッファが存在する、または、あるゾーンのデータの総サイズが書き込み単位以上になったバッファが存在する場合(ステップS14でYes)、コントローラ4は、追い越し処理によって、そのバッファに格納されている全てのデータから、フラッシュ対象ゾーンのデータのみを抽出する(ステップS15)。そのバッファがフルである場合には、関連付けられているデータの総サイズが最も大きいゾーンがフラッシュ対象ゾーンとして決定される。あるゾーンに関連付けられたデータの総サイズが書き込み単位以上になったバッファが存在する場合には、関連付けられたデータの総サイズが書き込み単位以上になったこのゾーンがフラッシュ対象ゾーンとして決定される。追い越し処理の詳細な手順については、図11で説明する。
【0178】
コントローラ4は、データ/ゾーン振り分け制御部22によって、ステップS15で抽出されたデータの書き込み先の物理記憶領域を決定する(ステップS16)。書き込み先の物理記憶領域は、決定されたフラッシュ対象ゾーンに割り当てられているNAND型フラッシュメモリ5内の特定の記憶領域である。
【0179】
その後、コントローラ4は、バッファから抽出したフラッシュ対象ゾーンのデータを、書き込み先の物理記憶領域に、つまりフラッシュ対象ゾーンに割り当てられたNAND型フラッシュメモリ5内の特定の記憶領域(物理記憶領域)に書き込む(ステップS17)。
【0180】
フラッシュ対象ゾーンのデータがNAND型フラッシュメモリ5内の特定の記憶領域に書き込まれると、書き込まれたデータに対応する一つ以上のゾーンアペンドコマンドの処理が完了する。ステップS17では、コントローラ4は、完了した各ゾーンアペンドコマンドに対応するコマンド完了をホスト2に送信し得る。なお、コントローラ4は、必ずしも、ステップS17においてデータがNAND型フラッシュメモリ5に書き込まれるまで、コマンド完了の送信を待つ必要はない。データがNAND型フラッシュメモリ5に書き込まれるまでコマンド完了の送信を待つことが必要とされるのは、受信したゾーンアペンドコマンドに含まれるForce Unit Access(FUA)が1にセットされている場合だけである。受信したゾーンアペンドコマンドに含まれるFUAが0である場合には、コントローラ4は、受信したゾーンアペンドコマンドに関連付けられたデータがNAND型フラッシュメモリ5に書き込まれるまで待つことなく、受信したゾーンアペンドコマンドに対応するコマンド完了をホスト2に送信し得る。例えば、コントローラ4は、受信したゾーンアペンドコマンドに関連付けられたデータがバッファに格納された時に、受信したゾーンアペンドコマンドに対応するコマンド完了をホスト2に送信し得る。
各コマンド完了は、そのコマンド完了に対応するゾーンアペンドコマンドに関連付けられたデータが書き込まれたゾーン内の書き込み先位置(LBA)を示す情報を含む。
【0181】
図10は、実施形態に係るデータ/バッファ振り分け処理の手順を示すフローチャートである。ここで説明するデータ/バッファ振り分け処理は、図9におけるステップS12の処理の詳細である。
【0182】
図9のステップS11で説明したように、コントローラ4は、ホスト2からゾーンアペンドコマンドを受信する。
【0183】
データ/バッファ振り分け制御部21は、複数のバッファそれぞれに設けられている割り当て管理テーブルを参照することによって、ステップS11で受信したゾーンアペンドコマンドによって指定されるゾーンが既に割り当てられているバッファが存在するか否かを判定する(ステップS21)。
【0184】
受信したゾーンアペンドコマンドによって指定されるゾーンが既に割り当てられているバッファが存在しない場合(ステップS21でNo)、データ/バッファ振り分け制御部21は、複数のバッファそれぞれに設けられている割り当て管理テーブルを参照することによって、フリーのバッファが存在するか否かを判定する(ステップS22)。
【0185】
フリーのバッファが存在しない場合(ステップS22でNo)、データ/バッファ振り分け制御部21は、データの格納のための最後の更新が最も古いバッファを、格納先バッファに決定する(ステップS23)。データ/バッファ振り分け制御部21は、バッファ更新履歴テーブル32を参照してデータ格納のための最後の更新が最も古いバッファを決定する。格納先バッファは、受信したゾーンアペンドコマンドに関連付けられたデータが格納されるべきバッファである。
【0186】
データ/バッファ振り分け制御部21は、格納先バッファに、ステップS11で受信したゾーンアペンドコマンドによって指定されたゾーンを割り当てる(ステップS24)。データ/バッファ振り分け制御部21は、格納先バッファに設けられた割り当て管理テーブルに、ゾーンアペンドコマンドによって指定されたゾーンを示す識別子を追加することで、格納先バッファに追加的にゾーンを割り当てる。
【0187】
コントローラ4は、ステップS11で受信したゾーンアペンドコマンドに関連付けられたデータを、決定された格納先バッファに格納する(ステップS28)。すなわち、データ/バッファ振り分け制御部21は、ステップS11で受信したゾーンアペンドコマンドに関連付けられたデータをホスト2のメモリ102から取得し、取得したデータを決定された格納先バッファに格納する。この後、処理は図9で説明したステップS13に進む。ステップS13では、コントローラ4は、バッファ更新履歴テーブル32を更新する。
【0188】
一つ以上のフリーのバッファが存在する場合(ステップS22でYes)、データ/バッファ振り分け制御部21は、フリーのバッファの中から任意のバッファを選択し、格納先バッファに決定する(ステップS25)。
【0189】
データ/バッファ振り分け制御部21は、格納先バッファに、ステップS11で受信したゾーンアペンドコマンドによって指定されたゾーンを割り当てる(ステップS26)。
【0190】
その後、処理はステップS28に移行し、コントローラ4は、ステップS11で受信したゾーンアペンドコマンドに関連付けられたデータを、決定された格納先バッファに格納する。
【0191】
ステップS11で受信したゾーンアペンドコマンドによって指定されるゾーンが既に割り当てられているバッファが存在する場合(ステップS21でYes)、データ/バッファ振り分け制御部21は、そのバッファを格納先バッファに決定する(ステップS27)。
【0192】
その後、処理はステップS28に移行し、コントローラ4は、ステップS11で受信したゾーンアペンドコマンドに関連付けられたデータを、決定された格納先バッファに格納する。
【0193】
図11は、実施形態に係る追い越し処理の手順を示すフローチャートである。ここでは、図9におけるステップS15の処理の詳細について説明する。
【0194】
あるバッファ(FIFOバッファ)がフラッシュ開始条件を満たした場合、データ/ゾーン振り分け制御部22は、このFIFOバッファに割り当てられているゾーンの中から、フラッシュ対象ゾーンを決定する(ステップS31)。
【0195】
データ/ゾーン振り分け制御部22は、フラッシュ開始条件を満たすFIFOバッファから読み出されるべき次のデータ(つまりこのFIFOバッファ内の次の読み出し可能データ)に関連付けられたゾーンが、フラッシュ対象ゾーンであるか否かを判定する(ステップS32)。
【0196】
次の読み出し可能データに関連付けられたゾーンがフラッシュ対象ゾーンでない場合(ステップS32でNo)、データ/ゾーン振り分け制御部22は、そのFIFOバッファのループバックパスを有効にして、そのFIFOバッファの入力ポートと出力ポートとがループバック側に接続されるように制御する(ステップS33)。
【0197】
次の読み出し可能データに対応するゾーンがフラッシュ対象ゾーンである場合(ステップS32でYes)、データ/ゾーン振り分け制御部22は、そのFIFOバッファの入力ポートと出力ポートとがループバック側に接続されていた場合にその接続を解除するように制御する(ステップS34)。
【0198】
データ/ゾーン振り分け制御部22は、FIFOバッファから次の読み出し可能データを読み出す(ステップS35)。データ/ゾーン振り分け制御部22は、FIFOバッファに格納されているデータの中にフラッシュ対象ゾーンのデータが残っているか否かを判定する(ステップS36)。
【0199】
FIFOバッファに格納されているデータの中にフラッシュ対象ゾーンのデータが残っている場合(ステップS36でYes)、データ/ゾーン振り分け制御部22の処理は、次の読み出し可能データを読み出すために再度ステップS32に移行する。
【0200】
FIFOバッファに格納されているデータの中にフラッシュ対象ゾーンのデータが残っていない場合(ステップS36でNo)、データ/ゾーン振り分け制御部22は、このFIFOバッファの割り当て管理テーブルから、フラッシュ対象ゾーンを示す識別子を削除する(ステップS37)。これにより、このFIFOバッファに対するフラッシュ対象ゾーンの割り当ては解消される。
【0201】
以上説明したように、本実施形態によれば、コントローラ4は、受信したゾーンアペンドコマンドによって指定されるゾーンが割り当てられたバッファが存在する場合、そのバッファを、受信したゾーンアペンドコマンドに関連付けられたデータが格納されるべき格納先バッファとして決定する。また、受信したゾーンアペンドコマンドによって指定されたゾーンが割り当てられたバッファが存在せず、フリーのバッファが存在する場合は、コントローラ4は、フリーのバッファのうちの任意のバッファを格納先バッファとして決定する。また、受信したゾーンアペンドコマンドによって指定されたゾーンが割り当てられたバッファが存在せず、且つフリーのバッファが存在しない場合は、コントローラ4は、データの格納のための最後の更新が最も古いバッファを格納先バッファとして決定する。
【0202】
これらの処理によって、データが特定のバッファに偏ることなく、データの格納先を複数のバッファに分散させることができる。さらに、同じゾーンに書き込まれるべきデータを、同じバッファに格納することができる。
【0203】
また、コントローラ4は、複数のバッファのいずれか一つに格納されているデータの総サイズが書き込み単位以上になったゾーン、または対応するデータがフル状態のバッファに格納されている全てのゾーンのうちで対応するデータの総サイズが最も大きいゾーンを、フラッシュ対象ゾーンとして選択する。よって、バッファに蓄積されているデータ量が比較的多いゾーンをフラッシュ対象ゾーンとして選択することが可能となるので、細かい単位で各ゾーンのデータをNAND型フラッシュメモリ5に書き込む場合に比し、シーケンシャルライトの効率を向上することができる。
【0204】
さらに、コントローラ4は、フラッシュ対象ゾーン以外のゾーンのデータをバッファに維持した状態で、フラッシュ対象ゾーンのデータのみを抽出する。よって、たとえ同じゾーンのデータが一つのバッファ内の異なる様々な位置に分散されるという断片化が生じても、フラッシュ対象ゾーン以外のゾーンのデータに対するフラッシュ処理を行うこと無く、フラッシュ対象ゾーンのデータのみに対するフラッシュ処理を行うことができる。このため、バッファ内のデータを細かい単位でNAND型フラッシュメモリ5に書き込むことなく、そのデータ量が比較的多いフラッシュ対象ゾーンのデータのみを、NAND型フラッシュメモリ5に書き込むことができる。
【0205】
このように、本実施形態では、ゾーンド・ネームスペースに含まれるゾーンの数より少ない数のバッファを使用して、異なるゾーンに書き込むべきデータを効率よくバッファリングすることができる。さらに、本実施形態では、異なるゾーンのデータが混在しているバッファからフラッシュ対象ゾーンのデータのみをNAND型フラッシュメモリ5に書き込むことができる。よって、ゾーンの数と同数のバッファを使用する構成に比し、複数のゾーンの制御のために必要とされるSSD3内のメモリリソースの量を削減することができる。
【0206】
なお、アドレス・スペシフィック・ライトコマンドとして使用されるライトコマンドをホスト2から受信した場合には、コントローラ4は、このライトコマンドに関連付けられたデータをバッファに格納した時に、このライトコマンドのコマンド完了をホスト2に送信してもよい。
【0207】
これにより、ホスト2は、このライトコマンドによって指定されるゾーンと同じゾーンを指定する次のライトコマンドをSSD3に発行することができる。この結果、あるゾーンを指定するライトコマンドの処理が実際に完了する前に、すなわち、そのライトコマンドに関連付けられたデータのNAND型フラッシュメモリ5への書き込みが完了する前に、このゾーンと同じゾーンを指定する次のライトコマンドをホスト2から受信することが可能となる。よって、個々のライトコマンドが小さいサイズのデータの書き込みを要求する場合であっても、同じゾーンに関連付けられたデータを同じバッファに一定量蓄積した後にライト処理を開始することができ、NAND型フラッシュメモリ5への書き込み効率を改善することができる。
【0208】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0209】
1…情報処理システム、2…ホスト、3…SSD、4…コントローラ、5…NAND型フラッシュメモリ、6…DRAM、10…バス、11…ホストインタフェース、12…CPU、13…NANDインタフェース、14…DRAMインタフェース、15…DMAC、16…バッファ回路、17…ECCエンコード/デコード部、21…データ/バッファ振り分け制御部、22…データ/ゾーン振り分け制御部、31…L2Pテーブル、32…バッファ更新履歴管理テーブル。
図1
図2
図3
図4
図5
図6
図7A
図7B
図7C
図7D
図8A
図8B
図8C
図8D
図8E
図9
図10
図11