(57)【特許請求の範囲】
【請求項１】
プロセッサ・デバイスによってデータを処理するための方法であって、
前記データの重複排除ストレージのために複数の書き込み動作を受信すること、
重複排除ストレージのための連続書き込みおよび不連続書き込みのうちの１つである前記受信したデータに応答すること、
複数のユーザ・ファイル位置に前記データを保管すること、
前記データを、データ構造ごとに複数のバッファ内に蓄積および更新することであって、前記データ構造が前記複数のバッファと複数のユーザ・ファイル位置との間の断片マップの役割を果たす、蓄積および更新すること、
前記データを、必要なシーケンス・サイズの完全なシーケンスを形成するために、前記複数のバッファ内で再構築すること、および
前記データを、複数のストリームとして、処理および格納のためにストリームベースの重複排除アルゴリズムに提供すること、
ディスク・マップを介して、前記複数のユーザ・ファイル位置に保管されたデータを前記複数のストリームにマッピングすることであって、前記複数のユーザ・ファイル位置に保管されたデータの少なくとも１つの部分は少なくとも２つの前記ストリームにマップされることを特徴とする、前記マッピングすること、を含む、方法。
【請求項２】
前記複数のユーザ・ファイルのうちの少なくとも１つを、前記複数のバッファのうちの少なくとも１つに関連付けること、
前記複数のユーザ・ファイルのために、前記少なくとも１つのストリームのうちの少なくとも１つを開始すること、
前記少なくとも１つのストリームのそれぞれについてオフセットを維持することであって、前記オフセットが前記少なくとも１つのストリームに書き込まれた前記複数のユーザ・ファイル内の最後のオフセットを表す、維持すること、および
前記複数のバッファのうちの前記少なくとも１つを、前記複数の書き込み動作のそれぞれに割り振ることであって、前記断片マップが、前記複数の書き込み動作のそれぞれについての前記複数のバッファの割り振りを反映するように更新される、割り振ること、
のうちの１つを実行することによって、前記複数のユーザ・ファイルと前記複数のバッファとの間の関係を構成することをさらに含む、請求項１に記載の方法。
【請求項３】
前記データが前記オフセットに隣接されると、前記データを前記少なくとも１つのストリームに書き込み、前記少なくとも１つのストリームのそれぞれについて前記オフセットを前進させ、前記データの前記複数のバッファを解放する、請求項２に記載の方法。
【請求項４】
前記データが前記少なくとも１つのストリームのうちの複数に常駐できるようにするために、複数のディスク・マップによって前記データをマッピングすることをさらに含む、請求項１に記載の方法。
【請求項５】
前記複数の書き込み動作のうちの少なくとも１つによって前記複数のバッファ内に上書きを検出すると、前記少なくとも１つのストリームの追加の１つを作成し、前記少なくとも１つのストリームの前記追加の１つを、前記複数のバッファに格納された前記少なくとも１つのストリームのうちの既存の１つに重ね、前記少なくとも１つのストリームの前記追加の１つはメタファイル構造に記録される、請求項１に記載の方法。
【請求項６】
隣接のうちのいずれか１つをマージすることによって前記複数のユーザ・ファイルのうちの少なくとも１つを閉じること、および前記少なくとも１つのストリームのうちの少なくとも１つにストリームを重ね合わせることをさらに含む、請求項１に記載の方法。
【請求項７】
複数のユーザ・ファイルを閉じた後、任意の期間後、および前記複数のユーザ・ファイルが休止していると判定された後、のうちの１つで、断片化プロセスを実行することをさらに含み、前記断片化動作は、前記複数のユーザ・ファイルのそれぞれの前記少なくとも１つのストリームを単一のストリームに再配置構成する、請求項１に記載の方法。
【請求項８】
複数のバッファにバッファリングされた前記データのオーバフローを、メモリ階層に一時的に格納することをさらに含む、請求項１に記載の方法。
【請求項９】
コンピューティング環境においてデータを処理するためのシステムであって、
少なくとも１つのプロセッサ・デバイスを備え、前記少なくとも１つのプロセッサ・デバイスが、
前記データの重複排除ストレージのために複数の書き込み動作を受信すること、
重複排除ストレージのための連続書き込みおよび不連続書き込みのうちの１つである前記受信したデータに応答すること、
複数のユーザ・ファイル位置に前記データを保管すること、
前記データを、データ構造ごとに複数のバッファ内に蓄積および更新することであって、前記データ構造が前記複数のバッファと複数のユーザ・ファイル位置との間の断片マップの役割を果たす、蓄積および更新すること、
前記データを、必要なシーケンス・サイズの完全なシーケンスを形成するために、前記複数のバッファ内で再構築すること、および
前記データを、複数のストリームとして、処理および格納のためにストリームベースの重複排除アルゴリズムに提供すること、
ディスク・マップを介して、前記複数のユーザ・ファイル位置に保管されたデータを前記複数のストリームにマッピングすることであって、前記複数のユーザ・ファイル位置に保管されたデータの少なくとも１つの部分は少なくとも２つの前記ストリームにマップされることを特徴とする、前記マッピングすること、のために適合される、システム。
【請求項１０】
プロセッサ・デバイスによってデータを処理するためのコンピュータ・プログラムであって、
前記データの重複排除ストレージのために複数の書き込み動作を受信するための、第１の実行可能部分と、
重複排除ストレージのための連続書き込みおよび不連続書き込みのうちの１つである前記受信したデータに応答するための、第２の実行可能部分と、
複数のユーザ・ファイル位置に前記データを保管するための、実行可能部分と、
前記データを、データ構造ごとに複数のバッファ内に蓄積および更新するための、第３の実行可能部分であって、前記データ構造が前記複数のバッファと複数のユーザ・ファイル位置との間の断片マップの役割を果たす、第３の実行可能部分と、
前記データを、必要なシーケンス・サイズの完全なシーケンスを形成するために、前記複数のバッファ内で再構築するための、第４の実行可能部分と、
前記データを、複数のストリームとして、処理および格納のためにストリームベースの重複排除アルゴリズムに提供するための、第５の実行可能部分と、
ディスク・マップを介して、前記複数のユーザ・ファイル位置に保管されたデータを前記複数のストリームにマッピングすることであって、前記複数のユーザ・ファイル位置に保管されたデータの少なくとも１つの部分は少なくとも２つの前記ストリームにマップされることを特徴とする、前記マッピングするための、実行可能部分と、
を備える、コンピュータ・プログラム。
【請求項１１】
前記複数のユーザ・ファイルのうちの少なくとも１つを、前記複数のバッファのうちの少なくとも１つに関連付けること、
前記複数のユーザ・ファイルのために、前記少なくとも１つのストリームのうちの少なくとも１つを開始すること、
前記少なくとも１つのストリームのそれぞれについてオフセットを維持することであって、前記オフセットが前記少なくとも１つのストリームに書き込まれた前記複数のユーザ・ファイル内の最後のオフセットを表す、維持すること、および
前記複数のバッファのうちの前記少なくとも１つを、前記複数の書き込み動作のそれぞれに割り振ることであって、前記断片マップが、前記複数の書き込み動作のそれぞれについての前記複数のバッファの割り振りを反映するように更新される、割り振ること、
のうちの１つを実行することによって、前記複数のユーザ・ファイルと前記複数のバッファとの間の関係を構成するための、第６の実行可能部分をさらに含む、請求項１０に記載のコンピュータ・プログラム。
【請求項１２】
前記データが前記オフセットに隣接されると、前記データを前記少なくとも１つのストリームに書き込み、前記少なくとも１つのストリームのそれぞれについて前記オフセットを前進させ、前記データの前記複数のバッファを解放するための、第７の実行可能部分をさらに備える、請求項１０に記載のコンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般にコンピュータに関し、より具体的には、重複排除システムにおけるデータ処理のための方法、コンピュータ・システム、およびコンピュータ・プログラム製品に関する。
【背景技術】
【０００２】
データ重複排除とは、冗長データの縮約あるいは除去またはその両方を言い表す。データ重複排除プロセスでは、データの最少量の冗長コピーまたは単一のコピーとなるように、それぞれ、データの重複コピーが縮約または除去される。重複排除プロセスを使用することで、必要なストレージ容量の削減およびネットワーク帯域幅の必要性の低減などの、様々な利点が与えられる。これらおよび他の利点により、近年、重複排除はコンピューティング・ストレージ・システムにおける非常に重要な技術分野として出現してきた。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
重複排除機能を提供するための問題点には、典型的には大規模なストレージ・リポジトリ内で重複データ・パターンを効率的に発見すること、および、このデータ・パターンを重複排除されたストレージ効率の良い形で格納することなどの、諸態様が含まれる。
【課題を解決するための手段】
【０００４】
コンピューティング環境においてデータを処理するための方法、コンピュータ・システム、およびコンピュータ・プログラム製品の諸実施形態が提供される。例示的な一実施形態では、単なる例として、データ重複排除ストレージ向けのコンピュータ環境は、データの重複排除ストレージのために複数の書き込み動作を受信する。重複排除ストレージのために受信されるデータが連続または不連続の場合、オーバフローがメモリ階層へと一時的に格納されると共に、このデータは複数のバッファにバッファリングされる。データは、データ構造ごとに複数のバッファ内に蓄積および更新され、このデータ構造は複数のバッファと複数のユーザ・ファイル位置との間の断片マップ（fragment map）の役割を果たす。データは、必要なシーケンス・サイズの完全なシーケンスを形成するために、複数のバッファ内で再構築される。データは、少なくとも１つのストリームとして、処理および格納のためにストリームベースの重複排除アルゴリズムに提供される。
【０００５】
本発明の利点が容易に理解されるように、上記で簡潔に説明された本発明について添付の図面に示された特定の諸実施形態を参照しながらより具体的に述べる。これらの図は本発明の諸実施形態を示すものであり、したがってその範囲を限定するものとみなされるべきではないことを理解した上で、添付の図面を使用して、本発明についてさらに具体的かつ詳細に記述および説明する。
【図面の簡単な説明】
【０００６】
【図１】本発明の諸態様が実装可能な、例示的コンピューティング環境を示す図である。
【図２】上記図１で示されたような、プロセッサ・デバイスを含む重複排除サブシステムの例示的部分を示す図である。
【図３】メモリ・バッファに関連して、断片マップの例示的図３５０を示す図である。
【図４】重複排除ストレージ・サブシステムの圧縮ストリームに関連して、例示的ディスク・マップを示す図である。
【図５】本発明の実装のための例示的方法を示す流れ図である。
【図６】重複排除ストレージ・サブシステムの実装のための例示的方法を示す流れ図である。
【発明を実施するための形態】
【０００７】
以下の説明および記載された主題全体を通じて、例示された諸実施形態に関連する以下の用語が記載されている。
【０００８】
「バッファのプール」は、それぞれが単一の断片を保持できる複数のバッファを言い表すものと意図される。「バッファのプール」は、メモリ・バッファのプールとも言い表すことが可能であり、メモリ階層構造に関連し、これを企図して使用することが可能である。
【０００９】
「断片」とは、所定サイズの固定サイズ片へのユーザ・ファイルの論理的分割を言い表すものと意図される。単なる例として、一実装では、断片は任意の便利な所定のサイズを有することができるが、あらかじめ固定しておかなければならない。単なる例として、１片は６４ＫＢの断片サイズを使用することができる。しかしながらこの断片サイズは固定しないことも可能である。
【００１０】
「ユーザ・ファイル」とは、バックアップ・アプリケーションによって作成されているファイルを言い表すものと意図される。
【００１１】
「断片マップ」とは、メモリ・バッファとユーザ・ファイル位置との間、およびその逆をマッピングする働きをするデータ構造を言い表すものと意図される。
【００１２】
「ディスク・マップ」とは、各ユーザ・ファイルのデータが複数の圧縮モジュール・ストリーム内に常駐できるようにするために、ユーザ・ファイルの断片を圧縮モジュール・ストリームへとマッピングする断片マップと同様の、オンディスク構造（on-disk structure）を言い表すものと意図される。
【００１３】
「コントロール・モジュール」または「コントローラ・モジュール」とは、ランダムなパターンの書き込みオフセットを有するネットワーク接続ストレージ・システム（ＮＡＳ）またはストレージ・システムを介して、クライアントから受信される各書き込み動作を使用して、何を実行するかを決定および管理するように構成された、モジュールを言い表すものと意図される。
【００１４】
「圧縮モジュール」とは、データのストリームの受信、データのストリームの開始、ストリームの圧縮、およびデータ・ストリームのストレージへの格納の諸動作を、管理、支援、または実行することが意図される。圧縮モジュールは、データ・ストリームの受信、開始、圧縮、およびストレージへの格納を実行するために、重複排除ストレージ・サブシステム内で独立に動作するか、または他のコンポーネントを支援するように構成することが可能である。
【００１５】
本発明は、複数のメモリ・バッファおよびストリームベース・アルゴリズムを使用する方法を有するランダムなパターンの書き込みオフセットを有する、ネットワーク接続システム（ＮＡＳ）、あるいは任意のランダム・アクセス書き込みまたはストレージ・システムを介した、データ重複排除に関する、ソリューションおよび機能強化を提供するものである。大規模データ・セットは、従来、格納されるバイト当たりのコストが最も低く、信頼性が高く、アーカイブの存続期間の長い、磁気テープ上に格納されてきた。しかしながら磁気テープには、広範囲に及ぶ手作業による保守（テープ・カートリッジの装填および取り外し、小規模な機械的問題の解決、移送、および格納など）の必要性による多くの欠点もある。こうした欠点により、テープ仮想化製品の開発が促進されてきた。テープ仮想化製品は、大規模ディスク・アレイを使用してデータを格納する一方で、テープ様のインターフェースを残りのバックアップ・システムに向けることができる。テープ仮想化システムは、正規のテープ・ライブラリと同様に通常のバックアップ・システムに収まるため、問題なく既存のシステムに適合する一方で、実際のデータはディスク・アレイ上に維持し、前述のテープ・システムのほとんどの欠点を排除することができる。しかしこれらのテープ・エミュレーション・システムは、ディスク・アレイのバイト当たりのコストがテープ・カートリッジよりも非常に高額であるという、別の問題をもたらす。
【００１６】
こうした問題は、ほとんどの場合、バックアップ・データ・セット内に大量のデータ冗長性があることを観察することによって解決可能である。今日実行されるバックアップのバックアップ・データは、ほとんどの場合、昨日実行されたバックアップによって生成されたバックアップ・データとほぼ同じである。この同様のデータ領域またはデータ・シーケンスを識別することにより、その両方に同じストレージ・スペースを使用して、大量のストレージ・スペースを節約することが可能である。このメカニズムが重複排除と呼ばれ、結果的に多くの場合、１０倍、時にはそれ以上、必要ストレージ・スペースを削減することが可能になる。このスペース削減によって、ディスクベースのテープ仮想化が、重複排除テープ仮想化製品が市場に出回るという商業的な成功を反映する、従来の磁気テープを置換するための経済的に実行可能な命題となる。バックアップ・データ・セットは大規模であり、ペタバイトで測定可能である。加えてバックアップ・ストリームは、典型的な毎秒ギガバイトの速度を有する。こうした速度でデータを処理することが可能であり、このような大規模データ・セット内で同様のシーケンスを発見することが可能なシステムを設計することが、技術的な問題である。
【００１７】
ハッシュベースのアルゴリズムは設計および実装が比較的簡単であるが、同一のブロックをルックアップするために使用されるインデックス（または「ハッシュ・テーブル」）が非常に大規模であるという、１つの重要な問題がある。ブロック・サイズが８キロバイトであると仮定すると、１ペタバイトのデータ・セットのインデックスにおけるエントリ数は、１２８ＧＢとなってしまう。エントリ・サイズが数バイトであると仮定すると、インデックスはおよそテラバイトのストレージを占有する可能性がある。こうした大規模インデックスをメモリ内に維持しておくことはできないため、ディスク上に常駐させる必要があり、ハードディスクのシーク待ち時間により各ルックアップが非常に遅くなる。着信データ速度が毎秒１ギガバイトであると仮定すると、１２８キロのルックアップが必要であり、こうしたシーク速度に対処できるのは非合理的なディスクベース・システムである。ストリームベースのソリューションは、かなり少ないキロバイト当たりのハッシュ・エントリを格納することによって、この問題を解決する。これにより、ハッシュ・テーブル全体をメモリ内に常駐させることが可能であり、ルックアップは格段に速くなり、性能を大幅に向上させ、データ・セットの規模を大幅に大きくすることができる。これらすべては、ハッシュベースのアルゴリズムに比べて、アルゴリズムの複雑さが増すことを犠牲にして生じるものである。
【００１８】
上記では、テープ・データ・ストリームの形で重複排除システムに入るバックアップ・データについて言及している。バックアップ・データは他の形でシステムに入ることも可能であり、その中で最も顕著なものがネットワーク接続システム（ＮＡＳ）であるが、適用可能な任意のランダム・アクセス書き込み方法を含むことも可能である。ＮＡＳ構成では、ユーザのバックアップ・システムはＮＡＳクライアントとして動作し、ＮＦＳまたはＣＩＦＳのいずれかのプロトコルを介して、ファイルの形でデータを書き込むように構成される。ＮＡＳのシナリオは管理者が簡単に構成しやすいが、テープ仮想化のシナリオにはない別の問題が存在する。本質的に連続しているテープ・ストリームとは異なり、ＮＡＳデータ・ストリームはランダム・アクセス・パターンを示す傾向がある。これはアプリケーション自体から生じる可能性があるが、たとえアプリケーションが完全に連続してデータを書き込む場合であっても、ほとんどのオペレーティング・システムの一部であるＮＡＳプロトコル・クライアントは、このデータをバッファリングし、アクセス・パターンにある程度のランダム性を導入した後、これをサーバに送信する傾向がある。このランダム性は意図的ではないが、連続性が考慮されない、主にブロック・デバイス用に設計されたオペレーティング・システム内のファイル・システム・コードの内部設計の副産物である。ハッシュベースの重複排除アルゴリズムのソリューションは、ハッシュベースの重複排除アルゴリズムがデータをブロックのセットとして「見る」ため、比較的簡単な方法でランダム・アクセス・パターンに対処することが可能であるが、ストリームベースのアルゴリズムの場合、こうしたアプリケーションには問題が示される。本発明は、ストリームベースのアルゴリズムがこうしたワークロードに対処できるようにするため、すなわちＮＡＳシナリオにおいてストリームベースのアルゴリズムの性能特典を得るための扉を開くための方法を提案する。
【００１９】
本発明は、以下のようなストリームベース・システムの特徴に基づく。第１に、各ストリームはデータ・バイトの連続したシーケンスを表すが、いくつかのストリームを「メタファイル」またはディスク・マップに集約することが可能であり、ここで連続バイトの各レンジはストリームとして表され、メタファイルは、各ストリーム・ファイルがどのようにオリジナル・ファイルのイメージ内に収められるかの記録を維持する。第２に、ストリームベースのアルゴリズムは特定粒度のブロックを使用してそれらのインデックスを格納するため、本発明は、いかなるハッシュも再計算する必要なく、マージ境界とブロック境界との位置合わせが維持されている限り、異なるストリームを１つのストリームにマージする。本発明は、前述の特徴、バッファのプールまたはメモリ・バッファのプール、およびメモリ階層を使用する。メモリ階層は、ＲＡＭ、フラッシュベースのデバイス、磁気ディスク、光ストレージ、様々なタイプのメモリ（仮想を含む）、通常のディスク、ストレージ・ディスクを含むことができるが、これらに限定されず、さらに、典型的に当業者によって採用される、ソリッド・ステート・ドライブ（ＳＳＤ）または他のタイプのデバイスなどのストレージ・メディア、方法、またはプロセスなどを含むこともできる。
【００２０】
一実施形態では、単なる例として、コンピュータ環境はデータの重複排除ストレージのために複数の書き込み動作を受信する。重複排除ストレージのために受信されるデータが連続または不連続の場合、オーバフローがメモリ階層へと一時的に格納されると共に、このデータは複数のバッファにバッファリングされる。データは、データ構造ごとに複数のバッファ内に蓄積および更新され、このデータ構造は複数のバッファと複数のユーザ・ファイル位置との間の断片マップの役割を果たす。データは、必要なシーケンス・サイズの完全なシーケンスを形成するために、複数のバッファ内で再構築される。データは、少なくとも１つのストリームとして、処理および格納のためにストリームベースの重複排除アルゴリズムに提供される。
【００２１】
図１は、本発明の諸態様が実装可能な、例示的コンピューティング環境１００を示す図である。アーキテクチャは、それぞれがバックアップ・サーバ・ワークステーション１０１を含む管理サーバ１０３に、ストレージ・サービスを提供する。管理サーバ１０３は、バックアップの動作および秩序（police）を管理する。バックアップ・サーバ・ワークステーション１０１には、図内ではバックアップ・アプリケーション・クライアント１（１０２Ａ）、２（１０２Ｂ）、３（１０２Ｃ）として示された、バックアップされたいくつかのバックアップ・アプリケーション・クライアント１０２が含まれる。いくつかのメディア・サーバ１０４（図内ではメディア・サーバ１０４Ａ、１０４Ｂ、および１０４Ｃとして示される）は、いずれもネットワーク１０８に接続される。重複排除データ・サブシステム１０６が、様々なメディア・サーバ１０４とネットワーク１０８との間に提供される。重複排除データ・サブシステム１０６は、アーキテクチャのコンポーネント間にネットワーク間接続を提供するネットワーキング・コンポーネントを介して、相互接続される。一実施形態では、ネットワーク１０８は、ワイド・エリア・ネットワーク（ＷＡＮ）を含むことができる。他の諸実施形態では、ネットワーク１０８は、ローカル・エリア・ネットワーク（ＬＡＮ）、ストレージ・エリア・ネットワーク（ＳＡＮ）、および当業者に知られた他のネットワーク・トポロジを含むことができる。メディア・サーバ１０４は、バックアップ・アプリケーション・クライアントと重複排除ストレージ・サブシステム１０６との間でデータをチャネリングする。重複排除ストレージ・サブシステム１０６は、ネットワーク１０８を介してデータ（書き込み動作）を受信する。
【００２２】
次に図２に進むと、前に図１でも見られたような、重複排除ストレージ・サブシステム１０６の例示的部分５００が示されている。重複排除ストレージ・サブシステム１０６の部分５００は、前述の諸実施形態のメカニズムが実装可能なコンピュータ環境内で、その一部として動作可能である。しかしながら、図２は単なる例であり、様々な諸実施形態の例示的諸態様が実装可能な特定のアーキテクチャに関して、いかなる制限をも提示または示唆することを意図するものではないことを理解されたい。以下の説明および記載された主題の範囲および趣旨から逸脱することなく、図２に示されたアーキテクチャに対する多くの修正が実行可能である。
【００２３】
重複排除ストレージ・サブシステム１０６は、プロセッサ５２０、およびランダム・アクセス・メモリ（ＲＡＭ）などのメモリ５４０を含む。重複排除ストレージ・サブシステム１０６は、グラフィカル・ユーザ・インターフェース上でウィンドウなどのイメージをユーザに提示するディスプレイ、キーボード、マウス、プリンタ、などを含む、便宜上図示されていないいくつかのコンポーネントに、動作可能に結合することができる。もちろん、当業者であれば、上記コンポーネントの任意の組み合わせ、または任意数の異なるコンポーネント、周辺装置、および他のデバイスが、重複排除ストレージ・サブシステム１０６と共に使用可能であることを理解されよう。
【００２４】
例示された実施形態では、重複排除ストレージ・サブシステム１０６は、メモリ５４０に格納されたオペレーティング・システム（ＯＳ）５６０（たとえばｚ／ＯＳ（Ｒ）、ＯＳ／２（Ｒ）、ＬＩＮＵＸ（Ｒ）、ＵＮＩＸ（Ｒ）、ＷＩＮＤＯＷＳ（Ｒ）、ＭＡＣ  ＯＳ（Ｒ））の制御の下で動作し、入力およびコマンドを受け入れて結果を提示するためにユーザとインターフェースする。
【００２５】
重複排除ストレージ・サブシステム１０６は、プロセッサ５２０によって読み取り可能なコードに変換される、ＣＯＢＯＬ、ＰＬ／１、Ｃ、Ｃ＋＋、ＪＡＶＡ（Ｒ）、ＡＤＡ、ＢＡＳＩＣ、ＶＩＳＵＡＬ  ＢＡＳＩＣ（Ｒ）、または任意の他のプログラミング言語などのプログラミング言語で作成された、アプリケーション・プログラム５８０を実装する。完了後、アプリケーション・プログラム５８０がアクセスし、重複排除ストレージ・サブシステム１０６のメモリ５４０内に格納されたデータを操作することができる。
【００２６】
さらに、本発明に従ってメカニズムおよびプロセスを実装および実行するために、ＯＳ  ５６０は、メモリ５４０、プロセッサ５２０、アプリケーション・プログラム５８０、ならびに他のコンピュータ処理、ネットワーキング、およびストレージ・コンポーネントに関連して、データを格納するためにクライアントから新しい書き込み動作を受信するためのメモリ・バッファ６４０と、重複排除されたデータに関してストレージ内で支援するための断片マップ６２０と、断片マップ６２０と同様のディスク・マップ６７５と、データのストリームを開始、圧縮、および格納するための動作を管理、支援、および実行するための圧縮モジュールと、クライアントから受信したそれぞれの書き込み動作を管理するためのコントロール・モジュール６５０とを、実装することができる。重複排除ストレージ・サブシステム１０６によって処理された重複排除された文書は、図２および図４に示されたような本発明に従った形式で、メモリ５４０内に格納することができる。当業者であれば理解されるように、現在図示されているようなバッファ６４０のプール、ディスク・マップ６７５、および断片マップ６２０のメカニズムは、様々な形およびアーキテクチャで実装可能である。したがってここでも、本図におけるバッファ６４０のプール、ディスク・マップ６７５、および断片マップ６２０の例示は、重複排除ストレージ・サブシステム１０６内の可能なコンピューティング・コンポーネント間の論理的関係を実証するものであること、および、特定の物理的構造または関係を示唆するものでないことが、意図されている。
【００２７】
一実施形態では、オペレーティング・システム５６０、アプリケーション・プログラム５８０、重複排除モジュール６６０、圧縮モジュール６３０、およびコントロール・モジュール６５０、ならびに、バッファ６４０のプール、ディスク・マップ６７５、および断片マップ６２０を実施する命令は、ｚｉｐドライブ、ディスク、ハード・ドライブ、ＤＶＤ／ＣＤ−ＲＯＭ、デジタル・テープ、ＳＳＤなどの、１つまたは複数の固定または取り外し可能のデータ・ストレージ・デバイスを含むことが可能な、コンピュータ読み取り可能メディア内で有形に具体化される。さらに、オペレーティング・システム５６０およびアプリケーション・プログラム５８０は、重複排除ストレージ・サブシステム１０６によって読み取りおよび実行された場合、重複排除ストレージ・サブシステム１０６が本発明の実装あるいは使用またはその両方に必要な諸ステップを実行できるようにする命令を（たとえば実行可能部分内に）備える。アプリケーション・プログラム５８０あるいはオペレーティング・システム５６０またはその両方の命令は、メモリ５４０内に有形に具体化すること、あるいは、様々なコンポーネント（たとえば図６のルータ３２０）を介してネットワーク２００を通じて送信またはこれによってアクセスすること、またはその両方も可能である。したがって、本明細書で使用される可能性のある「製品」、「プログラム・ストレージ・デバイス」、および「コンピュータ・プログラム製品」という用語は、任意のコンピュータ読み取りデバイスまたはメディアからアクセス可能あるいは動作可能またはその両方の、コンピュータ・プログラムを包含するものと意図される。
【００２８】
重複排除モジュール６６０は、ネットワーク接続ストレージ（ＮＡＳ）システムからのデータの重複排除ストレージのための複数の書き込み動作を受信する際の管理を支援する。このデータは、ＮＡＳシステムを介して重複排除ストレージのために受信されるデータが順不同または不連続の場合、オーバフローがメモリ階層へと一時的に格納されると共に、複数のバッファ内にバッファリングされる。データは、データ構造ごとに複数のバッファ内に蓄積および更新され、このデータ構造は複数のバッファと複数のユーザ・ファイル位置との間の断片マップの役割を果たす。データは、必要なシーケンス・サイズの完全なシーケンスを形成するために、複数のバッファ内で再構築される。データは、少なくとも１つのストリームとして、処理および格納のためにストリームベースの重複排除アルゴリズムに提供される。
【００２９】
さらに、重複排除モジュールは、複数の圧縮ストリームの管理および圧縮ストリームへのユーザ・ファイル断片のマッピングを支援するために実装される。これにより、各ユーザ・ファイルのデータが複数の圧縮ストリーム４０４（図４）内に常駐可能となる。さらに、圧縮ストリームは、断片に対する区画が圧縮ストリームのサイズに従うものではなく、非圧縮ストリームのサイズに従うものであることを意味する、非圧縮形式にあるものとすることができる。
【００３０】
本発明の諸実施形態は、たとえば、ストレージ・エリア・ネットワーク（ＳＡＮ）などのコンピューティング・デバイスのネットワークを備える分散型コンピュータ・システムを管理するための機能を含む、１つまたは複数の関連付けられたソフトウェア・アプリケーション・プログラム５８０を含むことができる。したがってプロセッサ５２０は、１つまたは複数のストレージ管理プロセッサ（ＳＭＰ）を備えることができる。アプリケーション・プログラム５８０は、単一のコンピュータあるいは重複排除ストレージ・サブシステム１０６またはその両方の内部で、またはコンピューティング・デバイスのネットワークを備える分散型コンピュータ・システムの一部として、動作可能である。ネットワークは、ローカル・エリア・ネットワークあるいはインターネット接続（公衆、または、仮想プライベート・ネットワーク（ＶＰＮ）接続を介したセキュアとすることができる）またはその両方を介して接続された、あるいは、ファイバ・チャネルＳＡＮまたは当業者であれば理解されるような他の知られたネットワーク・タイプを介して、１つまたは複数のコンピュータを包含することができる。（ファイバ・チャネルＳＡＮは、通常は互いに通信するためではなくストレージ・システムと通信するためにのみ、コンピュータに使用されることに留意されたい。）
【００３１】
ストレージ１３０（図内で１３０Ａ、１３０Ｂ、および１３０ｎとして示されたすべてのストレージ・コンポーネントを含む）は、物理的に、ストレージ・アレイなどの１つまたは複数のストレージ・デバイスからなるものとすることができる。ストレージ・アレイは、ハードディスクなどの個々のストレージ・デバイスの論理グループ化である。ある実施形態では、ストレージ１３０はＪＢＯＤ（単純ディスク束／Ｊｕｓｔ  ａ  Ｂｕｎｃｈ  ｏｆ  Ｄｉｓｋｓ）アレイまたはＲＡＩＤ（独立ディスクの冗長アレイ／Ｒｅｄｕｎｄａｎｔ  Ａｒｒａｙ  ｏｆ  Ｉｎｄｅｐｅｎｄｅｎｔ  Ｄｉｓｋｓ）アレイからなる。さらに物理ストレージ・アレイの集合は、物理ストレージを論理構成から分離する、ランクを形成するために組み合わせることができる。ランク内のストレージ・スペースは、書き込み／読み取り要求内に指定されるストレージ位置を画定する、論理ボリュームに割り振ることができる。
【００３２】
図２に示されるように、論理ボリューム、または単に「ボリューム」は、様々な種類の割り振りを有することができる。ストレージ１３０Ａは、２つの全体ボリューム１３４および１３６と、部分ボリューム１３２Ａとで構成されるように示されている。ストレージ１３０Ｂは、他の部分ボリューム１３２Ｂおよび全体ボリューム１４０と共に示されている。ストレージ１３０ｎは、ボリューム１３８に対して完全に割り振られたように示されている。前述の例から、ストレージ１３０は、１つまたは複数の部分あるいは全体またはその両方のボリュームを含むように構成可能であることを理解されよう。さらにボリュームは、ストレージの固定ブロックを表す、いわゆる「トラック」に分割可能である。したがってトラックは所与のボリュームに関連付けられる。
【００３３】
図３は、メモリ・バッファ６４０を使用するＮＡＳインターフェースを介した重複排除ストレージ・サブシステム（１０６、図１）内の、メモリ・バッファに関連付けられた断片マップの例示的な図３５０を示す。例示的な図３５０は、断片マップ６２０によって表されるような、ユーザ・ファイル３０２（図３では３０２Ａ、３０２Ｂ、および３０２Ｃとして示される）間を関係付けたバッファ６４０のプールを含む。ユーザ・ファイル３０２の断片に一部を、指定されたメモリ・バッファ６４０に関連付けることが可能である（図３はバッファのプールを示す）。これは、断片に関するデータがクライアントからまだ送信されていない場合に生じる可能性がある。
【００３４】
コントロール・モジュール（６５０、図２）は、それぞれの新しいアクティブなユーザ・ファイルについて、ストリームベースの圧縮モジュール内で圧縮ストリーム（４０４、図４）が開始される、という規則に従って実装される。こうした各ストリームについて、現行の書き込みオフセット（オフセット）がメモリ（５４０、図２）内で保持および維持される。オフセットは、ストリーム（４０４、図４）に書き込まれたユーザ・ファイル３０２内の最後のオフセットを表す。新しい書き込み動作がユーザから受信されると必ず、新しい書き込み動作に対してメモリ・バッファ６４０が割り振られ、メモリ・バッファ６４０内にデータが格納される。断片マップ６２０は、新しい関連を反映するように更新される。現行書き込みオフセットに隣接する断片の準備が整うと必ず、その断片は圧縮ストリーム（４０４、図４）に書き込まれ、それに応じて現行書き込みオフセットが前進する。これで書き込まれた断片のメモリ・バッファ６４０は、空き状態となることができる。
【００３５】
図４に進むと、重複排除ストレージ・サブシステムの圧縮ストリームに関連付けられたディスク・マップの例示的な図が示されている。この例示的な図４００は、ディスク・マップ４０２内にユーザ・ファイル３０２が格納された状態のディスク・マップ４０２に関連付けられた、圧縮ストリーム４０４を含む。一実施形態では、実装は、断片マップ（６２０、図２）と同様であり、ユーザ・ファイル３０２（図４では３０２Ａ、３０２Ｂ、３０２Ｃと示されている）の断片を圧縮ストリーム４０４（図４では個々に、４０４Ａ、４０４Ｂ、４０４Ｃ、４０４Ｄ、および４０４Ｅとして示されている）にマッピングする、ディスク・マップ６７５と呼ばれる、オンディスク構造を含むように機能強化することができる。これにより、各ユーザ・ファイル３０２のデータが複数の圧縮ストリーム４０４に常駐可能となる。さらに、圧縮ストリームは、断片に対する区画が圧縮ストリームのサイズに従うものではなく、非圧縮ストリームのサイズに従うものであることを意味する、非圧縮形式にあるものとすることができる。圧縮ストリームは、開始、圧縮、および格納可能である。
【００３６】
コントロール・モジュール（６５０、図２）の実装は、本発明のコントロール・モジュールの論理を機能強化する。前述の機能と同様に、それぞれの新しいアクティブなユーザ・ファイルについて、少なくとも１つの圧縮ストリーム（４０４、図４）がストリームベースの圧縮モジュール内で開始される。こうしたそれぞれのストリームについて、現行の書き込みオフセット（オフセット）がメモリ（５４０、図２）内で保持および維持される。オフセットは、ストリーム（４０４、図４）内に書き込まれた、ユーザ・ファイル３０２内の最後のオフセットを表す。新しい書き込み動作がユーザから受信されると必ず、新しい書き込み動作に対してメモリ・バッファ６４０が割り振られ、メモリ・バッファ６４０内にデータが格納される。断片マップ（６２０、図３）は、新しい関連を反映するように更新される。現行の書き込みオフセットに隣接する断片の準備が整うと必ず、断片は圧縮ストリーム４０４内に書き込まれ、それに応じて現行の書き込みオフセットが前進する。これで書き込まれた断片のメモリ・バッファ６４０は、空き状態となることができる。
【００３７】
一実施形態では、単なる例として、メモリ・バッファ６４０が不足した場合、およびメモリ内で断片の十分大きなシーケンスが使用可能な場合、本発明は新しいストリーム４０４を開始し、断片のシーケンスをストリーム４４０に書き込む。ストリーム４４に断片のシーケンスを書き込むことによって、メモリ・バッファ６４０は解放される。前述の「十分大きなシーケンス」とは、所定のしきい値よりも長い、書き込まれた断片のシーケンスとして定義される。効率を上げるために、このしきい値は、依然として使用可能なメモリ・バッファ６４０の数に依存するように決定することができる。いくつかの使用可能なメモリ・バッファ６４０が存在する場合、断片は非常に大きいものとすることが可能であり、メモリ・バッファ６４０が少なくなった場合、断片は小さくすることが可能である。
【００３８】
上書きが発生した場合（すなわちユーザが、オンディスクまたはメモリ内のいずれかで、すでに「古い」データが存在するユーザ・ファイル３０２内の領域に書き込んだ場合）、新しいストリーム４０４は上書きのために開始され、ディスク・マップは単に新しいデータを指示するように更新される。しかしながら、多くのストリーム全体にわたってユーザ・ファイル３０２を断片化することが可能であり、「古い」、すなわち、他の圧縮ストリーム４０４内の他の場所に保持されている新しいデータによって上書きされたデータが、圧縮されたストリーム４０４内に存在する可能性がある。
【００３９】
一実施形態では、これらの問題点は、各ユーザ・ファイル３０２が閉じられた後に、ユーザ・プリファレンスによって決定された任意の期間、または複数のユーザ・ファイルが休止状態であると判別された場合に実行する、断片化解除プロセスを含むことによって解決される。断片化解除動作は、（可能な限り多くの）各ユーザ・ファイルの圧縮ストリーム４０４を、単一の圧縮ストリームに再配置構成し、上書きされた不要な部分を廃棄する。
【００４０】
図５に進むと、本発明の実装のための例示的方法５００を示す流れ図が示されている。方法５００が開始され（ステップ５０１）、クライアント／バックアップ・アプリケーションが書き込みコマンドを発行する（ステップ５０２）。方法５００は、不連続データを受信すること（ステップ５０３）を含み、メモリ・バッファ内にデータを格納する実装を開始する（ステップ５０４）。方法５００は、ストリームベースのアルゴリズム内で十分に連続して使用されるようにデータを順次再構築し（ステップ５０５）、ストリームベースの圧縮モジュールを使用するストリームベースのアルゴリズムによって、連続データを渡す（ステップ５０６）。次に方法５００は、重複排除されたデータを格納して（ステップ５０８）、終了する（ステップ５１０）。図５は、図に示された流れ図の形で提示されているが、これらの機能ブロックのうちの任意数の実装が（たとえばより複雑なフローの一部として、または他の順序などで）企図されることに留意されたい。たとえば、ストリームベースのアルゴリズム内で十分に連続して使用されるようにデータを順次再構築するブロック５０５を実装し、別々に、より複雑なフローまたはプロセスで実行することができる。また、ストリームベースの圧縮モジュールを使用するストリームベースのアルゴリズムによって連続データを渡すことを記載したブロック５０６を、より複雑なプロセスで、図５に示した順序とは異なる順序で実行することができる。
【００４１】
図６に進むと、重複排除ストレージ・サブシステムの実装のための例示的方法７００を示す流れ図が提示されている。方法７００が開始され（ステップ７０２）、ＮＡＳから書き込み動作を受信する（ステップ７０４）。方法７００は、ＮＡＳプロトコル（ＮＦＳまたはＣＩＦＳ）を介して書き込み動作要求を受信すると、書き込み動作要求に従って動作および実行し、複数のバッファ内にデータを格納して、断片マップを更新する（ステップ７０５）。方法７００は、書き込み動作要求が、既存のオープン・ストリームの最後に隣接するシーケンスを完了したかどうかを判別し（ステップ７０６）、完了した場合は、既存のストリームにデータを書き込んで（７０８）、終了する（ステップ７３６）。完了していない場合、方法７００は、使用可能な空きバッファの数が、あるしきい値より少ないかどうかを判別する（ステップ７１６）。しきい値は、ユーザ、使用可能な空きバッファの数、バッファの合計数、およびメモリ階層によって決定することができるが、これらに限定されるものではない。しきい値より少なくない場合、方法７００は、メモリ内にある最大の完全なシーケンスを見つけることになり、新しいストリームを開始して、メモリにデータを書き込み、ディスク・マップを更新し（７１８）、方法は終了する（ステップ７３６）。しきい値より少ない場合、方法７００は、検出された上書き（すなわち、任意の以前の書き込み動作のファイル・オフセットで上書きする書き込み動作）が存在するかどうかをチェックする（ステップ７２８）。上書きが存在する場合、追加のストリームが作成され、そのストリームを既存のストリームの上に重ねて、ディスク・マップに記録し（ステップ７３０）、方法７００は終了する（ステップ７３６）。上書きが存在しない場合、方法７００は終了する（ステップ７３６）。
【００４２】
例示的一実施形態では、書き込み動作が、既存のストリームの（論理的な）最後に隣接するＮＡＳを介して受信された場合、第１に、書き込み動作データ要求が既存のストリームの最後に添付される場合があり、第２に、書き込み動作が完了した可能性のある任意の後続のシーケンスが添付される場合があるという、２つのイベントが発生する可能性があることに留意されたい。一時ストレージ領域は不要な可能性がある。一時ストレージ領域が実装、適合、または使用されない場合、ストリームベースのアルゴリズムに送信されるシーケンスは、より小さく、サイズが縮小されている可能性がある。
【００４３】
特許請求の範囲、説明、および図面に示された、デバイス、システム、プログラム、および方法内の動作、手続き、ステップ、およびステージなどの、プロセスの実行順序は、「前」および「先立って」などの表現を使用して、特に明確には指定されていないことに留意されたい。したがって、それらのプロセスは、先行するプロセスからの出力が後続のプロセスで使用されない限り、任意の順序で実行可能である。たとえ、特許請求の範囲、説明、または図面内のいずれかの動作フローが、便宜上「第１に」および「続いて」などの表現を使用して記述されている場合であっても、これは必ずしも、動作フローがこれらの表現によって示された順序で実行されなければならないことを意味するものではない。
【００４４】
当業者であれば理解されるように、本発明の諸態様は、システム、方法、またはコンピュータ・プログラム製品として具体化することができる。したがって本発明の諸態様は、完全なハードウェア実施形態、完全なソフトウェア実施形態（ファームウェア、常駐ソフトウェア、マイクロコードなどを含む）、または、本明細書ではすべて全体として「回路」、「モジュール」、または「システム」と呼ばれる場合のあるソフトウェアとハードウェアの諸態様を組み合わせた実施形態の形を取ることができる。さらに本発明の諸態様は、その上にコンピュータ読み取り可能プログラム・コードが具体化された１つまたは複数のコンピュータ読み取り可能メディア内に具体化された、コンピュータ・プログラム製品の形を取ることができる。
【００４５】
１つまたは複数のコンピュータ読み取り可能メディアの任意の組み合わせが使用可能である。コンピュータ読み取り可能メディアは、コンピュータ読み取り可能信号メディアまたはコンピュータ読み取り可能ストレージ・メディアとすることができる。コンピュータ読み取り可能ストレージ・メディアは、たとえば、電子、磁気、光、電磁、赤外線、または半導体のシステム、装置、またはデバイス、あるいはそれらの任意の好適な組み合わせとすることができるが、これらに限定されるものではない。コンピュータ読み取り可能ストレージ・メディアのより特定の例（非網羅的リスト）は、１本または複数本のワイヤを有する電気的接続、ポータブル・コンピュータ・ディスケット、ハードディスク、ランダム・アクセス・メモリ（ＲＡＭ）、読み取り専用メモリ（ＲＯＭ）、消去可能プログラマブル読み取り専用メモリ（ＥＰＲＯＭまたはＦｌａｓｈ（Ｒ）メモリ）、光ファイバ、ポータブル・コンパクト・ディスク読み取り専用メモリ（ＣＤ−ＲＯＭ）、光ストレージ・デバイス、磁気ストレージ・デバイス、またはそれらの任意の好適な組み合わせを含む。本明細書との関連において、コンピュータ読み取り可能ストレージ・メディアは、命令実行のシステム、装置、またはデバイスによって、またはそれらに関連して使用するためのプログラムを、含むかまたは格納することが可能な、任意の有形メディアとすることができる。
【００４６】
コンピュータ読み取り可能メディア上に具体化されたプログラム・コードは、無線、有線、光ファイバ・ケーブル、ＲＦなど、またはそれらの任意の好適な組み合わせを含むがこれらに限定されない、任意の適切なメディアを使用して伝送可能である。本発明の諸態様に関する諸動作を実行するためのコンピュータ・プログラム・コードは、Ｊａｖａ（Ｒ）、Ｓｍａｌｌｔａｌｋ（Ｒ）、Ｃ＋＋などのオブジェクト指向プログラミング言語、および、「Ｃ」プログラミング言語または同様のプログラミング言語などの従来の手続き型プログラミング言語を含む、１つまたは複数のプログラミング言語の任意の組み合わせで作成可能である。プログラム・コードは、完全にユーザのコンピュータ上で、部分的にユーザのコンピュータ上で、スタンド・アロン型ソフトウェア・パッケージとして、部分的にユーザのコンピュータ上および部分的にリモート・コンピュータ上で、あるいは、完全にリモート・コンピュータまたはサーバ上で、実行可能である。後者のシナリオでは、リモート・コンピュータを、ローカル・エリア・ネットワーク（ＬＡＮ）またはワイド・エリア・ネットワーク（ＷＡＮ）を含む、任意のタイプのネットワークを介して、ユーザのコンピュータに接続可能であるか、あるいは、（たとえば、インターネット・サービス・プロバイダを使用してインターネットを介して）外部コンピュータへの接続が実行可能である。
【００４７】
以上、本発明の諸態様について、本発明の諸実施形態に従った方法、装置（システム）、およびコンピュータ・プログラム製品の流れ図あるいはブロック図またはその両方を参照しながら説明した。流れ図あるいはブロック図またはその両方の各ブロック、および流れ図あるいはブロック図またはその両方内のブロックの組み合わせは、コンピュータ・プログラム命令によって実装可能であることを理解されよう。これらのコンピュータ・プログラム命令は、マシンを製造するために、汎用コンピュータ、特定用途向けコンピュータ、または他のプログラム可能データ処理装置へと提供可能であるため、結果として、コンピュータまたは他のプログラム可能データ処理装置のプロセッサを介して実行する命令が、流れ図あるいはブロック図またはその両方の１つまたは複数のブロック内に指定された機能／動作を実施するための手段を作成することになる。
【００４８】
コンピュータ読み取り可能メディア内に格納された命令が、流れ図あるいはブロック図またはその両方の１つまたは複数のブロック内に指定された機能／動作を実施する命令を含む製品を製造するように、コンピュータ、他のプログラム可能データ処理装置、または他のデバイスに対して、特定の様式で機能するように命令可能な、これらのコンピュータ・プログラム命令を、コンピュータ読み取り可能メディア内に格納することも可能である。コンピュータ・プログラム命令は、コンピュータまたは他のプログラム可能装置上で実行する命令が、流れ図あるいはブロック図またはその両方の１つまたは複数のブロック内に指定された機能／動作を実施するためのプロセスを提供するように、コンピュータ、他のプログラム可能装置、または他のデバイス上でコンピュータ実装プロセスを生成するように一連の動作ステップを実行させるために、コンピュータ、他のプログラム可能データ処理装置、または他のデバイス上にロードすることも可能である。
【００４９】
上記図面内の流れ図およびブロック図は、本発明の様々な諸態様に従ったシステム、方法、およびコンピュータ・プログラム製品の、可能な実装のアーキテクチャ、機能、および動作を示す。この点に関して、流れ図またはブロック図内の各ブロックは、指定された論理機能を実施するための１つまたは複数の実行可能命令を備える、モジュール、セグメント、またはコードの一部を表すことができる。一部の代替実装では、ブロック内に示された機能が、図面内に示された順序以外で発生する可能性があることにも留意されたい。たとえば、連続して示された２つのブロックは、実際にはほぼ同時に実行可能であるか、または、ブロックは関連する機能に依存して逆の順序で実行可能である。ブロック図あるいは流れ図またはその両方の各ブロック、および、ブロック図あるいは流れ図またはその両方内のブロックの組み合わせは、指定された機能または動作を実行する特定用途向けハードウェアベース・システム、あるいは特定用途向けハードウェアとコンピュータ命令との組み合わせによって、実装可能であることにも留意されよう。
【００５０】
以上、本発明の１つまたは複数の実施形態について詳細に説明してきたが、当業者であれば、これらの諸実施形態に対する修正および適合が、以下の特許請求の範囲に示された本発明の範囲を逸脱することなく実行可能であることを理解されよう。
【符号の説明】
【００５１】
１０６    重複排除ストレージ・サブシステム
１３０Ａ、１３０Ｂ、１３０ｎ    ストレージ
１３２Ａ、１３２Ｂ、１３４、１３６、１３８，１４０    ボリューム
５００    例示的部分
５２０    プロセッサ
５４０    メモリ
５６０    ＯＳ
５８０    アプリケーション・プログラム
６２０    断片マップ
６３０    圧縮モジュール
６４０    メモリ・バッファ
６５０    コントロール・モジュール
６６０    重複排除モジュール
６７５    ディスク・マップ
【図１】
0005833897.tif 000002
【図２】
0005833897.tif 000003
【図３】
0005833897.tif 000004
【図４】
0005833897.tif 000005
【図５】
0005833897.tif 000006
【図６】
0005833897.tif 000007