(57)【特許請求の範囲】
【請求項１】
ハードウェア障害及び主プロセッサモジュールの電源異常の少なくとも１つに対応する記憶処理エラーからデータ復旧を行なう方法において：
第１のデータ記憶部の第１のアドレスで始まる対象データを識別する第１の書込みリクエストを受け取るステップと；
前記第１のデータ記憶部の前記第１のアドレスに関連するオリジナルデータを、第２のアドレスで始まる第２のデータ記憶部へコピーするステップと；
前記書込みリクエストに関連するとともに、前記第１のアドレス、前記第２のアドレス、および前記第１の書込みリクエストが受け取られた時刻に関連する情報が含まれた処理情報を記録するステップと；
前記処理情報が記録されたことを示す第１のインジケータを生成するステップと；
前記第１のインジケータが生成されると、前記第１のアドレスから始まる前記第１のデータ記憶部へ、前記対象データの書き込みを継続するステップと；
前記対象データの前記第１のデータ記憶部への書き込み成功を妨げる記憶処理エラーに応答して、前記対象データの書き込みを少なくとも部分的に完了させるために、前記第１のインジケータと、前記処理情報の少なくとも一部を使用するステップと；
前記対象データが前記第１のデータ記憶部に記憶されたことを示す第２のインジケータを生成するステップと；
前記記憶処理エラーに応答して前記主プロセッサモジュールのタスクを引き受ける待機プロセッサモジュールの一つ以上の待ち行列から、前記記憶処理情報中の前記第２のインジケータを発見することで第２の書き込みリクエストに関する情報を削除するステップとを有する、記憶処理エラーからデータ復旧を行なう方法。
【請求項２】
前記第１のデータ記憶部の前記第１のアドレスに関連する前記オリジナルデータが前記第２のデータ記憶部に無事コピーされたことを、前記第１のインジケータが更に示す、請求項１記載の記憶処理エラーからデータ復旧を行なう方法。
【請求項３】
前記記憶処理エラーの前に存在していた少なくとも1つの記憶ユニットのデータ内容を、前記第２のデータ記憶部にコピーされた前記オリジナルデータの少なくとも一部に基づいて形成するステップを含む、請求項１記載の記憶処理エラーからデータ復旧を行なう方法。
【請求項４】
前記処理情報の中の前記第１のインジケータを発見することにより、前記待機プロセッサモジュールの一又は複数個の待ち行列のうちの1つには、第３の書込みリクエストに関連した情報をロードするステップを更に含む、請求項１記載の記憶処理エラーからデータ復旧を行なう方法。
【請求項５】
記憶処理エラーからデータ復旧を行なう方法において：
時刻Tlで起こった記憶処理故障を検出するステップと；
時刻Tl以前に受け取った第１の書込みリクエストに関連し、当該第１の書き込みリクエストに関連するｃｏｐｙ−ｏｎ−ｗｒｉｔｅシーケンスの一部が完了したことを示す少なくとも一つのインジケータを識別するステップと；
前記記憶処理エラーの前に存在していた少なくとも1つの記憶ユニットのデータ内容を、前記少なくとも一つのインジケータと部分的に完了した前記ｃｏｐｙ−ｏｎ−ｗｒｉｔｅシーケンスでコピーされたデータの少なくとも一部に基づいて形成するステップと；
前記少なくとも一つの第１のインジケータに基づき、前記待機プロセッサモジュールの一つ以上の待ち行列へ、前記第１の書込みリクエストに関連した情報をロードするステップと；
更に前記第１の書込みリクエストにより特定された前記対象データが、前記第１のアドレスのデータ記憶部へ書き込まれたことを確認する第２のインジケータを識別するステップと；そして
前記記憶処理エラーに応答して前記主プロセッサモジュールのタスクを引き受けて処理する待機プロセッサモジュールの一つ以上の待ち行列から、前記第２のインジケータに基づき第２の書込みリクエストに関連した情報を削除するステップとを有する、記憶処理エラーからデータ復旧を行なう方法。
【請求項６】
前記記憶処理エラーが、主プロセッサモジュールのハードウェア障害、電源異常の少なくとも1つに対応したエラーであることを特徴とする請求項５記載の記憶処理エラーからデータ復旧を行なう方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本願で開示された技術は、データ記憶装置の分野、特に処理時間が重要なデータ記憶装置およびデータ復旧に関する。
【背景技術】
【０００２】
多くの企業は、各企業内でデータシェアリングが出来るコンピュータシステムにますます依存している。概して大量のデータを記憶するために進化したデータ記憶システムは、企業にとってきわめて重要である。その結果、混乱またはデータ記憶システムの故障は、全企業の動作を麻痺させてしまう。
【０００３】
コンピュータシステム上で動作しているアプリケーションにより用いられるデータは、主記憶装置（例えばディスク）および保護のための第２の記憶装置（例えばテープおよびより安価なディスクドライブ）に典型的に記憶されている。これらのアプリケーションが動作するにつれて、データはビジネスの結果に従い変化する。情報処理技術部門は、概してデータ記憶システムに関して多くの課題を取り扱っている。しかしながら通常これらの課題は、2つの大きなカテゴリに分類され、これらはハードウェア障害およびデータ破損である。
【０００４】
データ記憶システムおよびそれらが記憶し維持するデータについての一体性の重要性は、データ保護およびデータ復旧を行なうシステムで、それに対応して高い関心を生み出すことになった。現時点では、いわゆるミラーリングおよびスナップショットの技術が、データ復旧に興味がある企業が利用できる2つの主要な方法である。システム故障の場合にはデータ復旧により企業は、時間的にそれ以前のデータを取り戻し、破損されていないデータで動作を再開させることができる。一旦ハードウェア障害または障害イベントまたは複数個のイベントが識別されると、その記憶データが破損されていないと確認された時点にまで戻ることによって、復旧が行われる。
【０００５】
概してデータ記憶装置は、例えばセル、ブロック、セクター、等の個々の記憶ユニットを有している。そして、ホストシステム（本願では一つ又は複数個のホストシステム意味するために用いる）によって生成される読取りコマンドが、リスエスト中で指定されたデータをホストに提供するように情報システムに対して指示を行なう。伝統的にはその情報は、データ記憶装置中のデータ位置、例えば一つ以上の特定のブロックに基づいて指定される。また書込みコマンドも、同様に実行される。例えばデータは、ホストシステムによって生成されるI／Oリクエストに応答して、特定の記憶ユニットに書き込まれる。データ位置識別子は、データとそれが記憶される記憶ユニットとの関連性を提供する。その後にこのデータ位置識別子は、データを読込んで更新するために使用される。
【０００６】
データ保護の課題に関するハードウェア障害の面では、製造者はハードウェア障害がアプリケーションが旨く稼動し実行することに影響を与えるハードウェア障害を防止する各種のメカニズム、例えばディスク・ミラーリングを提供している。これは複数のディスクが同じ情報を記憶するために集められる機構であり、これによりアプリケーションがデータ入手するのを停止させずに、ディスクを故障しても問題が無いようにすることが出来るようになる。典型的な設定では、ユーザは、１個から４個のミラーディスクを各アプリケーションデータ・ディスクに割り当てる。アプリケーションの主ディスクに送られる各書込みリクエストは、同一コピーにも送られ、その結果ユーザは実際には主ディスク上のデータと全く同一データを有したN個（Nは一般的には２個から５個）のディスクを有することになる。その結果、ミラーリング手法は、その時の現在データの少なくとも一つの完全なバックアップを提供することになる。このように仮にディスク障害が発生した場合、ユーザは、まだ他のミラーディスク上のアプリケーションデータを有することになる。独立した複数のディスクからなる冗長性を持った配列（「RAID」）は、ミラーリング・システムの1つの実施例を提供している。
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかしながら、データ破損が発生した時には、ミラーリングは効果を有しない。データ破損は多くの形態をとるが、データがディスク上に書き込まれる時に、ユーザのアプリケーションが適切に機能するのが停止すると、一般には識別されている。データ破損には多くの原因が考えられるが、それ等は例えばアプリケーションをアップグレードするI／Oエラー、ユーザによるキー情報の偶然の削除、故意にアプリケーションデータに損害を与える危険なユーザ行為、コンピュータウィルス、等である。原因はともかくミラーリングが同時に全てのミラーに不良データをコピーするので、ミラーリングはデータ破損を経験したユーザの意に反しても実際には動作することになる。このようにしてデータの全てのコピーが、損なわれることになる。
【０００８】
加えて、複数のディスクは連続的に更新されるので、履歴データのバックアップデータすなわち過去の時刻Tにおけるデータ記憶装置に存在するデータのスナップショットデータは、システムが時刻Tまたはそれ以前の時刻にバックアップデータを保存するように指示した場合にのみ生成される。従って時刻T+lの時点では、システムは最早、時刻Tでのデータのバックアップデータを生成することは不可能である。さらに、各記憶ユニット中のデータは従前のバックアップが行なわれた以後に不変であっても、そのデータは再度バックアップ用に保存される。この種の方法は、時間的に複数時点でデータ記憶装置のバックアップを取るために必要とする記憶容量を増加させるので、非効率的で高コストとなる。また、より大きなデータ記憶システムで使用される時に、大型システムは何百ものディスクが使用され、それ等のシステムでは各ディスクが同一時にバックアップされたかを保証することができない為に、ミラーリング手法は非効率的でありより多くのエラーの原因となる。従って、データ記憶システム全体の同一時点でのバックアップを作製する際には、複雑かつエラーを起こしやすいプロセスが使用されることになる。
【０００９】
上述の通り、スナップショットすなわち時間的に単一時点でのデータ内容と呼ばれるデータが、ミラーリング・システムに関連してしばしば生成される。あるいはスナップショット手法は、独立データ記憶およびデータ復旧方法として使用されることがある。このスナップショット手法においてユーザは、他の記憶装置または同じ記憶装置内の異なる複数の指定記憶ユニットに、ディスクの現在の内容がコピーされ書き込まれる時間的に周期的な時点を選択することが出来る。しかしながら、この手法は、ミラーリングと同様な欠陥を有している。すなわちユーザのリクエスト時点、又は記憶データのスナップショットを生成するようにという事前にスケジュールされた指示の時点に、全てのスナップショットが生成されるという欠陥である。これ等の手法を単独または色々組み合わせても、データミラー若しくはデータスナップショットとも、ユーザが直前のデータを復旧させることは出来ない。各々の記憶ユニットに記憶されているデータは、個々の時刻識別子を有していないので、同時に履歴バックアップが特定の時点で偶然生成されない限り、ユーザはその特定の時点でのデータを閲覧するために戻ることは不可能である。同様に、現在の時刻（T）と先回のバックアップディスクが保存された時刻（例えばT-2）との中間の時刻（例えば時刻（T-1））にデータを復旧する方法は存在しない。また、時間的に単一時点でのデータ内容（スナップショット）の生成は、一般に冗長性を持った方法である。記憶容量およびデータ・セット・サイズが増加するにつれて、データ内容生成時刻がさらにより重要になる。
【００１０】
記憶装置の産業は、その結果、より速くそしてより頻繁なデータ内容生成を提供することに注力していた。テープを使用したデータリカバリ・システムの製造者は、並行オペレーションを許容するために、システム容量やテープヘッド数を増加させることで、より大きな、より計測可能なテープライブラリを提供することを試みた。一方ディスクベースのシステムの製造者は、改良された応答時間でのより多くの時間的に単一時点でのデータ内容を提供できるディスクドライブを使用する方法に注力していた。更にある1つの手法では、N個のミラーディスクのうちの1個を特定の時刻にオフラインで稼動させ、その特定時刻での時間的に単一時点でのデータ内容を生成する。この手法では、ミラーディスクの数量が十分に増加すると仮定すれば、その増加した数のデータ内容を実現させることが可能である。しかしながらこの手法は、例えば5テラバイトのアプリケーションには２個の標準ミラーディスクと4個のポイント時データ内容をサポートするために,３０テラバイトの記憶装置が必要であるように、時間的に各時点での必要とする記憶容量を大幅に増加させてしまう。従ってこれらの解決手法は、データ記憶システムの容量が増加し続くために、真に役立つ解決策を提供しない現状手法を固定化する際の試みであるに過ぎない。
【課題を解決するための手段】
【００１１】
本願で開示される技術は、データ復旧のリクエストがデータ復旧時の後にされたとしても、時間的に如何なる時点でのデータ復旧を行なうことで、現行システムの欠点を解決することを目的とする。
【００１２】
本願のある一つの実施例において開示される技術は、記憶処理I／Oエラーをデータ復旧させるのに有用なcopy-on-write動作（書込み動作上のコピー）シーケンスにチェックポイントを設ける。例えば冗長性を持った冗長システムでは、I／O動作のための1台の主プロセッサと、そして上記主プロセッサでのエラー又は誤りを検知して主プロセッサの行なわれる全ての入出力動作を完了させる一つ以上の副プロセッサが存在する。ここで開示するチェックポイントは、主プロセッサから制御を引き継ぐ命令を受け取ると、処理未完成の入出力動作を処理するのに有用な情報を副プロセッサに提供する。同時にここで開示する技術の複数の実施例では、他の処理情報の記憶と統合する方法で、これらのチェックポイントを使用する。さらに、ここで開示する技術の複数の実施例は、主プロセッサによる処理の最適化を利用する。すなわち副プロセッサは、主プロセッサ用に割込むために主システムにより行われるいかなる最適化も知る必要はなく、副プロセッサが未処理の入出力動作を完了するためにどのような処理必要とするかを判断するために、開示されたチェックポインティング情報を使用することができる。これは特に、ある時点における数千、数万、またはそれ以上の未処理I／O処理がある高速システムにおいて有益である。
【００１３】
一つ以上のチェックポイントを組み込む例示的なcopy-on-write動作（書込み動作上のコピー）シーケンスには、例えば以下の動作シーケンスが含まれる。すなわち、第１のデータ記憶部の第１のアドレスで始まる書込み対象データを識別する第１の書込みリクエストが受け取られ；その第１のデータ記憶部の第１のアドレスに関連するオリジナルデータが読まれ；そのオリジナルデータが、第２のアドレスで始まる第２のデータ記憶部へコピーされ；その第１の書込みリクエストに関連した処理情報（例えば第１のアドレス、第２のアドレス、および／又は第１の書込みリクエストが受け取られた時刻に関連する情報）が記録され（例えは複数個のデータ構造中で）；この処理情報が無事に記録され、このオリジナルデータが第２のデータ記憶部へ無事にコピーしたことを確認する第１のチェックポイントが生成され；第１のアドレスで始まる第１のデータ記憶部に、対象データがwriteされ；copy-on-write動作シーケンスが無事に完了したことが通知され；そしてこの種の動作シーケンスが無事に完了したことを確認する第２のチェックポイントが生成される、各ステップが含まれる。
【００１４】
上記の第１および第２のチェックポイントは、それらが記憶処理I／Oエラー（例えばハードウェア障害、電源異常など）の発生以前に存在したように、一つ以上の記憶ユニット（またはその部分）の内容を形成するベースとして有用である。まず上記処理情報の一部として記憶されるこの第１のチェックポイントは、プロセッサーモジュールの一つ以上の待ち行列へ第１の書込みリクエストに関連した情報をロードするための基礎として役立つことができる。また上記処理情報の一部として記憶されるこの第２のチェックポイントは、プロセッサーモジュールの一つ以上の待ち行列から、第２の書込みリクエストに関連した情報を削除するための基礎として役立つことができる。
【００１５】
又本願のある実施例において開示された技術は、copy-on-write動作（書込み動作上のコピー）シーケンスに関連したI／Oエラー（例えばプロセッサーモジュールのハードウェア／電源異常）からのデータ復旧を行なうためのシステムを開発し、またデータ復旧させる方法を実行するために用いることができる。まず、I／Oエラーの前に待ち行列に入れられ、かつcopy-on-write動作（書込み動作上のコピー）シーケンス中の動作に対応する一つ以上の書込みリクエストが、識別される。そしてcopy-on-write動作シーケンスの第１の部分を完了したことに応答して、第１のチェックポイントが形成されたかどうかの判断がなされる。このcopy-on-write動作（書込み動作上のコピー）シーケンスの第１の部分には、第１のデータ記憶部中のあるデータ位置（これは待ち行列中の書込みリクエストによって指定される）に記憶されているオリジナルデータを、第２のデータ記憶部にコピーすることに関連した一つ以上の動作が含まれる。そしてこのcopy-on-write動作（書込み動作上のコピー）シーケンスの少なくとも第２の部分を完了したことに応答して、第２のチェックポイントが形成されたかどうかの他の判断がなされる。このcopy-on-write動作（書込み動作上のコピー）シーケンスの第２の部分には、待ち行列中の書込みリクエストによって識別される対象データデータを、第１のデータ記憶部中のあるデータ位置に書くことに関連した一つ以上の動作が含まれる。
【００１６】
更に第１および／又は第２のチェックポイントに基づいて、I／Oエラーを少なくとも一部分データ復旧させるために、待ち行列中の書込みリクエストの一つ以上が処理される。例えば第１のチェックポイントが得られなかったら、その待ち行列中の書込みリクエストの処理には以下のステップが含まれる。すなわち実行されるcopy-on-write動作シーケンスに関連する実質的に全ての動作を待ち行列とするステップである。あるいはその代わりに、第１のチェックポイントは得られたが、第２のチェックポイントは得られなかったら、その待ち行列中の書込みリクエストの処理には、実行される動作の一部分を待ち行列に入れることを含んでもよく、このような動作の一部分には、copy-on-write動作シーケンス中の第１の部分でなく、第２の部分に関連した動作が含まれる。更にもう一つの代案として、第１および第２のチェックポイントの両方が得られたら、待ち行列中の書込みリクエストの処理には、一つ以上の動作待ち行列からcopy-on-write動作シーケンスの動作を取り除くステップを含むことができる。
【００１７】
更に又本願のある実施例において開示された技術は、記憶処理エラー（すなわち例えば電源異常、ハードウェア障害またはデータ破損イベントの間に生成したような記憶ユニットへの書込みおよび／又は操作の時に生成したエラー）からデータ復旧を行なうためのシステムを開発し、またデータ復旧させる方法を実行するために用いることができる。まず、第１のデータ記憶部の第１のアドレスで始まる書込み対象データを識別する書込みリクエストが、その書込みリクエストが有効になる前に記憶管理デバイスによって受け取られる。次にその第１のデータ記憶部の第１のアドレスに関連するオリジナルデータが、第２のアドレスで始まる第２のデータ記憶部へコピーされる。次にその書込みリクエストに関連した処理情報が記録され、その処理情報には例えば第１のアドレス、第２のアドレス、および書込みリクエストが受け取られた時刻が、含まれる。更に次に第１のインジケータ（すなわち第１のチェックポイント）が、将来のデータ復旧効果を最適化するために、処理情報を無事記録したこと確認するために生成される。この第１のインジケータは、第１のデータ記憶部の第１のアドレスに関連したオリジナルデータが第２のデータ記憶部へ無事にコピーされたことを更に識別する。
【００１８】
一旦第１のデータ記憶部の第１のアドレスから始まるオリジナルデータが、同一または異なるデータ記憶部の第２のアドレスへ無事にコピーされると、書込みリクエストによって識別される対象データが、第１のアドレスから始まる第１のデータ記憶部に書き込まれる。すなわち第２のアドレスに記憶されるコピーでなく、オリジナルデータを実際に上書きする。更に第２のインジケータ（例えば第２のチェックポイント）が、対象データが第１のデータ記憶部に無事に書き込まれたことを識別するために生成され、そして、従前の書込みリクエストが受け取られた時刻の後に発生した第２の書込みリクエストが再実行されなければならないことを示すために、将来のデータ復旧努力が行われる間に、この第２のインジケータが検出される。これ等の第１インジケータ、第２インジケータ、および／又は少なくともいくつかの処理情報は、記憶処理I／Oエラーを少なくとも部分的にデータ復旧するために使用される。例えば、記憶処理I／Oエラーの前に存在していた少なくとも1つの記憶ユニットのデータ内容は、第２のデータ記憶部にコピーされたオリジナルデータの少なくとも一部と、その書込みリクエストを受け取った時刻に基づいて生成することができる。またその処理情報は、書込みリクエストの受け取り時刻に実質的に一致する選択された時刻に基づいて、その受け取り時刻を識別するために検索されることもできる。更に、第２の書込みリクエストに関連した情報は、処理情報中の第２のインジケータを発見することで、待機プロセッサーモジュールの一つ以上の待ち行列から削除されることができる。なおこの種の待機プロセッサーモジュールは、記憶処理I／Oエラー（例えば主プロセッサーモジュールを稼動可能にする電源異常やハードウェア障害）に応答して、主プロセッサーモジュールのタスクを引き受けるモジュールである。待機プロセッサーモジュールの一又は複数個の待ち行列のうちの1つには、第１のインジケータを上記処理情報で見つけたら、第３の書込みリクエストに関連した情報をロードしてもよい。
【００１９】
更に又本願のある実施例において開示された技術は、まず時刻Tlで起こった記憶処理故障（例えば主プロセッサーモジュールのハードウェアまたは電源異常）を検出する。次に時刻Tl以前に受け取った第１の書込みリクエストに関連した一つ以上の第１のインジケータが識別され、それによって、その書込みリクエストによって特定される第１のアドレスに元々記憶されたデータが、第２のアドレスへ無事にコピーされたことを確認する。なお上記の第１のインジケータは、第１の書込みリクエストに関連した情報を待機プロセッサーモジュールの一つ以上の待ち行列へロードするための基礎として用いられる。少なくともいくつかのコピーされたデータは、記憶処理I／Oエラーの前に存在したように、それらは、少なくとも一つの記憶ユニットの現内容を形成するための基礎として用いられる。更に第１の書込みリクエストによって識別される対象データが、第１のアドレスから始まるデータ記憶部に無事に書き込まれたことを識別する第２のインジケータが、識別され、そしてこの種の第２のインジケータは、例えば、待機プロセッサーモジュールの一つ以上の待ち行列から第２の書込みリクエストに関連した情報を削除するための基礎として用いられる。なおその待機プロセッサーモジュールは、記憶処理I／Oエラーに応答して主プロセッサーモジュールのタスクを引き受けることができる。
【発明の効果】
【００２０】
本発明のこれらの目的、特徴および利点は、以下の本発明の好ましい実施例の詳細な説明および添付図で、より完全に開示されている。
【発明を実施するための最良の形態】
【００２１】
図1は、リクエスト以前の複数の時点でのデータ記憶部のデータ内容を、生成させることができる記憶システム30の概念図である。ホスト34は、物理的な記憶部36に記憶管理デバイス38を介して接続されている。ある実施例においては、この物理的な記憶部36はデジタルデータを記憶する。この実施例のバージョンにおいて、物理的な記憶部36は、一つ以上のディスクドライブである。例えば、そのディスクドライブは、磁気ディスク装置、光学ディスクドライブ、または両方のタイプのディスクドライブの組み合わせであってもよい。この実施例の他のバージョンにおいては、物理的な記憶部36には、一つ以上のテープ装置を含んでいる。物理的な記憶部36は、ドライブまたは記憶エリアネットワークの一つまたは組み合わせであってもよい。物理的な記憶部36は、それ自身で様々な記憶ネットワーク、機器またはコントローラのいずれかによって示される仮想ドライブであってもよい。物理的な記憶部36は、例えばミラードディスクまたはRAIDシステムまたは他の記憶機器であってもよい。
【００２２】
ホストは、物理的な記憶部36にアクセス可能なネットワークまたはおよび／又はデータ記憶装置の他のいかなる形態であってもよい。ある実施例においては、ホスト34は、コンピュータ・ネットワーク上の多くのコンピュータが含まれる。このホストには、複数のワークステーション、パーソナル・コンピュータまたはこれ等2つの組み合わせを介して一つ以上のユーザによってアクセスされる記憶ネットワークも含まれる。
【００２３】
本願の実施例においては、記憶管理デバイス38自体が、「記憶機器」であってもよい。それは例えば、プロセッサおよびメモリを有する別々のデバイスであってもよい。ここで記載した記憶管理デバイス38の機能性は、既存の企業システム記憶エリアネットワークに組み込まれることもできる。ある実施例において、この記憶管理デバイス38は、記憶システムのファームウェアの階層として実行されてもよい。またある実施例においては、記憶管理デバイス38は現在データ記憶部A44データおよび時刻データ記憶部A46データの両方を、ディスク内容Aに使用する。ただしこの図では、記憶管理デバイス38の中に現在データ記憶部A44および時刻データ記憶部A46が収納されているが、好ましくは現在データ記憶部A44および時刻データ記憶部A46の一方または両方に関連したデータは、物理的な記憶部36に記憶されるのが望ましい。このような場合には、記憶管理デバイス38は、現在データ記憶部Aおよび時刻データ記憶部Aのデータを記録し、例えばインデックスやポインタの形態で、物理的な記憶部36への、あるいは記憶部36からのデータの書込みおよび読込みを行なう。なお現在データ記憶部A44および時刻データ記憶部A46は、物理的な記憶部36別々のグループ装置を割り当られてもよく、例えばその物理的な記憶部で混在してもよい。
【００２４】
また現在データ記憶部A44および時刻データ記憶部A46は、記憶管理デバイス38にあるランダムアクセスメモリ（「RAM」）または他の記憶媒体で行なうこともできる。この実施例では、現在データ記憶部A44および時刻データ記憶部A46は、異なるメモリ媒体が使用されている。更に、現在データ記憶部A44を保存する媒体は、時刻データ記憶部A46を保存する媒体と異なっていてもよい。すなわち例えば現在データ記憶部A44にはディスクドライブを使用し、一方時刻データ記憶部A46にはRAMを使用してもよい。他の例では、現在データ記憶部A44および時刻データ記憶部A46は、同じ記憶装置の異なる区画で構成してもよい。他の実施形態では、現在データ記憶部A44および時刻データ記憶部A46は、物理的な記憶部36のような物理的ディスクで構成したり、その反対でもよい。更に現在データ記憶部A44および時刻データ記憶部A46は、同じ物理的ディスクに記憶したり、又はそれら両方は多くの異なる物理的ディスクの複数の部分に記憶してもよい。
【００２５】
現在データ記憶部A44は現在のデータを記憶し、そして時刻データ記憶部A46は、新規のデータにより、それ以後に置き換えられた（つまり上書きされた）現在データ記憶部A44からの従前のデータを記憶する。記憶管理デバイス38は、現在データ記憶部A44および時刻データ記憶部A46の片方あるいは両方からの情報を使用して、ディスク内容Aの現在または過去のデータ内容を生成し、ホスト34に提供する。ある実施例において、現在データ記憶部A44および時刻データ記憶部A46の各組は、一つ以上の論理的デバイスを使用する。この実施例においては、記憶管理デバイス38はディスクドライブを使用せずに、そのような仮想ドライブにデータを記憶するための物理的な記憶部36を使用する。
【００２６】
記憶管理デバイス38は、第１通信リンク40を経由してホスト34と通信する。第１通信リンク40は、いかなる種類のデータ通信リンク、例えばファイバーチャネルおよび小型計算機システム・インターフェース（「SCSI」）を含むLAN、記憶ネットワークまたはバスでもよい。Ethernet（登録商標）（例えばGigabitイーサネット（登録商標）（登録商標））および無線通信は、この第１通信リンク40の他の可能性として使用可能である。ある実施例においては、記憶管理デバイス38は、論理レイヤでSCSIプロトコルで通信を行い、SCSIバス、ファイバーチャネル、ファイバーチャネル2またはイーサネット（登録商標）（登録商標）経由のiSCSIを含む様々な物理レイヤの一つ以上を使用して通信することが可能である。ホスト34のI／Oリクエストに応答して、通信リンク40経由で、あたかも物理的な記憶部36であるかのように記憶管理デバイス38は稼動する。ホスト34のI／Oリクエストは、記憶ユニットからの読出しおよび記憶ユニットへの書込み命令を含むことができる。
【００２７】
記憶管理デバイス38は、第２通信リンク42経由で物理的な記憶部36と通信を行なう。第２の通信リンク42は、いかなる種類ものデータ通信リンク、例えば（限定されるものではないが）ファイバーチャネル、小型計算機システム・インターフェース（「SCSI」）IntegratedDriveElectronics（「IDE」）FConおよびFiCon、Ethernet（登録商標）（例えばGigabitイーサネット（登録商標））を含むLAN、記憶ネットワークまたはバスでもよい。また無線通信は、第２の通信リンク42の他の可能性である。ある実施例においては、物理的な記憶部36および第２の通信リンク42は、記憶エリアネットワークにおいて実行される。
【００２８】
現在まで主要な記憶システムでは、デバイスに記憶されるデータは、デバイスおよびオフセット値から成り立つアドレスによりインデックされている。記憶アドレス空間は、ブロック（例えばセクター）に分割され、各ブロックは、データ長512バイトである。I／Oリクエストが行なわれると、そのI／Oリクエストは、特定のデバイス／ディスク／記憶ユニットに送られ、そのアドレスはLogicalBlockAddress（「LBA」）およびデータ長として知られている。この例では、そのブロックは記憶ユニットで構成され、LBAは入出力動作が開始する記憶ユニットを示す。すなわち上述のデバイスの一部である特定の512バイトを示す。上述のデータ長は、I／Oリクエストが何512バイトのブロックに作用するかを示している。例えば、バイト8192で開始するデバイスから4096バイトを読込むためには、LBAは16、そしてデータ長は8にセットされる。ブロック・サイズは、512バイト以下あるいは以上を使用してもよい。例えば1ブロックは、520バイトであってもよい。加えて、記憶ユニットは、独自にアドレス指定可能である記憶アドレス空間のいかなる一部でもあってもよい。
【００２９】
ある実施例においては、時刻は、所与の記憶装置のためのアドレス空間の第２の付加的ディメンジョンである。すなわちユーザは、特定のLBA（そして関連するブロックの幅）をリクエストすることができ、更にユーザは時間的に特定の時との組み合わせである特定のLBA／ブロック幅をリクエストするオプションも与えられている。この時刻は、実質的に連続時間間隔から選択されるが、前もって判断する必要はない。この能力はブロック・アドレス指定のレベルで提供され、その能力は時刻記憶部で可変点を生成するために全てのデバイスに適用されることができる。
【００３０】
ある実施例において、記憶管理デバイス38には、データ位置識別子を有するアドレス、および時刻識別子が含まれる。ある実施例では、このデータ位置識別子は、論理的装置識別子と論理的デバイスを有する記憶ユニットのうちの少なくとも1つを含むことができる。上述の時刻識別子は、現在の時刻であってもよいし、又はデータ復旧時刻であってもよい。すなわちこのデータ復旧時刻とは、その記憶ユニットに記憶されたデータが要求される“従前の時刻”である。この明細書においては、データがホスト34によってリクエストされる従前の時刻は、「データ復旧時刻」と呼ばれる。「リクエスト時刻」とは、ホスト34がデータ復旧時刻のデータをリクエストする時の時刻を言う。デジタルデータの記憶ユニットは、アドレス又はアドレスおよび時刻の両方を含むアドレスを識別することでアクセスすることができる。従前のデータ内容が、データ復旧時のディスク内容であり、スナップショットがリクエスト時刻の前に生成されたことに関係なく、記憶管理デバイス38は、このようにホスト34へのデータ記憶部の「従前のデータ内容」の連続体を示すことができる。ある実施例においては、複数の連続的な時刻識別子の間での最小経過時間を定める時間増加分は、実質的に連続時間で従前のデータを生成出来る十分に短い時間である。この実施例では、現在のデータ内容のリクエストは、時刻データ記憶部A46からデータを全く使用することなく、現在データ記憶部A44に完全に置かれるデータに対応している。しかしながら更に詳細に後述するように、従前の時点でのデータ（すなわち従前のデータ内容）のリクエストには、現在データ記憶部A44および時刻データ記憶部A46からのデータを必要とする。
【００３１】
ある実施例においては、ホスト34の各I／Oリクエストには、装置識別子（例えば物理的ディスク、論理的デバイス、仮想デバイス、その他）によって識別される一つ以上のターゲット記憶ユニット、第１の記憶ユニット（例えばLBA、その他）、データ長が含まれ、そして読取りコマンドには時刻識別子が含まれる。また書込みコマンドには、ターゲット記憶ユニットに書き込まれるデータで構成される対象データが含まれる。
【００３２】
他の実施形態では、従前の時刻での他の第１の論理的デバイスと見られる記憶管理デバイス38によって設けられる論理的デバイスという意味で、時刻識別子は意味されている。第２の論理的デバイスが、バンド外コミュニケーション（例えば、記憶管理デバイスのコンソール）を経由して設られたり、ホスト34と記憶管理デバイス38間のバンド内コミュニケーションを経由して設けられる。ある実施例においては、一旦この第２の論理的デバイスが決められると、それに関連した記憶ユニットは、特定の時刻ためのデータを明確にリクエストするよりはむしろ、この第２の論理的デバイスからデータをリクエストすることによってアクセスすることが出来る。
【００３３】
ある実施例においては、時刻データ記憶部には、制御情報（また、「メタデータ」と呼ばれる）および対象データの両方が含まれる。この実施例では、制御情報には、現在データ記憶部44の特定の記憶ユニットが、書込み動作により何時に上書きされたがを示すタイムスタンプ、そのデータが元々来た記憶ユニットの現在データ記憶部44中のデータ位置、および過去データが現在記憶される時刻データ記憶部46中のデータ位置、が含まれる。時刻データ記憶部46に記憶されている対象データには、以前は現在データ記憶部44にあったが、新しいデータと置き換えられたデータが含まれる。
【００３４】
図2には、ホスト34により記憶管理デバイス38へ送られるI／Oリクエスト、具体的には時系列読取りコマンドの実施例が示されている。ある実施例においては、I／OリクエストはSCSI命令である。図2は、コマンドブロック88の32バイトに含まれる各ビットを表示している。バイト0において、オペレーションコードは、実行される命令のタイプ、すなわち時系列読取りコマンドを表示している。バイト2-9は、読取りコマンドが稼動する第１の記憶ユニットを表示する論理的ブロック・アドレス（LogicalBlockAddress）用である。バイト10-13は転送長のためにあり、それは論理的ブロック・アドレスによって識別される記憶ユニット（すなわちブロック）で始まる読込まれるべきブロック数を示す。バイト14および15は、将来の使用のための予備である。バイト16は、時間領域が相関的であるか絶対的かどうかについて示すRelativeChk領域である。RelativeChk領域が0である場合、コマンドブロックにおいて特定される時刻は、現在の時刻と相対的であり、従って、0は、特定される時刻が現在時刻から測定される過去の時刻であることを示す。例えば、リクエスト時刻Tでのデータ復旧時刻T-5000とは、現在の時刻Tに対して相対的なデータ復旧時刻を有した読取りコマンドの例を表す。すなわち、データ復旧時刻は、現在の時刻より5000単位時間前の時刻となる。またRelativeChk領域がゼロでない場合、その特定される時刻は、他の時刻に関係ない絶対時刻表示である。例えばこの種のI／Oリクエストには相対時刻を含み、記憶管理デバイス38は、1秒以下である最小単位時間を有することがあり、その最小単位時間は1ミリ秒以下である。
【００３５】
バイト17-24には、指定された読取り時刻（相関的であるか絶対の）が含まれる。もし読取り時刻が絶対時刻の場合、データ復旧時刻はバイト17-24に含まれる。また読取り時刻が相対時刻の場合、データ復旧時刻は現在の時刻から指定された読取り時刻を減算することで算出される。またバイト25-30は、将来の使用のための予備である。またバイト31は、コマンドブロック88の制御フィールドである。
【００３６】
動作において、データは、ホスト34によって生成したI／Oリクエストに応答してホスト34に提供され、第１通信リンク40経由で記憶管理デバイス38へ送信される。ある実施例においては、現在データ記憶部A40に過去に記憶されたデータの履歴記録を維持するために、I／Oリクエストが記憶管理デバイス38に既存のデータを新しいデータに置き換えるように指示する場合には、記憶管理デバイス38は、copy-on-writeプロセスが用いられる。ホスト34の書込みリクエストを受けると、copy-on-write動作（書込み動作上のコピー）が実行され、現在データ記憶部A44から置き換えられるべき既存データが、時刻データ記憶部A46へコピーされる。データがコピーされる現在データ記憶部A44の位置は、オリジナルデータ位置と呼ばれる。一方、過去データ（すなわち上書きされる）が記憶される時刻データ記憶部A46の位置は、デスティネーション・データ位置（行き先データ位置）と呼ばれる。
【００３７】
例えば、上書きされるべきデータがすでに保存されるという理由で（例えば、その上書きされるべきデータが、他の近くのブロックと共に保存されるため）、またはデータがメモリにおいて保存されているが、直ぐには書き込まれないという理由で、実際のデータのコピーは、特定の場合には、書込み動作の発生と同時には実行されないということがあり得る。ここでcopy-on-write動作（書込み動作上のコピー）は、実際のコピーを意味するが、またcopy-on-write動作（書込み動作上のコピー）の効果の最適化をも含まれる。記憶管理デバイス38は、それが上書きされる前に、記憶ユニットにあったデータの記録を残すことが出来る。そして、記憶管理デバイス38や、物理的な記憶部、および／又はどこか他のいかなる所から保存されたデータを、ブロックが上書きされた後に得るために、時刻データ記憶部には十分な情報が集められている。説明を簡単にするため以下に開示する説明の中では、最適化が実際には使われるという前提の下に、copy-on-write動作（書込み動作上のコピー）が実行されるように記憶管理デバイス38の動作を説明する。
【００３８】
ある実施例においては、記憶管理デバイス38は、各copy-on-write動作（書込み動作上のコピー）にインデックスを付けて、最初のデータ位置、デスティネーション・データ位置（行き先データ位置）およびタイムスタンプ（時刻スタンプ）の記録を保持する。各種実施形態において、このタイムスタンプには、データが現在データ記憶部A44又は時刻データ記憶部A46に書き込まれた時刻が含まれる。他の実施形態では、タイムスタンプには、書込みリクエストが受け取られ、記憶管理デバイス38によって処理された時刻が含まれる。
【００３９】
ある実施例として、記憶管理デバイス38は、データ内容Aをホスト34に提示することができる。この例では、データ記憶部Aは、ディスク内容である。ある実施例においては、データ記憶部Aは、現在データ記憶部A44と時刻データ記憶部A46を記憶する。記憶管理デバイス38は、データ内容Aにされる各変化を記憶することができ、更に、過去の複数の時刻に存在した複数のデータ内容を、ホスト34に与えることが出来る。上述の通り、記憶管理デバイス38は、時刻を指定してアクセスすることができる。
【００４０】
通常、企業で用いられるデータ管理システムでは多くのI／Oリクエストがされるために、データ記憶部Aの各従前のデータ内容には、それらのアプリケーションの時刻データ記憶部A46からのデータが少なくとも含まれている。例えば、現在の時刻Tで、過去の時刻T-100におけるデータ記憶部Aの従前のデータ内容を、ホスト34がリクエストすると、記憶管理デバイス38は、そのインデックスをチェックして、時刻T-100および現在時刻（T）との間に更新されたデータ記憶部A上の複数個の記憶ユニットを判断する。時刻T-100でホスト34は、時刻T-100以降に更新されなかった現在データ記憶部A44の記憶ユニットを含むデータ記憶部Aの従前のデータ内容からデータを受け取り、そして時刻T-100以降に更新された記憶ユニットのためには、時刻T-100でのデータ記憶部Aを表す時刻データ記憶部A46の記憶ユニットからデータを受け取る。
【００４１】
別の例として、現在の時刻Tで、ホスト34は、従前の時刻T-30からのデータ記憶部Aのデータ内容をリクエストする。応答する際に、記憶ユニットがリクエスト時刻T-30以降に更新されなかったら、記憶管理デバイス38は、現在データ記憶部A44の中に存在するデータを使用することによって、T-30のための従前のデータ内容を生成する。しかしながら現在データ記憶部A44からのデータは、リクエスト時刻T-30以降に更新された各記録のための時刻データ記憶部A46からのデータと結合される。例えば、現在データ記憶部A44のブロック100に記憶されているデータがT-30（例えば時刻T-20で）のリクエスト時刻以降に一度書き込まれた場合、現在データ記憶部A44から時刻T-20で発生したcopy-on-write命令の結果として、現在データ記憶部A44から時刻データ記憶部A46へ送られた過去データは、時刻データ記憶部A46の所定の特有アドレスで見つけられる。すなわち時刻データ記憶部A46のデータは、データ位置と時刻T-20で書き込まれたことを示すタイムスタンプでインデックスされている。これがブロックナンバー100が書き込まれたT-30以降の唯一のものであるので、時刻データ記憶部A46の中のブロック100と時刻T-20によって識別される記憶ユニットは、時刻T-30のデータ記憶部Aのデータ内容が生成されたときに、ホスト34に示されるブロック100の代表的なデータである。
【００４２】
図3には非常に簡略した実施例が示されている。すなわち記憶管理デバイス38は、5つの記憶ユニットを含むデータ内容Aを表示している。それ等は、100バイトのブロック100、ブロック200、ブロック300、ブロック400およびブロック500である。この例では、現在の時刻Tおよび過去の時刻との間で、データ記憶部Aで5つのデータ更新がされている。過去の複数個の書込み時刻が、この例では示されており、簡略化のために、それ等は時刻T-60、T-48、T-33、T-29、T-15として識別される。この表記法では、時刻T-60は、時刻Tより60単位時間分（例えば秒、ミリ秒、マイクロ秒）だけ以前の時刻である。実際の実行時には、この単位時間は、時間的に短い単位であるので、その為にこれらの数（すなわち、60、48、33、29、15）はかなり大きな数字となる。
【００４３】
この例では、ブロック100は、時刻T-60で更新されている。またブロック300は、時刻T-48で更新されている。ブロック200は、時刻T-33で、そして再び時刻T-29で更新されている。ブロック400は、時刻T-15で更新されている。上述の通り、ブロック100への書込み以前に、ブロック100の情報は読込まれ、データ内容Aのための時刻データ記憶部46に記憶されている。これと同じcopy-on-write動作（書込み動作上のコピー）が、他のブロックでも行なわれている。その結果、時刻データ記憶部A46には、現在データ記憶部A44への書込みリクエストの前に、現在データ記憶部A44からコピーされたデータに対応する5つの記録が含まれている。
【００４４】
ある実施例においては、記憶管理デバイス38は、記憶ユニット（例えば100ブロック、200ブロック、その他）のデータ位置と、copy-on-write動作（書込み動作上のコピー）が実行された時刻に関連したタイムスタンプの両方で、時刻データ記憶部A46に記憶されている各記録にインデックスを付ける。このようにT-60より前の時刻のデータ記憶部Aの従前のデータ内容は、ブロック100-400の時刻データ記憶部A46のデータおよび500ブロックの現在データ記憶部A44のデータを示すことによって生成することができ、その理由はブロック500は、従前の時刻T-60と現在時刻Tとの間にデータ更新がされなかった為である。そして時刻T-35でのデータ記憶部Aのデータ内容（すなわち従前のデータ内容）要求される場合、現在データ記憶部A44により3ブロックが提示される。すなわちブロック100、ブロック300およびブロック500である。その理由は、これらの3つのブロックは、時刻T-35の後はデータ更新がされていないためである。なおブロック200およびブロック400は、時刻T-35以降にデータ更新され、その為にこれ等のブロックは、データ内容Aのために時刻データ記憶部46で提供される。
【００４５】
このように、この簡略化した実施例において示されるように、時刻データ記憶部の節減によって、そのデータが上書きされる以前のデータを時刻データ記憶部A46に記憶し、更にその上書きされた時刻により時刻データ記憶部46に記憶されたデータにインデックスを付けることによって、このシステムは、現在データ記憶部44の完全な最新版をそれが利用できるようにして、更にデータが時刻データ記憶部46にある時間間隔でデータ内容A上のデータ内容を有する。すなわち記憶管理デバイス38は、過去のある時点でのオリジナルデータ内容を反映する「仮想」データ内容を表示することが可能である。更に記憶管理デバイス38は、実質的に連続的な時間間隔のいかなる時刻の仮想データ内容を提供することができる。なおこの「連続的」とは、最小限の時間増分によって定義される数的限度で「実質的に」連続的という意味である。またこの仮想データ内容は、リクエスト時刻の前に生成する必要はない。
【００４６】
1つの例示的な実行時では、その例に挙げられたデータ内容をデータ内容Ａとすると、他のデータであるデータ内容B、換言するとデータ内容Aの「従前のデータ内容」、つまりある以前の時点でのデータ内容Ａの内容に基づくデータ内容Bを得ることが可能である。データ内容Bのこのデータは、新しいデータへデータ内容Aの従前のデータ内容からコピーされることができる。そしてそのデータ内容Bは、データ内容Aの以前の時点での完全コピーとなる。なおデータ内容Bは、単に現在データ記憶部A44と時刻データ記憶部46の組み合わせだけのデータ形態で存在するという意味と、さらに記憶管理デバイス38が、データ内容Bへのアクセスに応答して、現在データ記憶部A44又は時刻データ記憶部46からのデータを提供するという意味で、「仮想的」である。
【００４７】
図4に示すように、データ内容Aの例えば時刻T-3000と他の時刻である時刻T-6100の両方の時点での従前のデータ内容を提供することが可能である。これらの従前のデータ内容は「仮想的」であるので、記憶管理デバイス38は同時に仮想的な従前のデータ内容48、50の両方を提供することができる。
【００４８】
ホスト34および記憶管理デバイス38は、データ記憶部の従前のデータ内容を参照するために、多様なプロトコルを使用することができる。例えばホスト34は、帯域外通信で、記憶管理デバイス38が、他のデータの従前のデータ内容を表す仮想データ記憶部を利用できるようにする。またホスト34は、例えば既存のプロトコルまたは既存のプロトコルを拡張した帯域内通信で、記憶管理デバイス38が新規データを生成することを要求することが出来る。システム管理者は、記憶管理デバイス38のコンソールまたはコントロールパネルを操作することもでき、又は記憶管理デバイス38に他のデータ内容の仮想データ内容であるデータを利用出来るように指示するように、記憶管理デバイス38に入力を送ることもできる。ある実施態様において新しいデータには、データ識別子または装置識別子（例えば一般的にはSCSIIDまたはファイバーチャネル）が割り当てられることができる。
【００４９】
このように、ある実施例においてはこの記憶管理デバイスは、指定された時点でのオリジナルデータの記憶部の状態を反映する仮想データ記憶部を生成するリクエストを受け取る。この仮想データ記憶部は、例えば新規な論理的ユニットであってもよい。またその指定された時刻とは、過去の時刻と現在の時刻との間の実質的に連続的な時間間隔から選択することができる。その時間間隔のサイズ（そして過去の時刻の数的な値）は、時刻データ記憶部のサイズとデータ記憶部に対する変化量の関数である。仮想データ記憶部は、それが仮想的であるために、最小の又はデータ転送無しで実質的に即座に提供可能である。
【００５０】
記憶管理デバイスは、仮想データ記憶部の指定されたアドレスにあるデータを要求する記憶プロトコル・リクエストを受信し、この記憶プロトコル・リクエストに応答して、指定された時刻の指定されたアドレスのオリジナルデータ記憶部に記憶されているデータを送信する。
【００５１】
新規な仮想データ記憶部を生成するリクエストは、ユーザーインターフェースの多少の操作という形態をとることができる。このユーザーインターフェースは、一つ以上のホストシステム上にあり、記憶管理デバイスと通信してもよく、および／又は、そのユーザーインターフェースは、記憶管理デバイス用のコンソールにあってもよい。そのリクエストは、様々なネットワーク技術およびプロトコルで、および／又は、記憶プロトコル例えばデータ要求がなされた同じプロトコルで、通信してもよい。そのリクエストは、データ要求と同じ記憶プロトコル・パケットの一部であってもよい。過去の時点でのデータを要求すれば、それが自動的に仮想データ記憶部の生成要求と見なしてもよい。
【００５２】
データ要求は、例えば記憶プロトコル、例えばSCSI読出しリクエスト経由の標準的な読出しリクエストであってもよい。このリクエストは、論理的装置識別子およびデータ位置識別子を含むアドレスを識別することができる。このアドレスには、仮想データ記憶部の識別子を含むことができる。
【００５３】
ここで記載するように、オリジナルのデータ記憶部はそれ自身で仮想データ記憶部であり、その仮想データ記憶部は、他のデータ記憶部の従前のデータ内容から生成される。
【００５４】
前述のように仮想データ記憶部は、それが仮想であるので、最小のまたはデータ転送無しに、実質的に即座に得ることがができる。しかしながら仮想データ記憶部の使用が継続される場合、仮想データ記憶部からコピーして、例えばバックグラウンドでデータを他のデータ記憶部にコピーし、このことにより仮想データ記憶部の完全コピーを製作することも可能である。一旦コピーが終了していると、そのコピーは仮想データ記憶部の代わりに使われることができる。このような方法で、1つのデータ記憶部から他のデータ記憶部へ、記憶管理デバイスのユーザに基本的に見えるようにデータを時間がかかるコピーをすることで、従前のデータ内容は、実質的に即座に仮想データ記憶部によって得ることが出来る。
【００５５】
他の実施形態では、ホスト34がアドレスおよび時刻を参照することによって所定の記憶ユニットにアクセスすることができるプロトコルを使用して、ホスト34は記憶管理デバイス38と通信することができる。このように時刻という次元が、アクセス要求に加えられる。この時刻は、多くの方法で参照されることができる。例えばこの時刻は、「特定の日の07時33分」のようにホスト34又は記憶管理デバイス3によって記憶されている為に、ホスト34は絶対時刻を参照することも可能である。更にこの時刻は、相対的に参照することも可能である。すなわち他の時刻と相対的に指定することも出来る。ある実施例においては、この時刻は、現在時刻から或時間分だけ減算することで（このように相対的に）参照することが可能である。従ってこの方法では、ホスト34および記憶管理デバイス38は正確に同期クロックを備える必要がない。時間は、いかなる単位で参照可能であり、例示的にはナノ秒、マイクロ秒、ミリ秒、秒、などを使用することが可能である。
【００５６】
このようにある1つの方法で、ホスト34（またはシステム管理者）は、絶対時刻T-3000でのデータ内容Aの従前のデータ内容である新しい仮想データ内容つまりデータ内容Bを生成せよと言う具合に、まず指示することができる。次にホスト34（またはシステム管理者）は、相対時刻T-6100でのデータ内容Aの従前のデータ内容である新しい仮想データ内容つまりデータ内容Cを生成せよと言う具合でも指示することができる。このようにホストは、データ内容のどのファイルまたはレコードが異なるかを検討するために必要に応じて、上記実際のデータA、BおよびC上の複数のデータを比較することができる、
【００５７】
他の方法では（これは上記に加え、又は上記に代えて）、ホスト34は、データのアドレスに加えて時刻仕様を含むリクエストを有するデータ・リクエストをすることができる。これにより記憶管理デバイス38は、リクエストで指定された時刻の指定されたアドレスでのデータを提供することができる。
【００５８】
またある実施態様では、現在データ記憶部A44は、幻像的に見え、又は一つ以上の実際のデータと見える他のいかなる構成で使用されるディスク60のミラーディスクであってもよい点に注意されなければならない。
【００５９】
時間的データ内容(timeimages)は、固定的または動的でもあってもよい。固定的な時間的データ内容は、またクローンと呼ばれ、特定の時刻でデータ記憶部Aのスナップショットと類似している。この固定的な時間的データ内容は、一旦生成されるとデータの書込みがされないので、更新できず従って固定的な時間的データ内容と呼ばれる。しかしながら記憶管理デバイス38によって生成したこの固定的なデータ内容は、下記理由によりスナップショットとは異なることがある。すなわちデータ内容は、データ復旧時刻より後であるリクエスト時に初めて生成されるからである。すなわち記憶管理デバイス38は、復旧時刻以降の如何なる時刻にも存在しなかったデータ内容を再形成するからである。対照的にスナップショットは、現在時刻に生成したコピーである。
【００６０】
動的な時間的データ内容は、時間的に特定の時点での現在データ記憶部Aのデータ内容と同様に生成される。しかしながら、固定的な時間的データ内容とは異なり、一旦生成されると、動的な時間的データ内容は、現在データ記憶部A同様に絶えず更新される。その結果、動的な時間的データ内容の内容は、データ復旧時刻まで現在データ記憶部A44と同一である。例えば第１の従前のデータ内容48が動的な場合、それはT-3000まで現在データ記憶部Aと同一である。その後で、現在のリクエスト時刻（T）まで、現在データ記憶部Aの更新データは、第１の従前のデータ内容48に繰り返しコピーされる。結果として生じるこの動的な時間的データ内容は、リクエスト時刻（T）とデータ復旧時刻（T-3000）との間に発生したデータを除いて、現在データ記憶部A44に対する全てのI／Oリクエストの結果を含む現在データ記憶部Bとして機能する。したがって、現在データ記憶部Bも、それに関連した時刻データ記憶部、すなわち時刻データ記憶部Bを有する。
【００６１】
図5には、固定的および動的な時間的データ内容が示されている。固定的な従前のデータ内容は、特定の時刻でのデータ記憶部のデータ内容である。すなわち固定的な従前のデータ内容、それが更新されないという意味で固定されており、例えばそれはリードオンリーであってもよい。ある実施例においては、時間的データ内容は、そのデータ内容が生成されるその時刻での読取り専用データとして指定することで固定化される。データ検証目的（すなわち問題の原因を識別するため）に、固定的データ内容は、特定の時刻のデータ記憶部を見るために有用であり、また消去したデータを復旧させるためにも有用である。一方、動的データ内容は、時間的に特定の時での第１のデータ記憶部（例えばデータ記憶部A）のデータ内容として始まるが、この従前のデータ内容は、修正されることがある。この動的データ内容は、あたかも従前のデータ内容がコピーされた新規なデータ記憶部であるかのようにホストには見える。また動的データ内容は、I／Oエラーからのクイック・リカバリに役立つこともある。
【００６２】
例えば第１のデータ記憶部のデータ破損によるエラー時には、過去の特定の時刻に存在ていた第１のデータ記憶部を夫々表示する複数個の固定的な従前のデータ内容が、指定されることができる（上記の通りの）。これらの従前のデータ内容は、そのエラー時に近い近似時刻を判断するために検査される。最小限のタイムスタンプの増加分が小さくなるほど精度が高く、その近似時刻を判断することが出来る。ある実施例においては、エラー時の直前にからデータを示す従前のデータ内容が、動的であると指定されると、そのデータ記憶部のデータを使用するソフトウェアアプリケーションは、その代わりにその従前のデータ内容を使用し始め、さらに事業活動は、第１のデータ記憶部の最も直近のエラーしていないバージョンの使用を再開する。例えば何らかの方法でビジネスアプリケーションを変更することによって、または記憶管理デバイス38に第１の現在データ記憶部にある動的な従前のデータ内容を表示するように指示することによって、つまり第２のデータ記憶部（例えばデータ記憶部B）を生成するためにその従前のデータ内容を使用することによって、このアプリケーションは、その従前のデータ内容を用いることが出来る。ある実施例においては、この従前のデータ内容は、ホストには新規なデータ記憶部（例えばターゲット識別子を有する新規なデバイス）として見える。
【００６３】
ある実施例においては、記憶管理デバイス38は、従前のデータ内容を他のデータ記憶部へコピーすることなく（または初めにコピーせずに）従前のデータ内容を提供する。むしろ上述のように記憶管理デバイスは、第１のデータ記憶部に関連する現在データ記憶部および時刻データ記憶部を用いて、その第１のデータ記憶部の従前のデータ内容を提供する。動的データ内容に対する変化が、第２の現在データ記憶部に記憶され、変化したブロックが、第２の時刻データ記憶部に記憶（例えば、copy-on-write動作のように）されるようにして、記憶管理デバイスはまた、第２の現在データ記憶部および第２の時刻データ記憶部を従前のデータ内容（すなわち第２のデータ記憶部）に関連させる。
【００６４】
この種のアプリケーション実行についての実施例においては、記憶管理デバイス38は、従前のデータ内容中にある現在データの要求を受信すると、まず第２の現在データ記憶部のデータをチェックし、次に第１の時刻データ記憶部のデータ、そして最後に第１の現在データ記憶部のデータをチェックする。動的データ内容に対する書込みリクエストに応じて、記憶管理デバイス38は、現在の動的データ内容（すなわち第２の現在データ記憶部、オリジナルの現在データ記憶部またはオリジナルの時刻データ記憶部）にあるデータのデータ位置を決定し、第２の時刻データ記憶部に「上書」されたブロックを記憶し、その第２の現在データ記憶部に新規のブロックを書き込む。動的データ内容の従前のデータ内容からのデータ要求は、第２の時刻データ記憶部、第２の現在データ記憶部、第１の時刻データ記憶部および第１の現在データ記憶部を使用して提供される。
【００６５】
他の実施形態では、動的データ内容は、時刻データ記憶部に完全に記憶される。本実施例において、データ記憶部は、一つのストアおよび一つの時刻データ記憶部を有している。この実施例のバージョンにおいては、固定的データ内容、動的データ内容、インデックス情報、そして制御ブロックは、時刻データ記憶部に記憶されている。動的データ内容は、指定されたデータ復旧時刻にデータ記憶部にあるデータを、時刻データ記憶部のセクションに書き込むことによって生成される。この実施例の更なるバージョンにおいては、動的データ内容が書き込まれるときに、copy-on-write動作（書込み動作上のコピー）は実行されない。
【００６６】
動的データ内容のデータが、第１および第２の現在データ記憶部および第１および第２の時刻データ記憶部の組み合わせであるという意味で、記憶管理デバイス38（少なくとも最初は）は、「仮想」デバイスとして動的データ内容を提供することができる。そして、1つのデータ記憶部から他のデータ記憶部へデータをコピーせずに、この動的データ内容は、非常に素早く提供することが出来る。一旦動的データ内容が稼働しだすと、第１の現在データ記憶部および／又は第１の時刻データ記憶部の内容を、動的データ内容のために第２の現在データ記憶部および第２の時刻データ記憶部へコピーする（記憶管理デバイスの能力が許容するように）ことは役立つことがある。換言すれば、「仮想」第２データ記憶部は、独立して第１データ記憶部を入れ替えるために用いることができる新規なデータ記憶部を生成するために用いることができる。記憶管理デバイス処理活動が比較的低いときに、これはバックグラウンドで、または一度に実行することができる。加えて、バックグラウンド操作は、手動で、または自動的で開始することができる。ある実施例においては、ホスト34かシステム管理者が、バックグラウンド操作およびデータ記憶部入れ替え動作を開始することが出来る。
【００６７】
この実施例を簡略明確に示す実施例として、図.5を参照して説明する。この例ではデータ記憶部A143と称される第１のデータ記憶部の動的データ内容が、生成されると仮定する。動的データ内容が基礎を形成される従前のデータ内容が、特定の時刻（再び、例証として、例えば、11：00a.m.）のデータ記憶部A143であると識別される。データ記憶部A143の従前のデータ内容は、データ記憶部A143に関連する現在データ記憶部A144と時刻データ記憶部A146を使用して提供される。ホスト34またはシステム管理者によって、従前のデータ内容が動的であるとの指示に従い（したがって、修正を許容する）、第２のデータ記憶部つまりこの例では第２データ記憶部Bは、識別子が割り当てられ、現在データ記憶部B148と時刻データ記憶部B152が、動的データ内容に割り当てられる。
【００６８】
記憶管理デバイス38は、最初に現在データ記憶部B148をチェックすることによって、現在時刻でのデータ記憶部Bへの読出しリクエストに応答し、そして、リクエストされたブロックが、現在データ記憶部Bにない場合、時刻データ内容A146と現在データ記憶部A144が、そのはブロックを得るために用られる。それが、動的データ内容の基礎であった従前のデータ内容時にあったためである。データ記憶部A143の従前のデータ内容からのデータを使用するために、データ記憶部A143のインデックスが、現在データ記憶部A144または時刻データ記憶部A146が所望のブロックを含むかどうかを判断するためにチェックされる。
【００６９】
記憶管理デバイス38は、読出しリクエストについて上述したように（例えば、最初に現在データ記憶部B148、それから時刻データ記憶部A146、そして現在データ記憶部A144をチェックして）、ターゲットブロックの現在のデータ内容の位置を決め、そのターゲットブロックを読み出し、そしてcopy-on-write動作（書込み動作上のコピー）を完了するために読み出されたデータを時刻データ記憶部B152に書き込むことで、データ記憶部B（現在時刻のための）への書込みリクエストに応答する。このターゲットブロックのための書込みリクエストに関連したデータは、現在データ記憶部B148に書き込まれる。
【００７０】
過去の時点でのデータ記憶部B147に対する読出しリクエストは、まず時刻データ記憶部B152をチェックすることで応答される。時刻データ記憶部B152のインデックスは、例えばそれが所望のブロックを含むかどうかを判断するためにチェックされる。もし無ければ、その場合は現在データ記憶部B148がチェックされ、そしてブロックが現在データ記憶部Bに無い場合、それが動的データ内容の基礎であった従前のデータ内容の時にあったので、そのブロックを得るために時刻データ記憶部A146および現在データ記憶部A144が用いられる。すなわち、時刻データ記憶部A146のインデックスが、所望の時刻の所望のブロックを含むかどうかを判断するためにチェックされ、そしてもし含まなければ、現在データ記憶部A144のブロックが用いられる。時刻データ記憶部A146のインデックスおよび現在データ記憶部A144がチェックされる命令が逆転できると理解すべきである。あるいは時刻データ記憶部A146および現在データ記憶部A144の総合インデックスも、使用することができる。
【００７１】
なおデータ記憶部A143は、引き続きデータ記憶部であり、そして継続的な処理がデータ記憶部A143にされが、それらの後のデータ変化はデータ記憶部B147に反映されない点に留意する必要がある。その理由は、記憶管理デバイス38は、データ記憶部B147へのアクセスのために、特定の過去の時点でのデータ記憶部A143に（すなわち従前のデータ内容に）アクセスを続け、現在データ記憶部A144で後から変化したブロックは、時刻データ記憶部A146に保存され、従って失われないからである。実際的には、時刻データ記憶部に記憶されている過去の時刻の間隔のサイズは、データ記憶部A143に対する書込み動作の頻度と、時刻データ記憶部A146のサイズに依存する。従って特定の実行内容に応じて、動的データ内容の使用を開始してしばらくした時点で、動的データ内容の基礎である従前のデータ内容（例えば上述の例の11:00amでのデータ記憶部A）を、他のデータ記憶部へ、又は時刻データ記憶部B152と現在データ記憶部B148へコピーすることが有益である場合もある。上述のごとく、記憶管理デバイス38が通常作動する間に、このデータ転送はバックグラウンドで実行することが出来る。
【００７２】
ある実施例において、指定されたデータ復旧時の現在データ記憶部B148への従前のデータ内容ブロックのデータ転送は、以下のように行われる。現在データ記憶部A144のブロックが、データ復旧時以降、上書きされなかった場合で（すなわち、現在データ記憶部のブロックが、データ記憶部B147の基礎である従前のデータ内容と異ならない）、かつそのブロックが、現在データ記憶部B148に既に含まれていない場合には（すなわち動的データ内容が生成された時点以降に、そのブロックがすでに「上書き」されない場合）、一つのブロックが、現在データ記憶部A144からコピーされる。またそれがデータ復旧時のデータ記憶部A143のブロックにあるデータである場合で、かつそのブロックが現在データ記憶部B148で既に見つからない場合には（すなわち、そのブロックが動的データ内容にすでに「上書き」されなかった場合）、1ブロックが時刻データ記憶部A146から現在データ記憶部B148へコピーされる。オプション的には、従前のデータ内容前の時から時刻データ記憶部A146にある複数のブロックも、時刻データ記憶部A146から時刻データ記憶部B152へコピーしてもよい。その結果、データ記憶部B147は、その従前のデータ内容の前の時刻でのデータ要求に応じることができる。
【００７３】
動的データ内容（例えば第３のデータ記憶部）は、他の既存の動的データ内容（例えばデータ記憶部B）に基づいて生成することができる。そうすると、第３のデータ記憶部のデータが、他の現在データ記憶部および時刻データ記憶部（例えばデータ記憶部Aおよびデータ記憶部B）から提供される。従前のデータ内容を他のデータ記憶部へコピーせずに（または最初にコピーせずに）、この種の動的データ内容も生成することができる。
【００７４】
例えば上記例にて説明したように、記憶管理デバイス38は、上記の通り、オリジナルの現在データ記憶部（例えば現在データ記憶部A）、オリジナルの時刻データ記憶部（例えば時刻データ記憶部A）、第２の現在データ記憶部（例えば現在データ記憶部B）、および第２の時刻データ記憶部（例えば、時刻データ記憶部B）を用いて動的なデータ記憶部（例えばデータ記憶部B）の従前のデータ内容を提供することができる。この新規な従前のデータ内容が、動的であると指定された場合、記憶管理デバイス38は、第３の現在データ記憶部および第３の時刻データ記憶部を、この新しい動的データ内容（例えば第３のデータ記憶部）に関連させることができる。そうすると、この新しい動的データ内容に対する変化は、第３の現在データ記憶部に記憶され、そして第３のデータ記憶部の変更ブロックは、第３の時刻データ記憶部に記憶される（例えば、copy-on-write動作によって）。
【００７５】
上記例を使用して、システム管理者は、データ記憶部B147のデータ破損を検出すると、データ破損の近似の（または正確な）時刻を識別するために、多くの従前のデータ内容を再び使用することができる。それから、このシステム管理者は、データ破損前のある時刻でのデータ記憶部B147の従前のデータ内容を識別することができる。例えば、このデータ内容が午後1時のものであったとする。このシステム管理者は、午後1時のデータ記憶部Bのデータ内容が動的データ内容であると指定でき、そしてこの新しい動的データ内容がデータ記憶部Cと呼ばれる。データ記憶部C153には、現在データ記憶部C154と時刻データ記憶部C156が設けられている。
【００７６】
データ記憶部C153で現在データ要求を受けると、記憶管理デバイスは、まず現在データ記憶部C154のデータをチェックし、それから現在データ記憶部B148、およびこの動的データ内容が生成された時刻の時刻データ記憶部B152のデータをチェックする。もしデータブロックが現在データ記憶部B148に無いか、または適宜時刻データ記憶部B152に無い場合には、記憶管理デバイス38は、時刻データ記憶部A146または現在データ記憶部A144からデータを得る。
【００７７】
またデータ記憶部C153への書込みリクエストを受け取ると、記憶管理デバイス38は、現在動的データ内容の中のデータのデータ位置を決定し（すなわち現在データ記憶部C154、現在データ記憶部B148、時刻データ記憶部B152、現在データ記憶部A144および時刻データ記憶部A146）、時刻データ記憶部C156中に「上書き」されたブロックを記憶し、さらにその新規なブロックを現在データ記憶部C154に書き込むことを判断する。その動的データ内容の従前のデータ内容のデータ要求は、時刻データ記憶部C156、現在データ記憶部B148と適切に組み合わせた現在データ記憶部C154、時刻データ記憶部B152、現在データ記憶部A144および時刻データ記憶部A146、を使用して得ることが可能である。
【００７８】
図6には他の実施例が開示されている。時間軸表190が示されており、最上の水平線は、データ記憶部Aについて、最初の時刻Tlから後の時刻T5を表す時間ライン192を表す。ホスト34は、時刻Tlから時刻T5の全期間にわたって、複数のデータ記憶部へI／Oリクエストを出す。この実施例では、まずデータ記憶部Aが最初に使われ、そしてこのアプリケーションでは、データ記憶部Aに読出しおよび書込み処理を指示する。
【００７９】
時刻T3でシステム管理者は、データ記憶部A143でエラーがあり、そのエラーは、たぶんエラーイベントによって生じたものであると識別する。データが損なわれなかった直近の時刻を識別することによって、システム管理者は、データ破損が発生した時刻を判断するために、データ記憶部A143の従前のデータ内容のレビューを実行する。換言すればエラーイベントは、破損したデータが現れた最も早い時刻におそらくは発生している。データ破損のイベントの時刻を判断するために、記憶管理デバイス38は、データ記憶部A143の任意の過去バージョンを検索する。データ破損のイベントがあった時刻に関する精度は、最小限タイムスタンプの加算時間により、少なくとも部分的に決定される。
【００８０】
データ記憶部A143のデータの妥当性は、データ破損のイベントの時刻を識別するために実行される第１の検索においてチェックされる。時間軸192上の時刻T3とT4間に表示されている複数の縦線による最初の１セットが、検索が行なわれた例示的な時刻を表している。ここではエラー発生が最初に識別された時に、時刻T4から検索が時刻T3へ戻りながら行なわれることを表示している。システム管理者は、例えば時刻T4で検索を開始して、第１の検索時刻T16でデータをチェックする。時刻T16のデータは破損されているので、システム管理者はそれ以前の時刻（すなわち時刻T15およびT14）からデータを更にチェックする。時刻T15およびT14のデータは壊されているので、検索は、更に時刻T11の再検索を続ける。時刻T11のデータは壊されていない、したがって管理者は、時刻T12、時刻T13および時刻T3をチェックする。検索は有用データが存在する直近の時刻識別子、つまりこの例で時刻T3までこのように続行する。
【００８１】
この検索は、様々な検索方法を使用して実行されることもできる。例えば第１の検索と第２の検索の時間間隔を大きくすることで、データ破損のイベントの時刻をより迅速に決定できる可能である場合がある。また上記検索は、エラーが発見された時刻から開始する必要性もない。例えばシステム管理者に、データ破損のイベントについておおよその時刻についての考えがある場合、検索はより従前の時刻から開始してもよい。更にこの検索は、データ破損のイベントより早い時刻（例えばTl、T2、など）で開始してもよい。例えば時刻T2で第１の時刻検索が開始される検索では、この検索は、破損したデータが見つかる最初の時刻まで、検索時刻を後の時刻へ順次進めてもよい。記憶管理デバイス38は、時刻データ記憶部A146によってカバーされる時間間隔のデータ記憶部A143の如何なるバージョン、つまりタイムスタンプを最小限の時間間隔の精度にして検索出来るので、如何なる検索方法も使用できると理解すべきである。なおある実施例では、時間間隔の精度は、1ミリ秒である。
【００８２】
この例では、エラーが存在しなかったため識別された所望の時刻であると判断され、時刻T3がデータ復旧時刻として指定される。もちろんデータ復旧時刻として、ユーザはT3より以前の時刻を選択することもできる。第２のデータ記憶部、つまりデータ記憶部B147が、時刻T3でのデータ記憶部Aからのデータを使用して生成されている。ユーザは、データ記憶部A143のための有効データが存在する直近の時刻として時刻T3を識別したことを、時刻T4で識別する。時刻T4（すなわちリクエスト時刻）で、ユーザは、時刻T3での（すなわちデータ復旧時刻の）第１のデータ記憶部、すなわちデータ記憶部A143の従前のデータ内容として、データ記憶部B147を生成する。図6において、時間軸194が、データ記憶部B147に関連している。
【００８３】
データ記憶部B147は、動的データ内容であり、従って第２の現在データ記憶部148（現在データ記憶部B）と、第２の時刻データ記憶部147（時刻データ記憶部B）は、 データ記憶部B147に関連している。一旦現在データ記憶部B148が生成されると、記憶管理デバイス38は、ホスト34が利用できるデータ記憶部B147を製作することができるようにし、そしてアプリケーションはデータ記憶部A143の代わりにデータ記憶部B147を使用することができる。その後で、ホスト34のI／Oリクエストは、データ記憶部A143の代わりに、データ記憶部B147を相手とするようになる。この例では、I／Oリクエストは、時刻T4および時刻T5との間では、データ記憶部A143およびデータ記憶部B147の両方をデータの送受信の相手にし続ける。他の実施形態では、データ記憶部B147は、第２の時刻データ記憶部を伴わない第２の現在データ記憶部で構成する従前のデータ内容であってもよい。この実施例では、現在データ記憶部B148は、データ記憶部B147への書込みコマンドが現在データ記憶部B148の既存データを置き換えて新しい書込みデータにする書込みプールで実行され、この場合、現在データ記憶部B148の過去データ記録は、保持されない。
【００８４】
上記したように、データ記憶部B147は、データ記憶部A143の内容をコピーせずに生成される。データ記憶部B147は従って直ちに実質的に生成され、そしてデータ記憶部B147は、迅速にオンラインに移行することが出来る。元々データ記憶部B147に関連したデータは、現在データ記憶部A144と時刻データ記憶部A146に保持される。
【００８５】
現在時刻にデータ記憶部B147のための読出しリクエストを受信すると、即座に、記憶管理デバイス38は、現在データ記憶部A144および時刻データ記憶部A146のうちどちらが、読込まれるべきブロックのためのデータを有するかについて判断する。すなわち現在データ記憶部A144中のデータが、時刻T3以降に書き込みされなかった全てのデータのために使用され、また時刻データ記憶部A146中データが、時刻T3以降に上書きされた現在データ記憶部A144の全てのブロックのために使用される。従って一旦あるデータが現在データ記憶部B148に書き込まれると、現時刻にデータ記憶部B147に対する読取りコマンドへのリスポンスは、現在データ記憶部B148、現在データ記憶部A144、又は時刻データ記憶部A146から得られるかもしれない。読出しリクエストを受信すると、記憶管理デバイス38は、現在データ記憶部B148、現在データ記憶部A144、又は時刻データ記憶部A146の内の何れが、読込まれるべきブロックのためのデータを有しているかを判断する。記憶管理デバイス38は、時刻T4、すなわち時間軸（e）、(f)、(g)以降に書き込まれたデータ記憶部B147のブロックの全てのリクエストには、現在データ記憶部B148のデータを使用する。また現在データ記憶部A144中のデータが、時刻T3以降に書き込まれなかったデータ（すなわち時間軸の(a)、(b)部分)の全てのデータブロックのために使用され、そして時刻データ記憶部A146中のデータが、時刻T3と時刻T4（すなわち時間軸の(c)部分）の間に書き込まれたデータ記憶部A143上のデータの全てのデータブロックのために使用される。
【００８６】
データ記憶部A143は、時刻T4後は動的状態を継続できるが、その時刻T4後にデータ記憶部A143で発生するデータ変化は、データ記憶部B147のブロックに対するリクエストに応じるために用いるデータの位置だけに影響を及ぼす。すなわちそのようなデータ変化は、データ記憶部B147の実際のデータ内容に影響を及ぼさない。例えば、データ記憶部A143の対応するブロック100が、時刻T3以降に上書きされなかった場合、データ記憶部B147のブロック100のためのデータ源は、現在データ記憶部A144の対応するブロックである。しかしながら、データ記憶部B147のブロック100のためのデータ源は、対応するブロック100が時刻T3以降に、現在データ記憶部A144において上書きされた場合、例えばcopy-on-write命令がデータ記憶部A143の対応するブロックに実行された場合には、時刻データ記憶部A146の対応するブロックである。もちろん上述の説明は、ブロック100はデータ記憶部B147の生成以降は書込みコマンドのターゲットではなかったと仮定している。加えて、データ記憶部A143は動的である場合、時刻データ記憶部A146が時刻T4の後にも新しく上書きされるデータを保存するために使用され続けるように、時刻T4以降のデータ記憶部A143への書込みは、copy-on-write動作（書込み動作上のコピー）によって処理される。
【００８７】
書込みリクエストがデータ記憶部B147に対してリクエストされた場合、記憶管理デバイス38は、データ記憶部B147中のデータが現在どこにあるのか（すなわち現在データ記憶部B148、現在データ記憶部A144または時刻データ記憶部A146）について判断する。そのデータの位置は、以下のように決定される。
【００８８】
1）現在データ記憶部B148が、時刻T4以降に上書きされていれば、そのデータは、現在データ記憶部B148中にある。
【００８９】
2）現在データ記憶部A144が、時刻T3以降に上書きされていなければ、そのデータは、現在データ記憶部A144中にある。そして、
【００９０】
3)現在データ記憶部A144のブロックが、時刻T3の後いつでも上書きされていれば、そのデータは、時刻データ記憶部A146中にある。
【００９１】
更にその後は、以下のように続く：
【００９２】
1）データが現在データ記憶部B148にある場合、既存のデータは現在データ記憶部B148から読込まれて、時刻データ記憶部B152に書き込まれる。（例えばcopy-on-write動作で）。新しいデータは、現在データ記憶部B148に書き込まれる。ある実施例においては、現在データ記憶部B148に対する最新版は、copy-on-write動作（書込み動作上のコピー）または時刻データ記憶部B152を使用せずに達成される。この実施例においては、書込みコマンドが現在データ記憶部B148に対して実行されたときには、過去データは保存されない。
【００９３】
2）データが現在データ記憶部A144にある場合、現在データ記憶部A144からの既存のデータはコピーされて、現在データ記憶部A144中の既存のデータを上書きすることなく時刻データ記憶部B152に書き込まれる。新しいデータは、現在データ記憶部B148に書き込まれる。
【００９４】
3）データが時刻データ記憶部A146にある場合、時刻データ記憶部146Aからの既存のデータはコピーされ、時刻データ記憶部A146中の既存のデータを上書きすることなく、時刻データ記憶部B152へ書き込まれる。新しいデータは、現在データ記憶部B148に書き込まれる。
【００９５】
現在時刻にデータ記憶部B147への読出しリクエストを受けると、記憶管理デバイス38は、現在データ記憶部B148、現在データ記憶部A144、および時刻データ記憶部A146のデータについてチェックし、動的データ内容中に現在あるデータの位置を判断する。記憶管理デバイス38は、時刻T4後に、すなわち時間軸(e)、(f),そして(g)に書き込まれた、データ記憶部B147の全ブロックのための現在データ記憶部B148中にあるデータを使用する。現在データ記憶部A144のデータは、時刻T3以降に書き込まれなかった全てのデータブロック（すなわち時間軸セグメント(a)と(b))のために使われ、時刻データ記憶部A146のデータは、時刻T3およびT4間に書き込まれた（データ記憶部A143に）データ記憶部A143上の全てのデータブロック（時間軸セグメント(c)）のために使われる。
【００９６】
いかなる数の追加的なデータ記憶部も、データ記憶部A143の現在または従前のデータ内容に基づいて生成することができる。例えば、時刻T2でのデータ記憶部A143のデータ内容は、例えば、時刻T2から開始する如何なる時刻にも生成することができる。例えばデータ記憶部Dを時刻T3で生成することができる。追加的なデータ記憶部の生成は、データ記憶部はA143をベースとする他のデータ記憶部の生成と平行または独立に、順次実行することができる。その何れの場合にも、追加的なデータ記憶部の内容は、他のデータ記憶部の内容から独立している。すなわちデータ記憶部の生成時には、その内容は、データ記憶部A143の内容に依存している。その後、その追加的なデータ記憶部に対する読取り、書込みコマンドは、現在データ記憶部A144、時刻データ記憶部A146および／又はそのコマンド指示する付加的なデータ記憶部からのデータに応答する。
【００９７】
ある実施例において記憶管理デバイス38は、ユーザ（例えばホストまたはシステム管理者）が、あるデータ記憶部の従前のデータ内容を略瞬時に生成出来る瞬時復旧を実行する。例えば本願明細書において更に詳細に記載されているように、記憶管理デバイス38の構造は、各データ記憶部に対する書込みコマンドを詳細にインデックス化して、そのデータ記憶部の如何なる時刻での各ブロックのデータを、即座にインデックス化しアクセス可能にすることが出来るように構成することが出来る。
【００９８】
その瞬時復旧は、複数の方法で実行可能である。例えば、時刻T4で行なう瞬時復旧は、時刻T3という所望のデータ復旧時刻でのデータ記憶部A143の非破損データ復旧である。ある実施例においては、非破損データ復旧は、時刻T3とT4との間に実行した書込み動作の結果を、現在データ記憶部A144へコピーして戻すことによって実行される。この実施例のバージョンにおいて、copy-on-write動作（書込み動作上のコピー）は、時刻T3から時刻T4までに書かれたデータ記憶部A143の各ブロック上に実行される。データ復旧時には、時刻T3にそのブロックのために存在するデータが、データ記憶部A143の各々の対応するブロックに書き込まれる。上書きされる現在データ記憶部のデータは、時刻データ記憶部A146へコピーされる。本願明細書において上述したように、copy-on-write動作（書込み動作上のコピー）によって書き込まれるデータに関する関連する詳細事項は、記憶管理デバイス38によりインデックス化される。その結果、時刻T3とT4との間にデータ記憶部A143で実行された動作を、後から復旧させ閲覧することが可能である。
【００９９】
非破損データ復旧の動作は、時刻データ記憶部に記憶すべきデータ量を増加させるために、記憶管理デバイス38はコンパクトデータ復旧を実行することもできる。コンパクトデータ復旧では、ある選択されたデータは、データ復旧後は保持されない。この実施例では、書込み動作（copy-on-write動作でなく）が、時刻T3およびT4との間で更新されたデータ記憶部A143のブロックに実行される。その結果、データ復旧時刻では、時刻T3に存在していたデータが、時刻T3およびT4との間に更新されたデータ記憶部A143の対応する各ブロックに書き込まれる。この実施例の他のバージョンでは、copy-on-write動作（書込み動作上のコピー）が実行されるが、時刻T3およびT4の間に保持されたデータは、仮に時刻データ記憶部がその記憶容量いっぱいに近づいたら、上書きされるべきデータの待ち行列の先頭に配置される。例えば、時刻T3およびT4間のデータは、データ記憶部が指定された記憶容量に達したときには最初に交換されるように、時間的に最も優先されるべきデータとすることが出来る。
【０１００】
図6には、データ記憶部B147の内容から生成した第３のデータ記憶部（すなわちデータ記憶部C）の生成が図示されている。すなわちデータ記憶部C153が、以前に生成された動的データ内容から生成される。ここではリクエスト時刻はT5であり、そしてデータ復旧時刻はT7である。繰り返しになるが、データ復旧時刻とは、データ破損が起こる前の時刻である。データ記憶部B147からデータ記憶部C153を生成する動作は、「積み重ね(stacking)」と呼ばれる。その理由はそれが、各データ記憶部が他のデータ記憶部（または複数個のデータ記憶部）の従前のデータ内容に基づく一連の仮想データ記憶部を生成するためである。
【０１０１】
この例では、データ記憶部C153は、データ記憶部B147の従前のデータ内容に基づき、そしてデータ記憶部B147は、データ記憶部A143の従前のデータ内容に基づいている。その結果、データ記憶部C153は、まず最初に、現在データ記憶部B148、時刻データ記憶部B152、現在データ記憶部A144および時刻データ記憶部A146のいずれかに記憶されるデータで設定される。記憶管理デバイス38は、データ記憶部C153のデータ内容を以下の資源に基づいてホスト34に提出することができる：1)現在データ記憶部B148は、時刻T4およびT7との間に上書きされ、時刻T7以降は上書きされなかったブロックからデータのために使われる（時間軸（e）そして(f)の部分）；2)時刻データ記憶部B152は、時刻T7（時間軸（g）の部分）以降に上書きされたブロックからのデータのために使われる；3)現在データ記憶部A144は、時刻T3以降に上書きされなかったブロックからのデータのために使われる（時間軸(a)そして(b)の部分);そして4)時刻データ記憶部A146は、時刻T3およびT4の間（時間軸(c)の部分）に上書きされたブロックからのデータのために使われる。
【０１０２】
現在データ記憶部C154および時刻データ記憶部C156は、上記の通りに割り当てられる。データ記憶部C153に対する読出しおよび書込みリクエストは、データ記憶部B147についての記載と同様な方法で記憶管理デバイス38によって処理される。しかしながら1つの違いは、データ記憶部C153の内容の位置を決めるために、検索されなければならないデータ記憶部の量は、現在データ記憶部A144、時刻データ記憶部A146、現在データ記憶部B148、そして時刻データ記憶部B152を含むように増加したということである。従前のデータ記憶部のデータ内容から動的データ内容を生成する方法は、システムの記憶容量の範囲内で、アプリケーションによって必要に応じて拡張することができる。例えば、ある動的データ内容は、第4のデータ記憶部、例えばデータ記憶部Dを生成するために、データ記憶部C153の従前のデータ内容から生成されることができる。そして更に、上述の方法は、いかなるデータ記憶部の従前のデータ内容からの静的データ内容を生成するために使用される。それは例えば、時刻T3でのデータ記憶部A143のクローンの生成等である。
【０１０３】
図7Aおよび図7Bは、所与のデータ記憶部の現在データ記憶部および時刻データ記憶部の動作に関する他の実施例を示している。図7Aは、現在データ記憶部の内容を示し、そして図7Bは、図7Aの現在データ記憶部に関連する時刻データ記憶部の内容を示している。時間軸は、最初の時刻T0、第１の書込み時刻Tl、第２の書込み時刻T2、第３の書込み時刻T3および最終的な時刻T4を上段に示している。図7Aおよび図7Bの左側に示す番号0-5は、データ記憶部の6ブロックを表している。上述のごとく、データ記憶部は、いかなる数のブロックまたは他の記憶ユニットで構成することが出来る。加えて、データ記憶部は、仮想ディスク、論理的・ディスク、物理的ディスク、などを含むデジタルデータを記憶するための如何なる装置で構成することが出来る。
【０１０４】
各時刻で記憶されるべきデータは、実線で示すボックスに入れられている。現在データ記憶部の各々のブロック0-6は、時刻データ記憶部の対応するブロックを有する。書込みリクエストがあるブロックに対してあった時刻には、書き込まれるデータは、図Aの現在データ記憶部の対応するブロックに隣接して表示する破線のブロックに入れられている。これは、copy-on-write命令の完了に現在データ記憶部へ移動中であるデータを表している。
【０１０５】
例えば時刻T0の動作で、データa、b、cおよびdが、それぞれ各々の現在データ記憶部のブロック0-3に存在する。ブロック4および5は、この時点でいかなるデータも含まない。加えて、ブロック0-5のための書込みリクエストが、現在データ記憶部に対して未だ無かったので、時刻データ記憶部はいかなるデータも含まない。時刻Tlで、データX、YおよびZが、それぞれブロック2-4に書き込まれる。copy-on-write動作（書込み動作上のコピー）が各々のブロック2-4に実行され、そしてそれらのブロックに現れている過去データが、現在データ記憶部から読込まれ、そして時刻データ記憶部に書き込まれる。すなわちデータc、dおよび空きブロックが、それぞれ時刻データ記憶部のブロック2-4に書き込まれる。時刻T2の現在データ記憶部に示すように、新しく書き込まれたデータが、時刻Tlでの書込み動作の完了後にブロック2-4に現れる。しかしながら第２の書込み動作が、データ7、9および8がそれぞれブロック0、3および5に書き込まれる時刻T2で実行される。再びcopy-on-write動作（書込み動作上のコピー）が実行され、その結果、過去データであるa、Y、そして、空きブロックが、ブロック0、3および5に夫々書き込まれる。時刻T3で、3回目の書込み動作が実行され、そしてデータQがブロック5に書き込まれる。時刻T2でブロック5に書き込まれたオリジナルデータ8が、読込みこまれ、対応する時刻データ記憶部のブロック5に書込みが行われる。新しいデータQが、時刻T3でブロック5に書き込まれ、そしてその結果、データQが時刻T4で現在データ記憶部のブロック5に現れる。書込み動作が時刻T4で実行されないと仮定すと、時刻データ記憶部は時刻T4で空のままである。
【０１０６】
図8の時刻データ記憶部は、図7Aおよび図7Bに示したデータ記憶部に実行されたcopy-on-write動作（書込み動作上のコピー）のシーケンスに基づくものである。図8は、時刻T4の時点でのデータ復旧リクエスト時に、データ復旧時刻Tlでのデータ記憶部を表すデータ内容を復旧させるために、現在データ記憶部の従前のデータ内容が、どのように生成されるかを示している。書込み動作がブロック0、1および5に実行されなかったので、時刻T0および時刻Tlのいずれの時刻でも、以前のデータ内容のブロック0、1および5は、時刻Tlでの現在データ記憶部からのデータで構成されている。時刻Tlでブロック2、3および4にデータが書き込まれたので、時刻データ記憶部からのデータが、時刻Tlでのブロック2、3および4の従前のデータ内容のために使われる。このように、時刻Tlのデータ記憶部の従前のデータ内容は、時刻Tlの後に現在データ記憶部で発生した変化結果を反映していない。
【０１０７】
図9には、ある一つの実施例としての記憶管理デバイス238が示され、それには一つ以上のプロセッサーモジュール278、278’、278’’, 一般的には278が含まれている。この図には3つのプロセッサーモジュールが例として示されているが、いかなる数のプロセッサーモジュールでもよい。
【０１０８】
各プロセッサーモジュール278はCPU290を有し、このCPU290は、ターゲット・インタフェース292、ROM294、メモリ296、そしてイニシエータ・インタフェース298、と各々通信を行なう。このCPU290は、一つ以上の集積回路で構成可能であり、他の集積回路、例えばバスインタフェース、クロックおよび通信用インタフェース等とのインタフェースのための他の「グルー(glue)」ロジック（図示せず）を含むことができる。CPU290は、ROM294内のソフトウェアやメモリ296のソフトウェアを実行し、これ等のソフトウェアは、例えば、内部ネットワークインターフェース284を通じて、または物理的な記憶部36でアクセス可能である。
【０１０９】
CPU290は、プロセッサーモジュール278を内部ネットワーク286に接続する内部ネットワークインターフェース284との通信も行なう。なお内部ネットワーク286は、プロセッサーモジュール278を他のプロセッサーモジュールと相互に通信可能にする。内部ネットワーク286は、一つ以上の実際のネットワークとして実行することができ、制御情報およびデータの両方を通信できる充分な能力を有するいかなる種類のネットワークであってもよい。内部ネットワーク286には、共有シリアルまたはパラレルのバス、またはこれ等の組み合わせも含むことができる。内部ネットワークは、遠隔ダイレクトメモリのモデル化されたインタフェース、例えばInfiniBand、Ethernet（登録商標）、ファイバーチャネル、SCSI3など、を実施する物理的ネットワークであってもよく、又これ等のネットワークを含んでいてもよい。ある実施例においては、インタフェースは、DirectAccessProviderLibrary（「DAPL」）である。
【０１１０】
ある実施例においては、プロセッサーモジュール278は、内部ネットワーク286のための接続を実行するバックプレーンに接続可能である。ある実施例では、プロセッサーモジュール278の一つ以上のセットが、記憶管理デバイス238内でラック載置してもよく、更にこの内部ネットワーク286は、記憶管理デバイス238内で各ラックを他のラックに接続するように構成してもよい。記憶管理デバイス238内で実行される分散処理により、システムサイズ（例えば記憶容量、演算速度、その他）が所望の容量に合致するように簡単に拡大または縮小できるシステムで構成してもよい。
【０１１１】
ターゲット・インタフェース292は、プロセッサーモジュール278が一つ以上のターゲット・データ記憶部デバイスとして機能できるようにするインタフェースを提供する。例えば、ターゲット・インタフェース292がファイバーチャネル・インタフェースである場合、ターゲット・インタフェース292によって、プロセッサーモジュール278がホスト（図示せず）に対して一つ以上のファイバーチャネル・デバイスに見なされることが出来る。ターゲット・インタフェース292は、いかなる適切なネットワーク・コミュニケーション・プロトコルもまたはデータ記憶プロトコルも実行可能である。ターゲット・インタフェース292は、受信データおよび送信データを記憶するメモリ296の一部分に対するダイレクトメモリアクセスを好ましくは有する一つ以上の集積回路で実行される。ターゲット・インタフェース292は、通常はCPU290によって初期化およびプログラミングされる必要がある。
【０１１２】
イニシエータ・インタフェース298は、プロセッサーモジュール278が物理的なデータ記憶装置とのコミュニケーション用に、それ自身が一つ以上のホストとして見えるように出来るインタフェースを提供する。例えば、イニシエータ・インタフェース298がファイバーチャネル・インタフェースである場合、イニシエータ・インタフェース298によってプロセッサーモジュール278が、ファイバーチャネル・インタフェース経由で一つ以上の物理的な記憶装置と通信することができる。イニシエータ・インタフェース298は、いかなるネットワーク・コミュニケーション・プロトコルまたはデータ記憶プロトコルも実装することができる。イニシエータ・インタフェース298は、受信データおよび送信データ用のメモリ296の部分に好ましくはダイレクトメモリアクセスを有する一つ以上の集積回路で実行される。
【０１１３】
プロセッサーモジュール278は、2台のプロセッサーモジュール278が、同一記憶ユニットに対するI／Oリクエストの各々に応答するよう責任を果たすフォールト・トレラント構成（フェール・セーフ）で実行するように構成されている。この実施例のバージョンにおいては、このフォールト・トレラント構成は、単一の物理的デバイスまたは論理的デバイス（またはデータ内容）からプロセッサーモジュール278で構成する記憶ユニットへのI／O複数のリクエストに対する責任分担をすることで更に改良することができる。例えば第１および第２のプロセッサーモジュール278が、現在データ記憶部Aのブロック100および200に対して責任を与えられ、そして第３および第４のプロセッサーモジュール278が、現在データ記憶部Aのブロック300-500に対して責任を与えられるように構成してもよい。フォールト・トレラント構成は、別々のラックに同じタスクを遂行するプロセッサーモジュール278を配置することで更に改良してもよい。
【０１１４】
ここで図10には、システムエレメントの機能的な表示がされており、3台のプロセッサーモジュール378、378’、378’’、一般的には378が、記憶管理デバイス338内に表示されている。モジュール378の台数は、（再び）単に例示的であり、そしてプロセッサーモジュール378の台数は、規模、パフォーマンスおよびコスト等を考慮して増減することが出来る。各プロセッサーモジュール378に示される機能要素は、ハードウェアおよび／又はソフトウェアによって行なうことができ、一般的には両方とも、各々のこれらの要素を実施するために用いることが出来るように構成されている。
【０１１５】
ある実施例においては、記憶管理デバイス338の各プロセッサーモジュール378には、少なくともホストと通信するためのホスト・インターフェース361、I／Oマネージャ362、記憶バッファ363、そして、物理的記憶部インタフェース364が含まれている。他の実施形態では、各プロセッサーモジュール378は、これらの機能要素より多く、又は省略した機能要素を含んでいる。各種実施形態において、記憶管理デバイス338には内部ネットワーク380（例えば内部InfiniBandネットワーク、内部イーサネット（登録商標）ネットワーク、内部ファイバーチャネル・ネットワークおよび／又は内部SCSIネットワーク）が含まれている。これは、複数の機能要素間の通信を行ったり（例えばホスト・インターフェース361、I／Oマネージャ362、記憶バッファ363および物理的記憶部インタフェース364、間の）、第１のプロセッサーモジュール378の機能要素のいずれかと、第２のプロセッサーモジュール378の機能要素のいずれかの間の通信を行ったり、同じ機能要素間の通信を行ったり（例えば、ターゲットモード・ドライバ382とホスト・インターフェース361のデータ分類装置384、間の）、同じ又は異なるプロセッサーモジュール378上の、1つの機能要素の構成要素と他の機能要素（またはその他の機能要素の構成要素）の間の通信を行ったりする。
【０１１６】
ある実施例においては、ホスト・インターフェース361には、ターゲット・インタフェース292（図9を参照)を含むターゲットモード・ドライバ382と、そしてターゲット・インタフェース292と通信するためのソフトウェアが含まれている。機能的には、ターゲットモード・ドライバ382は、上記何れの通信リンク40（例えばファイバーチャネル・ネットワーク）経由でホスト34と通信を行なう。その結果、ターゲットモード・ドライバ382は、ホスト34からのI／Oリクエストを受信したり、それに応答する。
【０１１７】
ある実施例においては、ターゲット・モードドライバ382は、制御情報を含むI／Oリクエストを受信する。この制御情報とは、例えば、対象データを含む書込み動作、読込み動作、または後述するようなデータ記憶部中のデータ位置用の修正履歴に関するリクエスト、等である。読込み動作に応答して、例えば、ターゲットモード・ドライバ382は、I／Oマネージャ362からリクエストデータを得ることができ、その後に、ホスト34にリクエストデータを送信することができる。書込み動作に応答して、ターゲットモード・ドライバ382は、まず最初に受信した書込み動作を、ターゲットモード・ドライバ382と同じプロセッサーモジュール378に置かれている第１の記憶バッファ363に記憶する。ある実施例においては、このターゲットモード・ドライバ382は、それから書込み動作をその関連する制御情報および対象データに分け、そして制御情報および分離された対象データは、まず最初に第１の記憶バッファ363に記憶される。ある実施例においては、I／Oリクエストは、ホスト・インターフェース361によって対象データおよび制御パケットに分けられる。この制御情報は、それから記憶管理デバイス338内の他のコンポーネントに、内部ネットワーク380を介して送信される。例えば、ある実施例においては、ターゲットモード・ドライバ382は、制御情報をデータ分類装置384に送信する。その一部のために、対象データまたはそのコピーが、記憶管理デバイス338内の他のコンポーネントに、内部ネットワーク380を介して送信されることある。最後に、I／Oマネージャ362によって指示されるように、対象データは、適切な物理的記憶部インタフェース364に、内部ネットワーク380を通じて送信される。好ましくは、ソフトウェア処理の必要なしで、その対象データは、ハードウェア・ダイレクトメモリアクセスによって送信される。
【０１１８】
ある実施例において、制御情報をデータ分類装置384に送信する前に、そしてホスト34へのI／Oリクエストを知らせる前に、ターゲットモード・ドライバ382は、制御情報にタイムスタンプを付加する。換言すれば、ターゲットモード・ドライバ382は、制御情報がホスト・インターフェース361で受け取られた時刻とその制御情報とを関連させる。例えば、ターゲットモード・ドライバ382は、データパケット中で制御情報をデータ分類装置384に送信する一方で、モード・ドライバ382は、制御情報をホスト・インターフェース361で受信した時刻を示すために、データパケット中のある領域を用いることができる。制御情報にタイムスタンプを付加する他のいかなる方法も、用いることが出来る。
【０１１９】
ある実施例においては、ターゲットモード・ドライバ382が書込み動作の対象データを、書込み動作の制御情報から切り離し、そしてターゲットモード・ドライバがデータ分類装置384への制御情報の送信と分離した後に、ターゲットモード・ドライバ382は、少なくとも一つの対象データ・コピーを生成するために分離された対象データをコピーする。ある実施例においては、ターゲットモード・ドライバ382は、それから、後述するように、第１のコスト方程式を評価して、この評価されたコスト方程式の結果に基づいて、第１の対象データ・コピーを少なくとも一時的に記憶できる第２の記憶バッファ363を最適に識別する。ある実施例では、第１の記憶バッファ363および第２の記憶バッファ363は、例えば異なるプロセッサーモジュール378中の異なる記憶バッファ363であってもよい。オプションとして、ターゲットモード・ドライバ382は、それから、後述するように、第２および／又は更なるコスト方程式を評価し、この第２の評価および／又は更なるコスト方程式の結果に基づいて、第２の評価および／又は更なる対象データのコピーを記憶できる第３および／又は更なる記憶バッファ363を、最適に識別することもできる。この第１、第２、第３およびいかなる更なる記憶バッファ363は、各々異なる記憶バッファ363であってもよい。ターゲットモード・ドライバ382は、それから第１の対象データ・コピーを第２の記憶バッファ363に送信することができ、更に任意的に、第２および／又は更なる対象データ・コピーを、第３および／又は更なる記憶バッファ363に送信することができる。したがって記憶管理デバイス338は、一時的または永続的であり、かつ冗長性を持ったデータ記憶装置を提供することができる。
【０１２０】
ある実施例においては、ホスト・インターフェース361は、データ分類装置384を含んでいる。このデータ分類装置384は、ホスト・インターフェース361のターゲットモード・ドライバ382と通信を行い、また複数のI／Oマネージャ362とも通信を行なう。データ分類装置384は、ターゲットモード・ドライバ382からI／Oリクエストの制御情報を受信し、リスポンスするために適切なプロセッサーモジュール378を識別して、この適切なプロセッサーモジュール378のI／Oマネージャ362に、この制御情報を転送する。
【０１２１】
ある実施例においては、データ分類装置384は、特定タイプのI／Oリクエスト（例えば、書込み動作、読込み動作、または、修正履歴のリクエスト等の）に、ホスト・インターフェース361で受け取られたI／Oリクエストを、ターゲットモード・ドライバ382によって分類する。ある実施例においては、データ分類装置384は、I／Oリクエストを分類するために、受信したI／Oリクエストの制御情報を分析する。データ分類装置384は更に、受信したI／Oリクエストを、例えば後述するようにI／Oマネージャ362によって生成したサブスクリプション・リクエストと比較することで、この制御情報を分類する。ある実施例においては、データ分類装置384は、プロセスグループ、記憶装置識別子（例えば、論理的ユニット）、記憶ユニット識別子、そして各I／Oリクエストのためのデータ長、等を判断する。この情報は、制御情報、タイムスタンプおよびI／Oリクエストの種類と共に、適切なI／Oマネージャ362に転送される。多くのI／Oリクエスト量を処理するために、記憶バッファ363は、I／OリクエストがそれぞれのI／Oマネージャ362に送信される毎に、一時的にデータ分類装置384からのこれらの情報パケットを記憶する。
【０１２２】
より詳細に述べれば、記憶管理デバイス338の複数のI／Oマネージャ362は、データ記憶部を管理する役割を果たす。ある実施例においては、複数のI／Oマネージャ362の各々は、記憶位置確保プロトコル（例えば後述するような）で、データ分類装置384から受け取る制御情報を処理するデータ記憶部中の記憶位置を確保する。したがってホスト・インターフェース361で受け取られたI／Oリクエストの制御情報が、データ記憶部中の第１の記憶位置で実行すべき動作を含んでいる場合には、データ分類装置384は、複数のI／Oマネージャ362の記憶位置確保情報に基づいて、制御情報を処理することができる複数のI／Oマネージャ362の第１番目を識別することが出来る。更に云えば、ある実施例では、データ分類装置384は、再び複数のI／Oマネージャ362の記憶位置確保情報に基づいて、仮に複数のI／Oマネージャ362の第１番目がI／Oエラーした時には、制御情報を処理することができる複数のI／Oマネージャ362の第２番目を識別することが出来る。
【０１２３】
ある実施例においては、データ分類装置384がターゲットモード・ドライバ382から制御情報を受け取ったあとに、データ分類装置384は制御情報のコピーを生成するために制御情報をコピーする。そのような実施例において、データ分類装置384は、上述のようにして識別された複数I／Oマネージャ362の第１番目に制御情報を送信して、その第１のI／Oマネージャ362に制御情報を処理するように命じる。データ分類装置384は、上記の通り識別された複数のI／Oマネージャ362の第２番目に、制御情報のコピーを送信し、制御情報のコピーを処理するよりはむしろ一時的に制御情報のコピーを保存するように、その第２番目のI／Oマネージャ362に命じることもできる。その制御情報のコピーは、例えば、複数のI／Oマネージャ362の第２番目が位置するプロセッサーモジュール378の記憶バッファ363に記憶してもよい。したがって、ある実施例においては、第１番目のI／Oマネージャ362がI／Oエラーすると、第２のI／Oマネージャ362によって処理されるように、記憶管理デバイス338は制御情報の冗長性を持たせてコピーを保存する。
【０１２４】
ある実施例においては、第１のI／Oリクエストの制御情報は、I／Oマネージャ362にデータ記憶部の中の第１の記憶位置で動作するように指示する。そのような実施例において、I／Oマネージャ362は、少なくともデータ記憶部の中で部分的に第１の記憶位置とオーバラップするデータ記憶部の中の第２の記憶位置で動作する他のI／Oリクエストの制御情報によって、指示されることもできる。この種の場合、I／Oマネージャ362は、最も早いタイムスタンプを有する制御情報を最初に処理する。したがって1つの方法では、I／Oリクエストの制御情報にタイムスタンプを押すことにより、他のI／Oリクエストが少なくともデータ記憶部中の部分的に第１の記憶位置とオーバラップするデータ記憶部中の記憶位置に対して指示された時に、I／Oマネージャ362が、後のタイムスタンプが押されたI／Oリクエストの制御情報を処理する前に、確実にI／Oマネージャ362がデータ記憶部中の第１の記憶位置のための特定のI／Oリクエストの制御情報を処理するように、ターゲットモード・ドライバ382が、この処理を効果的に確実にする。
【０１２５】
一旦I／Oマネージャ362が、制御情報を受信し、その制御情報を処理するようにデータ分類装置384によって指示されると、I／Oマネージャ362は、そのI／Oリクエストを命令し管理して、更に物理的記憶部インタフェース364に対して適切な指示転送する。ある実施例においては、I／Oマネージャ362が制御情報を処理して、記憶管理デバイス338中の情報の流れをモニタして、インデックスを付ける。例えば、I／Oマネージャ362は、他の処理モジュール、ホスト・インターフェース361、および物理的記憶部364へ、又はこれ等からの情報の流れをモニタし、インデックスを付ける。このI／Oマネージャ362は更に、I／Oを管理し、変更された記憶ユニットが保存され、そして従前のデータ内容を生成する場合の将来の参照のためにアクセス可能なるように確実に処理を行なう。加えてI／Oマネージャ362は、ホスト34からのI／Oリクエストに応答して、記憶管理デバイス338の性能（例えば応答時間）のデータ追跡する。
【０１２６】
更にI／Oマネージャ362は、ホストが、I／Oリクエストに対して効果的な応答時刻で応答できるように、さまざまな最適化ルーチンを実施することもできる。例えば、記憶管理デバイスが、テラバイトの記憶容量を有する記憶システムを含む非常に大きな記憶システム30で使用されることができるので、copy-on-write命令の最適化は望ましくてもよい。copy-on-write命令は、新しいデータをターゲット記憶アドレスに書き込む前に、少なくとも2つの順次動作を必要とする：すなわち
(a)ターゲット記憶アドレスからの既存データの読出すこと、そして、
(b)その既存データを新しい記憶アドレスに書き込むこと、である。ある実施例においては、記憶管理デバイスは、単独で、または共に、所定の最適化を実行する。これらの最適化は、一般に5つのカテゴリのうちの1つに分類される：
(i)集約処理；
(ii)隣接装置の効率的処理；
(iii)冗長性を持った書込み；
(iv)再順序立て；
そして、
(iv)生データの記憶処理。
これらの最適化により、特にcopy-on-write動作（書込み動作上のコピー）では、より効果的な処理が可能となる。
【０１２７】
1．集約処理
第１の最適化は、集約処理である。記憶管理デバイス338は、順序立てた記憶ユニット（例えば隣接するブロックにある記憶ユニット）のために、別々のcopy-on-write命令を集約し、単一のcopy-on-write命令の動作を実行するように集約する。すなわちターゲット記憶ユニットに加えて、更に隣接するブロックがグループとして作用されば、物理的ディスクが各ブロック中で読込み及び書込みを行なう余分な時間が除去されるので、この動作は有用である。
【０１２８】
2．隣接装置の効率的処理
上記の集約による最適化は更に、ターゲット記憶ユニットに加えて近隣の全ての記憶ユニット、すなわち順序通りではないが相互に隣接する記憶ユニットに対する別々のcopy-on-write命令を結合することによって、更に最適化される。例えば記憶ユニット100、200、300、400、および500の5台の装置が互いに順次位置していた場合、ブロック100、300および500に対する単一のcopy-on-write命令は、ブロック100-500に対する単一のcopy-on-write命令と見なしてもよい。すなわち余分のデータが読込まれて動作するが、この5つの隣接装置への効率的処理は、上記3つのディスク動作よりも更に大幅に高速で処理することが可能となる。
【０１２９】
3．冗長性を持った書込み
冗長性を持った書込みが、ホストの書込みリクエストのターゲットでありそうな第１の記憶ユニットを識別することによって、実行可能である。すなわち第１のブロックに書き込まれるデータが、第２のブロックにも書き込まれる。インデックスにより、各記憶ユニットのアドレスが追跡される。そこでcopy-on-write動作（書込み動作上のコピー）を実行する代わりに、そのブロックに対する次の書込みコマンドによって、2ブロックのうちの1つを上書きして最適化を行なう。無影響のブロックは、それからそのブロックの履歴コピーとして役立つことができる。
【０１３０】
4．再順序立て
再順序立てによる最適化により、受信されたI／Oリクエストは再順序立てされ、上記の集約処理、隣接装置の効率的処理、冗長性を持った書込みの各プロトコル等のような一又は複数個の最適化プロトコルの利点を最大化することが可能である。
【０１３１】
5．生データの記憶処理
ある場合には、データを物理記憶装置を使用せずメモリに生データとして記憶しておく方が効率が遥かに高い。例えば、ある特定のブロックには、多くのI／Oリクエストがある（従って例えば、それらは頻繁に更新される）場合、頻繁な読取り書込み動作よりも、データを単にメモリに入れておく置ことによって時間が短縮することが可能である。ある実施例においては、そのメモリは、プロセッサーモジュール378内に位置するメモリ296である（図9参照）。
【０１３２】
記憶バッファ363は、少なくとも一時的に、記憶管理デバイス338内で処理されるべき対象データ、対象データ・コピー、制御情報、および制御情報のコピーを記憶することができる。ある実施例においては、複数の記憶バッファ363は、一つ以上のターゲットモード・ドライバ382と通信を行なう。そのような実施例において、ターゲットモード・ドライバ382によって受信されたデータや、ターゲットモード・ドライバ382によって作られたそのデータのコピーは、物理的記憶部インタフェース364によって物理的な記憶部36と通信したり、内部ネットワーク380を経由して他のプロセッサーモジュール378と通信するまでは、一つ以上の記憶バッファ363に記憶される。記憶バッファ363には、メモリ296が含まれ（図9を参照）、そのメモリ296は、各種デバイスがデータのソフトウェア処理をしないで通信できるような方法で、割り当てられている。
【０１３３】
物理的記憶部インタフェース364は、上記の通信リンク42（例えばファイバーチャネル・ネットワーク）等を経由して物理的な記憶部36と通信を行い、内部ネットワーク380を介して複数のI／Oマネージャ362、ホスト・インターフェース361の一つ以上および複数の記憶バッファ363と通信を行なう。例えば読出しリクエストに応答して、物理的記憶部インタフェース364は、物理的な記憶部36に記憶されるデータを取り出す。なおこのデータは、ホスト34への通信のために、ホスト・インターフェース361に最終的に提供される。書込みリクエストのためには、物理的記憶部インタフェース364は、ターゲット記憶ユニットである物理的な記憶部36へ対象データを転送する。
【０１３４】
I／Oマネージャ362が、ホスト・インターフェース361にあるターゲットモード・ドライバ382によって最初に受け取られたI／Oリクエストの制御情報を処理した後に、そのI／Oマネージャ362は、物理的な記憶部36の一つ以上と通信するように、物理的記憶部インタフェース364に指示することができる。ある実施例においては、I／Oマネージャ362は、物理的な記憶部36からデータを読込むように、物理的記憶部インタフェース364に指示する。例えば、I／Oマネージャ362は、書込み動作の制御情報を処理し、物理的記憶部インタフェース364は、従って、copy-on-write動作（書込み動作上のコピー）を実行するために物理的な記憶部36からデータを読込むように指示される。あるいは、I／Oマネージャ362は、読込み動作の制御情報を処理し、そして物理的記憶部インタフェース364は、従って物理的な記憶部36中の特定の記憶位置からデータを読込むように指示される。物理的な記憶部36からデータを読込むようにI／Oマネージャ3,62によって指示されると、物理的記憶部インタフェース364は、この種のデータを読込む。
【０１３５】
他の実施形態では、I／Oマネージャ362は、対象データを含んだ書込み動作の制御情報を処理するが、上述のように、前以てターゲットモード・ドライバ382によって制御情報から分離されたこの対象データは、第１の記憶バッファ363に記憶されていたものである。そのような実施例において、物理的な記憶部36と通信するように物理的記憶部インタフェース364に対して指示することに加えて、更にI／Oマネージャ362は、その第１の記憶バッファ363と通信するように物理的記憶部インタフェース364に対して指示を行なう。したがって、I／Oマネージャ362によって指示されたように、物理的記憶部インタフェース364は、対象データを第１の記憶バッファ363から取り出し、その対象データを物理的な記憶部36中の記憶位置に書き込む。
【０１３６】
一旦上記の対象データが、物理的記憶部36中の記憶位置に記憶されると、I／Oマネージャ362は、第２のおよび／又は更なる記憶バッファ363中に以前に保存されていた（冗長性を持たせて）一つ以上の対象データ・コピーを、削除し、削除のためにマークを付けてもよい。同様に、一旦制御情報がI／Oマネージャ362により処理されると、I／Oマネージャ362は、第２のI／Oマネージャ362が位置するプロセッサーモジュール378の記憶バッファ363に以前に保存されていた制御情報のコピーを、削除し、削除のためにマークを付け、又は交換のためにマークを付けてもよい。
【０１３７】
ここで図11に関連して、各プロセッサーモジュール378（図10）は、データ記憶部の特定部分に関してされるI／Oリクエストに対して責任を有する。各I／Oマネージャ362は、その処理モジュールが割り当てられるデータ記憶部の部分に対するI／Oリクエストを管理して、充足する役割を有する。ある実施例においては、各I／Oマネージャ362は、例えばデータ記憶部Aのブロック100-500のようなデータ記憶部中の一組のブロックを割り当てられる。各プロセッサーモジュール378は、複数のI／Oマネージャ362を使用することができる。責任を持つデータ記憶部の記憶部分に対するI／Oマネージャ362の割当ては、記憶位置確保プロトコルを経由して実行される。ある実施例においては、複数のI／Oマネージャ362の各自にレジスタを持たせ、各データ分類装置384と、データ動作（例えば読込み動作または書込み動作）を実行するデータ記憶部の一つ以上の部分と共に、実行される。
【０１３８】
各I／Oマネージャ362は、複数の現在データ記憶部および複数の時刻データ記憶部に対して責任があり、そしてこれ等は、現在データ記憶部制御装置472および機能的記憶装置474によって管理されている。ある実施例においては、記憶管理デバイス338は、各I／Oマネージャ362と、それぞれのI／Oマネージャ362に割り当てられるブロックの隣接する一組とを関連させるデータベースを維持管理を行なう。I／Oマネージャ362に関連したデータ分類装置384は、各I／Oマネージャがそれに割り当てられたブロックに関連したタスクを遂行するだけを確実にするために、そのデータベースを使用する。ある実施例においては、この方法では、記憶管理デバイス338中のI／Oマネージャ362の合計数の一部分を稼動させて、単一の時刻データ記憶部とし、一方では他のI／Oマネージャ362の一部分を、他の付加的な時刻データ記憶部にさせることが可能となる。I／Oマネージャ362の数量を増加させることは、時刻データ記憶部の数量を増加させるので、この方法は自在に規模の拡張させることが可能であり、これにより記憶管理デバイス338を能率的に稼動させることが可能となる。またこの方法は、複数個の時刻データ記憶部および複数個の現在データ記憶部から構成される単一の物理的記憶部36で用いることができる。この方法は独自に各データ記憶部を指定するので、各I／Oマネージャ362を特定の記憶ユニットに関連させるためには、限定された追加情報だけが必要となる。ある実施例においては、データ記憶部のブロック番号、時刻データ記憶部のブロック番号、およびタイムスタンプが、各I／Oマネージャ362を特定の記憶ユニットに関連させるために必要な唯一の追加情報である。
【０１３９】
ある実施例においては、I／Oマネージャ362は、各々時刻に関する特定のウィンドウに対応する一連の制御情報テーブルを維持している。例えば、時刻9:00と9:05との間にI／Oマネージャ362によって処理される全てのI／Oは、ある一つのテーブルに記憶され、その一方で時刻9:05と9:10との間に発生したI／Oは、他のテーブルに記憶される。この実施例のバージョンでは、これ等のテーブルは、固定サイズである。全てのテーブルが現在使用中であるテーブルを除いて一杯であるので、テーブルが固定サイズであることにより、一つのテーブルに対する各質問の処理時刻が直ちに決定される。このように現テーブル以外の処理時刻は、全てのテーブルで同一である。テーブル・サイズは固定されているが、各テーブルによってカバーされる時間的な期間は、複数の書込みコマンドの周期が可変的であり、また各コマンドに関連したターゲット記憶ユニットのサイズも可変的であるので、同様に可変的である。例えば、関連するI／Oマネージャ362が、平均して、200,000個の書込みコマンド、毎3000単位時間を処理する能力があった場合、600,000単位入力を限界とするテーブルは、9,000単位時間で一杯となる。しかしながら、この関連するI／Oマネージャ362が、200,000個の書込みコマンド、毎1000単位時間を受信した場合、この同一サイズ・テーブルは、3000単位時間で一杯となる。この実施例のバージョンにおいて、このテーブルは、データ記憶部ブロック番号、時刻データ記憶部・ブロック番号、そして関連するcopy-on-write動作（書込み動作上のコピー）が何時に実行されたかを示すタイムスタンプ、とで構成されている。
【０１４０】
テーブルが満たされるときに、I／Oマネージャ362は次の3つを行なう：
【０１４１】
1）I／Oマネージャ362は、新規な入って来る書込み動作のための新しいテーブルをつくる。
【０１４２】
2）I／Oマネージャ362は、これらの制御情報テーブルに記載し、インデックスを付ける別々のテーブル（例えばマスターテーブル）に一つの入力をつくる。マスターテーブルには、テーブル名と、そのテーブルがカバーできる時間幅、すなわちテーブルの生成時刻から最後の入力がそのテーブルに記録された時刻までの時間幅、が含まれている。ある実施例において、このマスターテーブルは、それが関連するI／Oマネージャ362に対するローカルである。
【０１４３】
3）I／Oマネージャ362は、所与のテーブルの全てのI／Oを表すビットマップを生成する。このビットマップは、所与のブロック幅のためのビットを有する。このビットマップは、各ビット単位で表されるブロック幅を決めるために調整される。従って、ある実施例においては、ビット0が、ブロック0-15、ビット2が16-32をブロック、等を表す。各ビットが表すデータ量は、領域サイズと呼ばれる。
【０１４４】
この領域サイズは、調整可能でもある。このように、この領域サイズが平均I／Oリクエストサイズか最小限のI／Oリクエストサイズに近づくほど、ビット上のエラー率は、減少する。ある実施例においては、最小限のI／Oリクエストサイズは、1つのセクターまたは512バイトである。動作中に、この領域サイズが128キロバイトとすると、ユーザがデータをブロック2-10に書き込む場合、第１ビットがセットされることになる。しかしながら、ブロック85が該当するデータで参照されているかを判断するためにビットマップが使用されたとすると、このビットマップはエラー率表示を提供することになる。
【０１４５】
領域サイズが減少するにつれて、エラー率も減少し、実際にはゼロになることもある。しかしながら、この領域サイズが減少すると、そのビットマップを記憶するために、より多くのメモリおよびディスク・スペースが必要となる。しかしながら逆に、領域サイズが増加するにつれて、エラー率は増加するが、しかしビットマップの必要メモリは減少することになる。ある実施例においては、各I／Oマネージャは、積極的にエラー率とビットマップのサイズのバランスをとる領域サイズを選択するように構成される。
【０１４６】
ある実施例において、テーブルが満杯になった時にそのテーブルを閉鎖または封止するために、I／Oマネージャによって必要とされる動作のインパクトは、最小化されるが、これは、新しいテーブルへ移動が、連続するI／Oストリームと非同期で実行されるためである。
【０１４７】
時刻ベースのデータ記憶部（例えばデータ記憶部B）を生成させるために、特定のデータ復旧時刻が必要な場合には、動作に関する3つのレベルが、I／Oマネージャ362によって実行されなければならない。
【０１４８】
1）I／Oマネージャ362は、最初に関連するテーブルを識別する。ユーザがT-500のデータ復旧時刻をリクエストする場合、I／Oマネージャ362は、時刻T-500とリクエスト時刻との間に発生したI／O動作が含まれる制御情報テーブル用のマスターテーブルをスキャンする。I／Oマネージャは、それから、該当するI／O動作を含む各々の制御情報テーブルのためのビットマップを取り出す。
【０１４９】
2）I／Oマネージャ362は、それから取り出された全てのビットマップに対してOR演算を行いマスター・ビットマップを生成し、それら個々のビットマップとマスター・ビットマップとを保存する。一旦OR演算が終了すると、リクエストされたブロックが、従前（すなわち、T-500およびリクエスト時刻との間）の書込み動作に関与していたかどうか判断する潜在的読出しリクエストのパーセンテージを評価するために、マスター・ビットマップが用いられることができる。あるブロックがその時書込み動作に関与していない場合、現在データ記憶部からのデータが、そのブロックに用いられる。現在データ記憶部からのデータの取り出しと表示は、実質的にリアルタイム動作である。領域ビットがマスター・ビットマップ中にセットされている場合、I／Oマネージャ362は、どのビットがその領域に設定されているかを判断するために、最も古いものから最新ものまで個々のビットマップをスキャンし始め、そして時刻データ記憶部のI／O動作の位置を求めるために、ビットマップの該当するテーブルをスキャンする。これらの動作は、現在データ記憶部からのデータの取り出しより遅いが、それらはシステムによって常に実行されている。
【０１５０】
3）I／Oマネージャ362が領域マップを生成し始め、これにより個々の制御情報テーブルに記載されているブロックのコピーが、メモリに保存される。この動作が終了したときに、データのための時刻データ記憶部に対する読出しリクエストのための時間遅延が減少する。これは、その読出しリクエストが、そのメモリに再び向かい、特別に別のテーブル・スキャンもまず必要としない（あるとしても）為である。
【０１５１】
上述の第１ステップが完了していると、I／Oマネージャ362は、関連のリクエストを開始するので、記憶管理デバイス38の応答時間は、上述のアプローチによって短縮することが出来る。大部分のアプリケーションにおいて多くの場合、現在データ記憶部は、時刻データ記憶部の生成のために必要な大部分のデータを提供することが出来る。これは時刻データ記憶部は、比較的最近の時点、例えば1分、1時間、1日に、生成されるためである。全データ記憶部と比較して、それらの時間セグメント内で典型的に変化するデータ量は小さい。各マスターテーブルは、500,000〜5,000,000レコードを含むことができ、それでも各テーブルは、一定の時間内に検索することが出来る。このように、ほんの数千入力のマスターテーブルは、２テラバイトの物理的な記憶部36をサポートするアプリケーションで使用することが可能となる。
【０１５２】
図11を参照して、現在データ記憶部制御装置472は、現在データ記憶部制御装置472が配置されている記憶デバイス／記憶ユニットの組み合わせに対するリクエストを処理する。各現在データ記憶部制御装置472は、制御プレーン568（図12）経由で、ホスト・インターフェース361（図10）からI／Oマネージャ462まで送信される最終制御情報を受信する。現在データ記憶部制御装置472は、その制御要求に関連したデータが論理的ユニットに書き込まれることを識別し、そしてターゲット・データ位置に現れた過去データがコピーされて、記憶管理デバイス538によって他に保存されたこと確認するために、この制御情報に基づいて工程管理表を生成する。
【０１５３】
同様に、時刻データ記憶部制御装置476は、時刻データ記憶部制御装置476が配置されている記憶デバイス／記憶ユニットの組み合わせに対するリクエストを処理する。各八は、プロセッサーモジュール378のデータ分類装置384によって登録される。
【０１５４】
I／Oマネージャ362は更に、I／Oルーター470を含む。現在データ記憶部制御装置372および時刻データ記憶部制御装置376による指示に従い、I／Oルーター470は、データを移動することに対して責任があるソフトウェアモジュールで構成されている。
【０１５５】
I／Oルーター470、現在データ記憶部制御装置472、機能的記憶装置474、および時刻データ記憶部制御装置476のうちの各1台が図示されているが、I／Oマネージャ362は各一つ以上を含むことができる。更にこれらの要素は、図11に示される構成とは別の構成においても通信することができる。例えばある実施例においては、I／Oマネージャ462は、複数の時刻データ記憶部制御装置476を含むことが出来る。
【０１５６】
ここで図12に関連して、他の実施例およびより抽象的な表現では、記憶管理デバイス538には、複数の相互モジュール間のコミュニケーション用に使用するデータプレーン566および制御プレーン568が含まれる。また記憶管理デバイス538は、複数のホスト・インターフェース561、I／Oマネージャ562および物理的な記憶部・インタフェース564も含む。これらのコンポーネントは、前述の図に示すように、特定のプロセッサーモジュール上に配置されているが、効率性およびエラー低減のために、それらは負荷を共有するために共同して稼動するこれらコンポーネント集合体であってもよい。
【０１５７】
ホスト・インターフェース561および物理的な記憶部・インタフェース564は、データプレーン566上で相互にデータ通信を行なう。なおこのデータプレーン566は、上記のように、ダイレクトメモリアクセスおよび内部ネットワーク380（図10）によって通信を行なう。制御情報（例えば制御パケット、メタデータ・パケット）は、ホスト・インターフェース561とI／Oマネージャ562間、そしてI／Oマネージャ562と物理的記憶装置インタフェース564間を、制御プレーン568経由で通信される。制御プレーン568は、内部プロセッサ通信のメカニズム、および内部ネットワーク380（図10）を使用して、実行される。対象データは、ホスト・インターフェース561と物理的な記憶部・インタフェース564間を、データプレーン566経由で通信される。
【０１５８】
部分的には、記憶管理デバイス338によって使用される待ち行列システムのため、前述の最適化動作が実行される。この待ち行列システムは、I／Oマネージャ362によって処理されるI／O情報（例えば制御パケット、メタデータ・パケット）を順序立てる。すなわちこの制御情報は、I／Oマネージャ362が制御情報を受け取った順番に待ち行列に入れる入信待ち行列の対象となる。
【０１５９】
ある実施例においては、複数個の制御パケットは、より能率的にパケットを処理するために、接合され、処理順序を変更され、および／又は戦略的に遅延される。図10を再度参照して、I／Oマネージャ362は、互いから独立している制御パケットの群である制御パケットの「べき等元群」を識別し、追跡する。通常、このべき等元群グループは、他のパケット・グループより能率的に処理されることができるグループであり、例えば、べき等元群グループは、より迅速に処理される。例えば仮に、時刻T0でブロック0-15に対する第１の制御が到着し、そして時刻T5でブロック8-31に対する第２の制御パケットが到着する場合、I／Oマネージャ362は、べき等元グループの時刻T0からT4までの全ての動作を含ませ、時刻T5で（仮に時刻T0およびT5間では、他のいかなる制御パケットもオーバラップしない場合）で他のグループを開始する。この例では、処理、グループ化および実行の順序が、T5動作がT0動作の前に発生するのを防止するように選択される。例えば仮に、T5動作が最初に実行されたとすると、T0動作には、その従前データ内容（すなわちブロック8-15）中にT5の対象データの一部分を含んでしまうことになる。更にT5動作は、データが時刻Tlで存在したにもかかわらず、その従前データ内容中でT0からのデータを失ってしまうことになる。
【０１６０】
記憶管理デバイス338は、例えば、動作を「ワーカー用グループ」に分割することが出来るために処理効率を改善するカスタマイズされた制御パケット・グループを生成する多くの機会を生成する。なおこのタスク用グループは、縫うような方法または同時処理による独立処理方法で動作することができる。特定のブロックが上記のような「べき等元」でないという判断により、I／Oマネージャ362は、全てのブロック0-32はT0とT5動作と同じように、タスク用グループでも実行されることを確実にさせが、他の大規模のブロックに関連する動作は、再順序立てされる。従ってI／Oマネージャ362は、高級待ち行列理論を使用して、多重待ち行列上の「べき等元」関係を、常に識別し、分析し、管理することが出来る。
【０１６１】
システムは、ユーザが新しい動的または静的データ記憶部Bを生成することができるように構成されており、このデータ記憶部Bは、従前の時刻、例えば時刻T-500での主データ記憶部Aのデータ内容を表す。ターゲットモード・ドライバ382は、ホスト34が新規なデータ記憶部B.に命令を出すことができる第１通信リンク40上のターゲット装置の表示を生成する。I／Oマネージャ362は、機能的記憶装置474を、すなわち、現在データ記憶部Aを経由したデータ記憶部Bのためには満たされるない全てのブロックのマップを生成するために用いるが、それ等のブロックは、データ復旧時刻T-500以降は現在データ記憶部Aにおいて上書きされている。主データ記憶部Aに対するI／Oが継続して送信される結果、そのマップは、更新され続ける。例えばユーザが、データ記憶部Aの一つのブロックを変更する度に、現在データ記憶部Aのターゲットブロックは、それが時刻T-500前に含んでいたのと同じデータを、もはや含まない。そのマップは、新しくターゲットブロックが時刻データ記憶部Aにコピーされるデータ位置を利用する。加えて、現在データ記憶部Aと時刻データ記憶部Aが、データ記憶部BのマップB中に正確に反映されいることを確実にするために、この全ての過程は同期していなければならない。これは、データ記憶部BへのI／Oリクエストが、データ源として誤ったブロックを識別するのを防止するためである。例えば、新規なブロックがデータ記憶部Aに書き込まれている場合、そのマップは、データ記憶部Aの従前のデータ内容の時刻データ記憶部内のデータ位置で更新される。記憶管理デバイス538は、データ記憶部Bに対するI／Oリクエストが、後の時点で正しいデータの位置を決めることを確実にするための方法を、使用する。
【０１６２】
［修正履歴リクエスト］
【０１６３】
一般に、他の態様において、本発明は、データ記憶部中のある一つのデータ位置に関する修正履歴を提供するための生成システム、方法および物品に関する。簡単に概説すれば、本発明のある実施例では、第１のコンピューティング装置（例えば上記のホスト）が、第２のコンピューティング装置（例えば上記の通りの記憶管理デバイス）に対して、第２のコンピューティング装置が管理するデータ記憶部中のデータ位置（例えばデータ記憶部の中のアドレス範囲）を識別する。この第１のコンピュータは、それからまた、第２のコンピューティング装置から、少なくとも指定されたデータ位置に記憶される一部のデータが修正された時刻リストをリクエストする。これは、データ記憶部中のデータ位置に関する修正履歴のリクエストである。第２のコンピューティング装置は、それからある実施例においては、そのデータ位置に記憶されているデータのある部分が修正された時刻リストによって応答して、任意的には、そのデータ位置のどの部分が、それらの時刻に修正されたかについて識別する。一般的に言って、データ位置に記憶されるデータのある部分が修正された場合、その部分は、データ記憶部のその部分に対する書込み動作の結果として修正されている場合が多い。
【０１６４】
ある実施例においては、データ記憶部中のデータ位置に関する修正履歴のリクエストは、バンド内の第２のコンピューティング装置で受け取られる。すなわち第１のコンピューティング装置から、第１のコンピューティング装置がデータ命令（例えば読込み動作および書込み動作）を通信するときに第１のコンピューティング装置が使用する通信プロトコルと同じプロトコルで、その修正履歴のリクエストは受け取られる。他の実施形態では、その修正履歴のリクエストは、バンド外の第２のコンピューティング装置で受け取られる。例えば、第１のコンピューティング装置がデータ命令を通信するときに、その修正履歴のリクエストは第１のコンピューティング装置により用いられる通信プロトコルとは異なる通信プロトコルで受け取られるか、異なるチャネルを介して受け取られるか、又はそれらの組み合わせを介して受け取られる。なお異なるチャネルとは、例えばグラフィカル・ユーザーインタフェースのようなユーザーインターフェースや、または第１のコンピューティング装置と異なるコンピューティング装置（例えば第２のコンピューティング装置または他のコンピューティング装置、例えば管理者のコンピューティング装置、または第三者のコントロール・センターにあるコンピューティング装置、等）のコンソール上のコマンドラインをいう。
【０１６５】
本発明のこの面は、例えばユーザ（例えばシステム管理者）がデータ記憶装置に記憶されるデータに関する課題に気づく場合、役立つことがある。その課題とは、例えば、ソフトウェアまたはハードウェアの誤操作の結果としての損なわれたデータ、または他の例として、管理者エラーの結果としてのアプリケーションにより上書きされたデータ、等である。課題の関連するデータ位置を判断すると、管理者は、そのデータ位置がいつ最終修正されたかを判断するために、そのデバイスについて質問することができる。その情報を用いて管理者は、それから指示された各時刻以前の時刻でのデータ記憶部の従前のデータ内容をデータ記憶装置が示すことを、リクエストすることができる。このような方法でユーザは、破損したデータが完全だったごく最近の有用な従前のデータ内容を、識別することが可能となる。
【０１６６】
あるアプリケーションおよびオペレーティングシステムは、例えば、データ記憶部における特定のエラーを検出すると、デバッグを容易にするために、エラーが検出された特定のデータ位置に関する情報を提供する。この種のデータ位置の情報がアプリケーションによって直接提供されると、その位置情報を使用して、上記の質問を生成してもよい。あるアプリケーションおよびオペレーティングシステムでは、他の実施例として、特定のファイルに関連したエラーを報告する。典型的には、オペレーティングシステムおよび／又はファイルシステムのツールは、このオペレーティングシステムおよび／又はファイルシステムによってそれらのファイルに割り当てられたデータ記憶位置を判断するために用いることができる。アプリケーション（またはオペレーティングシステム、デバイス、その他）に示されるデータ記憶部が、バーチャル化されている場合には、そのアプリケーション（またはオペレーティングシステム、デバイス、その他）によって提供されるデータ記憶位置は、そのデータ記憶装置によって示されるようにデータ記憶部の関連するデータ位置を識別するために、変換（非バーチャル化）される必要がある。
【０１６７】
1つの例示的実施形態において、データ記憶部のユーザは、アプリケーション（例えばデータベース・アプリケーション）により惹起された課題を通知される。アプリケーションから直接か、またはアプリケーションまたはオペレーティングシステムによって提供される情報を使用して間接的に、そのユーザは、その課題のデータ位置を判断する。ユーザは、例えば、I／Oエラーの非バーチャル化用の、アプリケーションやオペレーティングシステムで維持されているエラーログを分析するソフトウェア・ベースのツールを用いて、この決定をすることができる。ユーザは、それから、データ位置が最終修正された時刻を判断するために、その記憶装置に質問を行なう。例えば、この質問は、アプリケーションを使用したり、ユーザのコンピュータにあるソフトウェア・ベースのツールを使用したり、またはコントロールパネル、コンソールまたは他の手段を使用して記憶装置に直接質問したり出来る。ユーザは（ツール、その他を介して）、その修正履歴を受信することが出来る。それから記憶装置が、報告された修正時刻以前の各時刻での一つ以上の従前のデータ内容（例えば、一つずつ、または全て一度に）を提示するように、ユーザはリクエストする。そしてユーザは、問題が無い最も最近の利用できる従前のデータ内容を、確認するために、各従前のデータ内容をチェックすることができる。それからユーザは、例えば、その従前のデータ内容からデータ記憶部へデータをコピーしたり、その従前のデータ内容を使用し始めることも出来るし、または他の必要なアクションを行なうことも出来る。
【０１６８】
図13は、本発明のこの態様に係る修正履歴を提供することが出来る記憶システム630の一実施例を例示する。記憶システム630は、ホスト634、記憶管理デバイス638、および物理的な記憶部636を含む。ホスト634および記憶管理デバイス638は、第１の通信リンク640経由で相互に通信する。記憶管理デバイス638および物理的な記憶部636は、第２の通信リンク642経由で相互に通信する。通常、ホスト634、記憶管理デバイス638、物理的な記憶装置636および第１および第２の通信リンク640、642は、ここで記載されているホスト、記憶管理デバイス、物理的な記憶装置および第１および第２の通信リンクの能力を有し、更にそれ等は、ここで述べる付加的な機能を有する。また他の実施態様も可能でもあることに留意する必要がある。
【０１６９】
ある実施例においては、ホスト634は、少なくともホスト受信部681およびホスト送信部683を含む。ホスト受信部681およびホスト送信部683は、例えばリクエスト、命令およびリスポンス等を行なうことが出来る通信の送受信に有用な如何なる形態、手段、または方法で実行できる。ある実施例においては、ホスト受信部681およびホスト送信部683は、ハードウェアインタフェースを有するソフトウェアモジュールで実行可能であり、ここで云うソフトウェアモジュールは、通信を実行し、またはその必要な一部分を実行することが出来る。他の実施形態では、ホスト受信部681およびホスト送信部683は、単一のホスト・トランシーバ（図示せず）として実行できる。ホスト634は、記憶管理デバイス638と第１の通信リンク640を経由して通信するために、ホスト受信部681およびホスト送信部683を使用する。
【０１７０】
ある実施例においては、記憶管理デバイス638は、少なくとも記憶管理デバイス受信部687、判断モジュール689、そして記憶管理デバイス送信部691を含む。また記憶管理デバイス受信部687および記憶管理デバイス送信部691は、例えばリクエスト、命令およびリスポンス等を行なうことが出来る通信の送受信に有用な如何なる形態、手段、または方法で実行できる。ある実施例においては、ホスト受信部681およびホスト送信部683のように、記憶管理デバイス受信部687および記憶管理デバイス送信部691は、ハードウェアインタフェースを有するソフトウェアモジュールで実行可能であり、ここで云うソフトウェアモジュールは、通信を実行し、またはその必要な一部分を実行することが出来る。ある実施形態では、記憶管理デバイス受信部687および記憶管理デバイス送信部691は、単一の記憶管理デバイス・トランシーバ（図示せず）として実行できる。記憶管理デバイス638は、ホスト634と第１の通信リンク640を経由して通信しておよび／又は物理的な記憶部636と第２の通信リンク642を経由して通信するために、記憶管理デバイス受信部687および記憶管理デバイス送信部691を使用する。
【０１７１】
その一部のために、判断モジュール689は、後述する機能性を成し遂げることができるいかなる形態、手段、または方法で実行できる。例えば、判断モジュール689は、ソフトウェアモジュールおよび／又はプログラムとして、および／又はハードウェアデバイス、例えば特定用途向け集積回路（ASIC）またはフィールドプログラマブル・ゲートアレイ（FPGA））で、実行可能である。ある実施例において、判断モジュール689は、上記のI／Oマネージャー362（図10を参照）の一部として実行可能である。
【０１７２】
ある実施例においては、記憶管理デバイス638も、関連する現在データ記憶部644および時刻データ記憶部646を有する少なくとも一つのデータ記憶部643を含む。例えば、現在データ記憶部644および時刻データ記憶部646の一方または両方に関連したデータは、記憶管理デバイス638のメモリに記憶することが出来る。現在データ記憶部644および時刻データ記憶部646の一方または両方に関連するデータは、物理的な記憶部636に記憶されることができ、この物理的な記憶部636の一部に、直接記憶したり、或いはバーチャル化、等をしていてもよい。記憶管理デバイス638は、現在データ記憶部644の、そして時刻データ記憶部646のデータの経過情報を保有する。例えば、記憶管理デバイス638は、メモリおよび／又は物理的な記憶部636へ／からデータを読込み及び書込みを行ない、時刻データ記憶部646を維持するために、データへの指標およびポインタを使用する。またデータ記憶部643、その現在データ記憶部644、および時刻データ記憶部646は、それぞれデータ記憶部、現在データ記憶部、および時刻データ記憶部の能力を有し、またそれらの機能として実行され、更にここに開示された追加の機能を有する。さらに別の実施形態では、上述のように、記憶管理デバイス638は、複数のデータ記憶部、例えば2個、3個またはいかなる数のデータ記憶部をも含むことが出来る。
【０１７３】
前述したように、記憶管理デバイス638が、ホスト634からデータ記憶部643に対する書込み動作を受信したとき、記憶管理デバイス638は書込み動作の記録を維持する。ある実施例においては、記憶管理デバイス638は、copy-on-write手続きを使用し、履歴インデックスをアップデートする。例えば、書込み動作を受信した後で、かつ書込み動作を実行する前に、記憶管理デバイス638は、書込み動作に含まれる新しいデータによって上書きされることになっているデータ記憶部643から、全ての過去データをコピーする。すなわち記憶管理デバイス638は、データ記憶部643の中の新しい目的地に「旧」データを保存して、履歴インデックスをアップデートする。ある実施例において、例えば、書込み動作が発生する度に、記憶管理デバイス638は、過去データが上書きされた時刻を示すタイムスタンプを記録し、過去データが上書きされたデータ記憶部643中のアドレス範囲を記録し、そして過去データが現在記憶されるデータ記憶部643中の新しいアドレス範囲を記録する。したがって記憶管理デバイス638は、後述するように、データ記憶部643中のデータ位置に関する修正履歴のリクエストに応じる際に、参照されるインデックスを維持している。
【０１７４】
copy-on-write動作（書込み動作上のコピー）に関して記載されているが、ここに記載された原理は、データ変更のログまたはインデックスが記録される如何なるデータ記憶システムにも適用できる点を留意すべきである。例えば、上書きされる前に書込みされたデータにログする代わり、またはこのロギングと組み合わせて、そのデータ記憶位置への実際の書込みが、記録されたとすると、このシステムは、いつ上述のようにデータ記憶位置が修正されたかの情報を提供することが可能であり、そしてこの情報は変更のログまたはインデックスから決定されることができる。またある状況下では、データ記憶部への変更内容の全部ではなく一部は、記録され、そしてデータ記憶部は、この場合、利用可能な修正情報だけを提供すると留意すべきである。
【０１７５】
ここで図14Aを参照して、データ記憶部中のデータ位置の修正履歴を提供する方法700に関する一つの実施例の概要が示されいる。例えば図13の典型的な記憶システム630を用いて、まず記憶管理デバイス638は、ステップ704で、データ記憶部643中のデータ位置に関する修正履歴のリクエストを受信する。ステップ708で、記憶管理デバイス638は、受信したリクエストで識別されたデータ位置に記憶されたデータの、少なくとも一部が修正された一つの時刻を判断する。それから、ステップ712で、受信したリクエストに応答して、記憶管理デバイス638は、ステップ708で決定された少なくとも1つの時刻を送信する。オプションとして、ステップ710で、記憶管理デバイス638は、ステップ708で決定される毎に、データが前記決定された時刻に修正されたデータが記憶されているデータ記憶部643中のアドレス範囲を、識別する。ステップ714で、記憶管理デバイス638は、オプションとして、前記受信したリクエストに応答して、ステップ710で識別されたアドレス範囲を送信することもできる。
【０１７６】
より詳細には、ステップ704で、ホスト634は、その送信部683と第１の通信リンク640を経由して、データ記憶部643中のデータ位置に関する修正履歴のリクエストを送信する。このリクエストは、リクエストをすることに有用ないかなる形式または方法で送信してもよい。ある実施例においては、例えば、そのリクエストは、データパケットの形で送信される。そのリクエストは、記憶管理デバイス638の受信部687で受け取られる。ある実施例においては、そのリクエストにおいて識別されたデータ位置は、データ記憶部643中のアドレス範囲にある。このアドレス範囲は、例えばLBAおよびデータ長によって示されることができる。ある実施例においては、LBAはアドレス範囲の始まりを識別し、そしてデータ長はアドレス範囲の長さを識別する。例えば、ある実施例においては、データ記憶部643の記憶アドレス空間は、ブロック（例えばセクター）に分割されており、各ブロックは、データ長512バイトである。この場合、LBAは、一つの特定の512バイトのブロックを示すために用いられ（すなわちアドレス範囲の初めある512バイト）、そしてデータ長は、アドレス範囲中に512バイトのブロックが幾つ含まれているかを示すために用いられる。例えば、ホスト634が、バイト8192で始まり、そして4096バイトの長さであるデータ記憶部643のアドレス範囲のための修正履歴を、リクエストする場合に、このリクエストには、LBAが16、データ長が8、が含まれる。
【０１７７】
記憶管理デバイス638が、データ記憶部643中のデータ位置のための修正履歴のリクエストを受信した後、記憶管理デバイス638の判断モジュール689は、ステップ708で、少なくともそのデータ位置に記憶されている一部のデータが修正された一つ以上の時刻を、判断する。ある実施例において、例えば、判断モジュール689は、データ記憶部643にされた（例えば実行された書込み動作がされた）修正一覧を示した前述の履歴インデックスを解析する。このインデックスは、例えば、データ記憶部643の時刻データ記憶部646の一部として記憶される。判断モジュール689は、前記リクエストされたデータ位置のアドレス範囲と少なくとも部分的にオーバラップするアドレス範囲にあるデータに対して、それから修正一覧に示された修正の内のどの修正が行なわれたのかを決定し、かつその修正が行なわれた時刻を記録する。しかしながら、リクエストされたデータ位置のアドレス範囲にあるデータに、修正がされなかった場合もあり得る。この場合、記憶管理デバイス638は、ステップ712（後述する）で、否定応答を送信する（すなわちリクエストされた位置のアドレス範囲のデータが修正された時刻がないことを、示す応答を送信する）。
【０１７８】
一般に、修正履歴のリクエストを受信する前には、データ記憶部643中のデータ位置に記憶されたデータの、一つ以上のサブセット、交差する部分、スーパーセット、および／又は全体セット、等が既に一又は複数の時刻に、修正されている。例えば、記憶管理デバイス638によって受信したリクエストは、アドレス範囲（LBA0、データ長64）を有するデータ位置の修正履歴のためにのリクエストであり得る。このリクエストを受信する前に、アドレス範囲（LBA0、データ長8）（すなわち位置のサブセット）に記憶されているデータ、またアドレス範囲（LBA62、データ長16）（すなわち交差する部分）に記憶されているデータ、またアドレス範囲（LBA0、データ長128）（すなわちスーパーセット）に記憶されているデータ、および／又はアドレス範囲（LBA0、データ長64）（すなわち全体セット）に記憶されているデータ、等は、一又は複数の時刻に、修正されている。ある実施例においては、ステップ708で、これらのセット又は部分（および／又は、リクエストされたデータ位置のアドレス範囲と少なくとも部分的にオーバラップする他のいかなるセット又は部分）が修正された回数を決定した後に、記憶管理デバイス638の判断モジュール689は更に、ステップ710で、これら以前に修正されたセット又は部分のアドレス範囲を、識別する。
【０１７９】
ステップ712で、記憶管理デバイス638は、例えば図13の実施例では、その送信部691を介して、そして第１の通信リンク640経由で、データ位置に記憶された少なくとも一部のデータが修正された所定の一又は複数の所定の時刻データを送信する。オプションとして、ステップ714で、記憶管理デバイス638は、加えて、その送信部691を介して、そして第１の通信リンク640を通じて、その一又は複数の所定の時刻に修正された、アドレス範囲の一つ以上の識別されたセットを、送信することができる。これ等の一又は複数の所定の時刻データおよび／又はアドレス範囲の一つ以上の識別されたセットは、この種の情報を提供するために役立ついかなる形式または方法で送信してもよい。例えば、その情報は、データパケットの形式で送信される。ある実施例においては、ホスト634は、その受信部681で、これらの一又は複数の所定の時刻データおよび／又はアドレス範囲の一つ以上の識別されたセットを受信する。またオプションとして、送信部は、修正されたデータを送信することができる。
【０１８０】
ある実施例においては、記憶管理デバイス638は、単一のパケットの修正情報を送信する。例えば、一つの送信されたパケットは、修正されたアドレス範囲の各々のセットを識別し、各々のセットのために、それが修正された時刻の一覧を示す。他の実施形態では、記憶管理デバイス638は、所定の時刻データと、それとは別に、例えば別々のパケットで、アドレス範囲の識別されたセットを送信して、その所定の時刻データをアドレス範囲の識別されたセットに関連づけるために、更にホスト634に追加情報を提供する。さらに他の実施例では、記憶管理デバイス638は、所定の時刻に修正される前に、アドレス範囲の識別されたセットに記憶されたデータを、ホスト634に送信する。この際、記憶管理デバイスは、どの所定の時刻および／又はアドレス範囲のセットが、その後に修正されたデータの所与の部分に対応するかについてを識別する。
【０１８１】
図14Bは、一実施例である方法700’を表し、これは図13に示した例示的な記憶システム630を使用し、データ記憶部中のデータ位置の修正履歴を提供する方法であり、かつ図14Aの方法700のバリエーションである。一般的に言って、本願明細書において記載される場合を除いて、方法700’のステップは、上記の方法700のステップと同じまたは類似の方法で実行される。
【０１８２】
ある実施例においては、方法700と同様に、記憶管理デバイス638は、ステップ704’で、データ記憶部643中のデータ位置に関する修正履歴のリクエストを受信する。しかしながら本実施例においては、この修正履歴のリクエストは、リクエストの中で識別されたデータ位置に記憶されたデータの一部分でなく全データが修正された時刻ごとのリストに対するリクエストである。したがって記憶管理デバイス638は、データ位置に記憶されるデータの全てが修正された少なくとも一つ時刻を、ステップ708’で決定し、その少なくとも一の決定した時刻データを、ステップ712’で受信したリクエストに応答して送信する。オプションとして、ステップ714’で、記憶管理デバイス638は、受信したリクエストに応答して、少なくとも一つの所定の時刻から開始して、その全データが修正されたデータ記憶部643中のアドレス範囲を、送信することができる。送信された場合、このアドレス範囲は、修正履歴のリクエストにおいて識別されるデータ位置と同様となる。
【０１８３】
上記の方法700’の実施例において、修正履歴のリクエストにおいて識別されたデータ位置に記憶されるデータの全ては、修正されたが、全て同時に、リクエストの条件が満たされるために、必ずしも修正された必要があるというわけではなかった。他の方法では、修正履歴のリクエストで識別されるデータ位置に記憶されたデータの少なくとも一部分は、方法700’のステップ708’で記憶管理デバイス638で決定された前記少なくとも一つの時刻と異なる時刻に（すなわち、その後の時刻に）修正されていたこともあり得る。例えば、修正履歴のリクエストにおいて識別されるデータ位置に記憶されている全データが、第１の時刻Tlで修正される場合、全データではなく、データの第１の部分は、第２の時刻T2で修正され、また全データではなく、そのデータ位置に記憶されたデータの第２の部分は、第３の時刻T3に修正され（データの第１の部分および第２の部分は、修正履歴のリクエストにおいて識別されるデータ位置に記憶されているデータの全てに対するものである）、そしてそのデータ位置に記憶される全データは、第4時刻T4に修正され（Tl、T2、T3およびT4は、時刻順に発生する）と仮定すると、ステップ708’で、記憶管理デバイス638が、そのデータ位置に記憶され、修正されている全てのデータを判断する複数の時刻は、時刻Tl、時刻T2および時刻T4である。
【０１８４】
方法700’で開示したように、ユーザが、そのデータ位置に記憶される全データが破損し交換しなければならないことを知っている場合（例えば、全JPEGファイルが破損しているとユーザが知っている場合）、特定のデータ位置に記憶された単に部分的データでなく全データが修正された時刻ごとのリストは、特に有用である。ステップ708の記憶管理デバイス638で決定した複数の時刻を使用し、ユーザはそれから、記憶管理デバイス638が、その決定された時刻の前の時刻でのそのデータ位置にあるデータ内容を生成することを、要求することが出来る。ユーザは、このことにより、全データが完全だった（すなわち破損していない）ごく最近の時刻を識別することが可能であり、そのデータ位置のデータを、そのごく最近の時刻にデータ位置に存在したデータに、復旧変更することを選択することができる。
【０１８５】
図15には、ホスト（例えばホスト634）によって本発明による記憶管理デバイス（例えば記憶管理デバイス638）に送信される、データ記憶部（例えばデータ記憶部643）中のデータ位置に関する修正履歴のリクエスト800、を示す例示的な実施例を表す。ある実施例において、図示するように、リクエスト800は、データパケット804の形式を有している。データパケット804は、少なくとも一部のI／Oコマンドを含み、それは標準入出力コマンドフォーマット、例えばSCSIコマンドフォーマットを有している。
【０１８６】
ある実施例においては、データパケット804は、16バイトのリクエストデータを含む。バイト0において、オペレーションコードは、実行されることになっているリクエスト（例えば、修正履歴をデータ記憶部643中のデータ位置に提供すること）のタイプを識別する。例えば、このオペレーションコードは、少なくともデータ記憶部643中のデータ位置に記憶される一部のデータが修正された少なくとも一つの時刻のリクエスト、またはデータの一部分でなく全データが修正された時刻ごとのリストのリクエストと、それぞれ関係している。典型的なオペレーションコードはCIhであり、それはSCSIプロトコルでベンダー特有のリクエスト用に割り当てられるコードである。
【０１８７】
バイト1の3つの最上位ビット（すなわちビット5-7）は、将来の使用のために予約されている。オプションとしては、バイト1の残りの5つの最下位ビット（すなわちビット0-4）は、サービス動作フィールド（例えばバイト0のオペレーションコードで識別される、より一般のリクエスト中で実行される機能を識別するコード値を含んでいる領域）を提供する。あるいは、もう一つの実施例では、バイト1のビット0-4も、将来の使用のために予約されている。
【０１８８】
バイト2-9はLBAのためであり、それは修正履歴がリクエストされる位置の第１の記憶ユニット（すなわち第１のブロック）を識別する。バイト10-13はデータ長のためにあり、それは記憶ユニットの数を示し、そしてデータ記憶部643中のデータ位置を順次形成するLBAによって識別される第１の記憶ユニットを含む。ある実施例においては、LBAおよびデータ長は、アドレス範囲を形成する。
【０１８９】
バイト14は、将来の使用のために予約されている。例えばバイト14は、RelativeCheck領域として使われ、このRelativeCheck領域は、記憶管理デバイス638によって戻される一つ以上の時刻が相関的であるか絶対であるかを指示するものである。例えばRelativeCheck領域が0である場合、記憶管理デバイス638によって戻される一つ以上の時刻は、現在時刻に対して相対時刻であることを意味する。換言すればRelativeCheck領域が0ということは、記憶管理デバイス638によって戻される一つ以上の時刻は、現在時刻から測定した過去の時刻であることを示す。一方で例えば、RelativeCheck領域がゼロでないである場合、記憶管理デバイス638によって戻される一つ以上の時刻は、他の時刻に関係ない絶対時刻であることを示す。
【０１９０】
バイト15は、データパケット804の制御フィールドである。例えば、データパケット804が典型的SCSIコマンドフォーマットで実行される1つの具体例で、バイト15のビット0は、2つ以上のコマンドに渡る継続タスク用のリクエストを指定するために用いられる（例えば、そのようにセットされる）。またバイト15のビット1は、連結されたコマンド間に割り込みをリクエストする方法を提供する。またバイト15のビット2は、特定の状況の下で、自動状態への移行を設定すべきかどうかが設定され、そしてバイト15タクシーのビット3-5は、リザーブ用であり、そして又、ビット6-7は、ベンダー設定用ビットである。
【０１９１】
具体的に図16は、リスポンス900の例示的な実施例を示し、特にデータ記憶部643中のデータ位置に関する修正履歴用の、リクエスト800へのリスポンス900を示している。なおこのリクエストは、本発明に係る記憶管理デバイス638によってホスト634に送信される。ある実施例において、図示するように、リスポンス900は、データパケット904の形式である。データパケット904は、少なくとも一部のI／Oリスポンスを含むことができる。そして、それは標準入出力リスポンスフォーマット、例えばSCSIリスポンスフォーマットであってもよい。
【０１９２】
ある実施例においては、図示するように、データパケット904は、少なくとも30バイトの応答コードを含んでおり、後述するように、応答コードの付加的なバイトを含むことができる。図16は、応答コードの典型的なバイトに含まれる各ビットを識別している。バイト0-1は、将来の使用のために予約されている。
【０１９３】
バイト10-13は、リクエスト800において識別されるデータ位置の少なくとも一部を含むセット中の、第１の記憶ユニット（すなわち第１のブロック）を指定するLBAに使用するものである。換言すれば、例えば、バイト10-13において表示されるLBAは、リクエスト800中で識別されるデータ位置のサブセットや、リクエスト800中で識別されるデータ位置の交差する部分や、リクエスト800中で識別されるデータ位置のスーパーセットや、或いはリクエスト800中で識別されるデータ位置の全体セット、等の第１の記憶ユニットを識別する。更にバイト14-21は、はデータ長のためにあり、それは記憶ユニットの数を示し、それは順次セットを形成し、バイト10-13のLBAによって識別される第１の記憶ユニットを含む。ある実施例においては、LBAおよびそのデータ長は、そのセットのためのアドレス範囲を形成する。この情報によって示されるように、そのセットの識別されたアドレス範囲に記憶されたデータは、記憶管理デバイス638がリクエスト800を受け取った時刻以前に修正されいる。同様にバイト22-29は、バイト10-21において識別されるセットのアドレス範囲に記憶されたデータが、修正された時刻を示す決定された変更時間のために使用される。
【０１９４】
バイト10-29（すなわちLBA、データ長、および決定された変更時間）は全体として、一つの組を構成する。データパケット904は、いかなる数の組（例えば1個組み、2個組み、またはそれ上の個数組み）を含むことができる。データパケット904のバイト30-nは、組みの繰り返しのためである。ある実施例においては、データパケット904の範囲内に含まれる組みの数は、または応答するのは、リクエスト800において識別されるデータ位置に記憶したデータの少なくとも一部が、その記憶装置が利用できる情報によって修正された時刻数である。バイト2-9は、データパケット904内の組み数を表すインジケータ用である。
【０１９５】
ある実施例においては、バイト22-29において表示された決定された変更時間は、相対時刻である。あるいは、もう一つの実施例では、この決定された変更時間は、絶対時刻である。ある実施例においては、各組みは、例えば、その組み中に含まれる決定された変更時間が相関的であるか絶対的かどうかを示すための、RelativeCheck領域として使われる付加的なバイトを含むことができる。あるいは、もう一つの実施例では、データパケット904のn個組みの中に含まれる決定された変更時間の全ては、全て相関的であるか絶対的であり、1つの組みと他の組みでは相違はない。そのような実施例においては、例えば、予約されたバイト0-1のうちの1つは、データパケット904のn個組み中に含まれる決定された変更時間の全部が、相関的であるか絶対的を示すためのRelativeCheck領域として使われることができる。上述のように、例えばRelativeCheck領域が0である場合、一つ以上の決定された変更時間は、現時刻に対して相対的である。一方では、例えばRelativeCheck領域がゼロでない場合、記憶管理デバイス638によって戻される一つ以上の決定された変更時間は絶対的であり、他の時刻には関係がない。
【０１９６】
ある実施例においては、組みの中に含まれる決定された変更時間が相関的である場合、その組みによって識別されるセットのアドレス範囲に記憶されるデータのための実際の修正時刻は、決定された変更時間をリスポンス900が生成された時刻から減算することによって算出される。このような実施例では、リスポンス900は、タイムスタンプが押されていてもよい。一方では、組みの中に含まれる決定された変更時間が、絶対的である場合、その組みによって識別されるセットのアドレス範囲に記憶されたデータのための実際の修正時刻は、単に決定された変更時刻である。
【０１９７】
図17-図20には、データ記憶部643中のデータ位置に関する修正履歴が、どのようにして得られるかの1つの実施例を示す。図17は、実施例のための時間軸1000を表す。時間軸1000は、各々の時刻Tl、T2、T3、T4およびT5でのデータ記憶部643に対する異なる書込み動作を例示する。各書込み動作は、「Wr（LBA、データ長、データ）」として表示され、（LBA、データ長）が、データが書き込まれるアドレス範囲を表す。したがって時刻Tlでは、データは、アドレス範囲（LBA0、データ長8）に書き込まれており；時刻T2では、データは、アドレス範囲（LBA62、データ長16）に書き込まれおり；時刻T3では、データは、アドレス範囲（LBA100、データ長35）に書き込まれており；時刻T4では、データは、アドレス範囲（LBA0、データ長64）に書き込まれており；そして、時刻T5では、データは、アドレス範囲（LBA0、データ長128）に書き込まれている。
【０１９８】
図18は、この実施例のための履歴インデックス1100の例示的実施形態を表す。上記の通りに、特定の書込み動作を受信後で、かつこの特定の書込み動作の実行以前に、記憶管理デバイス638は、書込み動作によって識別されるアドレス範囲に記憶されているデータをコピーして、新しい目的地にそれを保存する。記憶管理デバイス638は、それから書込み動作を実行して、上記の通りに履歴インデックス1100をアップデートする。例えば、時刻Tlで書込み動作を実行した後に、記憶管理デバイス638は、履歴インデックス1100の第２の列に示すように、書込み動作が実行された時刻Tl、データが書き込まれていたアドレス範囲（LBA0、データ長8）、および時刻Tlの以前にアドレス範囲（LBA0、データ長8）に記憶されていたデータが現在記憶される新しいアドレス範囲（LBA1000、データ長8）を記録する。図18に示すように、履歴インデックス1100は、書込み動作T2、T3、T4およびT5のそれぞれが実行された後に、同じようにアップデートされる。
【０１９９】
この実施例よると、時刻T5後のある時刻に、ホスト634は、記憶管理デバイス638から、データ記憶部643中のデータ位置に関する修正履歴をリクエストする。例えば図19を参照して、ホスト634は、図15の参照で記載したように、データパケット804の形式をしたデータパケット1204を、記憶管理デバイス638へ送信する。この例では、ホスト634は、少なくともアドレス範囲（LBA0、データ長64）に記憶されているデータの一部が修正された少なくとも一つの時刻をリクエストする。したがって、データパケット1204のバイト0のオペレーションコードは、そのリクエストと関係し、データパケット1204のバイト2-9は、LBAが0であることを示すためにセットされ、そしてデータパケット1204のバイト10-13は、データ長が64であることを示すためにセットされる。
【０２００】
データ記憶部643中のアドレス範囲（LBA0、データ長64）のための修正履歴ための上記リクエストを処理した後に（例えばデータ記憶部643に実行された書込み動作をリストする履歴インデックス1100を解析した後に）、記憶管理デバイス638は、ホスト634に応答する。例えば、図20の参照して、記憶管理デバイス638は、上述の図16に記載したデータパケット904の形式であるデータパケット1304（それは）を、ホスト634に送信する。この例では、データパケット1304のバイト2-9のインジケータによって識別されるように、データパケット1304は4個組みを含む。ここで図18および図20を共に参照して、バイト10-29（すなわちデータパケット1304の第１の組み）は、アドレス範囲（LBA0、データ長8）（すなわちリクエストされたアドレス範囲（LBA0、データ長64）のサブセット）が時刻Tlで修正されたことを示し；バイト30-49（すなわちデータパケット1304の第２の組み）は、アドレス範囲（LBA62、データ長16）（すなわちリクエストされたアドレス範囲（LBA0、データ長64）の交差している一組）が、時刻T2で修正されたことを示し;バイト50-69（すなわちデータパケット1304の第３の組み）は、アドレス範囲（LBA0、データ長64）（すなわちリクエストされたアドレス範囲（LBA0、データ長64）の全部の一組）が、時刻T4で修正されたことを示し;そして、バイト70-89（すなわちデータパケット1304の第4の組み）は、アドレス範囲（LBA0、データ長128）（すなわちリクエストされたアドレス範囲（LBA0、データ長64）のスーパーセット）が、時刻T5で修正されたことを示す。ホスト634は、データパケット1304を受信することによって、このことにより、少なくともデータ記憶部643中のアドレス範囲（LBA0、データ長64）に記憶される一部のデータが修正された時刻と、およびそれらの時刻に修正された対応するアドレス範囲、の両方を提供される。
【０２０１】
時間軸1000の時刻T3で発生した書込み動作は、アドレス範囲（LBA100、データ長35）に対するものであり、又そのアドレス範囲は、リクエストされたアドレス範囲（LBA0、データ長64）とオーバラップしないために、データパケット1304は、その書込み動作に関するいかなる情報も含まないことに注意すべきである。
【０２０２】
［記憶バッファ選択］
【０２０３】
一般に他の態様において本発明は、データ記憶装置のための一つ以上の記憶バッファを最適に選択するための方法と装置に関する。簡単に概説すれば、本発明の本態様のある実施例では、第１のコンピューティング装置（例えば上述の記憶管理デバイス）は、一時的または永久的記憶装置を必要とするデータを受信する。例えば、第１のコンピューティング装置は、第２のコンピューティング装置（例えば上述のホスト）から、一時的または永久的記憶装置を必要としている対象データを含む書込み動作を受け取る。この第１のコンピューティング装置は、まず最初に第１の記憶バッファに受信データを記憶して、それから受信データの冗長性を持たせてコピーを記憶するための、第１のコンピューティング装置内の一つ以上の付加的な記憶バッファを最適に識別する。記憶バッファは、例えば、第１のコンピューティング装置にあるいくつかのプロセッサーモジュールの内の1台に設けてもよい。
【０２０４】
本発明の本態様のある実施例において、第１のコンピューティング装置は、冗長性を持たせて受信データのコピーを記憶するための一つ以上の付加的な記憶バッファを、最適に確認するために、一つ以上のコスト方程式を評価する。更にある実施例においては、その第１のコンピューティング装置は、受信データの第１のコピーを、第１の最適に識別された追加記憶バッファに保存して、また更には、受信データの第２或いは更なるコピーを、第２或いは更なる最適に識別した付加的な記憶バッファに記憶することが出来る。したがって第１のコンピューティング装置は、冗長性を持った記憶能力を提供することができる。
【０２０５】
図21は、本発明の本態様による最適に一つ以上の記憶バッファを識別する記憶管理デバイス1438の一実施例を例示する。一般的に言って、記憶管理デバイス1438は、以下に開示する付加的な機能性を有した上述の記憶管理デバイスの能力を有し、またそれにより実行される。また他の実施態様も、可能であることを理解すべきである。
【０２０６】
ある実施例においては、記憶管理デバイス1438は、複数のプロセッサーモジュール、例えば第１のプロセッサーモジュール1478および少なくとも一つの第２のプロセッサーモジュール、例えば3個の第２のプロセッサーモジュール1478’、1478’’、1478’’’（一般に1478’）を含む。図21の記憶管理デバイス1438中に描かれている第１のプロセッサーモジュール1478および3個の第２のプロセッサーモジュール1478’は、しかしながら、単に図上の例示に過ぎない。さらに一般的にいえば、記憶管理デバイス1438は、いかなる数のプロセッサーモジュール1478（1478’）を含むことができる。例えば、プロセッサーモジュール1478、1478’の数量は、例えばスケーラビリティ、パフォーマンスおよびコスト、等の考慮すべき問題に基づいて増減されることができる。再び一般的に言って、プロセッサーモジュール1478、1478’は、上述の記憶管理デバイス（例えば図10に関して記載されたプロセッサーモジュール378）と、ここに開示する付加的な機能性との能力を有し、またそれにより実行される。
【０２０７】
ある実施例においては、記憶管理デバイス1438は、データを記憶するためのデバイスである（例えば、一時的にデータを記憶するための）。したがって、そのような実施例では、記憶管理デバイス1438は、データを記憶するための複数の記憶バッファ1463、1463’、1463’、1463’’（一般に1463）を含む。ある実施例において、例えば図21に図示するように、記憶管理デバイス1438の各プロセッサーモジュール1478、1478’は、少なくとも一つの記憶バッファ1463を含む。他の実施形態では、記憶管理デバイス1438のプロセッサーモジュール1478、1478’は、記憶バッファ1463を含む。さらに別の実施形態では、記憶管理デバイス1438は、一つ以上の記憶バッファ1463を含み、この記憶バッファは、記憶管理デバイス1438上でスタントアローンであり、そしてプロセッサーモジュール1478、1478’の一部でない。さらに別の実施例（単一のプロセッサーモジュール1478）において、1478’は、2つ以上の記憶バッファ1463を含むことができる。
一般的に言って、記憶バッファ1463は、上記の記憶バッファ（例えば図10に記載されている記憶バッファ363）と、ここで記載されている付加的な機能性との能力を有し、またそれにより実行される。例えば、記憶バッファ1463は、プロセッサーモジュール1478（1478’）の記憶領域296（図9を参照）中に含まれることができる。ある実施例においては、メモリ296全体が、記憶バッファ1463を形成する。他の実施形態では、記憶領域296の中のより少ない、しかし隣接するブロックが、記憶バッファ1463を形成する。
さらに別の実施形態では、例えば記憶領域296の中で数個のブロックがポインタによって結合され、記憶バッファ1463を形成する。記憶バッファ1463を形成する記憶領域296中のアドレス空間は、静的構造を有するか、または動作時に動的に割り当てられる。
【０２０８】
ある実施例においては、記憶管理デバイス1438の少なくとも一つのプロセッサーモジュール（例えば第１のプロセッサーモジュール1478および／又は少なくとも一つの第２のプロセッサーモジュール1478’）は、少なくとも受信部1493、送信部1495、評価部1497、そしてデータ演算部1499を含む。受信部1493および送信部1495は、各々いかなる形式、手段、または方法通信データの受信と送信に役立つ方法で実行することが出来る。なおこの通信データには、例えば通信リクエスト、命令およびリスポンス、等が含まれる。ある実施例においては、受信部1493および送信部1495は、ハードウェアインタフェースを有するソフトウェアモジュールとして実行され、このソフトウェアモジュールは、通信またはその必要な部分の仲立ちを実行することが出来る。他の実施形態では、受信部1493および送信部1495は、単一のトランシーバ（図示せず）として行なう。プロセッサーモジュール1478、1478’は、他のプロセッサーモジュール1478、1478’の一つ以上と通信するために、および／又は記憶管理デバイス1438以外の一つ以上のコンピューティング装置（図示せず）と通信するために、受信部1493および送信部1495を使用する。受信部1493および送信部1495は、異なるプロトコル、例えば図10のターゲットモード・ドライバ382や、図10の内部ネットワーク380に関連したトランシーバまたはそれらの組み合わせ、を用いたマルチプルデバイスとして実行することが出来る。
【０２０９】
それらの一部のために、評価部1497および／又はデータ演算部1499は、いかなる形式、手段、または後述する機能性を成し遂げることができる方法で行なうことができる。例えば、評価部1497および／又はデータ演算部1499は、マイクロプロセッサ上のソフトウェアモジュールおよび／又はプログラムとして実行可能であり、および／又は例えば特定用途向け集積回路（ASIC）またはフィールドプログラマブル・ゲートアレイ（FPGA）のようなハードウェアデバイスとして実行可能である。ある実施例においては、評価部1497およびデータ演算部1499は、上記のホスト・インターフェース361の一部として、例えばターゲットモード・ドライバ382（図10を参照）の一部として行なう。
【０２１０】
図22には、データを記憶するための方法1500の実施例について概要が記載されている。方法1500は、例えば図21の典型的な記憶管理デバイス1438を使用するが、この記憶管理デバイス1438中の複数のプロセッサーモジュール1478、1478’にあるプロセッサーモジュール1478、1478’の内で、第１のプロセッサーモジュール1478は、ステップ1504で、記憶すべきデータを受信する。第１のプロセッサーモジュール1478は、それからステップ1508で、第１のプロセッサーモジュール1478上の第１の記憶バッファ1463で、第１例の受信データ（例えば受信データ自体）を保存する。ステップ1512で、第１のプロセッサーモジュール1478は、複数の記憶バッファ1463の内の一つである第２の記憶バッファ1463を識別するために、第１のコスト方程式を評価し、ここで第２の前記受信データ（例えば受信データのコピー）を最適に記憶する。オプションとして、ステップ1516で、第１のプロセッサーモジュール1478は、複数の記憶バッファ1463の内の一つである第３の記憶バッファ1463を識別するために、第２のコスト方程式を評価し、ここで第３の前記受信データ（例えば他のコピー）を最適に記憶する。また更にオプションとして、ステップ1520で、前記第２の受信データは、前記第２の記憶バッファ1463に記憶され、そして前記第３の受信データは、前記第３の記憶バッファ1463に記憶される。さらにステップl516およびステップ1520で、更にいかなる数のコスト方程式（例えば第２、第３、第4および第5のコスト方程式、その他）が、いかなる数の記憶バッファ1463（例えば第３、第4、第5および第6の記憶バッファ1463、その他）を識別するために、評価されることができることを理解すべきである。なお記憶バッファ1463では、いかなる数の前記受信データ（例えば、第３、第4、第5および受信データ、その他の第6の例）を、最適に記憶する。都合よく、複数の記憶バッファ1463の内の一つである第２或いは更なる記憶バッファ1463での第２或いは更なる前記受信データを、最適に記憶することで、この受信データは、冗長性を持たせて迅速かつ効率よく記憶されることが可能である。このことにより障害時の許容範囲を改良して、全データに迅速かつ効率よくアクセス可能であり、記憶管理デバイス1438には、過負荷をかけることがない。
【０２１１】
より詳細には、ある実施例においては、第１のプロセッサーモジュール1478の受信部1493は、ステップ1504で、対象データを含む書込み動作を受信する。第１のプロセッサーモジュール1478の受信部1493は、例えば記憶管理デバイス1438以外のコンピューティング装置（図示せず）から、ネットワーク（図示せず）を経由して書込み動作を受け取ることができる。ステップ1508で、この受信した書込み動作は、まず最初に第１のプロセッサーモジュール1478の第１の（そして特定の実施例では）バッファ1463に記憶される。ある実施例においては、第１のプロセッサーモジュール1478が書込み動作を受信した後、そして受信した書込み動作をその第１の記憶バッファ1463に記憶した後に、第１のプロセッサーモジュール1478のデータ演算部1499は、第１の前記対象データが、生成され、第１のプロセッサーモジュール1478の第１のバッファ1463に記憶されるようにして、この対象データを残りの書込み動作から切り離す。ある実施例においては、この書込み動作は、対象データに加えて、少なくともある種の制御情報を含む。このような実施例では、第１のプロセッサーモジュール1478のデータ・オペレータ1499は、対象データをこの制御情報から切り離す操作を行なう。対象データを残りの書込み動作から切り離して、第１のプロセッサーモジュール1478のデータ演算部1499は、それから、前記対象データの第２の対象データ、或いはオプションとして更なる対象データを生成するために、第１の対象データをコピーする。
【０２１２】
ステップ1512で、第１のプロセッサーモジュール1478の評価部1497は、複数の記憶バッファ1463から第２の記憶バッファ1463を識別するために、第１のコスト方程式を評価する。この第２の記憶バッファ1463は、第１の対象データが、最初に記憶される第１のプロセッサーモジュール1478の第１の記憶バッファ1463と異なるものであり、前記第２の記憶バッファ1463は、第２の対象データを最適に記憶するためのものである。ある実施例においては、評価部1497は、第２のプロセッサーモジュール1478’に置かれた第２の記憶バッファ1463を識別する。そのような実施例において、第２のプロセッサーモジュール1478’が第１のプロセッサーモジュール1478とは異なるプロセッサーモジュールである為に、その第２の記憶バッファ1463に第２の対象データを記憶することは、第１のプロセッサーモジュール1478が故障した場合には、対象データを喪失することからプロテクトすることが出来る。
【０２１３】
ステップ1512でのコスト方程式を評価する際に、第１のプロセッサーモジュール1478の評価部1497は、様々なファクターを考慮することができる。例えば、ある実施例においては、第１の対象データがまず最初に記憶される、第１のプロセッサーモジュール1478中の第１の記憶バッファ1463以外の、記憶管理デバイス1438にある複数の記憶バッファ1463のそれぞれのために、前記第１のプロセッサーモジュール1478の評価部1497は、第１のプロセッサーモジュール1478からその記憶バッファ1463までの記憶管理デバイス1438内での物理的距離に、所定の価値を割り当てる。そのような実施例においては、第１のプロセッサーモジュール1478に対する物理的距離の最も接近した記憶バッファ1463が、第２の対象データを最適に記憶する第２の記憶バッファ1463として、評価部1497によって識別される。もう一つの実施例では、第１の対象データがまず最初に記憶される第１のプロセッサーモジュール1478の第１の記憶バッファ1463以外の、記憶管理デバイス1438中の複数の記憶バッファ1463のそれぞれのために、第１のプロセッサーモジュール1478の評価部1497は、その記憶バッファ1463の利用できるキャパシティーに、所定の価値を割り当てる。そのような実施例において、最も大きなキャパシティーを有する記憶バッファ1463が、第２の対象データを最適に記憶する第２の記憶バッファ1463として、評価部1497によって識別される。
【０２１４】
さらにもう一つの実施例において、ステップ1512でコスト方程式を評価する際に、そして記憶バッファ1463（それは第１のプロセッサーモジュール1478の第１の記憶バッファ1463とは、必然的に異なる）を含む一つ以上の第２のプロセッサーモジュール1478’のそれぞれのために、：第１のプロセッサーモジュール1478の評価部1497は、その第２のプロセッサーモジュール1478’に存在するデータ負荷に、所定の価値を割り当てる。ある実施例においては、問題のデータ負荷は、問題の第２のプロセッサーモジュール1478’と、記憶管理デバイス1438以外のデバイス（例えば上記のホスト）間の、入出力データ負荷である。或いは、もう一つの実施例では、例えば、問題のデータ負荷は、問題の第２のプロセッサーモジュール1478と少なくとも一つの他のプロセッサーモジュール1478（1478’）間の、例えばリクエスト、コマンド、そして応答の相互関連したデータ負荷である。これらの場合、最も低いデータ負荷値を有する第２のプロセッサーモジュール1478’中の記憶バッファ1463が、第２の対象データを最適に記憶する第２の記憶バッファ1463として、評価部1497によって識別される。
【０２１５】
ある場合には、複数の記憶バッファ1463の一つ以上が、複数のプロセッサーモジュール1478、1478’のサブセットによってアクセスだけ可能であるように、記憶管理デバイス1438は実行される。記憶バッファW、X、YおよびZをそれぞれ有するプロセッサーモジュールA、B、CおよびDを含む記憶管理デバイス1438（図示せず）では、プロセッサーモジュールA、B、Cだけが記憶バッファWにアクセスでき、同様にプロセッサーモジュールB、Cだけが記憶バッファXにアクセスでき、プロセッサーモジュールA、Cだけが記憶バッファYにアクセスでき、そしてプロセッサーモジュールA、Dだけが記憶バッファZにアクセスできるように構成してもよい。従って、更に他の実施例では、評価部1497は、第２の対象データを記憶する第２の記憶バッファ1463を識別するために、ステップ1512でコスト方程式を評価する。これにより、第２の記憶バッファ1463が、第１の対象データがまず最初に記憶された第１の記憶バッファ1463と共にアクセス出来る場合には、第１および／又第２の対象データにアクセスするプロセッサーモジュール1478の数を、最大化出来る。第１の対象データおよび／又は第２の対象データへアクセス出来るプロセッサーモジュール1478の数を最大化することは、対象データの一つを記憶する記憶バッファ1463、および／又は記憶バッファ1463が位置するプロセッサーモジュール1478が、万一データ処理が出来ない場合に、処理柔軟性および装置効率を最大にすることが出来る。この実施例の1つの実行時において、第１の対象データがまず最初に記憶する第１のプロセッサーモジュール1478の第１の記憶バッファ1463以外の、記憶管理デバイス1438中の複数個の記憶バッファ1463のそれぞれのために、第１のプロセッサーモジュール1478の評価部1497は、もし第２の対象データがその記憶バッファ1463に記憶されている場合には、第１と第２の対象データの少なくとも一つにアクセス可能な記憶管理デバイス1438中の幾つかのプロセッサーモジュール1478、1478’に対して、所定の価値を割り当てる。そのような実施例において、もし対象第２の対象データがそこに記憶される場合、第１および／又は第２の対象データへのアクセスを有しているプロセッサーモジュール1478の数を最大にするであろう記憶バッファ1463が、第２の対象データを最適に記憶する第２の記憶バッファ1463として、評価部1497によって識別される。
【０２１６】
さらに他の実施例では、第２の対象データを最適に記憶する第２の記憶バッファ1463を判断するために、第１のプロセッサーモジュール1478の評価部1497は、上記の全てのファクター、又はそのサブセットを考慮して、考慮する各ファクターに所定のウエイトを適用する。そのような実施例において、第２の対象データを記憶する第２の記憶バッファ1463は、考慮されるファクターで最高のウエイト組み合わせを呈する記憶バッファ1463である。実際には、各ファクターのウエイトは、特定のアプリケーション毎に変更されて付加される。
【０２１７】
加えて、もう一つの実施例では、複数の記憶バッファ1463の一つ以上のために、それらの記憶バッファ1463のために考慮されるファクターの一つ以上の上記ウエイトは、対象データのコピーを記憶することを、より望ましくしないことにする為に、前調整されることがある。例えば、それらの記憶バッファ1463に記憶されるデータ量を人工的に制限し、それによってそれらの特定の記憶バッファ1463に送られるリクエストを制御し／制限したり、および／又はバッファの性能や、従って記憶管理デバイス1438の性能に制限を設ける、等を行なうことが出来る。
【０２１８】
ある実施例においては、記憶管理デバイス1438は、受信した対象データの複数のコピーを保存する。従って、そのような実施例で、第１のプロセッサーモジュール1438の評価部1497は、ステップ1516で、第２のコスト方程式、そしてオプションとして第３、第4および第5の方程式も評価することが出来る。第２のコスト方程式の評価により、複数の記憶バッファ1463中の第３の記憶バッファ1463を識別する。なおこの第３の記憶バッファ1463は、第１、第２記憶バッファ1463とは異なり（例えば、第１、第２、第３の記憶バッファは、異なるプロセッサーモジュール1478、1478’に各々置かれることができる）、又この第３の記憶バッファに、第３の対象データが最適に記憶される。ある実施例においては、両方の第１および第２の記憶バッファ1463（第１のコスト方程式の評価によって、すでに識別されていた第２の記憶バッファ1463）は、評価部1497によって考慮されないという事実を除いて、第１のプロセッサーモジュール1478の評価部1497によって評価される第２のコスト方程式は、上記のコスト方程式と同様である。或いはもう一つの実施例では、第２のコスト方程式は、第１のコスト方程式と異なる。例えば、各々の第１および第２のコスト方程式で考慮されるファクターは同じではあるが、考慮される各々のファクターに割り当てられるウエイトは異なる。或いは他の実施例として、コスト方程式のうちの1つで考慮されるファクターは、他のコスト方程式において考慮されるファクターのサブセットであってもよい。
【０２１９】
さらに他の実施例では、第１のコスト方程式だけが評価され、そして第３の対象データは、第１の対象データが、まず最初に記憶される第１のプロセッサーモジュール1478中の第１の記憶バッファ1463を除き、又第１のコスト方程式を評価する際に識別される第２の記憶バッファ1463を除き、いかなる記憶バッファ1463に記憶される。
【０２２０】
ある実施例においては、ステップ1520で、第２の、第３のおよび／又は更なる対象データは、ステップ1512および／又は1516で識別された第２の、第３の、および／又は更なる記憶バッファ1463に、それぞれ記憶される。これを可能にするために、第１のプロセッサーモジュール1478の送信部1495は、第２の、第３のおよび／又は更なる対象データを、第２の、第３の、および／又は更なる記憶バッファ1463に、それぞれ送信する。したがって、受信された書込み動作の対象データは、記憶管理デバイス1438の一つ以上の記憶バッファ1463に、冗長性を持たせて記憶される。
【０２２１】
［クロック同期］
【０２２２】
一般に、他の態様において、本発明は、複数のプロセッサーモジュールの内部クロックを同期させる方法と装置に関する。簡単に概説すれば、本発明の本態様のある実施例では、マルチプロセッサー・システム（例えば上述の記憶管理デバイス）が、複数のプロセッサーモジュールを含み、そして、それぞれのプロセッサーモジュールは、それ自体の内部クロックを有する。複数のプロセッサーモジュールの内部クロック全体の同期は、複数のプロセッサーモジュールのうちの1台を、マルチプロセッサー・システム用のマスター内部クロックを有するマスター・プロセッサーモジュールに指定し、そしてそのマルチプロセッサー・システム中のその他のプロセッサーモジュールの各一つ毎に（スレーブ・プロセッサーモジュールに指定される）、周期的にその内部クロックを前記マスター内部クロックと比較させて、必要に応じて、その内部クロックを修正させることにより、前記同期が実行されるように構成されている。ある実施例においては、スレーブ・プロセッサーモジュールは、時間的に内部クロックを後に戻さず、内部クロックを修正する。
【０２２３】
図23は、本発明の本態様に係る、実質的に一定して稼動するクロックを維持するマルチプロセッサー・システム1638（一般的に言って、例えば上述の記憶管理デバイスと以下に述べる追加機能とを有した能力を有しており、かつ実行されている記憶管理デバイス）の一実施例を図示している。マルチプロセッサー・システム1638は、複数のプロセッサーモジュール1678、1678’、1678’’、1678’’’を含み、各プロセッサーモジュールは、それぞれ自分の内部クロック1675、1675’、1675’’、1675’’’を含む。図23のマルチプロセッサー・システム1638に図示する4台のプロセッサーモジュール1678、1678’、1678’’、1678’’’’は、単に図示するだけであり、そして更に一般的にいえば、マルチプロセッサー・システム1638は、如何なる数または如何なるタイプのプロセッサーモジュールを含むことができる。
【０２２４】
マルチプロセッサー・システム1638の複数のプロセッサーモジュールの一つ以上の内部クロックは、他のプロセッサーモジュールの内部クロックから、時間的な「偏流状態」であり得る。これは、例えば他のプロセッサーモジュールに比較して、加熱されている1台のプロセッサーモジュールによって生じるプロセッサーモジュール間の温度差に起因する。例えば、マルチプロセッサー・システム1638中で、例えばプロセッサーモジュール1678’’の内部クロック1675’’が、マルチプロセッサー・システム1638の内部クロック1675、1675’、1675’’’より早く動き、またこれらから時間的な「偏流状態」にある場合があり得る。従ってマルチプロセッサー・システム1638のこれ等内部クロック1675、1675’、1675’’、1675’’’を同期させ、それによりマルチプロセッサー・システム1638の信頼性ある稼動クロックを維持するためには、この内部クロック1675’’を、例えば本発明のこの実施例に従って、ここに開示するように修正しなければならない。
【０２２５】
本発明の一実施態様では、第１のプロセッサーモジュール、例えば図示するようなプロセッサーモジュール1678が、マルチプロセッサー・システム1638のマスター・プロセッサーモジュールに指定される。マスター・プロセスモジュール1678は、マルチプロセッサー・システム1638用のマスター内部クロック1675を含む。そのような実施例では、全てのその他のプロセッサーモジュール（すなわち少なくとも一つの他のプロセッサーモジュール）1678’、1678’’、1678’’’は、マルチプロセッサー・システム1638のスレーブ・プロセッサーモジュールに指定される。各スレーブ・プロセッサーモジュール1678’、1678’’、1678’’’（一般に1678’）は、それ自身のそれぞれのスレーブ・プロセッサーモジュール内部クロック1675’、1675’’、1675’’’（一般に1675’）を含む。スレーブ・プロセッサーモジュール1678’は、ある実施例においては、次に記載されている方法に従って、それらの内部クロックを、マスター内部クロック1675と周期的に比較し、必要に応じて、それらの内部クロックを修正する。
【０２２６】
ここで図24を参照にして、マルチプロセッサー・システム1638用の実質的に一定して稼動するクロックを維持する方法1700に関する一実施例において、スレーブ・プロセッサーモジュール1678’は、スレーブ・プロセッサーモジュール内部クロック1675’を、反復的ステップ1704、1708、1712、1716、および必要に応じて、方法1700のうちのステップ1720を実行することによって、マスター内部クロック1675と同期させる。オプションとして、ステップ1710が、ステップ1704および1708の後、ステップ1712、1716および1720の前に、実行されることもできる。ある実施例では、方法1700のうちのステップ1704、1708、1710（オプションとして）、1712、1716、そして必要に応じてステップ1720、による繰返しが、周期的にスレーブ・プロセッサーモジュール1675’によって実行される。それは、例えば何分の1秒（例えば、2分の１秒）または他の時間毎に実行される。更に実施例によっては、ステップ1704、1708、1710（オプションとして）、1712、1716、および必要に応じてステップ1720を繰り返し実行する前に、スレーブ・プロセッサーモジュール1678’は、ステップ1702で、スレーブ・プロセッサーモジュール内部クロック1675’を初期化する。
【０２２７】
ある実施例においては、ステップ1702でスレーブ・プロセッサーモジュール内部クロック1675’を初期化するために、スレーブ・プロセッサーモジュール1678’が、マスター内部クロック1675の現在時刻をリクエストし、多少の時間経過後に、そのマスター内部クロック1675での現在時刻を受信する。ある実施例においては、スレーブ・プロセッサーモジュールのリクエストと、マスター内部クロック1675での現在時刻を受け取る間の時間的期間が、第１の所定の時間より短ければ、スレーブ・プロセッサーモジュール1678’は、マスター内部クロック1675’での受信した現在時刻に、スレーブ・プロセッサーモジュールのリクエストと、マスター内部クロック1675での現在時刻を受け取る間の時間的期間の2分の1の合計値に、スレーブ・プロセッサーモジュール内部クロック1675’を初期化する。さもないと、スレーブ・プロセッサーモジュールのリクエストと、マスター内部クロック1675での現在時刻を受け取る間の時間的期間が、第１の所定の時間より長ければ、スレーブ・プロセッサーモジュール1678’は、マスター内部クロック1675’での受信した現在時刻を無視して、マスター内部クロック1675での新規の現在時刻をリクエストする。いくつかの実施形態では、スレーブ・プロセッサーモジュール1678’は、第１の所定の時間以内に、マスター内部クロック1675での現在時刻を受信するまで、スレーブ・プロセッサーモジュール1678’は、受信したマスター内部クロック1675での現在時刻を無視して、マスター内部クロック1675での新しい現在時刻をリクエストし続ける。それからスレーブ・プロセッサーモジュール1678’は、上記の通りにスレーブ・プロセッサー内部クロック1675’を初期化する。
【０２２８】
ある実施例においては、上記の第１の所定の時間は、スレーブ・プロセッサーモジュール1675’のメモリ296（図9を参照）に予め記憶される。さらにこの第１の所定の時間は、マルチプロセッサー・システム1638のハードウェア構成に基づいて可変であってもよい。ある実施例においては、第１の所定の時間は、略26マイクロ秒と略35マイクロ秒との間にある特定の時刻にセットされる。
【０２２９】
代替実施形態では、上記のようにスレーブ・プロセッサーモジュール内部クロック1675を初期化するよりはむしろ、ステップ1702は実行されず、その代わりに下記のように、スレーブ・プロセッサーモジュール1678’は、スレーブ・プロセッサーモジュール内部クロック1675’とマスター内部クロック1675との間のオフセット値を算出する。
【０２３０】
簡単に概説すれば、スレーブ・プロセッサーモジュール内部クロック1675’をマスター内部クロック1675へ同期させるために、ステップ1704で、そしてスレーブ・プロセッサーモジュール内部クロック1675’による第１の時刻に、スレーブ・プロセッサーモジュール1678’は、まずマスター内部クロック1675による現在時刻をリクエストする。このリクエストは、リクエストをすることに役立ついかなる形式または方法で通信さすることができる。ある実施例において、例えば、このリクエストは、データパケットの形式で通信される。スレーブ・プロセッサーモジュール1678’は、リクエストがされたスレーブ・プロセッサーモジュール内部クロック1675’に従った上記第１の時刻を記録する。しばらくして、ステップ1708で、スレーブ・プロセッサーモジュール1678’は、スレーブ・プロセッサーモジュール内部クロック1675’による第２の時刻に、マスター内部クロック1675による現在時刻を受信する。そしてマスター内部クロック1675による前記現在時刻は、スレーブ・プロセッサーモジュール1678’に、送信され、また受信される。この送受信は、この種の情報を伝達することに役立ついかなる形式または方法で行われる。例えば、マスター内部クロック1675による現在時刻は、データパケットで、スレーブ・プロセッサーモジュール1678’に送受信できる。またステップ1704と同様な方法で、スレーブ・プロセッサーモジュール1678’は、マスター内部クロック1675による前記現在時刻が受信された、スレーブ・プロセッサーモジュール内部クロック1675’による前記第２の時刻を記録する。
【０２３１】
オプションとして、ステップ1704および1708を完了した後に、かつステップ1712、1716、および必要に応じてステップ1720を実行する前に、スレーブ・プロセッサーモジュール1678’は、ステップ1710で、スレーブ・プロセッサーモジュール内部クロック1675’による前記第１の時刻（ステップ1704でスレーブ・プロセッサーモジュール1678’によって記録されている）が、スレーブ・プロセッサーモジュール内部クロックによる前記第２の時刻（ステップ1708でスレーブ・プロセッサーモジュール1678’によって記録されている）と、第２の所定の時間と異なるかどうか判断する。そのような一実施例において、図24にて図示したように、スレーブ・プロセッサーモジュール1678’が、スレーブ・プロセッサーモジュール内部クロック1675’による前記第１の時刻と、スレーブ・プロセッサーモジュール内部クロック1675’による前記第２の時刻との時間的差異が、前記第２の所定の時間より少ない時間であると決定された時にだけ、ステップ1712、1716および必要に応じてステップ1720が、実行される。さもないと、スレーブ・プロセッサーモジュール1678’は、ステップ1704へ戻る。このように進めることによって、スレーブ・プロセッサーモジュール1678’は、受信したマスター内部クロック1675での現在時刻が過度の遅延の後に受信したものでないかという危惧を除去し、このことにより誤ったクロック同期から守ることが可能となる。
【０２３２】
ステップ1702に関する上記の第１の所定の時間と同様に、前記第２の所定の時間は、スレーブ・プロセッサーモジュール1675’のメモリ296（図9を参照）に予め記憶されていてもよく、マルチプロセッサー・システム1638のハードウェア配置に基づいて構成されてもよい。ある実施例では、前述の第１の所定の時間と同様に、この第２の所定の時間は、略26マイクロ秒と略35マイクロ秒との間にある特定の時間にセットされている。
【０２３３】
ステップ1704、1708およびオプションとしてステップ1710の完了後、スレーブ・プロセッサーモジュール1678’は、ステップ1712で、少なくともスレーブ・プロセッサーモジュール内部クロック1675’（ステップ1704でスレーブ・プロセッサーモジュール1678’によって記録されている）による第１の時刻と、スレーブ・プロセッサーモジュール内部クロック1675’（ステップ1708でスレーブ・プロセッサーモジュール1678’によって記録されている）による第２の時刻とを使用することにより、期待時刻を計算する。オプションとして、実施例によっては、スレーブ・プロセッサーモジュール1678’は、この期待時刻を計算する際に、例えば後述するようにオフセット（相殺）を使用する。ある実施例においては、計算された期待時刻は、スレーブ・プロセッサーモジュール1678’が、マスター内部クロック1675による現在時刻のスレーブ・プロセッサーモジュールのリクエストに応答して、マスター・プロセッサーモジュール1678から、受信するのを期待するものを表す。換言すれば、ある実施例においては、スレーブ・プロセッサーモジュール1678’は、マスター内部クロック1675およびスレーブ・プロセッサーモジュール内部クロック1675’が同一速度で動作すると仮定している。このように、スレーブ・プロセッサーモジュール1678’は、リクエスト時刻（ステップ1704でスレーブ・プロセッサーモジュール1678’によって記録されている）と、応答時刻（ステップ1708でスレーブ・プロセッサーモジュール1678’によって記録されている）と、オプションとして、そしていかなる前もって決定された、スレーブ・プロセッサーモジュール内部クロック1675’とマスター内部クロック1675との間のオフセット値（後述する）に基づいて、マスター内部クロック1675’による現在時刻を算出することが可能であることを期待している。
【０２３４】
ステップ1716で、スレーブ・プロセッサーモジュール1678’は、上記期待時刻が、マスター内部クロック1675による受信された現在時刻と異なるかどうか判断する。その場合は、スレーブ・プロセッサーモジュール内部クロック1675’およびマスター内部クロック1675は、ステップ1712のスレーブ・プロセッサーモジュールの仮定に反して、異なる速度で動いている（すなわちスレーブ・プロセッサーモジュール内部クロック1675’は、マスター内部クロック1675から、ずれて動いており（偏流しており）、時間的な「偏流状態」になっている）。オプションとしては、ある実施例においては、スレーブ・プロセッサーモジュール1678’は、ステップ1716を実行する際に、期待時刻が、マスター内部クロック1675による受信された現在時刻と、第３の所定の時間以上、異なっているかを判断する。そのような実施例において、その期待時刻が、マスター内部クロック1675による受信された現在時刻と、第３の所定の時刻以上異なっているとスレーブ・プロセッサーモジュール1678’が判断した場合にだけ、スレーブ・プロセッサーモジュール1678’は、ステップ1720を実行する。さもないと、図24にて図示したように、スレーブ・プロセッサーモジュール1678’は、ステップ1704へ戻る。このように進めることによって、スレーブ・プロセッサーモジュール1678’は、スレーブ・プロセッサーモジュール内部クロック1675’とマスター内部クロック1675間の、小さな差異、頻繁な差異、重要でない差異は、修正しない。
【０２３５】
また、上記第３の所定の時間は、スレーブ・プロセッサーモジュール1675’のメモリ296（図9を参照）に予め記憶されていてもよく、可変でもよい。この第３の所定の時間を小さく設定すると、スレーブ・プロセッサーモジュール内部クロック1675’とマスター内部クロック1675間は、より厳密な同期の関係になる。ある実施例では、この第３の所定の時間は、略5マイクロ秒にセットされる。
【０２３６】
ステップ1716で、期待時刻がマスター内部クロック1675による受信された現在時刻と異なると判断した場合、或いはオプションとして、期待時刻がマスター内部クロック1675による受信された現在時刻と第３の所定の時間以上だけ異なると判断した場合には、スレーブ・プロセッサーモジュール1678’は、スレーブ・プロセッサーモジュール内部クロック1675’を、ステップ1720で修正する。ある実施例においては、この修正は、スレーブ・プロセッサーモジュール内部クロック1675’を、以下に述べるように、効果的に「スローダウン」または「スピードアップ」することによって行なわれる。なお他の修正技術も同様に、用いられることができる。ステップ1720を完了すると、スレーブ・プロセッサーモジュール1678’は、それから方法1700を繰り返すステップ1704を実行するために返る。一方では、この期待時刻がマスター内部クロック1675による受信された現在時刻と異ならないか、またはオプションとして、マスター内部クロック1675による受信された現在時刻と、第３の所定の時間以上異ならない場合には、スレーブ・プロセッサーモジュール1678’は、ステップ1720を実行せず、むしろステップ1716からステップ1704へ戻り、方法1700の次の繰返しを開始する。
【０２３７】
一般に、図23において表されるマルチプロセッサー・システム1638のようなマルチプロセッサー・システムでは、いかなる2台のプロセッサーモジュールの内部クロックは、例えばマスター・プロセッサーモジュール1678、そしてスレーブ・プロセッサーモジュール1678’は、たとえそれらが相互間で“ずれ”（偏流）は無く、時間的な「偏流状態」でない場合であっても、それ等は正確には同期しておらず、所与の時点では、ある時間だけ相異している。ある実施例においては、上記ようにステップ1702で、スレーブ・プロセッサーモジュール内部クロック1675’を初期化するよりはむしろ、その代わりにスレーブ・プロセッサーモジュール1678’は、マスター内部クロック1675とスレーブ・プロセッサーモジュール内部クロック1675’との間の、差異またはオフセットを算出する。このオフセット値は、方法1700の各ステップによる第１の繰返しの間のある時点で算出され、その後に、スレーブ・プロセッサーモジュール内部クロック1675’を修正する際にスレーブ・プロセッサーモジュール1678’によって使用される。
【０２３８】
このように、そのような実施例では、方法1700の各ステップによる第１の繰返しで、ステップ1704、1708、およびオプションとしてのステップ1710を完了した後に、しかしステップ1712、1716、および必要に応じてステップ1720を完了する前に、スレーブ・プロセッサーモジュール1678’は、上記オフセット値を計算する。例えば、ある実施例においては、スレーブ・プロセッサーモジュール1678’は、スレーブ・プロセッサーモジュール内部クロック1675’による第１の時刻（ステップ1704でスレーブ・プロセッサーモジュール1678’によって記録される）と、第２の時刻がスレーブ・プロセッサーモジュール内部クロック1675’による第２の時刻（ステップ1708’でスレーブ・プロセッサーモジュール1678’によって記録されている）との合計の半分から、マスター内部クロック1675による受信された現在時刻（ステップ1708でスレーブ・プロセッサーモジュール1678’によって受信した）を減算することによって、上記オフセット値を計算する。実際的には、この種の実施例においては、マスター・プロセッサーモジュール1678へ、マスター内部クロック1675による現在時刻のリクエストを送信するために用いられる時間は、スレーブ・プロセッサーモジュール1678’へ、マスター・プロセッサーモジュール1678によってリスポンスを送信するために用いられる時間と同じであると、スレーブ・プロセッサーモジュール1678’は、仮定している。したがって、この種の実施例においては、スレーブ・プロセッサーモジュール1678’の内部クロック1675’による時刻と、マスター・プロセッサーモジュール1678のマスター内部クロック1675による時刻とが正確に同一であると仮定すると、スレーブ・プロセッサーモジュール内部クロック1675’による第１の時刻（ステップ1704でスレーブ・プロセッサーモジュール1678’によって記録される）と、第２の時刻がスレーブ・プロセッサーモジュール内部クロック1675’による第２の時刻（ステップ1708’でスレーブ・プロセッサーモジュール1678’によって記録されている）との合計の半分は、マスター内部クロック1675による受信された現在時刻（ステップ1708でスレーブ・プロセッサーモジュール1678’によって受信した）と同一になる筈である。これが事実でないケースの場合、スレーブ・プロセッサーモジュール1678’の内部クロック1675’は、マスター内部クロック1675からオフセット（相殺）される。
【０２３９】
さらに、別の実施例では、オフセット値を算出した後に、スレーブ・プロセッサーモジュール1678’は、それから方法1700の各ステップによる第１の繰返しのステップ1712と、方法1700の各ステップによる次の繰返しのステップ1712の両方で、上記期待時刻を計算する時に、上記オフセット値を使用する。ある実施例においては、スレーブ・プロセッサーモジュール1678’が、方法1700の各ステップを繰り返すと、それは、方法1700の各ステップによる第１の繰返し後にはオフセットを再び計算しない。
【０２４０】
スレーブ・プロセッサーモジュールがオフセット値を算出する方法1700の他の実施例においては、その時刻が正確にマスター内部クロック1675による時刻に等しいようにするために、スレーブ・プロセッサーモジュール1678’は、スレーブ・プロセッサーモジュール内部クロック1678’を調整せず、むしろスレーブ・プロセッサーモジュール1678’は、オフセット値の“ずれ”（偏流）を無くし、時間的な「偏流状態」にならないように、後述するようにステップ1720で、スレーブ・プロセッサーモジュール内部クロック1675’を修正する。換言すれば、スレーブ・プロセッサーモジュール1678’は、スレーブ・プロセッサーモジュール内部クロック1675’を、マスター内部クロック1675から設定された量でオフセット（相殺）し続けるようにする。そのような実施例において、ターゲットモード・ドライバ382（図10を参照）は、スレーブ・プロセッサーモジュール内部クロック1675’によるI／Oリクエスト受信時刻、プラスあるいはマイナス、上記計算されたオフセット値で、タイムスタンプを押す。したがって、この種の実施例で、マルチプロセッサー・システム1638中の各スレーブ・プロセッサーモジュール1678’は、I／Oリクエストが受信された時刻で、かつマスター内部クロック1675による時刻に実質的に等しい時刻で、受信されたI／Oリクエストにタイムスタンプを押す。しかしながら、本願明細書において述べたクロックの時間的な「偏流現象」のために、受信されたI／Oリクエストがタイムスタンプを押した時刻は、I／Oリクエストが受け取られた時刻であり、かつマスター内部クロック1675による時刻とは、必ずしも同じでない点に留意する必要性がある。しかしながら、この後者の問題は、後述するようにマルチプロセッサー・システム1638によって対処され、それはマルチプロセッサー・システム1638の適切な動作に影響を及ぼさない。
【０２４１】
ある実施例においては、方法1700を更に詳細すると、方法1700の各ステップによる各繰返しのために、スレーブ・プロセッサーモジュール1678’は、ステップ1712で上述の期待時刻を見積もる際に、まず繰返しのためのラウンドトリップ時間を計算する。これは、スレーブ・プロセッサーモジュール内部クロック1675’（ステップ1708でスレーブ・プロセッサーモジュール1678’によって記録されている）による第２の時刻から、スレーブ・プロセッサーモジュール内部クロック1675’（ステップ1704でスレーブ・プロセッサーモジュール1678’によって記録されている）による第１の時刻を減算することによって計算される。さらに、例えば、このスレーブ・プロセッサーモジュール1678’は、方法1700の各ステップによる各繰返しのための上記計算されたラウンドトリップ時間を、そのメモリ296（図9を参照）に保存することができる。したがって、方法1700の各ステップによる第１の繰返しに続く、方法1700の各ステップによるいかなる現在の繰返しでも、スレーブ・プロセッサーモジュール1678’は、方法1700の各ステップによるその現在の繰返しの計算されたラウンドトリップ時間を用いて、そして方法1700の各ステップによる以前の繰返しの一つ以上のラウンドトリップ時間を用いて、平均的ラウンドトリップ時間を計算することができる。
【０２４２】
ある実施例においては、スレーブ・プロセッサーモジュール1678’によって計算される上記平均的ラウンドトリップ時間は、方法1700の各ステップによるその時の現在の繰返しのラウンドトリップ時間と、そして方法1700の各ステップによる全ての以前の繰返しのラウンドトリップ時間、との平均である。他の実施形態では、スレーブ・プロセッサーモジュール1678’によって計算される平均的ラウンドトリップ時間は、方法1700の各ステップによるその時の現在の繰返しのラウンドトリップ時間と、そして方法1700の各ステップによるごく最近の以前の繰返しの一つ以上のラウンドトリップ時間の移動平均である。さらに別の実施形態では、スレーブ・プロセッサーモジュール1678’によって計算される平均的ラウンドトリップ時間は、加重移動平均ラウンドトリップ時間である。
【０２４３】
ある実施例においては、方法1700の各ステップによる第１およびそれ以降の繰返しにおいて、スレーブ・プロセッサーモジュール1678’は、スレーブ・プロセッサーモジュール内部クロック1675’による第１の時刻（現在の繰返しのステップ1704で、スレーブ・プロセッサーモジュール1678’によって記録されている）と、方法1700の各ステップによるその繰返しのラウンドトリップ時間の半分との合計を計算し、そしてオプションとして、そこからオフセット値を減算することによって、上記期待時刻をステップ1712で計算する。もう一つの実施例では、方法1700の各ステップによる第１の繰返しに続く、方法1700の各ステップによる繰返しによる一つの繰り返しで、スレーブ・プロセッサーモジュール1678’は、スレーブ・プロセッサーモジュール内部クロック1675’による第１の時刻（現在の繰返しのステップ1704で、スレーブ・プロセッサーモジュール1678’によって記録されている）と、計算された平均ラウンドトリップ時間の半分の合計を計算し、そしてオプションとして、そこからオフセット値を減算することによって、上記期待時刻をステップ1712で計算する。
【０２４４】
一旦スレーブ・プロセッサーモジュール1678’が、上記期待時刻を計算すると、それから、ステップ1716で、期待時刻がマスター内部クロック1675による現在時刻と異なるかどうか、またはオプションとして、期待時刻が、マスター内部クロック1675による現在時刻と、第３の所定の時間以上異なるか否かを判断する。ある実施例においては、この決定をするために、スレーブ・プロセッサーモジュール1678’は、方法1700の各ステップによる各繰返しのために、マスター内部クロック1675によるその時の現在時刻（その繰返しのステップ1708で、スレーブ・プロセッサーモジュール1678’によって受信した）から、期待時刻（その繰返しのステップ1712で、スレーブ・プロセッサーモジュール1678’によって計算された）を減算することによって、繰返しのための時間的な偏流値を、まず計算する。さらに、スレーブ・プロセッサーモジュール1678’は、方法1700の各ステップによる各繰返しのための計算された時間的な偏流値を、例えばそのメモリ296（図9を参照）に保存することができる。したがって、前の通り、方法1700の各ステップによる第１の繰返しに続く、方法1700の各ステップによるいかなる現在の繰返しにおいても、スレーブ・プロセッサーモジュール1678’は、方法1700の各ステップによるその時の現在の繰返しのための計算された時間的な偏流値を用いて、そして方法1700の各ステップによる以前の繰返しの一つ以上のための時間的な偏流値を用いて、時間的な平均偏流値を計算することができる。
【０２４５】
ある実施例においては、スレーブ・プロセッサーモジュール1678’によって計算された上記時間的な平均偏流値は、方法1700の各ステップによるその時の現在の繰返しの時間的な偏流値と、そして方法1700の各ステップによる全ての以前の繰返しの時間的な偏流値、との単純な平均値である。他の実施形態では、スレーブ・プロセッサーモジュール1678’によって計算される時間的な平均偏流値は、方法1700の各ステップによるその時の現在の繰返しの時間的な偏流値と、そして方法1700の各ステップによる全ての以前の繰返しの時間的な偏流値、との単純な移動平均値である。さらに別の実施形態では、スレーブ・プロセッサーモジュール1678’によって計算される時間的な平均偏流値は、時間的な加重移動平均偏流値である。
【０２４６】
ある実施例においては、方法1700の各ステップによる前記第１およびその後の繰返しで、スレーブ・プロセッサーモジュール1678’は、ステップ1716で、その繰返しのための時間的な偏流値がゼロでない場合には、上記期待時刻が、マスター内部クロック1675により受信された現在時刻（現在の繰返しのステップ1708で、スレーブ・プロセッサーモジュール1678’によって受け取られた）と異なると判断する。他の実施形態では、方法1700の各ステップによる前記第１の繰返しに続く、方法1700の各ステップによるある一つの繰返しで、スレーブ・プロセッサーモジュール1678’は、上記計算した時間的な平均偏流値が、例えばゼロでない場合には、上記期待時刻が、マスター内部クロック1675による受信された現在時刻（その繰返しのステップ1708で、スレーブ・プロセッサーモジュール1678’によって受け取られた）と異なると判断する。
【０２４７】
上記期待時刻が、マスター内部クロック1675による現在時刻と異なる、或いはオプションとして、期待時刻が、マスター内部クロック1675による現在時刻と、第３の所定の時間以上異なる、と判断すると、即座に、スレーブ・プロセッサーモジュール1678’は、ステップ1720で、スレーブ・プロセッサーモジュール内部クロック1675’を修正する。ある実施例においては、その期待時刻が、マスター内部クロック1675による受信された現在時刻より大きい（或いはオプションとして、マスター内部クロック1675による受信された現在時刻より、第３の所定の時間以上だけ大きい）場合、スレーブ・プロセッサーモジュール内部クロック1675’は、マスター内部クロック1675より早く稼動していたことを意味し、スレーブ・プロセッサーモジュール1678’は、スレーブ・プロセッサーモジュール内部クロック1675’をスローダウンさせることにより、スレーブ・プロセッサーモジュール内部クロック1675’を修正する。もう一つの実施例では、マスター内部クロック1675による受信された現在時刻が、期待時刻より大きい（またはオプションとして、第３の所定の時間以上に大きい）場合、スレーブ・プロセッサーモジュール内部クロック1675’は、マスター内部クロック1675より遅く稼動していたことを意味し、スレーブ・プロセッサーモジュール1678’は、スレーブ・プロセッサーモジュール内部クロック1675’をスピードアップさせることにより、スレーブ・プロセッサーモジュール内部クロック1675’を修正する。
【０２４８】
ある実施例においては、マルチプロセッサー・システム1638は、単一ＣＰＵ命令の各実行毎に増加されるフリーランニング・カウンタを含み、このスレーブ・プロセッサーモジュール1678’は、フリーランニング・カウンタのカウントを、マイクロ秒に目盛ることにより、スレーブ・プロセッサーモジュール内部クロック1675’を実行するように構成されている。スレーブ・プロセッサーモジュール1678’は、例えば、まず初期設定として、1マイクロ秒をフリーランニング・カウンタの2800カウントに等しいように構成されることができる（例えば、スレーブ・プロセッサーモジュール1678’は、例えば、まず最初に、1マイクロ秒を2800個のCPU命令を実行するために必要とする時間であるように構成され、そしてそのことは、2.8GHzのCPUクロックを有し、１クロックサイクルにつき1つの命令を実行するCPU、となる）。したがって、ある実施例においては、スレーブ・プロセッサーモジュール内部クロック1675’をスローダウンするために、スレーブ・プロセッサーモジュール1678’は、フリーランニング・カウンタに影響を及ぼさずに、それが特定の時間間隔においてあるためにそこで考慮するフリーランニング・カウンタのカウントの数を増加させる。同様に、スレーブ・プロセッサーモジュール内部クロック1675’の速度をスピードアップするために、スレーブ・プロセッサーモジュール1678’は、フリーランニング・カウンタに影響を及ぼさずに、それが特定の時間間隔においてあるためにそこで考慮するフリーランニング・カウンタのカウントの数を減少させることができる。重要なことは、そういった実施例で、スレーブ・プロセッサーモジュール1678’は、スレーブ・プロセッサーモジュール内部クロック1675’を時間的に戻らせない方法で、スレーブ・プロセッサーモジュール内部クロック1675’を修正する点にある。むしろスレーブ・プロセッサーモジュール内部クロック1675’は、上述のように、修正のためにスローダウン又はスピードアップされて、時間的に絶えず前へ進むように構成されている。
【０２４９】
図25は、スレーブ・プロセッサーモジュール内部クロック1675’による時刻対マスター内部クロック1675による時刻の典型的なグラフ1800を表す。この典型的なグラフにおいて、説明を単純にするために、上記の通りに算出される場合、オフセット値がゼロであると仮定される。但し、それが上記の通り実際に算出される場合、それが必ずしもゼロであるという訳ではない。このように理想的には、ライン1804によって示すように、スレーブ・プロセッサーモジュール内部クロック1675’による時刻は、マスター内部クロック1675による時刻に常に等しい。しかしながら実際には、スレーブ・プロセッサーモジュール1678’は、マスター・プロセッサーモジュール1678に関連して時間的に偏流し、両者間に“ずれ”（偏流）を生ずる（例えば温度変化のため）。そうすると、スレーブ・プロセッサーモジュール内部クロック1675’は、マスター内部クロック1675（ライン・セグメント1808および1812によって表示されているように）より早く進む。あるいは、マスター・プロセッサーモジュール1678は、スレーブ・プロセッサーモジュール1678’に関連して時間的に偏流し（例えば温度変化のため）、そうするとマスター内部クロック1675は、スレーブ・プロセッサーモジュール内部クロック1675’より進むようになる（ライン・セグメント1816によって表されるように）。このように、スレーブ・プロセッサーモジュール1678’は、上記の方法1700によって、スレーブ・プロセッサーモジュール内部クロック1675’を修正し、マスター内部クロック1675に対してスレーブ・プロセッサーモジュール内部クロック1675’を「スローダウン」させる（例示的なライン・セグメント1816によって表されるように）。又さもなければ、マスター内部クロック1675に対してスレーブ・プロセッサーモジュール内部クロック1675’を「スピードアップ」させる（例示的なライン・セグメント1812によって表されるように）。前述のように、スレーブ・プロセッサーモジュール1678’は、時間的に後戻りしないようにして、スレーブ・プロセッサーモジュール内部クロック1675’を修正する。
【０２５０】
他の実施形態では、図23のマルチプロセッサー・システム1638は、ネットワーク（図示せず）のサーバである。したがって、プロセッサーモジュール、スレーブ・プロセッサーモジュール1678’は、ネットワーク（例えばホスト）の他のコンピューティング装置から一つ以上の書込み動作を受け取ることができる。そのような実施例において、方法1700の各ステップによる繰返しのステップ1716で、スレーブ・プロセッサーモジュール1678’は、期待時刻が指定された時間1820より短いため、マスター内部クロック1675により受信された現在時刻と異なると判断することができる（この現在時刻は、方法1700の各ステップによるその繰返しのステップ1708で、スレーブ・プロセッサーモジュール1678’によって受け取られている）。なお、指定された時間1820は、図25のグラフ1800において示されており、そして前述の第３の所定の時間より長い。この場合、スレーブ・プロセッサーモジュール1678’は、書込みが完了する前に、この受信した書込み動作を通知する。又はこれとは反対に、スレーブ・プロセッサーモジュール1678’は、期待時刻が指定された時間1820より長いために、マスター内部クロック1675による受信された現在時刻と異なると判断することができる。この場合、方法1700に関して上記のように記載したようなスレーブ・プロセッサーモジュール内部クロック1675’の修正を通して、期待時刻が、指定された時間1820より短いために、マスター内部クロック1675によって受信された現在時刻と異なると再び判断されるまで、スレーブ・プロセッサーモジュール1678’は、受信された書込み動作を通知することを控える。同様に、上記後者のケースでは、スレーブ・プロセッサーモジュール1678’によって計算されるように期待時刻が、指定された時間1820より短いために、マスター内部クロック1675によって受信された現在時刻と異なると再び判断されるまで、マルチプロセッサー・システム1638の他の全てのプロセッサーモジュールは、受信された書込み動作を通知することを控える。これらの実施例では、マルチプロセッサー・システム1638が、受信された書込み動作を通知し続ける最も極端な例は、以下のような状態で起こることになる。すなわち第１のスレーブ・プロセッサーモジュールの内部クロックが、マスター内部クロック1675より進んでおり、ポジティブ方向の指定された時間1820まで時間的にずれている（偏流している）場合で、その一方では第２のスレーブ・プロセッサーモジュールの内部クロックが、マスター内部クロック1675より遅れており、ネガティブ方向の指定された時間1820まで時間的にずれている（偏流している）場合である。
【０２５１】
ある実施例においては、指定された時間1820とは、次に動作に必要な最小限の時間の半分である。すなわち、これ等の動作とは、ネットワークのホストが、マルチプロセッサー・システム1638が第１の書込み動作を処理し、その後にマルチプロセッサー・システム1638からリクエストの受取通知を受け取り、その後にマルチプロセッサー・システム1638が、第２の書込み動作を処理するとリクエストする、各動作である。このような実施例では、上記の極端なケースを仮定して、ホストは、内部クロックがポジティブ方向の指定された時間1820へ時間的にずれている（偏流している）第１のスレーブ・プロセッサーモジュールへ第１の書込み動作を送信し、その後に、マルチプロセッサー・システム1638から第１の書込み動作の受取通知を受け取り、そしてその後に、内部クロックがネガティブ方向の指定された時間1820へ時間的にずれている（偏流している）第２のスレーブ・プロセッサーモジュールに第２の書込み動作を直ちに送ると、上記ホストは、第１のスレーブ・プロセッサーモジュールのターゲットモード・ドライバ382（図10を参照）が、受信した第１の書込み動作にタイムスタンプを押すよりも遅い時刻で、第２のスレーブ・プロセッサーモジュールのターゲットモード・ドライバ382（図10を参照）が、受信されたは第２の書込み動作にタイプスタンプを押すことが保証される。或いは更に他の実施例では、上記指定された時間は、マルチプロセッサー・システム1638で受信した書込み動作が、正しい順序で処理されることを保証するいかなる時間にもセットされることができる。
【０２５２】
さらにもう一つの実施例では、マルチプロセッサー・システム1638が、フリーランニング・カウンタを含み、そしてスレーブ・プロセッサーモジュール内部クロック1675’のための上記記述のように、マスター・プロセッサーモジュール1678が、そのフリーランニング・カウンタのカウントをマイクロ秒に目盛ることによりマスター内部クロック1675を実行するように構成されていると、マスター・プロセッサーモジュール1678は、マスター内部クロック1675の目盛りテーブルを実世界の時計に維持することが出来る。ある実施例においては、上記の通りに、フリーランニング・カウンタ上の2800カウントは、実世界の時計では1マイクロ秒に等しい。そのような実施例において、マルチプロセッサー・システム1638がネットワークのホストへ、ユーザに時刻を示すと、マスター・プロセッサーモジュール1678の目盛りテーブルは、マルチプロセッサー・システム1638で保持されている実行時刻を実世界時刻へ転換するかを打診される。
【０２５３】
［マップ生成および使用］
【０２５４】
一般に、本発明の付加的な態様は、指定された過去の時刻に、データ記憶部に記憶されたデータの位置に関するマップ（例えば時刻マップ）を用いて、過去の時刻におけるデータ記憶部のデータ内容を生成するための製造システム、製造方法および製造物品に関する。過去のデータの位置に関する記録の全インデックスの検索をしないで、このマップによって、データ記憶システムが迅速かつ効率よく、過去の時刻におけるデータ記憶部に記憶されたデータ位置を判断することができる。
【０２５５】
簡単に概説すれば、本発明のある実施例において、データ記憶システムは、記憶管理デバイスを含み、この記憶管理デバイスは、過去時刻のためのデータを受信する受信部と、データ記憶部の一つ以上のターゲット記憶ユニットに対するI／Oリクエストを処理するI／Oプロセッサ、とを含む。前述したように、ある実施例においては、記憶ユニットは、データ記憶部内にあるブロックの単一またはマルチバイト群である。記憶管理デバイスは、更に、I／Oプロセッサによって処理される書込みリクエストを記録する索引モジュールを含む。この索引モジュールは、各書込みリクエストのために、記録を記憶するメモリを有し、この記録には：
１）ターゲット記憶ユニットの識別データ;
２）ターゲット記憶ユニットに以前記憶された位置データ;そして、
３）書込みリクエストが受け取られた時刻を意味する書込み時刻データ；
が含まれる。加えて、記憶管理デバイスは、指定された過去の時刻にターゲット記憶ユニットに記憶されたデータの位置に関するマップを生成するために、一つ以上の記録を使用するマッピング・モジュールを含む。データ内容生成モジュール（これは記憶管理デバイスに含まれる）は、過去の時刻でのデータ記憶部に基づくデータ内容を、少なくとも部分的にはマッピング・モジュールに基づいて生成したマップ上に、表示する。
【０２５６】
図26は、本発明の一実施例による記憶管理デバイス1938を例示する。この記憶管理デバイス1938は、例えば図1、4、5、および13を参照して本願明細書において記載されているデータ記憶システムで、用いられる。一つの例として、記憶管理デバイス1938は、アクセスを有する 物理的な記憶部に記憶されるデータにホストがアクセスできるために、ホストおよび物理的な記憶部と通信を行なうことができる。加えて、物理的な記憶部に記憶されるデータは、様々な方法を使用して、組織され、かつホストに提示される。例えば記憶管理デバイス1938は、論理データ内容を含む一つ以上のデータを、ホストに示すことができる。また上述したように、記憶管理デバイス1938は、複数のデータ記憶部についての一つ以上の現在データ記憶部および一つ以上の時刻データ記憶部に対して、ホストがアクセス出来るようにすることができる。加えて、以前に記載したように、ホストに提示されるデータ内容は、固定的データ内容または動的データ内容であってもよい。記憶管理デバイス1938は、先に述べた態様および実施例の記憶管理デバイスに起因している付加的な機能性を実行することもできる。
【０２５７】
ある実施例においては、記憶管理デバイス1938は、受信部1961、プロセッサ1962、索引モジュール1995、マッピング・モジュール1997、そしてデータ内容生成モジュール1999を含み、これらは各々と通信を行なう。各々のこれらの要素は、ソフトウェア、ハードウェア、またはソフトウェアとハードウェアの若干の組み合わせで実行可能である。受信部1961は、例えば図10の一つ以上のホスト・インターフェース361の一部として実行することができる。受信部1961は、ある実施例においては、図10のターゲットモード・ドライバ382で実行する。受信部1961は、ホストと通信して、過去の時刻のためのデータを受け取る。この過去の時刻とは、過去の時刻でのデータ記憶部内にあったデータ内容を、記憶管理デバイスが提示するための、ホストからのリクエストの一部である。このリクエストには、特定のデータ記憶部の識別を含むこともでき、ある場合には、論理的ブロック・アドレスおよびデータ長も含まれる。
【０２５８】
ある実施例においては、この過去の時刻でのデータ記憶部のデータ内容に関するリクエストは、受信部1961によって、バンド内（in-band）通信でホストから受け取られる。すなわち、ホストがデータ命令（例えば読出しリクエストおよび書込みリクエスト）を通信するときに、ホストが使用する同じ通信プロトコルによりホストから受信される。他の実施形態では、受信部1961は、バンド外（out-of-band）通信のリクエストを受け取る。例えば、受信部1961は、ホストがデータ命令を通信するときに、ホストが使用する通信プロトコルとは異なる通信プロトコル経由によりホストから受信されたり、異なるチャネル（例えば、ユーザーインターフェース、物理インタフェースまたはコマンドライン・コンソール、等のホストと異なるチャネル経由であり、例えばシステム管理者のインタフェース）経由や、これ等の組み合わせの通信経由で受信される。
【０２５９】
プロセッサ1962は、一つ以上のターゲット記憶ユニットに対するI／Oリクエストを処理する。プロセッサ1962は、以前本願明細書において記載した構成要素のうちの1つで実行することが出来る。例えばプロセッサ1962は、図10のプロセッサーモジュール378に示される一つ以上の構成要素で実行することができる。ある実施例においては、プロセッサ1962は、図10に示されるI／Oマネージャ362で実行する。プロセッサ1962は、データ記憶部の記憶ユニット（例えば論理ブロック）に対するI／Oリクエストを処理する。読込みまたは書込みリクエストの対象であるこの記憶ユニットは、同時にターゲット記憶ユニットとも呼ばれる。
【０２６０】
前述のように、書込みリクエストは、複数の記憶ユニットを、しばしば対象とする。ある実施例においては、記憶管理デバイス1938は、書込みリクエストの実施の前にターゲット記憶ユニット内に記憶されていたデータに上書きする前に、ターゲット記憶ユニット上にcopy-on-write動作（書込み動作上のコピー）を実行する。そのコピーされたデータ（すなわち過去のデータ）は、それから記憶管理デバイス1938によって他の位置へ移動する。前述のように、それは、例えば、上書きされるデータが他ですでに保存されるので、実際のデータのコピーは、特定の瞬間での書込み動作の発生時に実行されないということであってもよい。これは例えば、上書きされるデータが既にどこかに保存されているからであり、又はそのデータは、書込まれる前にメモリに一時的に保存されているからであり、更に又はデータは移動しないが、しかしその代わりに、データのポインタが修正されているからである。例えばある実施例においては、ターゲット記憶ユニットに対する各書込みリクエストは、現在データ記憶部および時刻データ記憶部に書き込まれるデータに、結果としてなることがあってもよい。その結果、過去のデータが時刻データ記憶部にすでに記憶されるので、同じターゲット記憶ユニットに対する直後の書込み用の実際のcopy-on-write命令を実行することは不必要であるためである。このようにcopy-on-write動作（書込み動作上のコピー）は、コピーを意味するが、それには、copy-on-write動作（書込み動作上のコピー）の効果を有する最適化動作も含まれている。前述の如く、以下に開示する例は、最適化が実際には用いられているという理解で、あたかもcopy-on-write動作（書込み動作上のコピー）が既に実行されているように、記憶管理デバイス1938の動作が提示されている。
【０２６１】
記憶管理デバイス1938は更に、索引モジュール1995も含まれ、この索引モジュール1995は、過去の時刻でのデータ記憶部のデータ内容を表示するために（他の目的もあるが）、過去データを後になって取り出すために、記憶管理システム中の過去データのデータ位置を記憶している。索引モジュール1995は、ソフトウェア、ハードウェアまたは若干のそれらの組み合わせで、そして、例えば上述の本願明細書において開示した構成要素のうちの1つで、実行可能である。例えば、ある実施例においては、索引モジュール1995は、図10の一つ以上のI／Oマネージャ362で実行する。索引モジュール1995は、データ位置記録を記憶するメモリ1996を含む。この実施例のバージョンにおいて、メモリ1996は、索引モジュール1995と一体化している。他のバージョンにおいて、このメモリは、索引モジュール1995と一体化していないが、記憶管理デバイス1938内にあり、例えば図10のプロセッサーモジュール378内のどこか他の所に配置されている。機能的には、索引モジュール1995は、I／Oプロセッサ1962によって処理される書込みリクエストを記録して、処理される各書込みリクエストのための記録を、メモリ1996に記憶する。この記録には、ターゲット記憶ユニットの識別子、そのターゲット記憶ユニットに以前記憶されていたデータの位置、および対応する書込みコマンドが受け取られた時刻を意味する書込み時刻、を含む。各書込みリクエストは、単一の記憶ユニット、例えば1ブロックまたは複数の記憶ユニットに対するリクエストであってもよい。しかしながら、この索引モジュールによって記憶された記録は、指定された過去の時刻に各記憶ユニットに記憶されたデータの位置が識別できる機構を提供することが出来る。ある実施例においては、時刻とは、記憶管理デバイス1938が書込みコマンドを受信した時刻である。
【０２６２】
記憶管理デバイス1938は更に、マッピング・モジュール1997を含む。このマッピング・モジュール1997は、指定された過去の時刻でのデータ記憶部の記憶ユニットのために、過去のデータの現在データ位置のデータマップ（マッピング）を作るために、索引モジュール1995によって記憶される記録を使用するものである。このマッピング機能性により、データ記憶部の過去のデータ内容を迅速に生成するのが可能となる。マッピング・モジュール1997は、図10のプロセッサーモジュール378に示される一つ以上の構成要素で実行することが出来る。例えば、ある実施例においては、マッピング・モジュール1997は、図10に示される一つ以上のI／Oマネージャ362で実行される。機能的には、マッピング・モジュール1997は、記憶管理システム中のデータ位置へのポインタリストを生成する（例えば指定された過去の時刻での、データが位置する物理的な記憶部中の位置）。一旦データマップが生成されると、それは過去の時刻でのデータ記憶部のデータ内容を再び表示するために、将来迅速にアクセス可能な位置に記憶管理デバイス1938によって保存される。ある実施例において、例えば、図10および図11の一つ以上のI／Oマネージャ362が、このマップを管理する。
【０２６３】
例えば、マップは動的であってもよく、その場合には例えば、追加的な書込みリクエストがプロセッサ1962によって処理されるに従い、そのマップは更新されることができる。通常、そのような更新は、マップが生成された時刻後にcopy-on-write動作（書込み動作上のコピー）が実行される時にも、マップが正確なままの状態にあることを確実にするために必要である。このマップの動的な性質は、図27および図28で、更に説明される。
【０２６４】
記憶管理デバイス1938は更に、データ内容生成モジュール1999を含む。このデータ内容生成モジュール1999は、少なくとも部分的にはマッピング・モジュール1997に基づいて生成したマップに基づく、過去の時刻でのデータ記憶部のデータ内容を表示する。データ内容生成モジュール1999は、図10のプロセッサーモジュール378に示される一つ以上の構成要素で実行することもできる。例えば、ある実施例においては、データ内容生成モジュール1999は、図10に示されるホスト・インターフェース361で実行する。
【０２６５】
上記の受信部1961、プロセッサ1962、索引モジュール1995、マッピング・モジュール1997、およびデータ内容生成モジュール1999は、図10に示す分散アーキテクチャで実行可能である。この種の方法において、各プロセッサーモジュール378は、一つ以上のデータ記憶部の特定の記憶ユニットに対する処理コマンドおよび索引書込みコマンドについて、責任を負う。その結果、各プロセッサーモジュール378に含まれる索引モジュール1995は、索引モジュール1995が責任を負う記憶ユニットに対する各書込みコマンドのための記録を記憶する。過去の時刻でのデータ記憶部のデータ内容がリクエストされると、各マッピング・モジュール1997は、それが責任を負うデータ記憶部の所定の部分のために、その特定の過去の時刻でのマップを、もし存在すれば、生成する。このマップは、対応する索引モジュール1995に記憶されている記録を使用して生成される。このマップに少なくとも一部は基づいて、各プロセッサーモジュール378のデータ内容生成モジュール1999は、それが責任を負うデータ記憶部の部分的データ内容を、存在すれば、表示する。ある実施例においては、各プロセッサーモジュール378は、索引モジュール1995、マッピング・モジュール1997、およびデータ内容生成モジュール1999を含み、これらは、データ記憶部の共通部、例えば同じ記憶ユニットの責任を負う。
【０２６６】
上記の手法は、更に、記憶管理デバイス1938にビルトインされた冗長性を持たすことを可能とし、これによりデータ記憶システムの信頼性を増加させることが出来る。例えば2台の別々のプロセッサーモジュール378が、同じ記憶ユニットのための受信、処理、索引付け、マッピングおよびデータ内容生成の上記各動作を実行するように、割り当てられることができる。ある実施例においては、第１のプロセッサーモジュール378が、第１の処理モジュールとして用いられ、そして第２のプロセッサーモジュール378’が、第１のプロセッサーモジュール378がトラブルになった場合に、バックアップとして用いられる。
【０２６７】
図27は、データ記憶部に対する、そしてプロセッサ1962によって処理された、かつ索引モジュール1995によって記録された書込みリクエストの小さな一組のための記録のインデックス2009を例示する。インデックス2009は、4つの記録2010、2010’、2010’’、および2010’’’を含み、それぞれは独自の書込みリクエスト識別子1287、1288、1290、および1291を有する。各記録2010は、関連する書込みコマンドが実行対象とするターゲットとされた論理的ユニット（「LUN」）を識別する（すなわちターゲットLUN識別データ）。加えて各記録は、ターゲットLUN上の記憶ユニットの位置、上書きされた過去のデータの位置、および記憶管理デバイス1938が書込みコマンドを受信した時刻を含む。図27に図示した実施例において、記憶ユニットの位置は、書込みリクエストに関連した論理的ブロック・アドレス（「LBA」）およびデータ長によって識別されている（すなわちLBAの数字はターゲット記憶ユニットで構成されている）。図27の各記録2010がターゲットLUN識別データを含むが、この識別データは、インデックス自体が単一のLUNに制限されている記録からは、除去することが出来る。また、図27には、LUN識別データは、各記録2010の過去のデータの位置データに含まれる。過去のデータが記憶されるターゲットLUNおよびLUNは、図27に示される各記録2010において異なる。例えば、図27の各々の書込みリクエスト1287、1288、1290、および1291は、LUN2502として識別されるターゲットLUNと関係している一方、書込みリクエスト1287、1288および1291に関連した過去のデータは、LUN2500に記憶され、そして書込みリクエスト1290に関連した過去のデータは、LUN2501に記憶される。これらの例は、copy-on-write動作（書込み動作上のコピー）を提示するが、ここでは、新しいデータを記憶するためと、そして過去のデータを記憶するために、異なるLUNsが用いられているが、実際には、この新しいデータと過去データは、同じLUNに記憶することができる。ターゲットLUNが過去のデータを記憶するためにも用いる場合には、全てのLUN識別は、各々の個々の記録から、例えばインデックス自体が、単一のLUNに制限されている場合、除去することができる。
【０２６８】
インデックス2009のデータ位置値に関しては、「新しいデータ」カラムの左上の第１の値は、対応する書込み動作が始まる論理的ブロック・アドレス（すなわち記憶ユニット）である。第２の値（「新しいデータ」カラムの右上の入力値）は、データ長（すなわち書込み動作が対象とする記憶ユニットの数）である。図27の図示した実施例において、「過去のデータ」カラムの最も左の入力値は、過去のデータが書き込まれるLUNのLUN識別データである。「過去のデータ」カラムに示す真ん中の入力値は、過去のデータが関連するcopy-on-write動作（書込み動作上のコピー）の結果として、記憶され始める論理的ブロック・アドレスである。「過去のデータ」カラムに示す最も右の入力値は、この位置にコピーされ、書き込まれるときに、過去のデータが占める記憶ユニットの数である。このように、各記録2010に関連した新規に書込まれるデータ、および過去のデータの特定データ位置を、システムが識別できる十分な情報を、インデックス2009は、提供することが出来る。
【０２６９】
ある実施例においては、記憶ユニットはLUNの一部で、特定の512バイトのブロックであり、したがってそのデータ長は、何個の512バイトブロックに対して、書込みリクエストが動作するかについて示している。例えば、書込みリクエスト1287は、時刻t=6100で発生しており、LUN2502の中の、LBA0から始まる17ブロックのデータ長を有したターゲット記憶ユニットに対する書込みリクエストである。そしてブロック0-16に記憶されていた過去のデータは、コピーされて、LUN2500のブロック64-80（すなわち、位置64、17）へ書き直される(re-writtenされる）。なお他のブロック長も使わ使用できると理解すべきである。
【０２７０】
同様に、書込みリクエスト1288は、LUN2502のブロック16-20のデータがLUN2500のブロック85-89へコピーされる結果となる。書込みリクエスト1288が実行された後の、時刻t=6100とt=6117で、ブロック16は2つの書込み動作のターゲットとなり、その一方で各ブロック0-15と17-20は、単一の書込み動作のターゲットとなる。書込みリクエスト1290は、次の記録された書込みリクエストである。その実行後、LUN2502のブロック6-9のデータは、コピーされて、LUN2501のブロック37-40に書き込まれ、そして新しいデータがLUN2502のブロック6-9に書かれる。この時点で、ブロック6-9およびブロック16は、各々2つの書込み動作のターゲットであり、その一方で各ブロック0-5、10-15および17-20は単一の書込み動作のターゲットとなる。書込みリクエスト1291が、書込みリクエスト1290の処理に続いて処理される。書込みリクエスト1291の結果、ブロック7-10のデータが、過去のデータとしてLUN2500のブロック46-49に書き込まれ、そして新しいデータはLUN2502のブロック7-10に記憶される。書込みリクエスト1291の実施後の、ブロック7-9は3つの書込み動作のターゲットとなり、ブロック6、10、そして16は、2つの書込み動作のターゲットでり、そしてブロック0-5、11-15、および17-20は、各々単一の書込み動作のターゲットである。
【０２７１】
図28は、インデックス2009中の、索引モジュール1995によって記憶された記録2010から、マッピング・モジュール1997によって生成した2つの簡略化されたマップ2100、2101の例である。これ等のマップは、指定された過去の時刻にデータ記憶部に記憶されたデータの位置をマップ化するために、記録2010によって提供された情報が、どのようにマッピング・モジュール1997によって使用されるかについてを例示する。説明の容易さのために、このマップは、データ記憶部の20個の記憶ユニットに対するものである。記憶管理デバイス1938は、いかなるサイズ・データ記憶部も、又いかなる数のデータ記憶部によっても用いられることができる。したがって、この明確に示す実施例のように、記憶管理デバイス1938を使用するデータ管理システムは、20個の記憶ユニット台の単一データ記憶部に限られていないと理解すべきである。
【０２７２】
一般に、マップ2100、2101は、ある生成時刻でのある指定された過去の時刻のために、生成されている。このマップの初期生成後に発生した書込みリクエストを正確に反映するために、マップは、その初期生成後に、再生または修正される。本願明細書において、用語「初期生成時刻」は、マップが最初に生成された時刻に関連する。「生成時刻」という用語は、マップが、更新される時間的な点（初期生成時刻後の）を意味する。マップ2100は、初期生成時刻t=6127でのマップ内容である。時刻t=6106という指定された過去の時刻でのデータ記憶部のデータ内容について、マップ2100は、あるリクエストを受信した受信部1961に応答して生成される。図28に示される方法において、マップ2100、2101は、指定された過去の時刻からの、書込みリクエストの対象であった記憶ユニットに関しての情報を含むだけである。他の記憶ユニット中のデータは、マッピングなしで留まることはもちろん可能であるが、これはこの種のデータが、最初に書き込まれた記憶ユニット（すなわち現在データ記憶部）に存在するからである。なおこの方法に限られていないが、この種の実行方法は、それがより迅速なマップ生成および、その結果、より迅速なデータ内容生成を可能とするので、有利である。
【０２７３】
ある実施例においては、過去の時刻に関する詳細情報は、リクエスト時刻にホストから与えられ、受信部1961によって実質的に同時に受け取られる。この実施例のバージョンにおいて、マッピング・モジュール1997は、受信部1961によってリクエストを受け取ると実質的に同時に、マップ2100を生成し始める。
【０２７４】
図27のインデックス2009に保存される時刻を参照して、書込みリクエスト1287が、指定された過去の時刻（t=6106）以前に発生した。これらの位置記録2010は、マップ2100を生成する際には関係が無い、これは例えば、書込みリクエスト1287に関連した過去のデータのデータ位置は、指定された過去の時刻よりすでに上書きされているからである。しかしながらマッピングは、指定された過去の時刻以後、そして初期生成時刻前に（そして更新されたマップの場合は、マップ生成時刻前に）、発生した各書込みリクエストのために使用される。例えば、各々の書込みリクエスト1288および1290は、この過去の時刻以後、そしてこの初期生成時刻前に発生したものである。このように、マッピング・モジュール1997は、マップ2100を生成するために、書込みリクエスト1288および1290に関連した記録2010を使用する。もちろんマップ2100が生成された時には、この生成時刻以後発生したそれらの書込みリクエストは、まだ存在していない。例えば、マップ2100がリクエストと実質的に同時に生成されている場合、そのような状況であるため、その書込みリクエストはまだ発生しなかったことは、事実である。しかしながら、後で更に詳細に記載するように、マッピング・モジュール1997は、マップの初期生成時刻以後に発生した書込みリクエスト（そして、関連のcopy-on-write動作）の処理を反映するために、既存のマップ2101を更新することができる。
【０２７５】
図28において、マップ2100は、指定された過去時刻t=6106以降に書込みリクエストの対象であった記憶ユニットのための、過去のデータの位置へのポインタを含む。このように、ブロック6-9は、LUN2501のブロック37-40にマップ化され、そして、ロック16-20はLUN2500のブロック85-89にマップ化される。マッピング・モジュール1997は、マップを生成するためにインデックス2009（図27）に保存される情報を使用する。図28に示した実施例において、これらの記憶ユニットは、指定された過去の時刻t=6106以降は書込みコマンドのターゲットでなかったので、ブロック0-5および10-15の記憶ユニットはこのマップに含まれず、したがって、それらは現在データ記憶部から直接にまだ利用可能である。
【０２７６】
第２のマップ2101は、一般的にマップがどのようにして、初期生成時刻後の書込みリクエストの処理を反映するために、時間経過するのかを図示したものである。例えば、記憶ユニットが以前にマップ化されていなかった場合、次の書込みリクエストのターゲットであるこれ等の記憶ユニット用のマップに、ポインタが加えられる。この例では、マップ2101に、書込みリクエスト1291を反映する生成時刻6131を有する。書込みリクエスト1291は、LUN2502のブロック7、8、9、および10に影響を及ぼす。ブロック10は、このように、マップ更新が適用されるデータ位置の実施例を提供する。ブロック10は、書込みリクエスト1291の結果として、必要とされるポインタの追加を表示している。このポインタは、指定された過去時刻t=6106でブロック10に記憶されたデータが移動して、現在はLUN2500のブロック49に記憶されるという事実を反映する。マップ2101の残りは、ブロック6-9のマッピングを含み、第１のマップ2100から不変のままである。ブロック6-9のマッピングは、影響を受けないままであり、その理由は、時刻t=6130で、一つのcopy-on-write動作（書込み動作上のコピー）がブロック6-9に実行されたが、それは特定の過去の時刻t=6106ではブロック6-9に記憶されたデータの位置に影響を及ぼさなかったためである。従ってそのデータは、LUN2501のブロック37-40に記憶されたままである。
【０２７７】
マップ2100および2101は、マップ化されたデータ範囲を効果的に検索出来るいかなるデータ構造にも記憶されることができる。ある実施例においては、マップ2100および2101は、そのマップに含まれるブロックを迅速に識別できるバイナリーツリー内であり、かつ指定された過去の時刻以降に上書きされた記憶ユニットのためのデータ源（現在データ位置）の位置を決めるためにバイナリーツリー内に記憶されている。他の実施形態では、マップは、B＋ツリーに記憶される。これ等各々の実施例のバージョンにおいて、検索ツリーの各ノードには、そのデータ範囲のためのデータ源を示すポインタが含まれている。データベース、ファイルおよび他のデータ構造も、そのマップを記憶するために用いることができる。
【０２７８】
説明を容易にするために、第２のマップ2101は、時刻t=6131で生成されている。しかしながらマップ2101は、完全に新しく生成する必要はないと理解されなければならない。すなわちマップ2101は、新しく生成することができが、それはマップ2100に対する更新または修正の結果であってもよい。このように、マップ2100とマップ2101は、別に、そして並行して存在することができ、又はマップ2101は、マップ2100を置き換えることもできる。更に記憶管理デバイス1938は、初期生成時刻以後にインデックス化された書込みリクエストに応答して、マップを更新して生成することができる。加えて図26-28での上述の説明は、データ記憶部に含まれるデータを記憶するための単一のターゲットLUNの使用について述べている。そして又、ある種の実施態様ではデータには、書込みリクエストのターゲット、過去データの格納のターゲット、又はこれ等の組み合わせである複数個のLUN上にあるデータを、含むことが出来ると理解されなければならない。そのデータ記憶部は、複数のLUN上に記憶されたデータを含む時刻データ記憶部および現在データ記憶部が含まれる。
【０２７９】
ある実施例においては、記憶管理デバイス1938は、指定された過去の時刻のデータ内容がリクエストされるマップを処理し始める。マップを生成することは、時間がかかるタスクであるが、しかしながら、ある実施例では、記憶管理デバイス1938は、そのマップに含まれる記憶ユニットに対するリクエストへ応答するために、そのマップを用い、そのマップに含まれない記憶ユニットのデータ位置のために、インデックス2009を検索する。記憶ユニットがインデックスレコード2010に含まれる場合には、その情報は後の参考のために、マップに含ませる。また記憶ユニットがインデックスに含まれない場合には、表記法は、そのマップにおいても同様に行われる。
【０２８０】
全ての適切なインデックスレコード2010が、マップに追加され、マップが完成すると、記憶管理デバイス1938は、インデックス2009を、もはや参照する必要はなく、マップだけに関係することができる。同様に、データが現在データ記憶部にあること示すマップ上の明確なデータは、効率的運用のために、マップから削除することができる。
【０２８１】
他の実施形態では、フラグまたは他のインジケータは、完全なマップを確認するために用いられる。この実施例のバージョンにおいて、マップ2100が構築されるまで、インデックス2009が、データ内容を生成するために用いるデータの位置のための情報源として用いられる。一旦マップ2100が完成すると、このマップは、データ内容を生成するために用いるデータの位置のための情報源として用いられ、インデックスは、最早用いられない。この実施例のバージョンにおいて、表記法は、マップに含まれない記憶ユニットのためには行われない。
【０２８２】
［I／Oリクエスト処理のシステム］
【０２８３】
一般に、本発明の他の態様は、I／Oリクエスト処理ためのシステムと方法に関する。簡単に概説すれば、本発明のある実施例において、ある一つのシステムは、少なくとも一つの論理的記憶ユニットに対するI／Oリクエストを処理する。このシステムは、複数の順序立てた動作セットを記憶するための動作メモリを有し、この動作セットは、各々一つづつのI／Oリクエストに対応している。システムは、更に動作メモリと通信するプロセッサを含み、このプロセッサは、動作メモリに保存した複数の動作を、第１の待ち行列または第２の待ち行列に入れる。第１の待ち行列および第２の待ち行列は、プロセッサと通信する。第１の待ち行列は、ターゲットとされた論理的ユニットの識別データに基づいて複数個の動作を待ち行列に入れる。第２の待ち行列は、動作のタイプに基づいて複数個の動作を待ち行列に入れる。
【０２８４】
一般的に、ある実施例においては、ある一つのリクエストに関連する第１の動作は、一つ以上のLUNまたは一部のLUNに関連した待ち行列上に配列される。複数の記憶ユニットをオーバラップするリクエスト用の処理中の動作が他に無くなるまで、動作はLUN待ち行列に入れられる。なおこの複数の記憶ユニットは、この待ち行列に入れられたリクエストの対象であり、上述のオーバラップするとは、２つのリクエストが、一つ以上の同じ記憶ユニットに対して行なわれることである。換言すれば、本実施例において、ある動作は、進行中の記憶ユニットをオーバラップする動作が無い場合にだけ、その動作は、LUN待ち行列から取り去られて、処理される。そのリクエストに関連した第１と残りの動作は、それから他の動作とオーバラップすることなく、処理されることができる。複数のリクエストのための動作は、例えば、効率性のためにバッチ処理されてもよい。残りの動作は、そのようなバッチ処理を容易にするために、動作用の特定待ち行列に順番に配列される。このように上述の2種類の待ち行列は、アドレスを衝突させずにリクエストの処理が可能となる。
【０２８５】
図29は、本発明の実施態様によるI／Oリクエスト処理のシステムを例示する。ホスト2234は、記憶管理デバイス2238を介して、物理的な記憶部2236と接続されている。物理的な記憶部2236は、一つ以上の論理的ユニット（「LUN」）、例えばLUN1からLUNX、を含むことができる。これらのLUNに記憶されるDataは、記憶管理デバイス2238を介してホスト2234に示されることができる。記憶管理デバイス2238は、第１の通信リンク2240経由でホスト2234と通信する。記憶管理デバイス2238は、第２の通信リンク2242経由で物理的な記憶部2236と通信する。先に述べた実施例と同様に、第１の通信リンク2240は、いかなる種類ものデータ通信リンク、例えばLAN、記憶ネットワーク、又はファイバーチャネルおよび小型計算機システム・インターフェース（「SCSI」）を含むバス）であってもよい。Ethernet（登録商標）（例えばギガビットイーサネット（登録商標））および無線通信は、第１の通信リンク2240の他の選択可能性である。ある実施例においては、記憶管理デバイスは、論理レイヤでSCSIプロトコルを通信し、様々な物理レイヤの一つ以上を使用して通信することが可能であり、その様々な物理レイヤには、SCSIバス、ファイバーチャネル、ファイバーチャネル2、またはイーサネット（登録商標）経由iSCSIが含まれる。通信リンク2240経由し、ホスト2234のI／Oリクエストに応答して、あたかも物理的的な記憶部2236であるかのように、記憶管理デバイス2238は作動する。ホストの2234のI／Oリクエストは、記憶ユニットに対する読出しおよび書込みリクエストの両方を含むことができる。
【０２８６】
ホスト2234からのI／Oリクエストを受けると、記憶管理デバイス2238は、そのI／Oリクエストを実行するために、処理されるべき順序づけられた動作セットを生成する。ある実施例において、例えば、ある記憶ユニットに対する書込みリクエストは、結果的には、以下の順序づけられた5つの動作を含む一セットとなる：
1)ターゲット記憶ユニットに記憶される既存のデータを読込むこと；
2)既存のデータを他の位置に書き込むこと；
3)ステップ2において実行した動作にインデクを付すること；
4)新しいデータをターゲット記憶ユニットに書き込むこと；
そして、
5)書込みリクエストがリリースしている通知を生成して、例えばその書込みリクエストをリリースすること。
他の例は、結果的には、順序づけられた2つの動作となる読出しリクエストである。第１の動作は、ターゲット記憶ユニットに記憶されるデータを読込むこと、そして第２のステップは、その読出しリクエストをリリースすることである。その他の実施例では、上記のI／Oリクエストは、ある種のシステム構成のために有利である付加的な動作を含めるために変更される。例えば書込みリクエストは、上述のように、時刻マップを更新する動作を含めてもよい。他の実施態様においては、I／Oリクエストに関連する幾つかの動作は、最適化の一部として、削除または順序変更してもよい。
【０２８７】
記憶管理デバイス2238のハードウェアおよびソフトウェア構造は、能率的に順序づけられた動作セットを処理するために有利である。記憶管理デバイス2238は、動作メモリ2296、プロセッサ2262、LUN待ち行列2221、および動作タイプ待ち行列2222を含み、これ等は、内部ネットワーク2280経由で相互と通信する。ある実施例においては、このLUN待ち行列2221は、物理的な記憶部2236（例えばLUNX.によるLUN1）に含まれる各々の対応するLUN1からLUNXまでの複数のLUNのための、別々の待ち行列を含む。動作タイプ待ち行列2222は、待ち行列に入れられる動作のタイプに基づき、複数個の動作を組織するための別々の待ち行列を含む。例えば、索引付け待ち行列は、複数の順序立てセットからインデックス動作を記憶するために用いられる。加えて、動作タイプ待ち行列は、単一のLUNには使用されず、従って、索引付け待ち行列および他の動作タイプ待ち行列は、複数のLUNに対する複数の動作を記憶することができる。機能的に、ある実施例においては、順序づけられた動作の各セットでの第１の動作は、適切なLUN待ち行列において待ち行列に入れられる。順序付けられた複数のセットの形をした、第１の動作を先頭にした複数個の動作は、LUN待ち行列に入れられない。その代わりに、これ等の動作は、動作タイプ待ち行列中に入れられる。
【０２８８】
図30は、システムのある実施例によって使用される一般のプロセスを例示する。ステップ2304において、記憶管理デバイス2238は、ホスト2234からI／Oリクエストを受け取る。例えば、ある実施例においては、ホスト・インターフェース361（図10）は、I／Oリクエストを受信する。ステップ2305において、記憶管理デバイス2238は、I／Oリクエストに関連した１セットの順序づけられた動作を生成する。それからステップ2306で、順序づけられた動作のセットの第１の動作が、受信されたI／OリクエストのターゲットであるLUNに対して責任があるLUN待ち行列に置かれる。第１の動作が、待ち行列の中から取り出され、処理される。ステップ2307で、順序づけられたセット中の次の動作が、処理される。ある実施例においては、これらのステップの実行は、以前本願明細書において記載された実施例によって達成される。例えば、通常、各々のステップは、プロセッサーモジュール378（図10）で実行されることができる。より詳しくは、この実施例のバージョンで、I／Oマネージャ362が、ステップ2305を実行して、上記順序づけられた動作のセットを生成し、そしてLUN待ち行列および動作タイプ待ち行列が、I／Oマネージャ362に含まれるたり、含まれないメモリ296（図9）で実行される。ある実施例においては、第１の動作がLUN待ち行列に記憶されると共に、順序付けられた複数のセットの形をした、第１の動作を先頭にした複数個の動作は、メモリに保存される。一旦この第１の動作が、処理されると、順序づけられたセットの第２の動作が、メモリから出され、この第２の動作に対応する動作タイプのための動作タイプ待ち行列中に入れられる。一旦この第２の動作が処理されると、順序づけられたセットの第３の動作が、メモリから出され、それに対応する動作タイプのための動作タイプ待ち行列に記憶される。動作を動作メモリ2296から出されるステップ、それを適切な待ち行列に記憶するステップ、その動作を処理するステップ、順序づけられたセット中の次の動作を適切な待ち行列へ取り出すステップが、I／Oリクエストによって生成した全ての動作が終了するまで、そのI／Oリクエストに関連する各動作のために繰り返される。
【０２８９】
ここで図31を参照して、複数個のI／Oリクエストに対応する入力2410の表2407が、例示される。各入力は、次のデータが含まれている。すなわち、記憶管理デバイス2238がI／Oリクエストを受信した時刻、I／Oリクエストの識別データ、ターゲットLUNの識別データ（例えばLUN#）、I／Oリクエストで影響を受ける論理的ブロック・アドレスまたは記憶の他の装置（例えばターゲット記憶ユニット）、I／Oリクエストのタイプ、およびI／Oリクエストの結果として生成された順序づけられた動作のセット、を含む。デバイス2238ができる記憶管理は、1テラバイト以上のデータ記憶システムに関連する膨大なI／Oリクエスト量を処理する能力を有している。しかしながら、ここでの例示的なテーブルは、説明のために情報の小さいセットを示す。テーブル2407の入力は、時刻t=6100からt=6130まで期間を、少なくともカバーしている。2つのタイプのI／Oリクエストが、テーブル2407中に含まれており、それ等は、読出しリクエスト（1290）、および書込みリクエスト（1286、1287、1288、1289、および1291）である。しかしながら、このシステムは、様々なI／Oリクエスト、例えば修正履歴のリクエストも処理することができる。加えて、これ等のI／Oリクエストは、テーブル2407によってカバーされる時間的な期間では、2つの異なるLUNに対して行なわれており、それ等はすなわちLUN2502およびLUN2503である。
【０２９０】
テーブル2407は、各I／Oリクエストに関連した順序づけられた動作のセットを含む。カラム1からカラム5に示すこの動作の複数のセットは、処理されるべき順序に従い表示されている。例えば、I／Oリクエスト1288は、以下の5つの順序づけられた動作を含む書込みリクエストである：
1)ターゲット記憶ユニットの既存のデータを読込むこと；
2)既存のデータを他のデータ位置に書き込むこと；
3)ステップ2において実行した動作にインデクスを付けること；
4)その新規データをターゲット記憶ユニットに書き込むこと；そして
5)書込みリクエストをリリースすること。
他の実施形態では、書込みリクエストは、異なる順序づけの動作の１セットを含む。例えば、時刻マップが用いられるシステムでは、その書込みリクエストは、以下の6つの順序づけられた動作を含むことができる：
1)ターゲット記憶ユニットの既存のデータを読込むこと；
2)既存のデータを他のデータ位置に書き込むこと；
3)ステップ2において実行した動作にインデクスを付けること；
4)新規データをターゲット記憶ユニットに書き込むこと；
5)必要に応じて、一つ以上の時刻マップを更新すること；そして、
6)書込みリクエストをリリースすること。
更に、I／Oリクエスト型の順序づけられた動作の全体は、順序づけられた動作の一つ以上をサブ動作に分割することによって拡大されることができる。例えば、上記のセットの動作5）を2動作に分割し、1つの動作は、時刻マップが以前生成していたかどうかについて判断することに対する動作であり、そしてもう1つの動作は、そのマップを更新する動作である。加えて、最適化に関して本願明細書において記載したように、例えば、上述の複数のステップは、順序を変えて実行してもよい。
【０２９１】
図32は、図31の簡略実施例を使用して、LUN待ち行列および動作タイプ待ち行列を含む記憶管理デバイス2238の動作を説明するために用いる簡略図を開示する。図32の表のデータは、図31の表2407の情報に対応している。最も左のカラムの情報は、記憶管理デバイス2238が、関連するI／Oリクエストを受信した時刻を表す。LUN2502およびLUN2503とラベルをつけられるコラムは、2つのLUN待ち行列を表す。図32の右半分は、動作タイプの待ち行列を表す。4種類の動作タイプの待ち行列が、示されている：すなわち
1)ターゲット記憶ユニットから他のデータ位置へ、既存のデータを書き込む動作のための書込み待ち行列（これらの待ち行列は、「既存データ書込み（write-existing）」待ち行列とも呼ばれる）；
2)前述の書込み動作の完了により得られたデータ位置を記録する動作を、待ち行列に入れるためのインデッス待ち行列;
3)新規データをターゲット記憶ユニットに書き込む複数の動作の順序をつけるための、新規データ書込み待ち行列;そして、
4)前述の順序づけられた動作のセットが完了したことを示す動作を、待ち行列にするリリース待ち行列。
【０２９２】
この待ち行列の内容は、テーブル2407に示される順序づけられた動作のセットの個々の動作を表す。各動作は、それを生成したI／Oリクエストの識別データ、およびハイフンの右の、順序づけられたのセット中で、その動作が一部として保持する順序番号、とで表示されている。このように、I／Oリクエスト1286（新規データ書込み動作）から生成した順序づけられた動作のセットの、4番目の動作が、図32の1286-4として表示されている。さらなる例として、I／Oリクエスト1288の結果として生成した順序づけられた動作のセットの、第１の動作は、1288-1として表示されている。
【０２９３】
時刻T=6100で、I／Oリクエスト1286が、記憶管理デバイス2238によって受け取られる。記憶管理デバイス2238は、図31のt=6100で示される複数個の動作のセットに対応して、I／Oリクエスト1286の結果としての順序づけられた動作のセット（すなわち1286-1、1286-2、1286-3、1286-4および1286-5）を生成する。順序づけられたセットの複数個の動作は、動作メモリ2296に保存される。順序づけられたセットの最初の動作から始めて、順序づけられたセットの各々の動作が、一つずつ待ち行列に持ち込まれて処理される。このように、t=6100で、動作1286-2、1286-3、1286-4および1286-5が。動作メモリ2296に記憶されると共に、動作1286-1が、LUN2502に入れられる。なお第１の動作（動作1286-1）は、I／Oリクエスト1286がLUN2502に対するものであるので、LUN2502待ち行列に記憶される。
【０２９４】
記憶管理デバイス2238の処理状態が、図32のt=6119で、次に見られる。この時までに、記憶管理デバイス2238は、さらに2つのI／Oリクエスト、すなわち1287および1288を受信した（それぞれ時刻t=6114、時刻t=6117で）。また動作1286-1（すなわちターゲット記憶ユニットに存在するデータの読込み動作）は、処理されている。その結果、動作1286-2は、識別されて、既存データ書込み待ち行列に記憶される。これは、動作1286-1は既に処理され、それは、最早LUN2502待ち行列には記憶されていないからである。しかしながら、リクエスト1287および1288の両方が、LUN2502に対するものであり、従って、現時点ではLUN2502待ち行列には、これら2つの未処理I／Oリクエストの第１動作が含まれている。これらの2つの動作は、それらが記憶管理デバイス2238によって受け取られた順序で実行される。すなわち1287-1の後に1288-1の順序で、記憶ユニットがオーバラップして処理されるリクエストが無くなるまで実行される。
【０２９５】
記憶管理デバイス2238は、能率的に、そして正確にI／Oリクエストを処理するために、より詳細に本願明細書において記載するような検索ツリー、アルゴリズムおよび他のシステム及び方法を含むことができる。ある実施例においては、記憶管理デバイス2238は、新しく受信されたI／Oリクエストが、現在処理されている一つ以上のI／Oリクエストのターゲットでもある記憶ユニットをターゲットとしているかどうかを判断するために、オーバラップ検出プロセスを使用する。その場合は、前のI／Oリクエストの全ての動作が処理されるまで、順序づけられたセット中の新しく受信されたI／Oリクエストの第１の動作は、その適切なLUN待ち行列に保たれる。しかしながら、新しく受信されたI／Oリクエスト（すなわち1287および1288）が、以前受信されたI／Oリクエスト（例えば1286）と同じターゲット記憶ユニットのいずれもターゲットとしない場合には、記憶管理デバイス2238は、順序付けられた複数のセットの形をした、第１の動作を先頭にした複数個の動作（例えば1286、1287および1288）を処理することが出来る。先に述べた処理を容易にするために、記憶管理デバイス2238は、より詳細に本願明細書において記載するように、動作タイプ待ち行列において待ち行列中に入れられた複数の動作をバッチ処理するシステムと方法を、含むことができる。このように、記憶管理デバイス2238の全体的な演算速度および効率を上昇させるために、動作が同一性の他の動作によって待ち行列において加えられるまで、その動作は、動作タイプ待ち行列に保たれる。
【０２９６】
時刻T=6122で、記憶管理デバイス2238は、動作1286-2（既存データ書込み）を処理し終え、リクエスト1286、1287および1288が、ターゲットLUN2502のオーバラップしない部分に対したものであると決定し、動作1287-1および1288-1を順次処理し、そして更に2つのI／Oリクエスト（すなわち1289および1290）を受信した。各々の新しく受信されたI／Oリクエスト（すなわち1289-1および1290-1）の第１の動作は、LUN2502待ち行列に記憶される。動作1287-1および1288-1は、それらが処理されるときにLUN待ち行列から移動された。動作1286-2が、既存データ書込み待ち行列から移動されており、そして動作1286-3が、動作メモリ2296から引き出され、インデックス待ち行列に記憶された。同様に、動作1287-2および1288-2が、動作メモリ2296から引き出され、既存データ書込み待ち行列に記憶された。
【０２９７】
時刻t=6124の待ち行列のデータ内容は、上記のバッチ処理方法の簡略実施例を示す。時刻t=6122およびt=6124間で、動作1287-2および1288-2が、既存データ書込み待ち行列から移動され、そして共に処理される。その結果、動作1287-3および1288-3は、動作メモリ2296から引き出され、それ等は、まだ処理されない動作1286-3に加わるインデックス待ち行列に記憶される。LUN待ち行列の動作については、動作1289-1が処理され、そしてその結果、動作1289-2が、動作メモリ2296から引き出され、既存データ書込み待ち行列中に記憶された。しかしながら、I／Oリクエスト1289および1290（すなわち図31においてリストしたブロック26-28）のターゲットである記憶ユニットのオーバラップがあるので、I／Oリクエストの動作1289の全てが処理されるまで、動作1290-1は処理されない。一方、動作1290-1は、LUN待ち行列2502に留まり、そして動作1290-2、1290-3、1290-4および1290-5が、動作メモリ2296に留まる。
【０２９８】
インデックス待ち行列の3つの動作（すなわち1286-3、1287-3および1288-3）は、ここで共に処理される。3つのインデックス動作が終了した後に、対応する新規データの書込み動作（すなわち、1286-4、1287-4および1288-4、それぞれ）が、動作メモリ2296から引き出され、時刻t=6125で新規データ書込み待ち行列に、記憶される。また時刻t=6125で、LUN2503に対するI／Oリクエスト1291が、記憶管理デバイス2238によって受け取られる。リクエスト1291の結果として生成した順序づけられたセットの第１の動作は、LUN2503の待ち行列中に記憶される。更に、時刻t=6125で、待ち行列にあるLUN2503に対する他のいかなる動作も、存在しない。従って動作1291-1は、LUN2503待ち行列中の第１の動作として記憶される。次の動作（すなわち1291-2、1291-3、1291-4および1291-5）が、動作メモリ2296に保存される。この時に、図32に示される2つのLUN待ち行列の各々は、単一オペレーションを含む。動作1291-1が時間的に後に受け取られたにもかかわらず、動作1291-1は、動作1290-1の前に処理されることができる。この理由は、LUN2503待ち行列中には、1291-1に先行する動作が無く、そしてこの例では、LUN2503のための処理中の動作は無いからである。対照的に、動作1290-1は、I／Oリクエスト1289に関連した動作の全てが完了するまで（すなわち1289-2、1289-3、1289-4および1289-5）、待ち行列に留まっている。
【０２９９】
時刻T-6127で、時刻t=6125で動作タイプ待ち行列に記憶された各々の動作が処理されたように、動作1291-1も処理された。この処理の結果、動作1286-5、1287-5および1288-5が、動作メモリ2296から引き出され、リリース待ち行列へ移動する。
この時に、I／Oリクエスト1286、1287および1288に関連した動作は、動作メモリ2296にもはや保存されない。また、動作1289-4は、動作メモリから引き出され、新規データ書込み待ち行列に記憶され、そして動作1291-2は、動作メモリから引き出され、既存データ書込み待ち行列に記憶される。動作タイプの待ち行列が、複数のLUNで使用できると、この実施例からよく理解される必要がある。例えば、動作1291-2は、LUN2502に対する動作、または記憶管理デバイス2238が処理している複数のLUNのいかなる組み合わせに対する動作と共に、処理されることができる（バッチ処理も含む）。
【０３００】
時刻T=6129までに、実施例I／Oリクエストで第１の分は、完了される。リリース動作1286-5、1287-5および1288-5は、一緒に処理される。各リリース動作は、関連するI／Oリクエストが終了したというシステム通知を提供する。一旦リリース動作が処理されると、対応するI／Oリクエストは終了し、そしてLUN待ち行列も動作タイプ待ち行列も、完了したI／Oリクエストに関連するいかなる動作も記憶しない。その結果、時刻t=6129では、動作タイプ待ち行列は動作1291-3をインデックス待ち行列に含むだけであり、そして1289-5をリリース待ち行列に含むだけである。I／Oリクエスト1289は未完成であるので、動作1290-1はLUN2502待ち行列に留まっている。
【０３０１】
ここで図33を参照して、システム構成要素の機能的図面において、記憶管理デバイス2538は、動作ジェネレータ2525を含む。この動作ジェネレータ2525は、ホスト2534からのI／Oリクエストを受信する。前述したように、各I／Oリクエストのために、順序づけられた動作のセットは、I／Oリクエストのタイプで決定される。ある実施例においては、動作ジェネレータ2525は、I／Oリクエストを受信すると、即座にI／Oリクエストのタイプを判断する。I／Oリクエストのタイプに基づいて、動作ジェネレータ2525は、1セットの順序づけられた動作を、ホスト2534から受け取った各I／Oリクエストから抽出する。ある実施例においては、動作ジェネレータ2525は、記憶管理デバイス2538の処理モジュール378（図10）に含まれる。この実施例のバージョンにおいて、動作ジェネレータは、図10のターゲットモード・ドライバ382に含まれる。記憶管理デバイス2538は更に、上記抽出された複数の動作が待ち行列へ移動する前に、それ等の動作を記憶する動作プール2524を含む。ある実施例においては、動作プール2524は、動作メモリ2296に含まれる。この実施例のバージョンにおいて、この動作メモリは、図10のバッファ363に含まれる。
【０３０２】
記憶管理デバイス2538は、LUN待ち行列モジュール2521および動作-タイプ待ち行列モジュール2522を含む。LUN待ち行列モジュール2521は、動作の各順序づけられたセットから、動作プール2524から、第１の動作を受け取って、それをそれが処理される適切なLUNに記憶する。図33に図示した実施例において、LUN待ち行列モジュール2521は、処理管理モジュール2526を含む。ある実施例において、一般に、処理管理モジュール2526は、LUN待ち行列に記憶されている動作の処理を管理する。より詳しくは、処理管理モジュール2526は、LUN待ち行列に記憶された複数の動作が、以下のように確実に処理されるようにする。すなわち順序づけられたセット中にある次の複数個の動作が、動作タイプの待ち行列に引き出された時に、その複数個の動作が、その動作タイプの待ち行列に記憶されている他の如何なる動作に対しても、ベキ等の関係であるようにされている。処理管理モジュール2526により用いられるプロセスは、より詳細に本願明細書において他の箇所で記載されている。しかしながら、ある実施例においては、処理管理モジュール2526は、LUN待ち行列2221に記憶される動作の実行順序を決めるために、検索ツリー・データ構造を使用する。他の実施形態では、処理管理モジュールは、少ないI／Oリクエスト量を受信するLUNsに対する動作が、タイムリな方法で処理されることを確実にするために、フェアーネス・アルゴリズムを使用する。この実施例のバージョンにおいて、処理管理モジュール2526は、各未処理動作がLUN待ち行列に記憶されている時間をモニタする。
【０３０３】
動作-タイプ待ち行列モジュール2522は、動作プール2524から、第１の動作を先頭にした複数個の動作を順序付けられたセットの形で受信し、それらを適切な動作タイプ待ち行列に記憶する。動作-タイプ待ち行列モジュールも、バッチング・モジュール2528を含む。バッチング・モジュール2528は、動作タイプ待ち行列に記憶される動作の処理を最適化するために用いることができる。例えば、隣接する記憶装置に対する2つの未処理の動作は、物理的な記憶部によって実行されなければならない読み書き動作の量を減らすために、単一バッチで処理されることができる。このように、全体の演算速度を上げるために、より大きなバッチが利用できるまで、バッチングは未処理の動作の処理を遅延させることが必要である場合がある。
【０３０４】
記憶管理デバイス2538は更に、索引モジュール2523を含む。索引モジュール2523は、copy-on-write動作（書込み動作上のコピー）の結果として移動するデータの位置の記録を生成する。索引モジュール2523は、図10のI／Oマネージャ362に含まれることができる。ある実施例においては、インデックス待ち行列（例えば、図32に示すように）は、索引モジュール2523の作成記録を生成する動作を記憶する。
【０３０５】
［オーバラップ検出］
【０３０６】
少なくともこの開示された技術のある実施例に従い実施される記憶管理デバイスは、企業内ホストプロセッサからの特定の論理的記憶ユニットに対するI／Oリクエストを効率的に処理するによって、企業の情報技術基盤の効率性を高めることができる。リクエスト元ホストプロセッサ（または処理スレッド）が、他のタスクへ移動する前に、複数個の記憶ユニットへのI／Oリクエストが完了するのを待つ従来の記憶処理とは対照的に、ここで開示された技術は、少なくとも、いくつかのI／Oリクエストは、実際には完了していなくとも、それ等のI／Oリクエストが、待ち行列に入れられた時点で（例えば、それらの受信時刻に基づいて、そしてそれらのターゲットとされた論理的記憶ユニットに基づいて）、記憶管理デバイスが、ホストプロセッサにI／Oリクエストの完了を通知することを可能にする。これにより、対応する動作の待ち行列に置かれたシーケンスが、最適化され、それ等の動作を実行するために、ディスクへのアクセスを最小化し、これにより企業の記憶システムの効率性を改善することが可能となる。
【０３０７】
非限定的ではあるが、この種の最適化の実施例として、同一（または部分的にオーバラップする）データ位置に対する読出しリクエストに続く、論理的記憶ユニットの特定のデータ位置に対する書込みリクエストを受信することに応答して、ここに開示された技術のある実施例を用いた記憶管理デバイスは、複数個のリクエスト間にオーバラップが存在すると決定し、その場合には書込みリクエストが終了しているまで、読出しリクエストの実行をその間は止めることが出来る。別の例として、オーバラップが検出された場合には、例えば一時記憶のデータを用いて、データの読出しをデータの書込み完了前に、行なうことができる。これにより、ディスクへの全体的アクセス回数を減らし、記憶データをRAM（比較的遅いディスクからよりはむしろ）から続けて読み出すことが可能となる。
【０３０８】
また、あるI／Oリクエスト処理、例えば本願明細書においてその記載されているように、I／Oリクエストの処理は、同時処理をするI／Oリクエスト（例えば、特別な最適化の部分を除き）を、オーバラップしない記憶ユニット（例えば複数個のブロック）に対するI／Oリクエストに制限することによって、強化することができる。このように、記憶のオーバラップする装置を目的とするI／Oリクエストがあるかどうか能率的に判断することによって、そしてそのような情報を使用して、I／Oリクエストを処理すべきか、或いは待ち行列に入れるかを判断することにより、この種の処理を、改善することが可能となる。このように、上述の最適化を可能にすることに加えて、未処理のI／Oリクエストのターゲットであるデータ位置に関する情報を能率的に提供するデータ処理資源（例えばリスト、データベース、ツリー構造、リンクリストまたは他の資源）によって、記憶管理システムがより能率的にI／Oリクエストを処理することが出来るようになる。この理由は、その記憶管理システムが、同時処理を、オーバラップしない記憶ユニットへのI／Oリクエストに制限することができるかあである。
【０３０９】
ここで図34の参照にして、図示する記憶管理デバイス（図示せず）は、一つ以上のソフトウェア・プロセス2602（例えばスケジューラ・ソフトウェア・プロセス）を含むことができ、上記このプロセスは、特定の論理的記憶ユニット2612、2614に関連したリクエスト待ち行列2608、2610、又はそのようなリクエスト2604、2606によりターゲットにされるそのようなリクエスト待ち行列の一部に関連するI／Oリクエスト2604、2606の受信と記憶を行なう。特定のリクエスト待ち行列2608中のI／Oリクエスト2604は、複数のリクエスト2604が、それらが受け取られた順序で処理されることを（または待ち行列2608の中に配置されることを）確実となるように、好ましくは組織されている（例えば、時刻Tlで受信したI／Oリクエスト1の2604’は、後の時刻T2で受信したI／Oリクエスト2の2604より前に配置される）。リクエスト待ち行列2608、2610は、好ましくは、論理的記憶ユニット2612、2614又はその部分に関連したリクエスト2604、2606を、記憶するように構成されることもできる。特定の待ち行列2608中のI／Oリクエスト2604は、論理的記憶ユニット2612中のさまざまなオーバラップした、および／又はオーバラップしないアドレス範囲に対するものであるかもしれない。他のI／Oリクエスト2604’に関連した例えば、論理的記憶ユニット2612に対するI／Oリクエスト2604’に関連したアドレス範囲（アドレス0からアドレス15）2616’は、他のI／Oリクエスト2604’’に関連する他のアドレス範囲（アドレス8からアドレス11）にオーバラップするするかもしれない。同様に、I／Oリクエスト2604’に関連したアドレス範囲（アドレス0からアドレス15）2616’は、I／Oリクエスト2604’’に関連したアドレス範囲（アドレス16からアドレス32）2616’’から明確に区別されており、従ってオーバラップしないかもしれない。
【０３１０】
待ち行列中に入れられたI／Oリクエスト2604、2606は、特定の動作2620が対応するI／Oリクエスト2604、2606を満たすために実行されなければならない複数のシーケンスを、識別する一つ以上の動作シーケンス2618と、更に関係していることがあってもよい。スケジューラ・ソフトウェア・プロセス2602は、対応する動作待ち行列2622の待ち行列中で、待ち行列に入れられたI／Oリクエスト2604、2606に関連した動作2620を組織することもでき、更にスケジューラ・ソフトウェア・プロセス2602は、ターゲットとされた論理的記憶ユニット2612、2614に関連する記憶装置の性能を最適化する方法で（例えば、この種の記憶装置にディスクアクセスを最小化することによって）、待ち行列に入れられた複数の動作2620を実行することができる。対応するI／Oリクエスト2604、2606の受信時刻と整合するようにして実行されることを確実にする方法で、そして効率性の最適化がされる方法で、一つ以上の動作待ち行列2622の中で待ち行列に入れられた複数の動作2620が、実行されることを確実にするために、スケジューラ・ソフトウェア・プロセス2602は、待ち行列データ構造2624（例えばバイナリーツリーおよび／又は他のタイプのツリー・データ構造）を検索する。この検索は、動作2620がオーバラップしないアドレス範囲（例えば2616’と2616’’）関連しているかどうか、又は動作2620の一つ以上が、オーバラップするアドレス範囲（例えば2616’と2616’’’）に関連しているかを、判断するために検索される。アドレス範囲2616がオーバラップする場合、各ノード2626がオーバラップしないアドレス範囲に関連するように、スケジューラ・ソフトウェア・プロセス2602は、バイナリーツリー2624の中の一つ以上のノード2626を分割する。
【０３１１】
1つの例示的な実施例において、少なくとも本願に開示された技術の少なくともある実施例に係るスケジューラ・ソフトウェア・プロセス2602により検索されるバイナリーツリーデータ構造2624の各ノード2626には、以下を含むことができる。すなわち、論理的記憶ユニット2612の識別子と、I／Oリクエスト2604のリスト（リンクリスト）へのポインタ、一つ以上の動作シーケンス2618への識別子および／又ポインタと、ポインタ、その動作シーケンス2618中の特定の動作2620への識別子および／又はポインタと、論理的記憶ユニット2612中のオーバラップしないアドレス範囲2616へのポインタと、親ノード（親ノードが存在する場合、無ければゼロ）へのポインタ、および／又は子ノード（子ノードが存在する場合、無ければゼロ）へのポインタ、とが含まれている。各ノードに関連したデータおよびポインタは、ツリー・データ構造2624内での関係を形成するために用いられ、そして、特定のI／Oリクエスト2604および／又は関連する動作2620が、オーバラップするアドレス範囲2616や、オーバラップしないアドレス範囲2616に対しているのかを判断するときに、スケジューラ・ソフトウェア過程2602によって、関連するでたを検索しおよび取り出したりするのを、容易に行なうために用いられる。
【０３１２】
1つの図示する動作で、そして又ここで図35を参照して、記憶管理デバイス（図示せず）のスケジューラ・ソフトウェア・プロセス2602は、一つ以上のホストから、一つ以上の論理的記憶ユニット2612、2614又はそれ等の一部に対するI／Oリクエスト2604、2606を受け取る。リクエスト待ち行列2608が未だ存在していない場合には、スケジューラ・ソフトウェア・プロセス2602は、各々の論理的記憶ユニット2612のためのリクエスト待ち行列2608を形成し、I／Oリクエスト2604を受信した時刻に従い、前記複数個の論理的記憶ユニット2612をターゲットとするI／Oリクエスト2604（又はそれ等のマーク）を記憶する（2702）。スケジューラ・ソフトウェア・プロセス2602は、データとポインタを得るために、および／又は形成するために、待ち行列中に入れられたI／Oリクエスト2604を評価する（2704）。なおこれ等のデータとポインタは、上述のように、待ち行列データ構造2624の複数個のノード2626を形成するために用いられ、また各々のノード2626は、オーバラップしないアドレス範囲2616と関係している。
【０３１３】
非限定的な実施例として、スケジューラ・ソフトウェア・プロセス2602は、1個以上の論理的記憶ユニット2612に関連する識別子および／又はポインタ、待ち行列中に入れられたI／Oリクエスト2604、I／Oリクエスト2604に関連する動作2620および動作シーケンス2618、I／Oリクエスト2604によって識別されるアドレス範囲2616、を抽出することができ、および／又はバイナリーツリーデータ構造2624のノード2626を形成するために必要または望ましい他のいかなる情報を得ることができる。仮に2つ以上の待ち行列中に入れられた複数のI／Oリクエスト2604が、オーバラップするアドレス範囲2616に対するものである場合、スケジューラ・ソフトウェア・プロセス2602は、対応するオーバラップしないアドレス範囲を含むノード2626を形成することができる。例えば、第１のI／Oリクエスト2604’が、第１の論理的ユニット2612のアドレス範囲2616’（アドレス0から15）に対するものであり、そして第２のI／Oのリクエスト2604’は、オーバラップするアドレス範囲2616’’’（アドレス8から12）に対するものである場合には、スケジューラ2602は、例えば、関連するアドレス範囲がオーバラップしない3つのノードを形成することができる。すなわち、第１のノードが、アドレス0から7に関連し（これ等は、第１のI／Oリクエスト2604’と、更に関係している）、第２のノードが、アドレス8から12に関連し（これ等は更に、第１および第２のI／Oリクエスト2604’、2604’’の両方に関連している）、そして第３のノードが、アドレス13から15に関連している（これ等は更に、第１のI／Oリクエスト2604’に関係している）。このように、複数個のIOリクエストが、オーバラップするアドレス範囲を識別するか、或いはオーバラップしないアドレス範囲を識別するかに関係なく、各ノードが、論理的記憶ユニット中の明確なオーバラップしないアドレス範囲に対応するのを、スケジューラ2602は確実に行なう。一旦ノード2626が形成されると、スケジューラ2602は、例えば、他のノードへの親ポインタおよび／又は子ポインタを使用して、データ構造2624中に（例えばバイナリーツリーに）複数個のノードを配置する（2706）。なおこれ等のノードは、論理的記憶ユニット2612の中で、必ずではないが、実質的に隣接するアドレス範囲2616に配置されることになる。
【０３１４】
オーバラップするアドレス範囲を有するI／Oリクエストが、このリクエストより前にそのノード2626中で含まれないことを確認するために、バイナリーツリー2626に対する第１の検索を行なうことで、スケジューラ2602は、このI／Oリクエスト2604に関連する動作2620を実行することができる（2708）。上記の通り、動作待ち行列の動作を待ち行列に入れることによって、リクエストに関連した前記動作の実行は、複数のステージで実行することが出来る。例えば、ある1つのI／Oリクエストに関連した書込み動作が実行され、そしてその第１の書込み動作が終了したあと、後で発生したI／Oリクエストにおいて識別される同一またはオーバラップするアドレスに対する他の書込み動作が、これ等の2つのリクエストの処理が順次実行されるような方法で、実行される。
【０３１５】
ある実施例においては、スケジューラ2602によって待ち行列に入れられる動作2620は、特定の時間間隔に受け取られた一つ以上の束としてのI／Oリクエスト2604に基づくバッチ処理で実行される。他の実施形態では、I／Oリクエストが受け取られる毎に、スケジューラ2602によって待ち行列に入れられた動作2620は、実質的にリアルタイムで実行してもよい。さらに別の実施形態では、スケジューラ2602は、まず最初にバッチモードの動作2620を待ち行列に入れることができ、続いて実質的にリアルタイムで、受け取られたI／Oリクエスト2604に基づいて、動作待ち行列2620をアレンジすることができる。実行された特定の待ち行列の方法論に関係なく、対応するI／Oリクエスト2604が加えられて、処理されて、および／又は取り除かれる毎に、スケジューラ2602は、バイナリーツリーデータ構造の中でノードを加えて、取り除き、および／又は、分割することによって、バイナリーツリーデータ構造2624を維持し、またアップデートすることができる。例えば、対応するI／Oリクエストが完了し、そしてその複数のノードが他のI／Oリクエストと、未だ実行されてないので、関係していない場合には、スケジューラ2602は、バイナリーツリー2624から一つ以上のノード2626を取り除くことも出来る（2710）。仮に新規なI／Oリクエストが受け取られて、そのI／Oリクエストが、すでにバイナリーツリー2624にあるアドレスとオーバラップするアドレスに対したものでない場合には、そのスケジューラ2602は、その新規なI／Oリクエストのオーバラップしていないアドレスに対応する新規ノードを形成することによって、前述のバイナリーツリー2624を拡大することができ（2712）、そしてこの新規ノードをバイナリーツリー2624に加えることができる。なおこれによって実質上は、動作待ち行列2622中にある複数個の動作の再編成となる（必ずしも再編成とはならないが）。さらに仮にその新規なI／Oリクエストが受け取られて、そのI／Oリクエストが、すでにバイナリーツリー2624にあるアドレスとオーバラップするアドレスに対したものである場合には、そのスケジューラ2602は、そのバイナリーツリー2624内の既存のノード2626の一つ以上を、複数ノードに分割することが出来る。なおこの分割は、バイナリーツリー2624内の各ノード2626が、オーバラップしないアドレスを含むことを確実にするために行なわれる（ノードを分割することは、新ノードを生成するよりも速く、また新規ノードをバイナリーツリー2624に組み込むよりも速い点に、留意する必要がある）（2714）。
【０３１６】
このように、特に新しく受信されたI／Oリクエストが、動作待ち行列2622の一つ以上においてすでに待ち行列に入れられた複数個の動作2620のアドレスとオーバラップするアドレスに関連しているかどうかを判断することに関して、バイナリーツリー2624は、実質的に最新の状態を保持し、進行中の待ち行列動作をスケジューラ2602でサポートすることができる。新規なI／Oリクエストが受け取られる毎に、その新規なI／Oリクエストにより識別されるアドレス範囲中に、すでに既存のおよび／又はすでに待ち行列中に入れられたリクエストおよび／又は動作と関係しているアドレス範囲との関係で、オーバラップがあるのか否かを判断するために、スケジューラ2602は、バイナリーツリー2624の複数個のノード2626を直ぐに検索することができる。前述のように、バイナリーツリー2624のアドレスとの関係で、オーバラップしないアドレスを有する新しく受信されたI／Oリクエストに関連した動作は、バラバラな順序でそのような動作を実行することに対する過度の懸念なしで、待ち行列に入れられることができる。なおオーバラップするアドレスがある場合には、データ破損の問題を回避するために、適切な順序で、複数の動作が実行されるのを確実にするより慎重な考慮が必要となる。
【０３１７】
ここで又、図36Aに示すバイナリーツリーの例示的実施形態を参照して、スケジューラ・ソフトウェア・プロセス2602は、例えば、第１のノード2802での最も早い受信時刻（すなわちI／Oリクエスト0）を有するI／Oリクエストに付随する関連情報により、バイナリーツリーデータ構造2624（図34）の第１のノード2802（すなわちノード0）を形成することができる。上述のように、この関連情報は、以下を含むことができる。すなわち、I／Oリクエストによってターゲットとされる論理的記憶ユニットの識別子2804と、一つ以上のI／Oリクエストへの一つ以上のポインタ2806と、そのI／Oリクエストに関連した動作および／又は動作シーケンスへの一つ以上のポインタ2808と、および／又はそのI／Oリクエストに関連したオーバラップしないアドレス範囲への一つ以上のポインタ2810、が含まれる。更にノード2802は、親ノードが存在する場合（さもないとゼロ）、その親のノードへのポインタを含み、子ノードが存在する場合（さもないとゼロ）、その一つ以上の子のノードへのポインタ2814、2816も含む。子のポインタ2814のうちの1つは、より小さいアドレス範囲に関連した1つの子のノードへ、再び向けられ、その一方で、他の子ポインタ2816は、より大きなアドレス範囲に関連した1つの子のノードへ、再び向けられる。
【０３１８】
ここで又、図36Bを参照しして、スケジューラ2802は、既存のノード2802（すなわちアドレス0から15）のアドレスにオーバラップしないアドレス範囲2820（すなわちアドレス16から32）に対する他のI／Oリクエストであり、後に受け取られたI／Oリクエスト（すなわちI／Oリクエスト1）に関連した新ノード2818を形成することによって、バイナリーツリーを拡大することができる。図の明快さを維持するために、図36B-36Dは、表示した複数のノードに関連した情報（図36Aのノード2802に関連して先に述べた）の全てを繰り返すというわけではないが、しかし当業者は、この種の各ノードのための類似した情報が存在することを識別するであろう。
【０３１９】
ここで又、図36Cを参照にして、スケジューラ2602は、この種の既存のノード2802の一つ以上に関連したアドレス範囲（すなわちアドレス0から15）に、オーバラップするアドレス範囲（すなわちアドレス8から11）に対する新規なI／Oリクエストを受信したことに応答して、一つ以上の既存のノード2802を分割することによって、バイナリーツリーを拡大することができ、この場合、そのバイナリーツリー中の分割されたノードは、オーバラップしないアドレス範囲と関係するように、構成される。例えば、最初はアドレス0から15に関連した図36Bのノード02802は、2つの追加的ノード2822、2824（すなわちノード2および3）に分割することができ、これ等の2つの追加ノード2822、2824のアドレス範囲（すなわち、それぞれ、アドレス0から7、および8から11を対象にする）は、ノード02802（すなわちアドレス12から15）のアップデートされたアドレス範囲にオーバラップしない。ポインタ、識別子、および／又はノード2802、2818、2822、2824の各々に関連した他の情報は、アップデートされたツリー構造を反映するために、必要に応じてアップデートされることができる。例えば、ノード02802のアドレス範囲ポインタ2810は、特定の論理的記憶ユニットの中のアドレス範囲12から15を示すために変更することができ；ノード22822のアドレス範囲ポインタ2826は、生成され、論理的記憶ユニット中のアドレス範囲0から7を対象とすることができ；ノード22822のI／Oリクエストポインタ2828は、生成され、I／OリクエストOを対象とすることができ；ノード32824中のアドレス範囲ポインタ2830は、形成され、論理的記憶ユニット中のアドレス範囲8から11を対象とすることができ；そしてノード32824の2つのI／Oリクエストポインタ2832は、形成され、I／Oリクエスト0および2を対象とすることが出来る（両方のリクエストが、アドレス8から11を対象とするので）。同様に、他のノードの情報、例えば動作シーケンス、動作、および／又は親ノードまたは子ノードに対するポインタおよび識別子は、アップデートされたバイナリーツリーデータ構造を形成するために更新されることができる。
【０３２０】
ここで又、図36Dを参照にして、対応するI／Oリクエストが完了すると、スケジューラ2602は、一つ以上のノードを取り除くことによってバイナリーツリーを修正することができる。例えば、I／Oリクエスト0が完了すると、図36Cのノード02802およびノード22822は、バイナリーツリーから取り除かれるが、その理由は、この種のノードは他のいかなるI／Oリクエストも参照しないからである（すなわち、それらのI／Oリクエストのポインタ2806、2828は、I／Oリクエスト0だけを対象とするからである）。バイナリーツリーの残りのノード2818、2824は、新しいツリー階層を反映するために再編成され、そして、それらの関連情報は、取り除かれたノード2802、2822からのそれらの独立性を反映させるために、同様に更新される。例えば、ノード32824のI／Oリクエストのポインタ2832は、I／Oリクエスト0が既に満たされているので、I／Oリクエスト0ではなく、I／Oリクエスト2だけを示すためにアップデートされ、そしてノード1および3つまり2818、2824の親ポインタおよび子ポインタは、バイナリーツリーの新しい階層を反映するために変更されることができる。
【０３２１】
図36A〜36Dに関連した上述の実施例は、この開示の明快さを維持するために比較的簡潔ではあるが、当業者であれば、開示された技術が多数のI／Oリクエストに適用可能であることは識別可能であり、その多数のI／Oリクエストは、複数の論理的記憶ユニットに影響を及ぼす多種多様なデータ通信を例に挙げることが可能となる。なおその場合には、この種の各論理的記憶ユニット（またはその一部）には、異なったバイナリーツリーにおける複数個のノードで構成されたセットが含まれる。前述のように、これらのバイナリーツリーは、一つ以上のスケジューラ2602が、新しく受信したI／Oリクエストによって識別されるアドレス範囲のためのバイナリーツリーのアドレス範囲ポインタを速く検索出来るようにする。そしてこの検索は、動作が目下処理中または処理のために待ち行列に入った状態の未処理のI／Oリクエストが、上記新しく受信したI／Oリクエストのアドレス範囲にオーバラップするかどうかを確認するために行なわれる。スケジューラは、このように、そのリクエストに関連した動作の実行を始めることが可能かどうかを速く判断するために、その検索結果を使用することができる。数多くののリクエストのために、この効率性は、パフォーマンス改善のために有益である。開示された技術は、他のタイプの待ち行列データ構造および／又は他のタイプの命令／リクエストにも適用することが出来る。
【０３２２】
［チェックポインティング］
【０３２３】
ある実施例においては、記憶管理デバイスが、copy-on-write動作シーケンス上にチェックポイントを付けるために用いることができ、そしてこれらのチェックポイントは、記憶管理デバイスの故障時に、リアルタイムデータを復旧させるために有用である。例えば、ある特定のデータ記憶部に対するI／O動作用に指定される1台の第１の処理モジュールと、この第１の処理モジュールにおけるエラーまたはI／Oエラーの検出した時に、この第１の処理モジュールのいかなる処理中の入出力動作の処理を完了させることができる一つ以上の第２の処理モジュールが、冗長性を持って設計される記憶管理デバイスでは、存在する場合がある。開示された技術の実施例は、この種の第２の処理モジュールが、第１の処理モジュールに取って代わって、処理未達成の入出力動作に役立つ情報の使用を可能にする。同時に、開示された技術の実施例は、他の処理情報の記憶装置と一体化する方法で、そして簡便にかつ容易に通信するために、これらのチェックポイントの使用を容易にする。
【０３２４】
加えて、開示された技術の実施例は、第１の処理モジュールによる処理最適化の使用を容易にする。その理由は、第２の処理モジュールは、I／Oエラーの場合に、第１の処理モジュールに代わり、第１の処理モジュールによって試みられているいかなる最適化処理も知る必要はなくなるし、更に第２の処理モジュールは、この第２の処理モジュールが未処理動作を完了するために、どのような処理が必要かを判断するために、ここに開示するチェックポインティング（チェックポイント付け）を使用できるからである。これは、特に数千、数万または、それ以上のI／O処理が、ある特定の時刻に存在する複数個のデータ記憶部を有する大型システムでは、有益である。
【０３２５】
ある1つの例示的な実施例において、そして、図37および38を参照にして、記憶管理デバイス2938は、特定の現在データ記憶部2944（3002）をターゲットにするホスト2934からのI／Oリクエスト2904（例えば書込みリクエスト、読出しリクエスト、その他）を傍受し／受信し、それに応答して、複合的な複数の動作シーケンス2910（例えば複数の書込みリクエスト・シーケンス2912、複数の読出しリクエスト・シーケンス2914、その他）から、そのI／Oリクエスト2904と関係する1つの特定タイプの動作シーケンスを識別する（3004）。非限定的な実施例として、典型的な書込みリクエスト・シーケンス2912には、図38のブロック3006-3010および3014-3018に関して後述する複数個の動作が含まれる。
【０３２６】
記憶管理デバイス2938は、記憶装置の識別子2916や、および／又は書込みリクエスト2904に含まれる現在データが、書き込まれるべき現在データ記憶部2944中のデータ位置2918（例えば、特定の開始アドレスおよびデータ長を含む）を、抽出するために書込みリクエスト2904を解析する。記憶管理デバイス2938は、そのデータ位置2918にある、現在データ記憶部2944中に記憶されているデータ2920（本明細書において、「オリジナルデータ」と称される）を読込んで（3006）、このデータ2920を選択された記憶装置に関連した時刻データ記憶部2946のあて先データ位置2922へコピーする（3008）。書込みリクエスト2904に関連した処理情報2926は、一つ以上のデータ構造、ファイルおよび／又はデータベース（図示せず）に記録されており、例えば、現在データ記憶部2944および／又は時刻データ記憶部2946に関連した装置識別子2916、その書込みリクエスト2904を独自に識別する書込みリクエスト識別子2928、書込みリクエスト2904により影響を受ける現在データ記憶部2944と時刻データ記憶部2946内のデータ位置2918、2922、書込みリクエスト2904を受け取った時刻2930、および／又は書込みリクエスト2904に関連した他のタイプの情報、を含むことができる（3010）。処理情報2926は、このデータ2920をあて先データ位置2922へコピーするのと同じ時刻、その前の時刻、或いはその時刻と同時に、記録されることができる。
【０３２７】
オリジナルデータ2920が、あて先データ位置2922へうまくコピーされない場合、および／又は処理情報2926が適切に記録されない場合には、記憶管理デバイス2938は、記憶管理デバイス2938のユーザに、および／又は関連する他の主体、またはソフトウェア・プロセスに伝えられるエラーメッセージを生成する（3012）。またエラーではなく、そしてデータのコピー2920および処理情報の記録2926が成功すると、記憶管理デバイス2938は、インジケータ2932（本明細書においては、「インデックス・チェックポイント」と称される）を生成し、そしてそのインデックス・チェックポイントは、データのコピーと、そして処理情報の記録動作が、うまく完了したことを確認するものである。このチェックポイント2932は、その後記憶される、又は例えば処理情報2926の一部として記録される（3014）。
【０３２８】
インデックス・チェックポイント2932の生成および記憶に続いて、記憶管理デバイス2938は、現在データ記憶部2944の中の適切な位置2918に、その書込みリクエスト2904によって識別された現在データ（また、「対象データ」と呼ばれる）を書き込む（3016）。現在データが無事に書き込まれない場合、エラーメッセージが生成される（3012）。さもないと、記憶管理デバイス2938はインジケータ2933（本明細書において、「解放チェックポイント」と称される）を生成する。なおこの解放チェックポイントは、現在データが現在データ記憶部2944の所望の位置2918に無事に書き込まれたことを確認するものである。そして更に、この解放チェックポイント2933は、その後、処理情報2926の一部として記憶され／記録される（3018）。インデックス・チェックポイント2932、解放チェックポイント2933および／又は他の処理情報2926は、各書込みリクエストおよび／又は他のタイプの記憶処理イベントのために生成することができ、このように一度に発生するデータ復旧、記憶命令待ち行列再表示／同期、および／又は記憶システム再構成の一群を実行することで、記憶処理エラー（例えば電源異常、ハードウェア障害、データ破損イベント、その他）からデータ復旧させるために用いることができる。なおこれは、例えば、記憶処理I／Oエラー発生の前と実質的に一致する。
【０３２９】
このインデックス・チェックポイントおよび解放チェックポイント2932、2933は、記憶ユニットへの書込み、および／又は記憶ユニットからの読み出しを行なうプロセッサーモジュールまたは他のタイプのデバイスに、特に影響を及ぼすハードウェア障害および／又は電源異常に関して、記憶システムの障害時の許容範囲を強化するために用いることができる。例えば、主プロセッサーモジュールおよび一つ以上の待機プロセッサーモジュールを含む故障許容システムは、以下の場合に、本明細書により利益を受けることになる。すなわち、主プロセッサーモジュールが故障し、そして待機プロセッサーモジュールのうちの1台が、待機プロセッサーモジュール内の記憶命令／動作待ち行列を、そのエラーの前またはエラーと同時期にあった主プロセッサーモジュール内の記憶命令／動作待ち行列と本質的に同一であるとすることにより、一つ以上の記憶ユニットに影響を及ぼす情報通信の主要な制御を行うと仮定するような場合に有用である。このように待機プロセッサーモジュールは、自己の制御責任は、命令の再実行や他の動作の実行をする必要がないと仮定することが可能である。なおこれ等の命令の再実行や他の動作の実行は、そのエラーの前に主プロセッサーモジュールによってすでに実行されいたか、そして、それはさもなければ、待機プロセッサーモジュールに通信されることはなかったものである。この開示された技術は、分析または他の目的のために、待ち行列に入れられたI／Oリクエストの歴史や、および／又は関連する動作の歴史をコピーするために用いることもできる。
【０３３０】
1つの例示的な実施例で、そしてここで図39を参照にして、待機プロセッサーモジュール（図示せず）は、例えば、特定の時刻に受け取られた、そして一つ以上の論理的記憶ユニット3108の特定のアドレスおよび／又はアドレス範囲3106をターゲットとするI／Oリクエスト3104を有する一つ以上のリクエスト待ち行列3102を、含むことができる。リクエスト待ち行列3102’中のI／Oリクエスト3104は、特定の論理的ユニット3108’のアドレスに記憶されたデータに影響を及ぼすために、必ずしも必要ではないが、構成されており、一方では他のリクエスト待ち行列3102’’中の複数個のI／Oリクエスト3104は、異なる論理的ユニット3108’’中の複数個のアドレスに記憶されたデータに影響を及ぼすために構成されている。この待機プロセッサーモジュールは、例えば、一つ以上のリクエスト待ち行列3102中の上述のI／Oリクエスト3104に関連した複数個の動作を含む、一つ以上の動作タイプ待ち行列3110も含むこともできる。各動作待ち行列3110は、特定のタイプの動作だけを含むことができるが、含む必要はない。図示する第１の動作待ち行列3110iは、多くの動作を含むことができるが、そのような動作の一つ以上は、I／Oリクエスト3104’’（例えば、書込みリクエストに対応する）と関連し、そして、現在データ記憶部2944（図37）に関連した論理的記憶ユニット3108’の最初のアドレス範囲3106’’からオリジナルデータを読み出すことを含んでいる。図示する第２の動作待ち行列3110iiは、多くの動作を含むことができるが、そのような動作の一つ以上は、I／Oリクエスト3104’’と関連し、そして、現在データ記憶部2944の最初のアドレス範囲3106’’から、オリジナルデータを時刻データ記憶部2946のデータ位置へコピーすることを含んでいる。図示する第３の動作待ち行列3110iiiは、多くの動作を含むことができるが、そのような動作の一つ以上は、I／Oリクエスト3104’’と関連し、そして処理情報2926（図37）を記録することを含んでいる。図示する第4の動作待ち行列3110ivは、多くの動作を含むことができるが、そのような動作の一つ以上は、I／Oリクエスト3104’’と関連し、そしてインデックス・チェックポイント2932を生成することを含んでいる。図示する第5の動作待ち行列3110vは、多くの動作を含むことができるが、そのような動作の一つ以上は、I／Oリクエスト3104’’と関連し、そして論理的ユニット3108’のアドレス範囲3106’’に対象データを書込むことを含んでいる。図示する第6の動作待ち行列3110viは、多くの動作を含むことができるが、そのような動作の一つ以上は、I／Oリクエスト3104’’と関連し、そして対象データが、論理的記憶ユニット3108’のアドレス範囲3106’’に無事に書き込まれたことを通知することを含んでいる。図示する第7の動作待ち行列3110viiは、多くの動作を含むことができるが、そのような動作の一つ以上は、I／Oリクエスト3104’’と関連し、そして解放チェックポイント2933を生成することを含んでいる。
【０３３１】
ハードウェア異常／電源異常からデータ復旧するためのインデックス・チェックポイント2932および／又は解放チェックポイント2933を使用する1つの図示するデータ復旧プロセスにおいて、そしてここで図39および図40を参照して、記憶管理デバイス2938、記憶システム管理者、および／又はこの種のエラーをモニタしておよび／又はデータ復旧させる仕事を行なう他のタイプの企業は、ハードウェア異常／電源異常を示すエラーメッセージおよび／又は他のタイプのエラー兆候を検出することができる。リクエスト待ち行列3102の内容および待機プロセッサーモジュールの動作待ち行列3110の内容が、ここで異常をもたらした主プロセッサーモジュールの対応待ち行列の内容と一致するか否かを確実にするために、記憶管理デバイス2938は、少なくとも部分的に対応するインデックスおよび／又は解放チェックポイント2932、2933に基づいて、そのリクエスト待ち行列3102の各々のI／Oリクエスト3104を評価することができ、そして、この種のI／Oリクエスト3104が、そのエラー前の主プロセッサーモジュールによって以前、満たされたか又は部分的に満たされたか否かを判断する。この種の決定をすると、即座に記憶管理デバイス2938は、待機プロセッサーモジュールのリクエスト待ち行列3102および／又は動作待ち行列3110を修正することができ、これによりそれらが、そのエラー前の主プロセッサーモジュール中の待ち行列に入れられた、I／Oリクエストおよび関連する動作と本質的に一致するように修正する。
【０３３２】
例えば、記憶管理デバイス2938は、主プロセッサーモジュールの故障の前に待ち行列に入れられた一つ以上のI／Oリクエスト3104を識別するために、待機プロセッサーモジュールのリクエスト待ち行列3102を検索することができる（3202）。各々の識別されたI／Oリクエストのために、記憶管理デバイス2938は、データ構造、ファイル、データベースおよび／又は記憶管理デバイス2938と通信可能な他のタイプのデータ集積部中にあるこの種のインデックス・チェックポイント2932を検索によって、例えば関連するインデックス・チェックポイント2932が存在するかどうかを判断することができる（3204）。ある実施例においては、このチェックポイントは、上書きされたデータの位置および上述の他の情報を記憶しているデータベース中の、書込みリクエストに関する他の情報と共に、記録されている。
【０３３３】
関連するインデックス・チェックポイント2932が無い場合には（オリジナルデータが時刻データ記憶部2946中の現在データ記憶部2944からデータ位置へうまくコピーされなかったcopy-on-writeリクエストの場合を示している場合）、記憶管理デバイス2938は、次の実行のために、I／Oリクエスト3104に関連した動作の完全セットを、待機プロセッサーモジュールの一つ以上の動作待ち行列3110の中に入れることができる（3206）。そのようにしない場合には、記憶管理デバイス2938は、上述したデータ集積部中のこの種の解放チェックポイント2933を検索することにより、例えば、関連する解放チェックポイント2933が存在するかどうかを判断することができる（3208）。関連する解放チェックポイント2933が位置しない場合、記憶管理デバイス2938は、I／Oリクエスト3104に関連した動作の一部分を、待機プロセッサーモジュールの一つ以上の動作待ち行列3110中へ入れることができる（3210）。例えば、そしてI／Oリクエストがcopy-on-write動作シーケンスに対応する場合は、その待ち行列中に入れられた動作の一部分は、複数個の動作を含み、これ等の動作とは、論理的記憶ユニット3108中の特定のデータ位置に、I／Oリクエストによって識別される対象データを書き込む動作や、その対象データが無事に書き込まれたと通知する動作や、および／又はこの種のリクエストに関連する解放チェックポイントを生成する動作が含まれる。またそうでない場合、そして関連する解放チェックポイント2933が存在する場合（主プロセッサーモジュールがそのI／Oエラーの前のI／Oリクエストを、完全に満たしたことを示している場合）、記憶管理デバイス2938は、待機プロセッサーモジュールの動作待ち行列3110から、この種のI／Oリクエストに関連した動作を取り除くことができる（3212）。
【０３３４】
上述した方法論は、待機プロセッサーモジュール中のリクエスト待ち行列3102の各I／Oリクエスト3104に対して繰り返され、この方法論はこれにより、ここで異常発生した主プロセッサーモジュールの対応する待ち行列に、待機プロセッサーモジュールの待ち行列を一致させる。このように待機プロセッサーモジュールのリクエスト待ち行列および動作待ち行列3102、3110は、旧リクエストおよび動作を一掃され、このことにより、ハードウェア異常／電源異常の発生時における、主プロセッサーモジュールの待ち行列と待機プロセッサーモジュールの待ち行列の間での不一致により、実行する必要が無かった、そして望ましくない複数個の動作の仕事量を、最小化したり或いは消去することが可能となる。一旦待機プロセッサーモジュールの待ち行列3102、3110が、望ましくない動作およびリクエストを一掃させ、および／又は望ましい動作をロードされると、上記のように、この種の動作待ち行列3110の残りの動作シーケンスは、リクエスト待ち行列3102のI／Oリクエストシーケンスに従って実行される。この点で、ハードウェア異常／電源異常の復旧効果は完了し、そして待機プロセッサーモジュールは通常の待ち行列動作を再開することができる。
【０３３５】
上述した方法論は、単に例示的なものであり、そして当業者であれば、多種多様な類似した方法で、実質的に同じ結果をもたらすために実行されることを理解することは可能である。例えば、関連する解放チェックポイント2933の存在は、関連するインデックス・チェックポイント2932の存在を判断する前に、判断することが可能である。
【０３３６】
［マップ生成を可能にするための書込みリクエストの記録］
【０３３７】
一般に、別の態様においては、本発明は、現在データ記憶部および時刻データ記憶部と関連するデータ記憶部に対する書込みリクエストを記録する方法と装置に関連し、更に又、過去の時刻のための、少なくともデータ記憶部の一部の（例えば、現在データ記憶部またはその一部分の）、少なくとも一部の時刻マップを生成することが可能となる方法と装置に関連する。上記したように、時刻マップは、現在の時刻に生成した、そして、指定された過去の時点でのデータ記憶部の少なくとも一部分に記憶された現在のデータ位置を有するマップである。
【０３３８】
また前述した様に、ある実施例においては、例えばあるユーザが、過去の時刻での少なくともデータ記憶部一部（例えば、現在データ記憶部またはその一部）のデータ内容を、現時点でリクエストする時に、時刻マップは、コンピューティング装置（例えば上記の通りの記憶管理デバイス）によって生成される。この時刻マップを生成することによって、コンピューティング装置は、そのデータ内容によってカバーされるデータについての各要求または全ての要求に対して、過去データの位置のための全インデックスを検索する必要性を除去することが出来る。むしろ、この時刻マップを参照することによって、コンピューティング装置は、過去の時刻におけるデータ記憶部の少なくとも一部分に記憶されるデータの位置を、迅速かつ効率よく判断することができ、従って迅速かつ効率よくユーザーリクエストに応答することができる。したがってシステム効率は改善され、そしてユーザ満足感を増大させることが可能となる。
【０３３９】
時刻マップを生成することは、過去の時刻でのデータ記憶部の少なくとも一部分に記憶されるデータにアクセスすることができる速度を改善すると共に、ここに開示する本発明の態様は、データ記憶部に対する書込みリクエストを記録するための方法および装置に関し、これによりその時刻マップ自体を生成する速度を改善させることも可能となる。加えて本発明の態様は、その時刻マップがまだ生成途中である場合であっても、過去の時刻でのデータ記憶部に記憶されるデータを即座に表示することを容易させる。
【０３４０】
ある実施例においては、従前のデータ内容についてのリクエストに応じて、コンピューティング装置は、時刻マップを生成し始める。もしマップが完成する前で、ユーザが従前のデータ内容の一部によりカバーされるデータをリクエストし、そのデータの位置は未だその時刻マップに入っていない場合には、システムは、時刻マップが完了していたら、もっと速くその応答ができた程ではないが、合理的な応答時間内に応答出来るように十分即座にデータを検索することができる。本願明細書において記載されているように、過去のデータのデータ位置について、全インデックスを検索する代わりに、インデックスの一部だけ又は複数の一部分だけが、検索され、これにより、この過去のデータ内容によりカバーされるデータに対するユーザのリクエストに、応じることが出来るようになる。このリスポンスを生成するために行なわれた作業内容（例えばデータの位置の決定）も、この時刻マップに記憶することができ、またシステムの総合効率を改善するように記憶される。
【０３４１】
このように、ある実施例においては、従前のデータ内容を生成するリクエストに応じて、例えばバックグラウンドプロセスとして、1つの時刻マップが生成される。データ要求が従前のデータ内容に対するものである場合、しかし一方では要求データのデータ位置が、時刻マップにより未だ示されていない場合（例えば、時刻マップが、未だ完全には生成されていない場合）、本願明細書において記載された技術が、要求データの位置を確認するために用いれ、そしてユーザのデータ要求へリスポンスするために用いられる。この時刻マップは、それからリクエストされたデータの位置で更新される。
【０３４２】
簡単に概説すれば、本発明のある実施例では、第１のコンピューティング装置（例えば上記の通りの記憶管理デバイス）は、第２のコンピューティング装置（例えば上記の通りのホスト）から、複数の書込みリクエストを受け取る。第１のコンピューティング装置は、これらの書込みリクエストの記録を記憶する。ある実施例においては、少なくとも一つの第１のデータベーステーブルおよび第２のデータベーステーブルが、書込みリクエストに関する情報を記録して、かつ上記書込みリクエストによってデータ記憶部上に影響を与える全ての変更を追跡記録するために用いられる。より詳しくは、受け取られた各書込みリクエストのために、第１のコンピューティング装置は、書込みリクエストの入力を、第１のデータベーステーブルへ記録する。書込みリクエストの入力には、受信された書込みリクエストに関する情報が含まれる。さらに、書込みリクエストの入力が、第１のデータベーステーブルに記録される毎に、第１のコンピューティング装置は、必要に応じて、第２のデータベーステーブルの記録を更新する。第２のデータベーステーブルの記録に含まれるデータは、そのデータ記憶部に対する書込みリクエストを要約した形式で表示する。ある実施例において、例えば、第２のデータベーステーブルの記録に含まれるそのデータは、その書込みリクエストを実行した結果、上書きされたデータ記憶部の特定の記憶ユニットを識別する。
【０３４３】
本発明の実施態様による1つの特徴によれば、第１のコンピューティング装置は、どの特定の記憶ユニットが上書きされたかを判断するために、第２のデータベーステーブルの記録に記憶されているデータを、即座にかつ効率よく解釈することが出来る。さらに、ある実施例では、仮に特定の過去の時刻を与えられ、また時刻マップを生成するタスクが与えられていたとすると、第１のコンピューティング装置は、その時刻マップの生成に関連する書込みリクエストの入力を検索するために、複数の第１のデータベーステーブルの一部分を識別する目的で、第２のデータベーステーブルの記録に記憶されるデータを解釈することが可能である。換言すれば、ある実施例においては、時刻マップを生成するときに、本発明では、第１のコンピューティング装置が全ての第１のデータベーステーブルと全ての書込みリクエストの入力を検索する必要性を、除去することが出来る。したがって、総合効率は改善される、そして、時刻マップの迅速な生成が、可能となる。
【０３４４】
更に他の実施例では、時刻マップが完成する前に、仮にユーザが、過去の時刻でのデータ記憶部に記憶されているデータのためのリクエストをする場合、ただしこの場合には、時刻マップが完成していたら可能ではあっても、その時点では現在のデータ位置は未だこの時刻マップでは示されないが、その第１のコンピューティング装置は、第１のデータベーステーブルの全てを捜索しなくても、ユーザにリスポンスするために、即座にそして能率的に、データの位置を識別することが可能となる。更に、このリスポンス生成する場合の作業は、時刻マップを完成させる際にも使用することが出来る。
【０３４５】
図41は、記憶管理デバイス3338のある実施例を例示する。なおこの記憶管理デバイス3338は、データ記憶部に対する複数個の書込みリクエストを記録し、そして過去の時刻でのデータ記憶部（例えば、データ記憶部の現在データ記憶部またはその一部分）の少なくとも一部分の、時刻マップの一部分を生成することが出来る。一般的に言って、記憶管理デバイス3338は、以下の追加的な機能を付加して、上述記憶管理デバイスの能力を有し、かつ上述記憶管理デバイスとして実行される。当然、他の実施態様も可能でもあると理解すべきである。
【０３４６】
ある実施例においては、記憶管理デバイス3338は、少なくとも一つの第１のデータベーステーブル3350を使用するが、複数の書込みリクエスト入力を記録するために、典型的には複数の第１のデータベーステーブル3350を使用する。記憶管理デバイス3338は更に、第２のデータベーステーブル3352を使用し、そしてそれは記憶管理デバイス3338により用いられる各第１のデータベーステーブル3350のための少なくとも一つの記録を含む。さらに、記憶管理デバイス3338は、書込みリクエスト入力が第１のデータベーステーブルに記録される毎に、第２のデータベーステーブル3352中の少なくとも一つの記録を更新するための更新処理モジュール3354を含む。前述したように、記憶管理デバイス3338は、現在データ記憶部3344および時刻データ記憶部3346に関連する少なくとも一つのデータ記憶部3343を管理する。
【０３４７】
オプションとして、記憶管理デバイス3338は、識別モジュール3356、検索モジュール3358、時刻マップ生成モジュール3360、そして、入出力モジュール3362を含むこともできる。過去の時刻におけるデータ記憶部3343の少なくとも一部分に（例えば、現在データ記憶部3344、又はその一部に）記憶されているデータ・リクエストに応じて、記憶管理デバイス3338は、第２のデータベーステーブル3352の一つ以上の記録を解釈し、このことにより、関連した書込みリクエスト入力を検索するための一つ以上の第１のデータベーステーブル3350を識別する識別モジュール3356を、使用することが出来る。記憶管理デバイス3338は、それから、この種の検索を実行するために検索モジュール3358を使用することができ、関連した書込みリクエスト入力を見つけたら、過去の時刻におけるデータ記憶部の少なくとも一部分の、少なくとも一部の時刻マップを生成する時刻マップ生成モジュールを使用することができる。さらに、記憶管理デバイス3338は、過去の時刻におけるデータ記憶部3343中に位置する少なくとも一つの指定された記憶ユニットに記憶されるデータのための、読出しリクエストに応じるために、入出力モジュール3362を使用することができる。
【０３４８】
第１のデータベーステーブル3350および第２のデータベーステーブル3352は、記録書込みリクエスト入力および記録にそれぞれ役立つ、どの様な形体、又は方法で行なってもよい。ある実施例において、例えば、第１のデータベーステーブル3350および／又は第２のデータベーステーブル3352は、スプレッドシートとして行なわれる。あるいは、第１のデータベーステーブル3350および／又は第２のデータベーステーブル3352は、テキスト、またはテーブル表示のファイル、ビットマップ、配列、ツリー、インデックス、元帳、またはデータ整理に有用な他の手段、等で実行可能である。
【０３４９】
更新処理モジュール3354、識別モジュール3356、検索モジュール3358、時刻マップ生成モジュール3360、および入出力モジュール3362の一部は、後述する機能性を成し遂げることができるいかなる形体、手段、または方法で実行することもできる。例えば、更新処理モジュール3354、識別モジュール3356、検索モジュール3358、時刻マップ生成モジュール3360、および／又は入出力モジュール3362は、マイクロプロセッサ上のソフトウェアモジュールまたはプログラム実行として、および／又はハードウェアデバイス、例えば特定用途向け集積回路（ASIC）またはフィールドプログラマブル・ゲートアレイ（FPGA）として実行することも出来る。
【０３５０】
データ記憶部3343は、上記のデータ記憶部の能力を有することができ、ここに記載した付加的な機能性と共に、上記の現在データ記憶部および時刻データ記憶部によって実行することが可能である。例えば、現在データ記憶部3344および時刻データ記憶部3346の一方または両方に関連したデータは、記憶管理デバイス3338のメモリに記憶するか、又は一部は、直接記憶したり、バーチャルとして記憶する物理的な記憶部（図示せず）に記憶してもよい。
【０３５１】
典型的には、記憶管理デバイス3338は、一つ以上の他のコンピューティング装置、例えば上記のホストから、複数の書込みリクエストを受け取る。書込みリクエストは、データ記憶部3343に対して行なわれる。ある特定の実施例では、書込みリクエストは、データ記憶部3343の現在データ記憶部3344に対して行なわれる。そのような実施例において、記憶管理デバイス3338が、現在データ記憶部3344の一つ以上の指定されたブロックに書き込むための、新しいデータの書込みリクエストを受け取る毎に、記憶管理デバイス3338は、前述したように、copy-on-write動作（書込み動作上のコピー）を実行する。換言すれば、記憶管理デバイス3338は、現在データ記憶部3344の指定されたブロックに記憶された既存のデータをコピーし、例えば時刻データ記憶部3346中の他のデータ位置に、その既存のデータを書込み、そひて新規のデータを現在データ記憶部3344の指定されたブロックに書き込む。このcopy-on-write動作（書込み動作上のコピー）の一部として、上書きされたデータの新しいデータ位置を含む、書込みリクエストに関する情報は、第１のデータベーステーブル3350中に記録してもよい。第２のデータベーステーブル3352は、それから、書込みリクエストの実行と、それと共に書込みリクエストに関連した情報の第１のデータベーステーブル3350への記録とを反映するために、更新される。
【０３５２】
ここで図42を参照にして、例えば図41の例示的な記憶管理デバイス3338を使用を使用した、データ記憶部に対する書込みリクエストを記録するための方法3400に関する実施例の概要において、記憶管理デバイス3338は、各書込みリクエストの実施後に（例えば、上記のcopy-on-write動作（書込み動作上のコピー）後に）、そして書込みリクエストの入力後に、少なくとも一つの第１のデータベーステーブル3350に記録する。（ステップ3404）。また記憶管理デバイス3338は、各第１のデータベーステーブル3350のために、第２のデータベーステーブル3352の少なくとも一つの記録を維持し（ステップ3408）、そして例えば更新処理モジュール3354を用いて、書込みリクエスト入力が、第１のデータベーステーブル3350に記録される毎に、第２のデータベーステーブル3352中の少なくとも一つの記録を更新する（ステップ3412）。
【０３５３】
ある実施例においては、時刻マップを構築するか、さもないと特定の記憶ユニットに記憶されたデータの位置を判断する時に、そして典型的にはステップ3404、3408および3412より後に時点で、記憶管理デバイス3338は、識別モジュール3356を使用し、検索するために少なくとも一つの第１のデータベーステーブル3350を識別するために（ステップ3416）、第２のデータベーステーブル3352の一つ以上の記録を解釈し、少なくとも一つの識別された第１のデータベーステーブル3350を検索するために検索モジュール3358を使用する（ステップ3420）。記憶管理デバイス3338は、それから、時刻マップ生成モジュール3360を用いて、過去の時刻での、データ記憶部3343の少なくとも一部分の時刻マップの一部を生成し（例えば、現在データ記憶部3344または一部分）（ステップ3424）、および／又は入出力モジュール3362を用いて、過去の時刻でのデータ記憶部3343の少なくとも一部分内に位置する少なくとも1つの指定された記憶ユニット中に記憶されたデータ読出しリクエストに応答する（ステップ3428）。
【０３５４】
より詳細に述べると、そして、ここで図42および図43を参照すると、ある実施例においては、データ記憶部3343に対する書込みリクエストを記憶管理デバイス3338が受け取った後に、記憶管理デバイス3338は、ステップ3404で、第１のデータベーステーブル3350への書込みリクエスト入力3504を記録する。各書込みリクエスト入力3504は、書込みリクエストに関する情報を含む。例えば、書込みリクエスト入力3504には、書込みリクエストが対象とするデータ記憶部3343の中（例えば、現在データ記憶部3344の中）に位置する少なくとも一つの記憶ユニットの識別子、および／又は書込みリクエストが記憶管理デバイス3338によって受けた時刻、とが含まれる。
【０３５５】
ある実施例においては、各受信された書込みリクエストは、上述のcopy-on-write動作（書込み動作上のコピー）の実行に結果としてなる。このような実施例では、各書込みリクエストは、従前のデータに結果としてなり、この従前のデータは、以前にデータ記憶部3343中の（例えば、現在データ記憶部3344中の）少なくとも1つの記憶ユニットに記憶されており、データ記憶部3343中の例えば時刻データ記憶部3346内の新しいデータ位置にコピーされる。この書込みリクエスト中に含まれるこのデータは、それから、以前のデータがコピーされたデータ記憶部3343中の（例えば、現在データ記憶部3344中の）少なくとも1つの記憶ユニットへ書込まれる。したがって、書込みリクエスト入力3504は、従前のデータがコピーされた新しいデータ位置（例えば時刻データ記憶部3346中のデータ位置）を含むこともできる。
【０３５６】
図43にて図示したように、記憶管理デバイス3338が、データ記憶部3343に対する複数の書込みリクエストを受信したときに、記憶管理デバイス3338は、第１のデータベーステーブル3350内に、複数の書込みリクエスト入力3504を記録する。ある実施例においては、記憶管理デバイス3338は、単一の第１のデータベーステーブル3350,例えば第１のデータベーステーブル33501に、書込みリクエスト入力3504の最大数に達するまで、全ての書込みリクエスト入力3504を記録する。典型的には、第１のデータベーステーブル33501のための書込みリクエスト入力3504の最大数は、効率性で設定されるか、又は第１のデータベーステーブル33501に割り当てられる記憶容量で設定される。一旦第１のデータベーステーブル33501の書込みリクエスト入力3504の数が、最大に達すると、記憶管理デバイス3338は、新規な第１のデータベーステーブル33502を使用して、その書込みリクエストが受け取られる毎に、書込みリクエスト入力3504をその中に記録する。また、第１のデータベーステーブル3350に記録された書込みリクエスト入力3504が、最大に達すると、記憶管理デバイス3338は、新規な第１のデータベーステーブル33503（図示せず）を使用し、更に次の新規な第１のデータベーステーブルを順次使用する。
【０３５７】
ステップ3408で、記憶管理デバイス3338は、各第１のデータベーステーブル3350のために、第２のデータベーステーブル3352の少なくとも一つの記録3508を維持する。ここで図43を参照して、データ記憶部3343の少なくとも一部分（例えばデータ記憶部3343の現在データ記憶部3344またはその一部分）は、概念的には記憶管理デバイス3338によって番号m付きの「バケット」に組織化されることができる。ここで、mは1より大きな数字であり、そしてm付きバケットのうちの各1つは、データ記憶部3343の少なくとも一部分の中に位置する記憶ユニットの固定番号に関する。そのような実施例において、各第１のデータベーステーブル3350のために、記憶管理デバイス3338は、第２のデータベーステーブル3352中に、図示するように、複数個のmバケットの各一個毎に、記録3508を維持する。或いは、他の実施例では、記憶管理デバイス3338は、データ記憶部3343の少なくとも一部分をバケットに分けない。この種の実施例（図示せず）においては、記憶管理デバイス3338は、第１のデータベーステーブル3350の各一個毎に、第２のデータベーステーブル3352に単一レコード3508を維持する。
【０３５８】
また図43に関連して、各記録3508は、複数のビット入力を含み、各ビット入力は、セットされている（すなわち“1”）か、またはセットされていない（すなわち“0”）かの状態である。さらに、ある実施例においては、説明のための図43の縦方向の列合わせて示すように、記録3508の各ビット入力は、データ記憶部3343の少なくとも一部分内にある少なくとも一つの記憶ユニットに対応する。
【０３５９】
まず最初に、ある実施例においては、第１のデータベーステーブル3350が空の時（すなわち、書込みリクエスト入力3504が、第１のデータベーステーブル3350にまだ記録されていない時）、その第１のデータベーステーブル3350に関連した各記録3508の全てのビット入力は、アンセットの状態である（すなわち“0”）。その後、記憶管理デバイス3338が、その第１のデータベーステーブル3350に書込みリクエスト入力3504を記録する毎に、記憶管理デバイス3338は、ステップ3412で、第２のデータベーステーブル3352の少なくとも一つの記録3508（その第１のデータベーステーブル3350と関係する）を更新する。ある実施例においては、記憶管理デバイス3338は、更新処理モジュール3354を用いて、アンセット状態である少なくとも一つの記録3508中の各ビット入力をセットし、この記録3508を更新する。なお上記記録3508は、この書込みリクエスト入力に関連した書込みリクエストによって上書きされるデータ記憶部3343の、少なくとも一部分に位置する記憶ユニットに対応している。したがって、第１のデータベーステーブル3350に関連した記録3508でセットされた（すなわち“1”）各ビット入力は、そのビット入力が対応するデータ記憶部3343の少なくとも一部分の中に位置する少なくとも一つの記憶ユニットが、その第１のデータベーステーブル3350の展開中に、少なくとも一回上書きされたことを示している。一方では、第１のデータベーステーブル3350に関連した記録3508でアンセットされた（すなわち“0”）各ビット入力は、そのビット入力が対応するデータ記憶部3343の少なくとも一部分の中に位置する少なくとも一つの記憶ユニットが、その第１のデータベーステーブル3350の展開中に、少なくとも一回上書きされなかったことを示している。このように、第２のデータベース3352の一つ以上の記録3508のデータ（すなわちビット入力）は、データ記憶部3343の少なくとも一部分での、書込みリクエストの効果を表す（すなわち、このデータは、書込みリクエストによって上書きされたデータ記憶部3343の少なくとも一部分に位置する少なくとも1つの記憶ユニットを識別する）。
【０３６０】
当業者は、図43において例示される各記録3508の5ビット入力は、単に図示するだけであることを理解し、そしてこの本発明の実施態様を説明するためのみに使用する。実際には、各記録3508は、例えば、ビット入力の一つ以上のバイト、またはビット入力の一つ以上のワード（いかなるデータ長でも）を含むことができる。さらに、各記録3508のデータは、図43では2進数表示で例示されているが、各記録3508は、そのデータを代替案として10進法、16進法、或いは他の表示方法で保存することができる。さらにまた、データ記憶部3343の少なくとも一部分での、書込みリクエストの効果を表すビット入力に加えて、各記録3508は、その記録3508が関連する第１のデータベーステーブル3350を識別するための識別子を含むことができる。
【０３６１】
例えば上記のようなデータベーステーブル3350、3352を用いて、上述のようにデータを記憶し、インデックスを付けると、記憶管理デバイス3338は、第１のデータベーステーブル3350の書込みリクエスト入力3504が、データ記憶部3343中の特定の記憶ユニットへの書込みと関連しているかどうかを能率的に判断することができる。それで、リクエストに応答して、例えばユーザから、過去の時刻におけるデータ記憶部3343の少なくとも一部分（例えば、現在データ記憶部3344、またはその一部分）の中に記憶したデータのために、記憶管理デバイス3338の識別モジュール3356は、関連した書込みリクエスト入力3504を検索ために、最初に、少なくとも一つの第１のデータベーステーブル3350を、ステップ3416で、識別する。ある実施例においては、どの第１のデータベーステーブル3350（1個または複数個）を検索するべきかを識別するために、記憶管理デバイス3338の識別モジュール3356は、データ記憶部3343の少なくとも一部分の中に位置するどの記憶ユニットが、上書きされたかを判断する。あるそのような実施例において、記憶管理デバイス3338の識別モジュール3356は、対応するビット入力を有するデータ記憶部3343の少なくとも一部分の中に位置する各記憶ユニットのために、第２のデータベーステーブル3352の記録3508のうちの少なくとも1つが、セットされている（すなわち“1”）その記憶ユニットのためのビット入力を、有するかどうかを判断する。
【０３６２】
より詳しくは、ある実施例においては、データ記憶部3343の少なくとも一部分の中の各特定の記憶ユニットのために、記憶管理デバイス3338の識別モジュール3356は、その特定の記憶ユニットに対応する各記録3508中のデータのビット入力上に、のブーリアン「OR」演算を実行する。説明を簡単にするために、そして、まだ図43を参照して、記憶管理デバイス3338が、複数の第１のデータベーステーブル3350を使用すると、これは、縦方向に整列配置されている記録3508のデータカラム上に、ブーリアン「OR」演算を実行すると、視覚的には相当する。ブーリアン「OR」演算が特定のカラムを「1」にする場合は、そのカラムに対応する特定の記憶ユニットは、上書きされ、そして、少なくとも一つの第１のデータベーステーブル3351では、その特定の記憶ユニットに対する1個以上の書込みリクエストに関連した1個以上の書込みリクエスト入力3504が、存在することになる。又そうではなく、ブーリアン「OR」演算が特定のカラムを「0」にする場合、そのカラムに対応する特定の記憶ユニットは、第２のデータベーステーブル3352の記録3508によってカバーされるどの時刻でも、上書きされなかったことになる。
【０３６３】
例えば、図43において例示されるデータ記憶部3343の少なくとも一部分のバケット1のための、3つの記録のデータを例にとると（すなわち、RECORD1,1;RECORD2,1、そしてRecordn,l）、これらの記録の縦方向に整列配置された複数個のビット入力（すなわち10010OR10010OR01010）に、上記のブーリアン「OR」演算を実行すると、その結果として、11010を生じる。この結果は、図43において表されているデータ記憶部3343の少なくとも一部分の中に位置する第１記憶ユニット、第２記憶ユニット、そして第4記憶ユニットが、時間的にある時点で上書きされたことを示しており、そして、それらの各記憶ユニットのために、バケット1のための少なくとも一つの記録3508が、セットされた（すなわち“1”）その記憶ユニットに対応するビット入力を有することを示している。この結果は、更に、図43において表されるデータ記憶部3343のその部分内に位置する第３記憶ユニットおよび第5記憶ユニットは、このデータによってカバーされるどの時刻でも、上書きされなかったことを示しており、そして、それら各記憶ユニットのために、その記憶ユニットに対応するバケット1のための記録3508のあらゆるビット入力が、アンセットされる（すなわち“0”）ことを示している。
【０３６４】
データ記憶部3343の少なくとも一部分の中に位置する特定の記憶ユニットのために、少なくとも一つの記録3508が、セットされている（すなわち“1”）その特定の記憶ユニットのためのビット入力を有すると判断すると、記憶管理デバイス3338の識別モジュール3356は、即座に、その特定の記憶ユニットにセットされているビット入力を有するそれらの一つ以上の記録3508を識別する。識別モジュール3356は、それからまた、それらの識別された記録3508が維持されている一つ以上の第１のデータベーステーブル3350を識別する。ある実施例においては、これらのステップを達成するために、記憶管理デバイス3338の識別モジュール3356は、いずれが“1”にセットされたかを判断するために関連のビット入力を、最初に簡単に走査する。図43において例示される、データ記憶部3343の少なくとも一部分のバケット1のための3つの記録3508を含んでいる我々の実施例に、一旦戻って（すなわち、Record1,1；Record2,1；そしてRecordn,l）、記憶管理デバイス3338の識別モジュール3356は、図43において例示されるデータ記憶部3343の少なくとも一部分の中に位置する第１記憶ユニット、第２記憶ユニット、そして第4記憶ユニットに対応するそれらの記録のビット入力を走査する。記憶管理デバイス3338の識別モジュール3356は、図43において例示されるデータ記憶部3343の少なくとも一部分の中に位置する第３記憶ユニット、そして第5記憶ユニットに対応するそれらの記録のビット入力は、しかしながら、走査する必要もないし、走査しない。その理由は、前述のブーリアン「OR」演算を実行した結果として、識別モジュール3356は、それらが全てのアンセット（すなわち“0”）であるということを知っているからである。
【０３６５】
それらの記録3508のビット入力を、上述のようにスキャンした結果として、その後、識別モジュール3356は、本発明によれば、図43において例示されるデータ記憶部3343の少なくとも一部分の中に位置する第１記憶ユニット、第２記憶ユニット、そして第4記憶ユニットへ、行なわれた書込みリクエストと関連する書込みリクエスト入力3504のための検索をするために、下記の第１のデータベーステーブル3350を識別する。
【０３６６】
【表１】
0005438668.tif 000002
【０３６７】
識別モジュール3356が、ステップ3416で、検索のための一つ以上の第１のデータベーステーブル3350を識別したあと、記憶管理デバイス3338の検索モジュール3358は、ステップ3420で、それらの識別された第１のデータベーステーブル3350を検索する。ここで、データ記憶部3343の少なくとも一部分に（例えば、現在データ記憶部3344、または一部分に）過去の時刻において記憶されたデータを、記憶管理デバイス3338は、例えばユーザによって、リクエストされたことを思い出されるべきである。したがって、ある実施例においては、セットされた記録3508中の対応するビット入力を有する、データ記憶部3343の少なくとも一部分の中に位置する少なくとも一つの記憶ユニットの各々のために（例えば上述の例に戻って、図43で例示されるデータ記憶部3343の少なくとも一部分の中にある第１記憶ユニット、第２記憶ユニット、第4記憶ユニットの各々装置のため）、記憶管理デバイス3338の検索モジュール3358は、次のステップを実行する。第１に、検索モジュール3358は、識別モジュール3356によって、上記のように、識別された第１のデータベーステーブル3350の書込みリクエスト入力3504を検索する。それから検索モジュール3358は、それらの書込みリクエスト入力3504からその過去の時刻後の、以下に述べるある1つの最初の時刻を判断する。すなわちこの最初の時刻とは、その少なくとも1つの記憶ユニットに記憶された以前のデータが、上述のcopy-on-write動作（書込み動作上のコピー）が実行された結果として、新規のデータ位置へ（例えばデータ記憶部3343の時刻データ記憶部3346の中の）コピーされ、かつその少なくとも1つの記憶ユニットに上書きされた時刻をいう。その最初時刻を決定すると、それから検索モジュール3358は、書込みリクエスト入力3504から、例えば時刻データ記憶部3346の中のその新規のデータ位置を判断する。なおその新規のデータ位置は、従前のデータがその最初の時刻にでコピーされ位置である。すなわち従前のデータが、現在、記憶されているのは、この新規のデータ位置である。この新規のデータ位置は、少なくとも過去の時刻におけるデータ記憶部3343の少なくとも一部分の、時刻マップの少なくとも一部分を生成するために用いられ、および／又は、少なくとも過去の時刻におけるデータ記憶部3343の少なくとも一部分に記憶されたデータに対する、ユーザの読出しリクエストに応答するために用いられる。なお上記の各々については、以下に詳述する。
【０３６８】
もちろん、ある実施例においては、データ記憶部3343の少なくとも一部分の中に位置する記憶ユニットは、セットされた記録3508に対応するビット入力を有する場合であっても、その記憶ユニットに記憶された従前のデータが、新規のデータ位置に（例えば、時刻データ記憶部3346の中に）コピーされ、そしてその記憶ユニットに上書きされた過去の時刻後の最初の時刻を、検索モジュール3358は、判断することは出来ない。従前の時刻その記憶ユニットに記憶される以前のデータが新規のデータ位置へコピーされて、その記憶ユニットで上書きされた過去の時刻に続いている最初を判断することができない。検索モジュール3358が上述の決定をすることができない1つの実施例は、データ記憶部3343の少なくとも一部分の中に位置する記憶ユニットが、過去の時刻前のある時刻で上書きされたが、その過去の時刻後のある時刻では上書きされなかった場合である。この種の場合、その過去の時刻でその記憶ユニットに記憶されたデータは、新規のデータ位置へコピーされず、その代わりに、現時点でも、その記憶ユニットにまだ記憶されている。
【０３６９】
前述したように、ブーリアン「OR」演算が、図43の縦方向に整列配置されたビット入力の特定の待ち行列を「0」にする場合、そのカラムに対応するデータ記憶部3343の少なくとも一部分の特定の記憶ユニットは、第２のデータベーステーブル3352の記録によってカバーされる時刻には、上書きされなかった。したがって、この種の場合、過去の時刻における、その特定の記憶ユニットに記憶されたデータは、新規のデータ位置へコピーされず、その代わりに、そのまま、その記憶ユニットにまだ記憶されている。
【０３７０】
ある実施例においては、データ記憶部3343の少なくとも一部分の中に位置する各記憶ユニットのために、過去の時刻におけるその記憶ユニットに記憶されるデータが、現在記憶されているデータ位置を、検索モジュール3358が、認識した後に（既に説明したように、そのデータが、未だ記憶ユニットの中なのか、または例えば時刻データ記憶部3346の中のような新規のデータ位置にあるのか、等）、記憶管理デバイス3338の時刻マップ生成モジュール3360は、ステップ3424で、過去の時刻におけるデータ記憶部3343の少なくとも一部分の、時刻マップの少なく一部を生成する。ある実施例においては、過去の時刻におけるその記憶ユニットに記憶されたデータが、現在記憶される位置に、データ記憶部3343の少なくとも一部分の中に位置する各記憶ユニットをマッピングすることによって、時刻マップ生成モジュール3360は、時刻マップを生成する。このマッピングは、データ記憶部3343の少なくとも一部分の中に位置する各記憶ユニットのために、例えば、過去の時刻におけるその記憶ユニットに記憶されたデータが現在ある位置の識別子を、データベースに記録するのと同程度に単純であってもよい。
【０３７１】
他の実施形態では、過去の時刻におけるデータ記憶部3343の少なくとも一部分の中に位置する、少なくとも一つの指定された記憶ユニットに記憶されたデータに対する読出しリクエストを、記憶管理デバイス3338は、例えば上記のようにホストから受信する。ある実施例においては、記憶管理デバイス3338のマップ生成モジュール3360が同じ過去の時刻のための時刻マップを生成し始めた時刻の後で、しかしその時刻マップを完成させる前に、その読出しリクエストは、受け取られる。この種の場合には、仮に完全である時刻マップのその部分が、その読出しリクエストで識別された少なくとも一つの記憶ユニットをカバーする場合には、記憶管理デバイス3338の入出力モジュール3362は、ステップ3428で、その時刻マップからデータの位置を決定する（なおその決定されたデータ位置は、説明したように、リクエストデータが上書きされなかったら、データ記憶部3343の少なくとも一部分の中に位置する指定された記憶ユニットであり、または、例えば要求データが上書きされたら、時刻データ記憶部3346の中のように新規のデータ位置である）。あるいは、この種の場合、その完全である時刻マップの一部分が、読出しリクエストにおいて識別された少なくとも一つの記憶ユニットをカバーしない場合、あるいは、他の実施例において、記憶管理デバイス3338が、例えば、時刻マップを作成するようには構成されていなかった場合、又は記憶管理デバイス3338が、その読出しリクエストにおいて識別された過去の時刻とは異なる過去の時刻における時刻マップしか、作成あるいは作成開始をしない場合には、記憶管理デバイス3338は、上記の方法3400のうちのステップ3416およびステップ3420を実行する。方法3400のうちのステップ3416およびステップ3420を実行する場合には、記憶管理デバイス3338は、しかしながら、データ記憶部3343の少なくとも一部分の中に位置する各記憶ユニットのために、前述の動作を実行する必要はない。むしろ記憶管理デバイス3338は、読出しリクエストにおいて識別された各記憶ユニットのために、方法3400のステップ3416およびステップ3420の前述の動作だけを実行しなければならない。換言すれば、読出しリクエストにおいて識別された各記憶ユニットに以前記憶されたデータが、コピーされ、今は存在する新規の1又は複数個のデータ位置を、記憶管理デバイス3338は、決定しなければならない。
【０３７２】
新規のデータ位置を決定すると、記憶管理デバイス3338の入出力モジュール3362は、ステップ3428で読出しリクエストに応じる際に、その新規のデータ位置からデータを読込んで、それをリクエスト元（例えば上記のようにホスト）に送信する。さらに、記憶管理デバイス3338の時刻マップ生成モジュール3360が、読出しリクエストにおいて識別されものと同様である過去の時刻のための時刻マップを生成し始めたが、その読出しリクエストが受け取られた時には、その時刻マップは完成しなかった場合で、かつその時刻マップの完成した部分が、読出しリクエストにおいて識別された少なくとも一つの記憶ユニットをカバーしなかった場合には、その読出しリクエストへのリスポンスを生成する際に記憶管理デバイス3338によってされた処理作業は、その時刻マップを完成させる際に、記憶管理デバイス3338の時刻マップ生成モジュール3360により用いられてもよい（すなわち、その読出しリクエストにおいて識別される各記憶ユニットで以前記憶されたデータが、コピーされ、そして現時点で存在する新規のデータ位置を判断するためにの、方法3400のステップ3416およびステップ3420を実行すること）。
【０３７３】
当業者は、上記の方法3400の実施態様は多様であり、又は記載されている原理を使用し、かつその方法の結果に影響を及ぼすことなしに、様々な方法で修正をすることが出来ると理解できる。例えば、ある実施例においては、セットされる記録3508の各ビット入力は、“0”を、対照的に“1”と、そしてアンセットされた各ビット入力は、“0”を、対照的に“1”と、修正することが出来る。このような実施例では、データ記憶部3343の少なくとも一部分の中に位置する特定の記憶ユニットのために、少なくとも一つの記録3508が、セットされたその特定の記憶ユニットのためのビット入力を有するかどうかを判断する場合には、その特定の記憶ユニットに対応する各記録3508のビット入力に、識別モジュール3356は、上記のブーリアン「OR」演算とは対照的に、ブーリアン「AND」演算を実行する。この種の場合、ブーリアン「AND」演算が、特定のカラムを「0」にする場合、そのカラムに対応する特定の記憶ユニットは、上書きされ、そして、少なくとも一つの第１のデータベーステーブル3351では、その特定の記憶ユニットに対する1個以上の書込みリクエストに関連した1個以上の書込みリクエスト入力3504が、存在することになる。又そうではなく、ブーリアン「AND」演算が特定のカラムを「1」にする場合、そのカラムに対応する特定の記憶ユニットは、第２のデータベーステーブル3352の記録3508によってカバーされるどの時刻でも、上書きされなかったことになる。さらに、他の実施例として、データの書込み、読込み時に、一貫して所定の番号が適用される限り、ある1つのビット入力を、いかなる番号の記憶ユニットを表示する場合にも用いることができる。
【０３７４】
本発明は、一つ以上の製品に対して内蔵あるいは外付けで組み込まれた、コンピュータで読み取り可能なプログラム用モジュールとして、提供することが可能である。
この製品は、非限定的な実施例として、フレキシブルディスク、ハードディスク、CDROM、フラッシュメモリカード、PROM、RAM、ROMまたは磁気テープであってもよい。一般に、コンピュータで読み出し可能なプログラムは、いかなるプログラミング言語でも行なうことができる。使用できる言語の例として、C、C++またはＪＡＶＡ（登録商標）、等が含まれる。ソフトウェアプログラムは、オブジェクトコードとして製品の一つ以上のメディアに内蔵または外付けが可能である。
【０３７５】
本願明細書において記載された発明のバリエーション、修正、および他の実行は、本発明の精神と範囲から逸脱することなく、当業者により当然、創作可能である。したがって本発明は、上述の例示的な記述のみにより理解されるのではなく、以下に添付する特許請求の範囲の技術的思想および技術的範囲により定義されるべきである。
【図面の簡単な説明】
【０３７６】
添付の複数の図面において一般に同一参照符号は、その図面とは異なる図でも同じ部材を示している。またこれ等の図面は、必ずしも一定の縮尺ではなく、本発明の原理を示すために強調した部分がある。
【０３７７】
【図１】本発明のある実施例である現在データ記憶部および時刻データ記憶部を含む記憶システムのブロック図である。
【図２】ホストによって記憶管理デバイスに送られるI／Oリクエストの実施例を表すダイアグラムである。
【図３】本発明の実施例のデータ記憶部への一連の書込みコマンドを表すテーブルである。
【図４】本発明のある実施例よるデータ記憶部にある複数の従前のデータ内容を生成するブロック図である。
【図５】本発明のある実施例よる動的な現在データ記憶部の生成を表すブロック図である。
【図６】復旧データ記憶部の生成を表す時間軸である。
【図７】図７Ａおよび７Ｂは、現在データ記憶部への一連の書込みコマンドの間における現在データ記憶部および時刻データ記憶部の内容を表すテーブルである。図７Ａは、現在データ記憶部を表す。図７Ｂは、時刻データ記憶部を表す。
【図８】本発明のある実施例よるデータ記憶部の従前のデータ内容の生成を表すテーブルである。
【図９】本発明のある実施例よるプロセッサーモジュールのブロック図である。
【図１０】本発明のある実施例よる記憶管理デバイスの更なる詳細を表すブロック図である。
【図１１】本発明のある実施例よるI／Oマネージャのブロック図である。
【図１２】本発明のある実施例よる記憶管理デバイスのブロック図である。
【図１３】本発明のある実施例よる記憶システムのブロック図である。
【図１４Ａ】本発明のある実施例よる修正履歴を、データ記憶部中の所定のデータ位置に提供する方法に関するフローチャートである。
【図１４Ｂ】本発明のある実施例よる修正履歴を、データ記憶部中の所定のデータ位置に提供する他の方法に関するフローチャートである。
【図１５】ホストによって記憶管理デバイスに送信されるI／Oリクエストの実施例を表すダイアグラムである。
【図１６】記憶管理デバイスによってホストに送信されるI／Oリスポンスの実施例を表すダイアグラムである。
【図１７】本発明の実施例によるデータ記憶部に対する一連の書込み動作を表す時間軸である。
【図１８】本発明による記憶管理デバイスによって生成した履歴インデックスの実施例を表すダイアグラムである。
【図１９】ホストによって記憶管理デバイスに送信されるI／Oリクエストの実施例を表すダイアグラムである。
【図２０】記憶管理デバイスによってホストに送信されるI／Oリスポンスの実施例を表すダイアグラムである。
【図２１】本発明のある実施例よる記憶管理デバイスのブロック図である。
【図２２】本発明によるデータを記憶する方法の例示的な実施例のフローチャートである。
【図２３】本発明のある実施例よるマルチプロセッサー・システムのブロック図である。
【図２４】本発明のある実施例よるマルチプロセッサー・システム用のタイミングクロックを維持する方法を示すフローチャートである。
【図２５】マルチプロセッサー・システム内のスレーブ・プロセッサーモジュールの内部クロックと、マルチプロセッサー・システム内のマスター・プロセッサーモジュールの内部クロックに関するグラフである。
【図２６】本発明のある実施例よる記憶管理デバイスのブロック図である。
【図２７】本発明の実施例による一組の書込みコマンドのための記録のインデックスを表すテーブルである。
【図２８】本発明の実施例により生成したマップを表す。
【図２９】本発明のある実施例よるI／Oリクエスト処理のシステムのブロック図である。
【図３０】本発明のある実施例よるI／Oリクエスト処理のための方法の例示的なフローチャートである。
【図３１】本発明の実施例によるI／Oリクエストに対応するテーブルである。
【図３２】本発明のある実施例よるI／Oリクエストを処理するために用いる待ち行列を表す。
【図３３】本発明のある実施例よるシステムのブロック図である。
【図３４】本発明のある実施例よるシステムのブロック図である。
【図３５】本発明のある実施例よる方法のブロック図である。
【図３６Ａ】本発明のある実施例よるバイナリーツリーを表す。
【図３６Ｂ】本発明のある実施例よるバイナリーツリーを表す。
【図３６Ｃ】本発明のある実施例よるバイナリーツリーを表す。
【図３６Ｄ】本発明のある実施例よるバイナリーツリーを表す。
【図３７】本発明のある実施例よる記憶管理デバイスのブロック図を表す。
【図３８】本発明のある実施例よるチェックポインティングのための典型的な方法を表す。
【図３９】本発明の例示的実施形態のブロック図を表す。
【図４０】本発明のある実施例よるチェックポインティングのための典型的な方法を表す。
【図４１】本発明のある実施例よる記憶管理デバイスのブロック図である。
【図４２】データ記憶部への記録書込みリクエストのための方法であり、そして過去の時刻におけるデータ記憶部の少なくとも一部分の、時刻マップの少なくとも一部分を生成するための方法に関する例示的な実施例のフローチャートである。
【図４３】図４２において表されるデータ記憶部への記録書込みリクエストのための方法であり、そして過去の時刻におけるデータ記憶部の少なくとも一部分の、時刻マップの少なくとも一部分を生成するための方法に関する例示的な実施例に関する例示的なブロック図である。
【図１】
0005438668.tif 000003
【図２】
0005438668.tif 000004
【図３】
0005438668.tif 000005
【図４】
0005438668.tif 000006
【図５】
0005438668.tif 000007
【図６】
0005438668.tif 000008
【図７】
0005438668.tif 000009
【図８】
0005438668.tif 000010
【図９】
0005438668.tif 000011
【図１０】
0005438668.tif 000012
【図１１】
0005438668.tif 000013
【図１２】
0005438668.tif 000014
【図１３】
0005438668.tif 000015
【図１４Ａ】
0005438668.tif 000016
【図１４Ｂ】
0005438668.tif 000017
【図１５】
0005438668.tif 000018
【図１６】
0005438668.tif 000019
【図１７】
0005438668.tif 000020
【図１８】
0005438668.tif 000021
【図１９】
0005438668.tif 000022
【図２０】
0005438668.tif 000023
【図２１】
0005438668.tif 000024
【図２２】
0005438668.tif 000025
【図２３】
0005438668.tif 000026
【図２４】
0005438668.tif 000027
【図２５】
0005438668.tif 000028
【図２６】
0005438668.tif 000029
【図２７】
0005438668.tif 000030
【図２８】
0005438668.tif 000031
【図２９】
0005438668.tif 000032
【図３０】
0005438668.tif 000033
【図３１】
0005438668.tif 000034
【図３２】
0005438668.tif 000035
【図３３】
0005438668.tif 000036
【図３４】
0005438668.tif 000037
【図３５】
0005438668.tif 000038
【図３６Ａ】
0005438668.tif 000039
【図３６Ｂ】
0005438668.tif 000040
【図３６Ｃ】
0005438668.tif 000041
【図３６Ｄ】
0005438668.tif 000042
【図３７】
0005438668.tif 000043
【図３８】
0005438668.tif 000044
【図３９】
0005438668.tif 000045
【図４０】
0005438668.tif 000046
【図４１】
0005438668.tif 000047
【図４２】
0005438668.tif 000048
【図４３】
0005438668.tif 000049