(57)【要約】  Ｉ／Ｏデバイスを介して外部装置に接続される計算機であって、前記計算機は、前記外部装置に発行するコマンドにコマンド識別子を付与する制御部を有し、前記Ｉ／Ｏデバイスは、前記コマンド識別子の集合であるコマンド識別子空間の部分空間である部分コマンド識別子空間が定義される重複検知部を有し、前記重複検知部は、前記コマンド識別子空間内における前記部分コマンド識別子空間の配置を移動させながら、前記付与したコマンド識別子が他の使用中のコマンド識別子と重複しているか否かを判定する。
2016042635.tif 000002
【特許請求の範囲】
【請求項１】
Ｉ／Ｏデバイスを介して外部装置に接続される計算機であって、
前記計算機は、前記外部装置に発行するコマンドにコマンド識別子を付与する制御部を有し、
前記Ｉ／Ｏデバイスは、前記コマンド識別子の集合であるコマンド識別子空間の部分空間である部分コマンド識別子空間が定義される重複検知部を有し、
前記重複検知部は、前記コマンド識別子空間内における前記部分コマンド識別子空間の配置を移動させながら、前記付与したコマンド識別子が他の使用中のコマンド識別子と重複しているか否かを判定することを特徴とする計算機。
【請求項２】
請求項１に記載の計算機であって、
前記計算機は、プロセッサ、前記プロセッサに接続される記憶装置、及び前記プロセッサに接続される前記Ｉ／Ｏデバイスを備え、
前記記憶装置は、前記外部装置に対するＩ／Ｏ処理を制御するオペレーティングシステム及び前記Ｉ／Ｏ処理を実現する前記コマンドを発行するデバイスドライバを実現するプログラムを格納し、
前記Ｉ／Ｏデバイスは、前記Ｉ／Ｏデバイスを制御するコントローラ、及び前記デバイスドライバが前記コマンドに付与する前記コマンド識別子の重複を検知する前記重複検知部を有し、
前記重複検知部は、前記部分コマンド識別子空間に含まれる複数のコマンド識別子の各々の使用状態を管理するビットテーブルを有し、
前記ビットテーブルは、前記複数のコマンド識別子の各々の使用状態を示す値を格納するビットを複数含み、
前記重複検知部は、
前記コントローラから前記コマンド識別子が入力された場合、当該コマンド識別子を解析し、
前記コマンド識別子の解析結果に基づいて、前記コマンド識別子空間における前記部分コマンド識別子空間の配置の制御方法を決定し、
前記配置の制御方法に基づいて前記コマンド識別子空間に配置された前記部分コマンド識別子空間に含まれる前記コマンド識別子の重複を検知することを特徴とする計算機。
【請求項３】
請求項２に記載の計算機であって、
前記配置の制御方法は、前記コマンド識別子空間における前記部分コマンド識別子空間の位置を固定する第１の制御モード、及び前記コマンド識別子の使用状態に応じて、前記コマンド識別子空間における前記部分コマンド識別子空間の位置を動的に変更する第２の制御モードを選択可能であって、
前記重複検知部には、初期の前記配置の制御方法として前記第１の制御モードが適用され、
前記重複検知部は、
前記コントローラから入力された前記コマンド識別子が前記部分コマンド識別子空間に含まれるか否かを判定し、
前記コントローラから入力されたコマンド識別子が前記部分コマンド識別子空間に含まれないと判定された場合、前記第１の制御モードから前記第２の制御モードに切り替えることを特徴とする計算機。
【請求項４】
請求項３に記載の計算機であって、
前記ビットテーブルに含まれる複数のビットの各々には、前記コマンド識別子が使用されていないことを示す第１の値、及び前記コマンド識別子が使用されていることを示す第２の値の少なくともいずれかが設定され、
前記重複検知部は、完了した処理に対応する前記コマンドに含まれる前記コマンド識別子を設定するクリアレジスタを有し、
前記コントローラによって前記クリアレジスタに前記コマンド識別子が設定された場合、前記クリアレジスタに設定された前記コマンド識別子が前記部分コマンド識別子空間に含まれるか否かを判定し、
前記クリアレジスタに設定されたコマンド識別子が前記部分コマンド識別子空間に含まれると判定された場合、前記ビットテーブルにおける当該コマンド識別子に対応する前記ビットに前記第１の値を設定し、
前記配置の制御方法が前記第２の制御モードであるか否かを判定し、
前記配置の制御方法が前記第２の制御モードであると判定された場合、前記コマンド識別子空間における前記部分コマンド識別子空間の位置を変更する更新処理を実行することを特徴とする計算機。
【請求項５】
請求項４に記載の計算機であって、
前記複数のビットの各々には、前記ビットテーブルにおけるビットの位置を示すアドレスが設定され、
前記重複検知部は、前記コマンド識別子空間における前記部分コマンド識別子空間の先頭に対応する前記コマンド識別子を設定する範囲先頭レジスタを有し、
前記重複検知部が実行する前記更新処理は、
前記ビットテーブルを参照して、前記第２の値が設定され、かつ、最も小さい前記アドレスが設定されるビットを検索する処理と、
前記検索されたビットに対応する前記コマンド識別子が前記ビットテーブルの端の前記ビットに対応するように、前記ビットテーブルの前記複数のビットの値をシフトする処理と、
前記検索されたビットに対応するコマンド識別子を前記範囲先頭レジスタに設定する処理と、を含むことを特徴とする計算機。
【請求項６】
請求項４に記載の計算機であって、
前記複数のビットの各々には、前記ビットテーブルにおける位置を示す第１のアドレスが設定され、
前記コマンド識別子空間は、前記ビットテーブルと同一のサイズの複数の領域に分割され、
前記複数の領域の各々には、領域における位置を示す第２のアドレスが設定され、
前記第２のアドレスは、前記第１のアドレスと対応するように管理され、
前記重複検知部は、前記部分コマンド識別子空間の先頭の前記コマンド識別子が含まれる前記領域である基準領域の識別子を設定する範囲幅レジスタ、及び前記部分コマンド識別子空間の先頭の前記コマンド識別子の前記基準領域における前記第２のアドレスを設定する範囲先頭レジスタを有し、
前記重複検知部が実行する前記更新処理は、
前記ビットテーブルを参照して、前記クリアレジスタに設定された前記コマンド識別子に対応するビットの前記第１のアドレスより大きい前記第１のアドレスが設定されたビットの中から、前記第２の値が設定され、かつ、最も小さい前記第１のアドレスが設定されるビットを検索する処理と、
前記第２の値が設定され、かつ、前記最も小さい第１のアドレスが設定されるビットが存在しない場合、前記ビットテーブルを参照して、前記クリアレジスタに設定されたコマンド識別子に対応するビットの前記第１のアドレスより小さい前記第１のアドレスが設定されたビットの中から、前記第２の値が設定され、かつ、最も小さい前記第１のアドレスが設定されるビットを検索する処理と、
前記検索されたビットに対応する前記コマンド識別子が含まれる前記領域の識別子を前記範囲幅レジスタに設定する処理と、
前記検索されたビットの前記第１のアドレスに対応する前記第２のアドレスを前記範囲先頭レジスタに設定する処理と、を含むことを特徴とする計算機。
【請求項７】
請求項４に記載の計算機であって、
前記重複検知部は、使用されている前記コマンド識別子を設定するセットレジスタ、及び重複しているか否かを判定する前記コマンド識別子を設定するチェックレジスタを有し、
前記コントローラによって前記セットレジスタに前記コマンド識別子が設定された場合、前記セットレジスタに設定された前記コマンド識別子が前記部分コマンド識別子空間に含まれるか否かを判定し、
前記セットレジスタに設定されたコマンド識別子が前記部分コマンド識別子空間に含まれると判定された場合、前記ビットテーブルにおける当該コマンド識別子に対応する前記ビットに前記第２の値を設定し、
前記コントローラによって前記チェックレジスタに前記コマンド識別子が設定された場合、前記チェックレジスタに設定された前記コマンド識別子が前記部分コマンド識別子空間に含まれるか否かを判定し、
前記チェックレジスタに設定されたコマンド識別子が前記部分コマンド識別子空間に含まれると判定された場合、前記ビットテーブルにおける当該コマンド識別子に対応する前記ビットの値を読み出し、
前記読み出されたビットの値に基づいて、前記チェックレジスタに設定されたコマンド識別子が重複しているか否かを判定することを特徴とする計算機。
【請求項８】
請求項７に記載の計算機であって、
前記セットレジスタに設定されたコマンド識別子が前記部分コマンド識別子空間に含まれないと判定された場合、前記ビットテーブルの全ての前記ビットに前記第２の値が設定されているか否かを判定し、
前記ビットテーブルの全てのビットに前記第２の値が設定されていると判定された場合、前記ビットテーブルを用いて管理する前記部分コマンド識別子空間の前記コマンド識別子空間における位置を変更することを特徴とする計算機。
【請求項９】
請求項４に記載の計算機であって、
前記コントローラは、
前記重複検知部から、前記入力したコマンド識別子が前記部分コマンド識別子空間に含まれない旨の通知を受信した場合、当該コマンド識別子を含む前記コマンドの実行を一定時間待機し、
前記一定時間経過後に、前記入力されたコマンド識別子を前記重複検知部に再度入力することを特徴とする計算機。
【請求項１０】
一つ以上の第１の計算機、及び前記一つ以上の第１の計算機に接続される一つ以上の第２の計算機を備える計算機システムであって、
前記一つ以上の第１の計算機は、業務を実行し、
前記一つ以上の第２の計算機は、前記一つ以上の第１の計算機が使用する記憶領域を提供し、
前記一つ以上の第１の計算機は、
Ｉ／Ｏデバイスを介して前記一つ以上の第２の計算機に接続し、
前記第２の計算機に発行するコマンドにコマンド識別子を付与する制御部を有し、
前記Ｉ／Ｏデバイスは、前記コマンド識別子の集合であるコマンド識別子空間の部分空間である部分コマンド識別子空間が定義される重複検知部を有し、
前記重複検知部は、前記コマンド識別子空間内における前記部分コマンド識別子空間の配置を移動させながら、前記付与したコマンド識別子が他の使用中のコマンド識別子と重複しているか否かを判定することを特徴とする計算機システム。
【請求項１１】
請求項１０に記載の計算機システムであって、
前記一つ以上の第１の計算機は、第１のプロセッサ、前記第１のプロセッサに接続される第１の記憶装置、及び前記第１のプロセッサに接続され、前記一つ以上の第２の計算機との間のＩ／Ｏ処理を実行する前記Ｉ／Ｏデバイスを有し、
前記一つ以上の第２の計算機は、第２のプロセッサ、前記第２のプロセッサに接続される第２の記憶装置、及び前記第２のプロセッサに接続され、前記一つ以上の第１の計算機と接続するインタフェースを有し、
前記第１の記憶装置は、前記一つ以上の第２の計算機に対するＩ／Ｏ処理を制御するオペレーティングシステム及び前記Ｉ／Ｏ処理を実現する前記コマンドを発行するデバイスドライバを実現するプログラムを格納し、
前記Ｉ／Ｏデバイスは、前記Ｉ／Ｏデバイスを制御するコントローラ、及び前記デバイスドライバが前記コマンドに付与する前記コマンド識別子の重複を検知する前記重複検知部を有し、
前記重複検知部は、前記部分コマンド識別子空間に含まれる複数のコマンド識別子の各々の使用状態を管理するビットテーブルを有し、
前記ビットテーブルは、前記複数のコマンド識別子の各々の使用状態を示す値を格納するビットを複数含み、
前記重複検知部は、
前記コントローラから前記コマンド識別子が入力された場合、当該コマンド識別子を解析し、
前記コマンド識別子の解析結果に基づいて、前記コマンド識別子空間における前記部分コマンド識別子空間の配置の制御方法を決定し、
前記配置の制御方法に基づいて前記コマンド識別子空間に配置された前記部分コマンド識別子空間に含まれる前記コマンド識別子の重複を検知することを特徴とする計算機システム。
【請求項１２】
請求項１１に記載の計算機システムであって、
前記配置の制御方法は、前記コマンド識別子空間における前記部分コマンド識別子空間の位置を固定する第１の制御モード、及び前記コマンド識別子の使用状態に応じて、前記コマンド識別子空間における前記部分コマンド識別子空間の位置を動的に変更する第２の制御モードを選択可能であって、
前記重複検知部には、初期の前記配置の制御方法として前記第１の制御モードが適用され、
前記重複検知部は、
前記コントローラから入力された前記コマンド識別子が前記部分コマンド識別子空間に含まれるか否かを判定し、
前記コントローラから入力されたコマンド識別子が前記部分コマンド識別子空間に含まれないと判定された場合、前記第１の制御モードから前記第２の制御モードに切り替えることを特徴とする計算機システム。
【請求項１３】
請求項１２に記載の計算機システムであって、
前記ビットテーブルに含まれる複数のビットの各々には、前記コマンド識別子が使用されていないことを示す第１の値、及び前記コマンド識別子が使用されていることを示す第２の値の少なくともいずれかが設定され、
前記重複検知部は、完了した処理に対応する前記コマンドに含まれる前記コマンド識別子を設定するクリアレジスタを有し、
前記コントローラによって前記クリアレジスタに前記コマンド識別子が設定された場合、前記クリアレジスタに設定された前記コマンド識別子が前記部分コマンド識別子空間に含まれるか否かを判定し、
前記クリアレジスタに設定されたコマンド識別子が前記部分コマンド識別子空間に含まれると判定された場合、前記ビットテーブルにおける当該コマンド識別子に対応する前記ビットに前記第１の値を設定し、
前記配置の制御方法が前記第２の制御モードであるか否かを判定し、
前記配置の制御方法が前記第２の制御モードであると判定された場合、前記コマンド識別子空間における前記部分コマンド識別子空間の位置を変更する更新処理を実行することを特徴とする計算機システム。
【請求項１４】
請求項１３に記載の計算機システムであって、
前記複数のビットの各々には、前記ビットテーブルにおけるビットの位置を示すアドレスが設定され、
前記重複検知部は、前記コマンド識別子空間における前記部分コマンド識別子空間の先頭に対応する前記コマンド識別子を設定する範囲先頭レジスタを有し、
前記重複検知部が実行する前記更新処理は、
前記ビットテーブルを参照して、前記第２の値が設定され、かつ、最も小さいアドレスが設定されるビットを検索する処理と、
前記検索されたビットに対応する前記コマンド識別子が前記ビットテーブルの端の前記ビットに対応するように、前記ビットテーブルの前記複数のビットの値をシフトする処理と、
前記検索されたビットに対応するコマンド識別子を前記範囲先頭レジスタに設定する処理と、を含むことを特徴とする計算機システム。
【請求項１５】
請求項１３に記載の計算機システムであって、
前記複数のビットの各々には、前記ビットテーブルにおける位置を示す第１のアドレスが設定され、
前記コマンド識別子空間は、前記ビットテーブルと同一のサイズの複数の領域に分割され、
前記複数の領域の各々には、領域における位置を示す第２のアドレスが設定され、
前記第２のアドレスは、前記第１のアドレスと対応するように管理され、
前記重複検知部は、
前記部分コマンド識別子空間の先頭の前記コマンド識別子が含まれる前記領域である基準領域の識別子を設定する範囲幅レジスタ、及び前記部分コマンド識別子空間の先頭の前記コマンド識別子の前記基準領域における前記第２のアドレスを設定する範囲先頭レジスタを有し、
前記重複検知部が実行する前記更新処理は、
前記ビットテーブルを参照して、前記クリアレジスタに設定された前記コマンド識別子に対応するビットの前記第１のアドレスより大きい前記第１のアドレスが設定されたビットの中から、前記第２の値が設定され、かつ、最も小さい前記第１のアドレスが設定されるビットを検索する処理と、
前記第２の値が設定され、かつ、前記最も小さい第１のアドレスが設定されるビットが存在しない場合、前記ビットテーブルを参照して、前記クリアレジスタに設定されたコマンド識別子に対応するビットの前記第１のアドレスより小さい前記第１のアドレスが設定されたビットの中から、前記第２の値が設定され、かつ、最も小さい前記第１のアドレスが設定されるビットを検索する処理と、
前記検索されたビットに対応する前記コマンド識別子が含まれる前記領域の識別子を前記範囲幅レジスタに設定する処理と、
前記検索されたビットの前記第１のアドレスに対応する前記第２のアドレスを前記範囲先頭レジスタに設定する処理と、を含むことを特徴とする計算機システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プロセッサから発行されたコマンドに付与されるコマンド識別子の重複を検知するＩ／Ｏデバイスに関する。
【背景技術】
【０００２】
計算機上で稼働するＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）は、当該計算機に接続されるＩ／Ｏデバイスに対して所定の動作を指示する場合に、一定の規則に基づいて生成されたコマンドと呼ばれるデータをＩ／Ｏデバイスに送信する。【０００３】
高性能なＩ／Ｏデバイスでは、コマンドの実行方式として、アウトオブオーダ実行という方式が採用される。アウトオブオーダ実行では、Ｉ／Ｏデバイスが、コマンドを受信した順番とは異なる順番で、当該コマンドに対応する処理を実行し、処理の完了をＯＳに通知する。【０００４】
アウトオブオーダ実行の方式において、一般的に、ＯＳは、完了した処理に対応するコマンドを判別するために、コマンドに対して一意なコマンド識別子を付与し、また、処理の完了通知にもコマンド識別子を付与する。【０００５】
実行中のコマンド群において、コマンド識別子が重複した場合、ＯＳはどのコマンドに対応する処理が完了したかを判定できず、Ｉ／Ｏ処理を正常に完了することができない。そのため、コマンドの発行側であるＯＳは、重複したコマンド識別子がコマンドに付与されるのを防止する機能を有する。【０００６】
従来のＩ／Ｏデバイスは、受信したコマンドに付与されたコマンド識別子が一意性であることを信頼し、コマンド識別子が重複しているか否かを判定することなくそのまま用いていた。しかし、Ｉ／Ｏ処理の高信頼化を図るために、Ｉ／Ｏデバイスでもコマンド識別子が重複しているか否かを確認したいという要求がある。【０００７】
例えば、識別子の重複検査を行う技術としては、識別子作成時に、時刻情報に基づいて比較対象として妥当と考えられる識別子の絞り込みを行い、重複検査を行う手法に関する技術がある（例えば、特許文献１参照）。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２００５−３３９１３４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
ＯＳが稼働する計算機が、コマンド識別子の一意性を確認するための処理を実行する場合、計算機は十分な計算機資源量を有するため、大きな性能上の問題にならない。また、ＯＳは、一定の規則性に基づいてコマンド識別子を付与することによって、計算機の負荷を抑えつつ、一意なコマンド識別子の付与を実現できる。【００１０】
一方、Ｉ／Ｏデバイスは、コマンド識別子の付与方法の規則を制御できず、また計算機資源量も限られていることから、性能上及び回路規模上、コマンド識別子の一意性を効率的に確認することが必要である。【００１１】
例えば、コマンド発行側である計算機であれば特許文献１に開示されるように時刻情報を利用した制御は可能であるが、Ｉ／Ｏデバイス側では識別子に時刻情報のようなヒントが含まれることは期待できない。【００１２】
一方、表を用いて実行中のコマンド識別子を管理する場合に必要な計算機資源量は、コマンド識別子の長さ、及び計算機が同時に実行可能なコマンド数（以下、多重度とする）に比例して増加する。コマンド識別子長が長い入出力プロトコルを用いるＩ／Ｏデバイスにおいて、高いＩ／Ｏ性能を提供するために多重度を大きくした場合、コマンド識別子の重複を検知するためには非常に多くの計算機資源量が必要となる。【００１３】
本発明では、前述のような状況において、少ない計算機資源量を用いてコマンド識別子の重複を検知する機能を有するデバイスを提供する。
【課題を解決するための手段】
【００１４】
本願において開示される発明の代表的な一例を示せば以下の通りである。すなわち、Ｉ／Ｏデバイスを介して外部装置に接続される計算機であって、前記計算機は、前記外部装置に発行するコマンドにコマンド識別子を付与する制御部を有し、前記Ｉ／Ｏデバイスは、前記コマンド識別子の集合であるコマンド識別子空間の部分空間である部分コマンド識別子空間が定義される重複検知部を有し、前記重複検知部は、前記コマンド識別子空間内における前記部分コマンド識別子空間の配置を移動させながら、前記付与したコマンド識別子が他の使用中のコマンド識別子と重複しているか否かを判定することを特徴とする。
【発明の効果】
【００１５】
本発明の一形態によれば、Ｉ／Ｏデバイスは、コマンド識別子空間における部分コマンド識別子空間の配置を移動させながら、当該部分コマンド識別子空間に含まれるコマンド識別子の重複を検知する。したがって、少ない計算機資源量を用いて、Ｉ／Ｏ処理の処理性能の低下を抑えつつ、コマンド識別子空間に含まれる全てのコマンド識別子の重複を検知できる。【００１６】
上記した以外の課題、構成及び効果は、以下の実施例の説明により明らかにされる。
【図面の簡単な説明】
【００１７】
【図１】実施例１の計算機システムの構成例を示すブロック図である。
【図２】実施例１のサーバモジュールにおけるデータの入出力関係を示す説明図である。
【図３Ａ】実施例１の送信キューの構成例を示す説明図である。
【図３Ｂ】実施例１の完了キューの構成例を示す説明図である。
【図４Ａ】実施例１のコマンドデータの構成例を示す説明図である。
【図４Ｂ】実施例１の完了通知データの構成例を示す説明図である。
【図５】実施例１におけるコマンド識別子空間及び部分コマンド識別子空間の一例を示す説明図である。
【図６】実施例１の重複検知部の構成例を示す説明図である。
【図７】実施例１のデバイスドライバがＩ／Ｏ要求を受け付けた場合に実行する処理を説明するフローチャートである。
【図８】実施例１のデバイスドライバが完了通知を検知した場合に実行する処理を説明するフローチャートである。
【図９】実施例１のＩ／Ｏデバイスが実行する処理を説明するフローチャートである。
【図１０】実施例１の重複検知部がＳｅｔレジスタにコマンド識別子が設定された場合に実行する処理を説明するフローチャートである。
【図１１】実施例１の重複検知部がＣｈｅｃｋレジスタにコマンド識別子が設定された場合に実行する処理を説明するフローチャートである。
【図１２】実施例１の重複検知部がＣｌｅａｒレジスタにコマンド識別子が設定された場合に実行する処理を説明するフローチャートである。
【図１３】実施例１の重複検知部が実行する部分コマンド識別子空間の更新処理におけるビットテーブルの移動の一例を示す説明図である。
【図１４】実施例２の重複検知部の構成例を示す説明図である。
【図１５】実施例２の重複検知部が有するレジスタの関係を示す説明図である。
【図１６】実施例２のビットテーブル、範囲先頭レジスタ、範囲幅レジスタ、及び部分コマンド識別子空間の対応関係を示す説明図である。
【図１７】実施例２の重複検知部がＳｅｔレジスタにコマンド識別子が設定された場合に実行する処理を説明するフローチャートである。
【図１８】実施例２の重複検知部がＣｈｅｃｋレジスタにコマンド識別子が設定された場合に実行する処理を説明するフローチャートである。
【図１９Ａ】実施例２の重複検知部がＣｌｅａｒレジスタにコマンド識別子が設定された場合に実行する処理を説明するフローチャートである。
【図１９Ｂ】実施例２の重複検知部がＣｌｅａｒレジスタにコマンド識別子が設定された場合に実行する処理を説明するフローチャートである。
【図２０Ａ】実施例２の部分コマンド識別子空間の更新処理における範囲幅レジスタ、範囲先頭レジスタ及びビットテーブルの状態を示す説明図である。
【図２０Ｂ】実施例２の部分コマンド識別子空間の更新処理における範囲幅レジスタ、範囲先頭レジスタ及びビットテーブルの状態を示す説明図である。
【図２０Ｃ】実施例２の部分コマンド識別子空間の更新処理における範囲幅レジスタ、範囲先頭レジスタ及びビットテーブルの状態を示す説明図である。
【図２０Ｄ】実施例２の部分コマンド識別子空間の更新処理における範囲幅レジスタ、範囲先頭レジスタ及びビットテーブルの状態を示す説明図である。
【発明を実施するための形態】
【００１８】
以下、図面を参照して実施例を説明する。
【実施例１】
【００１９】
図１は、実施例１の計算機システムの構成例を示すブロック図である。【００２０】
実施例１の計算機システムは、複数のサーバモジュール１００、複数のストレージモジュール２００から構成される。各サーバモジュール１００は、管理ネットワーク３００と接続される。【００２１】
サーバモジュール１００は、所定の業務を実行する計算機である。ストレージモジュール２００は、サーバモジュール１００が利用するデータを格納する計算機である。実施例１では、ストレージモジュール２００は、各サーバモジュール１００に記憶領域を提供する。実施例１では、記憶領域としてＬＵ（Ｌｏｇｉｃａｌ  Ｕｎｉｔ）が提供される。【００２２】
サーバモジュール１００は、ＣＰＵ１１０、主記憶装置１２０、Ｉ／Ｏデバイス１３０、及びＮＩＣ１４０を有する。サーバモジュール１００が有する各構成は、内部バスを介して互いに接続される。【００２３】
ＣＰＵ１１０は、主記憶装置１２０に格納されるプログラムを実行する。ＣＰＵ１１０が主記憶装置１２０に格納されるプログラムを実行することによって、サーバモジュール１００が有する機能を実現できる。【００２４】
主記憶装置１２０は、ＣＰＵ１１０によって実行されるプログラム及び当該プログラムの実行に必要な情報を格納する。実施例１の主記憶装置１２０には、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）４００（図２参照）を実現するプログラムが格納される。主記憶装置１２０には、ＯＳ４００（図２参照）を実現するプログラム以外にアプリケーションプログラム等が格納されてもよい。【００２５】
なお、主記憶装置１２０に格納されるプログラム及び情報は、ストレージモジュール２００が提供するＬＵに格納されてもよい。この場合、ＣＰＵ１１０が、ＬＵからプログラム及び情報を取得し、取得されたプログラム及び情報を主記憶装置１２０にロードする。【００２６】
Ｉ／Ｏデバイス１３０は、外部装置と接続するためのインタフェースである。実施例１では、サーバモジュール１００はＩ／Ｏデバイス１３０を介してストレージモジュール２００と接続する。【００２７】
実施例１のＩ／Ｏデバイス１３０は、コントローラ１３１及び重複検知部１３２を有する。コントローラ１３１は、Ｉ／Ｏデバイス１３０全体を制御する。重複検知部１３２は、ＯＳ４００（図２参照）によって発行されたコマンドデータ５００（図３Ａ参照）に付与されるコマンド識別子５０１（図４Ａ参照）が重複しているか否かを判定する。【００２８】
ＮＩＣ１４０は、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）等のネットワークを介して外部装置と接続するためのインタフェースである。【００２９】
ストレージモジュール２００は、ディスクコントローラ２１０、Ｉ／Ｆ２４０、及び複数の記憶装置２５０を有する。ストレージモジュール２００が有する各構成は、内部バスを介して互いに接続される。【００３０】
ディスクコントローラ２１０は、記憶領域の管理、及びサーバモジュール１００と記憶領域との対応関係等を制御する。ディスクコントローラ２１０は、ＣＰＵ２２０及び主記憶装置２３０を有する。なお、ストレージモジュール２００は、耐障害性を向上させるために、二つ以上のディスクコントローラ２１０を有してもよい。【００３１】
ＣＰＵ２２０は、主記憶装置２３０に格納されるプログラムを実行する。ＣＰＵ２２０が主記憶装置２３０に格納されるプログラムを実行することによって、ストレージモジュール２００が有する機能を実現できる。【００３２】
主記憶装置２３０は、ＣＰＵ２２０によって実行されるプログラム及び当該プログラムの実行に必要な情報を格納する。主記憶装置２３０には、ストレージモジュール２００を管理するストレージ制御部を実現するためのプログラム、及びＬＵの構成を管理する情報等が格納される。【００３３】
なお、主記憶装置２３０に格納されるプログラム及び情報は、記憶装置２５０等に格納されてもよい。この場合、ＣＰＵ２２０が、記憶装置２５０からプログラム及び情報を取得し、取得されたプログラム及び情報を主記憶装置２３０にロードする。【００３４】
記憶装置２５０は、データを格納するための装置であり、例えば、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）及びＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等が考えられる。【００３５】
ストレージモジュール２００は、複数の記憶装置２５０を用いてＲＡＩＤを構成し、ＲＡＩＤボリュームからＬＵを生成し、さらに、サーバモジュール１００にＬＵを提供する。【００３６】
図２は、実施例１のサーバモジュール１００におけるデータの入出力関係を示す説明図である。図３Ａは、実施例１の送信キュー４０２の構成例を示す説明図である。図３Ｂは、実施例１の完了キュー４０３の構成例を示す説明図である。図４Ａは、実施例１のコマンドデータの構成例を示す説明図である。図４Ｂは、実施例１の完了通知データの構成例を示す説明図である。【００３７】
まず、主記憶装置１２０に格納されるＯＳ４００の構成について説明する。ＯＳ４００は、デバイスドライバ４０１、送信キュー４０２、及び完了キュー４０３を含む。なお、ＯＳ４００は、ファイルシステム等の図示しない構成も含む。【００３８】
デバイスドライバ４０１は、Ｉ／Ｏデバイス１３０を操作するためのソフトウェアである。なお、デバイスドライバ４０１は、ＯＳ４００に含まれていなくてもよい。例えば、組み込み可能なプログラムモジュールとして、デバイスドライバ４０１が提供されてもよい。【００３９】
送信キュー４０２は、Ｉ／Ｏデバイス１３０に実行させる処理を命令するコマンドデータ、すなわち、Ｉ／Ｏ要求を登録するためのキューである。完了キュー４０３は、処理の完了を通知する完了通知データ５１０、すなわち、Ｉ／Ｏ要求に対する応答を登録するためのキューである。【００４０】
図３Ａでは、送信キュー４０２の三つのエントリのそれぞれに、三つのコマンドデータ５００−１、５００−２、５００−３が登録される。また、図３Ｂでは、完了キュー４０３の二つのエントリのそれぞれに、二つの完了通知データ５１０−１、５１０−２が登録される。【００４１】
コマンドデータ５００は、図４Ａに示すようにコマンド識別子５０１及びコマンド種別５０２を含む。なお、コマンドデータ５００には、コマンド識別子５０１及びコマンド種別５０２以外の情報が含まれるが、本発明とは関係しないため説明を省略する。【００４２】
また、完了通知データ５１０は、図４Ｂに示すようにコマンド識別子５１１及びコマンド種別５１２を含む。なお、完了通知データ５１０には、コマンド識別子５１１及びコマンド種別５１２以外の情報が含まれるが、本発明とは関係しないため説明を省略する。【００４３】
ここで、実施例１のＩ／Ｏ処理の概要について説明する。【００４４】
ＯＳ４００は、図示しないアプリケーション等からＩ／Ｏ要求を受け付けると、デバイスドライバ４０１を呼び出す。【００４５】
デバイスドライバ４０１は、Ｉ／Ｏ要求に基づいてコマンドデータ５００を生成し、送信キュー４０２に登録する。【００４６】
Ｉ／Ｏデバイス１３０のコントローラ１３１は、所定のタイミングで送信キュー４０２に登録されたコマンドデータ５００を読み出す。なお、コマンドデータ５００の実行方式は、インオーダ及びアウトオブオーダのいずれであってもよい。【００４７】
コントローラ１３１は、読み出されたコマンドデータ５００に含まれるコマンド識別子５０１が重複しているか否かを判定するために、重複検知部１３２に当該コマンド識別子５０１を出力する。【００４８】
重複検知部１３２は、コマンド識別子５０１の使用状態を管理する。重複検知部１３２は、コントローラ１３１から問合せを受けると、コマンド識別子５０１の使用状態を確認し、コマンド識別子５０１の使用状態を示す結果をコントローラ１３１に出力する。【００４９】
コマンド識別子５０１が重複していると判定された場合、コントローラ１３１は、コマンド識別子５０１が重複している旨を示す完了通知データ５１０を生成し、生成された完了通知データ５１０を完了キュー４０３に登録する。また、コントローラ１３１は、完了通知データ５１０が完了キュー４０３に書き込まれたことを示す信号をＣＰＵ１１０に対して出力することによって、割り込みを発生させる。【００５０】
コマンド識別子５０１が重複していないと判定された場合、コントローラ１３１は、読み出されたコマンドデータ５００に対応する処理を実行する。コントローラ１３１は、処理が完了した後、読み出されたコマンドデータ５００に対応する完了通知データ５１０を完了キュー４０３に登録する。また、コントローラ１３１は、完了通知データ５１０が完了キュー４０３に書き込まれたことを示す信号をＣＰＵ１１０に対して出力することによって、割り込みを発生させる。【００５１】
ＣＰＵ１１０は、割り込みを受け付けた場合、所定の処理を実行し、その後Ｉ／Ｏ処理を完了する。例えば、コマンド識別子５０１が重複している旨を示す完了通知データ５１０が実行された場合、ＣＰＵ１１０は、送信キュー４０２から当該コマンド識別子５０１を含むコマンドデータ５００を削除し、又は、ＯＳ４００を再起動する。【００５２】
図５は、実施例１におけるコマンド識別子空間及び部分コマンド識別子空間の一例を示す説明図である。【００５３】
コマンド識別子空間は、Ｉ／Ｏデバイス１３０が付与可能なコマンド識別子の集合である。実施例１のコマンド識別子空間のサイズ、すなわち、コマンド識別子空間に含まれるコマンド識別子の数は下式（１）で算出される値とする。なお、Ｍ及びＮは自然数である。【００５４】
【数１】
2016042635.tif 000003
【００５５】
実施例１では、コマンド識別子空間をＭ個の領域に分割する。分割された領域のサイズは同一であるものとする。したがって、実施例１の一つの領域のサイズは「２Ｎ」となる。【００５６】
部分コマンド識別子空間は、コマンド識別子空間の部分空間である。重複検知部１３２には部分コマンド識別子空間が定義されており、重複検知部１３２は、当該空間に含まれるコマンド識別子５０１が重複しているか否かを判定する。実施例１の部分コマンド識別子空間のサイズは、分割された領域のサイズと同一となるように設定する。すなわち、部分コマンド識別子空間のサイズは「２Ｎ」となる。【００５７】
なお、部分コマンド識別子空間のサイズは任意に設定できる。ただし、部分コマンド識別子空間のサイズが大きい場合、重複検知部１３２が部分コマンド識別子空間を管理するために必要な回路規模が大きくなる。そのため、回路規模を抑えつつ、コマンド識別子５０１の重複を効率的に管理するために、部分コマンド識別子空間のサイズを設定する必要がある。例えば、Ｎは、「８」、「１０」又は「１６」等に設定される。実施例１では、説明の簡単のためＮは「４」であるものとする。【００５８】
重複検知部１３２は、部分コマンド識別子空間の配置を制御するための二つの制御モードを有する。【００５９】
一つの制御モードは、コマンド識別子空間における部分コマンド識別子空間の位置を固定する制御モードである。当該制御モードでは、重複検知部１３２は、固定された部分コマンド識別子空間に含まれるコマンド識別子の重複を検知する。以下の説明では、前述した制御モードを第１の制御モードと記載する。【００６０】
もう一つの制御モードは、コマンド識別子５０１の使用状態に応じて、コマンド識別子空間における部分コマンド識別子空間の位置を動的に変更する制御モードである。当該制御モードでは、重複検知部１３２は、位置が変更された部分コマンド識別子空間に含まれるコマンド識別子の重複を検知する。以下の説明では、前述した制御モードを第２の制御モードと記載する。【００６１】
重複検知部１３２は、コントローラ１３１から入力されたコマンド識別子５０１を解析し、解析結果に基づいて制御モードを切り替える。すなわち、重複検知部１３２は、入力されたコマンド識別子５０１の解析結果に基づいて、部分コマンド識別子空間の配置の制御方法を変更する。初期状態の重複検知部１３２には、第１の制御モードが適用されているものとする。【００６２】
ここで、重複検知部１３２が二つの制御モードを有する理由について説明する。コマンド識別子５０１の付与方法はＯＳ４００又はデバイスドライバ４０１によって異なっており、大きく分けて二つの付与方法が知られている。【００６３】
一つの付与方法は、コマンド識別子空間の固定された部分空間に含まれるコマンド識別子を付与する方法である。当該の付与方法の場合、重複検知部１３２は、固定された部分空間についてのみコマンド識別子の使用状態を管理すればよい。すなわち、重複検知部１３２は第１の制御モードで対応できる。【００６４】
もう一つの付与方法は、コマンド識別子空間の全コマンド識別子を値が小さい順に付与する方法である。当該した付与方法の場合、重複検知部１３２は、コマンド識別子空間の全てのコマンド識別子の使用状態を管理する必要がある。しかし、コマンド識別子は小さい順に付与されるため、重複検知部１３２は、コマンド識別子の使用状態に応じて、管理する部分空間を移動させればよい。すなわち、重複検知部１３２は第２の制御モードで対応できる。【００６５】
コマンド識別子の付与方法は、前述したようにＯＳ４００又はデバイスドライバ４０１に依存する。そのため、Ｉ／Ｏデバイス１３０は、ＯＳ４００又はデバイスドライバ４０１がどちらの付与方法に対応するものであるかを把握できない。そこで、重複検知部１３２は、入力されたコマンド識別子５０１を解析し、解析結果に基づいて制御モードに切り替える。これによってＩ／Ｏデバイス１３０は、どのようなＯＳ４００及びデバイスドライバ４０１であってもコマンド識別子の重複を検知できる。【００６６】
以下の説明では、コマンド識別子空間をＣＩＤ空間とも記載し、部分コマンド識別子空間を部分ＣＩＤ空間とも記載する。なお、ＣＩＤは、コマンド識別子を示す。【００６７】
図６は、実施例１の重複検知部１３２の構成例を示す説明図である。重複検知部１３２は、複数のレジスタ及び複数の論理回路から構成される。【００６８】
重複検知部１３２は、Ｂｕｓｙレジスタ６００、Ｓｅｔレジスタ６１０、Ｃｌｅａｒレジスタ６２０、Ｃｈｅｃｋレジスタ６３０、Ｒｅｓｕｌｔレジスタ６４０、範囲先頭レジスタ６５０、及びテーブルサイズレジスタ６６０をレジスタとして有する。また、重複検知部１３２は、ビットテーブル６７０を有する。【００６９】
さらに、重複検知部１３２は、検知範囲判定部７００、更新部７１０、ビットテーブルシフタ７２０、Ｗｒｉｔｅセレクタ７３０、及びＲｅａｄセレクタ７４０を論理回路として有する。【００７０】
Ｂｕｓｙレジスタ６００は、コントローラ１３１から入力されたコマンド識別子５０１が、部分ＣＩＤ空間に含まれているか否かを示す値を設定するレジスタである。Ｂｕｓｙレジスタ６００には「０」又は「１」が設定される。「０」は入力されたコマンド識別子５０１が部分ＣＩＤ空間に含まれることを示し、「１」は入力されたコマンド識別子５０１が部分ＣＩＤ空間に含まれないことを示す。【００７１】
Ｓｅｔレジスタ６１０、Ｃｌｅａｒレジスタ６２０、及びＣｈｅｃｋレジスタ６３０は、コントローラ１３１から入力されたコマンド識別子５０１を設定するレジスタである。【００７２】
Ｓｅｔレジスタ６１０には、デバイスドライバ４０１によって新たに付与されたコマンド識別子５０１が設定される。Ｃｌｅａｒレジスタ６２０には、実行された処理に対応するコマンドデータ５００に含まれるコマンド識別子５０１が設定される。Ｃｈｅｃｋレジスタ６３０には、重複しているか否かを判定するコマンド識別子５０１が設定される。【００７３】
Ｒｅｓｕｌｔレジスタ６４０は、Ｃｈｅｃｋレジスタ６３０に設定されたコマンド識別子５０１が重複しているか否かを示す値を設定するレジスタである。Ｒｅｓｕｌｔレジスタ６４０には、後述するビットテーブル６７０の所定のビットから読み出された値が格納される。【００７４】
範囲先頭レジスタ６５０は、ＣＩＤ空間における部分ＣＩＤ空間の先頭を示すコマンド識別子を設定するレジスタである。実施例１の範囲先頭レジスタ６５０には、コマンド識別子そのものが設定される。例えば、部分ＣＩＤ空間の先頭を示すコマンド識別子が「０ｘ１７」の場合、範囲先頭レジスタ６５０には、「０ｘ１７」が設定される。実施例１では、範囲先頭レジスタ６５０の初期値として、１０進法の「０」を示す「０ｘ００（１６進法）」が設定されてものとする。なお、範囲先頭レジスタ６５０の初期値は任意に設定できる。【００７５】
以下の説明では、上位に「０ｘ」が付与される値は、１６進法を用いた値であり、「０ｘ」が付与されていない値は１０進法を用いた値であるものとする。また、説明の簡単のため、特に必要である場合を除き１０進法を用いる。【００７６】
テーブルサイズレジスタ６６０は、後述するビットテーブル６７０のサイズを設定するレジスタである。実施例１のビットテーブル６７０のサイズが、部分ＣＩＤ空間のサイズとなる。【００７７】
実施例１の重複検知部１３２は、範囲先頭レジスタ６５０及びテーブルサイズレジスタ６６０を用いて、図５に示すようなＣＩＤ空間における部分ＣＩＤ空間を定義できる。【００７８】
ビットテーブル６７０は、部分ＣＩＤ空間に含まれるコマンド識別子５０１の使用状態を管理するビットテーブルである。ビットテーブル６７０は、テーブルサイズレジスタ６６０に設定されたサイズ分のビットの配列から構成される。【００７９】
ビットテーブル６７０の各ビットには配列の位置（順番）を示すアドレスが左から順に付与される。実施例１では、各ビットには、「０」から「２Ｎ−１」までのアドレスが設定される。また、ビットテーブル６７０の１ビットは一つのコマンド識別子５０１に対応する。したがって、範囲先頭レジスタ６５０の値にビットのアドレスを加算したものが、部分ＣＩＤ空間に含まれるコマンド識別子５０１の値となる。【００８０】
また、一つのビットにはコマンド識別子５０１の使用状態を示す値が設定される。実施例１では、一つのビットに「０」又は「１」のいずれかが設定される。「０」はコマンド識別子５０１が使用されていない状態を示し、「１」はコマンド識別子５０１が使用されている状態を示す。【００８１】
検知範囲判定部７００は、コントローラ１３１から入力されたコマンド識別子５０１が、検知範囲、すなわち、部分ＣＩＤ空間に含まれているか否かを判定する。検知範囲判定部７００は、判定結果をＢｕｓｙレジスタ６００に設定する。【００８２】
更新部７１０は、ＣＩＤ空間における部分ＣＩＤ空間の先頭の位置を管理する。また、更新部７１０は、部分ＣＩＤ空間の移動を実現するためのビットテーブル６７０の更新処理を制御する。【００８３】
ビットテーブルシフタ７２０は、更新部７１０と連携して、ビットテーブル６７０の更新処理を実行する。これによって、ＣＩＤ空間における部分ＣＩＤ空間の位置が変更される。【００８４】
Ｗｒｉｔｅセレクタ７３０は、部分ＣＩＤ空間に含まれるコマンド識別子５０１の使用状態を示す値を変更する。具体的には、Ｗｒｉｔｅセレクタ７３０は、ビットテーブル６７０の所定のビットに値「１」又は「０」を書き込む。【００８５】
Ｒｅａｄセレクタ７４０は、部分ＣＩＤ空間に含まれるコマンド識別子５０１の使用状態を示す値を読み出す。具体的には、Ｒｅａｄセレクタ７４０は、ビットテーブル６７０の所定のビットから値を読み出す。【００８６】
なお、図６において、実線はコマンド識別子５０１又はレジスタの値を含むデータの流れを示し、点線は１ビットのデータの流れを示す。また、マイナスの記号は減算の演算処理を示し、不等号の記号は比較の演算処理を示す。【００８７】
次に、実施例１のサーバモジュール１００が実行するＩ／Ｏ処理について説明する。【００８８】
図７は、実施例１のデバイスドライバ４０１がＩ／Ｏ要求を受け付けた場合に実行する処理を説明するフローチャートである。【００８９】
デバイスドライバ４０１は、ＯＳ４００からＩ／Ｏ要求を受信した場合、以下で説明する処理を開始する。【００９０】
デバイスドライバ４０１は、受信したＩ／Ｏ要求に基づいて、コマンドデータ５００を生成する（ステップＳ１０１）。【００９１】
具体的には、デバイスドライバ４０１は、受信したＩ／Ｏ要求に対応する処理を実現するコマンドデータ５００を生成する。コマンドデータ５００には、デバイスドライバ４０１によって付与されたコマンド識別子５０１及びコマンド種別５０２が含まれる。【００９２】
デバイスドライバ４０１は、生成されたコマンドデータ５００を送信キュー４０２に書き込み（ステップＳ１０２）、処理を終了する。このとき、デバイスドライバ４０１は、送信キュー４０２にコマンドデータ５００が書き込まれたことを通知するために、ドアベルレジスタ等の所定のレジスタに値を書き込む。【００９３】
図８は、実施例１のデバイスドライバ４０１が完了通知を検知した場合に実行する処理を説明するフローチャートである。【００９４】
ＣＰＵ１１０は、完了通知データ５１０が完了キュー４０３に書き込まれたことを示す信号をＩ／Ｏデバイス１３０から入力された場合、デバイスドライバ４０１に以下の処理を実行させる。【００９５】
デバイスドライバ４０１は、完了キュー４０３から完了通知データ５１０を読み出す（ステップＳ２０１）。デバイスドライバ４０１は、所定のＩ／Ｏ要求完了処理を実行し（ステップＳ２０２）、その後、処理を終了する。なお、Ｉ／Ｏ要求完了処理は、ＯＳ４００毎に異なるが公知のものであるため説明を省略する。【００９６】
図９は、実施例１のＩ／Ｏデバイス１３０が実行する処理を説明するフローチャートである。Ｉ／Ｏデバイス１３０のコントローラ１３１は、重複検知部１３２と連携して以下で説明する処理を実行する。【００９７】
Ｉ／Ｏデバイス１３０は、送信キュー４０２にコマンドデータ５００が書き込まれたことを検知した場合、以下で説明する処理を開始する。本実施例では、Ｉ／Ｏデバイス１３０は、デバイスドライバ４０１によって、ドアベルレジスタ等の所定のレジスタに値が書き込まれたことを検知すると以下で説明する処理を開始する。【００９８】
コントローラ１３１は、送信キュー４０２からコマンドデータ５００を一つ読み出す（ステップＳ３０１）。コントローラ１３１は、重複検知部１３２に対して、読み出されたコマンドデータ５００に含まれるコマンド識別子５０１が重複しているか否かを問い合わせる（ステップＳ３０２）。【００９９】
具体的には、コントローラ１３１が、送信キュー４０２からコマンドデータ５００を一つ読み出し、Ｃｈｅｃｋレジスタ６３０に読み出されたコマンドデータ５００に含まれるコマンド識別子５０１を設定する。重複検知部１３２は、Ｃｈｅｃｋレジスタ６３０にコマンド識別子５０１が設定された場合、図１１に示す処理を実行する。【０１００】
コントローラ１３１は、問い合わせたコマンド識別子５０１が検知範囲外であるか否かを判定する（ステップＳ３０３）。すなわち、問い合わせたコマンド識別子５０１が、部分ＣＩＤ空間に含まれるか否かが判定される。【０１０１】
具体的には、コントローラ１３１は、重複検知部１３２からＢｕｓｙレジスタ６００が「１」である旨の信号を受信したか否かを判定する。重複検知部１３２からＢｕｓｙレジスタ６００が「１」である旨の信号を受信した場合、コントローラ１３１は、問い合わせたコマンド識別子５０１が検知範囲外であると判定する。【０１０２】
問い合わせたコマンド識別子５０１が検知範囲外であると判定された場合、コントローラ１３１は、読み出されたコマンドデータ５００の実行を一定時間待機させる（ステップＳ３１０）。コントローラ１３１は、一定時間経過後、ステップＳ３０２に戻り、再度、重複検知部１３２に対して、コマンド識別子５０１が重複しているか否かの問合せを行う。本待機中において、コントローラ１３１が他に行うべき処理がある場合、コントローラ１３１は当該処理を実行してもよい。【０１０３】
具体的には、コントローラ１３１は、読み出されたコマンドデータ５００を送信キュー４０２に書き込み、一定時間経過した後、重複検知部１３２に対して当該コマンドデータ５００に含まれるコマンド識別子５０１について再度問合せを行う。例えば、コントローラ１３１は、他のコマンドデータ５００についてステップＳ３０９の処理が完了した後に、割り込み等を発生させることによって、当該コマンド識別子５０１について再度問合せを行う。【０１０４】
問い合わせたコマンド識別子５０１が検知範囲内であると判定された場合、コントローラ１３１は、問い合わせたコマンド識別子５０１が重複しているか否かを判定する（ステップＳ３０４）。【０１０５】
具体的には、コントローラ１３１は、重複検知部１３２からＲｅｓｕｌｔレジスタ６４０が「１」である旨の信号を受信したか否かを判定する。重複検知部１３２からＲｅｓｕｌｔレジスタ６４０が「１」である旨の信号を受信した場合、コントローラ１３１は、問い合わせたコマンド識別子５０１が重複していると判定する。【０１０６】
問い合わせたコマンド識別子５０１が重複していないと判定された場合、コントローラ１３１は、問い合わせたコマンド識別子５０１を使用中として登録するように重複検知部１３２に指示する（ステップＳ３０５）。【０１０７】
具体的には、コントローラ１３１は、Ｓｅｔレジスタ６１０に問い合わせたコマンド識別子５０１を設定する。重複検知部１３２は、Ｓｅｔレジスタ６１０にコマンド識別子５０１が設定された場合、図１０に示す処理を実行する。【０１０８】
コントローラ１３１は、読み出されたコマンドデータ５００に対応するＩ／Ｏ処理、外部装置へコマンド発行を実行する（ステップＳ３０６）。コントローラ１３１は、Ｉ／Ｏ処理が完了すると、完了通知データ５１０を生成し（ステップＳ３０７）、生成された完了通知データ５１０を完了キュー４０３に書き込む（ステップＳ３０８）。【０１０９】
コントローラ１３１は、実行されたコマンドデータ５００に含まれるコマンド識別子５０１を未使用として登録するように重複検知部１３２に指示する（ステップＳ３０９）。その後、Ｉ／Ｏデバイス１３０は、処理を終了する。【０１１０】
具体的には、コントローラ１３１は、実行されたコマンドデータ５００に含まれるコマンド識別子５０１をＣｌｅａｒレジスタ６２０に設定する。重複検知部１３２は、Ｃｌｅａｒレジスタ６２０にコマンド識別子５０１が設定された場合、図１２に示す処理を実行する。【０１１１】
ステップＳ３０４において、問い合わせたコマンド識別子５０１が重複していると判定された場合、Ｉ／Ｏデバイス１３０は、コマンド識別子５０１が重複している旨を通知するための完了通知データ５１０を生成する（ステップＳ３１１）。Ｉ／Ｏデバイス１３０は、生成された完了通知データ５１０を完了キュー４０３に書き込む（ステップＳ３１２）。【０１１２】
ＯＳ４００は、コマンド識別子５０１が重複している旨を通知する完了通知データ５１０を受け取った場合、コマンドデータ５００の実行を中止する。このとき、所定の障害処理が実行されてもよい。例えば、ＯＳ４００の再起動、コマンドデータ５００の再発行処理等が考えられる。なお、本発明は、コマンド識別子５０１の重複が検知された後の処理に限定されない。【０１１３】
図１０は、実施例１の重複検知部１３２がＳｅｔレジスタ６１０にコマンド識別子５０１が設定された場合に実行する処理を説明するフローチャートである。【０１１４】
重複検知部１３２は、Ｓｅｔレジスタ６１０にコマンド識別子５０１が設定されたことを検知した場合、以下で説明する処理を開始する。【０１１５】
重複検知部１３２は、Ｓｅｔレジスタ６１０に設定されたコマンド識別子５０１、及び範囲先頭レジスタ６５０の値を下式（２）に代入し、値Ｐを算出する（ステップＳ４０１）。ここで、ＣＩＤはコマンド識別子５０１、ＲＦＲは範囲先頭レジスタ６５０の値を表す。【０１１６】
【数２】
2016042635.tif 000004
【０１１７】
重複検知部１３２は、算出された値Ｐがテーブルサイズレジスタ６６０に設定される値より大きいか否かを判定する（ステップＳ４０２）。すなわち、Ｓｅｔレジスタ６１０に設定されたコマンド識別子５０１が検知範囲（部分ＣＩＤ空間）に含まれるか否かが判定される。値Ｐがテーブルサイズレジスタ６６０に設定される値以下である場合、Ｓｅｔレジスタ６１０に設定されたコマンド識別子５０１は検知範囲に含まれると判定される。【０１１８】
算出された値Ｐがテーブルサイズレジスタ６６０に設定される値以下であると判定された場合、重複検知部１３２は、設定されたコマンド識別子５０１に対応するビットテーブル６７０のビットから値を読み出す（ステップＳ４０３１）。【０１１９】
具体的には、重複検知部１３２は、ビットテーブル６７０におけるコマンド識別子５０１の位置（値Ｐ）をＲｅａｄセレクタ７４０に出力する。重複検知部１３２は、Ｒｅａｄセレクタ７４０を操作することによって、コマンド識別子５０１に対応するビットの値を読み出す。【０１２０】
重複検知部１３２は、コマンド識別子５０１に対応するビットから読み出された値をＲｅｓｕｌｔレジスタ６４０に設定する（ステップＳ４０３２）。このとき、重複検知部１３２は、コントローラ１３１にＲｅｓｕｌｔレジスタ６４０に書き込まれた値に対応する信号を送信する。本構成によりステップＳ３０４及びステップＳ３０５において実行され処理の高速化を図ることができる。【０１２１】
重複検知部１３２は、ビットテーブル６７０を更新する（ステップＳ４０３）。【０１２２】
具体的には、重複検知部１３２は、ビットテーブル６７０におけるコマンド識別子５０１の位置をＷｒｉｔｅセレクタ７３０に出力する。ビットテーブル６７０におけるコマンド識別子５０１の位置は値Ｐに対応する。すなわち、コマンド識別子５０１は、アドレス「Ｐ」が設定されたビットに対応する。重複検知部１３２は、Ｗｒｉｔｅセレクタ７３０を操作することによって、コマンド識別子５０１に対応するビットに「１」を書き込む。【０１２３】
例えば、コマンド識別子５０１が「０ｘ１７」、かつ、値Ｐが「１４」の場合、Ｗｒｉｔｅセレクタ７３０は、アドレス「１４」が設定されたビットに「１」を書き込む。【０１２４】
次に、重複検知部１３２の検知範囲判定部７００は、Ｂｕｓｙレジスタ６００に「０」を書き込む（ステップＳ４０４）。その後、重複検知部１３２は処理を終了する。【０１２５】
ステップＳ４０２において、算出された値Ｐがテーブルサイズレジスタ６６０に設定される値より大きいと判定された場合、重複検知部１３２は、ビットテーブル６７０に「１」が設定されるビットが少なくとも一つ以上存在するか否かを判定する（ステップＳ４０５）。【０１２６】
ビットテーブル６７０に「１」が設定されるビットが存在しないと判定された場合、重複検知部１３２は、範囲先頭レジスタ６５０の値を更新し（ステップＳ４０６）、その後、ステップＳ４０３１に進む。範囲先頭レジスタ６５０の値の更新方法は、例えば以下のような二つの方法が考えられる。【０１２７】
（１）まず、Ｓｅｔレジスタ６１０に設定されたコマンド識別子５０１が更新部７１０に入力される。更新部７１０は、入力されたコマンド識別子５０１を範囲先頭レジスタ６５０に書き込む。なお、ビットテーブル６７０の全てのビットの値は「０」に設定される。これによって、Ｓｅｔレジスタ６１０に設定されたコマンド識別子５０１が、ビットテーブル６７０の先頭、すなわち、部分ＣＩＤ空間の先頭として設定される。【０１２８】
（２）更新部７１０は、入力されたコマンド識別子５０１に所定の値を加算、又は減算する。更新部７１０は、算出されたコマンド識別子５０１を範囲先頭レジスタ６５０に書き込む。なお、ビットテーブル６７０の全てのビットの値は「０」に設定される。これによって、所定のコマンド識別子５０１が、ビットテーブル６７０の先頭、すなわち、部分ＣＩＤ空間の先頭として設定される。【０１２９】
コマンドデータ５００の実行方式がアウトオブオーダの場合、（１）及び（２）の更新方法では以下のような違いがある。（１）の更新方法では、入力されたコマンド識別子５０１より小さいコマンド識別子５０１が新たに入力された場合、新たに入力されたコマンド識別子５０１について、重複検知の判定ができない。そのため、Ｉ／Ｏ処理の性能が低下する可能性がある。一方、（２）の更新方法では、入力されたコマンド識別子５０１の近傍のコマンド識別子５０１について重複検知の判定が可能となる。【０１３０】
以上がステップＳ４０６の処理の説明である。【０１３１】
ステップＳ４０５において、ビットテーブル６７０に「１」が設定されるビットが存在すると判定された場合、重複検知部１３２は、制御モードを第１の制御モードから第２の制御モードに切り替える（ステップＳ４０７）。すでに、第２の制御モードが適用されている場合、重複検知部１３２は、ステップＳ４０７の処理を省略できる。【０１３２】
重複検知部１３２の検知範囲判定部７００は、Ｂｕｓｙレジスタ６００に「１」を書き込む（ステップＳ４０８）。その後、重複検知部１３２は処理を終了する。【０１３３】
図１１は、実施例１の重複検知部１３２がＣｈｅｃｋレジスタ６３０にコマンド識別子５０１が設定された場合に実行する処理を説明するフローチャートである。【０１３４】
重複検知部１３２は、Ｃｈｅｃｋレジスタ６３０にコマンド識別子５０１が設定されたことを検知した場合、以下で説明する処理を開始する。【０１３５】
重複検知部１３２は、Ｃｈｅｃｋレジスタ６３０に設定されたコマンド識別子５０１、及び範囲先頭レジスタ６５０の値を式（２）に代入し、値Ｐを算出する（ステップＳ５０１）。重複検知部１３２は、算出された値Ｐがテーブルサイズレジスタ６６０に設定される値より大きいか否かを判定する（ステップＳ５０２）。【０１３６】
算出された値Ｐがテーブルサイズレジスタ６６０に設定される値以下であると判定された場合、重複検知部１３２は、設定されたコマンド識別子５０１に対応するビットテーブル６７０のビットから値を読み出す（ステップＳ５０３）。【０１３７】
具体的には、重複検知部１３２は、ビットテーブル６７０におけるコマンド識別子５０１の位置（値Ｐ）をＲｅａｄセレクタ７４０に出力する。重複検知部１３２は、Ｒｅａｄセレクタ７４０を操作することによって、コマンド識別子５０１に対応するビットの値を読み出す。【０１３８】
重複検知部１３２は、コマンド識別子５０１に対応するビットから読み出された値をＲｅｓｕｌｔレジスタ６４０に設定する（ステップＳ５０４）。このとき、重複検知部１３２は、コントローラ１３１にＲｅｓｕｌｔレジスタ６４０に書き込まれた値に対応する信号を送信する。さらに、重複検知部１３２の検知範囲判定部７００は、Ｂｕｓｙレジスタ６００に「０」を書き込む（ステップＳ５０５）。その後、重複検知部１３２は処理を終了する。【０１３９】
実施例１では、重複検知部１３２は、ビットテーブル６７０の所定のビットから値を読み出し、コントローラ１３１が当該値に基づいて、コマンド識別子５０１が重複しているか否かを感知する。しかし、重複検知部１３２が、読み出された値に基づいてコマンド識別子５０１が重複しているか否かを判定してもよい。この場合、重複検知部１３２は、判定結果をコントローラ１３１に出力すればよい。【０１４０】
ステップＳ５０２において、算出された値Ｐがテーブルサイズレジスタ６６０に設定される値より大きいと判定された場合、重複検知部１３２は、制御モードを第１の制御モードから第２の制御モードに切り替える（ステップＳ５０６）。【０１４１】
重複検知部１３２の検知範囲判定部７００は、Ｂｕｓｙレジスタ６００に「１」を書き込む（ステップＳ５０７）。その後、重複検知部１３２は処理を終了する。【０１４２】
図１２は、実施例１の重複検知部１３２がＣｌｅａｒレジスタ６２０にコマンド識別子５０１が設定された場合に実行する処理を説明するフローチャートである。図１３は、実施例１の重複検知部１３２が実行する部分ＣＩＤ空間の更新処理におけるビットテーブル６７０の移動の一例を示す説明図である。【０１４３】
重複検知部１３２は、Ｃｌｅａｒレジスタ６２０にコマンド識別子５０１が設定されたことを検知した場合、以下で説明する処理を開始する。【０１４４】
重複検知部１３２は、Ｃｌｅａｒレジスタ６２０に設定されたコマンド識別子５０１、及び範囲先頭レジスタ６５０の値を式（２）に代入し、値Ｐを算出する（ステップＳ６０１）。重複検知部１３２は、算出された値Ｐがテーブルサイズレジスタ６６０に設定される値より大きいか否かを判定する（ステップＳ６０２）。【０１４５】
算出された値Ｐがテーブルサイズレジスタ６６０に設定される値以下であると判定された場合、重複検知部１３２は、ビットテーブル６７０を更新する（ステップＳ６０３）。【０１４６】
具体的には重複検知部１３２は、ビットテーブル６７０におけるコマンド識別子５０１の位置（値Ｐ）をＷｒｉｔｅセレクタ７３０に出力する。重複検知部１３２は、Ｗｒｉｔｅセレクタ７３０を操作することによって、コマンド識別子５０１に対応するビットに「０」を書き込む。【０１４７】
重複検知部１３２は、制御モードが第２の制御モードであるか否かを判定する（ステップＳ６０４）。【０１４８】
制御モードが第２の制御モードではないと判定された場合、すなわち、制御モードが第１の制御モードであると判定された場合、重複検知部１３２は、Ｂｕｓｙレジスタ６００に「０」を書き込む（ステップＳ６０５）。その後、重複検知部１３２は処理を終了する。【０１４９】
制御モードが第２の制御モードであると判定された場合、重複検知部１３２は、ビットテーブル６７０に「１」が設定されるビットが少なくとも一つ以上存在するか否かを判定する（ステップＳ６０６）。【０１５０】
ビットテーブル６７０に「１」が設定されるビットが存在しないと判定された場合、重複検知部１３２は、ステップＳ６０５に進む。【０１５１】
ビットテーブル６７０に「１」が設定されるビットが存在すると判定された場合、重複検知部１３２は、部分ＣＩＤ空間の更新処理を実行し（ステップＳ６０７）、その後ステップＳ６０５に進む。【０１５２】
部分ＣＩＤ空間の更新処理では、重複検知部１３２は、ビットテーブル６７０を参照して、「１」が設定され、かつ、アドレスが最小のビットを検索する。さらに、重複検知部１３２は、検索されたビットに対応するコマンド識別子５０１が部分ＣＩＤ空間の先頭になるようにビットテーブル６７０の値をシフトする。具体的には、以下のような処理が実行される。【０１５３】
まず、更新部７１０は、ビットテーブルシフタ７２０にビットテーブル６７０の更新指示を出力する。ビットテーブル６７０のシフト回数のカウントを「０」に設定する。【０１５４】
ビットテーブルシフタ７２０は、部分ＣＩＤ空間の最小のコマンド識別子に対応するビット、すなわち、アドレスが最小のビットの値を更新部７１０に出力する。更新部７１０は、出力されたビットの値が「０」であるか否かを判定する。【０１５５】
出力されたビットの値が「０」でないと判定された場合、更新部７１０は、シフト処理を終了する。出力されたビットの値が「０」であると判定された場合、更新部７１０は、ビットテーブルシフタ７２０にビットテーブル６７０の更新指示を出力する。更新部７１０は、ビットテーブル６７０のシフト回数を「１」加算する。【０１５６】
ビットテーブルシフタ７２０は、ビットテーブル６７０の値を左方向に１ビット分だけシフトさせる。このとき、ビットテーブルシフタ７２０は、部分ＣＩＤ空間の最大のコマンド識別子に対応するビット、すなわち、アドレスが最大のビットの値を「０」に設定する。また、ビットテーブルシフタ７２０は、ビットテーブル６７０のアドレスが最小のビットの値を更新部７１０に出力する。【０１５７】
更新部７１０は、出力されたビットの値が「０」であるか否かを判定する。出力されたビットの値が「０」でないと判定された場合、更新部７１０は、シフト処理を終了する。出力されたビットの値が「０」であると判定された場合、更新部７１０は、ビットテーブルシフタ７２０にビットテーブル６７０の更新指示を出力する。【０１５８】
更新部７１０は、部分ＣＩＤ空間の先頭のコマンド識別子５０１に対応するビット、すなわち、ビットテーブル６７０の左端のビットの値が「１」になるまで前述した処理を繰り返し実行する。【０１５９】
更新部７１０は、ビットテーブル６７０の左端のビットの値が「１」となったことを検知した場合、範囲先頭レジスタ６５０に設定される値にシフト回数を加算する。すなわち、「１」が設定されたビットに対応するコマンド識別子５０１が範囲先頭レジスタ６５０に設定される。以上の処理によって、ＣＩＤ空間における部分ＣＩＤ空間の位置が移動する。【０１６０】
なお、更新部７１０は、ビットテーブル６７０の値を１ビット分だけ移動させる場合に、範囲先頭レジスタ６５０の値を「１」加算してもよい。この場合、更新部７１０は、シフト回数をカウントする必要がない。【０１６１】
図１３に示すように、部分ＣＩＤ空間の更新処理が実行されることによって、ＣＩＤ空間における部分ＣＩＤ空間の位置が移動する。図１３では、ステップＳ６０３において変更前のビットテーブル６７０の左端のビットに「０」が設定された場合、重複検知部１３２は、ビットの値が「１」になるまでビットテーブル６７０をシフトする。【０１６２】
なお、ビットテーブル６７０をシフトした結果、ビットテーブル６７０の左端のビットがＣＩＤ空間の境界、すなわち、式（１）を満たすコマンド識別子５０１に一致し、かつ、当該ビットの値が「０」となった場合、更新部７１０は、範囲先頭レジスタ６５０の値を「０」に設定する。【０１６３】
以上がステップＳ６０７の処理の説明である。【０１６４】
ステップＳ６０２において、算出された値Ｐがテーブルサイズレジスタ６６０に設定される値より大きいと判定された場合、重複検知部１３２は、制御モードを第１の制御モードから第２の制御モードに切り替える（ステップＳ６０８）。重複検知部１３２の検知範囲判定部７００は、Ｂｕｓｙレジスタ６００に「１」を書き込む（ステップＳ６０９）。その後、重複検知部１３２は処理を終了する。【０１６５】
実施例１によれば、重複検知部１３２は、部分ＣＩＤ空間に含まれるコマンド識別子の重複を監視するため、計算機資源量を抑えることができる。また、重複検知部１３２は、コマンド識別子の使用状態に応じて制御モードを切り替えて、制御モードに基づいて部分ＣＩＤ空間の配置を制御する。したがって、必要な計算機資源量を抑え、かつ、Ｉ／Ｏ処理の性能を低下させることなく、ＣＩＤ空間の全てのコマンド識別子に対して重複を検知する機能を有するＩ／Ｏデバイス１３０を実現できる。
【実施例２】
【０１６６】
実施例２では、重複検知部１３２の構成が異なる。以下、実施例１との差異を中心に実施例２について説明する。【０１６７】
実施例２の計算機システムの構成は、実施例１の計算機システムの構成と同一であるため説明を省略する。送信キュー４０２及び完了キュー４０３の構造も実施例１と同一の構造であるため説明を省略する。また、実施例２のデバイスドライバ４０１が実行する処理は、実施例１の処理と同一であるため説明を省略する。【０１６８】
図１４は、実施例２の重複検知部１３２の構成例を示す説明図である。【０１６９】
実施例２の重複検知部１３２は、実施例１と同様に、Ｂｕｓｙレジスタ６００、Ｓｅｔレジスタ６１０、Ｃｌｅａｒレジスタ６２０、Ｃｈｅｃｋレジスタ６３０、Ｒｅｓｕｌｔレジスタ６４０、及び範囲先頭レジスタ６５０をレジスタとして有する。また、実施例２の重複検知部１３２は、実施例１と同様に、ビットテーブル６７０を有する。また、実施例２の重複検知部１３２は、実施例１と同様に、検知範囲判定部７００、更新部７１０、Ｗｒｉｔｅセレクタ７３０、及びＲｅａｄセレクタ７４０を論理回路として有する。【０１７０】
実施例２の重複検知部１３２は、新たなレジスタとして、範囲幅レジスタ８００を有する。一方、実施例２の重複検知部１３２は、テーブルサイズレジスタ６６０及びビットテーブルシフタ７２０を有さない。【０１７１】
範囲幅レジスタ８００は、部分ＣＩＤ空間の先頭のコマンド識別子５０１が含まれる領域を設定するレジスタである。以下の説明では、部分ＣＩＤ空間の先頭のコマンド識別子５０１が含まれる領域を基準領域とも記載する。範囲先頭レジスタ６５０は、基準領域における部分ＣＩＤ空間の先頭のコマンド識別子５０１の位置（アドレス）を設定するレジスタである。【０１７２】
実施例１では、範囲先頭レジスタ６５０には、コマンド識別子そのものが設定されていた。実施例２では、範囲先頭レジスタ６５０には、領域における位置を示す値が設定される。【０１７３】
実施例２では、実施例１と同様にＣＩＤ空間が、サイズが「２Ｎ」であるＭ個の領域に分割される。また、各領域には、当該領域内の位置を示すアドレスが設定される。以下の説明では、ビットテーブル６７０の各ビットに設定されたアドレスを第１のアドレス、領域の位置を示すアドレスを第２のアドレスとも記載する。第１のアドレス及び第２のアドレスの対応関係については図１６を用いて説明する。【０１７４】
部分ＣＩＤ空間のサイズ、領域のサイズ、及びビットテーブルのサイズは、一致するように設定される。そのため、第２のアドレスは、第１のアドレスと一致する。したがって、範囲先頭レジスタ６５０の値が取り得る範囲は下式（３）のようになり、また、範囲幅レジスタ８００の値が取り得る範囲は下式（４）のようになる。ここで、ＲＦＲは範囲先頭レジスタ６５０の値を表し、ＲＲＲは範囲幅レジスタ８００の値を表す。【０１７５】
【数３】
2016042635.tif 000005
【０１７６】
【数４】
2016042635.tif 000006
【０１７７】
例えば、範囲幅レジスタ８００が「２」、かつ、範囲先頭レジスタ６５０が「９」の場合、部分ＣＩＤ空間の先頭のコマンド識別子５０１は、領域２の第２のアドレス「９」の位置にあることが分かる。【０１７８】
実施例２の検知範囲判定部７００は、後述するように、範囲幅レジスタ８００及び範囲先頭レジスタ６５０を用いて、コマンド識別子５０１が部分ＣＩＤ空間に含まれるか否かを判定する。また、実施例２の更新部７１０は、後述するように、範囲幅レジスタ８００及び範囲先頭レジスタ６５０を更新することによって、ＣＩＤ空間における部分ＣＩＤ空間の配置を変更する。【０１７９】
図１５は、実施例２の重複検知部１３２が有するレジスタの関係を示す説明図である。図１６は、実施例２のビットテーブル６７０、範囲先頭レジスタ６５０、範囲幅レジスタ８００、及び部分ＣＩＤ空間の対応関係を示す説明図である。【０１８０】
実施例２では、Ｓｅｔレジスタ６１０、Ｃｌｅａｒレジスタ６２０、及びＣｈｅｃｋレジスタ６３０のそれぞれに設定されたコマンド識別子５０１の上位の値が、範囲幅レジスタ８００に設定する値として用いられる。また、Ｓｅｔレジスタ６１０、Ｃｌｅａｒレジスタ６２０、及びＣｈｅｃｋレジスタ６３０のそれぞれに設定されたコマンド識別子５０１の下位の値が、範囲先頭レジスタ６５０に設定する値として用いられる。【０１８１】
図１６に示すように、ビットテーブル６７０の各ビットには、「０」から「１５」までの第１のアドレスが設定される。また、図１６に示すように、各領域には、「０」から「１５」までの第２のアドレスが設定される。前述したように、第１のアドレスは第２のアドレスと一対一に対応する。例えば、第１のアドレス「１４」は、所定の領域の第２のアドレス「１４」に一致する。【０１８２】
したがって、範囲先頭レジスタ６５０に設定される値は、ビットテーブル６７０におけるビットの第１のアドレスを表す、また、任意の領域におけるコマンド識別子５０１の第２のアドレスを表す。【０１８３】
図１６に示すように、範囲先頭レジスタ６５０に設定された第１のアドレス以上の値の第１のアドレスは基準領域の第２のアドレスに対応する。また、範囲先頭レジスタ６５０に設定された第１のアドレスより小さい値の第１のアドレスは基準領域に「１」を加算した領域の第２のアドレスに対応する。【０１８４】
実施例２では、重複検知部１３２は、範囲先頭レジスタ６５０及び範囲幅レジスタ８００を用いて、ＣＩＤ空間における部分ＣＩＤ空間の先頭のコマンド識別子５０１を特定する。具体的には、以下のようにして、ＣＩＤ空間における部分ＣＩＤ空間の先頭のコマンド識別子５０１が特定される。【０１８５】
重複検知部１３２は、範囲幅レジスタ８００の値に基づいて、基準領域を特定する。図１６に示す例では、範囲幅レジスタ８００には「１」が設定されている。したがって、重複検知部１３２は、部分ＣＩＤ空間の先頭のコマンド識別子５０１が領域１に含まれることを特定できる。【０１８６】
また、重複検知部１３２は、範囲先頭レジスタ６５０の値に基づいて、基準領域における部分ＣＩＤ空間の先頭のコマンド識別子５０１の位置を特定する。図１６に示す例では、範囲先頭レジスタ６５０には「１４」が設定されている。したがって、重複検知部１３２は、部分ＣＩＤ空間の先頭のコマンド識別子５０１が、領域１の第２のアドレス「１４」の位置にあることを特定できる。【０１８７】
図１６に示すビットテーブル６７０は、図１６に示すような部分ＣＩＤ空間の状態を表現している。【０１８８】
実施例１の重複検知部１３２は、部分ＣＩＤ空間の先頭のコマンド識別子５０１がビットテーブル６７０の先頭になるように制御する。すなわち、実施例１の重複検知部１３２は、図１３に示すように、部分ＣＩＤ空間とビットテーブル６７０とが同一の形式になるように制御する。【０１８９】
一方、実施例２の重複検知部１３２は、ビットテーブル６７０における部分ＣＩＤ空間の先頭のコマンド識別子５０１の位置は変更しない。すなわち、ビットテーブル６７０の値をシフトする処理が実行されない。実施例２の重複検知部１３２は、ビットテーブル６７０の値をシフトする代わりに、範囲先頭レジスタ６５０及び範囲幅レジスタ８００を操作することによって、ＣＩＤ空間における部分ＣＩＤ空間の配置を制御する。範囲先頭レジスタ６５０及び範囲幅レジスタ８００の具体的な操作方法については後述する。【０１９０】
次に、実施例２の重複検知部１３２が実行する処理について説明する。【０１９１】
図１７は、実施例１の重複検知部１３２がＳｅｔレジスタ６１０にコマンド識別子５０１が設定された場合に実行する処理を説明するフローチャートである。【０１９２】
重複検知部１３２は、Ｓｅｔレジスタ６１０にコマンド識別子５０１が設定されたことを検知した場合、以下で説明する処理を開始する。【０１９３】
まず、重複検知部１３２は、ステップＳ７０１、ステップＳ７０２、及びステップＳ７０５の処理を実行することによって、設定されたコマンド識別子５０１が部分ＣＩＤ空間に含まれるか否かを判定する。【０１９４】
重複検知部１３２は、Ｓｅｔレジスタ６１０に設定されたコマンド識別子５０１の下位の値が範囲先頭レジスタ６５０の値より小さいか否かを判定する（ステップＳ７０１）。具体的には、以下のような処理が実行される。【０１９５】
Ｓｅｔレジスタ６１０にコマンド識別子５０１が設定されたことを検知した場合、重複検知部１３２は、Ｓｅｔレジスタ６１０に設定されたコマンド識別子５０１を検知範囲判定部７００に入力する。また、重複検知部１３２は、範囲幅レジスタ８００及び範囲先頭レジスタ６５０のそれぞれに設定される値を検知範囲判定部７００に入力する。【０１９６】
検知範囲判定部７００は、入力されたコマンド識別子５０１の下位の値が入力された範囲先頭レジスタ６５０の値より小さいか否かを判定する。以上ステップＳ７０１の処理の説明である。【０１９７】
コマンド識別子５０１の下位の値が範囲先頭レジスタ６５０の値より小さいと判定された場合、重複検知部１３２は、コマンド識別子５０１の上位の値が範囲幅レジスタ８００の値に「１」を加算した値に一致するか否かを判定する（ステップＳ７０２）。【０１９８】
ステップＳ７０２の処理は、コマンド識別子５０１が基準領域の次の領域に含まれるか否かを判定するための処理である。ステップＳ７０１の判定結果がＮｏ、かつ、ステップＳ７０２の判定結果がＹｅｓの場合、当該コマンド識別子５０１は部分ＣＩＤ空間に含まれる。【０１９９】
なぜならば、図１６に示すように、ビットテーブル６７０において、範囲先頭レジスタ６５０の値より小さい第１のアドレスは、必ず、基準領域の次の領域の第２のアドレスに一致するためである。【０２００】
コマンド識別子５０１の上位の値が範囲幅レジスタ８００の値に「１」を加算した値に一致しないと判定された場合、すなわち、コマンド識別子５０１が部分ＣＩＤ空間に含まれないと判定された場合、重複検知部１３２は、ステップＳ７０６に進む。【０２０１】
コマンド識別子５０１の上位の値が範囲幅レジスタ８００の値に「１」を加算した値に一致すると判定された場合、すなわち、コマンド識別子５０１が部分ＣＩＤ空間に含まれると判定された場合、重複検知部１３２は、ビットテーブルの値を読み出し（ステップＳ７０３１）、読み出された値をＲｅｓｕｌｔレジスタ６４０に設定する（ステップＳ７０３２）。また、重複検知部１３２は、ビットテーブル６７０を更新する（ステップＳ７０３）。【０２０２】
具体的には、重複検知部１３２は、コマンド識別子５０１に対応するビットの第１のアドレスをＷｒｉｔｅセレクタ７３０に出力する。すなわち、重複検知部１３２は、コマンド識別子５０１の下位の値を入力する。重複検知部１３２は、Ｗｒｉｔｅセレクタ７３０を操作することによって、コマンド識別子５０１に対応するビットに「１」を書き込む。【０２０３】
次に、重複検知部１３２の検知範囲判定部７００は、Ｂｕｓｙレジスタ６００に「０」を書き込む（ステップＳ７０４）。その後、重複検知部１３２は処理を終了する。【０２０４】
ステップＳ７０１において、コマンド識別子５０１の下位の値が範囲先頭レジスタ６５０の値以上であると判定された場合、重複検知部１３２は、コマンド識別子５０１の上位の値が範囲幅レジスタ８００の値に一致するか否かを判定する（ステップＳ７０５）。【０２０５】
ステップＳ７０５の処理は、コマンド識別子５０１が基準領域に含まれるか否かを判定するための処理である。ステップＳ７０１の判定結果がＮｏ、かつ、ステップＳ７０５の判定結果がＹｅｓの場合、当該コマンド識別子５０１は部分ＣＩＤ空間に含まれる。【０２０６】
なぜならば、図１６に示すように、ビットテーブル６７０において、範囲先頭レジスタ６５０の値以上の第１のアドレスは、必ず、基準領域の第２のアドレスに一致するためである。【０２０７】
コマンド識別子５０１の上位の値が範囲幅レジスタ８００の値に一致すると判定された場合、すなわち、コマンド識別子５０１が部分ＣＩＤ空間に含まれると判定された場合、重複検知部１３２は、ステップＳ７０３１に進む。【０２０８】
コマンド識別子５０１の上位の値が範囲幅レジスタ８００の値に一致しないと判定された場合、すなわち、コマンド識別子５０１が部分ＣＩＤ空間に含まれないと判定された場合、重複検知部１３２は、ステップＳ７０６に進む。【０２０９】
ステップＳ７０２の判定結果がＮｏの場合、又は、ステップＳ７０５の判定結果がＮｏの場合、すなわち、コマンド識別子５０１が部分ＣＩＤ空間に含まれないと判定された場合、重複検知部１３２は、ビットテーブル６７０に「１」が設定されるビットが少なくとも一つ以上存在するか否かを判定する（ステップＳ７０６）。【０２１０】
ビットテーブル６７０に「１」が設定されるビットが存在しないと判定された場合、重複検知部１３２は、範囲幅レジスタ８００及び範囲先頭レジスタ６５０を更新し（ステップＳ７０７）、その後、ステップＳ７０３１に進む。範囲幅レジスタ８００及び範囲先頭レジスタ６５０の値の更新方法は、例えば以下のような二つの方法が考えられる。【０２１１】
（１）まず、Ｓｅｔレジスタ６１０に設定されたコマンド識別子５０１が更新部７１０に入力される。更新部７１０は、入力されたコマンド識別子５０１の上位の値を範囲幅レジスタ８００に書き込み、また、当該コマンド識別子５０１の下位の値を範囲先頭レジスタ６５０に書き込む。なお、ビットテーブル６７０の全てのビットの値は「０」に設定される。【０２１２】
（２）Ｓｅｔレジスタ６１０に設定されたコマンド識別子５０１が更新部７１０に入力される。更新部７１０は、入力されたコマンド識別子５０１の上位の値を範囲幅レジスタ８００に書き込む。更新部７１０は、範囲先頭レジスタ６５０の値を「０」に設定する。このとき、ビットテーブル６７０の全てのビットの値は「０」に設定される。なお、更新部７１０は、範囲先頭レジスタ６５０の値を「０」以外の値に設定してもよい。【０２１３】
コマンドデータ５００の実行方式がアウトオブオーダの場合、（１）及び（２）の更新方法では以下のような違いがある。（１）の更新方法では、入力されたコマンド識別子５０１より小さいコマンド識別子５０１が新たに入力された場合、新たに入力されたコマンド識別子５０１について、重複検知の判定ができない。そのため、Ｉ／Ｏ処理の性能が低下する可能性がある。一方、（２）の更新方法では、入力されたコマンド識別子５０１の近傍のコマンド識別子５０１について重複検知の判定が可能となる。【０２１４】
以上がステップＳ７０７の処理の説明である。【０２１５】
ビットテーブル６７０に「１」が設定されるビットが存在すると判定された場合、重複検知部１３２は、制御モードを第１の制御モードから第２の制御モードに切り替える（ステップＳ７０８）。また、重複検知部１３２の検知範囲判定部７００は、Ｂｕｓｙレジスタ６００に「１」を書き込む（ステップＳ７０９）。その後、重複検知部１３２は処理を終了する。【０２１６】
図１８は、実施例２の重複検知部１３２がＣｈｅｃｋレジスタ６３０にコマンド識別子５０１が設定された場合に実行する処理を説明するフローチャートである。【０２１７】
重複検知部１３２は、Ｃｈｅｃｋレジスタ６３０にコマンド識別子５０１が設定されたことを検知した場合、以下で説明する処理を開始する。【０２１８】
ステップＳ８０１、ステップＳ８０２、ステップＳ８０５からステップＳ８１０の処理は、ステップＳ７０１、ステップＳ７０２、ステップＳ７０４からステップＳ７０９の処理と同一の処理であるため説明を省略する。【０２１９】
ステップＳ８０３では、重複検知部１３２は、ビットテーブル６７０を参照し、設定されたコマンド識別子５０１に対応するビットから値を読み出す。【０２２０】
具体的には、重複検知部１３２は、コマンド識別子５０１の下位の値をＲｅａｄセレクタ７４０に出力する。コマンド識別子５０１の下位の値は第１のアドレスに一致する。重複検知部１３２は、Ｒｅａｄセレクタ７４０を操作することによって、コマンド識別子５０１に対応するビットの値を読み出す。【０２２１】
重複検知部１３２は、ステップＳ８０３において読み出された値をＲｅｓｕｌｔレジスタ６４０に設定し（ステップＳ８０４）、その後、ステップＳ８０５に進む。【０２２２】
図１９Ａ及び図１９Ｂは、実施例２の重複検知部１３２がＣｌｅａｒレジスタ６２０にコマンド識別子５０１が設定された場合に実行する処理を説明するフローチャートである。【０２２３】
重複検知部１３２は、Ｃｌｅａｒレジスタ６２０にコマンド識別子５０１が設定されたことを検知した場合、以下で説明する処理を開始する。【０２２４】
ステップＳ９０１、ステップＳ９０２、ステップＳ９０５、ステップＳ９０８、ステップＳ９０９、ステップＳ９１０及びステップＳ９１１の処理は、ステップＳ７０１、ステップＳ７０２、ステップＳ７０４、ステップＳ７０５、ステップＳ７０６、ステップＳ７０８及びステップＳ７０９の処理と同一であるため説明を省略する。【０２２５】
ステップＳ９０２の判定結果がＹｅｓ、又はステップＳ９０８の判定結果がＹｅｓの場合、重複検知部１３２は、ビットテーブル６７０を更新する（ステップＳ９０３）。【０２２６】
具体的には、重複検知部１３２は、コマンド識別子５０１の下位の値をＷｒｉｔｅセレクタ７３０に出力する。コマンド識別子５０１の下位の値は第１のアドレスに一致する。重複検知部１３２は、Ｗｒｉｔｅセレクタ７３０を操作することによって、コマンド識別子５０１に対応するビットに「０」を書き込む。【０２２７】
重複検知部１３２は、制御モードが第２の制御モードであるか否かを判定する（ステップＳ９０４）。【０２２８】
制御モードが第２の制御モードではないと判定された場合、重複検知部１３２は、Ｂｕｓｙレジスタ６００に「０」を書き込む（ステップＳ９０５）。その後、重複検知部１３２は処理を終了する。【０２２９】
制御モードが第２の制御モードであると判定された場合、重複検知部１３２は、ビットテーブル６７０に「１」が設定されるビットが少なくとも一つ以上存在するか否かを判定する（ステップＳ９０６）。【０２３０】
ビットテーブル６７０に「１」が設定されるビットが存在しないと判定された場合、重複検知部１３２は、ステップＳ９０５に進む。【０２３１】
ビットテーブル６７０に「１」が設定されるビットが存在すると判定された場合、重複検知部１３２は、部分ＣＩＤ空間の更新処理を実行し（ステップＳ９０７）、その後、ステップＳ９０５に進む。これによって、ＣＩＤ空間における部分ＣＩＤ空間の位置が変更される。具体的には、以下のような処理が実行される。【０２３２】
重複検知部１３２は、範囲先頭レジスタ６５０に設定される値に基づいてビットテーブル６７０を参照して、部分ＣＩＤ空間の先頭のコマンド識別子５０１に対応するビットの値が「０」であるか否かを判定する。【０２３３】
部分ＣＩＤ空間の先頭のコマンド識別子５０１に対応するビットの値が「０」でないと判定された場合、重複検知部１３２は、更新処理を終了する。【０２３４】
部分ＣＩＤ空間の先頭のコマンド識別子５０１に対応するビットの値が「０」であると判定された場合、重複検知部１３２は、部分ＣＩＤ空間の先頭のコマンド識別子５０１に対応するビットの第１のアドレスの次に大きい第１のアドレスが設定されたビットの値を参照し、値「１」が設定されるビットを検索する。【０２３５】
重複検知部１３２は、第１のアドレス「２Ｎ−１」が設定されたビット、すなわち、ビットテーブル６７０の右端まで検索しても、値「１」が設定されるビットが見つからない場合、範囲幅レジスタ８００の値を「１」加算し、さらに、範囲先頭レジスタ６５０の値を「０」に設定する。重複検知部１３２は、位置「０」、すなわち、ビットテーブル６７０の左端から右方向にビットの値を参照し、値「１」が設定されるビットを検索する。【０２３６】
重複検知部１３２は、値「１」が設定されるビットが検索された場合、当該ビットの第１のアドレスを範囲先頭レジスタ６５０に書き込む。以上が、ステップＳ９０７の処理の説明である。【０２３７】
ここで、部分ＣＩＤ空間の更新処理について具体例を用いて説明する。図２０Ａ、図２０Ｂ、図２０Ｃ、及び図２０Ｄは、実施例２の部分ＣＩＤ空間の更新処理における範囲幅レジスタ８００、範囲先頭レジスタ６５０及びビットテーブル６７０の状態を示す説明図である。【０２３８】
以下の説明では、重複検知部１３２の制御モードは第２の制御モードであるものとする。また、部分ＣＩＤ空間の更新処理が実行される前のビットテーブル６７０は図２０Ａに示す状態であるものとする。このとき、範囲幅レジスタ８００には「１」が設定され、範囲先頭レジスタ６５０には「１４」が設定される。【０２３９】
領域１の第２のアドレス「１４」に対応するコマンド識別子５０１がＣｌｅａｒレジスタ６２０に設定された場合、重複検知部１３２は、Ｗｒｉｔｅセレクタ７３０を操作することによって、ビットテーブル６７０の第１のアドレス「１４」のビットに「０」を書き込む（ステップＳ９０３）。このとき、ビットテーブル６７０は図２０Ｂに示す状態となる。【０２４０】
ステップＳ９０４において、重複検知部１３２は、制御モードは第２の制御モードであると判定する。また、ステップＳ９０６において、重複検知部１３２は、ビットテーブル６７０に「１」が設定されるビットが存在すると判定する。ステップＳ９０７において、重複検知部１３２は、以下のような処理を実行する。【０２４１】
重複検知部１３２は、部分ＣＩＤ空間の先頭のコマンド識別子５０１に対応するビット、すなわち、第１のアドレス「１４」が設定されたビットの値が「０」であると判定する。【０２４２】
重複検知部１３２は、範囲先頭レジスタ６５０の値を「１５」に書き換え、第１のアドレス「１５」のビットの値が「０」であるか否かを判定する。図２０Ｂに示す例では、重複検知部１３２は、第１のアドレス「１５」のビットの値が「０」であると判定する。【０２４３】
重複検知部１３２は、ビットテーブル６７０の第１のアドレス「２Ｎ−１」、すなわち、第１のアドレス「１５」まで検索しても、「１」が設定されるビットが見つからないため、範囲幅レジスタ８００の値を「２」に書き換え、さらに、範囲先頭レジスタ６５０の値を「０」に設定する。これによって、ビットテーブル６７０、範囲幅レジスタ８００、及び範囲先頭レジスタ６５０は、図２０Ｃに示すような状態となる。【０２４４】
重複検知部１３２は、同様の検索処理を実行すると、第１のアドレス「２」のビットの値が「１」であることが分かる。そのため、重複検知部１３２は、検索処理を終了する。このとき、ビットテーブル６７０、範囲幅レジスタ８００、及び範囲先頭レジスタ６５０は、図２０Ｄに示すような状態となる。【０２４５】
以上の処理によって、図１３に示すような部分ＣＩＤ空間の移動を実現できる。【０２４６】
実施例２では、範囲幅レジスタ８００及び範囲先頭レジスタ６５０を操作することによって、部分ＣＩＤ空間の移動を実現する。実施例２の重複検知部１３２は、実施例１の重複検知部１３２よりレジスタ及び論理回路を削減でき、また、ビットテーブル６７０のシフト処理を実行する必要がない。そのため、重複検知部１３２の回路規模を小さくし、かつ、消費電力を大幅に削減できる。【０２４７】
実施例１及び実施例２では、初期状態の重複検知部１３２として第１の制御モードが適用されているものとしたが、これに限定されない。例えば、初期状態の重複検知部１３２に、第２の制御モードが適用されてもよい。特に、予めコマンド識別子空間に属する識別子を順番に付与するように設定されているシステムの場合に本方法は有効である。【０２４８】
この場合、制御モードを切り替えるための処理を省略することができる。例えば、ステップＳ４０５、ステップＳ４０７、ステップＳ４０８、ステップＳ５０２、ステップＳ５０６、ステップＳ５０７、ステップＳ６０８、ステップＳ６０９、ステップＳ７０６、ステップＳ７０８、ステップＳ７０９、ステップＳ８０７、ステップＳ８０９、及びステップＳ８１０等の処理を省略することができる。【０２４９】
なお、本発明は上記した実施例に限定されるものではなく、様々な変形例が含まれる。また、例えば、上記した実施例は本発明を分かりやすく説明するために構成を詳細に説明したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。また、各実施例の構成の一部について、他の構成に追加、削除、置換することが可能である。【０２５０】
また、上記の各構成、機能、処理部、処理手段等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。また、本発明は、実施例の機能を実現するソフトウェアのプログラムコードによっても実現できる。この場合、プログラムコードを記録した記憶媒体をコンピュータに提供し、そのコンピュータが備えるプロセッサが記憶媒体に格納されたプログラムコードを読み出す。この場合、記憶媒体から読み出されたプログラムコード自体が前述した実施例の機能を実現することになり、そのプログラムコード自体、及びそれを記憶した記憶媒体は本発明を構成することになる。このようなプログラムコードを供給するための記憶媒体としては、例えば、フレキシブルディスク、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、ハードディスク、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）、光ディスク、光磁気ディスク、ＣＤ−Ｒ、磁気テープ、不揮発性のメモリカード、ＲＯＭなどが用いられる。【０２５１】
また、本実施例に記載の機能を実現するプログラムコードは、例えば、アセンブラ、Ｃ／Ｃ＋＋、ｐｅｒｌ、Ｓｈｅｌｌ、ＰＨＰ、Ｊａｖａ等の広範囲のプログラム又はスクリプト言語で実装できる。【０２５２】
さらに、実施例の機能を実現するソフトウェアのプログラムコードを、ネットワークを介して配信することによって、それをコンピュータのハードディスクやメモリ等の記憶手段又はＣＤ−ＲＷ、ＣＤ−Ｒ等の記憶媒体に格納し、コンピュータが備えるプロセッサが当該記憶手段や当該記憶媒体に格納されたプログラムコードを読み出して実行するようにしてもよい。【０２５３】
上述の実施例において、制御線や情報線は、説明上必要と考えられるものを示しており、製品上必ずしも全ての制御線や情報線を示しているとは限らない。全ての構成が相互に接続されていてもよい。
【図１】
2016042635.tif 000007
【図２】
2016042635.tif 000008
【図３Ａ】
2016042635.tif 000009
【図３Ｂ】
2016042635.tif 000010
【図４Ａ】
2016042635.tif 000011
【図４Ｂ】
2016042635.tif 000012
【図５】
2016042635.tif 000013
【図６】
2016042635.tif 000014
【図７】
2016042635.tif 000015
【図８】
2016042635.tif 000016
【図９】
2016042635.tif 000017
【図１０】
2016042635.tif 000018
【図１１】
2016042635.tif 000019
【図１２】
2016042635.tif 000020
【図１３】
2016042635.tif 000021
【図１４】
2016042635.tif 000022
【図１５】
2016042635.tif 000023
【図１６】
2016042635.tif 000024
【図１７】
2016042635.tif 000025
【図１８】
2016042635.tif 000026
【図１９Ａ】
2016042635.tif 000027
【図１９Ｂ】
2016042635.tif 000028
【図２０Ａ】
2016042635.tif 000029
【図２０Ｂ】
2016042635.tif 000030
【図２０Ｃ】
2016042635.tif 000031
【図２０Ｄ】
2016042635.tif 000032
【国際調査報告】
2016042635.tif 000033
2016042635.tif 000034
2016042635.tif 000035