(57)【要約】 【課題】オペレーティング・システム上で実行されているアプリケーションによるコンピュータ・システムのハードウエア資源の使用を制御する方法を提供すること。【解決手段】本発明の方法は、（Ａ）前記アプリケーションに属するプロセスからＡＰＩサービスへのコールをインターセプトするステップと、（Ｂ）前記ステップ（Ａ）に基づいて、実行中のプロセスに属するソフトウエア・エンティティ上で動作するステップと、を有する。前記（Ａ）ステップは、（Ａ１）前記ＡＰＩサービスをピース・オブ・コードに含まれる対応するサービスに再方向付けするステップを有する。【選択図】  図２
2015517159.tif 000002
【特許請求の範囲】
【請求項１】
アプリケーションに属するプロセスに挿入される実行可能なピース・オブ・コードを用いて、アプリケーションによるコンピュータ・システムのハードウエア資源の使用を制御する方法において、
前記コンピュータ・システムは、オペレーティング・システム上で実行されるアプリケーション・プログラミング・インターフェース（ＡＰＩ）を含み、
（Ａ）前記アプリケーションに属するプロセスからＡＰＩサービスへのコールをインターセプトするステップと、
前記（Ａ）ステップは、（Ａ１）前記ＡＰＩサービスをピース・オブ・コードに含まれる対応するサービスに再方向付けするステップを有し、
（Ｂ）前記ステップ（Ａ）に基づいて、実行中のプロセスに属するソフトウエア・エンティティ上で動作するステップと、
を有し、
前記ＡＰＩサービスは、前記プロセスに属するソフトウエア・エンティティに関連するサービスであり、前記サービスは、新たなスレッド・オブ・エクセキューションの創設を行い、前記ソフトウエア・エンティティは、スレッド・オブ・エクセキューションであり、
前記コールはインターセプトされ、
前記ステップ（Ｂ）は、
（Ｂ１）前記実行中のアプリケーションのイールドを決定するステップと、
（Ｂ２）前記イールドが閾値を超えるか否かを決定するステップと、
（Ｂ３）前記イールドが閾値を超えた場合には、前記スレッド・オブ・エクセキューションを、所定の時間中断するステップと、
を有し、
前記ステップ（Ｂ３）は、前記スレッド・オブ・エクセキューションの登録を保持する為に創設された第２変数に記憶されている識別子に基づいて、行われる
ことを特徴とするコンピュータ・システムのハードウエア資源の使用を制御する方法。
【請求項２】
前記ＡＰＩサービスは、ファンクションであり、
前記ステップ（Ａ１）は、
（Ａ１１）メモリ内に、再方向付けられるべきＡＰＩファンクションを含むダイナミック・リンク・ライブラリを記憶するステップと、
（Ａ１２）前記記憶されたダイナミック・リンク・ライブラリに含まれるＡＰＩファンクション用のファンクション・ポインタ・テーブル内で、再方向づけられるべきＡＰＩファンクションが記憶されている初期メモリアドレスを、前記ピース・オブ・コードに含まれる対応するファンクションとが記憶されている初期メモリアドレスで、置換するステップと
を有することを特徴とする請求項１記載の方法。
【請求項３】
前記ステップ（Ａ１）は、
（Ａ１３）第１変数内に、再方向付けられるべきＡＰＩファンクションが記憶されている初期メモリ・アドレスを記憶するステップ、
を有する
ことを特徴とする請求項２記載の方法。
【請求項４】
前記ＡＰＩサービスは、オブジェクト・メソッドであり、
前記ステップ（Ａ１）は、
（Ａ１４）メモリ内に、再方向付けるべきオブジェクト・メソッドを含むダイナミック・リンク・ライブラリを記憶するステップと、
（Ａ１５）前記再方向付けるべきメソッドに関連するオブジェクトが初めて生成されたか否かを確認するステップと、
前記ステップ（Ａ１５）で生成されたと確認された場合には、
（Ａ１６）前記記憶されたダイナミック・リンク・ライブラリに含まれるオブジェクト・メソッド用のメソッド・ポインタ・テーブル内で、再方向づけられるべきオブジェクト・メソッドが記憶されている初期メモリアドレスを、前記ピース・オブ・コードに含まれる対応するメソッドが記憶されている初期メモリアドレスで、置換するステップと
を有することを特徴とする請求項１記載の方法。
【請求項５】
前記ステップ（Ａ１）は、
（Ａ１７）第１変数内に、再方向付けられるべきオブジェクト・メソッドが記憶されている初期メモリ・アドレスを記憶するステップ、
を有する
ことを特徴とする請求項１記載の方法。
【請求項６】
前記ステップ（Ａ）は、
（Ａ２）前記プロセスから前記ピース・オブ・コードに含まれる対応するサービスへのコールを受領するステップと、
（Ａ３）前記ピース・オブ・コードに含まれる対応するサービスに基づいて、新たなスレッド・オブ・エクセキューションを生成するステップと、
（Ａ４）前記生成されたスレッド・オブ・エクセキューションを、前記スレッド・オブ・エクセキューションの登録を保持するために創設された第２変数に、記憶するステップと、
を有する
ことを特徴とする請求項１記載の方法。
【請求項７】
前記ステップ（Ａ）は、
（Ａ５）新たなスレッド・オブ・エクセキューションを生成するために、前記プロセスから前記ピース・オブ・コードに含まれる対応するサービスへのコールを受領するステップと、
（Ａ６）前記第１変数に記憶された初期メモリ・アドレスをベースに、前記ＡＰＩファンクションへのコールを行うステップと、
（Ａ７）前記ＡＰＩサービスにより生成された新たなスレッド・オブ・エクセキューションの識別子を受領するステップと、
（Ａ８）前記生成されたスレッド・オブ・エクセキューションを、前記スレッド・オブ・エクセキューションの登録を保持するために創設された第２変数に、記憶するステップと、
を有することを特徴とする請求項１記載の方法。
【請求項８】
前記ステップ（Ｂ１）は、
（Ｂ１１）制御ポイントとして、実行中にプロセスが繰り返しコールを要求するＡＰＩサービスを確立するステップと、
（Ｂ１２）前記プロセスによるこのサービスへの第１コールと第２コールとの間の経過時間を決定するステップと、
（Ｂ１３）決定された経過時間に基づいて、実行中のアプリケーションのイールドを獲得するステップと、
を有することを特徴とする請求項１記載の方法。
【請求項９】
前記ＡＰＩサービスは、前記プロセスに対応するソフトウエア・エンティティに関連するサービスであり、前記サービスはメモリ領域を確保するためのものであり、前記ソフトウエア・エンティティはメモリであり、
前記ステップ（Ａ）は、
（Ａ９）メモリ領域を確保するために、前記プロセスから前記ピース・オブ・コードに含まれる対応するサービスへのコールを受領するステップ
を含むことを特徴とする請求項１記載の方法。
【請求項１０】
前記ステップ（Ｂ）は、
（Ｂ１）共有したメモリ領域を予約するステップ
を含むことを特徴とする請求項１記載の方法。
【請求項１１】
前記ＡＰＩサービスは、前記プロセスに対応するソフトウエア・エンティティに関連するサービスであり、前記サービスはミューテックス・ロックに関与するものであり、前記ソフトウエア・エンティティはミューテックス・ロックであり、
前記（Ａ）ステップは、
（Ａ１０）ミューテックス・ロックに関与するために、前記プロセスから前記ピース・オブ・コードに含まれる対応するサービスへのコールを受領するステップ
を含むことを特徴とする請求項１記載の方法。
【請求項１２】
前記ステップ（Ｂ）は、
（Ｂ４）前記ミューテックス・ロックに割り当てられた名前を変更するステップ
を含むことを特徴とする請求項１記載の方法。
【請求項１３】
前記プロセスは、スリープ状態で初期化されたアプリケーションに属し、
（Ｃ）前記スリープ状態にあるプロセスの実行を再開するステップ
を更に有する
ことを特徴とする請求項１記載の方法。
【請求項１４】
アプリケーションを、コンピュータ・システムのアプリケーション・プログラミング・インターフェース（ＡＰＩ）を含むオペレーティング・システム上で実行する方法において、
（Ｘ）アプリケーションに関連するプロセスの実行をスリープ状態に初期化するステップと、
（Ｙ）コンピュータ・システムのハードウエア資源の使用を制御する方法を実行するインストラクションを含む実行可能なピース・オブ・コードを、前記スリープ状態にあるプロセス内に挿入するステップと、
（Ｚ）前記プロセスに挿入される実行可能なピース・オブ・コードを用いて、アプリケーションによるコンピュータ・システムのハードウエア資源の使用を制御するステップと、
を有し、
前記ステップ（Ｚ）は、
（Ａ）前記アプリケーションに属するプロセスからＡＰＩサービスへのコールをインターセプトするステップと、
前記（Ａ）ステップは、（Ａ１）前記ＡＰＩサービスをピース・オブ・コードに含まれる対応するサービスに再方向付けするステップを有し、
（Ｂ）前記ステップ（Ａ）に基づいて、実行中のプロセスに属するソフトウエア・エンティティ上で動作するステップと、
を有し、
前記ＡＰＩサービスは、前記プロセスに属するソフトウエア・エンティティに関連するサービスであり、前記サービスは、新たなスレッド・オブ・エクセキューションの創設を行い、前記ソフトウエア・エンティティは、スレッド・オブ・エクセキューションであり、
前記コールはインターセプトされ、
前記ステップ（Ｂ）は、
（Ｂ１）前記実行中のアプリケーションのイールドを決定するステップと、
（Ｂ２）前記イールドが閾値を超えるか否かを決定するステップと、
（Ｂ３）前記イールドが閾値を超えた場合には、前記スレッド・オブ・エクセキューションを、所定の時間中断するステップと、
を有し、
前記ステップ（Ｂ３）は、前記スレッド・オブ・エクセキューションの登録を保持する為に創設された第２変数に記憶されている識別子に基づいて、行われる
ことを特徴とするアプリケーションを、コンピュータ・システムのアプリケーション・プログラミング・インターフェース（ＡＰＩ）を含むオペレーティング・システム上で実行する方法。
【請求項１５】
アプリケーションに属するプロセスに挿入される実行可能なピース・オブ・コードを用いて、アプリケーションによるコンピュータ・システムのハードウエア資源の使用を制御するシステムにおいて、
前記コンピュータ・システムは、オペレーティング・システム上で実行されるアプリケーション・プログラミング・インターフェース（ＡＰＩ）を含み、
（Ａ）前記アプリケーションに属するプロセスからＡＰＩサービスへのコールをインターセプトするステップと、
前記（Ａ）ステップは、（Ａ１）前記ＡＰＩサービスをピース・オブ・コードに含まれる対応するサービスに再方向付けするステップを有し、
（Ｂ）前記ステップ（Ａ）に基づいて、実行中のプロセスに属するソフトウエア・エンティティ上で動作するステップと、
を実行するコンピュータ手段を有し、
前記ＡＰＩサービスは、前記プロセスに属するソフトウエア・エンティティに関連するサービスであり、前記サービスは、新たなスレッド・オブ・エクセキューションの創設を行い、前記ソフトウエア・エンティティは、スレッド・オブ・エクセキューションであり、
前記コールはインターセプトされ、
前記ステップ（Ｂ）は、
（Ｂ１）前記実行中のアプリケーションのイールドを決定するステップと、
（Ｂ２）前記イールドが閾値を超えるか否かを決定するステップと、
（Ｂ３）前記イールドが閾値を超えた場合には、前記スレッド・オブ・エクセキューションを、所定の時間中断するステップと、
を有し、
前記ステップ（Ｂ３）は、前記スレッド・オブ・エクセキューションの登録を保持する為に創設された第２変数に記憶されている識別子に基づいて、行われる
ことを特徴とするアプリケーションによるコンピュータ・システムのハードウエア資源の使用を制御するシステム。
【請求項１６】
メモリとプロセッサとを有し、前記メモリに記憶された前記プロセッサで実行可能なインストラクションを有し、アプリケーションが実行されるコンピュータ・システムにおいて、
前記インストラクションは、
（Ｘ）アプリケーションに関連するプロセスの実行をスリープ状態に初期化するステップと、
（Ｙ）コンピュータ・システムのハードウエア資源の使用を制御する方法を実行するインストラクションを含む実行可能なピース・オブ・コードを、前記スリープ状態にあるプロセス内に挿入するステップと、
（Ｚ）前記プロセスに挿入される実行可能なピース・オブ・コードを用いて、アプリケーションによるコンピュータ・システムのハードウエア資源の使用を制御するステップと、
を実行する機能を有し、
前記ステップ（Ｚ）は、
（Ａ）前記アプリケーションに属するプロセスからＡＰＩサービスへのコールをインターセプトするステップと、
前記（Ａ）ステップは、（Ａ１）前記ＡＰＩサービスをピース・オブ・コードに含まれる対応するサービスに再方向付けするステップを有し、
（Ｂ）前記ステップ（Ａ）に基づいて、実行中のプロセスに属するソフトウエア・エンティティ上で動作するステップと、
を有し、
前記ＡＰＩサービスは、前記プロセスに属するソフトウエア・エンティティに関連するサービスであり、前記サービスは、新たなスレッド・オブ・エクセキューションの創設を行い、前記ソフトウエア・エンティティは、スレッド・オブ・エクセキューションであり、
前記コールはインターセプトされ、
前記ステップ（Ｂ）は、
（Ｂ１）前記実行中のアプリケーションのイールドを決定するステップと、
（Ｂ２）前記イールドが閾値を超えるか否かを決定するステップと、
（Ｂ３）前記イールドが閾値を超えた場合には、前記スレッド・オブ・エクセキューションを、所定の時間中断するステップと、
を有し、
前記ステップ（Ｂ３）は、前記スレッド・オブ・エクセキューションの登録を保持する為に創設された第２変数に記憶されている識別子に基づいて、行われる
ことを特徴とするアプリケーションが実行されるコンピュータ・システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、オペレーティング・システム（ＯＳ）上で実行されているアプリケーションによるコンピュータ・システムのハードウエア資源の使用を制御する方法に関する。この制御方法は、アプリケーションに属するプロセスに挿入される実行可能なピース・オブ・コードを用いて行われる。ＯＳは、ＯＳ上で実行されるアプリケーション・プログラミング・インターフェース（ＡＰＩ）を含む。更に本発明はこの方法を実行するに適したシステムと実行可能なピース・オブ・コードに関する。
【背景技術】
【０００２】
何年も前から、ソフトウエアとハードウエアの両方のレベルで、コンピュータの発展は留まるところを知らない。ハードウエア・レベルに於いては、例えばプロセッサはますます高速になり新たな開発機能を組み込み、揮発性と非揮発性の両方のメモリもますます大容量を有するようになってきている。同様にソフトウエア・レベルに於いても、アプリケーション（例、ＯＳ、オフィスのアプリケーション、ＣＡＤ、ゲーム）は、ますますパワフルになりより多くの機能を実現できるようになっている。これ等のことは数年前までは信じられないことであった。
【０００３】
このような状況の問題点は、ユーザのコンピュータ・システムのハードウエア資源の特性とソフトウエアからのハードウエアに対する要求との間でバランスが失われることにより、明らかになる。今日まで、プログラマーは、ソフトウエアがますます多くのハードウエア資源を必要とするようになっていることを知っているために、ソフトウエアが非常に速く発展するか否か、又は様々なソフトウエアからの増加する要求を満たすためにハードウエアの発展が必須のものとなるか否かについては、余り明白ではない。使用されるているソフトウエアが、ユーザのコンピュータ・システムのリソースの特性以上のハードウエアに対する要求を有している場合には、そのオペレーションでの問題点は明らかである。更にあるソフトウエアのハードウエアに対する要求は、このソフトウエアがコンピュータ・システム内で単独で実行されることを前提に決められている。しかし単独で実行されることは余り一般的ではない。その理由は、バックグランドでは、実行中のソフトウエア（例、アンティウイルス、ファイアウォール  バックアップソフト等のソフトウエア）が存在する可能性があり、これはシステムのハードウエア資源を浪費することになる。
【０００４】
明らかに、ソフトウエア・プログラマーは、大部分のユーザのコンピュータ・システムは最新のハードウエア資源を有していないことを考慮に入れておらず、ユーザに対し新たなソフトウエアの購入を強いる或いは既存のソフトウエアの更新を強いて、自分の作成したソフトウエアを実行させ、適切なパフォーマンスを得ている。これ等のことは、ユーザにとってソフトウエアの購入のみならずそのシステムのハードウエア資源の更新の為に、高い経済的コストを発生することになる。
【０００５】
この種の問題は、サーバタイプのコンピュータ・システム（アプリケーション・サーバ、データ・サーバ等）でも存在する。サーバのソフトウエアによるハードウエアに対する要求（例、更新）の増加により、このサーバは、そのハードウエア資源の更新がなされていない場合には、サービスをその時点まで管理されていた全てのユーザに提供することができなくなる。同様にサーバがアプリケーション・サーバである場合は、同一数のユーザにサービスを提供する為には、管理するアプリケーションの数を減らさなければならない。サーバタイプのシステムの場合には、ハードウエア資源の更新のコストは、上記の単独の場合の更新よりもさらに高くなる。その理由は、サーバタイプのコンピュータ・システムのハードウエア資源は高価だからである。
【０００６】
他方で、あるハードウエア資源がコンピュータ・システムに具備された場合にも同じような状況が発生する。ハードウエア資源上で、理論的に実行可能な限りより多くの数のアプリケーション又は同一アプリケーション上で理論的に実行可能な限りより多くの数のインスタンスを実行しようとする試みがある。このような状況においては、ハードウエア資源は改善対象である。そのため、ハードウエア資源の消費を減らす為に、あるアプリケーションの実行中に又は同一アプリケーションとあるアプリケーション上の様々なインタンスの実行中に働く（機能する）ツールが必要がある。
【０００７】
上記の状況におけるＯＳは、アプリケーション或いはこのアプリケーション上でインタンスを走らせるハードウエア資源の使用を効率的に制御することが出来ず、その為、これを実行するようなある種のツールが必要である。
【発明の概要】
【発明が解決しようとする課題】
【０００８】
本発明の目的は、アプリケーションに属するプロセスに挿入される実行可能なピース・オブ・コードを用いて、実行中のアプリケーションによるハードウエア資源の使用を制御する方法を提供することである。これによりアプリケーションが実行されているコンピュータ・システムの効率を上げることである。
【課題を解決するための手段】
【０００９】
上記の目的は、アプリケーションに属するプロセスに挿入される実行可能なピース・オブ・コードを用いて、アプリケーションによるコンピュータ・システムのハードウエア資源の使用を制御する方法で解決できる。前記コンピュータ・システムは、オペレーティング・システム上で実行されるアプリケーション・プログラミング・インターフェース（ＡＰＩ）を含み、本発明の方法は、
（Ａ）前記アプリケーションに属するプロセスからＡＰＩサービスへのコールをインターセプトするステップと、
前記（Ａ）ステップは、（Ａ１）前記ＡＰＩサービスをピース・オブ・コードに含まれる対応するサービスに再方向付けするステップを有し、
（Ｂ）前記ステップ（Ａ）に基づいて、実行中のプロセスに属するソフトウエア・エンティティ上で動作するステップと、
を有する。
【００１０】
そのためプロセスに挿入された実行可能なピース・オブ・コード（excutable piece of code which is injected into the process）を用いて、実行中のアプリケーションとＯＳとの間の通信（制御信号通信とデータ通信の両方）がインターセプトされ、その結果、ピース・オブ・コードは、そのＯＳ上で動き、そしてプロセスに属するソフトウエア・エンティティを管理／制御し、ハードウエア資源の使用を減らす。
【００１１】
基本的に、アプリケーションに属するプロセスに挿入された実行可能なピース・オブ・コードは、コンピュータ・システムのハードウエア資源の使用を、そこで実行されているアプリケーションにより制御する点から、インテリジェンスを提供する。ピース・オブ・コードにより実行される制御によりハードウエア資源の使用量を減らし、最低のサービス品質を常い維持できる。
【００１２】
上記の結果、アプリケーションによるハードウエア資源の使用（量、回数）の減少は、このハードウエア資源が他のアプリケーション（同一のアプリケーションとあるアプリケーションの複数のインタンス）により使用可能な状況を生み出し、そのためより多くのアプリケーションがコンピュータ・システムにより同時に実行可能となり、効率が向上する。
【００１３】
同様に、アプリケーションによるハードウエア資源の使用の減少は、コンピュータ・システムにより提供されるよりも大きなハードウエアに対する要求を持ったアプリケーションが実行可能となる。
【００１４】
用語「サービス」「アプリケーション・プログラミング・インターフェース（ＡＰＩ）」、「ソフトウエア・エンティティ」は、それぞれ、少なくとも１つのサービス、少なくとも１つのサービス、少なくとも１つのアプリケーション・プログラミング・インターフェース、少なくとも１つのソフトウエア・エンティティに関連する。例えば、同じアプリケーションとあるＡＰＩの２つのサービスを、ピース・オブ・コードに含まれる２つのサービスに再方向付けすることも可能であり、あるいは第１のＡＰＩサービスをピース・オブ・コードに含まれる第１サービスに、第２のＡＰＩサービスをピース・オブ・コードに含まれる第２サービスに再方向付けすることもできる。同様に再方向付けされたサービスによっては、ピース・オブ・コードは、１つ或いは複数のソフトウエア・エンティティで例えばスレッド・オブ・エクセキューション（thread of execution）、メモリ（memory）、ミューテックス・ロック（mutex locks）上で動作することも可能である。
【００１５】
実行可能なピース・オブ・コードをプロセスに挿入する１つの方法は、“Windous NT System-Call Hookinng”, Mark Russinovich and Bryce Cogswell, Dr.Dobb's Journal,January 1997に記載されている。
【００１６】
ピース・オブ・コードを、スリープ状態に初期化されたプロセス内に挿入することができる。これにより、ピース・オブ・コードの正確な動作が確保できる。この場合、本発明の方法は、スリープ状態にあるプロセスの実行を再開するステップを含む。
【００１７】
用語「インターセプト」は、プロセスからＡＰＩサービスへのコールが、ピース・オブ・コードに含まれるサービスに再方向付けすることに関連することを意味する。その結果、ピース・オブ・コードそのものが、プロセスに属するソフトウエア・エンティティ上で制御可能あるいは実行可能であり、かしてアプリケーションによるリソースの使用を制御できる。
【００１８】
更に本発明の方法は、ＡＰＩサービスをピース・オブ・コードに含まれる対応するサービスに方向付けするステップを含む、その結果プロセスは、トランスペアレントな方法で、ＡＰＩサービスにコールを行った時に、ピース・オブ・コードに含まれる対応するサービスにコールを行う。
【００１９】
本発明の一実施例によれば、前記ＡＰＩサービスは、ファンクションであり、前記再方向付けするステップ（Ａ１）は、
（Ａ１１）メモリ内に、再方向付けられるべきＡＰＩファンクションを含むダイナミック・リンク・ライブラリを記憶するステップと、
（Ａ１２）前記記憶されたダイナミック・リンク・ライブラリに含まれるＡＰＩファンクション用のファンクション・ポインタ・テーブル内で、再方向づけられるべきＡＰＩファンクションが記憶されている初期メモリアドレスを、前記ピース・オブ・コードに含まれる対応するファンクションとが記憶されている初期メモリアドレスで、置換するステップとを有する。
【００２０】
各ＡＰＩファンクションは、ピース・オブ・コードに含まれるファンクションに再方向付けられる。その結果、ピース・オブ・コードは、プロセスによりこれ等のファンクションになされたコールをインターセプトする。それによりその実行に関与するハードウエア資源の使用を、ソフトウエア・エンティティ上で動く手段例えばスレッド・オブ・エクセキューション、メモリ、ミューテックス・ロック（ロックとしての公知）により、制御できる。
【００２１】
前記再方向付けするステップ（Ａ１）は、（Ａ１３）第１変数内に、再方向付けられるべきＡＰＩファンクションが記憶されている初期メモリ・アドレスを記憶するステップを有する。そのため、アプリケーションを実行中のある時点で、実行可能なピース・オブ・コードそのものからＡＰＩファンクション（オリジナルのファンクション）へのコールを行うこともできる。
【００２２】
本発明の一実施例によれば、前記ＡＰＩサービスは、オブジェクト・メソッドであり、前記再方向付けするステップ（Ａ１）は、
（Ａ１４）メモリ内に、再方向付けるべきオブジェクト・メソッドを含むダイナミック・リンク・ライブラリを記憶するステップと、
（Ａ１５）前記再方向付けるべきメソッドに関連するオブジェクトが初めて生成されたか否かを確認するステップと、
前記ステップ（Ａ１５）で生成されたと確認された場合には、
（Ａ１６）前記記憶されたダイナミック・リンク・ライブラリに含まれるオブジェクト・メソッド用のメソッド・ポインタ・テーブル内で、再方向づけられるべきオブジェクト・メソッドが記憶されている初期メモリアドレスを、前記ピース・オブ・コードに含まれる対応するメソッドが記憶されている初期メモリアドレスで、置換するステップと
を有する。
【００２３】
ファンクションの場合と同様に、オブジェクトに帰属するメソッドを、ピース・オブ・コードに含まれるメソッドに再方向付けすることが可能である。その結果、ピース・オブ・コードは、プロセスによりこれ等のメソッドになされたコールを、インターセプトすることができ、その実行に関与するハードウエア資源の使用を制御できる。
【００２４】
上記したように、ＡＰＩサービスを再方向付けすることも可能であり、このサービスの１つはファンクションであり別の１つはメソッドである。その結果２つの実施例は、実行中の同じアプリケーションとあるアプリケーションに対し双補的になる。
【００２５】
前記再方向付けするステップ（Ａ１）は、（Ａ１７）第１変数内に、再方向付けられるべきオブジェクト・メソッドが記憶されている初期メモリ・アドレスを記憶するステップを有する。その結果、必要とあれば、このメソッド（オリジナル・メソッド）は、ピース・オブ・コードからコールできる。
【００２６】
本発明の一実施例によれば、ＡＰＩは、プロセスに属するソフトウエア・エンティティに関連するサービスであり、このサービスは新たなスレッド・オブ・エクセキューションを生成するようにもできる。このソフトウエア・エンティティは、スレッド・オブ・エクセキューションでもよい。前記インターセプトするステップ（Ａ）は、
（Ａ２）前記プロセスから前記ピース・オブ・コードに含まれる対応するサービスへのコールを受領するステップと、
（Ａ３）前記ピース・オブ・コードに含まれる対応するサービスに基づいて、新たなスレッド・オブ・エクセキューションを生成するステップと、
（Ａ４）前記生成されたスレッド・オブ・エクセキューションを、前記スレッド・オブ・エクセキューションの登録を保持するために創設された第２変数に、記憶するステップと、
を有する。
【００２７】
本発明の一実施例によれば、ＡＰＩサービスは、プロセスに属するソフトウエア・エンティティに関連するサービスであり、このサービスは、新たなスレッド・オブ・エクセキューションの創設を行い、ソフトウエア・エンティティは、スレッド・オブ・エクセキューションであり、前記インターセプトするステップ（Ａ）は、
（Ａ５）新たなスレッド・オブ・エクセキューションを生成するために、前記プロセスから前記ピース・オブ・コードに含まれる対応するサービスへのコールを受領するステップと、
（Ａ６）前記第１変数に記憶された初期メモリ・アドレスをベースに、前記ＡＰＩファンクションへのコールを行うステップと、
（Ａ７）前記ＡＰＩサービスにより生成された新たなスレッド・オブ・エクセキューションの識別子を受領するステップと、
（Ａ８）前記生成されたスレッド・オブ・エクセキューションを、前記スレッド・オブ・エクセキューションの登録を保持するために創設された第２変数に、記憶するステップと、
を有する。
【００２８】
スレッド・オブ・エクセキューション・タイプのソフトウエア・エンティティに関連する複数のサービスを再方向付けすることが可能な場合には、この両方の実施例は、別の実施例になるのではなく、相補い合うものとなる。
【００２９】
より具体的には、第１実施例においては、新たなスレッド・オブ・エクセキューションを生成するサービスはピース・オブ・コードそのものに含まれる。第２実施例においては、新たなスレッド・オブ・エクセキューションを生成するサービスはピース・オブ・コードに含まれない。その結果、ＡＰＩのオリジナルなサービスに向けたコールを実行して、スレッド・オブ・エクセキューションの生成を成功させる必要がある。このため、ＡＰＩサービス（即ちオリジナルなサービス）が記憶されたメモリ・アドレスを、上記した第１変数内記憶させておく必要がある。しかしこの実施例に関わらず、ピース・オブ・コードは、生成された新たなスレッド・オブ・エクセキューションの識別子を管理し、それを前記第１変数内に記憶させる。この第１変数が、生成されたスレッド・オブ・エクセキューションのレジスタを保持する。
【００３０】
ソフトウエア・エンティティは、スレッド・オブ・エクセキューションの場合は。前記ソフトウエア・エンティティ上で動作するステップ（Ｂ）は、
（Ｂ１）前記実行中のアプリケーションのイールドを決定するステップと、
（Ｂ２）前記イールドが閾値を超えるか否かを決定するステップと、
（Ｂ３）前記イールドが閾値を超えた場合には、前記スレッド・オブ・エクセキューションの登録を保持する為に創設された第２変数に記憶されている識別子に基づいて、前記スレッド・オブ・エクセキューションを、所定の時間中断するステップと、
を有する。
【００３１】
ピース・オブ・コードがスレッド・オブ・エクセキューションの識別を管理しているために、ピース・オブ・コード（より具体的にはピース・オブ・コードに含まれるアルゴリズム）がアプリケーションのイールド（yield）が閾値以上である場合（即ち、アプリケーションの実行がより多くのリソースを消費する場合即ち必要以上のリソースを消費する場合）、ピース・オブ・コードは、第２の変数内に記憶された識別子に基づいてその時までに生成されたスレッドの実行を中止する。このことは、ピース・オブ・コードは、アプリケーションにより消費されたハードウエア資源の使用を制御できることを意味する。
【００３２】
前記実行中のアプリケーションのイールドを決定するステップ（Ｂ１）は、
（Ｂ１１）制御ポイントとして、実行中にプロセスが繰り返しコールを要求するＡＰＩサービスを確立するステップと、
（Ｂ１２）前記プロセスによるこのサービスへの第１コールと第２コールとの間の経過時間を決定するステップと、
（Ｂ１３）決定された経過時間に基づいて、実行中のアプリケーションのイールドを獲得するステップと、
を有する。
【００３３】
制御ポイントとして使用されているサービスへの第１コールと第２コールの間の経過時間は、ＦＰＳ（Frames per Second）基準に従って測定される。
【００３４】
他方、アルゴリズム（所望のイールドを維持するのに必要な時間と得られたイールドを保持するのに必要な実行時間との差分を測定するアルゴリズム）を用いて、スレッド・オブ・エクセキューション（実行の脈絡）を中止しなければならない時間を決定する。コールはピース・オブ・コードの外部アルゴリズムになされるものであるが、このアルゴリズムはピース・オブ・コードに含めることができる。。
【００３５】
前記ソフトウエア・エンティティがメモリであり、ＡＰＩサービスが、メモリ領域を予約するためのサービスの場合は、前記インターセプトするステップ（Ａ）は、（Ａ９）メモリ領域を確保するために、前記プロセスから前記ピース・オブ・コードに含まれる対応するサービスへのコールを受領するステップを含む。
【００３６】
更にこの場合、前記実行中のプロセスに属するソフトウエア・エンティティ上で動作するステップ（Ｂ）は、（Ｂ１）共有したメモリ領域を予約するステップを含む。
【００３７】
それ故に、プロセスが、メモリ領域を予約するためにＡＰＩサービスにコールを行うと、このコールはインターセプトされ（即ちコールはピース・オブ・コードに含まれる対応するサービスに再方向付けされ）、メモリ領域は同じアプリケーションとあるアプリケーションの様々なインタンスにより共有されるよう、割り当てられる。
【００３８】
以下の実施例は  ソフトウエア・エンティティがメモリの場合、アプリケーションが実行中にハードウエア資源の使用をピース・オブ・コードが如何に制御するかを説明するものである。
【００３９】
例えば、実行するために１ギガバイトのメモリを必要とするアプリケーションに基づいている場合には、このアプリケーションの第２インタンスの実行は、更に１ギガバイトを必要とする。即ち２つのインタンスの実行は全部で２ギガバイトのメモリを消費することになる。本発明では、実行可能なピース・オブ・コードをアプリケーションの両方のインタンスに挿入する場合には、メモリ消費は２ギガバイト未満である。その理由は、実行中の別々のインタンスにより共有されたメモリ領域が割り当てられるからである。この時点で大部分の場合、アプリケーションの各インタンスにより必要とされるメモリ領域全体（この実施例では１ギガバイト）を共有することは不可能である。その理由は、情報は、別のインタンスが修正してはならないメモリ領域に存在するからである。そのためメモリ領域を割り当てる前に、各インタンスの情報特徴を含むため、修正してはならないメモリ領域が特定される。
【００４０】
他方で、プロセスからピース・オブ・コードに含まれる対応するサービスへのコールが、このピース・オブ・コードからメモリ領域を確保するための元のＡＰＩファンクションへのコールに関連することもある。このコールは、上記の第１変数に記憶されたメモリ・アドレスに基づいて行われる。
【００４１】
他方で、ソフトウエア・エンティティはミューテックス・ロックの場合で、ＡＰＩサービスがミューテックス・ロック上でインタービーンする場合は、前記インターセプトするステップ（Ａ）は、（Ａ１０）ミューテックス・ロックに関与するために、前記プロセスから前記ピース・オブ・コードに含まれる対応するサービスへのコールを受領するステップを含む。
【００４２】
この場合、前記実行中のプロセスに属するソフトウエア・エンティティ上で動作するステップ（Ｂ）は、（Ｂ４）前記ミューテックス・ロックに割り当てられた名前を変更するステップを含む。
【００４３】
同一のコンピュータ・システムとあるコンピュータ・システム上では、アプリケーションの複数のインタンスを実行させないアプリケーション（例、ゲーム）もある。このため、それ等は、ロックあるいはミューテックス・ロック（mutex lock）を使用する。これ等のロックは、識別子を実行中のアプリケーションのインタンスに割り当てて、生成されるべき全ての新たなインタンスが同一の識別子を受領すると、複数のインタンスの実行が不可能となる。
【００４４】
この状況において、上記したようにプロセスが、アプリケーションに関連するミューテックス・ロックを生成しようとし、ピース・オブ・コードに含まれる対応するサービスにコールをする（このアクション用の元のＡＰＩサービスのポインターが、ピース・オブ・コードに含まれるサービスの方向に以前に再方向付けされる）と、ピース・オブ・コードは、ミューテックス・ロックに割り当てられた識別子を修正し、その結果、アプリケーションの第２インタンスが生成されると、この識別子は他の識別子とは一致せず、その同時の実行が許可される。
【００４５】
本発明の他の態様によれば、上記したコンピュータ・システムのハードウエア資源の使用を制御する方法を実行するインストラクションを含む実行可能なピース・オブ・コードが提供される。この実行可能なピース・オブ・コードは、このアプリケーションがこのコンピュータ・システム上で実行されるＡＰＩを含むオペレーティング・システム上で実行される場合には、このアプリケーションに帰属するプロセスに挿入されるのに適したものである。
【００４６】
この実行可能なピース・オブ・コードは、物理的な記憶媒体、例えば記憶メディア、コンピュータ・メモリ、ＲＯＭ等に記憶することができ、搬送波、例えば電気信号、光学信号により搬送される。
【００４７】
更に本発明のアプリケーションを、オペレーティング・システム上で実行する方法において、
（Ｘ）アプリケーションに関連するプロセスの実行をスリープ状態に初期化するステップと、
（Ｙ）コンピュータ・システムのハードウエア資源の使用を制御する方法を実行するインストラクションを含む実行可能なピース・オブ・コードを、前記スリープ状態にあるプロセス内に挿入するステップと、
（Ｚ）前記プロセスに挿入される実行可能なピース・オブ・コードを用いて、コンピュータ・システムのアプリケーション・プログラミング・インターフェース（ＡＰＩ）を含むアプリケーションによるコンピュータ・システムのハードウエア資源の使用を制御するステップと、を有する。
【００４８】
そのため、ユーザが、コンピュータ・システム上でアプリケーションを実行することを要求すると、上記した方法に従ってそれが実行され、ピース・オブ・コードがハードウエア資源の使用を制御する。
【００４９】
本発明の一実施例によれば、本発明尾アプリケーションに属するプロセスに挿入される実行可能なピース・オブ・コードを用いて、アプリケーションによるコンピュータ・システムのハードウエア資源の使用を制御するシステムにおいて、
前記コンピュータ・システムは、オペレーティング・システム上で実行されるアプリケーション・プログラミング・インターフェース（ＡＰＩ）を含み、
（Ａ）前記アプリケーションに属するプロセスからＡＰＩサービスへのコールをインターセプトするステップと、
前記（Ａ）ステップは、（Ａ１）前記ＡＰＩサービスをピース・オブ・コードに含まれる対応するサービスに再方向付けするステップを有し、
（Ｂ）前記ステップ（Ａ）に基づいて、実行中のプロセスに属するソフトウエア・エンティティ上で動作するステップと、を実行するコンピュータ手段を有する。
【００５０】
本発明の一実施例によれば、メモリとプロセッサとを有し、前記メモリに記憶された前記プロセッサで実行可能なインストラクションを有し、アプリケーションが実行されるコンピュータ・システムにおいて、前記インストラクションは、
（Ｘ）アプリケーションに関連するプロセスの実行をスリープ状態に初期化するステップと、
（Ｙ）コンピュータ・システムのハードウエア資源の使用を制御する方法を実行するインストラクションを含む実行可能なピース・オブ・コードを、前記スリープ状態にあるプロセス内に挿入するステップと、
（Ｚ）前記プロセスに挿入される実行可能なピース・オブ・コードを用いて、アプリケーションによるコンピュータ・システムのハードウエア資源の使用を制御するステップと、
を実行する機能を有する。
【００５１】
本明細書と請求の範囲において用語「を含む」とは、例えばＡを含むはＡ以外のものを含んでもよいことを意味する。
【図面の簡単な説明】
【００５２】
【図１】従来技術にかかるコンピュータ・システムでアプリケーションを実行する層を表す図。
【図２】コンピュータ・システム上でのアプリケーションの実行層と、アプリケーションに属するプロセス内に挿入された実行可能なピース・オブ・コードを表す層を組み込んだ本発明の層を表すブロック図。ピース・オブ・コードが、本発明によりアプリケーションによるコンピュータ・システムのハードウエア資源の使用を制御する。
【発明を実施するための形態】
【００５３】
コンピュータ・システムで実行されるＡＰＩを含むオペレーティング・システム上で実行されるアプリケーションによるコンピュータ・システムのハードウエア資源の使用を制御する本発明の方法を、以下説明する。このピース・オブ・コードは、アプリケーションに関連するプロセス内に挿入され、そのプロセスはスリープ状態で初期化される。
【００５４】
図１は、従来技術にかかるコンピュータ・システム（例、パソコン、サーバ）でアプリケーション（例ゲーム）を実行する層を表す。
【００５５】
同図において、最低レベル層１０はコンピュータ・システムのハードウエア資源、例えば、ＣＰＵ、メモリ、ＧＰＵ、キーボード、マウス等を表す。
【００５６】
最低レベル層１０上の第２層１１は、最低レベル層１０との間の双方向通信（資源即ちリソースに関する情報を送受信できる制御信号１４またはデータ１５）に必要なドライバーを有する。
【００５７】
第２層１１上の第３層１２は、オペレーティング・システムを表し、ＡＰＩ（ＡＰＩ）と、オペレーティング・システムに含まれるものと、最低レベル層１０のリソース（資源）のドライバーを搭載することにより得られたものが配置される。このＡＰＩは、通常ダイナミック・リンク・ライブラリ（dynamic link libraries）で実現されるが、それは使用されるオペレーティング・システムに問わない。ＡＰＩを含む第３層１２と、オペレーティング・システムを表す第２層１１との間の通信は、双方向通信であり、制御信号１４とデータ１５の両方を交換する。
【００５８】
図１には第４層即ち最高レベル層１３がある。最高レベル層１３は実行中のアプリケーションを表す。最高レベル層１３が実行されていると、このアプリケーションはＡＰＩ（ＡＰＩ）を表す第３層１２にアクセスし、制御信号１４とデータ信号１５とを交換する。
【００５９】
この構成によれば、実行中のアプリケーションである最高レベル層１３は、アプリケーションが実行されているコンピュータ・システムのディスプレイ・スクリーン上にウインドウを生成することを要求する。このアプリケーションは、ウインドウを生成するためにＡＰＩ層である第３層１２のサービス（ファンクションまたはメソッドのいずれか）にアクセスしなければならない。スクリーン上にウインドウを生成するために、これ等のサービスは、ＯＳ層である第２層１１と情報（制御信号、データ信号）を交換する必要があり、第２層は、スクリーンである最低レベル層１０との通信を行うために必要なツール（ドライバー）を有し、かして所望のウインドウが生成できる。
【００６０】
この構成の欠点は、実行中のアプリケーションによる、コンピュータ・システムのハードウエア資源の使用を効率的に管理できるようなエレメント又はツールが存在しないことである。ここに説明した場合においては、アプリケーションは、その実行にのために必要とするリソースを用いる。
【００６１】
この理由により、本発明は、アプリケーションに関連するプロセス内に挿入された実行可能なピース・オブ・コードを利用する。このプロセスはスリープ状態で初期化され、その結果、実行中にアプリケーションにより使用されるハードウエア資源を制御できる。
【００６２】
図２は、図１のブロックに加えて、実行可能なピース・オブ・コードがアプリケーションに関連するプロセスに挿入された後では、実行可能なピース・オブ・コードを表す層１６を、アプリケーションの最高レベル層１３とＡＰＩを表す第３層１２との間の論理レベルで有する。その結果、ピース・オブ・コードは、アプリケーションからあるＡＰＩサービス（例えばファンクションまたはメソッド）へのコールをインターセプトし、プロセスに帰属するソフトウエア・エンティティ上で動く、アプリケーションによるハードウエア資源の使用を制御する。
【００６３】
具体的には、ピース・オブ・コードにより実行される方法は以下のとおりである。初期状態において、ユーザがアプリケーションを実行すると、このアプリケーションに帰属するプロセスがスリープ状態で初期化される。このスリープ状態の間ピース・オブ・コードはプロセスに挿入される。
【００６４】
ピース・オブ・コードがプロセスに挿入されると、ピース・オブ・コードは、メモリ内に、これ等のサービス（ファンクションまたはメソッドのいずれか）を含むＡＰＩに含まれる全てのダイナミック・リンク・ライブラリを記憶させる。このサービスは、実行中に将来アプリケーションにより要求されるようになるものである。その後、オペレーティング・システムが、初期のメモリ・アドレス（そこにサービスが記憶されている）に従ってメモリ内に記憶されている別のＡＩＰサービス用のサービス・ポインター・テーブルを満たすと、このポインター・テーブル内で、実行中にアプリケーションにより将来必要とされる各サービスの初期メモリ・アドレスを置換する。この初期メモリ・アドレス内に、ピース・オブ・コードに含まれる対応するサービスが配置される。そのため再方向付けが実行されると、ピース・オブ・コードは、プロセスが実行中に関連するサービスに対し行ったコールを、インターセプトできる。即ちプロセスが様々なＡＰＩの様々な関連するサービスに対し行ったコールはピース・オブ・コードが受領する。その理由は、このポインターは、ＡＰＩサービスを指定せずに、ピース・オブ・コードに含まれる対応するサービスを指定するからである。
【００６５】
上記のインターセプトに基づいて、ピース・オブ・コードは、アプリケーションによるコンピュータ・システムのハードウエア資源の使用を制御する機能を獲得する。即ちピース・オブ・コードはプロセスにとって透明な方法で、アプリケーションのシステムのハードウエア資源の使用の制御を行う。
【００６６】
より具体的には、プロセスが、コンピュータ・システムのハードウエア資源に、あるＡＰＩサービスへのコールの手段により、アクセスしようとすると、ピース・オブ・コードは、それ自身のサービスを実行（即ちこれ等のコールのインターセプトを実行）する。このインターセプトに基づいて、ピース・オブ・コードは、プロセスがコールを行う先のサービスの種類に基づいて、あるソフトウエアのエンティティ上で機能する。
【００６７】
それ故に、インターセプトされたＡＰＩサービスがスレッド・オブ・エクセキューションの創設するサービスであるならば、即ちピース・オブ・コードが動作しなければならないソフトウエア・エンティティがスレッド・オブ・エクセキューションならば、前記インターセプトするステップ（Ａ）は、
（Ａ２）前記プロセスから前記ピース・オブ・コードに含まれる対応するサービスへのコールを受領するステップと、
（Ａ３）前記ピース・オブ・コードに含まれる対応するサービスに基づいて、新たなスレッド・オブ・エクセキューションを生成するステップと、
（Ａ４）前記生成されたスレッド・オブ・エクセキューションを、前記スレッド・オブ・エクセキューションの登録を保持するために創設された第２変数に、記憶するステップと、
を有する。
【００６８】
上記の場合即ちインターセプトされたＡＰＩサービスがスレッド・オブ・エクセキューションの創設するサービスであるならば、前記インターセプトするステップ（Ａ）は、
（Ａ５）新たなスレッド・オブ・エクセキューションを生成するために、前記プロセスから前記ピース・オブ・コードに含まれる対応するサービスへのコールを受領するステップと、
（Ａ６）前記第１変数に記憶された初期メモリ・アドレスをベースに、前記ＡＰＩファンクションへのコールを行うステップと、
（Ａ７）前記ＡＰＩサービスにより生成された新たなスレッド・オブ・エクセキューションの識別子を受領するステップと、
（Ａ８）前記生成されたスレッド・オブ・エクセキューションを、前記スレッド・オブ・エクセキューションの登録を保持するために創設された第２変数に、記憶するステップと、
を有する。
【００６９】
いずれの場合も、インターセプトされたＡＰＩサービスがスレッド・オブ・エクセキューションの創設するサービスであるならば、前記実行中のプロセスに属するソフトウエア・エンティティ上で動作するステップ（Ｂ）は、
（Ｂ１）前記実行中のアプリケーションのイールドを決定するステップと、
（Ｂ２）前記イールドが閾値を超えるか否かを決定するステップと、
（Ｂ３）前記イールドが閾値を超えた場合には、前記スレッド・オブ・エクセキューションを、所定の時間中断するステップと、
を有する。
【００７０】
それ故に、スレッド・オブ・エクセキューションの識別子はピース・オブ・コードにより管理されているので（ピース・オブ・コードがそれが管理する変数内に識別子を記憶している）ので、ピース・オブ・コードがアプリケーションのイールドが閾値以上の場合（即ちアプリケーションの実行が多くの資源あるいは必要以上の資源を消費してしまっている場合）には、ピース・オブ・コードは、対応する変数内に記憶されている識別子に基づいて、その時点まで生成されたスレッドの実行を中断する。このことはピース・オブ・コードが、アプリケーションが消費するハードウエア資源の使用を制御できることを意味する。
【００７１】
前記実行中のアプリケーションのイールドを決定するステップ（Ｂ１）は、
（Ｂ１１）制御ポイントとして、実行中にプロセスが繰り返しコールを要求するＡＰＩサービスを確立するステップと、
（Ｂ１２）前記プロセスによるこのサービスへの第１コールと第２コールとの間の経過時間を決定するステップと、
（Ｂ１３）決定された経過時間に基づいて、実行中のアプリケーションのイールドを獲得するステップと、
を有する。
【００７２】
インターセプトされたＡＰＩサービスがメモリ領域を確保するためのものである場合は、前記インターセプトするステップ（Ａ）は、
（Ａ９）メモリ領域を確保するために、前記プロセスから前記ピース・オブ・コードに含まれる対応するサービスへのコールを受領するステップ
を有する。
【００７３】
この場合、即ちインターセプトされたコールがメモリ領域を確保するためのものである場合は、前記実行中のプロセスに属するソフトウエア・エンティティ上で動作するステップ（Ｂ）は、（Ｂ１）共有したメモリ領域を予約するステップを有する。
【００７４】
それ故に、プロセスが、メモリ領域を予約するために、ＡＰＩサービスにコールすると、このコールはインターセプトされ（即ちコールはピース・オブ・コード内に含まれる対応するサービスに再方向付けられ）、同じアプリケーションとあるアプリケーションの様々なインタンスにより共有されるメモリ領域が割り当てられる、即ちピース・オブ・コードに含まれる対応するサービスは、同じアプリケーションとあるアプリケーションの異なるインタンスにより共有されるよう、メモリ領域を割り当てる。
【００７５】
最後に、インターセプトされたコールがミューテックス・ロックに関連するＡＰＩサービスである場合は、前記インターセプトするステップ（Ａ）は、
（Ａ１０）ミューテックス・ロックに関連するために、プロセスからピース・オブ・コードに含まれる対応するサービスへのコールを受領するステップを含み、
前記実行中のプロセスに属するソフトウエア・エンティティ上で動作するステップ（Ｂ）は、（Ｂ４）前記ミューテックス・ロックに割り当てられた名前を変更するステップとを含む。
【００７６】
同一のコンピュータ・システムとあるコンピュータ・システム上では、アプリケーションの複数のインタンスを実行させないアプリケーション（例、ゲーム）もある。このため、それ等は、ロックあるいはミューテックス・ロック（mutex lock）を使用する。これ等のロックは、識別子を実行中のアプリケーションのインタンスに割り当てて、生成されるべき全ての新たなインタンスが同一の識別子を受領すると、複数のインタンスの実行が不可能となる。
【００７７】
この状況において、上記したようにプロセスが、アプリケーションに関連するミューテックス・ロックを生成しようとし、ピース・オブ・コードに含まれる対応するサービスにコールをする（このアクション用の元のＡＰＩサービスのポインターが、ピース・オブ・コードに含まれるサービスの方向に以前に再方向付けされる）と、ピース・オブ・コードは、ミューテックス・ロックに割り当てられた識別子を修正し、その結果、アプリケーションの第２インタンスが生成されると、この識別子は他の識別子とは一致せず、その同時の実行が許可される。
【００７８】
以上の説明により、ピース・オブ・コードが、これ等のタイプのサービスに対応するソフトウエアのエンティティで動作する、様々なＡＰＩサービスに対するインターセプトされたコールに基づいて、アプリケーションによるコンピュータ・システムのハードウエア資源の使用を制御できることが、明らかになった。
【００７９】
本発明の実施例を以下に説明する。この実施例においては、オペレーティング・システムはウインドウズ例えばウインドウズ７であり、コンピュータ・システムはアプリケーション・サーバ具体的にはゲーム・サーバであり、実行すべきアプリケーションはゲーム、同一ゲームと別のあるゲームの様々なインタンスである。さらにピース・オブ・コード上のソフトウエア・エンティティは、プロセスが実行中にその時間までに形成された様々なスレッド・オブ・エクセキューションに対応するアプリケーションによるハードウエア資源の使用を制御するよう、介入する。
【００８０】
より具体的には、本発明の実施例は次のように動作する。ゲーム・サーバの目的は、そのサービスのユーザが異なるゲーム、更には自分のモバイル端末（スマートフォン、タブレット）からの同一のコンピュータ・ゲームをプレイできるようにすることである。各ゲームの実行あるいは同一ゲームの各インタンスの実行は、ゲームサーバからユーザのモバイル装置へストリーミング技術により送られる。それ故に、ユーザのモバイル端末から、このユーザは遊びたいゲームを選択し、ユーザのモバイル端末のスクリーン上に示されているＧＵＩの制御要素（例えばゲームのアイコン）上で動かすことにより、ゲームの実行を要求する。制御要素上のユーザによるこの活性化により、ゲーム・サーバに制御信号を送り、選択されたゲームをサーバ上で実行させる。
【００８１】
多数のユーザがゲームの実行を要求している（即ち多数のゲームが実行されている）とすると、本発明は、各ゲームの実行を制御しようとする。その結果、使用されるハードウエア資源は少なくなる。その結果、最大数のゲームが同時に実行可能であり、最大数のユーザにサービスを提供することができる。
【００８２】
そのため、ユーザーが自分の端末からゲームの実行を要求すると、実行中のアプリケーション（ゲーム）のメイン・プロセスはゲーム・サーバ内でスリープ状態で生成される。このためファンクションCreateProcess が用いられＣＲＥＡＴＥ  ＳＵＳＰＥＮＤＥＤ値がクリエイション・モード・パラメータ(CreateFlags）に割り当てられる。プロセスがスリープ状態で初期化されると、本発明による実行可能なピース・オブ・コードはプロセス内に挿入される。その目的は、プロセスに属するソフトウエアのエンティティを最適にすることである。
【００８３】
プロセスの実行の再開の前に（プロセスはスリープ状態で初期化されている）、挿入されたピース・オブ・コードは、インターセプトすべきＡＰＩファンクションを再方向付けする。本発明の実施例によれば、２つのカテゴリーのファンクションがインターセプトされる。
＊ファンクションCreateThreadnoの手段により、スレッド・オブ・エクセキューションの創設を登録するためのファンクション、
＊プロセスが実行中の間制御ポイントを確認するためのファンクション。
それ故に、これ等の制御ポイントを用いて、アプリケーションのイールドは、そのプロセスにとって透明な方法で、それに関連するファンクションの手段により測定される。アプリケーションは、プロセス全体の実行中に繰り返しコールされたものである。それ故に例えばグラフィックのアプリケーションにおいては、スクリーン毎の各フレーム（frame per screen）のファンクションは、制御ポイントとして、ＡＰＩ  ＩＤＸＧＩSwapChain1のメソッドPresent１の手段により、確立される。その結果、アプリケーションのイールドは１秒当たりフレームの数（Frams shonw per second：ＦＰＳ）を測定することにより得られる。この目的は、ピース・オブ・コードが、アプリケーションのイールドが閾値を超えた時を識別し、コンピュータ・システム（即ち、ゲーム・サーバ）のハードウエア資源の過剰な使用を阻止し、実行中の他のアプリケーション（即ち、あるゲームあるいは同一ゲームのインタンス）のイールドと自分のイールドをバランスさせる。アプリケーションのイールドが所定の閾値を超えると、このプロセスに関連するスレッド・オブ・エクセキューションが、必要な期間中断され、その結果、イールドは閾値を超えることはない。
【００８４】
ウインドウズのオペレーティング・システムにおいて、上記のＡＰＩはダイナミック・リンク・ライブラリ（ＤＬＬ）の形で通常実現される。このため、ピース・オブ・コードは、ファンクションLoodLibraryの手段により、再方向付けすべきファンクションを含むライブラリ（例えば、kernel32.dllのCreateThreadとAPI IDXGISwapChain1のPresent 1）をライブラリdxgi.dllを介して、再方向付けする。基本的に、LoodLibraryは、メモリ内にライブラリを記憶し、Inedx Address Table(IAT)（これはＡＰＩファンクション用のポインター・テーブルであるが）を、ＡＰＩファンクションのメモリ内の初期アドレスで充填する。この必要なポインターはファンクションRedirectIATの手段により修正される。これにより、プロセスに挿入されたピース・オブ・コードに属するファンクションに対応させる。同時に、テーブルの元のコンテンツ（即ちファンクションが記憶されている初期メモリ・ポジション用のポインター）は、ある時点で元のファンクションをコールする必要がある場合、変数内にセーブされる。
【００８５】
他方で、API IDXGISwapChain1が、ＣＯＭタイプのインターフェイスであるので、インターセプトすべきメソッドを置換するために、インターフェイスのポインター・テーブル（例Present1）を修正する必要がある。ＣＯＭタイプのインターフェイスのメソッド・ポインター・テーブルは、特殊なコードで修正される。例えばPresent1はIDXGISwapChainのインターフェイスのメソッド・テーブルのポジション４に対応し、それを修正し、その結果それは、挿入されたピース・オブ・コード内に含まれるファンクションを指す。同時に、このポジションのオリジナルのコンテンツは、元のメソッドをコールする必要がある場合には、変数の中にセーブされる。ＣＯＭタイプのインターフェイスのポインター・テーブルの修正は、そのタイプのオブジェクトが創設されたときに初めて行わなければならない。サービスの再方向付けが終了した時点で、即ち全て必要なＡＰＩsのファンクションまたはメソッドを再方向づけられた時点で、アプリケーションのプロセスの実行が再開される。
【００８６】
プロセスが新たなスレッド・オブ・エクセキューションを創設しようとする時には、ファンクションCreateThreadを実行して、創設されようとしている新たなスレッドの情報を記憶する。このため、ピース・オブ・コードは、その実行のために、元のファンクションCreateThreadに対しコールを行う。ピース・オブ・コードそのものは、新たな変数内に新たなスレッド・オブ・エクセキューションの識別子を記憶し、その時点まで創設されたピース・オブ・コードの全ての登録を維持する。この実施例に於いては、元のファンクションCreateThreadが用いられる。即ちコールがピース・オブ・コードからこの元のＡＰＩファンクションに、対応する変数内に記憶されたメモリ・アドレスをベースに行われる（変数は、各再方向付けされたファンクションが記憶される初期メモリ・ポジションにポインターを記憶する）。しかしピース・オブ・コードがスレッド・オブ・エクセキューションの創設をするファンクションを含むような状況が生じると、外部ファンクションへのコール行う必要性はない。何れの場合も、ピース・オブ・コードは創設されたスレッド・オブ・エクセキューションの識別子を管理する。
【００８７】
他方で上記したように、このアプリケーションに関連するプロセスが制御ポイントとして使用されているファンクション（この実施例では、ファンクションPresent1）にコールをする毎に、実行中のアプリケーションのイールドを測定することも可能である。最後のコールからこのファンクションまでの経過時間を、イールドを生成する特殊なアルゴリズムを用いて測定する。例えば前記したＦＰＳを用いて測定する。挿入されたピース・オブ・コードに含まれるイールドを測定するアルゴリズムが、イールドが所定のしきい値を超えたと判断すると、スレッド・オブ・エクセキューションを中断しなければならない時間が計算される。この時間は、実際のイールドを維持するの必要な時間と望ましいイールドを維持するの必要な時間との差分を計算するアルゴリズムで、計算される。次に、ピース・オブ・コードは、その時点（その識別子は上記変数内に記憶されている）までプロセスにより生成された全てのスレッド・オブ・エクセキューション（即ちピース・オブ・コードがスレッド・オブ・エクセキューション上で動作する）の実行を、上記した時間だけ、ファンクションSuspendThreadの手段とライブラリkernel32.dllの手段により、中断する。この計算された時間が経過すると、スレッド・オブ・エクセキューションは、ライブラリkernel32.dllのファンクションResumeThreadの手段により、再度活性化される。例えば、その時点以降、プロセスの通常の実行は、プロセスが制御ファンクション（この実施例では、ファンクションPresent1）に再度コールまで、継続する。
【００８８】
そのため、ピース・オブ・コードが、ソフトウエア・エンティティ上で、スレッド・オブ・エクセキューションを参照して動作すると、ピース・オブ・コードは、実行中のアプリケーション（具体的にはゲーム）によるゲームサーバで利用可能なハードウエア資源の利用を制御する。
【００８９】
本発明の他の実施例によれば、ピース・オブ・コードは、別のソフトウエア・エンティティ例えばメモリ上で動作してもよい。この場合、ピース・オブ・コードは、メモリ領域の予約を管理する全てのＡＰＩサービス（例、ファンクション又はメソッド）をピース・オブ・コードそのものに含まれるサービスに再方向付けしなければならない。その結果、ピース・オブ・コードに含まれるこれらのサービスは、メモリ領域を同一ゲームとあるゲームの様々なインスタンスにより共有されるよう割り当てることができる。それ故、実行中の複数のインスタンスはあるメモリ領域を共有する。その結果、これらのインスタンスによるメモリの使用を大幅に減らすことができる。ある場合には、共有できない排他的メモリ領域（例えばインスタンスの実行を要求したユーザのデータを含むメモリ領域）が存在することもある。それ故に、メモリ領域の予約の前に、ピース・オブ・コードは、どのメモリ領域を共有すべきかすべきでないかを決定しなければならない。
【００９０】
スレッド・オブ・エクセキューションがソフトウエア・エンティティの場合には、アプリケーションにより要求されるメモリ領域は、ピース・オブ・コードからオリジナルのＡＰＩファンクションへのコールの手段により割り当てられる。そして、このピース・オブ・コードが、常時割り当てられなければならないメモリを制御する。
【００９１】
他方で、ピース・オブ・コードは、他のあらゆるタイプのソフトウエア、例えば、ロック、ミューテックス・ロックも管理できる。そのため、同一のゲーム・サーバの同一のゲームとあるゲームの複数のインスタンスを実行できる。通常プログラマーは、ミューテックス・ロックを世界中のコンピュータ・ゲームに挿入して、ユーザが同一のゲーム・サーバの同一のゲームとあるゲームの複数のインスタンスを実行できないようにしている。この為にゲームの第１のインスタンスが生成されると、ミューテックス・ロックが、ゲームに関連する所定のラベル（このラベルは各ゲームににとって独自のものである）を生成し、ユーザが実行中のそのゲームの第２のインスタンスを実行しようとすると、ミューテックス・ロックは、ラベルをとおして、実行中のインスタンスがあると決定し、この第２のインスタンスの実行を許可しない。
【００９２】
このような欠点を解決するために、ゲームに属するプロセスに挿入されたピース・オブ・コードは、ミューテックス・ロックを管理しようとするＡＰＩサービスを、ピース・オブ・コードに含まれる対応するサービスに再方向付けする。その為、ピース・オブ・コードは、これらのサービスをインターセプトし、ミューテックス・ロックによりそれに割り当てられた所定のラベルを変更する。その結果、ユーザが実行中のそのゲームの第２のインスタンスを実行しようとすると、サービスは、対応する所定のラベルの付いたいかなるインスタンスも検出せず、この実行を許可する。ピース・オブ・コードは、実行中のインスタンスに対応するプロセスに挿入されるので、それに割り当てられたラベルは、インスタンス毎に異なる異なることになる。
【００９３】
本発明の実施例を上記したが、当業者にはここに開示した詳細を置換するあるいは変形例、修正例を導入することは本発明を請求の範囲に加えた精神を逸脱することなく可能である。
【００９４】
本発明の実施例は、コンピュータ・システム或いはコンピュータ・システムで実行されるプロセスを含むが、本発明は実行可能なピース・オブ・コードあるいはコンピュータ・プログラムをカバーし、特に伝送媒体上のコンピュータ・プログラムは本発明を実施させるための手段となる。コンピュータ・プログラムはソース・コード、オブジェクト・コード、それ等の間の中間コードの何れの形態でもよく、更に部分的コンパイルの形態あるいは本発明に使用するに適した他の形態でもよい。伝送媒体はプログラムを搬送できるあらゆるエンティティ又は装置である。
【００９５】
例えば伝送媒体は、記憶媒体、ＲＯＭ、ＣＤ  ＲＯＭ、半導体ＲＯＭ、磁気記憶媒体、フロッピーディスク、ハードディスクを含む。  例えば記憶媒体は伝送可能な媒体を含み電気信号、光学信号を電気的手段あるいは光学的手段により伝送できる。
【００９６】
コンピュータ・プログラムは、ケーブル或いは他の装置手段により直接送信される信号に込まれる場合には伝送媒体はケーブル或いは他の装置手段で形成される。
【００９７】
別の構成として伝送媒体は、コンピュータ・プログラムが記憶された集積回路でもある。この集積回路は関連するプロセスを実行するのに用いられたものである。
【００９８】
以上の説明は、本発明の一実施例に関するもので、この技術分野の当業者であれば、本発明の種々の変形例を考え得るが、それらはいずれも本発明の技術的範囲に包含される。特許請求の範囲の構成要素の後に記載した括弧内の番号は、図面の部品番号に対応し、発明の容易なる理解の為に付したものであり、発明を限定的に解釈するために用いてはならない。また、同一番号でも明細書と特許請求の範囲の部品名は必ずしも同一ではない。これは上記した理由による。「少なくとも１つ或いは複数」、「と／又は」は、それらの内の１つに限定されない。例えば「Ａ，Ｂ，Ｃの内の少なくとも１つ」は「Ａ」、「Ｂ」、「Ｃ」単独のみならず「Ａ，Ｂ或いはＢ，Ｃ更には又Ａ，Ｂ，Ｃ」のように複数のものを含んでもよい。「Ａ，Ｂ，Ｃの内の少なくとも１つ」は、Ａ，Ｂ，Ｃ単独のみならずＡ，Ｂの組合せＡ，Ｂ，Ｃの組合せでもよい。「Ａ，Ｂと／又はＣ」は、Ａ，Ｂ，Ｃ単独のみならず、Ａ，Ｂの２つ、或いはＡ，Ｂ，Ｃの全部を含んでもよい。本明細書において「Ａを含む」「Ａを有する」は、Ａ以外のものを含んでもよい。特に記載のない限り、装置又は手段の数は、単数か複数かを問わない。
【符号の説明】
【００９９】
１０：最低レベル層
１１：第２層
１２：第３層
１３：最高レベル層
１４：制御信号
１５：データ
１６：層
【図１】
2015517159.tif 000003
【図２】
2015517159.tif 000004
【国際調査報告】
2015517159.tif 000005
2015517159.tif 000006
2015517159.tif 000007
2015517159.tif 000008
2015517159.tif 000009
2015517159.tif 000010