(57)【特許請求の範囲】
【請求項１】
ディスクデバイスと、記憶制御装置とを具備し、
前記ディスクデバイスは、前記記憶制御装置から入力された、書き込みの対象となる領域を特定する領域特定情報と、書き込みの対象となる書込対象データとを含むライトコマンドを保持し、所定のタイミングが到来したときに当該保持したライトコマンドに基づくディスクへの書込みを実行し、
前記記憶制御装置は、
前記ディスクデバイスから読み出したデータをキャッシュするコントローラキャッシュ手段と、
ライトコマンドを受け入れる受入手段と、
過去Ｎ回分（Ｎは予め定めた回数）の、前記ディスクデバイスへ出力したライトコマンドに含まれていた領域特定情報のリスト、または過去に前記ディスクデバイスへ出力したライトコマンドに含まれていた領域特定情報をＬＲＵ（Least Recent Used）処理して得たリストを領域履歴リストとして保持する記憶手段と、
ライトコマンドを受け入れたときに、前記記憶手段に保持されている領域履歴リストに含まれる領域特定情報を参照し、当該参照した領域特定情報で特定される領域と、今回受け入れたライトコマンドに含まれる領域特定情報で特定される領域との間にある間隙データが、前記コントローラキャッシュ手段にキャッシュされていれば、当該キャッシュされている間隙データと今回受け入れたライトコマンドに含まれる書込対象データとを合わせて書き込むためのライトコマンドを生成するライトコマンド生成処理を実行し、当該生成したライトコマンドを前記ディスクデバイスへ出力するライトコマンド制御手段と、
を有し、
前記受け入れたライトコマンドに含まれる領域特定情報で特定される対象領域に記録されているデータが前記コントローラキャッシュ手段にキャッシュされていないときには、当該ライトコマンドに含まれる領域特定情報で特定される対象領域と、その後に続く所定サイズの領域とを読み出すべき旨のリードコマンドを前記ディスクデバイスへ出力する記憶制御システム。
【請求項２】
請求項１に記載の記憶制御システムであって、
前記記憶制御装置のライトコマンド制御手段は、前記記憶手段に保持されている、領域履歴リストに含まれる領域特定情報を参照し、当該参照した領域特定情報で特定される領域と、今回受け入れたライトコマンドに含まれる領域特定情報で特定される領域との間の間隔が所定の間隔より小さいときに、前記ライトコマンド生成処理を実行する記憶制御システム。
【請求項３】
請求項１に記載の記憶制御システムであって、
未処理のライトコマンドを保持する手段をさらに有し、
前記ライトコマンド制御手段は、前記保持されている、未処理のライトコマンドにより書き込みの対象とされる対象領域を特定する情報を参照し、当該参照した情報で特定される領域と、今回受け入れたライトコマンドに含まれる領域特定情報で特定される領域との間にある間隙データが、前記コントローラキャッシュ手段にキャッシュされていれば、当該保持されている未処理のライトコマンドに含まれる書込対象データと、前記キャッシュされている間隙データと、今回受け入れたライトコマンドに含まれる書込対象データとを合わせて書き込むためのライトコマンドを生成するライトコマンド生成処理を実行し、当該生成したライトコマンドを前記ディスクデバイスへ出力する記憶制御システム。
【請求項４】
書き込みの対象となる領域を特定する領域特定情報と、書き込みの対象となる書込対象データとを含むライトコマンドを保持し、所定のタイミングが到来したときに当該保持したライトコマンドに基づくディスクへの書込みを実行するディスクデバイスに接続され、
当該ディスクデバイスから読み出したデータをキャッシュするコントローラキャッシュ手段と、
ライトコマンドを受け入れる受入手段と、
過去Ｎ回分（Ｎは予め定めた回数）の、前記ディスクデバイスへ出力したライトコマンドに含まれていた領域特定情報のリスト、または過去に前記ディスクデバイスへ出力したライトコマンドに含まれていた領域特定情報をＬＲＵ（Least Recent Used）処理して得たリストを領域履歴リストとして保持する記憶手段と、
ライトコマンドを受け入れたときに、前記保持されている領域履歴リストに含まれる領域特定情報を参照し、当該参照した領域特定情報で特定される領域と、今回受け入れたライトコマンドに含まれる領域特定情報で特定される領域との間にある間隙データが、前記コントローラキャッシュ手段にキャッシュされていれば、当該キャッシュされている間隙データと今回受け入れたライトコマンドに含まれる書込対象データとを合わせて書き込むためのライトコマンドを生成するライトコマンド生成処理を実行し、当該生成したライトコマンドを前記ディスクデバイスへ出力するライトコマンド制御手段と、
を有し、
前記受け入れたライトコマンドに含まれる領域特定情報で特定される対象領域に記録されているデータが前記コントローラキャッシュ手段にキャッシュされていないときには、当該ライトコマンドに含まれる領域特定情報で特定される対象領域と、その後に続く所定サイズの領域とを読み出すべき旨のリードコマンドを前記ディスクデバイスへ出力する記憶制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＲＡＩＤ（Redundant Arrays of Inexpensive Disks）装置等のディスクデバイスに接続される記憶制御システム及び記憶制御装置に関する。
【背景技術】
【０００２】
ライトコマンドを３回以上発行する必要のある場合に、ページ管理されるキャッシュデータ内のダーティデータの不連続領域を記憶デバイスから読み出してマージすることにより、ページ内で連続した１つのダーティデータの連続領域とし、記憶デバイスから不連続領域のデータを読み出すための１回のリードコマンドの発行と、リードコマンドで読み出した不連続領域にデータをマージすることで連続領域としたダーティデータの１回のライトコマンド発行によるライトバックの合計２回のコマンド発行でライトバック処理を終了させるように処理するＲＡＩＤ装置が特許文献１に開示されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００６−１６３４７４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、上記従来の技術では、リードコマンドによる読み出しの動作が必要となり、回転体メディアを備えたディスクデバイスに対してデータを連続して書き込む場合には、リードコマンドとライトコマンドとが頻繁に発生して、リードコマンドで読み出しの対象となる領域がヘッドの位置に至るまで待ち、またライトコマンドで書き込みの対象となる領域がヘッドの位置に至るまで待つこととなり、結局、回転体メディアが一回転以上する時間を待たなければならない。これでは例えば比較的小さいサイズの不連続なデータ（比較的小さいサイズの複数ファイル等）を繰り返して書き込む場合に、オーバーヘッドが大きくなる。
【０００５】
一方で、ＲＡＩＤ装置等のディスクデバイス内部でも、ライトコマンドをキャッシュしており、互いに隣接する領域に対する複数のライトコマンドがあったときには、当該隣接する領域を連結した一連の領域に対するライトコマンドとして処理することが行われており、外部から上記従来例の制御を行ったときに、必ずしも書込速度が向上するとは限らない。
【０００６】
本発明は上記実情に鑑みて為されたもので、回転体メディアを備えたディスクデバイスに対して比較的小さいサイズの不連続なデータを繰り返して書き込む場合にも、書き込み動作の高速化を図ることのできる記憶制御システム及び記憶制御装置を提供することを、その目的の一つとする。
【課題を解決するための手段】
【０００７】
上記従来例の問題点を解決するための本発明は、記憶制御システムであってディスクデバイスと、記憶制御装置とを具備し、前記ディスクデバイスは、前記記憶制御装置から入力された、書き込みの対象となる領域を特定する領域特定情報と、書き込みの対象となる書込対象データとを含むライトコマンドを保持し、当該保持したライトコマンドに基づくディスクへの書込みを実行し、前記記憶制御装置は、前記ディスクデバイスから読み出したデータをキャッシュするコントローラキャッシュ手段と、ライトコマンドを受け入れる受入手段と、過去に受け入れたライトコマンドに含まれる領域特定情報を保持する記憶手段と、ライトコマンドを受け入れたときに、前記記憶手段に保持されている、過去に受け入れたライトコマンドに含まれる領域特定情報を参照し、当該参照した領域特定情報で特定される領域と、今回受け入れたライトコマンドに含まれる領域特定情報で特定される領域との間にある間隙データが、前記コントローラキャッシュ手段にキャッシュされていれば、当該キャッシュされている間隙データと今回受け入れたライトコマンドに含まれる書込対象データとを合わせて書き込むためのライトコマンドを生成するライトコマンド生成処理を実行し、当該生成したライトコマンドを前記ディスクデバイスへ出力するライトコマンド制御手段と、を有することとしたものである。
【０００８】
これにより、ライトコマンドにより書き込まれる領域を、可能な場合は連続化させることができ、回転体メディアを備えたディスクデバイスに対して比較的小さいサイズの不連続データを繰り返して書き込む場合にも、書き込み動作の高速化を図ることが可能となる。
【０００９】
またここで前記記憶制御装置はさらに、前記過去に受け入れたライトコマンドを保持するライトコマンド保持手段を有し、前記記憶制御装置のライトコマンド制御手段は、前記ライトコマンド保持手段に保持されている、過去に受け入れたライトコマンドに含まれる領域特定情報を参照し、当該参照した領域特定情報で特定される領域と、今回受け入れたライトコマンドに含まれる領域特定情報で特定される領域との間にある間隙データが、前記コントローラキャッシュ手段にキャッシュされていれば、当該ライトコマンド保持手段に保持されているライトコマンドに含まれる書込対象データと、前記キャッシュされている間隙データと、今回受け入れたライトコマンドに含まれる書込対象データとを合わせて書き込むためのライトコマンドを生成するライトコマンド生成処理を実行し、当該生成したライトコマンドを前記ディスクデバイスへ出力してもよい。
【００１０】
この処理によれば、例えばホスト側装置から短時間の間にライトコマンドが集中した場合など、処理を待機する複数のライトコマンドが記憶制御装置に保持されているときに、記憶制御装置が当該保持された複数のライトコマンドを可能な場合に連続化する。これにより、回転体メディアを備えたディスクデバイスに対して比較的小さいサイズの不連続なデータを繰り返して書き込む場合にも、書き込み動作の高速化を図ることが可能となる。
【００１１】
また前記記憶制御装置のライトコマンド制御手段は、前記記憶制御装置のライトコマンド制御手段は、前記記憶手段に保持されている、過去に受け入れたライトコマンドに含まれる領域特定情報を参照し、当該参照した領域特定情報で特定される領域と、今回受け入れたライトコマンドに含まれる領域特定情報で特定される領域との間の間隔が所定の間隔より小さいときに、前記ライトコマンド生成処理を実行してもよい。
【００１２】
この例によれば、間隔が上記所定の間隔より大きい領域へのデータの書き込みを指示する一対のライトコマンドについて連続化が行われることが避けられる。
【００１３】
また本発明の一態様に係る記憶制御システムは、ディスクデバイスと、記憶制御装置とを具備し、前記ディスクデバイスは、前記記憶制御装置から入力された、書き込みの対象となる領域を特定する領域特定情報と、書き込みの対象となる書込対象データとを含むライトコマンドを保持し、当該保持したライトコマンドに基づくディスクへの書込みを実行し、前記記憶制御装置は、前記ディスクデバイスから読み出したデータをキャッシュするコントローラキャッシュ手段と、ライトコマンドを受け入れる受入手段と、過去に受け入れたライトコマンドを保持するライトコマンド保持手段と、前記ライトコマンド保持手段に保持されている、過去に受け入れたライトコマンドに含まれる領域特定情報を参照し、当該参照した領域特定情報で特定される領域と、今回受け入れたライトコマンドに含まれる領域特定情報で特定される領域との間にある間隙データが、前記コントローラキャッシュ手段にキャッシュされていれば、当該ライトコマンド保持手段に保持されているライトコマンドに含まれる書込対象データと、前記キャッシュされている間隙データと、今回受け入れたライトコマンドに含まれる書込対象データとを合わせて書き込むためのライトコマンドを生成するライトコマンド生成処理を実行し、当該生成したライトコマンドを前記ディスクデバイスへ出力するライトコマンド制御手段と、を有することとしたものである。
【００１４】
これにより、ライトコマンドにより書き込まれる領域を、可能な場合は連続化させることができ、回転体メディアを備えたディスクデバイスに対して比較的小さいサイズの不連続データを繰り返して書き込む場合にも、書き込み動作の高速化を図ることが可能となる。
【００１５】
また本発明の一態様に係る記憶制御装置は、書き込みの対象となる領域を特定する領域特定情報と、書き込みの対象となる書込対象データとを含むライトコマンドを保持し、当該保持したライトコマンドに基づくディスクへの書込みを実行するディスクデバイスに接続され、当該ディスクデバイスから読み出したデータをキャッシュするコントローラキャッシュ手段と、ライトコマンドを受け入れる受入手段と、過去に受け入れたライトコマンドに含まれる領域特定情報を保持する記憶手段と、ライトコマンドを受け入れたときに、前記保持されている、過去に受け入れたライトコマンドに含まれる領域特定情報を参照し、当該参照した領域特定情報で特定される領域と、今回受け入れたライトコマンドに含まれる領域特定情報で特定される領域との間にある間隙データが、前記コントローラキャッシュ手段にキャッシュされていれば、当該キャッシュされている間隙データと今回受け入れたライトコマンドに含まれる書込対象データとを合わせて書き込むためのライトコマンドを生成するライトコマンド生成処理を実行し、当該生成したライトコマンドを前記ディスクデバイスへ出力するライトコマンド制御手段と、を有することとしたものである。
【発明の効果】
【００１６】
本発明によると、回転体メディアを備えたディスクデバイスに対して比較的小さいサイズの不連続なデータを繰り返して書き込む場合にも、書き込み動作の高速化を図ることができる。
【図面の簡単な説明】
【００１７】
【図１】本発明の実施の形態に係る記憶制御システムの構成例を表すブロック図である。
【図２】本発明の実施の形態に係る記憶制御システムの記憶装置でのデータ格納状態の一例を表す説明図である。
【図３】本発明の実施の形態に係る記憶制御システムにおける論理セクタとセグメントとの例を表す説明図である。
【図４】本発明の実施の形態に係る記憶制御システムの記憶制御装置の動作に係る説明図である。
【図５】本発明の実施の形態に係る記憶制御システムの記憶制御装置が保持する対象領域履歴リストの内容例を表す説明図である。
【図６】本発明の実施の形態に係る記憶制御システムが扱うデータの例を表す説明図である。
【図７】本発明の実施の形態に係る記憶制御システムが扱うデータに含まれる対象セクタと端数との関係を表す説明図である。
【図８】本発明の実施の形態に係る記憶制御システムのデータ書き込み時の動作例を表すフロー図である。
【図９】本発明の実施の形態に係る記憶制御システムの動作例を表す説明図である。
【発明を実施するための形態】
【００１８】
本発明の実施の形態について図面を参照しながら説明する。本発明の実施の形態に係る記憶制御システム１は、図１に例示するように、例えばパーソナルコンピュータ（ＰＣ）等のホスト側装置１０に接続され、ディスクデバイス２０と、記憶制御装置３０とを有している。
【００１９】
ここでディスクデバイス２０は、インタフェース部２１と、デバイスコントローラ２２と、ディスクドライブ２３とを含んで構成されている。ここでディスクドライブ２３は、ハードディスクドライブ（ＨＤＤ）やＢｌｕＲａｙ（登録商標）ディスクドライブなどの光学ディスクデバイス等、ランダムアクセスとシーケンシャルアクセスとで速度差のある回転体メディア（記録媒体）である。また記憶制御装置３０は、制御部３１、記憶部３２、コントローラキャッシュ部３３、第１インタフェース部３４、及び第２インタフェース部３５を含んで構成されている。
【００２０】
ディスクデバイス２０のインタフェース部２１は、記憶制御装置３０に接続される。このインタフェース部２１は、記憶制御装置３０から書き込みの対象となる領域（対象領域）を特定する情報と、書き込みの対象となる書込対象データとを含んだライトコマンドや、リードコマンド等を受け入れてデバイスコントローラ２２に出力する。またこのインタフェース部２１は、デバイスコントローラ２２から出力の対象となるデータを受け入れて、記憶制御装置３０に対して当該データを出力する。ここで対象領域を特定する情報は、対象領域の先頭ＬＢＡ（Logical Block Addressing）と書込対象データの長さ（ＬＢＮ）とを含む。従って、対象領域の末尾ＬＢＡは、先頭ＬＢＡ＋ＬＢＮとして求められる。
【００２１】
デバイスコントローラ２２は、図１に示したように、プロセッサ２２１と、デバイスキャッシュ部２２２とを備えている。このプロセッサ２２１は例えばマイクロコンピュータであり、例えばプロセッサ２２１内（あるいは外部のメモリ）に格納されているプログラムに従って動作する。このプロセッサ２２１は、インタフェース部２１を介してライトコマンドを受け入れると、当該ライトコマンドをデバイスキャッシュ部２２２に、受け入れ順に格納して保持する。そしてこのプロセッサ２２１は、所定のタイミングが到来すると、このデバイスキャッシュ部２２２に保持したライトコマンドについて、書き込み処理を行う。
【００２２】
ここで上記所定のタイミングは、前回書き込み処理を行ってから所定の時間が経過した時点としてもよいし、デバイスキャッシュ部２２２に格納されたライトコマンドのデータ量が所定の閾値を超えた時点としてもよい。また、上記所定のタイミングには、インタフェース部２１を介してフラッシュの指示（強制書き込み指示）があったタイミングを含んでもよい。
【００２３】
この書き込み処理ではデバイスコントローラ２２のプロセッサ２２１は、デバイスキャッシュ部２２２に保持したライトコマンドを受け入れ順に、選択ライトコマンドとして選択して、次の処理を行う。
【００２４】
すなわちデバイスコントローラ２２のプロセッサ２２１は、選択ライトコマンドにより書き込み対象となっている領域を参照し、この領域に隣接する領域にデータを書き込む他のライトコマンドがデバイスキャッシュ部２２２の、選択ライトコマンドより後に保持されているか否かを調べる。具体的にプロセッサ２２１は、選択ライトコマンドに含まれるＬＢＡ１の先頭ＬＢＡ１_head及び末尾ＬＢＡ1_lastを参照し、デバイスキャッシュ部２２２内に、先頭ＬＢＡ_headがＬＢＡ_head≦ＬＢＡ１_last＋１であるか、または末尾のＬＢＡ_lastがＬＢＡ１_head−１≦ＬＢＡ_lastであるような領域に書き込みを行う旨の他のライトコマンドがあるか否かを調べる。
【００２５】
ここで、そのような条件を満足する他のライトコマンドがあれば、プロセッサ２２１は、選択ライトコマンドと、当該他のライトコマンドとを合成して、一つのライトコマンドを生成する。具体的にプロセッサ２２１は、他のライトコマンドに含まれる情報により対象領域の先頭ＬＢＡがＬＢＡ_head、当該領域の末尾ＬＢＡがＬＢＡ_lastであり、当該他のライトコマンドにより書き込まれるべき書込対象データがＤであるとするとき、
（１）ＬＢＡ１_last＋１＜ＬＢＡ_lastであれば、
対象領域の先頭ＬＢＡ＝ＬＢＡ１_headまたはＬＢＡ_headのうち小さい方
対象領域の末尾ＬＢＡ＝ＬＢＡ_last
書込対象データ：ＬＢＡ１_head＜ＬＢＡ_headならばＬＢＡ１_headからＬＢＡ_head−１までは、選択ライトコマンドの書込対象データＤ１の相当箇所、ＬＢＡ_headからＬＢＡ_lastまでは他のライトコマンドにより書き込まれるべき書込対象データＤとしたデータ
ＬＢＡ１_head≦ＬＢＡ_headでなければ、他のライトコマンドにより書き込まれるべき書込対象データＤとしたデータそのもの
としたライトコマンドを生成する。
（２）ＬＢＡ１_head≦ＬＢＡ_head＜ＬＢＡ_last≦ＬＢＡ１_lastであれば、
対象領域の先頭ＬＢＡ＝ＬＢＡ１_head
対象領域の末尾ＬＢＡ＝ＬＢＡ１_last
書込対象データ：選択ライトコマンドの書込対象データＤ１のうち、ＬＢＡ_headからＬＢＡ_lastまでの対応箇所の部分を、他のライトコマンドにより書き込まれるべき書込対象データＤで上書きしたデータ
としたライトコマンドを生成する。
（３）ＬＢＡ_head≦ＬＢＡ１_head−１であれば、
対象領域の先頭ＬＢＡ＝ＬＢＡ_head
対象領域の末尾ＬＢＡ＝ＬＢＡ１_lastまたはＬＢＡ_lastのうち大きい方
書込対象データ：ＬＢＡ_last＜ＬＢＡ１_lastならばＬＢＡ_headからＬＢＡ_lastまでは、他のライトコマンドにより書き込まれるべき書込対象データＤ、ＬＢＡ_last＋１からＬＢＡ１_lastまでは、ライトコマンドの書込対象データＤ１の相当箇所としたデータ
ＬＢＡ_last＜ＬＢＡ１_lastでなければ、他のライトコマンドにより書き込まれるべき書込対象データＤとしたデータそのもの
としたライトコマンドを生成する。
【００２６】
そしてプロセッサ２２１は、生成したライトコマンドを選択ライトコマンドに置き換え、また、他のライトコマンドをデバイスキャッシュ部２２２から除去し、次のライトコマンドを選択ライトコマンドとして選択して、上記処理を繰り返す。
【００２７】
またプロセッサ２２１は、選択ライトコマンドに対して、上述の条件を満足する他のライトコマンドがなければ、次のライトコマンドを選択ライトコマンドとして選択して、上記処理を繰り返す。また次のライトコマンドがなければ（すべてのライトコマンドについて処理を行ったならば）、プロセッサ２２１は、デバイスキャッシュ部２２２に記録された各ライトコマンドに基づく書き込み動作を行う。
【００２８】
またこのデバイスコントローラ２２は、インタフェース部２１を介してリードコマンドを受け入れたときには、ディスクドライブ２３から読み出しの対象となるデータを読み出して、インタフェース部２１に出力する。
【００２９】
本実施の形態のある例では、このデバイスコントローラ２２はＲＡＩＤ（Redundant Arrays of Inexpensive Disks）コントローラとして機能する。この例ではディスクドライブ２３を複数（ｎ台とする）備えて、これら複数のディスクドライブ２３がＲＡＩＤアレイとして動作する。本実施の形態の以下の説明ではデバイスコントローラ２２がＲＡＩＤコントローラとして機能するものとして説明するが、本実施の形態は、ディスクドライブ２３をＲＡＩＤアレイとする場合に限られるものではない。
【００３０】
本実施の形態の一例では、ディスクドライブ２３は少なくとも３台以上（ｎ≧３）備えられているものとし、デバイスコントローラ２２は、ディスクドライブ２３-1，…２３-nを、所定データ長ＬＣずつの記憶領域（チャンク）に区分して管理している。またこの例のデバイスコントローラ２２は、上記チャンクのデータ長ＬＣに、ディスクドライブ２３の数ｎからパリティの数ｐを減じた（ｎ−ｐ）を乗じた（ｎ−ｐ）×ＬＣのデータ長（セグメント長）ごとに書込対象データを分割し、データセグメントＡ，Ｂ…を得る。以下では説明を簡単にするためｐ＝１とする。この場合デバイスコントローラ２２は（ｎ−１）×ＬＣのデータ長ごとに書込対象データを分割してデータセグメントＡ，Ｂ…を得ることとなる。
【００３１】
すなわち、この例においてデバイスコントローラ２２は、各データセグメントをパリティ生成単位として、このデータ長（ｎ−１）×ＬＣのデータセグメントＡ，Ｂ…ごとに、対応するパリティデータＡparity，Ｂparity…を生成する。また、得られたデータセグメントごとにパリティデータを格納するディスクドライブ２３を選択する。
【００３２】
例えばデバイスコントローラ２２は、各データセグメントを長さＬＣのチャンクＡ1，Ａ2，…Ａn-1，Ｂ1，Ｂ2，…，Ｂn-1…に区分し、データセグメントＡに対応するパリティデータＡparityを、ストレージディスクデバイス２３-nに格納することとして、データセグメントＡを区分して得られたチャンクＡ1，Ａ2，…Ａn-1については、パリティデータの格納先として選択したディスクドライブ２３-n以外のｎ−１台のディスクドライブ２３-1，…２３-(n-1)のそれぞれの記憶領域（その位置はライトコマンドに含まれるＬＢＡによって特定される）に格納していく（図２）。
【００３３】
デバイスコントローラ２２は、以下、データセグメントＢに対応するパリティデータＢparityについてはディスクドライブ２３-(n-1)に格納することとし、データセグメントＢを区分して得られたデータＢ1，Ｂ2，…Ｂn-1については、ディスクドライブ２３-1，…２３-(n-2)，２３-nのそれぞれに格納していくようにする。このような格納方式は、いわゆるＲＡＩＤ５として知られているので、以下の詳しい説明を省略する。
【００３４】
このデータセグメントＡ，Ｂ…が格納される領域（ｎ−１台のストレージディスクデバイス２３に分割して配されている領域、以下セグメントと呼ぶ）Ｓには、図３に示すように、自然数個の論理セクタ（Ｌ）が含まれる。デバイスコントローラ２２は、セグメントごとに、当該セグメントに含まれる論理セクタを特定する情報（ＬＢＡ）を関連付けて、マップ情報として記憶しておく。
【００３５】
また本実施の形態のこの例においてデバイスコントローラ２２は、リードコマンドとして、読み出しの対象となるデータが格納された領域を特定する情報（当該領域に含まれる論理セクタを特定するＬＢＡ）を受け入れる。そしてデバイスコントローラ２２は、マップ情報を参照して、当該受け入れた情報で特定される論理セクタを含むセグメントを特定する。
【００３６】
デバイスコントローラ２２は、特定したセグメント内のデータ及び対応するパリティデータを、ディスクドライブ２３-1，…２３-nから読み出す。ここでデバイスコントローラ２２は、パリティデータを用いて、セグメント内のデータに誤りがないかを検出、ないし訂正する処理を行うが、この処理はＲＡＩＤの処理として広く知られた処理をそのまま採用できるので、ここでの詳しい説明を省略する。
【００３７】
そしてデバイスコントローラ２２は、ディスクドライブ２３から読み出したデータのうち、読み出しコマンドに含まれる情報で特定される論理セクタ内のデータ部分（セグメント全体に対応する場合はセグメント全体のデータ）を、インタフェース部２１を介して記憶制御装置３０に対して出力する。
【００３８】
記憶制御装置３０の制御部３１は、ＣＰＵ等のプログラム制御デバイスであり、記憶部３２に格納されたプログラムに従って動作する。
【００３９】
具体的にこの制御部３１は、ホスト側装置１０からライトコマンドを受け入れて次のように動作する。このライトコマンドには、書き込みの対象となる書込対象データと、当該書込対象データを書き込むべき対象領域を特定する情報（例えば格納先となる論理セクタを特定するＬＢＡ）とを含む。
【００４０】
制御部３１は、ライトコマンドの対象領域を特定する情報を記憶部３２に保持させる。またこの制御部３１は、この記憶部３２に保持された情報を参照し、過去に受け入れたライトコマンドの対象領域を特定する情報と、今回受け入れたライトコマンドの対象領域との間にある間隙データが、コントローラキャッシュ部３３にキャッシュされているか否かを調べる。
【００４１】
ここで上記間隙データがコントローラキャッシュ部３３にキャッシュされていれば、制御部３１は、当該キャッシュされている間隙データと今回受け入れたライトコマンドに含まれる書込対象データとを書き込むべき旨を表すライトコマンドを生成するライトコマンド生成処理を実行し、当該生成したライトコマンドを、ディスクデバイス２０へ出力する。本実施の形態の制御部３１の動作については、後に詳しく述べる。
【００４２】
記憶部３２は、制御部３１によって実行されるプログラムを保持するメモリデバイス等である。この記憶部３２に格納されるプログラムは、コンピュータ可読、かつ非一時的（Non-Transitory）な記録媒体に格納されて提供されたものであってもよいし、ネットワーク等の通信回線を介して取得されたものであってもよい。本実施の形態において記憶部３２は、制御部３１のワークメモリとしても動作する。
【００４３】
コントローラキャッシュ部３３は、記憶制御装置３０においてキャッシュとして機能するメモリデバイスである。本実施の形態の一態様では、このコントローラキャッシュ部３３は、記憶部３２の一部として実現されていてもよい。第１インタフェース部３４は、ホスト側装置１０に接続され、制御部３１とホスト側装置１０との間でデータやコマンドを授受する。第２インタフェース部３５は、ディスクデバイス２０に接続され、制御部３１とディスクデバイス２０との間でデータやコマンドを授受する。
【００４４】
［制御部の動作］
次に、制御部３１の動作について説明する。本実施の形態の例では、制御部３１は過去に受け入れたライトコマンドの対象領域と、今回受け入れたライトコマンドの対象領域との間にある間隙データが、コントローラキャッシュ部３３にキャッシュされていることで書き込み処理の高速化が図られる。そこで本実施の形態では、ライトコマンドによる書き込みの処理において、当該ライトコマンドで実際にデータが書き込まれる対象領域よりも大きい領域のデータをディスクデバイス２０から読み出しておき、ライトコマンドで書き込みの対象となるデータ部分を書き換えてディスクデバイス２０へ書き戻す処理を行う。
【００４５】
具体的な例として、本実施の形態では、端数処理においてライトコマンドで実際に書き込まれる領域よりも大きい領域のデータを読み出すこととすればよい。
【００４６】
この例に係る実施の形態では、記憶制御装置３０が、ディスクデバイス２０のセグメントごとに、当該セグメントに含まれる論理セクタを特定する情報を関連付けて、マップ情報として記憶しておくものとする。このマップ情報は、デバイスコントローラ２２が記憶しているものと同じものである。また、この制御部３１の動作のうち、ホスト側装置１０からリードコマンドを受けたときの動作は、従来例と同様のものであるので、ここでの詳しい説明を省略する。
【００４７】
制御部３１は、ホスト側装置１０からライトコマンドを受けたときに、次の処理を実行する。具体的に本実施の形態の制御部３１は、記憶部３２に格納されたプログラムを実行することにより、図４に例示する機能的構成を実現する。すなわち当該プログラムを実行する制御部３１は、機能的に、受入部３１１と、近接領域判断部３１２と、キャッシュ判断部３１３と、コマンド処理部３１４と、書込処理部３１５と、ライトコマンド記録部３１６とを備えるものとして動作する。
【００４８】
また後に述べるように、本実施の形態では図５に例示するように、過去にデータが書き込まれた対象領域を表す情報のリストが対象領域履歴リストとして記憶部３２に記録されている。この対象領域履歴リストは、ライトコマンド記録部３１６の動作により記録されるもので、過去にディスクデバイス２０へ出力したライトコマンドに含まれていた、対象領域を表す情報（当該領域の先頭ＬＢＡ_headと書込対象データの長さＬＢＮとを含む、あるいは、当該領域の先頭ＬＢＡ_headと書込対象データの長さＬＢＮだけ先の領域のＬＢＡ（次のアドレス）＝ＬＢＡ_head＋ＬＢＮを含む）を、予め定めた数Ｎだけ蓄積して記録したものである。
【００４９】
受入部３１１は、ホスト側装置１０から第１インタフェース３４を介してライトコマンド等を受け入れる。この受入部３１１がホスト側装置１０から受け入れるライトコマンドには、書き込みの対象となる書込対象データと、当該書込対象データを書き込む領域である対象領域を表す情報（当該領域の先頭ＬＢＡ_headと書込対象データの長さＬＢＮとを含む、あるいは、当該領域の先頭ＬＢＡ_headと書込対象データの長さＬＢＮだけ先の領域のＬＢＡ（次のアドレス）＝ＬＢＡ_head＋ＬＢＮを含む）とが含まれる。
【００５０】
近接領域判断部３１２は、記憶部３２に記録された対象領域履歴リストを参照し、当該対象領域履歴リストに含まれる情報のうち、今回、受入部３１１が受け入れたライトコマンドに含まれる情報で特定される対象領域に最も近接する領域を特定する情報を検索する。そしてこの検索により見出された領域を特定する情報を、キャッシュ判断部３１３に出力する。また、近接領域判断部３１２は、当該検索により見出した領域を特定する情報が対象領域履歴リスト上で何番目にあったかを表す情報（インデックス情報）を、ライトコマンド記録部３１６に出力する。なお、対象領域履歴リストに記録された情報がない場合は、近接領域判断部３１２はライトコマンド記録部３１６に今回、受入部３１１が受け入れたライトコマンドを書込処理部３１５に出力する。
【００５１】
また本実施の形態の一例では、この近接領域判断部３１２は、記憶部３２に記録された対象領域履歴リストを参照し、当該対象領域履歴リストに含まれる情報のうち、今回、受入部３１１が受け入れたライトコマンドに含まれる情報で特定される対象領域に最も近接する領域を特定する情報であって、当該対象領域履歴リストに含まれる情報で特定される領域と、今回、受入部３１１が受け入れたライトコマンドに含まれる情報で特定される対象領域との間の間隔が、所定の間隔より小さい領域を検索することとしてもよい。この場合も近接領域判断部３１２は、検索により見出された領域を表す情報をキャッシュ判断部３１３に出力し、また当該検索により見出した領域を特定する情報が対象領域履歴リスト上で何番目にあったかを表す情報（インデックス情報）を、ライトコマンド記録部３１６に出力する。
【００５２】
なお、この場合に、近接領域判断部３１２は、受入部３１１が受け入れたライトコマンドに含まれる情報で特定される対象領域との間隔が上記所定の間隔より大きい領域を特定する情報しか対象領域履歴リストに記録されていないなど、上記検索により領域を特定する情報が見出せなかった場合（対象領域履歴リストに記録された情報がない場合を含む）は、受入部３１１が受け入れたライトコマンドを書込処理部３１５に出力する。
【００５３】
キャッシュ判断部３１３は、近接領域判断部３１２が出力する情報で表される領域と、今回受け入れたライトコマンドの対象領域との間にある間隙データが、コントローラキャッシュ部３３にキャッシュされているか否かを判断する。例えば、近接領域判断部３１２が出力する情報で表される領域の先頭ＬＢＡがＬＢＡ１_headであり、末尾ＬＢＡ（ＬＢＡ１_head＋ＬＢＮ）がＬＢＡ１_lastであるとし、今回、受け入れたライトコマンドの対象領域の先頭ＬＢＡがＬＢＡ_headであるとき（ＬＢＡ１_last＜ＬＢＡ_headとする）、ＬＢＡ１_last＋１からＬＢＡ_head−１までの領域に格納されているデータ全体が、コントローラキャッシュ部３３にキャッシュされていれば、キャッシュ判断部３１３は、間隙データが、コントローラキャッシュ部３３にキャッシュされていると判断する。また、ＬＢＡ１_last＋１からＬＢＡ_head−１までの領域に格納されているデータ全体が、コントローラキャッシュ部３３にキャッシュされていなければ、キャッシュ判断部３１３は、間隙データが、コントローラキャッシュ部３３にキャッシュされていないと判断する。
【００５４】
コマンド処理部３１４は、キャッシュ判断部３１３が、コントローラキャッシュ部３３に間隙データがキャッシュされていると判断したときに、今回受け入れたライトコマンドと、間隙データとを用いてライトコマンドを生成する（この処理を以下では連続化処理と呼ぶ）。具体的にコマンド処理部３１４は、間隙データＤｍに対応する領域の先頭ＬＢＡがＬＢＡｍ_headであり、末尾ＬＢＡがＬＢＡｍ_lastであるとすると、
（１）ＬＢＡｍ_last＝ＬＢＡ_head−１であるとき：連続化処理を行い、ＬＢＡｍ_headからＬＢＡ_lastまでに、間隙データＤｍと今回受け入れたライトコマンドの書込対象データＤとを連続して書き込むライトコマンドを生成する。また、
（２）ＬＢＡ_last＋１＝ＬＢＡｍ_headであるとき：連続化処理を行い、ＬＢＡ_headからＬＢＡｍ_lastまでに、今回受け入れたライトコマンドの書込対象データＤと間隙データＤｍとを連続して書き込むライトコマンドを生成する。
【００５５】
コマンド処理部３１４は、ここで生成したライトコマンドを書込処理部３１５に出力する。さらにこのコマンド処理部３１４は、キャッシュ判断部３１３が、コントローラキャッシュ部３３に間隙データがキャッシュされていないと判断したときには、連続化処理を行わずに、今回受け入れたライトコマンドをそのまま書込処理部３１５に出力する。また、コマンド処理部３１４は連続化処理を行ったときには、その旨を表す情報を、ライトコマンド記録部３１６に出力する。
【００５６】
このように本実施の形態では、このキャッシュ判断部３１３とコマンド処理部３１４とにより、ライトコマンドの生成処理が行われる。
【００５７】
書込処理部３１５は、近接領域判断部３１２またはコマンド処理部３１４からライトコマンドの入力を受けると、当該ライトコマンドをディスクデバイス２０へ出力する。またライトコマンド記録部３１６は、書込処理部３１５からディスクデバイス２０へ出力したライトコマンドに含まれている、対象領域を特定する情報を受け取り、記憶部３２に記録する。
【００５８】
本実施の形態の一例では、ライトコマンド記録部３１６は、直近Ｎ回（Ｎは２以上の整数）のうちに出力されたライトコマンド内の対象領域を特定する情報を対象領域履歴リストとして記録しておくこととしてもよいし、後に述べるように、ＬＲＵ（Least Recent Used）処理されたリストとして、この対象領域履歴リストを記録してもよい。
【００５９】
［拡大した領域を読み込む処理］
また本実施の形態において書込処理部３１５は、少なくとも入力されたライトコマンドがコマンド処理部３１４において生成されたコマンドでなく、今回、受入部３１１が受け入れたライトコマンドそのものであるときには、後の処理において、間隙データのヒット率を高めるために、当該ライトコマンドの対象領域だけでなく、当該ライトコマンドの対象領域を含み、当該対象領域に後続する領域を含んだ拡大領域のデータを取得しておく。
【００６０】
ここで拡大領域のデータは、コントローラキャッシュ部３３に当該データが格納されていれば、コントローラキャッシュ部３３から取得することとしてもよいし、コントローラキャッシュ部３３に当該データが格納されていなければ、当該データを読み出すべきリードコマンドをディスクデバイス２０に出力し、ディスクデバイス２０から当該リードコマンドに応答して読み出されたデータを受け入れることにより取得してもよい。後者のようにディスクデバイス２０から対応するデータを受け入れた場合、書込処理部３１５は当該受け入れたデータを、コントローラキャッシュ部３３に格納してキャッシュする。ここでキャッシュするデータには、リードコマンドに含めて出力したＬＢＡ（要求ＬＢＡ）のうち、先頭のＬＢＡを関連付けて記録しておいてもよい。
【００６１】
書込処理部３１５は、当該コントローラキャッシュ部３３内に格納したデータに、書込対象領域に対応するデータ部分があれば、当該データ部分を、ライトコマンドに含まれる書込対象データで書き換えてキコントローラキャッシュ部３３に格納したデータを更新する。また、書込処理部３１５は、当該コントローラキャッシュ部３３内に格納したデータに対象領域に対応するデータ部分がなければ、対象領域に対応するデータ部分をコントローラキャッシュ部３３に格納したデータに追記して、コントローラキャッシュ部３３内のデータを更新する。
【００６２】
その後、書込処理部３１５は、更新したコントローラキャッシュ部３３内のデータを新たな書込対象データとし、当該新たな書込対象データと、当該新たな書込対象データに対応する対象領域を特定する情報とを含んだ新たなライトコマンドを生成して、ディスクデバイス２０に出力する。
【００６３】
なお、このとき書込処理部３１５は、更新して得られたデータの全体を新たな書込対象データとする必要は必ずしもなく、更新して得られたデータのうち、ホスト１０から受け入れたライトコマンドに含まれていた書込対象データで書き換えた部分、または当該ライトコマンドに含まれていた書込対象データを追記した部分を内包したパリティ生成単位のデータを含む一部を取りだして、当該取りだした部分を新たな書込対象データとしてもよい。
【００６４】
［端数処理の例］
具体的に本実施の形態の一例に係る書込処理部３１５は、上述の拡大した領域を読み込む処理を、端数処理の一部として行う。この例の書込処理部３１５は、対象領域を特定する情報を含んだライトコマンドの入力を受ける。ここで、図６に示すように、当該情報で特定される対象領域（Ｐ）には複数の論理セクタ（Ｒ１，Ｒ２，…、以下対象セクタと呼ぶ）が含まれるが、この対象領域は、必ずしもパリティ生成単位（Ｑ）に一致しない。つまり、パリティ生成単位内には、対象セクタと、対象セクタでない部分（端数部分：Ｔ）とが含まれる。
【００６５】
以下、対象セクタ内に記録されているデータをセクタデータと呼び、端数部分に記録されているデータを端数データと呼ぶ。パリティ生成単位内には、セクタデータと端数データとが含まれることとなる。
【００６６】
書込処理部３１５は、入力されたライトコマンドに含まれる情報で特定される対象領域内の論理セクタ（対象セクタ）に記録されているセクタデータと端数データとを内包したパリティ生成単位を少なくとも一つ含むデータのうち、セクタデータ以外の部分を少なくとも含むデータ（処理対象データと呼ぶ）が、コントローラキャッシュ部３３に保持されているか否か判断する。
【００６７】
本実施の形態のここでの例では、パリティ生成単位がセグメントの単位となっているので、書込処理部３１５は、対象セクタを内包するセグメント（対象セクタが複数のセグメントにまたがっている場合は、当該複数のセグメントの全体）を含むデータのうち、対象セクタを除くデータがコントローラキャッシュ部３３に格納されているか否かを判断することとなる。そして、書込処理部３１５は、対象セクタを内包するセグメント（対象セクタが複数のセグメントにまたがっている場合は、当該複数のセグメントの全体）を含むデータのうち、対象セクタを除くデータがコントローラキャッシュ部３３に格納されていれば、当該対象セクタを内包するセグメントを含むデータを処理対象データとして、コントローラキャッシュ部３３から読み出す。
【００６８】
すなわち、書込処理部３１５は、入力されたライトコマンドに基づいてコントローラキャッシュ部３３内の処理対象データを読み出す。ここで当該読み出した処理対象データのうちに、対象セクタに記録されているセクタデータに対応するデータ部分が含まれる場合は、書込処理部３１５は、当該データ部分をライトコマンドに含まれる書込対象データで書き換えて更新する。また書込処理部３１５は、当該読み出した処理対象データのうちに上記のセクタデータに対応するデータ部分が含まれない場合は、読み出した処理対象データ（のうちセクタデータに対応する部分）に、ライトコマンドに含まれる書込対象データを追記して、処理対象データを更新する。なおセクタデータに対応する部分は、コントローラキャッシュ部３３内の処理対象データの読み出し元の位置を指定する情報（セクタの位置を特定する情報）に基づいて判断される。
【００６９】
書込処理部３１５は、更新後の処理対象データを、書き込み対象データとしてディスクデバイス２０に出力する。またこのとき、書込処理部３１５は、更新後の処理対象データの格納先となる論理セクタの先頭ＬＢＡ及び末尾ＬＢＡを、対象領域を特定する情報として出力する。さらにこのとき書込処理部３１５は、コントローラキャッシュ部３３に格納されていた処理対象データを、更新後の処理対象データで置き換える（ライトスルー方式によるキャッシュ）。ここで書き込み対象として出力される、更新後の処理対象データは、端数が発生している場合は、ライトコマンドに含まれるデータに加えて当該端数を含むデータであり、端数が発生しない場合はライトコマンドに含まれるデータそのものとなる。
【００７０】
一方、処理対象データに相当するデータがコントローラキャッシュ部３３に保持されていないと判断したとき（処理対象データに相当するデータの一部は保持されているが、処理対象データに相当するデータの全体がコントローラキャッシュ部３３に保持されていないと判断したときを含む）には、書込処理部３１５は、上記処理対象データがコントローラキャッシュ部３３に保持された状態となるよう、ディスクデバイス２０から処理対象データの少なくとも一部のデータを取得する。
【００７１】
具体的に、処理対象データに相当するデータがコントローラキャッシュ部３３に保持されていないと判断したとき、書込処理部３１５は、次のいずれかの方法でデータの読み出しの動作を行う。すなわち、本実施の形態のある例では、図７に示すように、ディスクデバイス２０におけるセグメントに複数の論理セクタ（Ｌ）が含まれる。従って一般的にディスクデバイス２０におけるデータの読み出し／書き込みの単位であるセグメント（Ｓ）には、ライトコマンドの対象領域に対応する論理セクタ（Ｌ）の前後に、当該ライトコマンドにより書き換えられないデータ（つまり端数データ）も含まれる。そこで書込処理部３１５は、（１）必要最低限のデータを読み出す方法または（２）必要最低限を超えるデータを読み出す方法のいずれかにより処理対象データ（の少なくとも不足する部分）の読み出し処理を行う。以下、それぞれについて説明する。
（１）必要最低限のデータを読み出す方法
【００７２】
この方法を採用する場合、書込処理部３１５は、マップ情報を参照して、ライトコマンドの対象領域に対応する論理セクタ（対象セクタ）を含むセグメントを特定し、当該特定されたセグメントのうちで、対象セクタの前方と後方とに端数が発生しているか否かを調べる。
【００７３】
そして、
（1-1）前方にのみ端数が発生する場合（図７（ａ））：書込処理部３１５は、対象セクタより前方の端数部分（対象セクタは含まなくてもよい）に相当する論理セクタを特定する情報を含むリードコマンドをディスクデバイス２０に対して出力する。なお、対象セクタに対応する部分が、複数のセグメントにまたがっている場合も同様に、対象セクタより前方の端数部分（対象セクタは含まなくてもよい）に相当する論理セクタを特定する情報を含むリードコマンドをディスクデバイス２０に対して出力する。
【００７４】
また、
（1-2）後方にのみ端数が発生する場合（図７（ｂ））：書込処理部３１５は、対象セクタより後方の端数部分（対象セクタは含まなくてもよい）に相当する論理セクタを特定する情報を含むリードコマンドをディスクデバイス２０に対して出力する。なお、対象セクタに対応する部分が、複数のセグメントにまたがっている場合も同様に、対象セクタより後方の端数部分（対象セクタは含まなくてもよい）に相当する論理セクタを特定する情報を含むリードコマンドをディスクデバイス２０に対して出力する。
（1-3）前方と後方との双方に端数が発生する場合（図７（ｃ））：書込処理部３１５は、対象セクタより前方の端数部分及び後方の端数部分（対象セクタは含まなくてもよい）に相当する論理セクタを特定する情報とを含むリードコマンドをディスクデバイス２０に対して出力する。なお、対象セクタに対応する部分が、複数のセグメントにまたがっている場合（図７（ｄ））も同様に、対象セクタより前方の端数部分及び後方の端数部分（対象セクタは含まなくてもよい）に相当する論理セクタを特定する情報を含むリードコマンドをディスクデバイス２０に対して出力する。なお、この場合、前方の端数部分と後方の端数部分とを二度に分けて読み出すよりも、前方の端数部分から後方の端数部分まで対象セクタを含んで読み出すほうが効率的である場合もある。従って、この例のリードコマンドより読み出される範囲に対象セクタを含むように制御してもよい。
【００７５】
なおこのように対象セクタのデータの前方と後方との双方に端数が発生する場合は、書込処理部３１５は、上記規則に従って読み出すこととなるデータのサイズを調べ、当該サイズが、予め定めたサイズ（例えばセグメントサイズの数倍程度）を超えると判断される場合は、データの読み出しを行わずに（本実施の形態の端数処理をせずに）、入力されたライトコマンドを、そのままディスクデバイス２０に対して出力するようにしてもよい。
（２）必要最低限を超えるデータを読み出す方法
【００７６】
書込処理部３１５は、必要最低限を越えるデータを読み出してもよい。この例では、書込処理部３１５は、マップ情報を参照して、ライトコマンドの対象領域に対応する対象セクタを含むセグメントを特定する。そして、書込処理部３１５は、特定したセグメントと、当該特定したセグメントの後に続く所定数個のセグメントに含まれるすべての論理セクタ（対象セクタは除いてもよい）を特定する情報を含むリードコマンドを、ディスクデバイス２０に対して出力するようにしてもよい。なお、特定したセグメント内で対象セクタの前後に端数部分がある場合は、前方の端数部分と後方の端数部分とを二度に分けて読み出すよりも、前方の端数部分から後方の端数部分まで対象セクタを含んで読み出すほうが効率的である場合もある。従って、このときにはリードコマンドにより読み出される範囲に対象セクタを含むように制御してもよい。
【００７７】
また、当該特定したセグメントの後に続く所定数個のセグメントに含まれる論理セクタ内のデータがコントローラキャッシュ部３３に格納されている場合は、書込処理部３１５は、当該データをコントローラキャッシュ部３３から読み出してもよい。なお、対象セクタが複数のセグメントにまたがっている場合も同様に処理して構わない。
【００７８】
ここで上記所定数個をいくつとするかは、実際に数を変更しながら処理速度を測定して実験的に定める。この数の最適値はストレージディスクデバイスのシーク速度や、ヒット率に影響されると考えられるためである。
【００７９】
書込処理部３１５はこうして、ディスクデバイス２０から、ライトコマンドの対象領域の前後にある端数のデータ（あるいは当該対象領域に対応する対象セクタに続く複数のセグメント分のデータ）を得て、コントローラキャッシュ部３３に格納するので、過去に受け入れたライトコマンドの対象領域と、今回受け入れたライトコマンドの対象領域との間にある間隙データがコントローラキャッシュ部３３に格納されている確率が高められる。
【００８０】
［ライトコマンド内の対象領域を特定する情報］
ここでライトコマンド記録部３１６が、書込処理部３１５がディスクデバイス２０へ出力したライトコマンドに含まれている、対象領域履歴リストをＬＲＵ（Least Recent Used）処理されたリストとして記録する例について説明する。
【００８１】
この例では、ライトコマンド記録部３１６は、書込処理部３１５がディスクデバイス２０へライトコマンドを出力すると、当該出力されたライトコマンドに含まれる対象領域を表す情報（例えば先頭ＬＢＡであるＬＢＡ_head、及び書込対象データの長さであるＬＢＮ、または先頭ＬＢＡであるＬＢＡ_headと、書き込み対象データの長さであるＬＢＮだけ後のＬＢＡ、つまり、ＬＢＡ_head＋ＬＢＮの値）を取り出す。以下の例では、ＬＢＡ_headとＬＢＮとを、出力されたライトコマンドから得たものとして説明する。ライトコマンド記録部３１６は、当該出力されたライトコマンドが、書込処理部３１５が連続化処理を行ったものであるか否かを、コマンド処理部３１４から連続化処理を行った旨の情報の入力があったか否かにより判断する。
【００８２】
ライトコマンド記録部３１６は、連続化処理が行われたと判断すると、近接領域判断部３１２から入力されるインデックス情報（連続化処理が行われたときには必ずインデックス情報が入力される）を参照し、対象領域履歴リスト内で、インデックス情報で表される位置に記録された先頭ＬＢＡ_headと書込対象データの長さＬＢＮとを、書込処理部３１５がディスクデバイス２０へ出力したライトコマンドに含まれている先頭ＬＢＡ_headと書込対象データの長さＬＢＮとで書き換える。またライトコマンド記録部３１６は対象領域履歴リスト内で、インデックス情報で表される位置にある先頭ＬＢＡ_headと書込対象データの長さＬＢＮとを対象領域履歴リストの先頭（１番目）へ移動する。このとき、移動前の１番目にあった先頭ＬＢＡ_headと書込対象データの長さＬＢＮとは対象領域履歴リストの２番目に、移動前の２番目にあった先頭ＬＢＡ_headと書込対象データの長さＬＢＮとは対象領域履歴リストの３番目に、…というように順次移動していき、移動前のＮ番目にあった先頭ＬＢＡ_headと書込対象データの長さＬＢＮとを削除する。
【００８３】
またライトコマンド記録部３１６は、連続化処理が行われなかったと判断すると、対象領域履歴リストの末尾に、書込処理部３１５がディスクデバイス２０へ出力したライトコマンドに含まれている先頭ＬＢＡ_headと書込対象データの長さＬＢＮとを記録する。ここで対象領域履歴リストの末尾に既に記録があった場合（つまり対象領域履歴リストに対象領域履歴リストの最大長であるＮ個の先頭ＬＢＡ_headと書込対象データの長さＬＢＮとが既に記録されていた場合）には、対象領域履歴リストの当該最後の（Ｎ番目の）位置に記録されていた先頭ＬＢＡ_headと書込対象データの長さＬＢＮとを、込処理部３１５がディスクデバイス２０へ出力したライトコマンドに含まれている先頭ＬＢＡ_headと書込対象データの長さＬＢＮとで書き換える（ライトコマンドに含める対象領域を特定する情報がＬＢＡ_headと、ＬＢＡ_head＋ＬＢＮである場合は、ＬＢＡ_head＋ＬＢＮを演算して書き換えればよい）。そして、ライトコマンド記録部３１６は対象領域履歴リストの末尾に記録した先頭ＬＢＡ_headと書込対象データの長さＬＢＮとを対象領域履歴リストの先頭（１番目）へ移動する。このとき、移動前の１番目にあった先頭ＬＢＡ_headと書込対象データの長さＬＢＮとは対象領域履歴リストの２番目に、移動前の２番目にあった先頭ＬＢＡ_headと書込対象データの長さＬＢＮとは対象領域履歴リストの３番目に、…というように順次移動していく。このとき、移動前のＮ番目にあった先頭ＬＢＡ_headと書込対象データの長さＬＢＮとは削除される。
【００８４】
ライトコマンド記録部３１６は、また、フラッシュコマンドが入力されたときには、対象領域履歴リストをクリアする。
【００８５】
［動作］
本実施の形態の記憶制御システム１は、以上の構成を備えてなり、次のように動作する。以下の動作例においてホスト側装置１０は、例えばウィンドウズ（登録商標）ＯＳで動作するパーソナルコンピュータであるとし、比較的小サイズのファイルを多数（例えば１万ファイル）、ディスクデバイス２０に記録するよう記憶制御装置３０に要求する例について説明する。こうしたホスト側装置１０では、この例のように比較的小サイズのファイルを書き込むためのライトコマンドを続けて出力するとき、各ファイルのデータを格納する領域同士の間に、所定の間隔を空けるよう制御されることが多い。なお、ホスト側装置１０ではデータをクラスタと呼ばれるデータサイズの単位で出力する。
【００８６】
また以下の動作例において、当初は、記憶制御装置３０の記憶部３２には空の対象領域履歴リストが設定される。また、コントローラキャッシュ部３３も当初はクリアされているものとする。
【００８７】
図８に例示するように、記憶制御装置３０が、ホスト側装置１０からライトコマンドを受け入れる（Ｓ１１）。以下の説明の便宜のため、ここで受け入れたライトコマンドには、対象領域を特定する情報として、対象領域の先頭ＬＢＡ＝ＬＢＡ１_headと、書込対象データ長ＬＢＮ１とが含まれるものとする。また、ＬＢＡ１_last＝ＬＢＡ１_head＋ＬＢＮとする。
【００８８】
記憶制御装置３０は、対象領域履歴リストから、当該対象領域履歴リストに含まれる情報のうち、今回、受け入れたライトコマンドに含まれる情報で特定される対象領域に最も近接する領域を特定する情報であって、当該対象領域履歴リストに含まれる情報で特定される領域と、今回受け入れたライトコマンドに含まれる情報で特定される対象領域との間の間隔が、所定の間隔より小さい領域を特定する情報を検索する（Ｓ１２：近接履歴の検索）。この所定の単位は、ディスクデバイス２０にファイルを保存するホスト側装置１０のアプリケーションの事情に応じて適宜定めてもよいが、例えば上記クラスタのサイズの数倍（例えば２倍ないし１６倍）程度としておいてもよい。
【００８９】
この段階では対象領域履歴リストは空であるので、処理Ｓ１２において記憶制御装置３０は、領域を特定する情報の検索ができなかった（Ｓ１２で「検索失敗」となった）ものとして、ホスト側装置１０から入力されたライトコマンドそのものに基づく処理を行う。本実施の形態の一例では、記憶制御装置３０は、ここで当該ライトコマンドに含まれる情報で特定される対象領域に含まれる論理セクタを対象セクタとして、この対象セクタに記録されているデータ（セクタデータ）と端数データとを内包したパリティ生成単位を少なくとも一つ含むデータのうち、セクタデータ以外の部分を含む（セクタデータ部分は上書きされてしまうので、含んでも含まなくてもよい）データ（処理対象データ）が、コントローラキャッシュ部３３に記録されているか否か判断する（Ｓ１３）。
【００９０】
ここではコントローラキャッシュ部３３も空の状態であるので、記憶制御装置３０は、処理対象データがキャッシュされていない（Noである）と判断し、ディスクデバイス２０において少なくとも上記処理対象データの格納された範囲のすべての論理セクタを読み出しの対象領域とするリードコマンドを、ディスクデバイス２０に出力する（Ｓ１４：読み出し処理）。本実施の形態では、この読み出し処理において記憶制御装置３０は、上記処理対象データの格納された範囲のすべての論理セクタとともに、それに後続する少なくとも一つの論理セクタを読み出しの対象領域とするリードコマンドを、ディスクデバイス２０に出力してもよい。つまり、この場合、記憶制御装置３０は、ＬＢＡ１_headからＬＢＡ１_lastを含むセグメントの先頭ＬＢＡをＬＢＡs_headとし、当該セグメントの末尾ＬＢＡをＬＢＡs_lastとすると、ＬＢＡs_headから、ＬＢＡread_end（ただしＬＢＡread_end≧ＬＢＡs_last）までを読み出すリードコマンドをディスクデバイス２０に出力する。
【００９１】
そしてディスクデバイス２０が当該リードコマンドに応じて出力するデータを受け入れて、記憶制御装置３０は当該データを処理対象データとしてコントローラキャッシュ部３３に格納する（Ｓ１５）。ここではディスクデバイス２０から、処理Ｓ１１で受け入れたライトコマンドによる書き換えの対象となった対象セクタを含むセグメント内のデータと、それに後続する論理セクタ（端数処理のため、セグメント単位としてもよい）のデータと（ＬＢＡs_headから、ＬＢＡread_end（ただしＬＢＡread_end≧ＬＢＡs_last）までの領域に含まれる論理セクタ内のデータ）が処理対象データとしてコントローラキャッシュ部３３に格納された状態となる。
【００９２】
記憶制御装置３０は、ここでコントローラキャッシュ部３３に格納された処理対象データのうち、ＬＢＡ１_headからＬＢＡ１_lastに対応する部分のデータに、処理Ｓ１１で受け入れたライトコマンドに含まれる書込対象データを上書きする。そして記憶制御装置３０は、当該処理対象データのうち、ＬＢＡs_headからＬＢＡs_lastの部分（ＬＢＡ１_headからＬＢＡ１_lastに対応する部分を含むセグメント単位のデータ）を取り出して、この部分のデータを書込対象データとし、この範囲の領域を対象領域とするライトコマンドを生成して、ディスクデバイス２０に出力する（Ｓ１６：ライト処理）。ディスクデバイス２０内では、このライトコマンドをすぐには処理せず、デバイスキャッシュに保持しておく。なお、処理Ｓ１３において処理対象データがキャッシュされていれば（Yesならば）、記憶制御装置３０は、この処理Ｓ１６に移行して処理を続ける。
【００９３】
また、記憶制御装置３０は、この生成したライトコマンドにて書き込まれた領域を特定する情報（先頭ＬＢＡであるＬＢＡs_headと、ＬＢＮ＝ＬＢＡs_last−ＬＢＡs_headとを含む情報、以下、説明の便宜のため、第１ライト領域情報と呼ぶ）を対象領域履歴リストに記録する（Ｓ１７）。この第１ライト領域情報は、対象領域履歴リストの先頭に記録される。
【００９４】
記憶制御装置３０は、そして処理Ｓ１１に戻って処理を続ける。すなわち記憶制御装置３０は、またホスト側装置１０からライトコマンドを受け入れる（処理Ｓ１１）。以下の説明の便宜のため、ここで受け入れたライトコマンドには、対象領域を特定する情報として、対象領域の先頭ＬＢＡ＝ＬＢＡ２_headと、書込対象データ長ＬＢＮ２とが含まれるものとする。また、ＬＢＡ２_last＝ＬＢＡ２_head＋ＬＢＮ２とする。
【００９５】
記憶制御装置３０は、対象領域履歴リストから、当該対象領域履歴リストに含まれる情報のうち、今回、受け入れたライトコマンドに含まれる情報で特定される対象領域に最も近接する領域を特定する情報であって、当該対象領域履歴リストに含まれる情報で特定される領域と、今回受け入れたライトコマンドに含まれる情報で特定される対象領域との間の間隔が、所定の間隔より小さい領域を特定する情報を、検索する（処理Ｓ１２）。
【００９６】
ここで例えばＬＢＡ２_head＝ＬＢＡs_last＋αであり、αが上記所定の間隔より小さいとすると、この処理Ｓ１２において記憶制御装置３０は、領域を特定する情報が検索された（処理Ｓ１２で「検索成功」となった）ものとして、対象領域履歴リストに含まれる情報で特定される領域と、今回受け入れたライトコマンドに含まれる情報で特定される対象領域との間にある間隙データがコントローラキャッシュ部３３にキャッシュされているか否かを判断する（Ｓ１８）。ここでは、記憶制御装置３０は、ＬＢＡs_last＋１からＬＢＡ２_head−１までの領域のデータがコントローラキャッシュ部３３にキャッシュされているか否かを判断する。
【００９７】
ここで、処理Ｓ１５で格納されたデータの末尾ＬＢＡがＬＢＡread_end≧ＬＢＡs_last＋αであれば、ＬＢＡs_last＋１からＬＢＡ２_head−１までの領域のデータがコントローラキャッシュ部３３にキャッシュされていることとなる。またＬＢＡread_end＜ＬＢＡs_last＋αであればＬＢＡs_last＋１からＬＢＡ２_head−１までの領域のデータはコントローラキャッシュ部３３にキャッシュされていないこととなる。
【００９８】
処理Ｓ１８において、間隙データがコントローラキャッシュ部３３にキャッシュされていなければ（Noならば）、記憶制御装置３０は、検索失敗のときの処理と同様、処理Ｓ１３に移行して処理を続ける。
【００９９】
また処理Ｓ１８において、間隙データがコントローラキャッシュ部３３にキャッシュされていた（Yesであった）ときには、処理Ｓ１１で今回受け入れたライトコマンドと、間隙データとを用いてライトコマンドを生成する（処理Ｓ１９：連続化処理）。
【０１００】
この連続化処理では、記憶制御装置３０は、この間隙データに対応する領域の末尾ＬＢＡがＬＢＡ２_head−１であるので、間隙データに対応する領域の先頭ＬＢＡであるＬＢＡs_last＋１と、書込対象データ長ＬＢＮとして、Ｌ［Ｄm］＋ＬＢＮ２（ここでＬ［Ｄｍ］は間隙データのサイズとする）とを対象領域を特定する情報として含み、また書込対象データとして間隙データと、処理Ｓ１１で今回受け入れたライトコマンドに含まれる書込対象データとを連接したデータを含むライトコマンドを生成する。そして記憶制御装置３０は、この生成したライトコマンドをディスクデバイス２０に出力する（Ｓ２０：ライト処理）。ディスクデバイス２０内では、このライトコマンドをすぐには処理せず、デバイスキャッシュに保持しておく。
【０１０１】
また、記憶制御装置３０は、処理Ｓ１７へ移行し、この生成したライトコマンドにて書き込まれた領域を特定する情報（先頭ＬＢＡであるＬＢＡs_last＋１と、ＬＢＮ＝Ｌ［Ｄm］＋ＬＢＮ２とを含む情報、以下、説明の便宜のため、第２ライト領域情報と呼ぶ）を対象領域履歴リストに記録する（処理Ｓ１７）。この第２ライト領域情報は、対象領域履歴リストの先頭に記録され、第１ライト領域情報は対象領域履歴リストの第２番目に移動される。
【０１０２】
ディスクデバイス２０では、その後、前回書き込み処理を行ってから所定の時間が経過したなど、所定のタイミングが到来すると、デバイスキャッシュに保持したライトコマンドに基づく書き込み処理を行う。
【０１０３】
この書込処理では、ディスクデバイス２０は、デバイスキャッシュに保持したライトコマンドを受け入れ順に、選択ライトコマンドとして選択しつつ、次の処理を行う。まずディスクデバイス２０は、選択ライトコマンドにより書き込み対象となっている領域を参照する。
【０１０４】
ここでの例では、最初に選択される選択ライトコマンドには、対象領域の先頭ＬＢＡとしてＬＢＡs_headが含まれ、書込対象データ長ＬＢＮとしてＬＢＡs_last−ＬＢＡs_headが含まれる。ディスクデバイス２０は、この選択ライトコマンドの対象領域に隣接する領域にデータを書き込む他のライトコマンドがデバイスキャッシュの、選択ライトコマンドより後に保持されているか否かを調べる。
【０１０５】
ここではデバイスキャッシュには、選択ライトコマンドの次に、先頭ＬＢＡをＬＢＡs_last＋１とするライトコマンドが保持されている。そこで、ディスクデバイス２０は、選択ライトコマンドの対象領域に隣接する領域にデータを書き込む他のライトコマンドがデバイスキャッシュの、選択ライトコマンドより後に保持されていると判断して、選択ライトコマンドと、当該他のライトコマンドとを合成して、一つのライトコマンドを生成する。
【０１０６】
ここではディスクデバイス２０は、先頭ＬＢＡとしてＬＢＡs_headを含み、書込対象データ長ＬＢＮとして、ＬＢＮ＝ＬＢＡs_last−ＬＢＡs_head＋Ｌ［Ｄm］＋ＬＢＮ２とを含んだ対象領域を特定する情報と、書込対象データとして、選択ライトコマンドに含まれた書込対象データと、上記他のライトコマンドに含まれた書込対象データとを連接したデータを含むライトコマンドを生成して、選択ライトコマンドを置き換える。また、上記他のライトコマンドをデバイスキャッシュから削除しておく。
【０１０７】
ディスクデバイス２０は、ここで生成したライトコマンドに従い、ディスクドライブ２３の上記領域、つまり、ＬＢＡs_headから、ＬＢＮ＝ＬＢＡs_last−ＬＢＡs_head＋Ｌ［Ｄm］＋ＬＢＮ２だけの長さの領域に上記連接されたデータを記録させる動作を行う。
【０１０８】
本実施の形態のこの例によると、記憶制御装置３０は、概念的には図９に例示するように、先ずホスト側装置１０からの指示により、対象領域（ＬＢＡ）１から５までにデータを書き込むときに、ディスクデバイス２０から領域（ＬＢＡ）１から１５に格納されたデータ（Ｃ１）を読み込んでコントローラキャッシュ部３３に格納する（Ｓ３１）。記憶制御装置３０は、このコントローラキャッシュ部３３に格納したデータの、対象領域１から５に対応する部分を書込対象データで上書きしたうえで、ディスクデバイス２０に対してこの対象領域を含む、例えば領域１から８のデータをコントローラキャッシュ部３３から取り出して書き込むよう指示する（Ｓ３２）。ディスクデバイス２０では、この指示を一時的に保持する（Ｄ１）。また記憶制御装置３０では、対象領域履歴リストとして、ここで指示した領域（領域１から８）を特定する情報を記録しておく（Ｒ１）。
【０１０９】
また記憶制御装置３０は次に、ホスト側装置１０から領域１０から１５までにデータを書き込むべき旨の指示（ライトコマンド）を受け入れると、この領域１０から１５に近接（例えば距離が５以内などとして予め定める）する領域が、対象領域履歴リストに格納されている情報（Ｒ１）で特定される領域のうちにあるかを調べる。ここでは領域１から８特定する情報が記録されており、記憶制御装置３０はこの情報で特定される領域が、今回受け入れたライトコマンドの対象領域に近接していると判断する。
【０１１０】
そして記憶制御装置３０は、今回受け入れたライトコマンドの対象領域（領域１０から１５）と、この領域に近接している領域であると判断された、対象領域履歴リスト内の情報で特定される領域（ここでは領域１から８）との間にある間隙データが、コントローラキャッシュ部３３に格納されているか否かを調べる。ここでは間隙データは、領域９のデータとなるが、この時点でコントローラキャッシュ部３３には領域１から１５のデータが格納されている（Ｃ１）ので、記憶制御装置３０は、領域９の間隙データがキャッシュされていると判断する。
【０１１１】
記憶制御装置３０はそこで、この領域９の間隙データを、ホスト側装置１０から受け入れたライトコマンドの書込対象データとともに、合わせて書き込むライトコマンドを生成する（Ｓ３３）。つまり記憶制御装置３０は、コントローラキャッシュ部３３に格納された領域１０から１５のデータに、ホスト側装置１０から受け入れたライトコマンドの書込対象データを上書きし、コントローラキャッシュ部３３に格納されている領域９から１５のデータを取り出して、当該取り出したデータを書込対象データとし、領域９から１５を対象領域とするライトコマンドを生成してディスクデバイス２０に出力する（Ｄ２）。
【０１１２】
ディスクデバイス２０では、入力されたライトコマンドが保持している指示（Ｄ１）に隣接する領域を対象領域とするライトコマンドであるので、所定のタイミングで、これらを合成し（Ｓ３４）、領域１から領域１５までのデータを書き込むべき旨の指示（Ｄ′）として処理する。
【０１１３】
これより、比較的小サイズのファイルのデータを次々に書き込む場合等、わずかな間隔をあけた領域にデータを書き込む指示を含んだライトコマンドが次々に到来する場合に、これらのライトコマンドがディスクデバイス２０において連続した領域に書き込む指示として扱われるように、記憶制御装置３０がライトコマンドを制御しており、回転体メディアを備えたディスクデバイスに対して比較的小さいサイズの不連続なデータを繰り返して書き込む場合にも、書き込み動作の高速化を図ることが可能となる。
【０１１４】
［変形例］
なお、本実施の形態は上述の例に限られない。例えば記憶制御装置３０がホスト側装置１０から、ライトコマンドを連続的に受け入れると、先に受け入れたライトコマンドに対する処理が開始されるよりも先に、別のライトコマンドを受け入れることがある。この場合、記憶制御装置３０では、複数のライトコマンドが一時的に保持された状態となる。このとき記憶制御装置３０は、当該保持した複数のライトコマンドを互いに合成可能か否かを判断し、合成可能であれば、当該保持した複数のライトコマンドを合成してから、受入部３１１以下の処理に供してもよい。
【０１１５】
具体的に、当該保持した複数のライトコマンドを互いに合成可能か否かは次のように判断される。すなわち記憶制御装置３０は、ライトコマンドを受け入れたときに、過去に受け入れて、保持しているライトコマンドにより書き込みの対象とされた対象領域を特定する情報を参照し、当該参照した情報で特定される対象領域（便宜的に第１対象領域と呼ぶ）と、今回受け入れたライトコマンドにより書き込みの対象とされた対象領域（便宜的に第２対象領域と呼ぶ）との間にある間隙データが、コントローラキャッシュ部３３にキャッシュされているときに、合成可能と判断する。なお、ここでも、第１対象領域と第２対象領域との間の間隔が予め定めた閾値を下回るときのみ合成可能と判断してもよい。
【０１１６】
記憶制御装置３０は、この処理により合成可能と判断すると、保持しているライトコマンドに含まれる書込対象データ（ＷＤ１とする）と、キャッシュされている間隙データＤｍと、今回受け入れたライトコマンドに含まれる書込対象データ（ＷＤ２とする）とを書き込むべき旨を表すライトコマンドを生成する。
【０１１７】
つまり記憶制御装置３０は、第１対象領域の先頭ＬＢＡがＬＢＡ１_headであり、第２対象領域の先頭ＬＢＡがＬＢＡ２_headであるときには、対象領域の先頭ＬＢＡをｍｉｎ［ＬＢＡ１_head，ＬＢＡ２_head］（ただしｍｉｎ［Ａ，Ｂ］は、Ａ，Ｂのうち小さい方を表す）とし、書込対象データ長ＬＢＮ＝Ｌ［ＷＤ１］＋Ｌ［Ｄｍ］＋Ｌ［ＷＤ２］とし、書込対象データを、ＷＤ１，Ｄｍ，ＷＤ２を対応するＬＢＡの順に連接したデータとしたライトコマンドを生成する。このときには、合成した二つのライトコマンド（書込対象データＷＤ１のみを含むライトコマンドと、書込対象データＷＤ２のみを含むライトコマンドと）を削除する。記憶制御装置３０は、この生成したライトコマンドを、上述の受入部３１１にて受け入れたものとして処理を行う。またこの場合、記憶制御装置３０は、この生成したライトコマンドをそのままディスクデバイス２０へ出力することとしてもよい。
【符号の説明】
【０１１８】
１  記憶制御システム、１０  ホスト側装置、２０  ディスクデバイス、２１  インタフェース部、２２  デバイスコントローラ、２３  ディスクドライブ、３０  記憶制御装置、３１  制御部、３２  記憶部、３３  コントローラキャッシュ部、３４  第１インタフェース部、３５  第２インタフェース部、３１１  受入部、３１２  近接領域判断部、３１３  キャッシュ判断部、３１４  コマンド処理部、３１５  書込処理部、３１６  ライトコマンド記録部。
【図１】
0006521694.tif 000002
【図２】
0006521694.tif 000003
【図３】
0006521694.tif 000004
【図４】
0006521694.tif 000005
【図５】
0006521694.tif 000006
【図６】
0006521694.tif 000007
【図７】
0006521694.tif 000008
【図８】
0006521694.tif 000009
【図９】
0006521694.tif 000010