(57)【特許請求の範囲】
【請求項１】
対応するメモリ・アドレスを大容量メモリ（１３０）内にそれぞれ有する複数のメモリ位置を備えた前記大容量メモリを含むデータ処理エンティティ（１００）上で、複数のソフトウェア・イメージを管理する方法（３００〜９００；Ａ１〜Ａ２０）であって、各ソフトウェア・イメージは、対応するイメージ・アドレスを前記ソフトウェア・イメージ内にそれぞれ有する複数のメモリ・ブロックを含み、前記方法は、
すべての前記ソフトウェア・イメージの少なくとも一部の各メモリ・ブロックの単一バージョンを、対応するメモリ位置に格納するステップ（５００、９００）と、
各メモリ・ブロックと、前記メモリ・ブロックを格納している前記メモリ位置とを関連付ける制御構造（２１５ｉ、２３０）を提供するステップ（５２５〜５３０、９３５〜９４０）と、
現在のソフトウェア・イメージのブート位置に格納されている前記メモリ・ブロックを再配置するステップ（７２０）であって、各ソフトウェア・イメージの前記ブート位置は、前記ソフトウェア・イメージのブート・ブロックの前記イメージ・アドレスに等しい前記メモリ・アドレスを有する前記メモリ位置であり、前記ブート・ブロックは、前記ソフトウェア・イメージの前記メモリ・ブロックにアクセスするようになっているアクセス機能（２６０）をロードするよう前記データ処理エンティティをブートするために必要な前記メモリ・ブロックを含む、前記ステップ（７２０）と、
前記現在のソフトウェア・イメージの前記ブート・ブロックを、対応する前記ブート位置に格納するステップ（７２５）と、
前記対応するブート位置にある、前記現在のソフトウェア・イメージの前記ブート・ブロックから、前記データ処理エンティティをブートするステップ（７３５）であって、その結果、前記アクセス機能をロードする、前記ステップ（７３５）と、
前記現在のソフトウェア・イメージの選択されたメモリ・ブロックにアクセスするリクエストそれぞれに、前記アクセス機能によって応じるステップ（３００、４００）であって、前記アクセス機能は、前記選択されたメモリ・ブロックに、前記制御構造によって提供される前記関連付けられたメモリ位置においてアクセスする、前記ステップ（３００、４００）と、
を含む方法（３００〜９００；Ａ１〜Ａ２０）。
【請求項２】
前記大容量メモリ（１３０）は、前記再配置されていないメモリ・ブロックを格納するイメージ部分（２０５）および前記再配置されたメモリ・ブロックを格納する再配置部分（２４０）を含み、前記制御構造（２１５ｉ、２３０）は、再配置されていないメモリ・ブロックそれぞれを格納する前記イメージ部分における前記メモリ位置の前記メモリ・アドレスのインジケーションを提供するオフセット・マップ（２２０ｉ）と、対応する前記ブート・ブロックの前記イメージ・アドレスのインジケーションを提供するブート・リスト（２２５ｉ）とを、各ソフトウェア・イメージに関して含み、前記アクセス機能（２６０）は、前記対応するイメージ・アドレスが、前記現在のソフトウェア・イメージの前記ブート・リストによって提供される前記ブート・ブロックの前記イメージ・アドレスに含まれていない場合は、前記選択されたメモリ・ブロックに、前記現在のソフトウェア・イメージの前記オフセット・マップによって提供される前記メモリ・アドレスを有する前記イメージ部分の前記メモリ位置においてアクセスし、またはその他の場合は、前記選択されたメモリ・ブロックに、前記再配置部分の対応するメモリ位置においてアクセスする、請求項１に記載の方法（３００〜９００）。
【請求項３】
前記選択されたメモリ・ブロックにアクセスする前記ステップ（３００）は、前記選択されたメモリ・ブロックを前記大容量メモリから読み込むステップ（３００）を含み、前記読み込むステップ（３００）は、
前記選択されたメモリ・ブロックがどのメモリ位置にも格納されていない場合は、デフォルト値を返すステップ（３２５、３５０）、または
その他の場合は、前記制御構造（２１５ｉ）によって提供される前記関連付けられたメモリ位置から読み出される前記選択されたメモリ・ブロックを返すステップ（３３０〜３５０）
による、請求項１または２に記載の方法（３００〜９００）。
【請求項４】
前記選択されたメモリ・ブロックにアクセスする前記ステップ（４００）は、前記選択されたメモリ・ブロックを前記大容量メモリ上に書き込むステップ（４００）を含み、前記書き込むステップ（４００）は、
前記選択されたメモリ・ブロックがどのメモリ位置にも格納されていない場合は、前記選択されたメモリ・ブロックを、空きメモリ位置に格納するステップ（４２５〜４３０、４８５）、および前記選択されたメモリ・ブロックと、前記空きメモリ位置とを、前記制御構造（２１５ｉ）において関連付けるステップ（４３５）、
前記制御構造（２１５ｉ）によって提供される前記関連付けられたメモリ位置に格納されている前記メモリ・ブロックが、前記現在のソフトウェア・イメージのみによって使用されている場合は、前記選択されたメモリ・ブロックを、前記関連付けられたメモリ位置に格納するステップ（４４０〜４６０、４８５）、または、
前記関連付けられたメモリ位置に格納されている前記メモリ・ブロックが、少なくとももう１つのソフトウェア・イメージと共有されている場合は、前記選択されたメモリ・ブロックを空きメモリ位置に格納ステップ（４４０〜４５０、４６５〜４７５、４８５）、前記選択されたメモリ・ブロックと、前記空きメモリ位置とを、前記制御構造（２１５ｉ）において関連付けるステップ（４８０）
による、請求項１〜３いずれか１項に記載の方法（３００〜９００）。
【請求項５】
前記制御構造（２１５ｉ、２３０）は、各メモリ位置のブロック・カウンタを提供するブロック・マップ（２３０）を含み、前記ブロック・カウンタは、前記メモリ位置に格納されている前記メモリ・ブロックを共有しているソフトウェア・イメージの数を示し、前記選択されたメモリ・ブロックを書き込む前記ステップ（４００）は、
前記選択されたメモリ・ブロックがどのメモリ位置にも格納されていない場合は、前記空きメモリ位置の前記ブロック・カウンタを１にセットするステップ（４３０）、または、
前記関連付けられたメモリ位置に格納されている前記メモリ・ブロックが、少なくとももう１つのソフトウェア・イメージと共有されている場合は、前記関連付けられたメモリ位置の前記ブロック・カウンタを減らすステップ（４６５）、および前記空きメモリ位置の前記ブロック・カウンタを１にセットするステップ（４７５）
をさらに含む、請求項４に記載の方法（３００〜９００）。
【請求項６】
ソース・ソフトウェア・イメージからターゲット・ソフトウェア・イメージを作成するリクエスト（５１０）に応答して、
前記制御構造（２１５ｉ、２３０）において、前記ソース・ソフトウェア・イメージの各メモリ・ブロックを格納している前記メモリ位置と、前記ターゲット・ソフトウェア・イメージの対応するメモリ・ブロックとを関連付けるステップ（５１５〜５３５）
をさらに含む、請求項１〜５いずれか１項に記載の方法（３００〜９００）。
【請求項７】
関連付ける前記ステップ（５１５〜５３５）は、
前記ソース・ソフトウェア・イメージの各メモリ・ブロックを格納している前記メモリ位置の前記ブロック・カウンタを、１増やすステップ（５３０）
を含む、請求項５に従属する請求項６に記載の方法（３００〜９００）。
【請求項８】
古くなったソフトウェア・イメージを削除するリクエスト（６１０）に応答して、
前記制御構造（２１５ｉ、２３０）において、前記古くなったソフトウェア・イメージの各メモリ・ブロックと、前記古くなったソフトウェア・イメージの前記メモリ・ブロックを格納している前記メモリ位置との前記関連付けを除去するステップ（６１５〜６３５）
をさらに含む、請求項１〜７いずれか１項に記載の方法（３００〜９００）。
【請求項９】
前記関連付けを除去する前記ステップ（６１５〜６３５）は、
前記古くなったソフトウェア・イメージの各メモリ・ブロックを格納している前記メモリ位置の前記ブロック・カウンタを、１減らすステップ（６２５）
を含む、請求項５に直接的または間接的に従属する請求項８に記載の方法（３００〜９００）。
【請求項１０】
前のソフトウェア・イメージから前記現在のソフトウェア・イメージに切り替えるリクエスト（７１０）に応答して、
前記現在のソフトウェア・イメージの前記ブート位置に格納されている前記メモリ・ブロックを再配置する（７２０）前に、前記前のソフトウェア・イメージの前記ブート位置から再配置されている前記メモリ・ブロックを、前記前のソフトウェア・イメージの前記ブート位置に復元するステップ（７１５）
をさらに含む、請求項１〜９いずれか１項に記載の方法（３００〜９００）。
【請求項１１】
選択されたソフトウェア・イメージを、外部デバイス上にエクスポートするリクエスト（８１０）に応答して、
前記選択されたソフトウェア・イメージの各メモリ・ブロックを読み込むステップ（８１５〜８５０）であって、前記選択されたソフトウェア・イメージの前記メモリ・ブロックがどのメモリ位置にも格納されていない場合は、前記メモリ・ブロックを別のデフォルト値にセットすること、またはその他の場合は、前記制御構造（２１５ｉ）によって提供される前記関連付けられたメモリ位置から、前記選択されたソフトウェア・イメージの前記メモリ・ブロックを読み出すことによって、前記読み込むステップ（８１５〜８５０）と、
前記選択されたソフトウェア・イメージの各メモリ・ブロックを、前記外部デバイス上にコピーするステップ（８５５）と、
をさらに含む、請求項１〜１０いずれか１項に記載の方法（３００〜９００）。
【請求項１２】
外部ソフトウェア・イメージを別の外部デバイスからインポートするリクエスト（９１０）に応答して、
前記別の外部デバイスから、前記外部ソフトウェア・イメージの各メモリ・ブロックを読み出すステップ（９２５）と、
前記外部ソフトウェア・イメージの前記メモリ・ブロックを、別の空きメモリ位置に格納して、前記制御構造（２１５ｉ）において、前記外部ソフトウェア・イメージの前記メモリ・ブロックと、前記別の空きメモリ位置とを関連付けることによって、前記外部ソフトウェア・イメージの各メモリ・ブロックを書き込むステップ（９３０〜９４５）と、
をさらに含む、請求項１〜１１に記載の方法（３００〜９００）。
【請求項１３】
外部ソース（１０１５）から前記データ処理エンティティ（１００）上への新たなソフトウェア・イメージの展開をリクエストするステップ（Ａ１４）と、
前記外部ソースから前記データ処理エンティティ上に、前記新たなソフトウェア・イメージの前記ブート・ブロックをダウンロードするステップ（Ａ１５）と、
前記新たなソフトウェア・イメージの前記ブート位置に格納されている前記メモリ・ブロックを再配置するステップ（Ａ１７）と、
前記新たなソフトウェア・イメージの前記ブート・ブロックを、対応する前記ブート位置に格納するステップ（Ａ１９）と、
前記対応するブート位置にある、前記新たなソフトウェア・イメージの前記ブート・ブロックから、前記データ処理エンティティをブートするステップ（Ａ２０）であって、その結果、前記新たなソフトウェア・イメージを展開するようになっているストリーミング機能をロードする、前記ステップ（Ａ２０）と、
前記新たなソフトウェア・イメージの別の選択されたメモリ・ブロックを読み込むリクエストそれぞれに、前記ストリーミング機能によって応じるステップ（Ａ８〜Ａ１０）であって、前記ストリーミング機能は、前記別の選択されたメモリ・ブロックがどのメモリ位置にも格納されていない場合は、前記別の選択されたメモリ・ブロックを前記外部ソースからダウンロードし（Ａ９．１０）、前記別の選択されたメモリ・ブロックを、さらに別の空きメモリ位置に格納し（Ａ９．１１）、前記制御構造（２１５ｉ）において、前記別の選択されたメモリ・ブロックと、前記さらに別の空きメモリ位置とを関連付け、またはその他の場合は、前記制御構造によって提供される前記関連付けられたメモリ位置から、前記別の選択されたメモリ・ブロックを読み込む（Ａ９．２０）、前記ステップ（Ａ８〜Ａ１０）と、
をさらに含む、請求項１〜１２いずれか１項に記載の方法（Ａ１〜Ａ２０）。
【請求項１４】
請求項１〜１３いずれか１項に記載の方法（３００〜９００；Ａ１〜Ａ２０）の前記ステップをコンピュータに実行させる、コンピュータ・プログラム。
【請求項１５】
請求項１〜１３いずれか１項に記載の方法（３００〜９００；Ａ１〜Ａ２０）の前記ステップを実行する手段（３００〜９００；１０００）を具備するシステム（１００）。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の１つ以上の実施形態によるソリューションは、データ処理の分野に関する。特に、このソリューションは、ソフトウェア・イメージの管理に関する。
【背景技術】
【０００２】
一般的に、ソフトウェア・イメージとは、コンピュータ上に存在するソフトウェア・モジュール（例えば、コンピュータのオペレーティング・システム、アプリケーション・プログラム、もしくはデータ、またはそのいずれかの組み合わせ）を含む構造である。
【０００３】
場合によっては、複数のオペレーティング・システムが同じコンピュータ上で利用可能であることが望ましいこともある。例えばこれは、異なるオペレーティング・システムを必要とするプログラムを実行するため、または新しいオペレーティング・システムもしくはその新バージョンをテストするために有用であることもある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】米国特許出願公開第２００８／０１３３２０８号
【発明の概要】
【発明が解決しようとする課題】
【０００５】
このために、マルチ・ブート技術を活用することが可能である。マルチ・ブート技術は、複数のオペレーティング・システムをコンピュータ上にインストールすることを可能にし、コンピュータの起動時にどのオペレーティング・システムをブートするか選ぶことができる。この所望の結果は、コンピュータのハード・ディスクを複数のパーティションに分割することによって得られ、各パーティションが、対応するオペレーティング・システムを格納する論理ディスクを定義する。コンピュータは、プライマリ・パーティションからブートし、プライマリ・パーティションには、実際に起動するオペレーティング・システムの選択を可能にするブート・ローダが含まれる。あるいは、所望のオペレーティング・システムを選択するためのみに使用されるプライマリ・ブート・ローダを備えたブート・パーティションを提供することが可能である。その結果、プライマリ・ブート・ローダは、選択されたオペレーティング・システムの起動のために、そのオペレーティング・システムのセカンダリ・ブート・ローダを呼び出す。
【０００６】
しかし、マルチ・ブート技術は、ハード・ディスクのパーティションが前もって定義されるため、柔軟性を大きく欠く。いずれの場合でも、選択されたオペレーティング・システムが起動されれば、それがハード・ディスク全体を完全に制御する。したがって、選択されたオペレーティング・システムは、他のパーティションにもアクセスできる（それらを破損させるリスクを伴う）。
【０００７】
あるいは、仮想化技術を活用して同じ結果を得ることもできる。この場合、コンピュータにハイパーバイザがインストールされる。ハイパーバイザは仮想化層を実装し、これによって、物理コンピュータ（仮想マシンが単独で制御する）のように見える抽象的な環境からそれぞれ成る複数の仮想マシンがエミュレートされる。このようにして、対応する仮想マシン上で種々のオペレーティング・システムを独立して（同時にでも）実行させることができる。
【０００８】
しかし、仮想化技術では、仮想マシンを管理するための複雑なインフラストラクチャをインストールする必要がある。さらに、これには、コンピュータのパフォーマンス低下が伴う（オペレーティング・システムがコンピュータ上でネイティブに実行されなくなるため）。
【０００９】
もう１つよくあるニーズが、コンピュータのソフトウェア・イメージのバックアップ・コピーをとることである。例えば、これは、コンピュータが正常に機能しなくなった場合に、コンピュータのコンテンツを復元するために有用であることもある。
【００１０】
このために、ソフトウェア・イメージのスナップショット（すなわち、特定の時点の一貫した状態におけるソフトウェア・イメージのバックアップ・コピー）をとることができる。スナップショットは、バックアップ・ディスクまたはバックアップ・サーバに保存され得る。こうすることで、バックアップ・ディスクまたはバックアップ・サーバからコンピュータ上へスナップショットを再インストールして、スナップショットを復元することができる。しかし、スナップショットをとるプロセスおよび復元するプロセスは、どちらも非常に遅い。さらに、バックアップ・サーバを使用する場合、これには、ネットワーク・リソースの高消費が伴う。さらに、バックアップ・サーバからスナップショットを復元するためには、バックアップ・サーバとのネットワーク接続が必要である。あるいは、バックアップ・サーバ上のスナップショットからコンピュータを遠隔ブートすることが可能である。しかしこの場合、コンピュータが動作するためには常にバックアップ・サーバに接続されている必要がある。いずれの場合でも、ネットワークを介したコンピュータの動作は、そのパフォーマンス低下を伴う。
【００１１】
さらに、特許文献１（その開示全体を参照によって本願明細書に引用したものとする）は、コンピュータから直接、その（物理）スナップショットを使用して仮想マシンを実行する方法を開示している。このために、仮想マシンは、その初期状態を表現する仮想スナップショットとして、この物理スナップショットを使用して初期化する。例えば、仮想マシンは更新のテストに使用されてもよく、テストが成功すればその更新をコンピュータに利用可能にする可能性もあり（対応する新たな物理スナップショットとして）、または、疑わしいプログラムの実行がウイルスもしくはスパイウェア・アクティビティを示すかどうか検証するために使用されることもできる。上記のように、これには仮想化層のインストールが必要である（上述の欠点を伴う）。さらに、この文書に記載されている技術は、コンピュータ上で単一のオペレーティング・システムしかサポートしない。
【課題を解決するための手段】
【００１２】
概略として、本発明の１つ以上の実施形態によるソリューションは、複数のソフトウェア・イメージを、その共通のメモリ・ブロックを共有することによって管理するという考えに基づく。
【００１３】
詳細には、本発明の特定の実施形態によるソリューションの１つ以上の側面が、独立請求項に記載されており、同じソリューションの有利な特徴は、従属請求項に記載されており、その表現は、参照によって逐語的に本願明細書に引用される（本願明細書の実施形態によるソリューションの、特定の側面を参照して提供される任意の有利な特徴は、他のすべての側面に準用される）。
【００１４】
さらに具体的には、本発明の実施形態によるソリューションの側面は、データ処理エンティティ（例えば、スタンド・アローン・コンピュータ）上で複数のソフトウェア・イメージを管理する方法を提供する。データ処理エンティティは、複数のメモリ位置（ｍｅｍｏｒｙ  ｌｏｃａｔｉｏｎ）を備える大容量メモリを含む。各メモリ位置は、対応するメモリ・アドレスを大容量メモリ内に有する。各ソフトウェア・イメージは、複数のメモリ・ブロックを含む。各メモリ・ブロックは、対応するイメージ・アドレスをソフトウェア・イメージ内に有する。本方法は、以下のステップを含む。すべてのソフトウェア・イメージ（または少なくともその一部）の各メモリ・ブロックの単一バージョンが、対応するメモリ位置に格納される。制御構造が提供される。制御構造は、各メモリ・ブロックと、メモリ・ブロックを格納するメモリ位置とを関連付ける（例えば、対応するメモリ位置のメモリ・アドレスの計算を可能にする、各メモリ・ブロックのブロック・オフセット（ｂｌｏｃｋ  ｏｆｆｓｅｔ）を格納するオフセット・マップ（ｏｆｆｓｅｔ  ｍａｐ）、およびメモリ位置に格納されているメモリ・ブロックを使用するソフトウェア・イメージの数を示す、各メモリ位置のブロック・カウンタ（ｂｌｏｃｋ  ｃｏｕｎｔｅｒ）を格納するブロック・マップ（ｂｌｏｃｋ  ｍａｐ））。現在のソフトウェア・イメージのブート位置（ｂｏｏｔ  ｌｏｃａｔｉｏｎ）に格納されているメモリ・ブロックは、再配置される（例えば大容量メモリの再配置部分へ）。各ソフトウェア・イメージのブート位置は、ソフトウェア・イメージのブート・ブロックのイメージ・アドレスに等しいメモリ・アドレスを有するメモリ位置であり、このブート・ブロックは、アクセス機能（ソフトウェア・イメージのメモリ・ブロックにアクセスするようになっている）をロードするようデータ処理エンティティをブートするために必要なメモリ・ブロックを含む。現在のソフトウェア・イメージのブート・ブロックが、対応するブート位置に格納される。データ処理エンティティは、この対応するブート位置にある現在のソフトウェア・イメージのブート・ブロックからブートされる（その結果アクセス機能をロードする）。現在のソフトウェア・イメージの選択されたメモリ・ブロックにアクセスするリクエストそれぞれに、アクセス機能が応じる（ｓｅｒｖｅ）。アクセス機能は、選択されたメモリ・ブロックに、制御構造によって提供される関連付けられたメモリ位置においてアクセスする。
【００１５】
本発明の実施形態によるソリューションの別の側面は、コンピュータ・プログラムを提供し、コンピュータ・プログラムは、コンピュータ・プログラムがデータ処理システム上で実行されると本方法のステップをデータ処理エンティティに実行させるコード手段を含む。本発明の実施形態によるソリューションのさらに別の側面は、コンピュータ・プログラムを具現化する非一時的コンピュータ可読媒体を含むコンピュータ・プログラム製品を提供し、コンピュータ・プログラムは、データ処理システムのワーキング・メモリ（ｗｏｒｋｉｎｇ  ｍｅｍｏｒｙ）に直接ロード可能であり、その結果同方法を実行するようデータ処理システムを構成する、コード手段を含む。
【００１６】
本発明の実施形態によるソリューションのもう１つの側面は、前記方法のステップを実行する手段を具備するシステムを提供する。
【図面の簡単な説明】
【００１７】
【図１】本発明の実施形態によるソリューションを適用できるコンピュータの概略ブロック図を示す。
【図２】本発明の実施形態によるソリューションの例示的適用を示す。
【図３】本発明の実施形態による読み込み動作に関するアクティビティのフローを表すアクティビティ図を示す。
【図４】本発明の実施形態による書き込み動作に関するアクティビティのフローを表すアクティビティ図を示す。
【図５】本発明の実施形態によるスナップショット作成の動作に関するアクティビティのフローを表すアクティビティ図を示す。
【図６】本発明の実施形態によるスナップショット削除の動作に関するアクティビティのフローを表すアクティビティ図を示す。
【図７】本発明の実施形態によるスナップショット切り替えの動作に関するアクティビティのフローを表すアクティビティ図を示す。
【図８】本発明の実施形態によるスナップショット・エクスポートの動作に関するアクティビティのフローを表すアクティビティ図を示す。
【図９】本発明の実施形態によるスナップショット・インポートの動作に関するアクティビティのフローを表すアクティビティ図を示す。
【図１０】本発明の実施形態による展開プロセスを実装するために使用されるとよい主なソフトウェア・コンポーネントの役割を表現するコラボレーション図を示す。
【図１１】本発明の実施形態による展開プロセスを実装するために使用されるとよい主なソフトウェア・コンポーネントの役割を表現するコラボレーション図を示す。
【図１２】本発明の実施形態による展開プロセスを実装するために使用されるとよい主なソフトウェア・コンポーネントの役割を表現するコラボレーション図を示す。
【図１３】本発明の実施形態による展開プロセスを実装するために使用されるとよい主なソフトウェア・コンポーネントの役割を表現するコラボレーション図を示す。
【図１４】本発明の実施形態による準備プロセスを実装するために使用されるとよい主なソフトウェア・コンポーネントの役割を表現するコラボレーション図を示す。
【発明を実施するための形態】
【００１８】
非制限的な指示のみを目的として与えられ添付の図面と併せて読まれる以下の詳細な説明を参照することで、本発明の１つ以上の実施形態によるソリューション、ならびにその別の特徴および利点が最もよく理解される（図面では、単純化のために、対応する構成要素は等しい参照符号または同様の参照符号を用いて表示されており、その説明は繰り返されず、各エンティティの名称は概して、その値、コンテンツ、および表現など、そのタイプと特質との両方を表示するように使用されている。
【００１９】
図１を詳細に参照する。本発明の実施形態によるソリューションを適用できるコンピュータ１００の概略ブロック図が示されている。コンピュータ１００（例えばＰＣ）は、システム・バス１０５に並列接続されたいくつかのユニットによって形成されている。詳細には、１つ以上のマイクロプロセッサ（μＰ：ｍｉｃｒｏｐｒｏｃｅｓｓｏｒ）１１０が、コンピュータ１００の動作を制御する。ＲＡＭが、マイクロプロセッサ１１０によってワーキング・メモリ１１５として使用され、ＲＯＭ１２０が、コンピュータ１００の基本コードを格納する。いくつかの周辺ユニットが、ローカル・バス１２５の周りに集められている（それぞれのインターフェースを用いて）。詳細には、大容量メモリは、１つ以上のハード・ディスク１３０および光ディスク１４０（例えばＤＶＤまたはＣＤ）を読み込むドライブ１３５を含む。さらに、コンピュータ１００は、入力ユニット１４５（例えば、キーボードおよびマウス）ならびに出力ユニット１５０（例えば、モニタおよびプリンタ）を含む。アダプタ１５５は、コンピュータ１００をネットワーク（図示せず）に接続するために使用される。ブリッジ・ユニット１６０は、システム・バス１０５をローカル・バス１２５とインターフェースで接続する。マイクロプロセッサ１１０およびブリッジ・ユニット１６０はそれぞれ、情報を送るためにシステム・バス１０５へのアクセスをリクエストするマスタ・エージェントとして動作することができる。アービタ１６５は、システム・バス１０５へのアクセスの、相互排除による許可を管理する。
【００２０】
図２に、本発明の実施形態によるソリューションの例示的適用が示されている。詳細には、このソリューションは、コンピュータ１００上の種々のソフトウェア・イメージを管理するのに使用される。各ソフトウェア・イメージは、１つ以上のソフトウェア・モジュールを含む（例えば、オペレーティング・システム、アプリケーション・プログラム、もしくはデータ、またはそのいずれかの組み合わせ）。ソフトウェア・イメージは、メモリ・ブロック（例えば、それぞれ１〜１０ＭＢ）のセットによって形成され、メモリ・ブロックは、対応するアドレスをソフトウェア・イメージ内に有する（イメージ・アドレスと呼ばれる）。
【００２１】
このために、ハード・ディスク１３０は、別々の部分に論理的に分割される。より詳細には、ハード・ディスク１３０の大部分は、イメージ部分２０５によって使われる（その先頭から）。イメージ部分２０５は、ハード・ディスク１３０内の対応するアドレス（メモリ・アドレスと呼ばれる）を備えるメモリ位置のセットによって形成される。それぞれが、ソフトウェア・イメージのメモリ・ブロックを格納するためのものである。詳細には、すべてのソフトウェア・イメージの各メモリ・ブロックの単一のバージョンが、対応するメモリ位置に格納される。
【００２２】
一方、ハード・ディスク１３０の残りの部分（その最後部）は、サービス情報を格納するために使用される。
【００２３】
さらに具体的には、ヘッダ部分２１０が、各ソフトウェア・イメージのイメージ・ヘッダ２１５ｉを格納するために予約される。イメージ・ヘッダ２１５ｉは、オフセット・マップ２２０ｉおよびブート・リスト２２５ｉを含む。オフセット・マップ２２０ｉは、対応するソフトウェア・イメージの各メモリ・ブロック（そのイメージ・アドレスによって識別される）のブロック・オフセットを特定し、このブロック・オフセットは、イメージ部分２０５内のメモリ・ブロックの、ソフトウェア・イメージ内での場所に対する変位量を示す（すなわち、メモリ・ブロックを格納するメモリ位置のメモリ・アドレスと、そのイメージ・アドレスとの間の、正または負いずれかの差に等しい）。ブロック・オフセットは、対応するメモリ・ブロックが使用されていなければヌル値に等しい。イメージ・ヘッダ２１５ｉは、比較的小さい。例えば、各ブロック・オフセットを５Ｂでコード化すると仮定すると（２・５００ＧＢ＝１ＴＢのイメージ部分２０５のアドレス指定に、ヌル値を無視して±２５＊８−１＝２３９＝５００ＧＢの範囲のブロック・オフセットの値が可能となるように）、２ＭＢのメモリ・ブロックを備える１００ＧＢのソフトウェア・イメージは、１００ＧＢ／２ＭＢ＊５Ｂ＝２５０ｋＢのイメージ・ヘッダ２１５ｉを必要とする。ヘッダ部分２１０は、比較的多数のイメージ・ヘッダ２１５ｉ（例えば１０〜５０まで）を格納することを可能にするサイズである。一方、ブート・リスト２２５ｉは、ソフトウェア・イメージのブート・ブロックのイメージ・アドレス（ブート・アドレスと呼ばれる）のリストを特定する。ブート・ブロックは、展開エージェントをロードするようソフトウェア・イメージのブート・シーケンスを起動するために必要なメモリ・ブロックを含む（以下に記載）。例えば、Ｍｉｃｒｏｓｏｆｔ（Ｒ）Ｗｉｎｄｏｗｓ（Ｒ）では、ブート・ブロックは（展開エージェントに加えて）、マスタ・ブート・レコード（ＭＢＲ：Ｍａｓｔｅｒ  Ｂｏｏｔ  Ｒｅｃｏｒｄ）、ブート・セクタ、ｂｏｏｔｍｇｒ．ｅｘｅファイル、ｂｏｏｔ＼ｂｃｄファイル、システム・レジストリ、ｗｉｎｌｏａｄ．ｅｘｅファイル、およびシステム・レジストリで特定されるドライバ・ファイルを含む。
【００２４】
さらに、ブロック・マップ２３０は、イメージ部分２０５の各メモリ位置（そのメモリ・アドレスによって識別される）のブロック・カウンタを特定する。ブロック・カウンタは、そのメモリ位置に格納されたメモリ・ブロックを使用するソフトウェア・イメージの数を示す。メモリ位置が空きであれば、ブロック・カウンタは０に等しい。ブロック・マップ２３０は、ほとんどの場合、イメージ・ヘッダ２１５ｉよりも大きい。例えば、各ブロック・カウンタを１Ｂでコード化すると仮定すると（２８−１＝２５５までのソフトウェア・イメージを管理できるように）、２ＭＢのメモリ・ブロックを備える１ＴＢのイメージ部分は、１００ＴＢ／２ＭＢ＊１Ｂ＝４００ＭＢのブロック・マップ２３０を必要とする。一方、ヘッダ・インデックス２３５は、コンピュータ上で現在アクティブであるソフトウェア・イメージ（現在のソフトウェア・イメージと呼ばれる）のイメージ・ヘッダ２１５ｉをポイントする。
【００２５】
最後に、ハード・ディスク１３０の再配置部分２４０は、メモリ・アドレスが現在のソフトウェア・イメージのブート・アドレスに等しいイメージ部分２０５のメモリ位置を再配置するために使用され、それらは再配置されたメモリ位置２４５Ｃと呼ばれる。続いて、現在のソフトウェア・イメージのブート・ブロックは、そのブート位置にコピーされることが可能であり、それが、濃い灰色で示され、参照符号２５０Ｃで表示されている。このようにして、ブート・ブロック２５０Ｃは、ハード・ディスク１３０において、現在のソフトウェア・イメージのブート・シーケンス中に発見されると予想される、まさにその場所に配置される。それでも、無効にされた対応するメモリ・ブロックは、再配置されたメモリ位置２４５Ｃに保存されているため、これによって、イメージ部分２０５の情報は何も喪失されない。
【００２６】
その結果、コンピュータ１００は、電源が入ると、ハード・ディスク１３０から通常通りブートする。実際、コンピュータ１００の電源投入時に実行される、そのファームウェアに格納されたブート・ローダ、例えば基本入出力システム（ＢＩＯＳ：Ｂａｓｉｃ  Ｉｎｐｕｔ／Ｏｕｔｐｕｔ  Ｓｙｓｔｅｍ）は、ブート可能デバイスとしてハード・ディスク１３０を識別する。したがって、ＢＩＯＳは、ＭＢＲをロードし、ＭＢＲは、ブート・セクタをロードし、ブート・セクタは、ｂｏｏｔｍｇｒ．ｅｘｅファイルを発見して起動し、ｂｏｏｔｍｇｒ．ｅｘｅは、ｂｏｏｔ＼ｂｃｄファイルを発見して読み込み、システム・レジストリ、ｗｉｎｌｏａｄ．ｅｘｅファイル、およびシステム・レジストリ内で特定されているドライバ・ファイルのメモリ位置を判断して、続いてそれをロードし、ｗｉｎｌｏａｄ．ｅｘｅが、展開エージェントを起動する。このようにして、現在のソフトウェア・イメージのブート・ブロック２５０Ｃに対応する、現在のソフトウェア・イメージの実際のオペレーティング・システムの部分（参照符号２５５Ｃで表示されている）および展開エージェント（参照符号２６０で表示されている）が、ワーキング・メモリ１１５にロードされる。
【００２７】
これ以降、コンピュータ１００の動作中の、現在のソフトウェア・イメージの選択されたメモリ・ブロックにアクセスするリクエストすべてに、展開エージェント２６０のアクセス・ドライバが応じ（以下に記載）、これは、図示されていない、オペレーティング・システム２５５Ｃの標準のファイル・システム・ドライバに優先する。このために、展開エージェント２６０は、対応するアクセスを高速化するように、現在のソフトウェア・イメージのイメージ・ヘッダ２５０ｉをワーキング・メモリ１１５にロードすることが好ましい。
【００２８】
上記の技術は、非常に容易な方法でコンピュータ１００上の複数のソフトウェア・イメージを管理することを可能にする。さらに、種々のソフトウェア・イメージは、互いに完全に分離されている。実際、各ソフトウェア・イメージは、対応するメモリ・ブロックのみにアクセスできる（他のソフトウェア・イメージを破損させるあらゆるリスクを防ぐために）。
【００２９】
この結果は、何らの仮想化インフラストラクチャも必要とすることなく得られる。したがって、コンピュータ１００のパフォーマンスは悪影響を受けない。実際、この場合、ソフトウェア・イメージのみ（すなわち、そのメモリ・ブロックが格納されているメモリ位置）が仮想化され、逆にオペレーティング・システムは、コンピュータ１００上でネイティブに実行され続ける。
【００３０】
さらに、ソフトウェア・イメージの数およびそのサイズがあらかじめ定められていないため、このソリューションは非常に柔軟性が高い。より広く述べると、ソフトウェア・イメージの数およびそのサイズは、すべてのソフトウェア・イメージによって実際に使用される異なるメモリ・ブロックの数によって決まるため、ソフトウェア・イメージの数およびそのサイズが、ハード・ディスク１３０上の利用可能なメモリ空間によって厳しく決定されることは、もうなくなる。実際には、使用されないメモリ・ブロックは、ハード・ディスク１３０に格納されず、種々のソフトウェア・イメージ間の同じメモリ・ブロックは、共有される（したがって、その増加が回避される）。これは、特に、ソフトウェア・イメージが、利用可能なメモリ空間のわずかな部分のみを活用する場合（実際に頻繁に生じる）、もしくはソフトウェア・イメージが互いにわずかに異なる場合（例えば、コンピュータのいくつかのスナップショットが経時的にとられる場合）、またはその両方の場合に、大きなメモリ空間の節約を提供する。
【００３１】
本発明の対応する実施形態による、上記のコンピュータ上で実行され得る種々の例示的動作について、以下に詳しく記載する。
【００３２】
詳細には、図３は、本発明の実施形態による読み込み動作に関するアクティビティのフローを表すアクティビティ図を示し、この読み込み動作が、方法３００により表現されている。
【００３３】
本方法３００は、黒い開始円３０５にて始まり、続いて、現在のソフトウェア・イメージの選択されたメモリ・ブロック（対応する選択されたイメージ・アドレスにある）を読み込むリクエストがファイル・システム・ドライバに（例えば、アプリケーション・プログラムから）提出されると、すぐにブロック３１０に移動する。読み込みリクエストは、ブロック３１５にて、展開エージェントに渡され、展開エージェントは、選択されたメモリ・ブロックのブロック・オフセットを、現在のソフトウェア・イメージのオフセット・マップから読み出す。次に、アクティビティのフローは、選択されたメモリ・ブロックのブロック・オフセットの値に従ってブロック３２０にて分岐する。
【００３４】
選択されたメモリ・ブロックのブロック・オフセットがヌル値に等しければ（選択されたメモリ・ブロックが使用されていないことを意味する）、ブロック３２５にて展開エージェントは、選択されたメモリ・ブロックにデフォルト値を割り当てる（例えば、そのすべてのビットを０にセットすることによる）。
【００３５】
反対に、選択されたメモリ・ブロックのブロック・オフセットが有効値を有する（選択されたメモリ・ブロックが使用されていることを意味する）と、展開エージェントは、ブロック３３０にて、選択されたメモリ・ブロックを格納しているべきイメージ部分のメモリ位置（選択されたメモリ位置と呼ばれる）のメモリ・アドレスを、そのブロック・オフセットをそのイメージ・アドレスに加算することによって計算する。ここで、ブロック３３５にてテストが行われ、選択されたメモリ位置が再配置部分へ再配置されている（すなわち、選択されたメモリ位置のメモリ・アドレスが、ブート・リストにおいて示される、現在のソフトウェア・イメージのブート・アドレスの１つに等しい場合）かどうかが検証される。そうであれば、展開エージェントは、ブロック３４０にて、選択されたメモリ位置を、対応する再配置されたメモリ位置に等しくセットする（それに合わせてそのメモリ・アドレスを置換することによる）。続いて、方法３００はブロック３４５へと下降する。選択されたメモリ位置が再配置されていない場合も、ブロック３３５から直接同じポイントに達する。この時点で、展開エージェントは、選択されたメモリ・ブロックを選択されたメモリ位置から読み出す。
【００３６】
いずれの場合でも、アクティビティのフローはブロック３５０にて合流する（ブロック３２５またはブロック３４５のいずれかから）。展開エージェントは、ここで、選択されたメモリ・ブロックをファイル・システム・ドライバに返し、次にファイル・システム・ドライバは、それをアプリケーション・プログラムに返す。方法３００は、その結果、白／黒の停止の同心円３５５にて終わる。
【００３７】
一方、図４は、本発明の実施形態による書き込み動作に関するアクティビティのフローを表すアクティビティ図を示し、この書き込み動作が、方法４００により表現されている。
【００３８】
本方法４００は、黒い開始円４０５にて始まり、続いて、現在のソフトウェア・イメージの選択されたメモリ・ブロック（対応する選択されたイメージ・アドレスにある）を書き込むリクエストがファイル・システム・ドライバに（例えば、アプリケーション・プログラムから）提出されるとすぐにブロック４１０に移動する。書き込みリクエストは、ブロック４１５にて、展開エージェントに渡され、展開エージェントは、選択されたメモリ・ブロックのブロック・オフセットを、現在のソフトウェア・イメージのオフセット・マップから読み出す。次に、アクティビティのフローは、選択されたメモリ・ブロックのブロック・オフセットの値に従ってブロック４２０にて分岐する。
【００３９】
選択されたメモリ・ブロックのブロック・オフセットがヌル値を有する場合（選択されたメモリ・ブロックが使用されていないことを意味する）、展開エージェントは、ブロック４２５にて、選択されたメモリ・ブロックを受け入れる、空きのイメージ部分のメモリ位置（選択されたメモリ位置と呼ばれる）、例えば、ブロック・マップにおいて対応するブロック・カウンタが０に等しい最初のメモリ位置を識別する。続いて、ブロック４３０にて展開エージェントは、選択されたメモリ位置のブロック・カウンタを１にセットする（それが今は現在のソフトウェア・イメージによって使用されているということを示すために）。ブロック４３５へと続いて、展開エージェントは、選択されたメモリ位置のメモリ・アドレスから、選択されたメモリ・ブロックのイメージ・アドレスを減算することによって、選択されたメモリ位置のブロック・オフセットを計算する。続いて、選択されたメモリ位置のブロック・オフセットは、現在のソフトウェア・イメージのオフセット・マップに格納される（選択されたメモリ・ブロックが選択されたメモリ位置に格納されていることを示すために）。
【００４０】
ブロック４２０に戻る。選択されたメモリ・ブロックのブロック・オフセットが有効値を有する（選択されたメモリ・ブロックが使用されていることを意味する）と、展開エージェントは、ブロック４４０にて、選択されたメモリ・ブロックを格納しているメモリ位置（この場合もやはり選択されたメモリ位置と呼ばれる）のメモリ・アドレスを、そのブロック・オフセットをそのイメージ・アドレスに加算することによって計算する。ブロック４４５へと続いて、展開エージェントはここで、選択されたメモリ位置のブロック・カウンタをブロック・マップから読み出す。アクティビティのフローはさらに、選択されたメモリ位置のブロック・カウンタの値に従ってブロック４５０にて分岐する。
【００４１】
選択されたメモリ位置のブロック・カウンタが１に等しい場合（選択されたメモリ・ブロックが現在のソフトウェア・イメージのみによって使用されていることを意味する）、選択されたメモリ位置が再配置部分に再配置されている（すなわち、選択されたメモリ位置のメモリ・アドレスが、ブート・リストにおいて示されている、現在のソフトウェア・イメージのブート・アドレスの１つに等しい場合）かどうかを検証するために、ブロック４５５にてテストが行われる。そうであれば、展開エージェントは、ブロック４６０にて、選択されたメモリ位置を、対応する再配置されたメモリ位置と等しくセットする（それに合わせてそのメモリ・アドレスを置換することによる）。
【００４２】
反対に、選択されたメモリ・ブロックのブロック・カウンタが、１よりも大きいことがブロック４５０にて分かれば（選択されたメモリ・ブロックが、現在のソフトウェア・イメージに加えて他のソフトウェア・イメージによって使用されていることを意味する）、方法４００は、ブロック４６５へと下降する。この段階で、展開エージェントは、選択されたメモリ位置のブロック・カウンタを１減らす（現在のソフトウェア・イメージによってはもう使用されていないことを示すために）。ここで、ブロック４７０を参照する。展開エージェントは、選択されたメモリ・ブロックを受け入れる、空きのイメージ部分のメモリ位置（選択されたメモリ位置になる）を識別する。続いて、ブロック４７５にて展開エージェントは、選択されたメモリ位置のブロック・カウンタを１にセットする（それが今は現在のソフトウェア・イメージによって使用されているということを示すために）。ブロック４８０へと続いて、展開エージェントは、選択されたメモリ位置のメモリ・アドレスから選択されたメモリ・ブロックのイメージ・アドレスを減算することによって、選択されたメモリ位置のブロック・オフセットを計算する。続いて、選択されたメモリ・ブロックのブロック・オフセットは、現在のソフトウェア・イメージのオフセット・マップに格納される（選択されたメモリ・ブロックが選択されたメモリ位置に格納されていることを示すために）。
【００４３】
アクティビティのフローは、ブロック４３５から、ブロック４６０から、またはブロック４８０から、ブロック４８５にて合流する。いずれの場合でも、選択されたメモリ・ブロックは、ここではもう、選択されたメモリ位置に格納されている。方法４００は、その結果、白／黒の停止の同心円４９０にて終わる。
【００４４】
図５は、本発明の実施形態によるスナップショット作成の動作に関するアクティビティのフローを表すアクティビティ図を示し、この動作が、方法５００により表現されている。
【００４５】
方法５００は、黒の開始円５０５にて始まり、続いて、ソース・ソフトウェア・イメージのスナップショット（ターゲット・ソフトウェア・イメージと呼ばれる）を作成するリクエストが展開エージェントに提出されると、すぐにブロック５１０に移動する。それに応答して、展開エージェントはブロック５１５にて、ターゲット・ソフトウェア・イメージの新たなイメージ・ヘッダを、ヘッダ部分に作成する（ソース・ソフトウェア・イメージのイメージ・ヘッダと同じサイズで）。ブロック５２０へと続いて、展開エージェントは、ソース・ソフトウェア・イメージのオフセット・マップおよびブート・リストを、ターゲット・ソフトウェア・イメージのイメージ・ヘッダへとコピーする。続いて、ターゲット・ソフトウェア・イメージの各メモリ・ブロック（そのオフセット・マップに示されている）に対し、ループが実行される。ループは、ブロック５２５にて開始し、展開エージェントは、ターゲット・ソフトウェア・イメージのオフセット・マップから、現メモリ・ブロック（第１のメモリ・ブロックから始まる）のブロック・オフセットを読み出す。続いて、現メモリ・ブロックを格納しているメモリ位置（現メモリ位置と呼ばれる）のメモリ・アドレスが、そのブロック・オフセットをそのイメージ・アドレスに加算することによって計算される。ブロック５３０へと続いて、展開エージェントは、ブロック・マップ内の現メモリ位置のブロック・カウンタを１増やす（それがターゲット・イメージにも使用されていることを示すために）。ここで、ブロック５３５にてテストが行われ、ターゲット・ソフトウェア・イメージのすべてのメモリ・ブロックが処理されたかどうかが検証される。処理されていなければ、アクティビティのフローはブロック５２５へ戻り、ターゲット・ソフトウェア・イメージの次のメモリ・ブロックに対して同じ動作を繰り返す。逆の場合、ループは終了し、方法５００は、白／黒の停止の同心円５４０にて終わる。
【００４６】
したがって、ソフトウェア・イメージのスナップショットを作成する動作は、対応するメモリ・ブロックのコピーを必要としないため、非常に高速である。
【００４７】
図６は、本発明の実施形態によるスナップショット削除の動作に関するアクティビティのフローを表すアクティビティ図を示し、この動作が、方法６００により表現されている。
【００４８】
方法６００は、黒の開始円６０５にて始まり、続いて、古くなったソフトウェア・イメージを削除するリクエストが展開エージェントに提出されると、すぐにブロック６１０に移動する。それに応答して、展開エージェントはブロック６１５にて、古くなったソフトウェア・イメージのオフセット・マップにアクセスする。続いて、古くなったソフトウェア・イメージの各メモリ・ブロック（そのオフセット・マップに示されている）に対し、ループが実行される。ループは、ブロック６２０にて開始し、展開エージェントは、古くなったソフトウェア・イメージのオフセット・マップから、現メモリ・ブロック（第１のメモリ・ブロックから始まる）のブロック・オフセットを読み出す。続いて、現メモリ・ブロックを格納しているメモリ位置（現メモリ位置と呼ばれる）のメモリ・アドレスが、そのブロック・オフセットをそのイメージ・アドレスに加算することによって計算される。ブロック６２５へと続いて、展開エージェントは、ブロック・マップ内の現メモリ位置のブロック・カウンタを１減らす（それが古くなったソフトウェア・イメージによってもう使用されていないことを示すために）。特に、現メモリ位置が、古くなったソフトウェア・イメージのみに使用されていた場合は、そのブロック・カウンタは０になり、現メモリ位置が空きであることが示される。ここで、ブロック６３０にてテストが行われ、古くなったソフトウェア・イメージのすべてのメモリ・ブロックが処理されたかどうかが検証される。処理されていなければ、アクティビティのフローはブロック６２０へ戻り、古くなったソフトウェア・イメージの次のメモリ・ブロックに対して同じ動作を繰り返す。逆の場合、ブロック６３５へと下降することで、ループは終了する。この時点で、展開エージェントは、古くなったソフトウェア・イメージのイメージ・ヘッダを削除する。方法６００は、その結果、白／黒の停止の同心円６４０にて終わる。
【００４９】
したがって、ソフトウェア・イメージを削除する動作も、そのメモリ・ブロックに対するいかなる実際のアクションも必要としないため、非常に高速である。
【００５０】
図７は、本発明の実施形態によるスナップショット切り替えの動作に関するアクティビティのフローを表すアクティビティ図を示し、この動作が、方法７００により表現されている。
【００５１】
方法７００は、黒の開始円７０５にて始まり、続いて、もう１つのソフトウェア・イメージに切り替えるリクエストが展開エージェントに提出されると、すぐにブロック７１０に移動する。それに応答して、展開エージェントは、ブロック７１５にて、再配置された位置から、現在のソフトウェア・イメージのブート位置（そのブート・リストにおいて示されている）に、メモリ・ブロックを復元する。ブロック７２０へと続いて、展開エージェントは、このもう１つのソフトウェア・イメージのブート位置（そのブート・リストにおいて示されている）に格納されているメモリ・ブロックを、再配置部分へ再配置する。ここでブロック７２５を参照する。展開エージェントは、このもう１つのソフトウェア・イメージのブート・ブロックを、そのブート位置へとコピーする。アクティビティのフローは、ブロック７３０へと続き、展開エージェントは、このもう１つのソフトウェア・イメージのイメージ・ヘッダをポイントするようヘッダ・インデックスを更新する。
【００５２】
この時点で、展開エージェントは、ブロック７３５にて、コンピュータの電源を切り、続いて電源を入れて、このもう１つのソフトウェア・イメージのブート位置にある、そのブート・ブロックから再起動する。結果として、このもう１つのソフトウェア・イメージのオペレーティング・システムの、そのブート・ブロックに対応する部分および展開エージェントが、コンピュータのワーキング・メモリにロードされる（まさに上記のように、このもう１つのソフトウェア・イメージの選択されたメモリ・ブロックにアクセスするリクエストすべてに、展開エージェントが応じるように）。方法７００は、その結果、白／黒の停止の同心円７４０にて終わる。
【００５３】
したがって、もう１つのソフトウェア・イメージに切り替える動作（例えば、コンピュータの前のスナップショットに戻すために）は、対応するブート・ブロックのコピーのみを必要とするため、非常に高速である。これは、特定の用途で非常に有用となり得る（例えば、要求に応じた使用のために複数のソフトウェア・イメージがクラウド・コンピューティング・アーキテクチャにおいて提供される場合）。
【００５４】
図８は、本発明の実施形態によるスナップショット・エクスポートの動作に関するアクティビティのフローを表すアクティビティ図を示し、この動作が、方法８００により表現されている。
【００５５】
方法８００は、黒の開始円８０５にて始まり、続いて、選択されたソフトウェア・イメージを外部デバイス（例えば、リムーバブル・ストレージ・ユニットまたは遠隔サーバ）にエクスポートするリクエストが展開エージェントに提出されると、すぐにブロック８１０へ移動する。それに応答して、展開エージェントはブロック８１５にて、選択されたソフトウェア・イメージのオフセット・マップにアクセスする。続いて、選択されたソフトウェア・イメージの各メモリ・ブロック（そのオフセット・マップに示されている）に対し、ループが実行される。ループは、ブロック８２０にて開始し、展開エージェントは、現メモリ・ブロック（第１のメモリ・ブロックから始まる）のブロック・オフセットを、選択されたソフトウェア・イメージのオフセット・マップから読み出す。
【００５６】
次に、アクティビティのフローは、現メモリ・ブロックのブロック・オフセットの値に従ってブロック８２５にて分岐する。現メモリ・ブロックのブロック・オフセットがヌル値と等しければ（現メモリ・ブロックが使用されていないことを意味する）、ブロック８３０にて展開エージェントは、現メモリ・ブロックにデフォルト値を割り当てる（例えば、そのすべてのビットを０にセットすることによる）。反対に、現メモリ・ブロックのブロック・オフセットが有効値を有する（現メモリ・ブロックが使用されていることを意味する）と、展開エージェントは、ブロック８３５にて、現メモリ・ブロックを格納しているべきイメージ部分のメモリ位置（現メモリ位置と呼ばれる）のメモリ・アドレスを、そのブロック・オフセットをそのイメージ・アドレスに加算することによって計算する。ここで、ブロック８４０にてテストが行われ、現メモリ位置が再配置部分へ再配置されている（すなわち、現メモリ位置のメモリ・アドレスが、ブート・リストにおいて示される、現在のソフトウェア・イメージのブート・アドレスの１つに等しい場合）かどうかが検証される。そうであれば、展開エージェントは、ブロック８４５にて、現メモリ位置を、対応する再配置されたメモリ位置に等しくセットする（それに合わせてそのメモリ・アドレスを置換することによる）。方法８００は、続いて、ブロック８５０へと下降する。現メモリ位置が再配置されていない場合も、ブロック８４０から直接同じポイントに達する。この時点で、展開エージェントは、現メモリ・ブロックを現メモリ位置から読み出す。いずれの場合でも、アクティビティのフローはブロック８５５にて合流する（ブロック８３０またはブロック８５０のいずれかから）。展開エージェントはここで、現メモリ・ブロックを外部デバイスにコピーする。
【００５７】
ここで、ブロック８６０にてテストが行われ、選択されたソフトウェア・イメージのすべてのメモリ・ブロックが処理されたかどうかが検証される。処理されていなければ、アクティビティのフローはブロック８２０へ戻り、選択されたソフトウェア・イメージの次のメモリ・ブロックに対して同じ動作を繰り返す。逆の場合、ループは終了し、方法８００は、白／黒の停止の同心円８６５にて終わる。
【００５８】
最後に、図９は、本発明の実施形態によるスナップショット・インポートの動作に関するアクティビティのフローを表すアクティビティ図を示し、この動作が、方法９００により表現されている。
【００５９】
方法９００は、黒の開始円９０５にて始まり、続いて、外部ソフトウェア・イメージを外部デバイス（例えば、リムーバブル・ストレージ・ユニットまたは遠隔サーバ）からインポートするリクエストが展開エージェントに提出されると、すぐにブロック９１０へ移動する。それに応答して、展開エージェントはブロック９１５にて、外部デバイス上の外部ソフトウェア・イメージにアクセスする。ブロック９２０へと続いて、展開エージェントは、ヘッダ部分に、外部ソフトウェア・イメージの新たなイメージ・ヘッダを作成する。外部ソフトウェア・イメージのイメージ・ヘッダは、インポートされるソフトウェア・イメージのサイズに対応するいくつかのブロック・オフセットを備えるオフセット・マップと、インポートされるソフトウェア・イメージのブート・アドレスにセットされるブート・リストとを含む（ソフトウェア・イメージと関連して外部デバイスにおいて特定されているとおり）。
【００６０】
続いて、外部ソフトウェア・イメージの各メモリ・ブロックに関してループが実行される。ループは、ブロック９２５にて開始し、展開エージェントは、現メモリ・ブロック（第１のメモリ・ブロックから始まる）を外部デバイスから読み出す。ブロック９３０に移動し、展開エージェントは、現メモリ・ブロックを受け入れる、空きのイメージ部分のメモリ位置（現メモリ位置と呼ばれる）を識別する。続いて、ブロック９３５にて展開エージェントは、現メモリ位置のブロック・カウンタを１にセットする（それが今は外部ソフトウェア・イメージによって使用されているということを示すために）。ブロック９４０へと続いて、展開エージェントは、現メモリ位置のメモリ・アドレスから現メモリ・ブロックのイメージ・アドレスを減算することによって、現メモリ位置のブロック・オフセットを計算する。続いて、現メモリ・ブロックのブロック・オフセットは、外部ソフトウェア・イメージのオフセット・マップに格納される。ブロック９４５にて、ここで現メモリ・ブロックは現メモリ位置に格納される。
【００６１】
ここで、ブロック９５０にてテストが行われ、外部ソフトウェア・イメージのすべてのメモリ・ブロックが処理されたかどうかが検証される。処理されていなければ、アクティビティのフローはブロック９２５へ戻り、外部ソフトウェア・イメージの次のメモリ・ブロックに対して同じ動作を繰り返す。逆の場合、ループは終了し、方法９００は、白／黒の停止の同心円９５５にて終わる。
【００６２】
さらに、上記の技術は、ソフトウェア・イメージをコンピュータ上に展開するために使用されてもよい。この点について、以下、本発明の実施形態による展開プロセスを実装するために使用されるとよい主なソフトウェア・コンポーネントの役割を表現するコラボレーション図を示す、図１０〜図１３を参照する。詳細には、図面は、システムの静的構造を表し（参照符号１０００を用いて全体として表示された対応するコンポーネントを用いて）、さらにその動的挙動を表す（連続的な順序番号により表示され、対応するアクションをそれぞれ表現する、交換される一連のメッセージを用いて）。
【００６３】
図１０から始める。コンピュータ１００は、例えばローカル・エリア・ネットワーク（ＬＡＮ：Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）などのネットワーク１００５を介してサーバ・コンピュータ（または単にサーバ）１０１０に接続されている。
【００６４】
サーバ１０１０（参照符号１０１５および１０３０によりそれぞれ表示されたワーキング・メモリおよびハード・ディスクを備える）は、展開マネージャ１０３５、例えば、ＩＢＭ社のＩＢＭ  Ｔｉｖｏｌｉ  Ｐｒｏｖｉｓｉｏｎｉｎｇ  Ｍａｎａｇｅｒ  ｆｏｒ  ＯＳ  Ｄｅｐｌｏｙｍｅｎｔ（またはＴＰＭ  ｆｏｒ  ＯＳＤ）のＩＢＭ  Ｔｉｖｏｌｉ  Ｐｒｏｖｉｓｉｏｎｉｎｇ  Ｍａｎａｇｅｒ  ｆｏｒ  Ｉｍａｇｅｓ（またはＴＰＭｆＩ）（ＩＢＭおよびＴｉｖｏｌｉは、ＩＢＭ社の商標）を実行する。展開マネージャ１０３５は、それに接続された任意の（クライアント）コンピュータへの、ソフトウェア・イメージ１０４０（対応するリポジトリに格納されている）の展開を自動化するために使用される。
【００６５】
詳細には、新たなソフトウェア・イメージ（参照符号１０４０Ｎで表示されている）がコンピュータ１００上に展開されるときは必ず、オペレータ１０４５が、例えば図示されていないもう１つのクライアント・コンピュータ上で実行されているブラウザに接続することにより、展開マネージャ１０３５を介して、これらコンピュータ１００および新たなソフトウェア・イメージ１０４０Ｃを選択する（アクション「Ａ１：選択」）。それに応答して、展開マネージャ１０３５は、コンピュータ１００の電源を入れる。結果として、コンピュータ１００が、機能しているオペレーティング・システムを何も有しないと仮定すれば、コンピュータ１００は、ネットワーク１００５を介してブートする。詳細には、コンピュータ１００のブート・ローダは、ブート可能デバイスを発見せず、その結果、例えばそのネットワーク・アダプタに組み込まれているプリブート実行環境（ＰＸＥ：Ｐｒｅｂｏｏｔ  Ｅｘｅｃｕｔｉｏｎ  Ｅｎｖｉｒｏｎｍｅｎｔ）などのネットワーク・ブート・ローダを立ち上げる。ネットワーク・ブート・ローダは、例えば、動的ホスト構成プロトコル（ＤＨＣＰ：Ｄｙｎａｍｉｃ  Ｈｏｓｔ  Ｃｏｎｆｉｇｕｒａｔｉｏｎ  Ｐｒｏｔｏｃｏｌ）に基づく動的アドレス・サービスを活用して、サーバ１０１０（ＤＨＣＰサーバとしての機能を果たす）からコンピュータ１００の動的アドレスを取得し、これによって、ネットワーク・ブートストラップ・プログラムのアドレスも提供され、このプログラムは、コンピュータ１００のＲＡＭディスク、すなわち大容量メモリとして扱われるワーキング・メモリ１１５の一部にダウンロードされ、続いて立ち上げられる。例えば、Ｗｉｎｄｏｗｓプレインストール環境（ＷｉｎＰＥ：Ｗｉｎｄｏｗｓ  Ｐｒｅｉｎｓｔａｌｌａｔｉｏｎ  Ｅｎｖｉｒｏｎｍｅｎｔ）などのネットワーク・ブートストラップ・プログラムは、最小限のオペレーティング・システム１０５５を提供し、これに展開エージェント２６０が含まれる（アクション「Ａ２：ネットワーク・ブート」）。Ｗｉｎｄｏｗｓは、Ｍｉｃｒｏｓｏｆｔ  Ｃｏｒｐｏｒａｔｉｏｎの商標である。
【００６６】
展開エージェント２６０は、ハード・ディスク１３０のイメージ部分２０５、ヘッダ部分２１０（何のイメージ・ヘッダもない）、ブロック・マップ２３０（イメージ部分２０５のメモリ位置すべてのブロック・カウンタが、それらが空きであることを示すよう０にセットされている）、ヘッダ・インデックス２３５、および再配置部分２４０を定義することによって、ハード・ディスク１３０を初期化する（アクション「Ａ３：初期化」）。続いて展開エージェント２６０は、新たなソフトウェア・イメージ１０４０Ｎのブート・ブロックをサーバ１０１０からダウンロードする。このために、展開エージェント２６０は、例えばｉＳＣＳＩプロトコルに基づきサーバ・コンピュータ１０１０の遠隔アクセス・サーバ１０６０と対話する遠隔アクセス・イニシエータとしての機能を果たす（アクション「Ａ４：ダウンロード」）。続いて展開エージェント２６０は、ヘッダ部分２１０内に、新たなソフトウェア・イメージ１０４０Ｎの新たなイメージ・ヘッダを作成する（参照符号２１５Ｎで表示されている）。イメージ・ヘッダ２１５Ｎは、新たなソフトウェア・イメージ１０４０Ｎのサイズに対応するいくつかのブロック・オフセットを備えるオフセット・マップ（そのすべてが、ヌル値にセットされ、この場合は、対応するメモリ・ブロックがハード・ディスク１３０において利用可能でないことも示す）と、ブート・リストとを含み、ブート・リストは、新たなソフトウェア・イメージ１０４０Ｎと関連して対応するリポジトリにおいて特定されている、新たなソフトウェア・イメージ１０４０Ｎのブート・アドレスにセットされる（アクション「Ａ５：構成」）。ここで展開エージェント２６０は、新たなソフトウェア・イメージ１０４０Ｎのブート・ブロックを、イメージ部分２０５内の対応するブート位置へと格納することができ、それらが濃い灰色で示され参照符号２５０Ｎで表示されている。同時に、イメージ・ヘッダ２１５Ｎのオフセット・マップ内の各ブート・ブロックのブロック・オフセットが、対応するブート・アドレスにセットされる。さらに、ブロック・マップ２３０内の各ブート位置のブロック・カウンタが１にセットされ、現在は新たなソフトウェア・イメージ１０４０Ｎによって使用されていることが示される（アクション「Ａ６：格納」）。この時点で、展開エージェント２６０は、コンピュータ１００の電源を切り、続いて電源を入れる。
【００６７】
その結果、図１１に示されているように、ここでコンピュータ１００は、ブート・ブロック２５０Ｎからブートし、その結果、そのブート・ブロック２５０Ｎに対応する新たなソフトウェア・イメージ１０４０Ｎのオペレーティング・システムの部分（参照符号２５５Ｎで表示されている）および展開エージェント２６０（イメージ・ヘッダ２１５Ｎを含む）をワーキング・メモリ１１５にロードする（アクション「Ａ７：ローカル・ブート」）。これ以降、コンピュータ１００の動作中の、新たなソフトウェア・イメージ１０４０Ｎの選択されたメモリ・ブロックにアクセスするリクエストすべてに、展開エージェント２６０のストリーミング・ドライバが応じる（これは、この場合もやはり、図示されていない、オペレーティング・システム２５５Ｎの標準のファイル・システム・ドライバに優先する）。
【００６８】
詳細には、ファイル・システム・ドライバは、選択されたメモリ・ブロックにアクセスするリクエストを、例えば図示されていないアプリケーション・プログラムから受け取る。ファイル・システム・ドライバは、リクエストを展開エージェント２６０に渡す（アクション「Ａ８：アクセス・リクエスト」）。選択されたメモリ・ブロックの読み込みがリクエストされた場合、展開エージェント２６０は、選択されたメモリ・ブロックがハード・ディスク１３０において利用可能であるかどうかを検証する（イメージ・ヘッダ２１５Ｎのオフセット・マップ内の対応するブロック・オフセットによって示される）。選択されたメモリ・ブロックが、ハード・ディスク１３０において利用可能でなければ（すなわち、ブロック・オフセットがヌル値に等しい）、展開エージェント２６０は、オペレーティング・システム２５５Ｎの、図示されていない遠隔アクセス・ドライバ（当該の例ではｉＳＣＳＩイニシエータとしての機能を果たす）に、リクエストを渡す。遠隔アクセス・ドライバは、遠隔アクセス・サーバ１０６０を介して、ソフトウェア・イメージ１０４０Ｎ（サーバ１０１０上）から選択されたメモリ・ブロックをダウンロードする。続いて遠隔アクセス・ドライバは、選択されたメモリ・ブロックを展開エージェント２６０に返す（アクション「Ａ９．１０：ダウンロード」）。展開エージェント２６０は、上述の対応する書き込み動作を実行することによって、選択されたメモリ・ブロックをハード・ディスク１３０に格納し（この場合、選択されたメモリ・ブロックは、常にイメージ部分２０５の空きメモリ位置に格納される）、灰色で示されている新たなソフトウェア・イメージ１０４０Ｎのメモリ・ブロックでイメージ部分２０５を徐々に埋める（アクション「Ａ９．１１：書き込み」）。反対に、選択されたメモリ・ブロックが、ハード・ディスク１３０において既に利用可能であれば（すなわち、そのブロック・オフセットが有効値を有する）、展開エージェント２６０は、上記のように対応する読み込み動作を実行することによって、選択されたメモリ・ブロックをハード・ディスク１３０から直接読み出す（アクション「Ａ９．２０：読み込み」）。どちらの場合も、展開エージェント２６０は、選択されたメモリ・ブロックをファイル・システム・ドライバに返し、次にファイル・システム・ドライバは、それをアプリケーション・プログラムに返す（アクション「Ａ１０：返す」）。一方、選択されたメモリ・ブロックの書き込みがリクエストされた場合、展開エージェント２６０は、上記のように対応する書き込み動作を実行することによって、選択されたメモリ・ブロックをハード・ディスク１３０に直接書き込む（アクション「Ａ１１：書き込み」）。したがって、新たなソフトウェア・イメージ１０４０Ｎは、展開プロセスがまだ進行中でも、通常通り更新可能である（それが既に完全にコンピュータ１００上に展開されたかのように）。
【００６９】
以下、図１２を参照する。完全に非同期の形で、展開エージェント２６０は、サーバ１０１０、コンピュータ１００、もしくはネットワーク１００５、またはそのいずれかの組み合わせの作業負荷を周期的に検証する（例えば、１０〜１００ｍｓ毎）。作業負荷が所定の閾値よりも低ければ（例えば、サーバ１０１０もしくはコンピュータ１００、またはその両方でアクションが実行されていないこと、およびネットワーク１００５のトラフィックが低いことなどが理由で、対応するリソースが現在十分に活用されていないことを示す）、展開エージェント２６０は、ハード・ディスク１３０においてまだ利用可能でない新たなソフトウェア・イメージ１０４０Ｎの新たなメモリ・ブロック（例えば、イメージ・ヘッダ２１５Ｎのオフセット・マップ内のブロック・オフセットがヌル値に等しい最初のもの）を、遠隔アクセス・サーバ１０６０を介してダウンロードする（アクション「Ａ１２：ダウンロード」）。続いて展開エージェント２６０は、新たなメモリ・ブロックを、上記のようにハード・ディスク１３０に書き込む（アクション「Ａ１３：書き込み」）。このようにして、新たなソフトウェア・イメージ１０４０Ｎのすべてのメモリ・ブロックが必ず、最後にはダウンロードされるようにすることができる（使用されることがなくても）。これが生じると、展開エージェント２６０のストリーミング機能を無効化することが（続いてコンピュータ１００をサーバ１０１０から切断することも）できる。
【００７０】
上記のストリーミング技術は、非常に短時間で、つまり新たなソフトウェア・イメージ１０４０Ｎのブート・ブロック２５０Ｎがハード・ディスク１３０に格納された直後に、コンピュータ１００を、展開プロセスがまだ進行中であっても使える状態にする（例えば、１０〜２００Ｍバイトのブート・ブロックという典型的なサイズでは、１〜２分後）。その結果、コンピュータ１００の動作は、ハード・ディスク１３０において新たなソフトウェア・イメージ１０４０Ｎの他のメモリ・ブロックが利用可能か否かにかかわらず、完全に通常通りであり（そのブートは、通常通りハード・ディスク１３０から直接である）、コンピュータ１００が、サーバ１０１０からまだダウンロードされなくてはならないメモリ・ブロックにアクセスするときに、コンピュータ１００のパフォーマンスがわずかに低下するのみである。さらに、コンピュータ１００を使用できる状態にするのに必要な時間は、新たなソフトウェア・イメージ１０４０Ｎのサイズとは無関係である。メモリ・ブロックがアクセスされると、ますます多くのメモリ・ブロックがコンピュータ１００上で既に利用可能となるため、ネットワーク１００５の利用も時間と共に減る（例えば、対数法則で）。なお、この点において、このストリーミング技術は、ソフトウェア・イメージを要求に応じて提供する、当技術分野で既知の技術とは無関係である。実際、既知のストリーミング技術では、ソフトウェア・イメージのメモリ・ブロックがコンピュータにダウンロードされるのは即時使用のためのみである。しかし、このメモリ・ブロックは、コンピュータ上に永続的には格納されず（すなわち、使用された後、およびいずれにしてもコンピュータの電源が切られた後には、メモリ・ブロックは消失する）、その結果、それを次に使用するためには再度ダウンロードしなければならない。結果として、コンピュータをサーバから切断することは決してできない。実際、メモリ・ブロックは、先取りされる場合でも、次の（見込まれる）使用までしかコンピュータ上に残らない。同じく、メモリ・ブロックのローカル・キャッシュが実装された場合でも、再使用のためにローカル・キャッシュに残るメモリ・ブロックはほんのわずかである（いずれの場合でも、新たなメモリ・ブロックを格納するために、ローカル・キャッシュ内の最も長い間使用されていないメモリ・ブロックは最終的には排除される）。
【００７１】
他の新たなソフトウェア・イメージ１０４０をコンピュータ１００上に展開するためにも、同じストリーミング技術が使用され得る（スナップショット切り替えの上記動作に関連する）。このために、図１３に示されているように、オペレータ１０４５は、もう１つの新たなソフトウェア・イメージ（参照符号１０４０Ｎ’で表示されている）を選択する（アクション「Ａ１４：選択」）。それに応答して、上記のように、展開エージェント２６０は、新たなソフトウェア・イメージ１０４０Ｎ’のブート・ブロックを、遠隔アクセス・サーバ１０６０を介してサーバ１０１０からダウンロードする（アクション「Ａ１５：ダウンロード」）。この時点で、展開エージェント２６０は、現在のソフトウェア・イメージのブート・リストにおいて示されている現在のソフトウェア・イメージのブート位置に、再配置されたメモリ位置からのメモリ・ブロック（あれば）を復元する（アクション「Ａ１６：復元」）。続いて展開エージェント２６０は、新たなソフトウェア・イメージ１０４０Ｎ’のブート位置に格納されたメモリ・ブロックを、再配置部分２４０に再配置し、それらは参照符号２４５Ｎ’で表示されている（アクション「Ａ１７：再配置」）。続いて展開エージェント２６０は、新たなソフトウェア・イメージ１０４０Ｎ’のサイズに対応するいくつかのブロック・オフセットを含むオフセット・マップと、新たなソフトウェア・イメージ１０４０Ｎ’のブート・アドレスにセットされるブート・リストとを備える、新たなソフトウェア・イメージ１０４０Ｎ’の新たなイメージ・ヘッダ（参照符号２１５Ｎ’で表示されている）を、ヘッダ部分２１０に作成する（アクション「Ａ１８：構成」）。ここで展開エージェント２６０は、新たなソフトウェア・イメージ１０４０Ｎ’のブート・ブロックを、そのブート位置に格納でき（それらが濃い灰色で示され、参照符号２５０Ｎ’で表示されている）、これは、それに合わせてイメージ・ヘッダ２１５Ｎ’のオフセット・マップおよびブロック・マップ２３０を更新するのと同時に行われる（アクション「Ａ１９：格納」）。この時点で、展開エージェント２６０は、コンピュータ１００をそのブート・ブロック２５０Ｎ’からブートするために、その電源を切り、続いて電源を入れて、その結果、新たなソフトウェア・イメージ１０４０Ｎ’のオペレーティング・システムの、そのブート・ブロック２５０Ｎ’および展開エージェントに対応する部分を（ワーキング・メモリ１１５に）ロードする。まさに上記のように、展開エージェントが、新たなソフトウェア・イメージ１０４０Ｎ’の任意の選択されたメモリ・ブロックにアクセスするあらゆるリクエストに応じる（アクション「Ａ２０：リブート」）。
【００７２】
上記のソリューションは、すべてのソフトウェア・イメージのブート・ブロックの認識を必要とする。このために、例えば、それに合わせてソフトウェア・イメージを準備することができる。この点について、本発明の実施形態によるソリューションで使用される一般的なソフトウェア・イメージの準備プロセスを実装するために使用され得る主なソフトウェア・コンポーネント（全体として参照符号１１００で表示されている）の役割を表現するコラボレーション図を示す、図１４を参照する。
【００７３】
このために、サーバ１０１０は、マスタ・ソフトウェア・イメージ（または単にマスタ・イメージ）１１０５のリポジトリを含む。各マスタ・イメージ１１０５は、対応するソフトウェア・イメージの基本バージョン（例えば、それが以前にインストールされていたドナー・コンピュータのハード・ディスクのコンテンツを記録することによって作成される）を提供するが、これは、ドナー・コンピュータの任意の構成に関係する固有のコンテンツ（例えばドライバおよびレジストリ設定）が除去されたものである。サーバ１０１０は、モデル１１１０のリポジトリも含み、代わって各モデル１１１０は、ソフトウェア・イメージが展開されなければならないクライアント・コンピュータの対応する構成の固有のコンテンツを含む。
【００７４】
オペレータ１０４５は、展開マネージャ１０３５を介して、特定のタイプのコンピュータ（その展開エージェント２６０を備える対応する補助コンピュータ１００’によって表現されている）のソフトウェア・イメージ（選択されたマスタ・イメージ１１０５および選択されたモデル１１１０を含む）を選択する（アクション「Ｂ１：選択」）。それに応答して、展開マネージャ１０３５は、選択されたソフトウェア・イメージの識別子を渡すことによって、補助コンピュータ１００’上の展開エージェント２６０をウェイク・アップさせる（ｗａｋｅｓ−ｕｐ）（アクション「Ｂ２：ウェイク・アップ」）。結果として、展開エージェント２６０は、選択されたソフトウェア・イメージに遠隔アクセス・サーバ１０６０を介して遠隔アクセスするために、選択されたソフトウェア・イメージを遠隔ディスクとしてマウントする（すなわち、当該の例ではｉＳＣＳＩイニシエータとして機能することによる）。結果として、補助コンピュータ１００’による排他的アクセス用の、一時ソフトウェア・イメージ（または単に一時イメージ）１１１５が作成される。一時イメージ１１１５は、単に、選択されたマスタ・イメージ１１０５および選択されたモデル１１１０のメモリ・ブロックをポイントするインデックス構造によって定義され、すなわち、そのコピーは作られない。一時イメージ１１１５は、アクセスされる一時イメージ１１１５の任意のメモリ・ブロックのイメージ・アドレスを追跡するために、ブロック追跡機能が有効にされた状態でマウントされる（アクション「Ｂ３：マウント」）。
【００７５】
この時点で、展開エージェント２６０は、一時イメージ１１１５上の補助コンピュータ１００’のブート・シーケンスをシミュレートする（展開エージェントのロードまで）。例えば、Ｍｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓでは、展開エージェント２６０は、ＭＢＲ、ブート・セクタ、ｂｏｏｔｍｇｒ．ｅｘｅファイル、ｂｏｏｔ＼ｂｃｄファイル、システム・レジストリ、ｗｉｎｌｏａｄ．ｅｘｅファイル、システム・レジストリで特定されているドライバ・ファイル、および展開エージェントを読み込む（アクション「Ｂ４：シミュレートされたブート」）。シミュレートされたブート・シーケンスが完了すると、展開エージェント２６０は、一時イメージ１１１５をアンマウントする（アクション「Ｂ５：アンマウント」）。続いて展開エージェント２６０は、一時イメージ１１１５を、展開マネージャ１０３５にコミットする（アクション「Ｂ６：コミット」）。それに応答して、展開マネージャ１０３５は、新たなソフトウェア・イメージ（または単に新たなイメージ）１１２０を、一時イメージ１１１５（単にそのインデックス構造により定義されている）から構築する。さらに、新たなイメージ１１２０は、シミュレートされたブート手順の間にアクセスされたメモリ・ブロックのリストに関連付けられ、このメモリ・ブロックが、対応するブート・ブロックを定義する（アクション「Ｂ７：構築」）。
【００７６】
当然、ローカルの、特有の要件を満たすために、当業者は、上述のソリューションに対して多数の論理的もしくは物理的またはその両方の変更および改変を適用してよい。さらに具体的には、このソリューションは、その１つ以上の実施形態を参照して、ある程度の詳細事項と共に記載されたが、当然のことながら、形態および細部における様々な省略、置換、および変更、ならびに他の実施形態も可能である（例えば、数値および構成に関して）。詳細には、本発明の種々の実施形態は、本発明をより深く理解できるよう上記の説明において記載された特定の細部を伴わずに実践されることさえも可能である。反対に、周知の特徴は、不必要な詳細で説明を曖昧にしないために、省略または簡略化されていることもある。さらに、一般的な設計上の問題として、開示されたソリューションの任意の実施形態に関連して記載された特定の構成要素もしくは方法ステップまたはその両方が、他の任意の実施形態に組み入れられてもよいということが明白に意図されている。
【００７７】
例えば、同じソリューションが、等価な方法で実装される場合（より多くのステップの同じ機能を伴う同様のステップ、またはその一部を使用すること、必須ではないいくつかのステップを除去すること、または別の任意選択のステップを追加することによって）、同様の留意事項が当てはまる。さらに、このステップは、異なる順序で、または同時に、または交互配置された形で実行されてもよい（少なくとも部分的に）。
【００７８】
提案された技術は、特に物理コンピュータ上での使用を対象に設計されているが、仮想マシン上での適用も除外されない。さらに、ソフトウェア・イメージは、任意のソフトウェア・プログラムを含み得る（例えば、いかなるアプリケーション・プログラムもしくはデータまたはその両方も伴わないオペレーティング・システムのみ）。同じく、メモリ・ブロックは、任意の種類の情報を含み得る（例えば、オペレーティング・システムまたはアプリケーション・プログラムのいずれかに関する、１つ以上のセクタ、ファイル、ライブラリ、ディレクトリ、その組み合わせまたは一部）。
【００７９】
前述の説明では、１つ以上のソフトウェア・イメージが完全にインストールされる（その結果ネットワーク接続が必要なくなる）コンピュータに言及したが、同じ技術が、コンピュータのハード・ディスクに部分的にのみ格納されるソフトウェア・イメージにも適用されてもよい（コンピュータがそのソフトウェア・イメージに戻されるときに再開するソフトウェア・イメージの展開を伴う）。
【００８０】
同じ技術がさらに、ブート・シーケンスにかかわらず、その他任意のオペレーティング・システムに適用され得る。例えば、Ｌｉｎｕｘ（Ｌｉｎｕｓ  Ｔｏｒｖａｌｄｓの商標）では、ブート・ブロックは、（展開エージェントに加えて）ＧＲＢＵブート・ローダを含むＭＢＲ、ならびにカーネルおよびｉｎｉｔｒｄファイル・システムを含む／ｂｏｏｔディレクトリを含む。この場合、ブート・シーケンスの間に、ＢＩＯＳは、ＧＲＢＵを含むＭＢＲをロードし、ＧＲＢＵが、／ｂｏｏｔディレクトリを発見してカーネルおよびｉｎｉｔｒｄファイル・システムをロードし、ＧＲＢＵがカーネル上でブートし、カーネルがｉｎｉｔｒｄファイル・システムを起動し、ｉｎｉｔｒｄファイル・システムが展開エージェントを起動する。
【００８１】
いずれの場合でも、上記のアクセス機能は、どのような等価な構造によっても実装され得る（展開エージェントがなくても）。
【００８２】
コンピュータのハード・ディスクは、違った形で編成されてもよい。例えば、代わりの実装では、メモリ・ブロックは、イメージ部分の空きメモリ位置に再配置される（専用の再配置部分を何ら必要としない）。さらに、その他任意の制御構造が、ソフトウェア・イメージの各メモリ・ブロックと、それが格納される対応するメモリ位置とを関連付けるために使用されてもよい。例えば、各ソフトウェア・イメージに関して、オフセット・マップは、各メモリ・ブロックを格納するメモリ位置のメモリ・アドレス（またはその任意の他のインジケーション）を直接含んでもよく、ブート・ブロックも、オフセット・マップにおいて識別されてもよい（例えば、対応するフラグを用いて）などである。あるいは、メモリ・ブロックが再配置されると、このメモリ・ブロックと、それを使用する各ソフトウェア・イメージのオフセット・マップ内の対応する再配置されたメモリ位置のメモリ・アドレスとを関連付けることができる。こうすることで、オフセット・マップは常に、各メモリ・ブロックが格納されている実際のメモリ位置（イメージ部分または再配置部分内）のメモリ・アドレスを直接提供する。
【００８３】
他の任意のデフォルト値が、使用されていないメモリ・ブロックに関連付けられてもよい。なお、すべてのソフトウェア・イメージの、使用されていないメモリ・ブロックと、共通の所定のメモリ位置とを関連付ける可能性は除外されない（その場合、すべてのメモリ・ブロックが、厳密に同じ形で読み込まれる）。
【００８４】
この場合、書き込み動作も簡略化することができる（すなわち、書き込まれるメモリ・ブロックを格納するメモリ位置が現在のソフトウェア・イメージによってのみ使用されている状況、または他のソフトウェア・イメージと共有されている状況を、区別することのみによる）。
【００８５】
ブロック・マップは、任意の等価な構造に置き換えることもできる（それに合わせて書き込み動作が更新される）。例えば、各メモリ位置の利用可能性を示すフラグを格納するビット・マップを提供し、その結果、使用されているメモリ位置のみのブロック・カウンタ（常に０より大きい）を提供しても、何も支障はない。さらに、または代わりに、各メモリ位置に格納されたメモリ・ブロックを使用して、ソフトウェア・イメージのインジケーションを格納することも可能である。
【００８６】
同様の留意事項が、上述の他の動作に当てはまる（すなわち、スナップショット作成動作、スナップショット削除動作、スナップショット切り替え動作、スナップショット・エクスポート動作、およびスナップショット・インポート動作）。当然、こうした動作は、制限的な形で解釈されてはならず、上述の同じソリューションが、それらの一部のみ、もしくは追加の動作またはその両方もサポートし得る（例えば、オペレーティング・システムのスナップショットの管理のみ）。
【００８７】
コンピュータがもう１つのソフトウェア・イメージに切り替えられるときに再配置されたメモリ・ブロックを復元するステップは、必ずしも必要ではない。例えば、すべてのソフトウェア・イメージのブート・ブロックを、対応するブート位置に常に格納された状態に保ち、その結果、対応するメモリ・ブロックを常に再配置された状態に保つことも可能である（それによって、切り替え動作が高速化するが、ハード・ディスクの空き容量の浪費という代償がある）。
【００８８】
ソフトウェア・イメージは、任意の外部ソース（例えば、リムーバブル格納デバイス）からの上記のストリーミング技術を用いて展開され得る。あるいは、ソフトウェア・イメージが完全に展開された後でも、ストリーミング・プロセスを常にアクティブに保つことも可能である（例えば、対応するブロック・オフセットのヌル値へのリセットに応答してメモリ・ブロックの最新バージョンをダウンロードするために）。作業負荷が、任意の他の頻度で、もしくは特定の期間のみに（例えば夜間）、コンピュータ、サーバ、ネットワーク、もしくはその任意の組み合わせのみに関して監視される場合、または作業負荷が閾値を下回るときに２つ以上のメモリ・ブロックが同時にダウンロードされる場合（ストリーミング・プロセスが常にアクティブのままであればこの機能は省略されてよい）、同様の留意事項が当てはまる。いずれの場合でも、提案された技術は、ソフトウェア・イメージがどのようにしてクライアント・コンピュータ上に展開されているかとは完全に無関係である（例えば、いかなるサーバ・コンピュータも用いず手動であっても）。ソフトウェア・イメージはさらに、別の形で準備されてもよい（例えば、そのブート・ブロックを識別するために、補助コンピュータを実際にブートして、ブーティング・シーケンスの間にアクセスされるメモリ・ブロックを追跡することによって）。
【００８９】
プログラム（本発明の各実施形態を実装するために使用され得る）が、別の形で構築されている場合、または追加のモジュールもしくは機能が提供される場合、同様の留意事項が当てはまる。同じく、メモリ構造は、他のタイプであっても、または等価なエンティティに置き換えられてもよい（必ずしも物理的な格納媒体から成らない）。このプログラムは、任意のデータ処理システムによって、またはそれに関連して（例えば、仮想マシン内）使用されるのに適した任意の形態をとるとよい。詳しくは、プログラムは、外部または常駐ソフトウェア、ファームウェア、またはマイクロコード（例えばコンパイルまたは解釈される、オブジェクト・コードまたはソース・コードのいずれか）の形態をとり得る。さらに、プログラムを、任意のコンピュータ使用可能媒体上に実装される製品として提供することができる。媒体は、プログラムを含むこと、格納すること、伝達すること、伝播させること、または転送することに適した任意の構成要素とすることができる。例えば、媒体は、電子、磁気、光学、電磁気、赤外線、または半導体タイプのものでもよい。そのような媒体の例は、固定ディスク（プログラムがあらかじめロードされることができる）、リムーバブル・ディスク、テープ、カード、ワイヤ、ファイバ、ワイヤレス接続、ネットワーク、放送波などである。いずれの場合でも、本発明の実施形態によるソリューションは、ハードウェア構造（例えば、半導体材料のチップに統合されて）、または適切にプログラムされた、もしくは別の方法で構成されたソフトウェアおよびハードウェアの組み合わせを用いて実装されるのにも適する。
【００９０】
あるいは、システムは、別の構造を有するか、または等価なコンポーネントを含むか、または他の動作特性を有する。いずれの場合でも、そのあらゆるコンポーネントが、より多くの構成要素に分けられてもよく、または２つ以上のコンポーネントが、単一の構成要素へと結合されてもよい。さらに、各コンポーネントが、対応する動作の並列実行をサポートするよう複製されてもよい。さらに、概して、異なるコンポーネント間の任意の対話は連続的である必要はなく（別に指定のない限り）、直接であっても、または１つ以上の中間物を介し間接的であってもよいことを指摘しておく。詳細には、システムは、異なるアーキテクチャに基づいてもよく（例えば、広域、グローバル、セルラ方式、または衛星ネットワーク）、任意のタイプの（有線もしくは無線、またはその両方）接続を活用する。いずれの場合でも、各コンピュータは、別の構造を有してもよく、同様の構成要素を含んでもよい（プログラムまたはその一部を一時的に格納するキャッシュ・メモリなど）。さらに、コンピュータを、任意のデータ処理エンティティ（例えばＰＤＡ、移動電話など）、または複数のエンティティの組み合わせに置き換えることが可能である。
【符号の説明】
【００９１】
１００  コンピュータ
１１５  ワーキング・メモリ
１３０  ハード・ディスク
２０５  イメージ部分
２１０  ヘッダ部分
２１５ｉ  イメージ・ヘッダ
２２０ｉ  オフセット・マップ
２２５ｉ  ブート・リスト
２３０  ブロック・マップ
２３５  ヘッダ・インデックス
２４０  再配置部分
２４５Ｃ  再配置されたメモリ位置
２５０Ｃ  ブート・ブロック
２５５Ｃ  オペレーティング・システム
２６０  展開エージェント
【図１】
0005767565.tif 000002
【図２】
0005767565.tif 000003
【図３】
0005767565.tif 000004
【図４】
0005767565.tif 000005
【図５】
0005767565.tif 000006
【図６】
0005767565.tif 000007
【図７】
0005767565.tif 000008
【図８】
0005767565.tif 000009
【図９】
0005767565.tif 000010
【図１０】
0005767565.tif 000011
【図１１】
0005767565.tif 000012
【図１２】
0005767565.tif 000013
【図１３】
0005767565.tif 000014
【図１４】
0005767565.tif 000015