(57)【要約】【課題】ホストからのコマンドそれぞれを効率良く取り扱うことができるメモリシステムを実現する。【解決手段】実施形態によれば、メモリシステムは、ホストのメモリ上の発行キュー内の第１のコマンドをメモリシステム内の第１のキューにフェッチして実行する。メモリシステムは、発行キューまたは他の発行キュー内の後続のコマンドの内容を、前記発行キューまたは前記他の発行キュー内に前記後続のコマンドを残した状態でチェックする。前記メモリシステムは、前記後続のコマンドが前記第１のコマンドの実行中に実行可能なコマンドである場合、前記後続のコマンドを前記メモリシステム内の第２のキューにフェッチして、前記後続のコマンドを前記第１のコマンドと並列に実行する。【選択図】図１２
2018169810.tif 000002
【特許請求の範囲】
【請求項１】
ホストに接続可能なメモリシステムであって、
不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、前記不揮発性メモリを制御するコントローラと、を具備し、
前記コントローラは、
前記ホストのメモリ上の発行キュー内の第１のコマンドを前記メモリシステム内の第１のキューにフェッチし、
前記第１のコマンドを実行し、
前記第１のコマンドの実行中に、前記発行キューまたは前記ホストのメモリ上の他の発行キュー内の後続のコマンドの内容を、前記発行キューまたは前記他の発行キュー内に前記後続のコマンドを残した状態でチェックし、
前記後続のコマンドが前記第１のコマンドの実行中に実行可能なコマンドである場合、前記発行キューまたは前記他の発行キューから前記後続のコマンドを前記メモリシステム内の第２のキューにフェッチして、前記後続のコマンドを前記第１のコマンドと並列に実行する、メモリシステム。
【請求項２】
前記コントローラは、前記発行キューまたは前記他の発行キューに対応するヘッドポインタによって指される前記発行キューまたは前記他の発行キュー内のエントリを前記ヘッドポインタを更新せずに参照することによって、前記後続のコマンドの内容を前記後続のコマンドを前記発行キューまたは前記他の発行キュー内に残した状態でチェックする請求項１記載のメモリシステム。
【請求項３】
前記コントローラは、前記後続のコマンドが前記第１のコマンドの実行中に実行可能なコマンドである場合、前記発行キューまたは前記他の発行キューから前記後続のコマンドを前記メモリシステム内の前記第２のキューにフェッチし、且つ前記発行キューまたは前記他の発行キューに対応する前記ヘッドポインタを更新する請求項２記載のメモリシステム。
【請求項４】
前記コントローラは、前記後続のコマンドが前記第１のコマンドの実行中に実行可能なコマンドではない場合、前記発行キューまたは前記他の発行キューから前記後続のコマンドをフェッチしない請求項１記載のメモリシステム。
【請求項５】
前記第１のキューおよび前記第２のキューは前記メモリシステム内のランダムアクセスメモリ上に存在する請求項１記載のメモリシステム。
【請求項６】
ホストに接続可能なメモリシステムであって、
不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、前記不揮発性メモリを制御するコントローラと、を具備し、
前記コントローラは、
前記ホストのメモリ上の第１の発行キュー内の第１のコマンドを前記メモリシステム内の第１のキューにフェッチし、
前記第１のコマンドを実行し、
前記第１のコマンドの実行中に、前記ホストのメモリ上の第２の発行キュー内の第１の後続のコマンドの内容を、前記第２の発行キュー内に前記第１の後続のコマンドを残した状態でチェックし、
前記第１の後続のコマンドが前記第１のコマンドの実行中に実行可能なコマンドである場合、前記第２の発行キューから前記第１の後続のコマンドを前記メモリシステム内の第２のキューにフェッチして、前記第１の後続のコマンドを前記第１のコマンドと並列に実行し、
前記第１の後続のコマンドが前記第１のコマンドの実行中に実行可能なコマンドではない場合、前記ホストのメモリ上の第３の発行キュー内の第２の後続のコマンドの内容を、前記第２の発行キュー内に前記第２の後続のコマンドを残した状態でチェックし、
前記第２の後続のコマンドが前記第１のコマンドの実行中に実行可能なコマンドである場合、前記第３の発行キューから前記第２の後続のコマンドを前記第２のキューにフェッチして、前記第２の後続のコマンドを前記第１のコマンドと並列に実行する、メモリシステム。
【請求項７】
前記コントローラは、
前記第２の発行キューに対応するヘッドポインタによって指される前記第２の発行キュー内のエントリを前記第２の発行キューに対応するヘッドポインタを更新せずに参照することによって、前記第１の後続のコマンドの内容を前記第１の後続のコマンドを前記第２の発行キュー内に残した状態でチェックし、
前記第１の後続のコマンドが前記第１のコマンドの実行中に実行可能なコマンドではない場合、前記第３の発行キューに対応するヘッドポインタによって指される前記第３の発行キュー内のエントリを前記第３の発行キューに対応するヘッドポインタを更新せずに参照することによって、前記第２の後続のコマンドの内容を前記第２の後続のコマンドを前記第３の発行キュー内に残した状態でチェックする請求項６記載のメモリシステム。
【請求項８】
不揮発性メモリと前記不揮発性メモリを制御するコントローラとを含むメモリシステムによって実行される制御方法であって、
ホストのメモリ上の発行キュー内の第１のコマンドを前記メモリシステム内の第１のキューにフェッチし、
前記第１のコマンドを実行し、
前記第１のコマンドの実行中に、前記発行キューまたは前記ホストのメモリ上の他の発行キュー内の後続のコマンドの内容を、前記発行キューまたは前記他の発行キュー内に前記後続のコマンドを残した状態でチェックし、
前記後続のコマンドが前記第１のコマンドの実行中に実行可能なコマンドである場合、前記発行キューまたは前記他の発行キューから前記後続のコマンドを前記メモリシステム内の第２のキューにフェッチして、前記後続のコマンドを前記第１のコマンドと並列に実行する制御方法。
【請求項９】
前記後続のコマンドの内容を前記後続のコマンドを前記発行キューまたは前記他の発行キュー内に残した状態でチェックすることは、前記発行キューまたは前記他の発行キューに対応するヘッドポインタによって指される前記発行キューまたは前記他の発行キュー内のエントリを前記ヘッドポインタを更新せずに参照することを含む請求項８記載の制御方法。
【請求項１０】
前記後続のコマンドが前記第１のコマンドの実行中に実行可能なコマンドである場合、前記発行キューまたは前記他の発行キューから前記後続のコマンドを前記メモリシステム内の前記第２のキューにフェッチし、且つ前記発行キューまたは前記他の発行キューに対応する前記ヘッドポインタを更新する請求項９記載の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、不揮発性メモリを備えるメモリシステムおよび制御方法に関する。
【背景技術】
【０００２】
近年、不揮発性メモリを備えるメモリシステムが広く普及している。
【０００３】
このようなメモリシステムの一つとして、ＮＡＮＤ型フラッシュメモリを備えるソリッドステートドライブ（ＳＳＤ）が知られている。ＳＳＤは、様々なコンピューティングデバイスのメインストレージとして使用されている。
【０００４】
最近では、ＳＳＤにおいては、その性能改善のために、ホストからのコマンドを取り扱うコマンドハンドリング機能の向上が求められている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１６−２１２５８０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
本発明が解決しようとする課題は、ホストからのコマンドそれぞれを効率良く取り扱うことができるメモリシステムおよび制御方法を提供することである。
【課題を解決するための手段】
【０００７】
実施形態によれば、ホストに接続可能なメモリシステムは、不揮発性メモリと、前記不揮発性メモリに電気的に接続され、前記不揮発性メモリを制御するコントローラとを具備する。前記コントローラは、前記ホストのメモリ上の発行キュー内の第１のコマンドを前記メモリシステム内の第１のキューにフェッチする。前記コントローラは、前記第１のコマンドを実行する。前記コントローラは、前記第１のコマンドの実行中に、前記発行キューまたは前記ホストのメモリ上の他の発行キュー内の後続のコマンドの内容を、前記発行キューまたは前記他の発行キュー内に前記後続のコマンドを残した状態でチェックする。前記コントローラは、前記後続のコマンドが前記第１のコマンドの実行中に実行可能なコマンドである場合、前記発行キューまたは前記他の発行キューから前記後続のコマンドを前記メモリシステム内の第２のキューにフェッチして、前記後続のコマンドを前記第１のコマンドと並列に実行する。
【図面の簡単な説明】
【０００８】
【図１】実施形態に係るメモリシステムの構成例を示すブロック図。
【図２】実施形態のメモリシステムによって実行されるコマンド処理の概要を示すブロック図。
【図３】ホストメモリ上の複数の発行キューからコマンドがフェッチされるべき発行キューを選択するアービトレーション機構の例を示すブロック図。
【図４】実施形態のメモリシステムによって実行される、発行キューに入れられたコマンドをフェッチする動作を示す図。
【図５】実施形態のメモリシステムによって実行される、コマンド完了の応答を完了キューに積む動作を示す図。
【図６】コマンド処理の基本的な手順を示す図。
【図７】コマンドプレチェック処理を使用せずに、現在のコマンドの実行中に後続のコマンドをフェッチする動作を示す図。
【図８】コマンドプレチェック処理を使用しない場合のコマンド処理の手順を示すフローチャート。
【図９】実施形態のメモリシステムによって実行される、コマンドプレチェックを含むコマンド処理の例を示す図。
【図１０】実施形態のメモリシステムによって実行される、コマンドプレチェックを含むコマンド処理の別の例を示す図。
【図１１】実施形態のメモリシステムによって実行されるコマンドプレチェック動作を示す図。
【図１２】実施形態のメモリシステムによって実行される、コマンドプレチェックを含むコマンド処理の手順を示すフローチャート。
【発明を実施するための形態】
【０００９】
以下、図面を参照して、実施形態を説明する。  
まず、図１を参照して、実施形態に係るメモリシステムを含む情報処理システム１の構成を説明する。
【００１０】
このメモリシステムは、不揮発性メモリにデータを書き込み、不揮発性メモリからデータを読み込むように構成された半導体ストレージデバイスである。このメモリシステムは、例えば、ＮＡＮＤ型フラッシュメモリを備えたソリッドステートドライブ（ＳＳＤ）３として実現されている。
【００１１】
情報処理システム１は、ホスト（ホストデバイス）２と、ＳＳＤ３とを含む。ホスト２は、ＳＳＤ３をアクセスする情報処理装置（コンピューティングデバイス）である。ホスト２は、ストレージサーバ（サーバ）であってもよいし、パーソナルコンピュータであってもよい。
【００１２】
ＳＳＤ３は、ホスト２として機能する情報処理装置のメインストレージとして使用され得る。ＳＳＤ３は、この情報処理装置に内蔵されてもよいし、この情報処理装置にケーブルまたはネットワークを介して接続されてもよい。
【００１３】
ホスト２とＳＳＤ３とを相互接続するためのインタフェースとしては、ＮＶＭ  Ｅｘｐｒｅｓｓ（ＮＶＭｅ）（登録商標）、ＳＣＳＩ、Ｓｅｒｉａｌ  Ａｔｔａｃｈｅｄ  ＳＣＳＩ（ＳＡＳ）、ＡＴＡ、Ｓｅｒｉａｌ  ＡＴＡ（ＳＡＴＡ）、Ｅｔｈｅｒｎｅｔ（登録商標）、Ｆｉｂｒｅ  ｃｈａｎｎｅｌ、等を使用し得る。
【００１４】
ＳＳＤ３は、コントローラ４および不揮発性メモリ（ＮＡＮＤ型フラッシュメモリ）５を備える。ＳＳＤ３は、ランダムアクセスメモリ、例えば、ＤＲＡＭ６も備えていてもよい。
【００１５】
ＮＡＮＤ型フラッシュメモリ５は、マトリクス状に配置された複数のメモリセルを含むメモリセルアレイを含む。ＮＡＮＤ型フラッシュメモリ５は、２次元構造のＮＡＮＤ型フラッシュメモリであってもよいし、３次元構造のＮＡＮＤ型フラッシュメモリであってもよい。
【００１６】
ＮＡＮＤ型フラッシュメモリ５のメモリセルアレイは、複数のブロックＢ０〜Ｂｍ−１を含む。ブロックＢ０〜Ｂｍ−１の各々は多数のページ（ここではページＰ０〜Ｐｎ−１）によって編成される。ブロックＢ０〜Ｂｍ−１は、消去動作の単位である。ブロックは、「消去ブロック」、または「物理ブロック」と称されることもある。ページＰ０〜Ｐｎ−１の各々は、同一ワード線に接続された複数のメモリセルを含む。ページＰ０〜Ｐｎ−１は、データ書き込み動作およびデータ読み込み動作の単位である。
【００１７】
コントローラ４は、Ｔｏｇｇｌｅ、Ｏｐｅｎ  ＮＡＮＤ  Ｆｌａｓｈ  Ｉｎｔｅｒｆａｃｅ（ＯＮＦＩ）のようなＮＡＮＤインタフェース１３を介して、不揮発性メモリであるＮＡＮＤ型フラッシュメモリ５に電気的に接続されている。ＮＡＮＤインタフェース１３は、ＮＡＮＤ型フラッシュメモリ５を制御するように構成されたＮＡＮＤ制御回路として機能する。ＮＡＮＤ型フラッシュメモリ５は、複数のＮＡＮＤ型フラッシュメモリチップを含んでいてもよい。ＮＡＮＤインタフェース１３は、複数のチャンネルを介してこれら複数のＮＡＮＤ型フラッシュメモリチップに接続されていてもよい。
【００１８】
コントローラ４は、ＮＡＮＤインタフェース１３を使用して、ＮＡＮＤ型フラッシュメモリ５の動作（ライト（プログラム）動作、リード動作、消去動作、等）を制御する。ライト（プログラム）動作は、１ページ分のデータを書き込み対象のページに書き込む動作である。リード動作は、１ページ分のデータを読み出し対象のページからリードする動作である。消去動作は、あるブロック内の全てのメモリセルを消去状態にするための動作である。
【００１９】
コントローラ４は、ＮＡＮＤ型フラッシュメモリ５のデータ管理およびブロック管理を実行するように構成されたフラッシュトランスレーション層（ＦＴＬ）として機能してもよい。このＦＴＬによって実行されるデータ管理には、（１）論理アドレスそれぞれとＮＡＮＤ型フラッシュメモリ５の物理アドレスそれぞれとの間の対応関係を示すマッピング情報の管理、（２）ページ単位のリード／ライトとブロック単位の消去動作とを隠蔽するための処理、等が含まれる。論理アドレスは、ＳＳＤ３をアドレス指定するためにホストによって使用されるアドレスである。この論理アドレスとしては、ＬＢＡ（logical block address(addressing)）が使用され得る。
【００２０】
論理アドレスそれぞれと物理アドレスそれぞれとの間のマッピングの管理は、アドレス変換テーブル（論理物理アドレス変換テーブル）として機能するルックアップテーブル（ＬＵＴ）４０を用いて実行される。コントローラ４は、ルックアップテーブル（ＬＵＴ）４０を使用して、論理アドレスそれぞれと物理アドレスそれぞれとの間のマッピングを所定の管理サイズ単位で管理する。ある論理アドレスに対応する物理アドレスは、この論理アドレスのデータがライトされたＮＡＮＤ型フラッシュメモリ５内の最新の物理記憶位置を示す。ルックアップテーブル（ＬＵＴ）４０は、ＳＳＤ３の電源オン時にＮＡＮＤ型フラッシュメモリ５からＤＲＡＭ６にロードされてもよい。
【００２１】
ページへのデータ書き込みは、１消去サイクル当たり１回のみ可能である。このため、コントローラ４は、ある論理アドレスに対応する更新データを、この論理アドレスに対応する以前のデータが格納されている物理記憶位置ではなく、別の物理記憶位置に書き込む。そして、コントローラ４は、ルックアップテーブル（ＬＵＴ）４０を更新してこの論理アドレスをこの別の物理記憶位置に関連付ける。
【００２２】
ブロック管理には、バッドブロックの管理と、ウェアレベリングと、ガベージコレクション等が含まれる。
【００２３】
コントローラ４は、ホストインタフェース１１、ＣＰＵ１２、ＮＡＮＤインタフェース１３、ＤＲＡＭインタフェース１４、ＳＲＡＭ１５等を含んでもよい。これらＣＰＵ１２、ＮＡＮＤインタフェース１３、ＤＲＡＭインタフェース１４、ＳＲＡＭ１５は、バス１０を介して相互接続されていてもよい。
【００２４】
ホストインタフェース１１は、ホスト２から様々なコマンドを受信する。ホストインタフェース１１は、アービトレーション機構２１と、コマンド送受信部２２とを含む。アービトレーション機構２１は、コマンドがフェッチされるべき発行キューを、ホスト２のメモリ上に存在する複数の発行キューから選択するための機構である。アービトレーション機構２１は、ラウンドロビンアービトレーション機構であってもよいし、重み付きラウンドロビンアービトレーション機構であってもよい。コマンド送受信部２２は、ＣＰＵ１２の制御の下、アービトレーション機構２１によって選択された発行キューからコマンドを受信する処理、およびコマンド完了の応答をホスト２のメモリ上の完了キューに積む処理とを実行する。コマンド完了の応答は、このコマンドの処理の成功／失敗を示すステータスをホスト２に知らせるための完了通知である。あるコマンドに対応するコマンド完了の応答は、このコマンドが取り出された発行キューに対応する完了キューに積まれる。
【００２５】
ＣＰＵ１２は、ホストインタフェース１１、ＮＡＮＤインタフェース１３、ＤＲＡＭインタフェース１４、およびＳＲＡＭ１５を制御するように構成されたプロセッサである。ＣＰＵ１２は、ＳＳＤ３の電源オンに応答して、ＮＡＮＤ型フラッシュメモリ５または図示しないＲＯＭに格納されている制御プログラム（ファームウェア）をＳＲＡＭ１５またはＤＲＡＭ６上にロードし、このファームウェアを実行することによって様々な処理を行う。
【００２６】
このＣＰＵ１２は、例えば、上述のＦＴＬの処理に加え、ホスト２からの様々なコマンドを処理するためのコマンド処理を実行することができる。ＣＰＵ１２の動作は、ＣＰＵ１２によって実行される上述のファームウェアによって制御される。
【００２７】
ＣＰＵ１２は、コマンド処理部３１、およびコマンドプレチェック部３２として機能することができる。
【００２８】
コマンド処理部３１は、ホスト２からの様々なコマンドを処理する。これらコマンドのタイプは、Ｉ／Ｏコマンドと、管理コマンドとに大別される。Ｉ／Ｏコマンドの例は、ライトコマンド、リードコマンド、コンペアコマンド、等を含む。
【００２９】
ライトコマンドは、ＳＳＤ３に対してデータのライトを要求するコマンドである。ライトコマンドは、そのコマンドパラメータとして、例えば、データが書き込まれるべきＬＢＡ（開始ＬＢＡ）と、転送長（データ長）と、書き込まれるべきデータ（ライトデータ）が存在するホスト２のメモリ上の位置を示すアドレス情報、等を含む。ＬＢＡは、論理セクタ（論理ブロック）に付与されるシリアル番号によって表現される。シリアル番号はゼロから始まる。
【００３０】
ライトコマンドを受信した時、コマンド処理部３１は、ホスト２のメモリからライトデータを取得し、このライトデータをＮＡＮＤ型フラッシュメモリ５に書き込む。そして、ライトコマンドの処理が完了すると、コマンド処理部３１は、このライトコマンドの成功または失敗を示すステータスを伴うコマンド完了の応答をホスト２に送信する。
【００３１】
リードコマンドは、ＳＳＤ３に対してデータのリードを要求するコマンドである。リードコマンドは、そのコマンドパラメータとして、例えば、リードすべきデータのＬＢＡ（開始ＬＢＡ）と、転送長（データ長）と、リードデータが転送されるべきホスト２のメモリ上の位置を示すアドレス情報、等を含む。
【００３２】
リードコマンドを受信した時、コマンド処理部３１は、このリードコマンドによって指定されるデータをＮＡＮＤ型フラッシュメモリ５からリードし、このリードデータと、コマンド完了の応答をホスト２に送信する。コマンド完了の応答は、このリードコマンドの成功または失敗を示すステータスを含む。
【００３３】
コンペアコマンドは、ＳＳＤ３に対して、コンペアコマンドによって指定されたＬＢＡ範囲に対応するデータを、ＮＡＮＤ型フラッシュメモリ５からリードし、且つこのリードデータをコンペアコマンドによって指定された比較データと比較することを要求する。
【００３４】
コンペアコマンドを受信した時、コマンド処理部３１は、このコンペアコマンドによって指定されたＬＢＡ範囲に対応するデータをＮＡＮＤ型フラッシュメモリ５からリードする。そして、コマンド処理部３１は、このリードデータをコンペアコマンドによって指定された比較データと比較する。リードデータが比較データと等しいならば、コンペアコマンドは成功して完了する。コマンド処理部３１は、成功または失敗を示すステータスを含むコマンド完了の応答をホスト２に送信する。
【００３５】
管理コマンドの例は、ＳＳＤ３に対して発行キュー／完了キューの作成又は削除を要求するコマンド（ｃｒｅａｔｅ  Ｉ／Ｏ  ｓｕｂｍｉｓｓｉｏｎ  ｑｕｅｕｅ  ｃｏｍｍａｎｄ、ｄｅｌｅｔｅ  Ｉ／Ｏ  ｓｕｂｍｉｓｓｉｏｎ  ｑｕｅｕｅ  ｃｏｍｍａｎｄ）、ＳＳＤ３から様々な内部設定情報を取得するためのコマンド（ｉｄｅｎｔｉｆｙ  ｃｏｍｍａｎｄ）、ＳＳＤ３に対して、以前に発行された特定のコマンドをアボートすることを要求するためのコマンド（ａｂｏｒｔ  ｃｏｍｍａｎｄ）、他の様々なコマンド等を含む。
【００３６】
コマンド処理部３１は、コマンド送受信部２２を使用して、アービトレーション機構２１によって選択された発行キューからコマンドを順番にフェッチする。ここで、フェッチするとは、メモリ（ここではホスト２のメモリ）からコマンドを取得する動作を意味する。メモリからフェッチ（取得）されたコマンドは、ＳＳＤ３内のローカルな受信キューに積まれる。コマンド処理部３１は、これらフェッチされたコマンドを任意の順序で実行することができる。
【００３７】
発行キューからフェッチされたコマンドは、ＳＳＤ３内のローカルな受信キューであるメイン受信キュー４１に積まれる。コマンド処理部３１は、メイン受信キュー４１内に存在するこれらコマンドそれぞれをシリアルに実行する。例えば、メイン受信キュー４１内の或るコマンドの実行が完了すると、コマンド処理部３１は、メイン受信キュー４１内の次のコマンドを実行する。
【００３８】
各コマンドの実行に要する時間は、個々のコマンドの内容（例えば、ライトコマンド／リードコマンドに対応するデータ長）およびＮＡＮＤ型フラッシュメモリ５の内部状態等に依存する。例えば、長いデータ長を伴うライトコマンドの実行には比較的多くの時間（コマンド実行時間）を要する場合がある。また、データ長が長い比較データを伴うコンペアコマンドのコマンド実行時間も比較的長くなる場合がある。
【００３９】
したがって、コマンド実行時間の長い現在のコマンドの実行中に、コマンド処理部３１は、このコマンドがフェッチされた発行キューと同一の発行キューまたは別の発行キューから、後続のコマンドをフェッチしてもよい。このフェッチされた後続のコマンドは、メイン受信キュー４１ではなく、サブ受信キュー４２に積まれる。このサブ受信キュー４２は、ＳＳＤ３内の追加のローカルな受信キューである。通常、サブ受信キュー４２には未処理のコマンドが存在しないので、コマンド処理部３１は、サブ受信キュー４２に積まれた後続のコマンドを解析する処理を即座に開始することができる。コマンド処理部３１は、サブ受信キュー４２に積まれた後続のコマンドを解析することによって、この後続のコマンドが、現在のコマンドの実行中に実行可能なコマンドであるか否かを判定する。この後続のコマンドが、現在のコマンドの実行中に実行可能なコマンドであるならば、この後続のコマンドは、現在のコマンドと並行して実行することができる。これにより、ＳＳＤ３内のコマンドハンドリング機能を向上させることが可能となる。
【００４０】
しかし、サブ受信キュー４２にフェッチされた後続のコマンドは、現在のコマンドの実行中に実行可能なコマンドであるとは限らない。
【００４１】
例えば、実行中の現在のコマンドがコンペアコマンドである場合においては、もしサブ受信キュー４２にフェッチされた後続のコマンドが、コンペアコマンドによって指定されたＬＢＡ範囲とオーバーラップするＬＢＡ範囲へのデータ書き込みを要求するライトコマンドであるならば、この後続のコマンドは、現在のコマンドの実行中に実行することができないコマンドとして扱われる場合がある。なぜなら、もしこのライトコマンドが現在のコマンドの実行中に実行されたならば、ＮＡＮＤ型フラッシュメモリ５内に格納されている比較対象のデータが、このライトコマンドによって更新されてしまう可能性があるからである。
【００４２】
また、例えば、実行中の現在のコマンドがある発行キュー（例えばＳＱ１）からフェッチされたコマンドである場合において、もしサブ受信キュー４２にフェッチされた後続のコマンドが、この発行キューＳＱ１またはこの発行キューＳＱ１に対応する完了キューＣＱ１の削除を要求するコマンドであるならば、この後続のコマンドも、現在のコマンドの実行中に実行することができないコマンドとして扱われる場合がある。
【００４３】
このように、サブ受信キュー４２にフェッチされた後続のコマンドが、現在のコマンドの実行中に実行することができないコマンドであったならば、この後続のコマンドは、実行中の現在のコマンドが完了するまでは実行できない。
【００４４】
この結果、実行のための受信キューをメイン受信キュー４１とサブ受信キュー４２との間で切り換える処理が頻繁に発生しやすくなる。
【００４５】
例えば、コマンド処理部３１は、実行中の現在のコマンドが完了した時、サブ受信キュー４２内の後続のコマンドを実行するために、実行のための受信キューをメイン受信キュー４１からサブ受信キュー４２に切り換えることが必要とされる。そして、サブ受信キュー４２内のこの後続のコマンドの実行が完了した時、コマンド処理部３１は、メイン受信キュー４１内の別の後続のコマンドを実行するために、実行のための受信キューをサブ受信キュー４２からメイン受信キュー４１に再び切り換えることが必要とされる。
【００４６】
実行のための受信キューの切り替えのためのオーバーヘッドは、ＳＳＤ３の処理性能を低下させる要因となり得る。
【００４７】
通常、各コマンドの処理は、設定された時間（コマンドタイムアウト値）内に完了することが必要とされる。もし発行キューからコマンドがフェッチされてからこのコマンドの完了応答が返されるまでの時間（コマンド実行時間）が設定されたコマンドタイムアウト値を超えたならば、深刻なシステムエラーが起こる可能性がある。
【００４８】
上述したように、もしサブ受信キュー４２にフェッチされた後続のコマンドが、現在のコマンドの実行中に実行可能なコマンドではないならば、この後続のコマンドは、現在のコマンドが完了するまで実行されない。このことは、この後続のコマンドの処理に割り当て可能なコマンド実行時間が実際上短くなってしまうことを意味する。
【００４９】
このように、あるコマンドの実行中に、発行キュー内の後続のコマンドをサブ受信キュー４２にフェッチするという構成のみでは、実行のための受信キューの切り替え頻度の増加による影響や、後続のコマンドのコマンド実行時間が短くなるという影響が生じうる。
【００５０】
そこで、本実施形態では、コマンドプレチェック部３２が設けられている。
【００５１】
このコマンドプレチェック部３２は、現在のコマンド（コマンドＡ）の実行中に、例えば、このコマンド（コマンドＡ）の処理の完了を待っている待ち時間中に、同一の発行キューまたは別の発行キューに存在する後続のコマンド（コマンドＢ）の内容（例えばコマンド種別等）を、後続のコマンド（コマンドＢ）を同一の発行キューまたは他の発行キュー内に残した状態でチェックする。ここで、後続のコマンドの内容を、後続のコマンドを同一の発行キューまたは他の発行キュー内に残した状態でチェックするとは、後続のコマンドを同一の発行キューまたは他の発行キューからＳＳＤ３内のキュー（サブ受信キュー４２）に実際にフェッチすること無く、同一の発行キューまたは他の発行キュー内に存在する後続のコマンドの内容をチェックすることを意味する。これにより、後続のコマンドの内容を、後続のコマンドを同一の発行キューまたは他の発行キュー内に残した状態でチェックすることができ、これによって後続のコマンド（コマンドＢ）が現在のコマンド（コマンドＡ）の実行中に実行可能なコマンドであるか否かを判定することができる。
【００５２】
この後続のコマンド（コマンドＢ）が、コマンド（コマンドＡ）の実行中に実行可能なコマンドであるとコマンドプレチェック部３２によって判定されたならば、コマンド処理部３１は、この後続のコマンド（コマンドＢ）を発行キューからフェッチする。フェッチされた後続のコマンド（コマンドＢ）はサブ受信キュー４２に積まれる。そして、コマンド処理部３１は、この後続のコマンド（コマンドＢ）をコマンド（コマンドＡ）と並列に実行する。ここで、コマンドＢをコマンドＡと並列に実行するとは、コマンドＡの処理が完了してからコマンドＢを実行するというようにこれらコマンドＡ，Ｂを逐次的に処理するのではなく、コマンドＢの処理期間（実行時間）がコマンドＡの処理期間（実行時間）の少なくとも一部にオーバーラップするようにコマンドＡの実行中にコマンドＢを実行することを意味する。典型的には、コマンドＡの処理の完了を待たずにコマンドＢの処理が開始されればよい。もちろん、コマンドＡ，Ｂがほぼ同時に実行されてもよい。
【００５３】
この後続のコマンド（コマンドＢ）がコマンド（コマンドＡ）の実行中に実行可能なコマンドでないならば、コマンド処理部３１は、この後続のコマンド（コマンドＢ）をフェッチせず、発行キュー内に維持する。
【００５４】
このように、本実施形態では、この後続のコマンド（コマンドＢ）が、コマンド（コマンドＡ）の実行中に実行可能なコマンドである場合にのみ、この後続のコマンド（コマンドＢ）が発行キューからサブ受信キュー４２にフェッチされる。
【００５５】
したがって、コマンド（コマンドＡ）の実行中に実行できないコマンドが発行キューからサブ受信キュー４２にフェッチされることを防止することができる。この結果、実行のための受信キューの切り替え頻度を低くすることができる。また、発行キューから後続のコマンド（コマンドＢ）がフェッチされない限り、このコマンドＢのタイムアウト値をカウントするためのタイマーはスタートされない。よって、このコマンドＢの処理に割り当て可能なコマンド実行時間が短くなることを防ぐことができる。
【００５６】
ＤＲＡＭインタフェース１４は、ＤＲＡＭ６をアクセス制御するように構成されたＤＲＡＭコントローラである。ＤＲＡＭ６の記憶領域は、ルックアップテーブル（ＬＵＴ）４０、メイン受信キュー４１、サブ受信キュー４２、および完了送信キュー４３を格納するために利用される。あるいは、ルックアップテーブル（ＬＵＴ）４０、メイン受信キュー４１、サブ受信キュー４２、および完了送信キュー４３は、ＤＲＡＭ６上ではなく、コントローラ４内に内蔵されたランダムアクセスメモリであるＳＲＡＭ１５上に存在してもよい。
【００５７】
次に、ホスト２の構成について説明する。
【００５８】
ホスト２は、ＣＰＵ（ホストＣＰＵ）５１、メインメモリ５２、ホストコントローラ５３等を含む。これらＣＰＵ５１、メインメモリ５２、ホストコントローラ５３は、バス５０を介して相互接続される。
【００５９】
ＣＰＵ５１は、ホスト２内のコンポーネントを制御するプロセッサである。ＣＰＵ５１は、ＳＳＤ３または他のストレージデバイスからメインメモリ５２にロードされるソフトウェア（ホストソフトウェア）を実行する。ホストソフトウェアは、ＳＳＤ３を制御するためのプログラムを含む。
【００６０】
メインメモリ５２は、ＤＲＡＭのようなランダムアクセスメモリ（ＲＡＭ）である。このメインメモリ５２の記憶領域の一部は、一つ以上の発行キュー（ｓｕｂｍｉｓｓｉｏｎ  ｑｕｅｕｅ）ＳＱ、および一つ以上の発行キューＳＱに対応する一つ以上の完了キュー（ｃｏｎｐｌｅｔｉｏｎ  ｑｕｅｕｅ）ＣＱを格納するために使用される。発行キューは、ホスト２がコマンドを発行するために使用されるキューである。完了キューＣＱは、ＳＳＤ３のコントローラ４がホスト２にコマンド完了を通知するために使用されるキューである。メインメモリ５２上には、発行キューＳＱと完了キューＣＱとを各々が含む一つ以上のキューペアが存在する。図１においては、複数の発行キューＳＱ１、ＳＱ２、ＳＱ３、…と、発行キューＳＱ１、ＳＱ２、ＳＱ３、…にそれぞれ対応する複数の完了キューＣＱ１、ＣＱ２、ＣＱ３、…とがメインメモリ５２上に存在する場合が例示されている。
【００６１】
ホストソフトウェアによって生成されるコマンドそれぞれは、発行キューＳＱのいずれかに入れられる。コマンドのタイプには、上述のＩ／Ｏコマンドと、上述の管理コマンドとがある。管理コマンドが入れられる発行キューは、Ｉ／Ｏコマンドが入れられる発行キュー（Ｉ／Ｏ  ｓｕｂｍｉｓｓｉｏｎ  ｑｕｅｕｅ）とは異なる発行キュー（Ａｄｍｉｎ  ｓｕｂｍｉｓｓｉｏｎ  ｑｕｅｕｅ：ＡＳＱ）である。管理コマンドの完了応答が入れられる完了キューは、Ｉ／Ｏコマンドの完了応答が入れられる完了キュー（Ｉ／Ｏ  ｃｏｍｐｌｅｔｉｏｎ  ｑｕｅｕｅ）とは異なる完了キュー（Ａｄｍｉｎ  ｃｏｍｐｌｅｔｉｏｎ  ｑｕｅｕｅ：ＡＣＱ）である。メインメモリ５２上のキューペアＳＱ，ＣＱの中には、少なくともＡＳＱ、ＡＣＱのキューペアが含まれる。ホスト２は、必要に応じて、発行キューＳＱ（Ｉ／Ｏ  ｓｕｂｍｉｓｓｉｏｎ  ｑｕｅｕｅ）および完了キューＣＱ（Ｉ／Ｏ  ｃｏｍｐｌｅｔｉｏｎ  ｑｕｅｕｅ）のキューペアを作成することができる。
【００６２】
ホストコントローラ５３は、ＳＳＤ３とインタフェースするように構成されたコントローラである。ホストコントローラ５３はＣＰＵ５１に内蔵されていてもよい。
【００６３】
図２は、コマンド処理の概要を示す。
【００６４】
ホストソフトウェアによって発行されたコマンドそれぞれは、発行キューＳＱ１、ＳＱ２、ＳＱ３、…のいずれかに入れられる。発行キューＳＱ１、ＳＱ２、ＳＱ３、…の一つがアービトレーション機構２１によって選択される。アービトレーション機構２１がラウンドロビンアービトレーション機構である場合には、アービトレーション機構２１は、図３に示すように、構成されていてもよい。図３では、４つの発行キューＳＱ１、ＳＱ２、ＳＱ３、ＳＱ４がホスト２のメインメモリ５２上に存在する場合が例示されている。アービトレーション機構２１は、発行キューＳＱ１、ＳＱ２、ＳＱ３、ＳＱ４を順番に選択する。コマンドは、アービトレーション機構２１によって選択された発行キューからフェッチされる。選択された発行キューからフェッチされるコマンドの最大数は、Burstサイズ（Arbitration Burst）によって指定されてもよい。このBurstサイズによって指定された数のコマンドが選択された発行キューから順番にフェッチされた後、アービトレーション機構２１によって次の発行キューが選択される。
【００６５】
選択された発行キューからフェッチされた各コマンドは、コマンド送受信部２２を介してメイン受信キュー４１に送られ、このメイン受信キュー４１またはサブ受信キュー４２に積まれる。通常は、フェッチされた各コマンドはメイン受信キュー４１に積まれる。コマンドプレチェック部３２によってプレチェックされたコマンドが発行キューからフェッチされた場合にのみ、このコマンドは、サブ受信キュー４２に積まれる。
【００６６】
メイン受信キュー４１／サブ受信キュー４２内のコマンドは、コマンド処理部３１によって実行される。
【００６７】
実行されるべきコマンドがライトコマンドならば、コマンド処理部３１は、このライトコマンドによって指定されるライトデータをホスト２のメインメモリ５２から取得し、このライトデータをＮＡＮＤ型フラッシュメモリ５に書き込む。ライトコマンドの処理が完了した時、コマンド完了の応答がコマンド処理部３１によって完了送信キュー４３に入れられる。そして、このコマンド完了の応答は、コマンド送受信部２２を介して、選択された発行キューに対応する完了キューＣＱに積まれる。
【００６８】
実行されるべきコマンドがリードコマンドならば、コマンド処理部３１は、リードコマンドによって指定されるデータをＮＡＮＤ型フラッシュメモリ５からリードする。リードコマンドの処理が完了した時、コマンド完了の応答がコマンド処理部３１によって完了送信キュー４３に入れられる。そして、リードデータがホスト２のメインメモリ５２に送信されると共に、このコマンド完了の応答が、コマンド送受信部２２を介して、選択された発行キューに対応する完了キューＣＱに積まれる。
【００６９】
図４は、発行キューＳＱに入れられたコマンドをフェッチする動作を示す。
【００７０】
発行キューＳＱは、固定サイズの複数のエントリを含む循環バッファ（循環キュー）であってもよい。各エントリはコマンドを格納するために使用される。あるコマンドが格納されているエントリにおいては、このコマンドのオペレーションコード、このコマンドの識別子、このコマンドがフェッチされた発行キューＳＱの識別子、および、このコマンドの様々なコマンドパラメータが格納されている。
【００７１】
この発行キューＳＱは、この発行キューＳＱに対応するテールポインタおよびヘッドポインタによって制御される。
【００７２】
テールポインタは、次のコマンドが入れられるべき発行キューＳＱ内のエントリを指すためのポインタである。テールポインタの値は、ホスト２によって更新される。ヘッドポインタは、次のコマンドがフェッチされるべき発行キューＳＱ内のエントリを指すポインタである。ヘッドポインタの値は、ＳＳＤ３のコントローラ４によって更新される。テールポインタの値がヘッドポインタの値に等しい時、発行キューＳＱは空である。
【００７３】
（１）ホスト２は、コマンドを生成し、このコマンドをテールポインタによって指される発行キューＳＱ内のエントリに格納する。そして、ホスト２は、テールポインタの値を更新（インクリメント）することによって、新たなコマンドが発行キューＳＱに積まれたことをＳＳＤ３のコントローラ４に通知する。テールポインタの値を更新する処理においては、ホスト２は、更新されたテールポインタの値を、コントローラ４内のレジスタ（この発行キューＳＱに対応するドアベルテールレジスタ）に書き込み、これによって、更新されたテールポインタの値をＳＳＤ３のコントローラ４に通知する。更新されたテールポインタの値と現在のヘッドポインタとの間の差分は、発行キューＳＱに積まれた新たなコマンドの数を示す。
【００７４】
（２）ＳＳＤ３のコントローラ４は、ヘッドポインタによって指される発行キューＳＱ内のエントリからコマンドをフェッチし、フェッチされたコマンドをメイン受信キュー４１に格納する。
【００７５】
（３）発行キューＳＱ内のエントリからコマンドをフェッチした時、ＳＳＤ３のコントローラ４は、ヘッドポインタの値を更新（インクリメント）して、以前のヘッドポインタの値によって指されていたエントリを解放する。ホスト２は、以前のヘッドポインタの値によって指されていたエントリを空きエントリとして扱うことができる。
【００７６】
図５は、コマンド完了の応答を完了キューに積む動作を示す。
【００７７】
完了キューＣＱも、固定サイズの複数のエントリを含む循環バッファ（循環キュー）であってもよい。各エントリは完了応答（完了通知）を格納するために使用される。この完了キューＣＱも、この完了キューＣＱに対応するテールポインタおよびヘッドポインタによって制御される。テールポインタは、次の完了応答が入れられるべき完了キューＣＱ内のエントリを指すためのポインタである。テールポインタの値は、ＳＳＤ３のコントローラ４によって更新される。ヘッドポインタは、処理されるべき次の完了応答が格納されている完了キューＣＱ内のエントリを指すためのポインタである。ヘッドポインタの値は、ホスト２によって更新される。テールポインタの値がヘッドポインタの値に等しい時、完了キューＣＱは空である。
【００７８】
（１）コントローラ４は、完了応答を生成し、この完了応答をテールポインタによって指される完了キューＣＱ内のエントリに格納する。そして、コントローラ４は、テールポインタの値を更新（インクリメント）することによって、新たな完了応答が完了キューＣＱに積まれたことをホスト２に通知する。テールポインタの値を更新する処理においては、コントローラ４は、更新されたテールポインタの値を、コントローラ４内のレジスタ（完了キューＣＱに対応するドアベルテールレジスタ）に書き込み、これによって、更新されたテールポインタの値をホスト２に通知する。更新されたテールポインタの値と現在のヘッドポインタとの間の差分は、完了キューＣＱに積まれた新たな完了応答の数を示す。
【００７９】
（２）ホスト２は、ヘッドポインタによって指される完了キューＣＱ内のエントリから完了応答を取得し、取得した完了応答を処理する。
【００８０】
（３）ホスト２は、ヘッドポインタの値を更新（インクリメント）する。
【００８１】
図６は、コマンド処理の基本的な手順を示す。
【００８２】
（１）ホスト２が新たなコマンドを発行キューＳＱに入れる。そして、ホスト２が更新されたテールポインタの値を発行キューＳＱに対応するドアベルテールレジスタに書き込み、これによって、新たなコマンドが発行キューＳＱに入れられたことをＳＳＤ３のコントローラ４に通知する。
【００８３】
（２）ＳＳＤ３のコントローラ４がアービトレーション機構２１によって、コマンドをフェッチすべき発行キューＳＱを選択する。
【００８４】
（３）ＳＳＤ３のコントローラ４が選択された発行キューＳＱからコマンドをフェッチする。
【００８５】
（４）ＳＳＤ３のコントローラ４がフェッチしたコマンドを解析し、このコマンドを処理する。
【００８６】
（５）このコマンドの処理（実行）が完了すると、ＳＳＤ３のコントローラ４は、完了応答を発行キューＳＱに対応する完了キューＣＱに積み、そして新たな完了応答が完了キューＣＱに積まれたことをホスト２に通知する。
【００８７】
（６）ＳＳＤ３のコントローラ４は、同じ発行キューＳＱに対して（３）〜（５）を事前に決められたコマンド数（Burstサイズ）分、繰り返す。なお、コマンドのフェッチは、Burstサイズ分まとめて実行されてもよい。この場合、ＳＳＤ３のコントローラ４は、Burstサイズによって指定される数のコマンドを同じ発行キューＳＱから一度にフェッチする。
【００８８】
（７）ＳＳＤ３のコントローラ４によって実行される処理は、（２）に戻る。
【００８９】
図７は、上述のコマンドプレチェック処理を使用せずに、現在のコマンドの実行中に後続のコマンドをフェッチする動作を示す。
【００９０】
ホスト２では、ＳＳＤ３によって実行されるべきコマンドが発行キューＳＱに積まれる。図７では、発行キューＳＱ１にコマンドＡが積まれ、発行キューＳＱ２にコマンドＢが積まれている場合が例示されている。コマンドが発行キューＳＱに積まれると、新たなコマンドが発行キューＳＱに存在することがＳＳＤ３に通知される。
【００９１】
ＳＳＤ３では、コマンドをフェッチすべき発行キューが複数の発行キューＳＱ１，ＳＱ２から選択される。図７では、発行キューＳＱ１が選択された場合が例示されている。
【００９２】
（１）コマンドのフェッチ
ＳＳＤ３のコントローラ４は、コマンド送受信部２２を使用して、選択された発行キューから一つ以上のコマンドを順番にフェッチする。フェッチされたコマンド（ここでは、コマンドＡ）は、ＳＳＤ３のメイン受信キュー４１に積まれる。コマンドがフェッチされる際、Burstサイズによって指定される数のコマンドが一度にフェッチされてもよい。もしくは、コマンドをフェッチする動作とフェッチされたコマンドを処理する動作とを含むサイクルを、フェッチされたコマンドの数がBurstサイズによって指定される数に達するまで繰り返されてもよい。ある一つの発行キューからBurstサイズによって指定される数のコマンドがフェッチされると、アービトレーション機構２１によってコマンドをフェッチすべき発行キューが新たに選択し直される。
【００９３】
例えば、発行キューＳＱ１からBurstサイズによって指定される数のコマンドがフェッチされた後、コマンドをフェッチすべき発行キューが発行キューＳＱ２に切り替えられ、発行キューＳＱ２からコマンドがフェッチされるようになる。また、発行キューＳＱ２からBurstサイズによって指定される数のコマンドがフェッチされた後、コマンドをフェッチすべき発行キューが発行キューＳＱ１に切り替えられ、発行キューＳＱ１から後続のコマンドがフェッチされるようになる。
【００９４】
（２）コマンド処理
次に、ＳＳＤ３のコントローラ４は、フェッチされたコマンド（ここでは、コマンドＡ）を実行する。また、コマンドＡが実行されている間に、ＳＳＤ３のコントローラ４は、コマンドＡが他のコマンドと並列に実行可能なコマンドであるか否か（つまり、並列処理可能か否か）を判定する。コマンドＡが排他的に実行されなければならない種別のコマンドであるならば、並列処理不可能と判定される。一方、コマンドＡが排他的に実行されなくてもよい種別のコマンドであるならば、並列処理可能と判定される。
【００９５】
なお、この判定は、コマンドＡの処理に要する時間が閾値ｔ１よりも長い場合にのみ、実行されてもよい。
【００９６】
（３）後続のコマンドのフェッチ
並列処理可能と判定されたならば、ＳＳＤ３のコントローラ４は、コマンドＡがフェッチされた発行キューと同じ発行キューまたは他の発行キューから後続のコマンドをフェッチする。例えば、現在選択されている発行キューからフェッチされたコマンドの数がBurstサイズによって指定される数に満たない場合には、同じ発行キューから後続のコマンドがフェッチされてもよい。この場合、ＳＳＤ３のコントローラ４は、同じ発行キューに対応するヘッドポインタによって指されるこの発行キューのエントリから後続のコマンドをフェッチする。一方、現在選択されている発行キューからフェッチされたコマンドの数がBurstサイズによって指定される数に達した後は、アービトレーション機構２１によって新たに選択される別の発行キューから後続のコマンドがフェッチされてもよい。もし新たに選択された発行キューにおいてテールポインタがヘッドポインタと等しいならば、この発行キューはスキップされ、次の発行キューがアービトレーション機構２１によって新たに選択される。新たに選択された発行キューにコマンドが積まれているならば、新たに選択された発行キューに対応するヘッドポインタによって指されるこの発行キューのエントリから後続のコマンドがフェッチされる。図７では、発行キューＳＱ２から後続のコマンド（ここでは、コマンドＢ）がフェッチされる場合が例示されている。フェッチされたコマンド（ここでは、コマンドＢ）は、ＳＳＤ３内のサブ受信キュー４２に積まれる。
【００９７】
（４）コマンドチェック
次に、ＳＳＤ３のコントローラ４は、フェッチされた後続のコマンド（コマンドＢ）を解析し、このフェッチされた後続のコマンド（コマンドＢ）が、現在のコマンド（コマンドＡ）の実行中に実行可能なコマンドであるか否かを判定する。
【００９８】
（５）チェック結果に基づく動作
コマンドチェックの結果、コマンドＢがコマンドＡの実行中に実行可能なコマンドであると判定されたならば、ＳＳＤ３のコントローラ４は、実行中の現在のコマンド（コマンドＡ）の完了を待つこと無く、サブ受信キュー４２に入れられたコマンドＢを実行する。即ち、コマンドＡとコマンドＢとが並列に実行される。
【００９９】
他方、コマンドＢがコマンドＡの実行中に実行可能なコマンドではないならば、コマンドＡの処理が完了するまでコマンドＢは実行されない。
【０１００】
このように、現在のコマンドの実行中に後続のコマンドをフェッチしても、そのフェッチした後続のコマンドによっては、この後続のコマンドを、実行中の現在のコマンドと並列に実行できない場合がある。
【０１０１】
図８のフローチャートは、上述のコマンドプレチェック処理を使用しない場合のコマンド処理の手順を示す。
【０１０２】
ホスト２において、ＳＳＤ３に所定の動作を実行させるためのコマンドが発行キューに積まれる（ステップＳ１０１）。コマンドが発行キューに積まれると、新たなコマンドが発行キューＳＱに存在することがＳＳＤ３に通知される。
【０１０３】
ＳＳＤ３では、アービトレーション機構２１によってコマンドをフェッチすべき発行キューが選択される（ステップＳ１０２）。そして、コマンド処理部３１は、コマンド送受信部２２を使用して、選択された発行キューから一つ以上のコマンドをフェッチする（ステップＳ１０３）。フェッチされたコマンドは、メイン受信キュー４１に積まれる（ステップＳ１０４）。そして、コマンド処理部３１によってメイン受信キュー４１内のコマンドが実行される（ステップＳ１０５）。
【０１０４】
次に、実行中のコマンドが他のコマンドと並列に実行可能なコマンドであるか否かが判定される（ステップＳ１０６）。
【０１０５】
実行中のコマンドが他のコマンドと並列に実行可能なコマンドであると判定されたならば（ステップＳ１０６のＹＥＳ）、後続のコマンドが、実行中の現在のコマンドがフェッチされた発行キューと同じ発行キューまたは他の発行キューからフェッチされる（ステップＳ１０２またはステップＳ１０３）。
【０１０６】
フェッチされた後続のコマンドは、サブ受信キュー４２に積まれる（ステップＳ１０４）。サブ受信キュー４２に積まれた後続のコマンドが現在のコマンドの実行中に実行可能なコマンドであるか否かがコマンド処理部３１によって判定される。後続のコマンドが現在のコマンドの実行中に実行可能なコマンドであるならば、後続のコマンドは、現在のコマンドと並列に実行される。一方、後続のコマンドが現在のコマンドの実行中に実行可能なコマンドではないならば、後続のコマンドは、現在のコマンドが完了するまで実行されない。
【０１０７】
実行中の現在のコマンドが、他のコマンドと並列に実行可能なコマンドではないと判定されたならば（ステップＳ１０６のＮＯ）、後続のコマンドはフェッチされず、実行中のコマンドの処理が継続される。
【０１０８】
実行中のコマンドの処理が完了すると（ステップＳ１０７）、コマンド完了の応答が完了送信キュー４３に積まれ（ステップＳ１０８）、そしてこのコマンド完了の応答が完了キューに積まれる（ステップＳ１０９）。
【０１０９】
次に、ＳＳＤ３において、現在選択されている発行キューからフェッチおよび実行されたコマンドの数がBurstサイズによって指定された数に達したか否かが判定される（ステップＳ１１０）。
【０１１０】
現在選択されている発行キューからフェッチおよび実行されたコマンドの数がBurstサイズによって指定された数に達していなければ（ステップＳ１１０のＮＯ）、現在選択されている発行キューから後続のコマンドがフェッチされる（ステップＳ１０３）。
【０１１１】
他方、現在選択されている発行キューからフェッチおよび実行されたコマンドの数がBurstサイズによって指定された数に達したならば（ステップＳ１１０のＹＥＳ）、ホスト２内のすべてのコマンドが処理されたか否かが判定される（ステップＳ１１１）。
【０１１２】
すべてのコマンドが処理されたならば（ステップＳ１１０のＹＥＳ）、本フローチャートで示される処理は終了する。
【０１１３】
他方、すべての発行キューに属するコマンドのなかで未処理のコマンドが存在するならば（ステップＳ１１１のＮＯ）、本フローチャートで示される処理はステップＳ１０２の処理に移る。
【０１１４】
次に、本実施形態のＳＳＤ３によって実行される、コマンドプレチェックを含むコマンド処理を説明する。
【０１１５】
本実施形態では、現在のコマンドの処理の完了を待っている待ち時間中に、ホストメモリ上の発行キューＳＱの後続のコマンドのコマンド種別等を先行して判定するプレチェック処理が行われ、これによって後続のコマンドが現在のコマンドの実行中に実行可能か否かの判定をコマンド受信前に行うことが可能となる。以下、コマンドプレチェックを含むコマンド処理の概要を説明する。
【０１１６】
（１）ＳＳＤ３のコントローラ４が発行キューＳＱからコマンドをフェッチし、このコマンドの処理を開始する。
【０１１７】
（２）このコマンドが他のコマンドと並列に処理可能なコマンドあるか、あるいは、このコマンドが他のコマンドと並列に処理可能なコマンドあり且つこのコマンドの処理に要する時間が閾値ｔ１よりも長い場合
（ａ）ＳＳＤ３のコントローラ４が実行中の現在のコマンドがフェッチされた発行キューと同じ発行キューまたは他の発行キュー内の後続のコマンドを、この後続のコマンドを同じ発行キューまたは他の発行キューに残した状態でプレチェックする。  
（ｂ）後続のコマンドが現在のコマンドの実行中に実行可能なコマンドである場合
（ｉ）コントローラ４がこの後続のコマンドをサブ受信キュー４２にフェッチして、この後続のコマンドを処理する。  
（ｃ）後続のコマンドが現在のコマンドの実行中に実行可能なコマンドでない場合
（ｉ）コントローラ４は何もしない。
【０１１８】
（３）このコマンドが他のコマンドと並列に処理可能なコマンドではない場合、あるいはこのコマンドが他のコマンドと並列に処理可能なコマンドであるが、このコマンドの処理に要する時間が閾値ｔ１以下である場合
（ａ）コントローラ４は何もしない。
【０１１９】
このように、本実施形態では、後続のコマンドが、この後続のコマンドを発行キュー内に残した状態でチェックされ、後続のコマンドが実際にフェッチされる前に、この後続のコマンドが現在のコマンドの実行中に実行可能なコマンドであるか否かが判定される。これにより、現在のコマンドの実行中に実行できない後続のコマンドが発行キューからサブ受信キュー４２にフェッチされることを防止でき、またこの後続のコマンドの処理に割り当て可能なコマンド実行時間が短くなることを防ぐことができる。
【０１２０】
このように、本実施形態では、より細やかなコマンド制御が可能となることで、以下のような効果も期待できる。
【０１２１】
＜Ａｂｏｒｔコマンドの機能強化＞
コントローラ４は、発行キューＳＱをプレチェックすることによってＡｂｏｒｔコマンドが発行キューＳＱに存在するか否かを事前に確認することができる。Ａｂｏｒｔコマンドが発行キューＳＱに存在する場合には、コントローラ４は、このＡｂｏｒｔコマンドによってアボートされるべきコマンドの処理を事前に停止しておくことができる。
【０１２２】
＜連続実行が必要なコマンド（Ｆｕｓｅｄオペレーション）の処理判定の高速化＞
連続実行が必要なコマンドにおいては、コマンドパラメータがこれらコマンド間で矛盾していた場合にこれらコマンドの処理を中止する必要がある。コントローラ４は、発行キューＳＱをプレチェックすることによって、連続実行が必要なコマンド（Ｆｕｓｅｄオペレーション）間のコマンドパラメータの整合性を事前に確認することができる。コマンドパラメータがこれらコマンド間で矛盾していた場合、コントローラ４は、これらコマンドの処理を停止すべきことを速やかに判定することができる。
【０１２３】
＜柔軟なコマンド処理＞
Burstサイズによって指定されたコマンド数がある発行キューＳＱからメイン受信キュー４１にフェッチされており、これらコマンドの少なくとも一つの処理に多くの時間を要する場合、コントローラ４は、別の発行キューＳＱをプレチェックすることによって、実行中の現在のコマンドと並列処理可能なコマンドを別の発行キューＳＱからサブ受信キュー４２にフェッチすることができる。これにより、コマンド処理の効率を向上することが可能となる。
【０１２４】
図９は、コマンドプレチェックを含むコマンド処理の例を示す。
【０１２５】
ホスト２では、ＳＳＤ３によって実行されるべきコマンドが発行キューＳＱに積まれる。図９では、発行キューＳＱ１にコマンドＡが積まれ、発行キューＳＱ２にコマンドＢが積まれた場合が例示されている。コマンドが発行キューＳＱに積まれると、新たなコマンドが発行キューＳＱに存在することがＳＳＤ３に通知される。
【０１２６】
ＳＳＤ３では、コマンドをフェッチすべき発行キューが複数の発行キューＳＱ１，ＳＱ２から選択される。図９では、発行キューＳＱ１が選択された場合が例示されている。
【０１２７】
（１）コマンドのフェッチ
ＳＳＤ３のコントローラ４は、コマンド送受信部２２を使用して、選択された発行キューから一つ以上のコマンドを順番にフェッチする。フェッチされたコマンド（ここでは、コマンドＡ）は、ＳＳＤ３のメイン受信キュー４１に積まれる。コマンドがフェッチされる際、Burstサイズによって指定される数のコマンドが一度にフェッチされてもよい。もしくは、コマンドをフェッチする動作とフェッチされたコマンドを処理する動作とを含むサイクルを、フェッチされたコマンドの数がBurstサイズによって指定される数に達するまで繰り返されてもよい。ある一つの発行キューからBurstサイズによって指定される数のコマンドがフェッチされると、アービトレーション機構２１によってコマンドをフェッチすべき発行キューが新たに選択し直される。
【０１２８】
（２）コマンド処理
次に、ＳＳＤ３のコントローラ４は、フェッチされたコマンド（ここでは、コマンドＡ）を実行する。また、コマンドＡが実行されている間に、ＳＳＤ３のコントローラ４は、コマンドＡが他のコマンドと並列処理可能か否かを判定する。なお、この判定は、コマンドＡの処理に要する時間が閾値ｔ１よりも長い場合にのみ、実行されてもよい。
【０１２９】
（３）コマンドのプレチェック
並列処理可能と判定されたならば、実行中の現在のコマンド（ここでは、コマンドＡ）がフェッチされた発行キューと同じ発行キュー（発行キューＳＱ１）または他の発行キュー（発行キューＳＱ２）内の後続のコマンドが、コマンドプレチェック部３２によってプレチェックされる。この後続のコマンドは、発行キューＳＱ１内の先頭のコマンドまたは発行キューＳＱ２内の先頭のコマンドである。例えば、現在選択されている発行キューからフェッチされたコマンドの数がBurstサイズによって指定される数に満たない場合には、同じ発行キュー内の後続のコマンド（先頭のコマンド）がプレチェックされてもよい。この場合、ＳＳＤ３のコントローラ４は、同じ発行キューに対応するヘッドポインタによって指されるこの発行キューのエントリに格納されている後続のコマンドをプレチェックする。一方、現在選択されている発行キューからフェッチされたコマンドの数がBurstサイズによって指定される数に達した後は、アービトレーション機構２１によって新たに選択される別の発行キュー内の後続のコマンド（先頭のコマンド）がプレチェックされてもよい。この場合、コマンドプレチェック部３２は、新たに選択された発行キューに対応するヘッドポインタによって指されるこの発行キューのエントリに格納されている後続のコマンドをプレチェックする。
【０１３０】
図９では、発行キューＳＱ２内のコマンドＢがプレチェックされる場合が例示されている。後続のコマンドをプレチェックする処理では、コマンドプレチェック部３２は、後続のコマンド（ここでは、発行キューＳＱ２内のコマンドＢ）の内容を、この後続のコマンドを発行キューＳＱ２内に残した状態でチェックして、後続のコマンド（コマンドＢ）が、現在のコマンド（ここでは、コマンドＡ）の実行中に実行可能なコマンドであるか否かを判定する。例えば、コマンドプレチェック部３２は、発行キューＳＱ２に対応するヘッドポインタによって指される発行キューＳＱ２内のエントリをこのヘッドポインタを更新せずに参照する。これにより、このエントリは空きエントリにはならないので、後続のコマンドはこのエントリ内に維持される。エントリを参照する処理においては、コマンドプレチェック部３２は、このエントリ内の一部の情報のみをホストメモリからリードしてもよい。例えば、このエントリからオペレーションコードのみをリードしてもよいし、このエントリからオペレーションコードとコマンドパラメータの一部（例えば、データ長、開始ＬＢＡ、等）のみをリードしてもよい。
【０１３１】
そして、コマンドプレチェック部３２は、このプレチェック結果に基づいて、後続のコマンド（コマンドＢ）が、現在のコマンド（コマンドＡ）の実行中に実行可能なコマンドであるか否かを判定する。
【０１３２】
（４）フェッチ処理なし
後続のコマンド（コマンドＢ）が、現在のコマンド（コマンドＡ）の実行中に実行可能なコマンドではないと判定されたならば、後続のコマンド（コマンドＢ）はフェッチされない。図９では、コマンドＢは発行キューＳＱ２からフェッチされず、発行キューＳＱ２内に維持される。
【０１３３】
（５）フェッチ処理の実行
後続のコマンド（コマンドＢ）が、現在のコマンド（コマンドＡ）の実行中に実行可能なコマンドであると判定されたならば、後続のコマンド（コマンドＢ）がフェッチされる。図９では、コマンドＢが発行キューＳＱ２からフェッチされる。この場合、発行キューＳＱ２に対応するヘッドポインタは更新される。フェッチされた後続のコマンド（コマンドＢ）はサブ受信キュー４２に積まれる。
【０１３４】
（６）並列処理
続いて、ＳＳＤ３のコントローラ４は、実行中の現在のコマンド（コマンドＡ）の完了を待つこと無く、サブ受信キュー４２に入れられたコマンドＢを実行する。即ち、コマンドＡとコマンドＢとが並列に実行される。
【０１３５】
なお、発行キューＳＱ１からフェッチされたコマンドＡ，Ｂ，Ｃがメイン受信キュー４１内にフェッチされ、これらコマンドＡ，Ｂ，Ｃがコマンド処理部３１によって実行されるケースにおいては、これらコマンドＡ，Ｂ，Ｃと並列に実行可能なコマンドが発行キューＳＱ１またはＳＱ２に存在するか否かが判定されてもよい。例えば、発行キューＳＱ２に積まれているコマンドＤ，Ｅ，ＦがコマンドＡ，Ｂ，Ｃの実行中に実行可能なコマンド群であるならば、これらコマンドＤ，Ｅ，Ｆが発行キューＳＱ２からサブ受信キュー４２にフェッチされ、コマンドＡ，Ｂ，Ｃと並列に実行されてもよい。
【０１３６】
図１０は、本実施形態のメモリシステムによって実行される、コマンドプレチェックを含むコマンド処理の別の例を示す。
【０１３７】
ホスト２では、ＳＳＤ３によって実行されるべきコマンドが発行キューＳＱに積まれる。図１０では、発行キューＳＱ１にコマンドＡが積まれ、発行キューＳＱ２にコマンドＢが積まれ、発行キューＳＱ３にコマンドＣが積まれた場合が例示されている。コマンドが発行キューＳＱに積まれると、新たなコマンドが発行キューＳＱに存在することがＳＳＤ３に通知される。
【０１３８】
ＳＳＤ３では、発行キューＳＱ１，ＳＱ２，ＳＱ３に積まれたコマンドを処理するために、アービトレーション機構２１によって、コマンドをフェッチすべき発行キューが複数の発行キューＳＱ１，ＳＱ２，ＳＱ３から選択される。図１０では、発行キューＳＱ１が選択されている。
【０１３９】
（１）コマンドのフェッチ
アービトレーション機構２１によって発行キューが選択されると、ＳＳＤ３のコントローラ４は、コマンド送受信部２２を使用して、選択された発行キューから一つ以上のコマンドをフェッチする。フェッチされたコマンド（ここでは、コマンドＡ）は、ＳＳＤ３のメイン受信キュー４１に積まれる。コマンドがフェッチされる際、Burstサイズによって指定される数のコマンドが一度にフェッチされてもよい。もしくは、コマンドをフェッチする動作とフェッチされたコマンドを処理する動作とを含むサイクルを、フェッチされたコマンドの数がBurstサイズによって指定される数に達するまで繰り返されてもよい。
【０１４０】
（２）コマンド処理
次に、ＳＳＤ３のコントローラ４は、フェッチされたコマンド（ここでは、コマンドＡ）を実行する。また、コマンドＡが実行されている間に、ＳＳＤ３のコントローラ４は、コマンドＡが他のコマンドと並列処理可能か否かを判定する。なお、この判定は、コマンドＡの処理に要する時間が閾値ｔ１よりも長い場合にのみ、実行されてもよい。
【０１４１】
（３）コマンドのプレチェック
並列処理可能と判定されたならば、実行中の現在のコマンド（ここでは、コマンドＡ）がフェッチされた発行キューと異なる発行キュー（発行キューＳＱ２、または発行キューＳＱ３）内の後続のコマンドが、コマンドプレチェック部３２によってプレチェックされる。図１０では、発行キューＳＱ２内のコマンドＢがプレチェックされる場合が例示されている。後続のコマンドをプレチェックする処理では、コマンドプレチェック部３２は、後続のコマンド（ここでは、発行キューＳＱ２内のコマンドＢ）の内容を、この後続のコマンドを発行キューＳＱ２内に残した状態でチェックして、後続のコマンド（コマンドＢ）が、現在のコマンド（ここでは、コマンドＡ）の実行中に実行可能なコマンドであるか否かを判定する。例えば、コマンドプレチェック部３２は、発行キューＳＱ２に対応するヘッドポインタによって指される発行キューＳＱ２内のエントリをこのヘッドポインタを更新せずに参照する。これにより、たとえこのエントリが参照されても、後続のコマンド（コマンドＢ）はこのエントリ内に維持される。エントリを参照する処理においては、コマンドプレチェック部３２は、このエントリ内の一部の情報のみをホストメモリからリードしてもよい。
【０１４２】
そして、コマンドプレチェック部３２は、このプレチェック結果に基づいて、後続のコマンド（コマンドＢ）が、現在のコマンド（コマンドＡ）の実行中に実行可能なコマンドであるか否かを判定する。
【０１４３】
（４）別の発行キュー内のコマンドのプレチェック
後続のコマンド（コマンドＢ）が、現在のコマンド（コマンドＡ）の実行中に実行可能なコマンドではないと判定されたならば、その後続のコマンド（コマンドＢ）はフェッチされず、さらに別の発行キュー（発行キューＳＱ３）内の後続のコマンド（コマンドＣ）が、コントローラ４のコマンドプレチェック部３２によってプレチェックされる。そして、コマンドプレチェック部３２は、このプレチェック結果に基づいて、後続のコマンド（コマンドＣ）が、現在のコマンド（コマンドＡ）の実行中に実行可能なコマンドであるか否かを判定する。発行キューＳＱ３の後続のコマンド（コマンドＣ）をプレチェックする処理では、コマンドプレチェック部３２は、後続のコマンド（ここでは、発行キューＳＱ３内のコマンドＣ）の内容を、この後続のコマンドを発行キューＳＱ３内に残した状態でチェックして、後続のコマンド（コマンドＣ）が、現在のコマンド（ここでは、コマンドＡ）の実行中に実行可能なコマンドであるか否かを判定する。例えば、コマンドプレチェック部３２は、発行キューＳＱ３に対応するヘッドポインタによって指される発行キューＳＱ３内のエントリをこのヘッドポインタを更新せずに参照する。これにより、たとえこのエントリが参照されても、後続のコマンドはこのエントリ内に維持される。エントリを参照する処理においては、コマンドプレチェック部３２は、このエントリ内の一部の情報のみをホストメモリからリードしてもよい。
【０１４４】
（５）フェッチ処理の実行
後続のコマンド（コマンドＣ）が、現在のコマンド（コマンドＡ）の実行中に実行可能なコマンドであると判定されたならば、後続のコマンドがフェッチされる。図１０で言うと、コマンドＣが発行キューＳＱ３からフェッチされる。フェッチされた後続のコマンド（コマンドＣ）はサブ受信キュー４２に積まれる。
【０１４５】
（６）並列処理
続いて、ＳＳＤ３のコントローラ４は、実行中の現在のコマンド（コマンドＡ）の完了を待つこと無く、サブ受信キュー４２に入れられたコマンドＣを実行する。即ち、コマンドＡとコマンドＣとが並列に実行される。
【０１４６】
なお、発行キューＳＱ１からフェッチされたコマンドＡ，Ｂ，Ｃがメイン受信キュー４１内にフェッチされ、これらコマンドＡ，Ｂ，Ｃがコマンド処理部３１によって実行されるケースにおいては、これらコマンドＡ，Ｂ，Ｃと並列に実行可能なコマンドが他の発行キューＳＱ２またはＳＱ３に存在するか否かが判定されてもよい。例えば、まず、発行キューＳＱ２に積まれているコマンドＤ，Ｅ，Ｆがプレチェックされ、これらコマンドＤ，Ｅ，ＦがコマンドＡ，Ｂ，Ｃの実行中に実行可能なコマンド群であるか否かが判定されてもよい。これらコマンドＤ，Ｅ，ＦがコマンドＡ，Ｂ，Ｃの実行中に実行可能なコマンド群ではないならば、発行キューＳＱ３に積まれているコマンドＧ，Ｈ，Ｉがプレチェックされ、これらコマンドＧ，Ｈ，ＩがコマンドＡ，Ｂ，Ｃの実行中に実行可能なコマンド群であるか否かが判定されてもよい。これらコマンドＧ，Ｈ，ＩがコマンドＡ，Ｂ，Ｃの実行中に実行可能なコマンド群であるならば、これらコマンドＧ，Ｈ，Ｉが発行キューＳＱ３からサブ受信キュー４２にフェッチされ、コマンドＡ，Ｂ，Ｃと並列に実行されてもよい。
【０１４７】
図１１は、本実施形態のメモリシステムによって実行されるコマンドプレチェック動作を示す。
【０１４８】
（１）ＳＳＤ３のコントローラ４は、ヘッドポインタによって指される発行キューＳＱ内のエントリに格納されているコマンドをプレチェックする。このとき、ＳＳＤ３のコントローラ４は、ヘッドポインタによって指される発行キューＳＱ内のエントリをヘッドポインタを更新せずに参照する。
【０１４９】
（２）プレチェック結果に基づいて、プレチェックされたコマンドが、現在のコマンドの実行中に実行可能なコマンドであると判定されたならば、ＳＳＤ３のコントローラ４は、ヘッドポインタによって指される発行キューＳＱ内のエントリからコマンドをフェッチし、フェッチされたコマンドをサブ受信キュー４２に格納する。
【０１５０】
（３）ＳＳＤ３のコントローラ４は、ヘッドポインタの値を更新（インクリメント）する。ホスト２は、以前のヘッドポインタの値によって指されていたエントリを空きエントリとして扱うことができる。
【０１５１】
図１２のフローチャートは、本実施形態のコマンド処理の手順を示す。
【０１５２】
ホスト２において、ＳＳＤ３に所定の動作を実行させるためのコマンドが発行キューＳＱに積まれる（ステップＳ２０１）。コマンドが発行キューＳＱに積まれると、更新されたテールポインタの値がホスト２によってコントローラ４内のレジスタ（この発行キューＳＱに対応するドアベルテールレジスタ）に書き込まれ、これによって新たなコマンドが発行キューＳＱに存在することがホスト２によってＳＳＤ３に通知される。
【０１５３】
ＳＳＤ３では、アービトレーション機構２１によってコマンドをフェッチすべき発行キューＳＱが複数の発行キューＳＱ１、ＳＱ２、ＳＱ３、…から選択される（ステップＳ２０２）。そして、コマンド処理部３１は、コマンド送受信部２２を使用して、選択された発行キューＳＱから一つ以上のコマンドをフェッチする（ステップＳ２０３）。ステップＳ２０３では、選択された発行キューＳＱに対応するヘッドポインタによって指されるこの選択された発行キューＳＱのエントリからコマンドがフェッチされる。フェッチされたコマンドは、メイン受信キュー４１に積まれる（ステップＳ２０４）。そして、コマンド処理部３１によってメイン受信キュー４１内のコマンドが解析され、このコマンドが処理（実行）される（ステップＳ２０５）。そして、実行中のコマンドが他のコマンドと並列に実行可能なコマンドであるか否かがコマンド処理部３１によって判定される（ステップＳ２０６）。
【０１５４】
実行中のコマンドが他のコマンドと並列に実行可能なコマンドであると判定されたならば（ステップＳ２０６のＹＥＳ）、実行中の現在のコマンドがフェッチされた発行キューと同じ発行キューまたは他の発行キュー内の後続のコマンドが、コマンドプレチェック部３２によってプレチェックされる（ステップＳ２０７）。ステップＳ２０７では、コマンドプレチェック部３２は、プレチェック対象の発行キューに対応するヘッドポインタによって指されるエントリをこのヘッドポインタを更新せずに参照し、これによって後続のコマンドの内容を、この後続のコマンドをプレチェック対象の発行キュー内に残した状態でチェックする。ステップＳ２０７では、コマンドプレチェック部３２は、このエントリ内の一部の情報のみをヘッドポインタによって指されるエントリからリードしてもよい。
【０１５５】
そして、コマンドプレチェック部３２は、このプレチェック結果に基づいて、後続のコマンドが現在のコマンドの実行中に実行可能なコマンドであるか否かを判定する（ステップＳ２０８）。
【０１５６】
後続のコマンドが、現在のコマンドの実行中に実行可能なコマンドであると判定されたならば（ステップＳ２０８のＹＥＳ）、その後続のコマンドはフェッチされる。この後続のコマンドが同じ発行キュー内のコマンドであるならば、この後続のコマンドはステップＳ２０３においてフェッチされる。一方、この後続のコマンドが他の発行キュー内のコマンドであるならば、アービトレーション機構２１によって当該他の発行キューが選択された後に、当該他の発行キューからフェッチされてもよい（ステップＳ２０２、Ｓ２０３）。そして、プレチェック対象の発行キューに対応するヘッドポインタの値が更新され、以前のヘッドポインタの値によって指されたエントリは解放される。フェッチされた後続のコマンドは、サブ受信キュー４２に積まれ（ステップＳ２０４）、そして現在のコマンドと並列に実行される（ステップＳ２０５）。
【０１５７】
他方、後続のコマンドが、現在のコマンドの実行中に実行可能なコマンドではないと判定されたならば（ステップＳ２０８のＮＯ）、プレチェックされた後続のコマンドはフェッチされない。プレチェック対象の発行キューに対応するヘッドポインタの値も更新されない。
【０１５８】
実行中の現在のコマンドが、他のコマンドと並列に実行可能なコマンドではないと判定されたならば（ステップＳ２０６のＮＯ）、後続のコマンドのプレチェックは実行されず、実行中のコマンドの処理が継続される。
【０１５９】
実行中のコマンドの処理が完了すると（ステップＳ２０９）、コマンド完了の応答が完了送信キュー４３に積まれ（ステップＳ２１０）、そしてこのコマンド完了の応答が完了キューに積まれる（ステップＳ２１１）。
【０１６０】
次に、ＳＳＤ３において、現在選択されている発行キューからフェッチおよび実行されたコマンドの数がBurstサイズによって指定された数に達したか否かが判定される（ステップＳ２１２）。
【０１６１】
現在選択されている発行キューからフェッチおよび実行されたコマンドの数がBurstサイズによって指定された数に達していなければ（ステップＳ２１２のＮＯ）、現在選択されている発行キューから後続のコマンドがフェッチされる（ステップＳ２０３）。
【０１６２】
他方、現在選択されている発行キューからフェッチおよび実行されたコマンドの数がBurstサイズによって指定された数に達したならば（ステップＳ２１２のＹＥＳ）、ホスト２内のすべてのコマンドが処理されたか否かが判定される（ステップＳ２１３）。
【０１６３】
すべてのコマンドが処理されたならば（ステップＳ２１３のＹＥＳ）、本フローチャートで示される処理は終了する。
【０１６４】
他方、すべての発行キューに属するコマンドのなかで未処理のコマンドが存在するならば（ステップＳ２１３のＮＯ）、本フローチャートで示される処理はステップＳ２０２の処理に移る。
【０１６５】
上述したステップＳ２０８において、プレチェックの結果に基づいて、後続のコマンドが実行中の現在のコマンドと並列に実行可能なコマンドではないと判定された場合、ホスト２内のすべての発行キュー内の全てのコマンドの中から、実行中のコマンドと並列に実行可能なコマンドを探してもよい。そして、実行中のコマンドと並列に実行可能な後続のコマンドが存在すれば、その後続のコマンドをフェッチし、そのフェッチされた後続のコマンドを実行中のコマンドとを並列に実行してもよい。この場合、もし実行中のコマンドと並列に実行可能な後続のコマンドが発行キュー内の先頭のコマンドではないならば、先頭のコマンドからこの後続のコマンドまでのコマンドがまとめてフェッチされ、そして、後続のコマンドだけが実行中のコマンドと並列に実行されてもよい。例えば、発行キューにコマンドＡ，Ｂ，Ｃがこの順に積まれていた場合において、このコマンドＡが現在実行されており、次のコマンドＢがコマンドＡと並列に実行可能なコマンドではなく、さらに次のコマンドＣがコマンドＡと並列に実行可能なコマンドであったならば、コマンドＢとコマンドＣがまとめてフェッチされ、そして、コマンドＣだけがコマンドＡと並列に実行されてもよい。
【０１６６】
実行中のコマンドと並列に実行可能な後続のコマンドが存在しなければ、実行中のコマンドの処理が完了するまで後続のコマンドはフェッチされない。
【０１６７】
以上説明したように、本実施形態においては、現在のコマンドの実行中に、現在のコマンドがフェッチされた発行キューと同一の発行キューまたは他の発行キューの後続のコマンドの内容が、この後続のコマンドを同一の発行キューまたは他の発行キュー内に残した状態でチェックされる。このチェックは、例えば、同一の発行キューまたは他の発行キューに対応するヘッドポインタによって指される同一の発行キューまたは他の発行キュー内のエントリをこのヘッドポインタを更新せずに参照することによって実行できる。後続のコマンドが現在のコマンドの実行中に実行可能なコマンドである場合、同一の発行キューまたは他の発行キューからこの後続のコマンドがサブ受信キュー４２にフェッチされ、この後続のコマンドが現在のコマンドと並列に実行される。
【０１６８】
このように、本実施形態では、後続のコマンドが、この後続のコマンドを発行キュー内に残した状態でチェックされ、後続のコマンドが実際にフェッチされる前に、この後続のコマンドが現在のコマンドの実行中に実行可能なコマンドであるか否かが判定される。これにより、現在のコマンドの実行中に実行できない後続のコマンドが発行キューからサブ受信キュー４２にフェッチされてしまうことを防止できるので、実行のための受信キューの切り換え頻度の増加によるオーバーヘッドを軽減でき、またコマンド実行時間が短くなることも防止することができる。結果、コマンドハンドリング機能の向上することが可能となり、これによってＳＳＤ３のコマンド処理の性能を改善することが可能となる。
【０１６９】
なお、本実施形態では、不揮発性メモリとしてＮＡＮＤ型フラッシュメモリを例示した。しかし、本実施形態の機能は、例えば、ＭＲＡＭ（Ｍａｇｎｅｔｏｒｅｓｉｓｔｉｖｅ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＰＲＡＭ（Ｐｈａｓｅ  ｃｈａｎｇｅ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＲｅＲＡＭ（Ｒｅｓｉｓｔｉｖｅ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、又は、ＦｅＲＡＭ（Ｆｅｒｒｏｅｌｅｃｔｒｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）のような他の様々な不揮発性メモリにも適用できる。
【０１７０】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１７１】
２…ホスト、３…ＳＳＤ、４…コントローラ、５…ＮＡＮＤ型フラッシュメモリ、２１…アービトレーション機構２１、２２…コマンド送受信部、３１…コマンド処理部、３２…コマンドプレチェック部、４１…メイン受信キュー、４２…サブ受信キュー、４３…完了送信キュー。
【図１】
2018169810.tif 000003
【図２】
2018169810.tif 000004
【図３】
2018169810.tif 000005
【図４】
2018169810.tif 000006
【図５】
2018169810.tif 000007
【図６】
2018169810.tif 000008
【図７】
2018169810.tif 000009
【図８】
2018169810.tif 000010
【図９】
2018169810.tif 000011
【図１０】
2018169810.tif 000012
【図１１】
2018169810.tif 000013
【図１２】
2018169810.tif 000014