(57)【要約】      （修正有）【課題】コマンドを受信してからコマンドに従った処理を完了するまでの時間を容易に短縮できる不揮発性メモリ及びメモリシステムを提供する。【解決手段】不揮発性メモリは、メモリセルアレイと入出力バッファと１以上の中間バッファと制御回路とを有する。メモリセルアレイは、複数のページを含む。１以上の中間バッファは、それぞれがメモリセルアレイ及び入出力バッファの間に電気的に接続されている。制御回路は、第１のコマンドに応じて、複数のページにおける第１のページからセンス動作で読み出されたデータを第１の中間バッファに格納する。第１のコマンドは、センス動作指示と第１の中間バッファの指定とを含む。第１の中間バッファは、１以上の中間バッファにおける中間バッファである。【選択図】図１３
2020047335.tif 000002
【特許請求の範囲】
【請求項１】
複数のページを含むメモリセルアレイと、
入出力バッファと、
それぞれが前記メモリセルアレイ及び前記入出力バッファの間に電気的に接続された１以上の中間バッファと、
センス動作指示と前記１以上の中間バッファにおける第１の中間バッファの指定とを含む第１のコマンドに応じて、前記複数のページにおける第１のページからセンス動作で読み出されたデータを前記第１の中間バッファに格納する制御回路と、
を備えた不揮発性メモリ。
【請求項２】
前記１以上の中間バッファは、前記第１の中間バッファと異なる第２の中間バッファをさらに含み、
前記制御回路は、センス動作指示と前記第２の中間バッファの指定とを含む第２のコマンドに応じて、前記複数のページにおける第２のページからセンス動作で読み出されたデータを前記第２の中間バッファに格納する
請求項１に記載の不揮発性メモリ。
【請求項３】
前記制御回路は、センス動作指示を含み前記中間バッファの指定を含まない第３のコマンドに応じて、前記複数のページにおける第３のページからセンス動作で読み出されたデータを前記入出力バッファに格納し、出力指示を含む第４のコマンドに応じて、前記入出力バッファに格納されたデータを出力する
請求項１に記載の不揮発性メモリ。
【請求項４】
前記制御回路は、第１の期間に、前記第１のコマンドに応じて、前記第１のページからセンス動作で読み出されたデータを前記第１の中間バッファへ格納し、前記第１の期間より後の第２の期間に、転送指示と前記第１の中間バッファの指定とを含む第５のコマンドに応じて、前記第１の中間バッファに格納されたデータを前記入出力バッファへ転送して格納し、前記第２の期間より後の第３の期間に、出力指示を含む第６のコマンドに応じて、前記入出力バッファに格納されたデータを出力する
請求項１に記載の不揮発性メモリ。
【請求項５】
前記制御回路は、第１の期間に、前記第１のコマンドに応じて、前記第１のページからセンス動作で読み出されたデータを前記第１の中間バッファへ格納し、前記第１の期間より後の第２の期間に、前記第２のコマンドに応じて、前記第２のページからセンス動作で読み出されたデータを前記第２の中間バッファへ格納し、前記第１の期間より後の第３の期間に、転送指示と前記第１の中間バッファの指定とを含む第５のコマンドに応じて、前記第１の中間バッファに格納されたデータを前記入出力バッファへ転送して格納し、前記第３の期間より後の第４の期間に、出力指示を含む第６のコマンドに応じて、前記入出力バッファに格納されたデータを出力し、前記第２の期間より後の第５の期間に、転送指示と前記第２の中間バッファの指定とを含む第７のコマンドに応じて、前記第２の中間バッファに格納されたデータを前記入出力バッファへ転送して格納し、前記第５の期間より後の第６の期間に、出力指示を含む第８のコマンドに応じて、前記入出力バッファに格納されたデータを出力する
請求項２に記載の不揮発性メモリ。
【請求項６】
前記制御回路は、前記第６の期間より後の第７の期間に、転送指示と前記第１の中間バッファの指定とを含む第９のコマンドに応じて、前記第１の中間バッファに格納されたデータを前記入出力バッファへ転送して格納し、第７の期間より後の第８の期間に、出力指示を含む第１０のコマンドに応じて、前記入出力バッファに格納されたデータを出力する
請求項５に記載の不揮発性メモリ。
【請求項７】
前記１以上の中間バッファは、前記複数のページのそれぞれへのプログラム動作において使用されるバッファである
請求項１に記載の不揮発性メモリ。
【請求項８】
複数のページを含むメモリセルアレイと、
入出力バッファと、
それぞれが前記メモリセルアレイ及び前記入出力バッファの間に電気的に接続された１以上の中間バッファと、
転送指示と前記１以上の中間バッファにおける第１の中間バッファの指定とを含む第１のコマンドに応じて、前記第１の中間バッファに格納されたデータを前記入出力バッファへ転送して格納し、転送指示と前記１以上の中間バッファにおける前記第１の中間バッファと異なる第２の中間バッファの指定とを含む第２のコマンドに応じて、前記第２の中間バッファに格納されたデータを前記入出力バッファへ転送して格納する制御回路と、
を備えた不揮発性メモリ。
【請求項９】
前記１以上の中間バッファのそれぞれは、前記複数のページのそれぞれへのプログラム動作において使用されるバッファである
請求項８に記載の不揮発性メモリ。
【請求項１０】
不揮発性メモリと、
前記不揮発性メモリを制御するコントローラと、
を備え、
前記不揮発性メモリは、
複数のページを含むメモリセルアレイと、
入出力バッファと、
それぞれが前記メモリセルアレイ及び前記入出力バッファの間に電気的に接続された１以上の中間バッファと、
センス動作指示と前記１以上の中間バッファにおける第１の中間バッファの指定とを含む第１のコマンドに応じて、前記複数のページにおける第１のページからセンス動作で読み出されたデータを前記第１の中間バッファに格納する制御回路と、
を有する
メモリシステム。
【請求項１１】
前記１以上の中間バッファは、前記第１の中間バッファと異なる第２の中間バッファをさらに含み、
前記コントローラは、第１のスレッドに前記第１の中間バッファを、第２のスレッドに前記第２の中間バッファをそれぞれ対応させ、ホストからのリードコマンド又は内部処理に関するリード命令に前記第１のスレッドを割り当てる場合、前記第１のコマンドを発行して前記不揮発性メモリへ供給し、前記リードコマンド又は前記リード命令に前記第２のスレッドを割り当てる場合、センス動作指示と前記第２の中間バッファの指定とを含む第２のコマンドを発行して前記不揮発性メモリへ供給する
請求項１０に記載のメモリシステム。
【請求項１２】
前記コントローラは、前記リードコマンド又は前記リード命令で要求されるデータが前記第１の中間バッファ又は前記第２の中間バッファのいずれにキャッシュされているか判断し、前記第１の中間バッファにキャッシュされている場合に、前記第１の中間バッファの指定と転送指示とを含む第３のコマンドを発行して前記不揮発性メモリへ供給し、前記第２の中間バッファにキャッシュされている場合に、前記第２の中間バッファの指定と転送指示とを含む第４のコマンドを発行して前記不揮発性メモリへ供給する
請求項１１に記載のメモリシステム。
【請求項１３】
前記コントローラは、前記リードコマンド又は前記リード命令のシーケンシャル性が高いか否かを判断し、前記リードコマンド又は前記リード命令のシーケンシャル性が高い場合に、前記リードコマンド又は前記リード命令で要求されるデータが前記第１の中間バッファ又は前記第２の中間バッファのいずれにキャッシュされているか判断する
請求項１２に記載のメモリシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本実施形態は、不揮発性メモリ及びメモリシステムに関する。
【背景技術】
【０００２】
ＮＡＮＤ型フラッシュメモリなどの不揮発性メモリでは、コマンドを受信したら、受信されたコマンドに従った処理を行う。このとき、不揮発性メモリでは、コマンドを受信してからコマンドに従った処理を完了するまでの時間を短くすることが望まれる。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】米国特許出願公開第２０１５／０２０００１５号明細書
【特許文献２】米国特許出願公開第２００６／０２４５２４７号明細書
【特許文献３】米国特許出願公開第２０１２／００２６７９１号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００４】
一つの実施形態は、コマンドを受信してからコマンドに従った処理を完了するまでの時間を容易に短縮できる不揮発性メモリ及びメモリシステムを提供することを目的とする。
【課題を解決するための手段】
【０００５】
一つの実施形態によれば、メモリセルアレイと入出力バッファと１以上の中間バッファと制御回路とを有する不揮発性メモリが提供される。メモリセルアレイは、複数のページを含む。１以上の中間バッファは、それぞれがメモリセルアレイ及び入出力バッファの間に電気的に接続されている。制御回路は、第１のコマンドに応じて、複数のページにおける第１のページからセンス動作で読み出されたデータを第１の中間バッファに格納する。第１のコマンドは、センス動作指示と第１の中間バッファの指定とを含む。第１の中間バッファは、１以上の中間バッファにおける中間バッファである。
【図面の簡単な説明】
【０００６】
【図１】図１は、実施形態にかかるメモリシステムが適用された情報処理システムの構成を示す図である。
【図２】図２は、実施形態におけるメモリパッケージの構成を示す図である。
【図３】図３は、実施形態におけるメモリチップの構成を示す図である。
【図４】図４は、実施形態におけるメモリセルアレイ及び周辺回路の構成を示す図である。
【図５】図５は、実施形態におけるコマンドのシーケンスを示す図である。
【図６】図６は、実施形態におけるコントローラの機能構成を示す図である。
【図７】図７は、実施形態におけるコントローラの動作を示すフローチャートである。
【図８】図８は、実施形態における複数のスレッドに関する情報処理システムの動作例を示すシーケンス図である。
【図９】図９は、実施形態における複数のスレッドに関する情報処理システムの他の動作例を示すシーケンス図である。
【図１０】図１０は、実施形態における複数のスレッドに関する情報処理システムのさらに他の動作例を示すシーケンス図である。
【図１１】図１１は、実施形態におけるメモリシステムの動作を示すシーケンス図である。
【図１２】図１２は、実施形態における不揮発性メモリの動作を示す図である。
【図１３】図１３は、実施形態におけるコマンドの処理時間を示す図である。
【図１４】図１４は、実施形態の第１の変形例におけるリードコマンドのシーケンシャル性を判定するためのアルゴリズムを説明する模式図である。
【図１５】図１５は、実施形態の第１の変形例におけるシーケンシャル性を判定する動作を説明する図である。
【図１６】図１６は、実施形態の第１の変形例におけるシーケンシャル性判定テーブルの更新手順を説明するフローチャートである。
【図１７】図１７は、実施形態の第２の変形例におけるシーケンシャル性を判定する動作を説明する図である。
【発明を実施するための形態】
【０００７】
以下に添付図面を参照して、実施形態にかかるメモリシステムを詳細に説明する。なお、この実施形態により本発明が限定されるものではない。
【０００８】
（実施形態）
実施形態にかかるメモリシステムについて説明する。メモリシステムは、ＮＡＮＤ型フラッシュメモリなどの不揮発性メモリを有し、ホストからのコマンド（ホストコマンド）に応じて不揮発性メモリを用いた動作を実現可能である。メモリシステムは、ホストからのライトコマンドに応じてデータを不揮発性メモリに格納し、ホストからのリードコマンドに応じてデータを不揮発性メモリから読み出す。
【０００９】
例えば、先に受けたライトコマンドに含まれた論理アドレスに対してシーケンシャルな論理アドレスを含むライトコマンド（シーケンシャルライトコマンド）をメモリシステム２０が受けた場合、不揮発性メモリは、そのライトコマンドに対応するライトデータを、先に受けたライトコマンドに応じてデータが書き込まれた物理アドレスに対してシーケンシャルな物理アドレスに格納する。
【００１０】
不揮発性メモリがシーケンシャルライトされた状態で、例えば、先に受けたリードコマンドに含まれた論理アドレスに対してシーケンシャルな論理アドレスを含むリードコマンド（シーケンシャルリードコマンド）をメモリシステムが受けた場合、不揮発性メモリは、そのリードコマンドに対応するリードデータを、先に受けたリードコマンドに応じてデータが読み出された物理アドレスに対してシーケンシャルな物理アドレスから入出力バッファ（入出力用のデータラッチ）を介して読み出す。
【００１１】
不揮発性メモリはメモリセルが行列状に配列されたメモリセルアレイを有し、入出力バッファは、メモリセルアレイにおける１行に対応した１ページ分のデータ容量を有している。シーケンシャルリードコマンドで要求されたデータが先のリードコマンドで要求されたデータと同一ページ内に並んでいれば、メモリセルアレイからのセンス動作を省略し、入出力バッファに格納されたデータからの読み出し動作が可能であり、読み出し要求に応じた読み出し動作を高速化可能である。
【００１２】
しかし、入出力バッファに保持できるセンス結果が１ページ分であるため、複数の後述するスレッドのシーケンシャルリードコマンドをメモリシステムが並行に（コンカレントに）受けた場合、複数のスレッドのシーケンシャルリードアクセスが互いに入出力バッファ内のセンス結果をつぶしあい（スラッシングという）、センス動作のやり直しが発生し、読み出し動作の高速化が困難になる可能性がある。
【００１３】
そこで、本実施形態では、不揮発性メモリにおいて、複数のスレッドに複数の中間バッファを割り当て、複数の中間バッファのうちコマンドで明示的に指定した中間バッファにデータを格納させる。そして、コマンドで指定した中間バッファから入出力バッファにデータを転送して不揮発性メモリからコントローラへと出力させる。これにより、複数のスレッドでのシーケンシャルリードコマンドに対する読み出し動作の高速化を図る。
【００１４】
具体的には、不揮発性メモリにおいて、ホストシステムからのリードコマンドに応じてセンス動作（メモリセル→データラッチ）を行う際、センスした結果を、コントローラによって指定された中間バッファ（例えば、ＡＤＬ，ＢＤＬのいずれか）に格納する。また、不揮発性メモリからコントローラへのデータ出力に先立ち、センス結果を中間バッファ（例えば、ＡＤＬ，ＢＤＬのいずれか）から入出力バッファ（すなわち、ＸＤＬ）へとラッチ間転送を行う。コントローラは、複数スレッドのシーケンシャルリードアクセスを検出したとき、不揮発性メモリ（におけるメモリチップ）に対し、スレッドごとに割り当てた中間バッファ（例えば、ＡＤＬ，ＢＤＬのいずれか）を指定してリード動作（センスおよびデータ出力）を行う。中間バッファ（例えば、ＡＤＬ，ＢＤＬのいずれか）は、プログラム動作を行うために設けられており、リード処理中は未使用であるため、本実施形態では、リード処理における動作を行うために使用する。
【００１５】
不揮発性メモリは、複数の中間バッファ（例えば、ＡＤＬ，ＢＤＬ）を含み、次の（１）と（２）のコマンドをサポートする。
（１）格納先（例えば、ＡＤＬ，ＢＤＬのいずれか）の明示的な指定を含むセンスコマンド（メモリセルアレイ  →  センスアンプ  →  ＡＤＬ／ＢＤＬ）
（２）転送元の明示的な指定を含むデータラッチ間転送コマンド  （ＡＤＬ／ＢＤＬ  →  ＸＤＬ）
【００１６】
また、メモリシステムのコントローラは、次の（ｉ）（ｉｉ）（ｉｉｉ）の動作を行う。
（ｉ）複数スレッドのシーケンシャルリードアクセスを検出し、スレッドごとに中間バッファ（例えば、ＡＤＬ，ＢＤＬのいずれか）を割り当てる。
（ｉｉ）センス時、スレッドに応じた中間バッファ（例えば、ＡＤＬ，ＢＤＬのいずれか）を格納先として指定して、センスコマンドを発行する  (すなわち、センス動作を指示する)。
（ｉｉｉ）データ転送時、事前に、スレッドに応じた中間バッファ（例えば、ＡＤＬ，ＢＤＬのいずれか）からＸＤＬへとラッチ間転送を指示する。
【００１７】
これにより、複数スレッドのシーケンシャルリードコマンドに対しても、センス結果のスラッシングによる余分なセンス動作が発生せず、高い性能を発揮できる。あるいは、コントローラのリードバッファについて、同等の性能を発揮するために必要な容量を削減することができる。
【００１８】
より具体的には、メモリシステム２０が適用された情報処理システム１は、図１に示すように構成され得る。図１は、メモリシステム２０が適用された情報処理システム１の構成を示す図である。情報処理システム１は、ホストシステム１０、通信線３、及びメモリシステム２０を有する。
【００１９】
メモリシステム２０は、ホストシステム１０に通信線３を介して接続され、ホストシステム１０の外部記憶装置として機能する。メモリシステム２０は、ＵＦＳ（Ｕｎｉｖｅｒｓａｌ  Ｆｌａｓｈ  Ｓｔｏｒａｇｅ）規格やｅＭＭＣ（ｅｍｂｅｄｄｅｄ  Ｍｕｌｔｉ  Ｍｅｄｉａ  Ｃａｒｄ）規格などに準拠した組み込み用途のフラッシュメモリや、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）などである。ホストシステム１０は、例えば、パーソナルコンピュータ、携帯電話、撮像装置などである。ホストシステム１０とメモリシステム２０とは、通信路３を介して、例えば、ＵＦＳ（Ｕｎｉｖｅｒｓａｌ  Ｆｌａｓｈ  Ｓｔｏｒａｇｅ）規格、ＳＡＳ（Ｓｅｒｉａｌ  Ａｔｔａｃｈｅｄ  ＳＣＳＩ）規格、ＳＡＴＡ（Ｓｅｒｉａｌ  Ａｄｖａｎｃｅｄ  Ｔｅｃｈｎｏｌｏｇｙ  Ａｔｔａｃｈｍｅｎｔ）規格、ＰＣＩｅ（Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ  ｅｘｐｒｅｓｓ）規格、ＮＶＭｅ（Ｎｏｎ−Ｖｏｌａｔｉｌｅ  Ｍｅｍｏｒｙ  ｅｘｐｒｅｓｓ）規格に準拠したパケットを送受信できる。
【００２０】
ホストシステム１０は、プロセッサ１１、メインメモリインターフェース（メインメモリＩ／Ｆ）１２、メインメモリ１３、ストレージインターフェース（ストレージＩ／Ｆ）１４、およびこれらを接続するバス１６を備える。メインメモリＩ／Ｆ１２は、メインメモリ１３をバス１６に接続するためのインターフェースである。
【００２１】
メインメモリ１３は、プロセッサ１１がアクセス可能な主記憶装置であり、本例では、ＤＲＡＭ（Ｄｙｎａｍｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）を使用する。メインメモリ１３は、リードバッファ１３ｃを含む。リードバッファ１３ｃは、リードコマンドに従ってメモリシステム２０から転送されたリードデータが一時的に格納される。また、メインメモリ１３は、例えば、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）１３ａ及びアプリケーションプログラム１３ｂを記憶する。ＯＳ１３ａは、ホストシステム１０の制御プログラムとして機能する。アプリケーションプログラム１３ｂは、ＯＳ１３ａ上で動作するユーザ用途プログラムとして機能する。
【００２２】
ストレージＩ／Ｆ１４は、メモリシステム２０と接続するためのインターフェースである。ストレージＩ／Ｆ１４は、メインメモリ１３とストレージＩ／Ｆ１４内のレジスタとの間でのデータ転送制御を実行する。
【００２３】
プロセッサ１１は、ホストシステム１０の動作を制御するプロセッサであり、メインメモリ１３にロードされるＯＳ１３ａを実行する。ＯＳ１３ａにはメモリシステム２０を制御するデバイスドライバが含まれる。デバイスドライバは、ＯＳ１３ａ上のアプリケーションプログラム１３ｂからメモリシステム２０に対するリード指示を受け付けると、リード指示に応じたリードコマンドを発行する。デバイスドライバにより発行されるリードコマンドには、コマンドの種類（リードであるかライトであるか）を識別するフィールド、先頭ＬＢＡを指定するフィールド、リードデータのサイズを指定するフィールドなどが含まれる。そして、デバイスドライバは、発行されたリードコマンドを、ストレージＩ／Ｆ１４及び通信路３を介してメモリシステム２０に送信する。
【００２４】
メモリシステム２０は、不揮発性メモリ２１及びコントローラ２５を有する。コントローラ２５は、例えばＳｏＣ（Ｓｙｓｔｅｍ−ｏｎ−ａ−Ｃｈｉｐ）を含むコントローラパッケージとして実装され得る。コントローラ２５は、メモリインターフェース（メモリＩ／Ｆ）２４、バッファメモリ２６、メインコントローラ２８、ホストインターフェース（ホストＩ／Ｆ）２９を有する。
【００２５】
不揮発性メモリ２１は、コントローラ２５外に配され、不揮発性メモリパッケージとして実装され得る。不揮発性メモリ２１は、例えばＮＡＮＤ型フラッシュメモリとすることができるがこれに限定されない。不揮発性メモリ２１は、例えばＲｅＲＡＭ（Ｒｅｓｉｓｔａｎｃｅ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＰＲＡＭ（Ｐｈａｓｅ  ｃｈａｎｇｅ  ＲＡＭ）、ＭＲＡＭ（Ｍａｇｎｅｔｏｒｅｓｉｓｔｉｖｅ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、又は、ＦｅＲＡＭ（Ｆｅｒｒｏｅｌｅｃｔｒｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）であってもよい。
【００２６】
不揮発性メモリ２１は、複数のブロックを有する。各ブロックは、データ消去の単位である。各ブロックは、メモリセルアレイを有する。メモリセルアレイでは、複数のメモリセルが行列状に配列されている。メモリセルアレイでは、１行に対応するページの単位でデータの書き込み及び読み出しが行われる。例えば、各メモリセルがＳＬＣ（Ｓｉｎｇｌｅ  Ｌｅｖｅｌ  Ｃｅｌｌ）である場合、１行のメモリセルが１ページのデータを記憶する。あるいは、各メモリセルは多値記憶が可能であり、各メモリセルがＭＬＣ（Ｍｕｌｔｉ  Ｌｅｖｅｌ  Ｃｅｌｌ）である場合、１行のメモリセルが２ページのデータを記憶する。各メモリセルがＴＬＣ（Ｔｒｉｐｌｅ  Ｌｅｖｅｌ  Ｃｅｌｌ）である場合、１行のメモリセルが３ページのデータを記憶する。
【００２７】
不揮発性メモリ２１は、例えば、メモリシステム２０の管理情報及びユーザデータ２３を記憶する。メモリシステム２０の管理情報は、論理物理変換テーブル（Ｌ２Ｐテーブル）２２を含む。
【００２８】
論理物理変換テーブル（Ｌ２Ｐテーブル）２２は、ホストシステム１０がメモリシステム２０にアクセスする際に使用する論理アドレス（ＬＢＡ：Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓ）と、不揮発性メモリ２１内の物理アドレス（ブロックアドレス＋ページアドレス＋ページ内記憶位置）とを対応づけるアドレス変換情報である。
【００２９】
メモリＩ／Ｆ２４は、メインコントローラ２８の制御に基づき、不揮発性メモリ２１に対してデータおよび管理情報のリード／ライトを実行する。
【００３０】
バッファメモリ２６は、例えば、コマンドキュー２６ａ、Ｌ２Ｐテーブルキャッシュ２６ｂ、及びリードバッファ２６ｃを含む。コマンドキュー２６ａは、ホストシステム１０から受信されたコマンド（例えば、ライトコマンド、リードコマンドなど）をキューイングする。Ｌ２Ｐテーブルキャッシュ２６ｂは、論理物理変換処理が行われる際に、論理物理変換テーブル（Ｌ２Ｐテーブル）２２が一時的に格納される。リードバッファ２６ｃは、リードコマンドに従って不揮発性メモリ２１からセンス動作で読み出されたリードデータが一時的に格納される。すなわち、バッファメモリ２６は、不揮発性メモリ２１からリードされたデータを記憶するためのバッファとして用いられる。また、バッファメモリ２６は、不揮発性メモリ２１にライトするデータを記憶するためのバッファとして用いることもできる。例えば、バッファメモリ２６は、ＳＲＡＭ又はＤＲＡＭ等で構成されるが、レジスタ等で構成してもよい。
【００３１】
ホストＩ／Ｆ２９は、ホストシステム１０と接続するためのインターフェースである。ホストＩ／Ｆ２９は、ホストシステム１０のストレージＩ／Ｆ１４内のレジスタとメモリシステム２０のバッファメモリ２６との間のデータ伝送を制御する機能を有する。
【００３２】
メインコントローラ２８は、例えばＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）であり、ファームウェアでその機能を実現され、バス３０に接続されたメモリシステム２０内の各構成要素を統括的に制御する。
【００３３】
不揮発性メモリ２１は、それぞれ並列にアクセス制御される複数のメモリパッケージ３１を有し、各メモリパッケージ３１はそれぞれ独立に信号線群を介してコントローラ２に接続されている。各メモリパッケージ３１は、図２に示すように構成され得る。図２は、メモリパッケージ３１の構成を示す図である。
【００３４】
メモリパッケージ３１は、４つのメモリチップ４０（Ｃｈｉｐ＃０〜Ｃｈｉｐ＃３）を有する。なお、メモリパッケージ３１が有するメモリチップの数は、４に限定されず、１以上であればよい。各々のメモリチップ４０では、ページと言われるデータ単位でデータの書き込み、および読み出しが行われる。図示するように、メモリパッケージ３１には、メモリチップ４０を制御又は監視するための制御信号線３１ａと、コマンド、アドレス、およびデータなどの入出力信号Ｉ／Ｏ１〜Ｉ／Ｏ８が送受信される入出力信号線３１ｂと、電位供給線３１ｃとが接続されている。
【００３５】
なお、制御信号線３１ａは、チップイネーブル信号（ＣＥｎ）、コマンドラッチイネーブル信号（ＣＬＥ）、アドレスラッチイネーブル信号（ＡＬＥ）、ライトイネーブル信号（ＷＥｎ）、リードイネーブル信号（ＲＥｎ）、ライトプロテクト信号（ＷＰｎ）、レディービジー信号（ＲＹ／ＢＹｎ）などに対する信号線を含む。信号名に付された「ｎ」は、その信号が負論理（ローアクティブ）の信号であることを示している。また、電位供給線３１ｃは、電源電位Ｖｃｃ、インターフェース回路用電源電位Ｖｃｃｑおよびグランド電位Ｖｓｓを供給するための供給線を含む。図示するように、制御信号線３１ａおよび入出力信号線３１ｂはメモリパッケージ３１内で共通配線とされることがある。ここでは、入出力信号線３１ｂは、一例として８ビットの信号線であるとするが、入出力信号線３１ｂの伝送幅は８ビットに限定されない。
【００３６】
次に、各メモリチップ４０の構成について図３及び図４を用いて説明する。図３は、メモリチップ４０の構成を示すブロック図である。図４は、メモリセルアレイ５０及び周辺回路の構成を示す回路図である。
【００３７】
メモリチップ４０は、制御回路５１、入出力インターフェース（入出力Ｉ／Ｆ）４５、センスアンプブロック４６、ＡＤＬ（中間バッファ）４７、ＢＤＬ（中間バッファ）４８、ＸＤＬ（入出力バッファ）４９、及びメモリセルアレイ５０を有する。
【００３８】
メモリセルアレイ５０は、複数のメモリセルを備える。複数のメモリセルは複数の行及び複数の列を構成する。例えば図４に示すように、メモリセルアレイ５０には、ｎ（ｎは正の整数）個のブロックＢＬＫ−０〜ＢＬＫ−（ｎ−１）が含まれる。各ブロックＢＬＫ−０〜ＢＬＫ−（ｎ−１）には、複数のＮＡＮＤストリングＮＳ−０〜ＮＳ−（ｐ−１）が配置されている。複数のＮＡＮＤストリングＮＳ−０〜ＮＳ−（ｐ−１）は、例えば、列（カラム）方向にそれぞれ延びる。複数のＮＡＮＤストリングＮＳ−０〜ＮＳ−（ｐ−１）は、行（ロウ）方向に配列されている。各ＮＡＮＤストリングＮＳ−０〜ＮＳ−（ｐ−１）は、例えば、互いに直列接続された複数のメモリセルＭＴ−０〜ＭＴ−（ｋ−１）とその両端に１つずつ接続された２つのセレクトゲートＳＴ、ＤＴとを含む。
【００３９】
複数のワード線は、行（ロウ）方向にそれぞれ延びる。複数のワード線は、列（カラム）方向に配列されている。例えば図４に示すように、複数のワード線ＷＬ−０〜ＷＬ−（ｋ−１）は、行（ロウ）方向にそれぞれ延びる。複数のワード線ＷＬ−０〜ＷＬ−（ｋ−１）は、列（カラム）方向に配列されている。すなわち、複数のワード線ＷＬ−０〜ＷＬ−（ｋ−１）は、複数のＮＡＮＤストリングＮＳ−０〜ＮＳ−（ｐ−１）と交差している。各ワード線ＷＬ−０〜ＷＬ−（ｋ−１）は、複数のメモリセルの制御ゲートに接続されている。
【００４０】
各メモリセルＭＴは、例えばＭＬＣ（Ｍｕｌｔｉ  Ｌｅｖｅｌ  Ｃｅｌｌ）である場合、上位ビット（Ｕｐｐｅｒ  ｂｉｔ）及び下位ビット（Ｌｏｗｅｒ  ｂｉｔ）を使用して多値記憶が可能である。ＭＬＣの場合は、１つのワード線ＷＬに接続された複数のメモリセル（単にワード線と称することもある）に、上位ページ（Ｕｐｐｅｒ  ｐａｇｅ）及び下位ページ（Ｌｏｗｅｒ  ｐａｇｅ）の２ページが含まれる。
【００４１】
あるいは、各メモリセルＭＴは、ＴＬＣ（Ｔｒｉｐｌｅ  Ｌｅｖｅｌ  Ｃｅｌｌ）記憶セルであってもよい。各メモリセルＭＴが、ＴＬＣ（Ｔｒｉｐｌｅ  Ｌｅｖｅｌ  Ｃｅｌｌ）記憶セルである場合、１つのメモリセルに３ビットの情報を蓄積可能である。ＴＬＣの場合は、１つのワード線ＷＬに、上位ページ（Ｕｐｐｅｒ  ｐａｇｅ）、中位ページ（Ｍｉｄｄｌｅ  ｐａｇｅ）、下位ページ（Ｌｏｗｅｒ  ｐａｇｅ）の３ページが含まれる。
【００４２】
２つのセレクトゲートラインＳＧＤ，ＳＧＳは、行（ロウ）方向にそれぞれ延びる。セレクトゲートラインＳＧＤ，ＳＧＳは、列（カラム）方向における複数のワード線の両端に配されている。２つのセレクトゲートラインＳＧＤ，ＳＧＳは、それぞれ、セレクトゲートＤＴ、ＳＴの制御ゲートに接続されている。
【００４３】
複数のビット線は、列（カラム）方向にそれぞれ延びる。複数のビット線は、行（ロウ）方向に配列されている。例えば図４に示すように、複数のビット線ＢＬ−０〜ＢＬ−（ｐ−１）は、列（カラム）方向にそれぞれ延びる。複数のビット線ＢＬ−０〜ＢＬ−（ｐ−１）は、行（ロウ）方向に配列されている。すなわち、複数のビット線ＢＬ−０〜ＢＬ−（ｐ−１）は、複数のＮＡＮＤストリングＮＳ−０〜ＮＳ−（ｐ−１）に対応している。
【００４４】
各ＮＡＮＤストリングＮＳは、対応するセレクトゲートＳＴを介して、共通のソースラインに接続されている。また各ＮＡＮＤストリングＮＳは、対応するセレクトゲートＤＴを介して、対応するビット線ＢＬに接続されている。
【００４５】
図３に示す制御回路５１は、コントローラ２から受信する各種制御信号（図２に示す制御信号ＣＥｎ，ＣＬＥ，ＡＬＥ，ＷＥｎ，ＲＥｎ，ＷＰｎ）に基づいて状態（ステート）遷移する状態遷移回路（ステートマシン）であって、メモリチップ４０における各部の動作を統括的に制御する。
【００４６】
制御回路５１は、コマンド解析回路４１、行制御回路４２、及び転送制御回路４３を有する。
【００４７】
コマンド解析回路４１は、コントローラ２からのコマンドを解析し、コマンドに含まれた要求（すなわち、要求内容、ロウアドレス、カラムアドレスなど）を特定する。コマンド解析回路４１は、コマンドに含まれた要求が書き込み要求である場合、書き込み要求及びロウアドレスを行制御回路４２へ通知し、カラムアドレスを列制御回路４３へ通知する。コマンド解析回路４１は、コマンドに含まれた要求が読み出し要求である場合、読み出し要求及びロウアドレスを行制御回路４２へ通知し、カラムアドレスを列制御回路４３へ通知する。
【００４８】
行制御回路４２は、ロウデコーダ４２ａ（図示せず）及びワード線ドライバ４２ｂ（図示せず）を有する。ロウデコーダ４２ａは、ワード線ドライバ４２ｂを介してワード線ＷＬ−０〜ＷＬ−（ｋ−１）に接続されている。各ワード線ＷＬ−０〜ＷＬ−（ｋ−１）は、ＮＡＮＤストリングＮＳ内の各メモリセルＭＴの制御ゲートに接続されている。ロウデコーダ４２ａは、コマンドに含まれたロウアドレスをデコードして、複数のワード線ＷＬ−０〜ＷＬ−（ｋ−１）のうち選択ワード線及び非選択ワード線をそれぞれ決定する。そして、ロウデコーダ４２ａは、書き込み要求に応じたプログラム動作時に、ワード線ドライバ４２ｂを介して、選択ワード線の電位をプログラム電位Ｖｐｇｍ（例えば約１８Ｖ）に設定し、非選択ワード線の電位を転送電位Ｖｐａｓｓ＿ｐｒｏｇｒａｍ（例えば約１０Ｖ）に設定する。ロウデコーダ４２ａは、読み出し要求に応じたリード動作時に、選択ワード線の電位を読み出し電位ＶＣＧ＿Ｒに設定し、非選択ワード線の電位を非選択電位Ｖｐａｓｓ＿ｒｅａｄに設定する。
【００４９】
センスアンプブロック４６は、メモリセルアレイ５０とデータラッチ群（ＡＤＬ４７、ＢＤＬ４８、ＸＤＬ４９）との間に電気的に接続されている。センスアンプブロック４６は、複数のビット線ＢＬ−０〜ＢＬ−（ｐ−１）に対応した複数のセンスアンプＳＡ−０〜ＳＡ−（ｐ−１）を有している。
【００５０】
ＡＤＬ４７及びＢＤＬ４８は、それぞれ、センスアンプブロック４６及びＸＤＬ４９の間に電気的に接続されている。すなわち、ＡＤＬ４７及びＢＤＬ４８は、それぞれ、メモリセルアレイ５０及びＸＤＬ４９の間に電気的に接続されている。ＡＤＬ４７は、複数のビット線ＢＬ−０〜ＢＬ−（ｐ−１）に対応した複数のＡＤＬ回路４７１−０〜４７１−（ｐ−１）を有している。ＢＤＬ４８は、複数のビット線ＢＬ−０〜ＢＬ−（ｐ−１）に対応した複数のＢＤＬ回路４８１−０〜４８１−（ｐ−１）を有している。
【００５１】
ＸＤＬ４９は、ＡＤＬ４７及びＢＤＬ４８と入出力インターフェース（入出力Ｉ／Ｆ）４５との間に配される。入出力Ｉ／Ｆ４５は、メモリチップ４０における入出力信号線３１ｂ（図２参照）に接続するためのインターフェースとして機能する。ＸＤＬ４９は、複数のビット線ＢＬ−０〜ＢＬ−（ｐ−１）に対応した複数のＸＤＬ回路４９１−０〜４９１−（ｐ−１）を有している。
【００５２】
各ＡＤＬ回路４７１及び各ＢＤＬ回路４８１は、センスアンプＳＡ及びＸＤＬ回路４９１を接続するラインに電気的に接続されている。入出力Ｉ／Ｆ４５は、センスアンプＳＡ及びＸＤＬ回路４９１を接続するラインと入出力信号線３１ｂ（図２参照）との間に電気的に挿入される。これにより、ＡＤＬ４７、ＢＤＬ４８は、入出力信号線３１ｂに直接接続可能でない中間バッファとして機能し、ＸＤＬ４９は、入出力信号線３１ｂに直接接続可能である入出力バッファとして機能する。直接接続可能であるとは、他のバッファを介さずに接続可能であることを指し、直接接続可能でないとは、接続のための他のバッファ等を介さなければならないことを指す。なお、ＡＤＬ４７、ＢＤＬ４８は、中間データラッチ又はキャッシュデータラッチと呼んでもよく、ＸＤＬ４９は、入出力データラッチと呼んでもよい。
【００５３】
転送制御回路４３は、コマンド解析回路４１の解析結果を受けて、センスアンプブロック４６とデータラッチ群（ＡＤＬ４７、ＢＤＬ４８、ＸＤＬ４９）との間のデータ転送を制御するとともに、ＸＤＬ４９から入出力Ｉ／Ｆ４５を介した入出力信号線３１ｂへデータ出力を制御する。
【００５４】
また、コマンド解析回路４１は、中間バッファ（例えば、ＡＤＬ４７，ＢＤＬ４８）の指定を含むコマンドを解析する。複数のスレッドのリードコマンドと複数の中間バッファの指定とが対応している場合、コマンド解析回路４１は、中間バッファの指定からそのコマンドに用いる中間バッファを特定する。すなわち、コントローラ２５がスレッドに対してコンテキストを割り当てる。例えば、コントローラ２５は、スレッドＡにコンテキストＡを割り当て、スレッドＢにコンテストＢを割り当てる。コントローラ２５は、メモリチップに該コンテキストの使用を指定する。コマンド解析回路４１は、使用の指定されたコンテキストに応じて、使用すべき中間バッファを特定する。コマンド解析回路４１は、コンテキストごとに使用すべき中間バッファを予め決めている。例えば、コントローラ２５がコンテキストＡを指示した場合、コマンド解析回路４１は、コントローラ２５がＡＤＬ４７の使用を指示したと解釈する。あるいは、コントローラ２５がコンテキストＢを指示した場合、コマンド解析回路４１は、コントローラ２５がＢＤＬ４８の使用を指示したと解釈する。
【００５５】
ここで、スレッドとは、リードコマンド群の分類であり、  再利用性の期待を判断する単位（例えば、シーケンシャル性を判定する単位）を指す。スレッドは、ホストID、ストリームID(ホストがマルチストリーム処理を行う場合に、複数のストリームを互いに区別するためにホストによってコマンドに対して付加されるもの、あるいは後述する第２の変形例の図17のシーケンシャル判定アルゴリズムによって付加されるもの)、内部処理の種類等によって区別される。コンテキストとは、スレッドのうち、中間バッファを割り当てるべきものを指し、前述のように、コンテキストごとに使用すべき中間バッファが予め決められ対応付けられている。キャッシュヒットの判定は、コンテキスト単位で行われる。中間バッファとは、不揮発性メモリ２１側の物理的なレジスタを指す。
【００５６】
コマンド解析回路４１は、中間バッファの指定を含むセンスコマンドについて、中間バッファの指定、ページの指定、センス動作指示、（ダミー）カラムアドレスの指定、ロウアドレスの指定、センス開始指示を順に解釈する。コマンド解析回路４１は、中間バッファの指定を含むラッチ間転送コマンドについて、ラッチ間転送指示及び中間バッファの指定を解釈する。
【００５７】
なお、コマンド解析回路４１は、中間バッファの指定を含まないセンスコマンドについて、ページの指定、センス動作指示、（ダミー）カラムアドレスの指定、ロウアドレスの指定、センス開始指示を順に解釈する。コマンド解析回路４１は、中間バッファの指定を含まないデータ転送コマンドについて、出力動作指示、カラムアドレスの指定、（ダミーの）ロウアドレスの指定、出力開始指示を順に解釈する。
【００５８】
例えば、入出力Ｉ／Ｆ４５を介して図５（ａ）に示すセンスコマンドＣＭ１が供給されると、センスコマンドＣＭ１において、「ＸＡｈ」によってコンテキストＡが指定されているため、コマンド解析回路４１は、ＡＤＬ４７の使用が明示的に指定されたと解釈する。コマンド解析回路４１は、「０１ｈ」で下位ページ（Ｌｏｗｅｒ  ｐａｇｅ）が指定されたと解釈し、「００ｈ」をセンス動作指示であると解釈する。そして、コマンド解析回路４１は、「ＣＡ１」「ＣＡ２」をダミーのカラムアドレスとして無視し、「ＲＡ１」「ＲＡ２」「ＲＡ３」をロウアドレスとして解釈し、「３０ｈ」をデータのセンス開始指示であると解釈する。
【００５９】
これに応じて、レディービジー信号ＲＹ／ＢＹｎがビジー（ローレベル）になるｔ（ＳＡ→ＡＤＬ）で示す期間に、行制御回路４２は、選択ワード線の電位を読み出し電位ＶＣＧ＿Ｒに設定し、非選択ワード線の電位を非選択電位Ｖｐａｓｓ＿ｒｅａｄに設定する。センスアンプブロック４６は、メモリセルアレイ５０におけるロウアドレスで指定されたメモリセル群の下位ページに対してセンス動作を行う。転送制御回路４３は、センスアンプブロック４６のセンス動作で検知された１ページ分のデータをＡＤＬ４７へ転送して格納する。
【００６０】
例えば、入出力Ｉ／Ｆ４５を介して図５（ｂ）に示すセンスコマンドＣＭ２が供給されると、センスコマンドＣＭ２において、「ＸＢｈ」によってコンテキストＢが指定されているため、コマンド解析回路４１は、ＢＤＬ４８の使用が明示的に指定されたと解釈する。コマンド解析回路４１は、「０２ｈ」で中位ページ（Ｍｉｄｄｌｅ  ｐａｇｅ）が指定されたと解釈し、「００ｈ」をセンス動作指示であると解釈する。そして、コマンド解析回路４１は、「ＣＡ１」「ＣＡ２」をダミーのカラムアドレスとして無視し、「ＲＡ１」「ＲＡ２」「ＲＡ３」をロウアドレスとして解釈し、「３０ｈ」をデータのセンス開始指示であると解釈する。
【００６１】
これに応じて、レディービジー信号ＲＹ／ＢＹｎがビジー（ローレベル）になるｔ（ＳＡ→ＢＤＬ）で示す期間に、行制御回路４２は、選択ワード線の電位を読み出し電位ＶＣＧ＿Ｒに設定し、非選択ワード線の電位を非選択電位Ｖｐａｓｓ＿ｒｅａｄに設定する。センスアンプブロック４６は、メモリセルアレイ５０におけるロウアドレスで指定されたメモリセル群の下位ページに対してセンス動作を行う。転送制御回路４３は、センスアンプブロック４６のセンス動作で検知された１ページ分のデータをＢＤＬ４８へ転送して格納する。
【００６２】
例えば、入出力Ｉ／Ｆ４５を介して図５（ｃ）に示すラッチ間転送コマンドＣＭ３が供給されると、コマンド解析回路４１は、ラッチ間転送コマンドにおいて、「ＹＡｈ」をラッチ間転送指示であると解釈するとともに「ＹＡｈ」をＡＤＬ４７の明示的な指定と解釈し、これによりコンテキストＡにＸＤＬ４９を割り当てる。
【００６３】
これに応じて、レディービジー信号ＲＹ／ＢＹｎがビジー（ローレベル）になるｔ（ＡＤＬ→ＸＤＬ）で示す期間に、転送制御回路４３は、ＡＤＬ４７に格納された１ページ分のデータをＸＤＬ４９に転送して格納する。
【００６４】
続いて、コマンド解析回路４１は、図５（ｃ）に示すデータ転送コマンドＣＭ４において、「０５ｈ」を転送指示であると解釈する。そして、コマンド解析回路４１は、「ＣＡ１」「ＣＡ２」をＸＤＬ４９におけるカラムアドレスとして解釈し、「ＲＡ１」「ＲＡ２」「ＲＡ３」をダミーのロウアドレスとして無視し、「Ｅ０ｈ」を出力開始指示であると解釈する。
【００６５】
これに応じて、レディービジー信号ＲＹ／ＢＹｎがビジー（ローレベル）になるｔＯＵＴで示す期間に、転送制御回路４３は、ＸＤＬ４９におけるカラムアドレスで指定されたデータを入出力Ｉ／Ｆ４５経由で入出力信号線３１ｂへ出力する。
【００６６】
例えば、入出力Ｉ／Ｆ４５を介して図５（ｄ）に示すラッチ間転送コマンドＣＭ５が供給されると、コマンド解析回路４１は、ラッチ間転送コマンドＣＭ５において、「ＹＢｈ」をラッチ間転送指示であると解釈するとともに「ＹＢｈ」をＢＤＬ４８の明示的な指定と解釈し、これによりコンテキストＢにＸＤＬ４９を割り当てる。
【００６７】
これに応じて、レディービジー信号ＲＹ／ＢＹｎがビジー（ローレベル）になるｔ（ＢＤＬ→ＸＤＬ）で示す期間に、転送制御回路４３は、ＢＤＬ４８に格納された１ページ分のデータをＸＤＬ４９に転送して格納する。
【００６８】
続いて、コマンド解析回路４１は、図５（ｄ）に示すデータ転送コマンドＣＭ６において、「０５ｈ」を転送指示であると解釈する。そして、コマンド解析回路４１は、「ＣＡ１」「ＣＡ２」をＸＤＬ４９におけるカラムアドレスとして解釈し、「ＲＡ１」「ＲＡ２」「ＲＡ３」をダミーのロウアドレスとして無視し、「Ｅ０ｈ」を出力開始指示であると解釈する。
【００６９】
これに応じて、レディービジー信号ＲＹ／ＢＹｎがビジー（ローレベル）になるｔＯＵＴで示す期間に、行制御回路４２は、ＸＤＬ４９におけるカラムアドレスで指定されたデータを入出力Ｉ／Ｆ４５経由で入出力信号線３１ｂへ出力する。
【００７０】
一方、メモリシステム２０のコントローラ２５では、中間バッファ（ＡＤＬ４７，ＢＤＬ４８）の指定を含むコマンドを発行すべき状況として、複数のスレッドに関するリード処理を行う場合が考えられる。コントローラ２５は、並行して実行すべき複数のリード処理が存在する場合、複数のリード処理のそれぞれにスレッドを割り当て、各スレッドを管理しながらコマンドを発行して不揮発性メモリ２１へのアクセス制御を行う。
【００７１】
具体的には、コントローラ２５は、機能的な構成として、リード処理部２５１及びバックグランド処理部２５７を有する。リード処理部２５１は、スレッド割当部２５２、スレッド判定部２５３、コンテキスト割当部２５４、バッファ判定部２５５、及びコマンド発行部２５５を有する。なお、コントローラ２５は、前述のように、例えばＳｏＣ（Ｓｙｓｔｅｍ−ｏｎ−ａ−Ｃｈｉｐ）を含むコントローラパッケージとして実装され得る。図６に示す機能的な構成は、コントローラパッケージにおいてハードウェア的に（例えば、回路として）実装されていてもよい。あるいは、図６に示す各機能は、コントローラパッケージにおいてソフトウェア的に（例えば、バッファメモリ２６等に一括して又は処理の進行に応じて順次に展開されるファームウェアを、メインコントローラ２８が実行することによって）実現されていてもよい。あるいは、図６に示す各機能は、コントローラパッケージにおいて、一部の機能がハードウェアによって実現され、残りの機能がソフトウェア的に実現されていてもよい。
【００７２】
バックグランド処理部２５７は、ホストコマンドに基づかずにメモリシステム２０が自発的に行うバックグランド処理を制御し、バックグランド処理に従い、バックグランドリード命令を発行してリード処理部２５１へ供給する。バックグランドリード命令は、例えば、コンパクションリード命令、パトロールリード命令などを含む。コンパクションリード命令は、コンパクション処理においてメモリセルアレイ５０における有効クラスタのデータを集める処理に用いられる。コンパクション処理では、メモリセルアレイ５０における有効クラスタ数が小さいブロックからコンパクションリードで集められたデータが他のブロックに書き直される。これにより、メモリセルアレイ５０におけるブロックの利用効率を向上できる。パトロールリード命令は、リフレッシュ処理のためのパトロール処理に用いられる。パトロール処理では、各メモリセルに蓄積されたビット誤りの程度を評価する(たとえば、パトロールリードして誤り訂正を試みる)ことで、リフレッシュ対象ブロックの選択を行う。リフレッシュ処理では、選択されたリフレッシュ対象ブロックに含まれるデータを読み出し、誤り訂正を施した上で、ほかのブロック(あるいはリフレッシュ対象ブロック)に書き直す。これにより、メモリセルアレイ５０に格納されたデータの信頼性を向上できる。
【００７３】
スレッド割当部２５２は、ホストシステム１０から受けたリードコマンド又はバックグランド処理部２５７から受けたバックグランドリード命令に応じて、並行して実行すべき複数のリード処理が存在する場合、複数のリード処理のそれぞれにスレッドを振り分ける。
【００７４】
スレッド判定部２５３は、各スレッドについて、中間バッファに格納されたページデータの再利用性を判定する（例えば、リードコマンドのシーケンシャル性を判定する）。
【００７５】
例えば、スレッド判定部２５３は、スレッドごとに、複数のリードコマンドの論理アドレスの連続性に基づいて、そのスレッドのリードコマンドのシーケンシャル性を判定する。具体的には、スレッド判定部２５３は、スレッドごとに、ホストから並行して受けた複数のリードコマンドの論理アドレスを比較する。複数のリードコマンドの論理アドレスが連続している又はほぼ連続していると見なせる場合、将来にわたりシーケンシャルなアクセスが来るであろうと予測できる。スレッド判定部２５３は、複数のリードコマンドの論理アドレスの連続性が高い場合、リードコマンドのシーケンシャル性が高いと判定する。その結果、スレッド判定部２５３は、そのスレッドについてページデータの再利用性が高いと判定する。スレッド判定部２５３は、複数のリードコマンドの論理アドレスの連続性が低い（不連続性が高い）場合、リードコマンドのシーケンシャル性が低いと判定する。その結果、スレッド判定部２５３は、そのスレッドについてページデータの再利用性が低いと判定する。
【００７６】
コンテキスト割当部２５４は、中間バッファに格納されたページデータの再利用性が高い（例えば、リードコマンドのシーケンシャル性が高い）とスレッド判定部２５３で判定されたスレッドごとに、コンテキストを割り当てる。コンテキスト割当部２５４は、スレッドの数がコンテキストの数よりも大きい場合、単位時間あたりに要求されるデータ量が多いスレッドに優先的にコンテキストを割り当ててもよい。例えば、コンテキスト割当部２５４は、スレッドＡにコンテキストＡを割り当て、スレッドＢにコンテキストＢを割り当てる。各コンテキストは、中間バッファに対応している。例えば、スレッドＡが中間バッファ（ＡＤＬ４７）に対応し、スレッドＢが中間バッファ（ＢＤＬ４８）に対応している。
【００７７】
具体的には、バッファ判定部２５５は、ＡＤＬ状態管理レジスタ２５５ａ、ＢＤＬ状態管理レジスタ２５５ｂ、及びＸＤＬ状態管理レジスタ２５５ｃを有する。バッファ判定部２５５は、スレッドが割り当てられたコンテキストに対応する中間バッファ（ＡＤＬ４７，ＢＤＬ４８）の状態と入出力バッファ（ＸＤＬ４９）の状態とをトラッキングし、ページキャッシュヒットの判定を行う。ページキャッシュヒットの判定には、データが有効であるかどうかの判定と、リードコマンドで要求されるデータと同じページのデータがキャッシュされているか否かの判定とが含まれる。
【００７８】
ＡＤＬ状態管理レジスタ２５５ａは、有効フラグ２５５ａ１を含む。有効フラグ２５５ａ１は、有効を示すビット値（例えば、「１」）又は無効を示すビット値（例えば、「０」）を格納し、ＡＤＬ４７に格納されたページデータが有効なデータであるか無効なデータ（キャッシュミスとして扱うべきデータ）であるかを示す。ＡＤＬ状態管理レジスタ２５５ａは、有効フラグ２５５ａ１が有効を示すビット値を格納する場合、物理ページアドレス２５５ａ２をさらに含む。物理ページアドレス２５５ａ２は、ＡＤＬ４７に格納されたページデータに対応する物理ページアドレスである。ＡＤＬ状態管理レジスタ２５５ａは、有効フラグ２５５ａ１が無効を示すビット値を格納する場合、物理ページアドレス２５５ａ２を含まなくてもよい。なお、ＡＤＬ状態管理レジスタ２５５ａは、有効フラグを、物理ページアドレスと独立して含まなくてもよい。かわりに、ＡＤＬ状態管理レジスタ２５５ａは、物理ページアドレスに既定の特殊な値を格納することで、ＡＤＬ４７に格納されたページデータが無効なデータであることを示してもよい。
【００７９】
ＢＤＬ状態管理レジスタ２５５ｂは、ＡＤＬ状態管理レジスタ２５５ａと基本的に同様であり、ＢＤＬ４８に格納されたページデータが有効か否かを示す有効フラグ２５５ｂ１を含み、ＢＤＬ４８物理ページアドレス２５５ｂ２を含んでもよい。物理ページアドレス２５５ｂ２は、ＢＤＬ４８に格納されたページデータに対応する物理ページアドレスである。
【００８０】
ＸＤＬ状態管理レジスタ２５５ｘは、ＡＤＬ状態管理レジスタ２５５ａと基本的に同様であり、ＸＤＬ４９に格納されたページデータが有効か否かを示す有効フラグ２５５ｘ１を含み、物理ページアドレス２５５ｘ２を含んでもよい。物理ページアドレス２５５ｘ２は、ＸＤＬ４９に格納されたページデータに対応する物理ページアドレスである。
【００８１】
ホストからリードコマンドを受けると、バッファ判定部２５５は、リードコマンドに含まれた論理アドレス（ＬＢＡ）に対して論物変換で得られた物理アドレスを取得する。バッファ判定部２５５は、その物理アドレスから物理ページアドレスを抽出し、抽出された物理ページアドレスを状態管理レジスタに含まれた物理ページアドレスと比較する。バッファ判定部２５５は、抽出された物理ページアドレスが状態管理レジスタに含まれた物理ページアドレスと同じであり且つそのバッファのページデータが有効なデータであれば、キャッシュヒットと判定する。バッファ判定部２５５は、抽出された物理ページアドレスが状態管理レジスタに含まれた物理ページアドレスと異なることとそのバッファのページデータが無効なデータであることとの少なくとも一方が満たされれば、キャッシュミスと判定する。バッファ判定部２５５は、キャッシュヒット・ミスの判定結果に基づいて、中間バッファの指定を含むコマンド（センスコマンド及び／又はラッチ間転送コマンド）の必要性の有無を判断する。具体的には、バッファ判定部２５５は、入出力バッファ（ＸＤＬ４９）でキャッシュヒットと判定した場合は、センスコマンドとラッチ間転送コマンドのいずれも必要ないと判断する。バッファ判定部２５５は、入出力バッファ（ＸＤＬ４９）でキャッシュミスと判定し、かつ、中間バッファ（ＡＤＬ４７あるいはＢＤＬ４８）のいずれかでキャッシュヒットと判定した場合は、センスコマンドは必要なく、ラッチ間転送コマンドが必要であると判断する。バッファ判定部２５５は、入出力バッファ・中間バッファのいずれにおいてもキャッシュミスと判定した場合は、センスコマンドの必要があると判断する。
【００８２】
コマンド発行部２５５は、キャッシュヒットの判定結果に基づいて、中間バッファの指定を含むコマンドの必要性があるとバッファ判定部２５５で判定されたコマンド（センスコマンド及び／又はラッチ間転送コマンド）を発行し不揮発性メモリ２１へ供給する。
【００８３】
また、コントローラ２５は、図７に示すような動作を行う。図７は、コントローラ２５の動作を示すフローチャートである。
【００８４】
コントローラ２５は、リードコマンド又はバックグランドリード命令を受けると（Ｓ１）、リードコマンド又はバックグランドリード命令に応じて、並行して実行すべき複数のリード処理が存在するかどうか判断する。
【００８５】
コントローラ２５は、並行して実行すべき複数のリード処理が存在する場合、複数のリード処理のそれぞれをスレッドに振り分ける（Ｓ２）。例えば、コントローラ２５は、ホストから並行して受けた複数のリードコマンド又はバックグランド命令について、ホストＩＤ、ストリームＩＤ、バックグランド命令であるか否かやバックグランド処理の種類（コンパクション、パトロールリードなど）等を根拠として、別個に扱うべきスレッドがあることを判定する。コントローラ２５は、スレッドごとに、中間バッファに格納されたデータの再利用性が高いか否かを判断する（Ｓ３）。例えば、コントローラ２５は、スレッドごとに、ホストから並行して受けた複数のリードコマンドの論理アドレスを比較する。複数のリードコマンドの論理アドレスが連続している又はほぼ連続していると見なせる場合、将来にわたりシーケンシャルなアクセスが来るであろうと予測できる。コントローラ２５は、複数のリードコマンドの論理アドレスの連続性が高い場合、複数のリードコマンドのシーケンシャル性が高いと判断し、その結果、そのスレッドについて中間バッファに格納されたデータの再利用性が高いと判断する（Ｓ３でＹｅｓ）。コントローラ２５は、複数のリードコマンドの論理アドレスの連続性が低い（不連続性が高い）場合、複数のリードコマンドのシーケンシャル性が低いと判断し、その結果、そのスレッドについて中間バッファに格納されたデータの再利用性が低いと判断する（Ｓ３でＮｏ）。なお、再利用性の判定の根拠は、リードコマンドに含まれる論理アドレスの連続性に限定されない。例えば、バックグラウンド処理におけるリード要求は、物理アドレスを含み、必ずしも論理アドレスを含まないが、コンパクション処理、パトロールリード処理等の処理の種類によって、対象の物理アドレスが連続していることが期待できる。そのため、スレッドが、特定の種類のバックグランド処理に対応することを根拠として、当該スレッドについて中間バッファに格納されたデータの再利用性が高いと判断してもよい。
【００８６】
コントローラ２５は、中間バッファに格納されたデータの再利用性が低い（例えば、スレッドのシーケンシャル性が低い）場合（Ｓ３でＮｏ）、通常のリード処理を行う（Ｓ４）。通常のリード処理では、コントローラ２５は、通常のセンスコマンド（すなわち、センス結果の格納先の明示的な指定をともなわないセンスコマンド）、データ転送コマンドを順次に発行して不揮発性メモリ２１へ供給し、リードデータを不揮発性メモリ２１から受ける。コントローラ２５は、受けたリードデータをホストシステム１０へ送信する。なお、通常のリード処理（Ｓ４）において、ＸＤＬ４９の状態をトラッキングしてページデータキャッシュの判定を行い、キャッシュヒットであれば、センス動作を省略し、ＸＤＬ４９のデータを再利用する処理を行ってもよい。
【００８７】
コントローラ２５は、中間バッファに格納されたデータの再利用性が高い（例えば、スレッドのシーケンシャル性が高い）場合（Ｓ３でＹｅｓ）、スレッドにコンテキストを割り当てる（Ｓ５）。スレッド数≧コンテキスト数＝中間バッファ数である場合、再利用性が高い（例えば、シーケンシャル性が高い）と判定された複数のスレッドのうち、コンテキスト数分までのスレッドにコンテキストを割り当てる。このとき、コントローラ２５は、複数のスレッドのうち単位時間当たりのアクセス量が多いスレッドに優先的にコンテキストを割り当ててもよい。例えば、コントローラ２５は、スレッドＡにコンテキストＡを割り当て、スレッドＢにコンテキストＢを割り当て、他のスレッドにコンテキストを割り当てない。
【００８８】
コントローラ２５は、処理対象のコンテキストがコンテキストＡであれば（Ｓ６で「コンテキストＡ」）、目的のデータが不揮発性メモリ２１におけるＡＤＬ４７にキャッシュされているか否か判断する（Ｓ１２）。コントローラ２５は、ＡＤＬ状態管理レジスタ２５５ａに格納された有効フラグ２５５ａ１を参照し、ＡＤＬ４７に格納されたデータが有効であるか否かを判断する。コントローラ２５は、有効であれば、ＡＤＬ状態管理レジスタ２５５ａに格納された物理ページアドレスと処理対象のリード命令の物理ページアドレスが一致するかどうか判断する。コントローラ２５は、ＡＤＬ４７に格納されたデータが無効であるか、又はＡＤＬ状態管理レジスタ２５５ａに格納された物理ページアドレスと処理対象のリード命令の物理ページアドレスとが一致しなければ、目的のデータがＡＤＬ４７にキャッシュされていないと判断する。コントローラ２５は、目的のデータがＡＤＬ４７にキャッシュされていない場合（Ｓ１２で「キャッシュミス」）、ＡＤＬ４７の指定を含むセンスコマンド（図５（ａ）に示すセンスコマンドＣＭ１参照）を発行して不揮発性メモリ２１へ供給する（Ｓ１３）。これにより、不揮発性メモリ２１では、センスコマンドでアドレス指定されたメモリセルからセンス動作で読み出されたデータがＡＤＬ４７に格納される。また、コントローラ２５は、ＡＤＬ状態管理レジスタ２５５ａを更新する。具体的には、コントローラ２５は、有効を示すビット値を有効フラグ２５５ａ１に設定し、リード命令の物理ページアドレスを物理ページアドレス２５５ａ２として格納する。
【００８９】
コントローラ２５は、ＡＤＬ４７に格納されたデータが有効であり且つＡＤＬ状態管理レジスタ２５５ａに格納された物理ページアドレスと処理対象のリード命令の物理ページアドレスが一致すれば、目的のデータがＡＤＬ４７にキャッシュされていると判断する。コントローラ２５は、目的のデータがＡＤＬ４７にキャッシュされている場合（Ｓ１２で「キャッシュヒット」）、さらに、目的のデータが不揮発性メモリ２１におけるＸＤＬ４９にキャッシュされているか否か判断する（Ｓ１４）。
【００９０】
コントローラ２５は、ＸＤＬ状態管理レジスタ２５５ｘに格納された有効フラグ２５５ｘ１を参照し、ＸＤＬ４９に格納されたデータが有効であるか否かを判断する。コントローラ２５は、有効であれば、ＸＤＬ状態管理レジスタ２５５ｘに格納された物理ページアドレスと処理対象のリード命令の物理ページアドレスが一致するかどうか判断する。コントローラ２５は、ＸＤＬ４９に格納されたデータが無効であるか、又はＸＤＬ状態管理レジスタ２５５ｘに格納された物理ページアドレスと処理対象のリード命令の物理ページアドレスとが一致しなければ、目的のデータがＸＤＬ４９にキャッシュされていないと判断し（Ｓ１４で「キャッシュミス」）Ｓ１５へ進む。コントローラ２５は、目的のデータがＸＤＬ４９にキャッシュされていない場合（Ｓ１２で「キャッシュミス」）、又は、Ｓ１３が完了した後、ＡＤＬ４７の指定を含むラッチ間転送コマンド（図５（ｃ）に示すラッチ間転送コマンドＣＭ３参照）を発行して不揮発性メモリ２１へ供給する（Ｓ１５）。これにより、不揮発性メモリ２１では、ＡＤＬ４７に格納されたデータがＸＤＬ４９へ転送されて格納される。また、コントローラ２５は、ＸＤＬ状態管理レジスタを更新する。具体的には、コントローラ２５は、有効を示すビット値を有効フラグ２５５ｘ１に設定し、物理ページアドレス２５５ａ２と同じ物理ページアドレスを物理ページアドレス２５５ｘ２として格納する。
【００９１】
コントローラ２５は、ＸＤＬ４９に格納されたデータが有効であり且つＸＤＬ状態管理レジスタ２５５ｘに格納された物理ページアドレスと処理対象のリード命令の物理ページアドレスが一致すれば、目的のデータがＸＤＬ４９にキャッシュされていると判断する。コントローラ２５は、目的のデータがＸＤＬ４９にキャッシュされている場合（Ｓ１４で「キャッシュヒット」）、又は、Ｓ１５が完了した後、データ転送コマンド（図５（ｃ）に示すデータ転送コマンドＣＭ４参照）を発行して不揮発性メモリ２１へ供給する（Ｓ１６）。これにより、不揮発性メモリ２１では、ＸＤＬ４９に格納されたデータのうちデータ転送コマンドでアドレス指定されたデータが入出力信号線３１ｂ経由でコントローラ２５へ出力される。コントローラ２５は、受けたリードデータをホストシステム１０へ送信する。
【００９２】
一方、コントローラ２５は、処理対象のコンテキストがコンテキストＢであれば（Ｓ６で「コンテキストＢ」）、目的のデータが不揮発性メモリ２１におけるＢＤＬ４８にキャッシュされているか否か判断する（Ｓ１７）。コントローラ２５は、ＢＤＬ状態管理レジスタ２５５ｂに格納された有効フラグ２５５ｂ１を参照し、ＢＤＬ４８に格納されたデータが有効であるか否かを判断する。コントローラ２５は、有効であれば、ＢＤＬ状態管理レジスタ２５５ｂに格納された物理ページアドレスと処理対象のリード命令の物理ページアドレスが一致するかどうか判断する。コントローラ２５は、ＢＤＬ４８に格納されたデータが無効であるか、又はＢＤＬ状態管理レジスタ２５５ｂに格納された物理ページアドレスと処理対象のリード命令の物理ページアドレスとが一致しなければ、目的のデータがＢＤＬ４８にキャッシュされていないと判断する。コントローラ２５は、目的のデータがＢＤＬ４８にキャッシュされていない場合（Ｓ１７で「キャッシュミス」）、ＢＤＬ４８の指定を含むセンスコマンド（図５（ｂ）に示すセンスコマンドＣＭ２参照）を発行して不揮発性メモリ２１へ供給する（Ｓ１８）。これにより、不揮発性メモリ２１では、センスコマンドでアドレス指定されたメモリセルからセンス動作で読み出されたデータがＢＤＬ４８に格納される。また、コントローラ２５は、ＢＤＬ状態管理レジスタを更新する。具体的には、コントローラ２５は、有効を示すビット値を有効フラグ２５５ｂ１に設定し、リード命令の物理ページアドレスを物理ページアドレス２５５ｂ２として格納する。
【００９３】
コントローラ２５は、ＢＤＬ４８に格納されたデータが有効であり且つＢＤＬ状態管理レジスタ２５５ｂに格納された物理ページアドレスと処理対象のリード命令の物理ページアドレスが一致すれば、目的のデータがＢＤＬ４８にキャッシュされていると判断する。コントローラ２５は、目的のデータがＢＤＬ４８にキャッシュされている場合（Ｓ１７で「キャッシュヒット」）、さらに、目的のデータが不揮発性メモリ２１におけるＸＤＬ４９にキャッシュされているか否か判断する（Ｓ１９）。
【００９４】
コントローラ２５は、ＸＤＬ状態管理レジスタ２５５ｘに格納された有効フラグ２５５ｘ１を参照し、ＸＤＬ４９に格納されたデータが有効であるか否かを判断する。コントローラ２５は、有効であれば、ＸＤＬ状態管理レジスタ２５５ｘに格納された物理ページアドレス２５５ｘ２と処理対象のリード命令の物理ページアドレスが一致するかどうか判断する。コントローラ２５は、ＸＤＬ４９に格納されたデータが無効であるか、又はＸＤＬ状態管理レジスタ２５５ｘに格納された物理ページアドレス２５５ｘ２と処理対象のリード命令の物理ページアドレスとが一致しなければ、目的のデータがＸＤＬ４９にキャッシュされていないと判断する。コントローラ２５は、目的のデータがＸＤＬ４９にキャッシュされていない場合（Ｓ１９で「キャッシュミス」）、又は、Ｓ１８が完了した後、ＢＤＬ４８の指定を含むラッチ間転送コマンド（図５（ｄ）に示すラッチ間転送コマンドＣＭ５参照）を発行して不揮発性メモリ２１へ供給する（Ｓ２０）。これにより、不揮発性メモリ２１では、ＢＤＬ４８に格納されたデータがＸＤＬ４９へ転送されて格納される。また、コントローラ２５は、ＸＤＬ状態管理レジスタを更新する。具体的には、コントローラ２５は、有効を示すビット値を有効フラグ２５５ｘ１に設定し、物理ページアドレス２５５ａ２と同じ物理ページアドレスを物理ページアドレス２５５ｘ２として格納する。
【００９５】
コントローラ２５は、ＸＤＬ４９に格納されたデータが有効であり且つＸＤＬ状態管理レジスタ２５５ｘに格納された物理ページアドレスと処理対象のリード命令の物理ページアドレスが一致すれば、目的のデータがＸＤＬ４９にキャッシュされていると判断する。コントローラ２５は、目的のデータがＸＤＬ４９にキャッシュされている場合（Ｓ１９で「キャッシュヒット」）、又は、Ｓ２０が完了した後、データ転送コマンド（図５（ｄ）に示すデータ転送コマンドＣＭ６参照）を発行して不揮発性メモリ２１へ供給する（Ｓ２１）。これにより、不揮発性メモリ２１では、ＸＤＬ４９に格納されたデータのうちデータ転送コマンドでアドレス指定されたデータが入出力信号線３１ｂ経由でコントローラ２５へ出力される。コントローラ２５は、受けたリードデータをホストシステム１０へ送信する。
【００９６】
Ｓ３で説明したような、並行して実行すべき複数のリード処理が存在する場合として、例えば、図８に示す場合が考えられる。図８は、複数のスレッドに関する情報処理システム１の動作例を示すシーケンス図である。図８では、コントローラ２５が複数のホストシステム１０−１，１０−２からリードコマンドを並行に（例えば、交互に）受ける場合が例示されている。
【００９７】
例えば、コントローラ２５は、ホストシステム１０−１からリードコマンド（ホストＩＤ＝Ｈ１、ＬＢＡ＝Ａ１）を受けると（Ｓ３１）、リードコマンドに含まれたホストＩＤ＝Ｈ１を抽出する。コントローラ２５は、抽出されたホストＩＤ＝Ｈ１にスレッドＡを割り当てる（Ｓ３２）。
【００９８】
続いて、コントローラ２５は、ホストシステム１０−２からリードコマンド（ホストＩＤ＝Ｈ２、ＬＢＡ＝Ａ１１）を受けると（Ｓ３３）、リードコマンドに含まれたホストＩＤ＝Ｈ２を抽出する。コントローラ２５は、抽出されたホストＩＤ＝Ｈ２にスレッドＢを割り当てる（Ｓ３４）。
【００９９】
これに応じて、コントローラ２５は、ホストシステム１０−１からリードコマンド（ホストＩＤ＝Ｈ１、ＬＢＡ＝Ａ２）を受けると（Ｓ３５）、そのリードコマンドをスレッドＡのリードコマンドとして処理する。
【０１００】
コントローラ２５は、ホストシステム１０−２からリードコマンド（ホストＩＤ＝Ｈ２、ＬＢＡ＝Ａ１２）を受けると（Ｓ３６）、そのリードコマンドをスレッドＢのリードコマンドとして処理する。
【０１０１】
コントローラ２５は、ホストシステム１０−１からリードコマンド（ホストＩＤ＝Ｈ１、ＬＢＡ＝Ａ３）を受けると（Ｓ３７）、そのリードコマンドをスレッドＡのリードコマンドとして処理する。
【０１０２】
コントローラ２５は、ホストシステム１０−２からリードコマンド（ホストＩＤ＝Ｈ２、ＬＢＡ＝Ａ１３）を受けると（Ｓ３８）、そのリードコマンドをスレッドＢのリードコマンドとして処理する。
【０１０３】
コントローラ２５は、ホストシステム１０−１からリードコマンド（ホストＩＤ＝Ｈ１、ＬＢＡ＝Ａ４）を受けると（Ｓ３９）、そのリードコマンドをスレッドＡのリードコマンドとして処理する。
【０１０４】
コントローラ２５は、ホストシステム１０−２からリードコマンド（ホストＩＤ＝Ｈ２、ＬＢＡ＝Ａ１４）を受けると（Ｓ４０）、そのリードコマンドをスレッドＢのリードコマンドとして処理する。
【０１０５】
あるいは、並行して実行すべき複数のリード処理が存在する場合として、例えば、図９に示す場合が考えられる。図９は、複数のスレッドに関する情報処理システム１の他の動作例を示すシーケンス図である。図９では、コントローラ２５がホストシステム１０からマルチストリーム処理によるリードコマンドを連続的に受ける場合が例示されている。
【０１０６】
例えば、コントローラ２５は、ホストシステム１０からストリーム制御要求（ストリームＩＤ＝ＳＩ１）を受けると（Ｓ４１）、ストリームＩＤ＝ＳＩ１にスレッドＡを割り当てる（Ｓ４２）。
【０１０７】
続いて、コントローラ２５は、ホストシステム１０からストリーム制御要求（ストリームＩＤ＝ＳＩ２）を受けると（Ｓ４３）、ストリームＩＤ＝ＳＩ２にスレッドＢを割り当てる（Ｓ４４）。
【０１０８】
これに応じて、コントローラ２５は、ホストシステム１０からリードコマンド（ストリームＩＤ＝ＳＩ１、ＬＢＡ＝Ａ１）を受けると（Ｓ４５）、そのリードコマンドをスレッドＡのリードコマンドとして処理する。
【０１０９】
コントローラ２５は、ホストシステム１０からリードコマンド（ストリームＩＤ＝ＳＩ２、ＬＢＡ＝Ａ１１）を受けると（Ｓ４６）、そのリードコマンドをスレッドＢのリードコマンドとして処理する。
【０１１０】
コントローラ２５は、ホストシステム１０からリードコマンド（ストリームＩＤ＝ＳＩ１、ＬＢＡ＝Ａ２）を受けると（Ｓ４７）、そのリードコマンドをスレッドＡのリードコマンドとして処理する。
【０１１１】
コントローラ２５は、ホストシステム１０からリードコマンド（ストリームＩＤ＝ＳＩ２、ＬＢＡ＝Ａ１２）を受けると（Ｓ４８）、そのリードコマンドをスレッドＢのリードコマンドとして処理する。
【０１１２】
コントローラ２５は、ホストシステム１０からリードコマンド（ストリームＩＤ＝ＳＩ１、ＬＢＡ＝Ａ３）を受けると（Ｓ４９）、そのリードコマンドをスレッドＡのリードコマンドとして処理する。
【０１１３】
コントローラ２５は、ホストシステム１０からリードコマンド（ストリームＩＤ＝ＳＩ２、ＬＢＡ＝Ａ１３）を受けると（Ｓ５０）、そのリードコマンドをスレッドＢのリードコマンドとして処理する。
【０１１４】
コントローラ２５は、ホストシステム１０からリードコマンド（ストリームＩＤ＝ＳＩ１、ＬＢＡ＝Ａ４）を受けると（Ｓ５１）、そのリードコマンドをスレッドＡのリードコマンドとして処理する。
【０１１５】
コントローラ２５は、ホストシステム１０からリードコマンド（ストリームＩＤ＝ＳＩ２、ＬＢＡ＝Ａ１４）を受けると（Ｓ５２）、そのリードコマンドをスレッドＢのリードコマンドとして処理する。
【０１１６】
あるいは、並行して実行すべき複数のリード処理が存在する場合として、例えば、図１０に示す場合が考えられる。図１０は、複数のスレッドに関する情報処理システム１のさらに他の動作例を示すシーケンス図である。図１０では、リード処理部２５１がホストシステム１０からリードコマンドを受けるとともにバックグランド処理部２５７からバックグランドリード命令を受ける場合が例示されている。
【０１１７】
例えば、リード処理部２５１は、ホストシステム１０からリードコマンド（ＬＢＡ＝Ａ１）を受けると（Ｓ６１）、リードコマンドにスレッドＡを割り当てる（Ｓ６２）。
【０１１８】
続いて、リード処理部２５１は、バックグランド処理部２５７からバックグランドリード命令（ＬＢＡ＝Ａ１１）を受けると（Ｓ６３）、バックグランドリード命令にスレッドＢを割り当てる（Ｓ６４）。
【０１１９】
これに応じて、リード処理部２５１は、ホストシステム１０からリードコマンド（ＬＢＡ＝Ａ２）を受けると（Ｓ６５）、そのリードコマンドをスレッドＡのリードコマンドとして処理する。
【０１２０】
リード処理部２５１は、バックグランド処理部２５７からバックグランドリード命令（ＬＢＡ＝Ａ１２）を受けると（Ｓ６６）、そのバックグランドリード命令をスレッドＢのバックグランドリード命令として処理する。
【０１２１】
リード処理部２５１は、ホストシステム１０−１からリードコマンド（ＬＢＡ＝Ａ３）を受けると（Ｓ３７）、そのリードコマンドをスレッドＡのリードコマンドとして処理する。
【０１２２】
リード処理部２５１は、バックグランド処理部２５７からバックグランドリード命令（ＬＢＡ＝Ａ１３）を受けると（Ｓ３８）、そのバックグランドリード命令をスレッドＢのバックグランドリード命令として処理する。
【０１２３】
リード処理部２５１は、ホストシステム１０−１からリードコマンド（ＬＢＡ＝Ａ４）を受けると（Ｓ３９）、そのリードコマンドをスレッドＡのリードコマンドとして処理する。
【０１２４】
リード処理部２５１は、バックグランド処理部２５７からバックグランドリード命令（ＬＢＡ＝Ａ１４）を受けると（Ｓ４０）、そのバックグランドリード命令をスレッドＢのバックグランドリード命令として処理する。
【０１２５】
Ｓ１０の動作例として、スレッドＡのリードコマンドとスレッドＢのリードコマンドとを並行して交互に受けた場合、メモリシステム２０では、図１１に示すような動作が行われる。図１１は、メモリシステム２０の動作を示すシーケンス図である。図１１では、図示及び説明の簡略化のために、リードコマンドで要求されるデータサイズとデータ転送コマンドで指示されるデータサイズとがともにページサイズの１／４（１６ＫＢ×１／４＝４ＫＢ）である場合について例示する。
【０１２６】
例えば、コントローラ２５は、スレッドＡのリードコマンドについて、論理アドレスＡ１を物理アドレス（カラムアドレスＣ１，ロウアドレスＲ１）に変換し、ＡＤＬ４７の指定とロウアドレスＲ１とを含むセンスコマンドを発行して不揮発性メモリ２１へ供給する（Ｓ７１）。不揮発性メモリ２１がビジー状態からレディ状態になると、コントローラ２５は、ＡＤＬ４７の指定の指定を含むラッチ間転送コマンドを発行して不揮発性メモリ２１へ供給する（Ｓ７２）。不揮発性メモリ２１がビジー状態からレディ状態になると、コントローラ２５は、カラムアドレスＣ１を含むデータ転送コマンドを発行して不揮発性メモリ２１へ供給する（Ｓ７３）。これに応じて、コントローラ２５は、リードデータを不揮発性メモリ２１から受け、リードデータをホストシステム１０へ送信する（Ｓ７４）。
【０１２７】
コントローラ２５は、スレッドＢのリードコマンドについて、論理アドレスＡ１１を物理アドレス（カラムアドレスＣ１１，ロウアドレスＲ１１）に変換し、ＢＤＬ４８の指定とロウアドレスＲ１１とを含むセンスコマンドを発行して不揮発性メモリ２１へ供給する（Ｓ７５）。不揮発性メモリ２１がビジー状態からレディ状態になると、コントローラ２５は、ＢＤＬ４８の指定の指定を含むラッチ間転送コマンドを発行して不揮発性メモリ２１へ供給する（Ｓ７６）。不揮発性メモリ２１がビジー状態からレディ状態になると、コントローラ２５は、カラムアドレスＣ１１を含むデータ転送コマンドを発行して不揮発性メモリ２１へ供給する（Ｓ７７）。これに応じて、コントローラ２５は、リードデータを不揮発性メモリ２１から受け、リードデータをホストシステム１０へ送信する（Ｓ７８）。
【０１２８】
コントローラ２５は、スレッドＡのリードコマンドについて、論理アドレスＡ２を物理アドレス（カラムアドレスＣ２，ロウアドレスＲ１）に変換し、ＡＤＬ４７の指定の指定を含むラッチ間転送コマンドを発行して不揮発性メモリ２１へ供給する（Ｓ７９）。不揮発性メモリ２１がビジー状態からレディ状態になると、コントローラ２５は、カラムアドレスＣ２を含むデータ転送コマンドを発行して不揮発性メモリ２１へ供給する（Ｓ８０）。これに応じて、コントローラ２５は、リードデータを不揮発性メモリ２１から受け、リードデータをホストシステム１０へ送信する（Ｓ８１）。
【０１２９】
コントローラ２５は、スレッドＢのリードコマンドについて、論理アドレスＡ１２を物理アドレス（カラムアドレスＣ１２，ロウアドレスＲ１１）に変換し、ＢＤＬ４８の指定の指定を含むラッチ間転送コマンドを発行して不揮発性メモリ２１へ供給する（Ｓ８２）。不揮発性メモリ２１がビジー状態からレディ状態になると、コントローラ２５は、カラムアドレスＣ２を含むデータ転送コマンドを発行して不揮発性メモリ２１へ供給する（Ｓ８３）。これに応じて、コントローラ２５は、リードデータを不揮発性メモリ２１から受け、リードデータをホストシステム１０へ送信する（Ｓ８４）。
【０１３０】
コントローラ２５は、スレッドＡのリードコマンドについて、論理アドレスＡ３を物理アドレス（カラムアドレスＣ３，ロウアドレスＲ１）に変換し、ＡＤＬ４７の指定の指定を含むラッチ間転送コマンドを発行して不揮発性メモリ２１へ供給する（Ｓ８５）。不揮発性メモリ２１がビジー状態からレディ状態になると、コントローラ２５は、カラムアドレスＣ３を含むデータ転送コマンドを発行して不揮発性メモリ２１へ供給する（Ｓ８６）。これに応じて、コントローラ２５は、リードデータを不揮発性メモリ２１から受け、リードデータをホストシステム１０へ送信する（Ｓ８７）。
【０１３１】
コントローラ２５は、スレッドＢのリードコマンドについて、論理アドレスＡ１３を物理アドレス（カラムアドレスＣ１３，ロウアドレスＲ１１）に変換し、ＢＤＬ４８の指定の指定を含むラッチ間転送コマンドを発行して不揮発性メモリ２１へ供給する（Ｓ８８）。不揮発性メモリ２１がビジー状態からレディ状態になると、コントローラ２５は、カラムアドレスＣ１３を含むデータ転送コマンドを発行して不揮発性メモリ２１へ供給する（Ｓ８９）。これに応じて、コントローラ２５は、リードデータを不揮発性メモリ２１から受け、リードデータをホストシステム１０へ送信する（Ｓ９０）。
【０１３２】
コントローラ２５は、スレッドＡのリードコマンドについて、論理アドレスＡ４を物理アドレス（カラムアドレスＣ４，ロウアドレスＲ１）に変換し、ＡＤＬ４７の指定の指定を含むラッチ間転送コマンドを発行して不揮発性メモリ２１へ供給する（Ｓ９１）。不揮発性メモリ２１がビジー状態からレディ状態になると、コントローラ２５は、カラムアドレスＣ４を含むデータ転送コマンドを発行して不揮発性メモリ２１へ供給する（Ｓ９２）。これに応じて、コントローラ２５は、リードデータを不揮発性メモリ２１から受け、リードデータをホストシステム１０へ送信する（Ｓ９３）。
【０１３３】
コントローラ２５は、スレッドＢのリードコマンドについて、論理アドレスＡ１４を物理アドレス（カラムアドレスＣ１４，ロウアドレスＲ１１）に変換し、ＢＤＬ４８の指定の指定を含むラッチ間転送コマンドを発行して不揮発性メモリ２１へ供給する（Ｓ９４）。不揮発性メモリ２１がビジー状態からレディ状態になると、コントローラ２５は、カラムアドレスＣ１４を含むデータ転送コマンドを発行して不揮発性メモリ２１へ供給する（Ｓ９５）。これに応じて、コントローラ２５は、リードデータを不揮発性メモリ２１から受け、リードデータをホストシステム１０へ送信する（Ｓ９６）。
【０１３４】
Ｓ７１〜Ｓ９６の処理についてメモリチップ４０の動作を示すと図１２のようになる。図１２は、不揮発性メモリ２１の動作を示す図である。
【０１３５】
タイミングｔ１において、不揮発性メモリ２１は、センスコマンド（ＡＤＬ，Ｒ１）に応じて、メモリセルアレイ５０におけるロウアドレスＲ１に対応するページｍからセンス動作で読み出された１６ＫＢのデータをＡＤＬ４７へ格納する。
【０１３６】
タイミングｔ２において、不揮発性メモリ２１は、ラッチ間転送コマンド（ＡＤＬ）に応じて、ＡＤＬ４７に格納された１６ＫＢのデータをＸＤＬ４９へ転送して格納する。
【０１３７】
タイミングｔ３において、不揮発性メモリ２１は、データ転送コマンド（Ｃ１）に応じて、ＸＤＬ４９に格納された１６ＫＢのデータのうちアドレス指定された４ＫＢのデータ（例えば、１６ＫＢのうちの最初の４ＫＢのデータ）を入出力信号線３１ｂ経由でコントローラ２５へ出力する。
【０１３８】
タイミングｔ４において、不揮発性メモリ２１は、センスコマンド（ＢＤＬ，Ｒ１１）に応じて、メモリセルアレイ５０におけるロウアドレスＲ１１に対応するページｎからセンス動作で読み出された１６ＫＢのデータをＢＤＬ４８へ格納する。
【０１３９】
タイミングｔ５において、不揮発性メモリ２１は、ラッチ間転送コマンド（ＢＤＬ）に応じて、ＢＤＬ４８に格納された１６ＫＢのデータをＸＤＬ４９へ転送して格納する。
【０１４０】
タイミングｔ６において、不揮発性メモリ２１は、データ転送コマンド（Ｃ１１）に応じて、ＸＤＬ４９に格納された１６ＫＢのデータのうちアドレス指定された４ＫＢのデータ（例えば、１６ＫＢのうちの最初の４ＫＢのデータ）を入出力信号線３１ｂ経由でコントローラ２５へ出力する。
【０１４１】
タイミングｔ７において、不揮発性メモリ２１は、ラッチ間転送コマンド（ＡＤＬ）に応じて、ＡＤＬ４７に格納された１６ＫＢのデータをＸＤＬ４９へ転送して格納する。
【０１４２】
タイミングｔ８において、不揮発性メモリ２１は、データ転送コマンド（Ｃ２）に応じて、ＸＤＬ４９に格納された１６ＫＢのデータのうちアドレス指定された４ＫＢのデータを入出力信号線３１ｂ経由でコントローラ２５へ出力する。
【０１４３】
タイミングｔ９において、不揮発性メモリ２１は、ラッチ間転送コマンド（ＢＤＬ）に応じて、ＢＤＬ４８に格納された１６ＫＢのデータをＸＤＬ４９へ転送して格納する。
【０１４４】
タイミングｔ１０において、不揮発性メモリ２１は、データ転送コマンド（Ｃ１２）に応じて、ＸＤＬ４９に格納された１６ＫＢのデータのうちアドレス指定された４ＫＢのデータを入出力信号線３１ｂ経由でコントローラ２５へ出力する。
【０１４５】
タイミングｔ１１において、不揮発性メモリ２１は、ラッチ間転送コマンド（ＡＤＬ）に応じて、ＡＤＬ４７に格納された１６ＫＢのデータをＸＤＬ４９へ転送して格納する。
【０１４６】
タイミングｔ１２において、不揮発性メモリ２１は、データ転送コマンド（Ｃ３）に応じて、ＸＤＬ４９に格納された１６ＫＢのデータのうちアドレス指定された４ＫＢのデータを入出力信号線３１ｂ経由でコントローラ２５へ出力する。
【０１４７】
タイミングｔ１３において、不揮発性メモリ２１は、ラッチ間転送コマンド（ＢＤＬ）に応じて、ＢＤＬ４８に格納された１６ＫＢのデータをＸＤＬ４９へ転送して格納する。
【０１４８】
タイミングｔ１４において、不揮発性メモリ２１は、データ転送コマンド（Ｃ１３）に応じて、ＸＤＬ４９に格納された１６ＫＢのデータのうちアドレス指定された４ＫＢのデータを入出力信号線３１ｂ経由でコントローラ２５へ出力する。
【０１４９】
タイミングｔ１５において、不揮発性メモリ２１は、ラッチ間転送コマンド（ＡＤＬ）に応じて、ＡＤＬ４７に格納された１６ＫＢのデータをＸＤＬ４９へ転送して格納する。
【０１５０】
タイミングｔ１６において、不揮発性メモリ２１は、データ転送コマンド（Ｃ４）に応じて、ＸＤＬ４９に格納された１６ＫＢのデータのうちアドレス指定された４ＫＢのデータ（例えば、１６ＫＢのうちの最後の４ＫＢのデータ）を入出力信号線３１ｂ経由でコントローラ２５へ出力する。
【０１５１】
タイミングｔ１７において、不揮発性メモリ２１は、ラッチ間転送コマンド（ＢＤＬ）に応じて、ＢＤＬ４８に格納された１６ＫＢのデータをＸＤＬ４９へ転送して格納する。
【０１５２】
タイミングｔ１８において、不揮発性メモリ２１は、データ転送コマンド（Ｃ１４）に応じて、ＸＤＬ４９に格納された１６ＫＢのデータのうちアドレス指定された４ＫＢのデータ（例えば、１６ＫＢのうちの最後の４ＫＢのデータ）を入出力信号線３１ｂ経由でコントローラ２５へ出力する。
【０１５３】
図１２に示されるように、実施形態では、中間バッファ（ＡＤＬ４７，ＢＤＬ４８）及び入出力バッファ（ＸＤＬ４９）を使用したリード処理を行う。すなわち、複数のスレッドについて並行して受けた各リードコマンドについて、目的のデータのページアドレスが中間バッファ（ＡＤＬ４７，ＢＤＬ４８）に格納されたデータのページアドレスと一致した場合に、中間バッファ（ＡＤＬ４７，ＢＤＬ４８）及び入出力バッファ（ＸＤＬ４９）の両方を利用したキャッシュ処理を行う。これにより、中間バッファ（ＡＤＬ４７，ＢＤＬ４８）のデータを再利用しながらリード処理を行う。この結果、複数のスレッドについて並行して受けた複数のリードコマンドに対してであっても、センス動作の発生回数を抑制しながら、不揮発性メモリ２１からコントローラ２５へリードデータを転送可能である。例えば、図１２の場合、ＡＤＬ４７を使用するスレッドとＢＤＬ４８を使用するスレッドとを交互に受けた場合に、不揮発性メモリ２１からコントローラ２５への８回のリードデータ転送について、センス動作の回数が２回に抑えられている。これをコマンド処理時間について比較例と比較してみると、図１３に示すようになる。図１３は、コマンドの処理時間を示す図である。図１３に示す比較例は、図７のＳ３の分岐を常時Ｎｏとした場合と同じであり、中間バッファ（ＡＤＬ４７，ＢＤＬ４８）を使用せずに入出力バッファ（ＸＤＬ４９）を使用したリード処理を行う動作となる。このため、比較例では（すなわち、図７のＳ３の分岐を常時Ｎｏとした場合には）、リードデータ転送について毎回センス動作が発生する。図１３の場合、不揮発性メモリ２１からコントローラ２５への８回のリードデータ転送についてセンス動作の回数が８回になっている。比較例では、センス動作の回数が多いことなどにより、複数のスレッドについて並行して受けた複数のリードコマンドに対して不揮発性メモリ２１が最初のコマンドを受信してから最後のコマンドの処理を完了するまでの時間（複数スレッドの複数コマンドのトータルの処理時間）が長くなりやすい。比較例に比べると、本実施形態では、データのページアドレスが中間バッファに格納されたデータのページアドレスと一致した場合に中間バッファ（ＡＤＬ４７，ＢＤＬ４８）のデータを再利用することで、センス動作の回数が少なくなり、複数スレッドの複数コマンドのトータルの処理時間が短縮されている。例えば、本実施形態では、８回のリードデータ転送についてセンス動作の回数を２回に抑えることで、複数スレッドの複数コマンドのトータルの処理時間がΔＴ分短縮される。なお、前記比較例において、さらにＸＤＬ４９に関するキャッシュ処理を加えた第２の比較例を考えることができる。第２の比較例では、単一のスレッドのシーケンシャルリードアクセスに対して、センス動作の回数を抑制することが可能であるが、複数のスレッドのシーケンシャルリードアクセスに対しては、複数のスレッド間でＸＤＬ４９のキャッシュに対するスラッシングが発生するため、センス動作の回数が増大する。このため、本実施形態は、第２の比較例と比較しても、複数スレッドの複数コマンドのトータルの処理時間が短縮される。
【０１５４】
以上のように、実施形態では、不揮発性メモリ２１を、複数のスレッドに複数の中間バッファ（例えば、ＡＤＬ４７，ＢＤＬ４８）を割り当て複数の中間バッファのうちコマンドで明示的に指定された中間バッファにデータを格納させコマンドで明示的に指定された中間バッファから入出力バッファにデータを転送して出力させるように構成する。これにより、複数のスレッドでのシーケンシャルリードコマンドに対して読み出し動作が容易に高速化される。したがって、複数スレッドのシーケンシャルリードにおいても、センス結果のスラッシングによる余分なセンス動作が発生せず、高い性能が発揮される。あるいは、コントローラ２５のリードバッファ２６ｃについて、同等の性能を発揮するために必要な容量を削減できる。
【０１５５】
また、実施形態では、メモリセルのプログラム動作で使用される中間バッファ（例えば、ＡＤＬ４７，ＢＤＬ４８）を流用して複数スレッドのリード処理が高速化されるので、不揮発性メモリ２１のコスト抑制と性能向上とを容易に両立できる。
【０１５６】
なお、各メモリチップ内がシングルプレーンで構成されリード処理がシングルプレーンリードで行われる場合を例示してきたが、本実施形態の考え方は、各メモリチップ内が並列にアクセスが可能な複数のプレーンを含みリード処理がマルチプレーンリードで行われる場合に適用してもよい。
【０１５７】
あるいは、本実施形態の考え方をＡＤＬ４７／ＢＤＬ４８←→ＸＤＬ４９の間のスワップ処理に適用してもよい。これにより、中間バッファを使用しない場合と比較して、入出力バッファ（ＸＤＬ４９）のデータ容量が仮想的に増える。
【０１５８】
あるいは、図７のＳ３において各スレッドで中間バッファのデータの再利用性が高いと判断される場合として、シーケンシャルリード、バックグランドリード（例えば、コンパクションリード、パトロールリード）を例示しているが、それ以外にも、４ＫＢより大きいリードサイズのランダムリードを含んでもよい。
【０１５９】
あるいは、図７のＳ３でＮｏと判断された場合であっても、リードコマンド又はバックグランドリード命令でアドレス指定されたデータが中間バッファ（例えば、ＡＤＬ４７，ＢＤＬ４８）に格納されている可能性がある場合に、Ｓ１２やＳ１７にジャンプして処理を行ってもよい。
【０１６０】
あるいは、図７のＳ３で例示されるリードコマンドのシーケンシャル性の判断の具体的なアルゴリズムとして、様々なアルゴリズムを用いられ得る。
【０１６１】
例えば、実施形態の第１の変形例として、図７のＳ３において図１４〜図１６に示すアルゴリズムを用いることができる。図１４は、実施形態の第１の変形例におけるリードコマンドのシーケンシャル性を判定するためのアルゴリズムを説明する模式図である。図１５は、実施形態の第１の変形例におけるシーケンシャル性を判定する動作を説明する図である。図１６は、実施形態の第１の変形例におけるシーケンシャル性判定テーブルの更新手順を説明するフローチャートである。
【０１６２】
まず、図１５（ａ）及び図１５（ｂ）を参照して、リードコマンドのシーケンシャル性を判定するためのアルゴリズムの概要を説明する。図１５（ａ）及び図１５（ｂ）は、リードコマンド（Ａ）〜リードコマンド（Ｅ）によって読み出しが要求されるデータ（以下、データ（Ａ）〜データ（Ｅ）と称する）の、開始ＬＢＡ、及び、転送数を示している。
【０１６３】
メモリシステム１のコントローラ２５は、ホストＩ／Ｆ２９から入力される開始ＬＢＡや転送数を用いて、リードコマンドのシーケンシャル性を判定する。コントローラ２５は、同一のストリームＩＤを有するリードコマンドで要求されるデータの、基準となる開始ＬＢＡを記憶する。すなわち、図１５（ａ）に示す例において、コントローラ２５は、読み出しが要求されるデータ（Ａ）の開始ＬＢＡを、基準開始ＬＢＡとして記憶する。コントローラ２５は、データ（Ａ）のＬＢＡ範囲と連続するＬＢＡ範囲を有するデータ（Ｂ）、データ（Ｂ）のＬＢＡ範囲と連続するＬＢＡ範囲を有するデータ（Ｃ）、データ（Ｃ）のＬＢＡ範囲と連続するＬＢＡ範囲を有するデータ（Ｄ）、データ（Ｄ）のＬＢＡ範囲と連続するＬＢＡ範囲を有するデータ（Ｅ）のそれぞれを要求するリードコマンドの転送数の累積数を記憶する。そして、データ（Ｄ）の読み出しを要求するリードコマンドの受信により、累積数があらかじめ設定されたシーケンシャル性判定閾値以上になると、コントローラ２５は、リードコマンドで読み出し要求されるデータのシーケンシャル性が高いと判定する。
【０１６４】
ホストシステム１０のリードコマンドの転送の仕方によっては、メモリシステム１のコントローラ２５は、シーケンシャル性が高いリードコマンドで要求されるデータを、ＬＢＡ順に受信できるとは限らない。図１５（ｂ）に示す例においては、コントローラ２５は、データ（Ｂ）、データ（Ａ）、データ（Ｃ）、データ（Ｄ）、データ（Ｅ）の順に読み出し要求するリードコマンドを受信している。コントローラ２５は、このように受信されたリードコマンドについても、シーケンシャル性を判定することができる。
【０１６５】
次に、図１５（ａ）〜図１５（ｇ）を参照して、シーケンシャル性を判定する動作の一例を説明する。シーケンシャル性判定テーブルは、コントローラ２５内に実装される。コントローラ２５は、シーケンシャル性判定テーブルを用いて、リードコマンドのシーケンシャル性を判定する。
【０１６６】
シーケンシャル性判定テーブルは、複数のエントリーを有する。第１の変形例においては、シーケンシャル性判定テーブルは、３つのエントリーを有する。１つのエントリーは、開始ＬＢＡと、最終ＬＢＡと、累積数と、世代番号と、を含む。また、シーケンシャル性判定テーブルは、シーケンシャル性判定フラグを有する。シーケンシャル性判定テーブルはストリームＩＤごとに管理される。すなわち、１つのストリームＩＤに対し、１つのシーケンシャル性判定テーブルが存在する。シーケンシャル性判定テーブルは、ストリーム制御コマンドに応じてストリームＩＤが割り当てられた時（図９参照）に、コントローラ２５によって初期化されてもよい。
【０１６７】
以下の説明ではシーケンシャル性判定閾値は０ｘ７００が設定されているものとする。
【０１６８】
図１５（ａ）は、シーケンシャル性判定テーブルが初期化された状態を示す。図では省略してあるが、すべてのエントリーの開始ＬＢＡ、最終ＬＢＡ、累積数、世代番号はゼロである。シーケンシャル性判定フラグはセットされていない。
【０１６９】
図１５（ｂ）は、図１５（ａ）の状態で開始ＬＢＡ＝０ｘ１０００から転送数＝０ｘ２００セクターのリードコマンドＡが受信された時のシーケンシャル性判定テーブルの状態を示す。エントリー０の開始ＬＢＡは０ｘ１０００、最終ＬＢＡは開始ＬＢＡ＋転送数−１なので、０ｘ１１ＦＦとなる。エントリー０の累積数は、登録されている累積値（０ｘ０００）に、リードコマンドＡの転送数（０ｘ２００）を足したもので、０ｘ２００になる。新規にコマンド情報が登録されたエントリーの世代番号は１になる。すなわち、エントリー０の世代番号は１になる。
【０１７０】
図１５（ｃ）は、図１５（ｂ）の状態で開始ＬＢＡ＝０ｘ１２００から転送数＝０ｘ１００セクターのリードコマンドＢが受信された時のシーケンシャル性判定テーブルの状態を示す。リードコマンドＢの開始ＬＢＡは、エントリー０の最終ＬＢＡと連続である。従って、リードコマンドＢの情報はエントリー０に登録される。エントリー０の開始ＬＢＡは０ｘ１０００のまま、最終ＬＢＡはリードコマンドＢの最終ＬＢＡである０ｘ１２ＦＦとなる。エントリー０の累積数は、登録されている累積値（０ｘ２００）に、リードコマンドＢの転送数（０ｘ１００）を足したもので、０ｘ３００になる。受信したコマンドのＬＢＡ範囲と連続するＬＢＡ範囲を有するエントリーの世代番号は１になる。すなわち、エントリー０の世代番号は１のままである。
【０１７１】
図１５（ｄ）は、図１５（ｃ）の状態で開始ＬＢＡ＝０ｘ１４００から転送数＝０ｘ２００セクターのリードコマンドＣが受信された時のシーケンシャル性判定テーブルの状態を示す。リードコマンドＣの開始ＬＢＡはエントリー０の最終ＬＢＡと連続ではない。この時、リードコマンドＣの情報は、エントリー１に登録される。エントリー１の開始ＬＢＡは０ｘ１４００、最終ＬＢＡは０ｘ１５ＦＦとなる。エントリー１の累積数は、登録されている累積値（０ｘ０００）に、リードコマンドＣの転送数（０ｘ２００）を足したもので、０ｘ２００になる。新規にコマンド情報が登録されたエントリーの世代番号は１になる。すなわち、エントリー１の世代番号は１になる。新規にコマンド情報が登録されたエントリー以外のエントリーのうち、累積数がゼロではないエントリーの世代番号は、１ずつインクリメントされる。すなわち、エントリー０の世代番号は２になる。
【０１７２】
図１５（ｅ）は、図１５（ｄ）の状態で開始ＬＢＡ＝０ｘ０Ｅ００から転送数＝０ｘ１００セクターのリードコマンドＤが受信された時のシーケンシャル性判定テーブルの状態を示す。リードコマンドＤの開始ＬＢＡはエントリー０の最終ＬＢＡ、及び、エントリー１の最終ＬＢＡのいずれとも連続ではない。この時、リードコマンドＤの情報は、エントリー２に登録される。エントリー２の開始ＬＢＡは０ｘ０Ｅ００、最終ＬＢＡは０ｘ０ＥＦＦとなる。エントリー２の累積数は、登録されている累積値（０ｘ０００）に、リードコマンドＤの転送数（０ｘ１００）を足したもので、０ｘ１００になる。新規にコマンド情報が登録されたエントリーの世代番号は１になる。すなわち、エントリー２の世代番号は１になる。新規にコマンド情報が登録されたエントリー以外のエントリーのうち、累積数がゼロではないエントリーの世代番号は、１ずつインクリメントされる。すなわち、エントリー０の世代番号は３になる。エントリー１の世代番号は２になる。
【０１７３】
図１５（ｆ）は、図１５（ｅ）の状態で開始ＬＢＡ＝０ｘ１３００から転送数＝０ｘ１００セクターのリードコマンドＥが受信された時のシーケンシャル性判定テーブルの状態を示す。リードコマンドＥの開始ＬＢＡはエントリー０の最終ＬＢＡと連続である。また、リードコマンドＥの最終ＬＢＡはエントリー１の開始ＬＢＡと連続である。この時、エントリー０の情報、エントリー１の情報、リードコマンドＥの情報はマージされて、開始ＬＢＡが小さいほうのエントリー、すなわちエントリー０に登録される。エントリー０の開始ＬＢＡは０ｘ１０００のままである。エントリー０の最終ＬＢＡはエントリー１の最終ＬＢＡであった０ｘ１５ＦＦとなる。エントリー０の累積数は、登録されている累積値（０ｘ３００）に、エントリー１の累積数（０ｘ２００）及びコマンドＥの転送数（０ｘ１００）を足したもので、０ｘ６００になる。マージされたエントリーのうち、開始ＬＢＡが小さいほうのエントリーの世代番号は１になる。すなわち、エントリー０の世代番号は１になる。マージされたエントリーのうち、開始ＬＢＡが大きいほうのエントリーはゼロに初期化される。すなわち、エントリー１は初期化される。マージされたエントリー以外のエントリーのうち、累積数がゼロではないエントリーの世代番号は、小さい世代番号を有するエントリーから順に、２、３、・・・と割り当てられる。すなわち、エントリー２の世代番号は１から２に書き換えられる。
【０１７４】
図１５（ｇ）は、図１５（ｆ）の状態で開始ＬＢＡ＝０ｘ０Ｆ００から転送数＝０ｘ１００セクターのリードコマンドＦが受信された時のシーケンシャル性判定テーブルの状態を示す。リードコマンドＦの開始ＬＢＡはエントリー２の最終ＬＢＡと連続である。また、リードコマンドＦの最終ＬＢＡはエントリー０の開始ＬＢＡと連続である。この時、エントリー０の情報、エントリー２の情報、リードコマンドＦの情報はマージされて、開始ＬＢＡが小さいほうのエントリー、すなわちエントリー２に登録される。エントリー２の開始ＬＢＡは０ｘ０Ｅ００のままである。エントリー２の最終ＬＢＡはエントリー０の最終ＬＢＡであった０ｘ１５ＦＦとなる。エントリー２の累積数は、登録されている累積値（０ｘ１００）に、エントリー０の累積数（０ｘ６００）及びコマンドＦの転送数（０ｘ１００）を足したもので、０ｘ８００になる。マージされたエントリーのうち、開始ＬＢＡが小さいエントリーの世代番号は１になる。すなわち、エントリー２の世代番号は１になる。マージされたエントリーのうち、開始ＬＢＡが大きいほうのエントリーはゼロに初期化される。すなわち、エントリー０は初期化される。
【０１７５】
ここで、エントリー２の累積数がシーケンシャル性判定閾値（０ｘ７００）以上となったので、シーケンシャル性判定フラグがセットされる。
【０１７６】
いずれのエントリーの累積数もゼロではない時に受信したコマンドのＬＢＡ範囲が、いずれのエントリーの開始ＬＢＡ又は最終ＬＢＡとも不連続である場合には、世代番号が最大のエントリーが初期化される。なお、この場合は累積数が最小のエントリーを初期化するようにしてもよい。そして、初期化されたエントリーに、受信したコマンドの情報が登録される。
【０１７７】
次に、図１６を参照して、コントローラ２５によるシーケンシャル性判定テーブルの更新手順を説明する。
【０１７８】
リードコマンドを受信すると（Ｓ３００）、コントローラ２５は、累積数がゼロではなく、かつ、受信したコマンドのＬＢＡ範囲と連続する開始ＬＢＡ又は最終ＬＢＡを有するエントリーがあるか否かを確認する（Ｓ３０１）。
【０１７９】
ＬＢＡが連続するエントリーがない場合（Ｓ３０１：Ｎｏ）、コントローラ２５は、累積数がゼロのエントリーがあるか否かを確認する（Ｓ３０２）。累積数がゼロのエントリーがある場合（Ｓ３０２：Ｙｅｓ）、コントローラ２５は、累積数がゼロであるエントリーのうち、エントリー番号が最小のエントリーにコマンド情報を登録する（Ｓ３０３）。この時、当該エントリーの世代番号は１にされる。その後、後述のＳ３０７が行われる。累積数がゼロのエントリーがない場合（Ｓ３０２：Ｎｏ）、コントローラ２５は、世代番号が最大であるエントリー、又は、累積数が最小であるエントリーを初期化する（Ｓ３０４）。その後、前述のＳ３０３が行われる。
【０１８０】
ＬＢＡが連続するエントリーがある場合（Ｓ３０１：Ｙｅｓ）、コントローラ２５は、マージ可能なエントリーがあるか否かを確認する（Ｓ３０５）。すなわち、受信したコマンドの開始ＬＢＡと連続する最終ＬＢＡを有するエントリー（第１のエントリー）と、受信したコマンドの最終ＬＢＡと連続する開始ＬＢＡを有するエントリー（第２のエントリー）、の両方があるか否かを確認する。
【０１８１】
マージ可能なエントリーがない場合、すなわち、第１のエントリー又は第２のエントリーのうち、いずれか一方のみが存在する場合（Ｓ３０５：Ｎｏ）、コントローラ２５は、第１のエントリー又は第２のエントリーに、コマンド情報を登録する（Ｓ３０６）。具体的には、第１のエントリーにコマンド情報が登録される第１の場合には、第１のエントリーの開始ＬＢＡは変更されず、第１のエントリーの最終ＬＢＡには受信したコマンドの最終ＬＢＡが登録される。また、第２のエントリーにコマンド情報が登録される第２の場合には、第２のエントリーの開始ＬＢＡには受信したコマンドの開始ＬＢＡが登録され、第２のエントリーの最終ＬＢＡは変更されない。第１の場合、及び、第２の場合のいずれにおいても、当該エントリーの累積数は受信したコマンドの転送数が加えられ、当該エントリーの世代番号は１にされる。また、登録対象ではないエントリーのうち、累積数がゼロではないエントリーの世代番号は１ずつインクリメントされる（Ｓ３０７）。その後、後述のＳ３１０が行われる。
【０１８２】
マージ可能なエントリーがある場合、すなわち、第１のエントリー及び第２のエントリーの両方が存在する場合（Ｓ３０５：Ｙｅｓ）、コントローラ２５は、第１のエントリーに、第２のエントリーの情報、及び、コマンド情報をマージして登録する（Ｓ３０８）。すなわち、第１のエントリーの開始ＬＢＡは変更されない。第１のエントリーの最終ＬＢＡには、第２のエントリーの最終ＬＢＡが登録される。第１のエントリーの累積数には、第１のエントリーの累積数と第２のエントリーの累積数の合計に、受信したコマンドの転送数を加えた値が登録される。第１のエントリーの世代番号は１にされる。また、マージ対象ではないエントリーのうち、累積数がゼロではないエントリーの世代番号は、世代番号の小さい順に２、３、・・・と再割り当てされる（Ｓ３０９）。
【０１８３】
なお、マージ可能なエントリーがない場合（Ｓ３０５：Ｎｏ）、マージ可能なエントリーがある場合（Ｓ３０５：Ｙｅｓ）のいずれの場合においても、第１のエントリーが２つ以上存在する場合、又は、第２のエントリーが２つ以上存在する場合がある。この場合、コントローラ２５は、例えば２つ以上存在する第１のエントリー（又は２つ以上存在する第２のエントリー）のうち、いずれか１つを選択し、上記の処理を行う。
【０１８４】
次にコントローラ２５は、いずれかのエントリーの累積数がシーケンシャル性判定閾値以上となったか否かを確認する（Ｓ３１０）。コントローラ２５は、該当するエントリーが無い場合（Ｓ３１０：Ｎｏ）、処理を終了し、該当するエントリーがある場合（Ｓ３１０：Ｙｅｓ）、シーケンシャル性判定フラグをセットする（Ｓ３１１）。この後、処理が終了される。その結果、シーケンシャル性判定フラグがセットされたストリーム（及びそのストリームに属するリードコマンド群）は、シーケンシャル性があると判定される。
【０１８５】
あるいは、ホストがリードコマンドにストリームIDを付加しない状況であっても、メモリシステムがリードコマンドのアドレスの連続性を判定することで、リードコマンドを1以上のシーケンシャルなストリームのいずれかへと分類してもよい。例えば、実施形態の第２の変形例として、図７のＳ３において図１４、図１６、図１７に示すアルゴリズムを用いることができる。図１７は、実施形態の第２の変形例におけるシーケンシャル性を判定する動作を説明する図である。図１４は、実施形態の第１の変形例におけるリードコマンドのシーケンシャル性を判定するためのアルゴリズムを説明する模式図であるが、第２の変形例にも流用可能である。図１６は、実施形態の第１の変形例におけるシーケンシャル性判定テーブルの更新手順を説明するフローチャートであるが、第２の変形例にも流用可能である。
【０１８６】
第２の変形例においても、第１の変形例と同様、ホストＩ／Ｆ２９から入力される開始ＬＢＡや転送数を用いて、コントローラ２５がシーケンシャル性を判定する。シーケンシャル性の判定に用いられるアルゴリズムは、第１の変形例と同様である。すなわち、基準開始ＬＢＡからシーケンシャルにつながったデータの累積数がシーケンシャル性判定閾値以上になると、コントローラ２５は、このデータのシーケンシャル性が高いと判定する。第２の変形例においては、コントローラ２５は、シーケンシャル性が高いと判定されたリードコマンドに、ストリームＩＤを付加する。
【０１８７】
第１の変形例においては、１つのストリームＩＤに対し、１つのシーケンシャル性判定テーブルが存在した。これに対し第２の変形例においては、コントローラ２５に実装される１つのシーケンシャル性判定テーブルによって、リードコマンドのシーケンシャル性を判定する。
【０１８８】
図１７（ａ）〜図１７（ｈ）は、第２の変形例におけるシーケンシャル性を判定する動作の一例を説明する図である。シーケンシャル性判定テーブルは、複数のエントリーを有する。第２の変形例においては、シーケンシャル性判定テーブルは、３つのエントリーを有する。１つのエントリーは、開始ＬＢＡと、最終ＬＢＡと、累積数と、世代番号と、ストリームＩＤと、を含む。シーケンシャル性判定テーブルは、任意のタイミングでコントローラ２５によって初期化されてもよい。以下の説明ではシーケンシャル性判定閾値は０ｘ７００が設定されているものとする。
【０１８９】
図１７（ａ）は、シーケンシャル性判定テーブルが初期化された状態を示す。図では省略してあるが、すべてのエントリーの開始ＬＢＡ、最終ＬＢＡ、累積数、世代番号、ストリームＩＤ、はゼロである。
【０１９０】
図１７（ｂ）〜図１７（ｆ）は、図１５（ｂ）〜図１５（ｆ）とそれぞれ同様であるので、ここでは説明を省略する。
【０１９１】
図１７（ｇ）は、図１７（ｆ）の状態で開始ＬＢＡ＝０ｘ２０００から転送数＝０ｘ２００セクターのリードコマンドＦが発行された時のシーケンシャル性判定テーブルの状態を示す。リードコマンドＦの開始ＬＢＡはエントリー０の最終ＬＢＡ、及び、エントリー２の最終ＬＢＡと連続ではない。この時、リードコマンドＦの情報は、エントリー１に登録される。エントリー１の開始ＬＢＡは０ｘ２０００、最終ＬＢＡは０ｘ２１ＦＦとなる。エントリー１の累積数は、登録されている累積値（０ｘ０００）に、リードコマンドＦの転送数（０ｘ２００）を足したもので、０ｘ２００になる。新規にコマンド情報が登録されたエントリーの世代番号は１になる。すなわち、エントリー１の世代番号は１になる。新規にコマンド情報が登録されたエントリー以外のエントリーのうち、累積数がゼロではないエントリーの世代番号は、１ずつインクリメントされる。すなわち、エントリー０の世代番号は２になり、エントリー２の世代番号は３になる。
【０１９２】
図１７（ｈ）は、図１７（ｇ）の状態で開始ＬＢＡ＝０ｘ０Ｆ００から転送数＝０ｘ１００セクターのリードコマンドＧが発行された時のシーケンシャル性判定テーブルの状態を示す。リードコマンドＧの開始ＬＢＡはエントリー２の最終ＬＢＡと連続である。また、リードコマンドＦの最終ＬＢＡはエントリー０の開始ＬＢＡと連続である。この時、エントリー０の情報、エントリー２の情報、コマンドＦの情報はマージされて、開始ＬＢＡが小さいほうのエントリー、すなわちエントリー２に登録される。エントリー２の開始ＬＢＡは０ｘ０Ｅ００のままである。エントリー２の最終ＬＢＡはエントリー０の最終ＬＢＡであった０ｘ１５ＦＦとなる。エントリー２の累積数は、登録されている累積値（０ｘ１００）に、エントリー０の累積数（０ｘ６００）及びコマンドＦの転送数（０ｘ１００）を足したもので、０ｘ８００になる。マージされたエントリーのうち、開始ＬＢＡが小さいエントリーの世代番号は１になる。すなわち、エントリー２の世代番号は１になる。マージされたエントリーのうち、開始ＬＢＡが大きいほうのエントリーはゼロに初期化される。すなわち、エントリー０は初期化される。マージされたエントリー以外のエントリーのうち、累積数がゼロではないエントリーの世代番号は、小さい世代番号を有するエントリーから順に、２、３、・・・と割り当てられる。すなわち、エントリー１の世代番号は１から２に書き換えられる。
【０１９３】
ここで、エントリー２の累積数がシーケンシャル性判定閾値（０ｘ７００）以上となったので、エントリー２にストリームＩＤが割り当てられる。割り当てられるストリームＩＤは任意であるが、ここでは１が割り当てられている。ストリームＩＤが割り当てられたエントリーに属するデータには、当該ストリームＩＤが割り当てられる。
【０１９４】
累積数がシーケンシャル性判定閾値未満であるエントリーに属するデータ（ランダムライトデータ）には、ストリームＩＤが割り当てられない。すなわち、第２の変形例のコントローラ２５は、受信した複数のリードコマンドから、ストリームデータのリードコマンドとランダムリードデータのリードコマンドとを分離する。
【０１９５】
エントリー１についても、その後のリードコマンドの受信により、累積数がシーケンシャル性判定閾値以上となれば、別なストリームＩＤ（例えば２）が割り当てられる。すなわち、第２の変形例のコントローラ２５は、ホストがリードコマンドにストリームIDを付加しなくとも、受信した複数のリードコマンドから、複数のストリームデータのリードコマンドを抽出し、それぞれに異なるストリームＩＤを割り当てることができる。
【０１９６】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１９７】
１  情報処理システム、２０  メモリシステム、２１  不揮発性メモリ、４７  ＡＤＬ、４８  ＢＤＬ、４９  ＸＤＬ、５０  メモリセルアレイ。
【図１】
2020047335.tif 000003
【図２】
2020047335.tif 000004
【図３】
2020047335.tif 000005
【図４】
2020047335.tif 000006
【図５】
2020047335.tif 000007
【図６】
2020047335.tif 000008
【図７】
2020047335.tif 000009
【図８】
2020047335.tif 000010
【図９】
2020047335.tif 000011
【図１０】
2020047335.tif 000012
【図１１】
2020047335.tif 000013
【図１２】
2020047335.tif 000014
【図１３】
2020047335.tif 000015
【図１４】
2020047335.tif 000016
【図１５】
2020047335.tif 000017
【図１６】
2020047335.tif 000018
【図１７】
2020047335.tif 000019