(57)【要約】【課題】【解決手段】コマンドが、仮想クライアント・コンピューティング環境内のハードウェアによって処理され、たとえば、グラフィックス関連コマンドがグラフィックス・ハードウェアによって処理される。サーバ・コンピューティング・デバイスは、グラフィックス・ハードウェア、仮想クライアント・コンピューティング環境、およびサーバ・コンピューティング環境を含む。グラフィックス・ハードウェアは、グラフィックス関連コマンドを応答の形に処理する。仮想クライアント・コンピューティング環境は、コマンドを発行する符号化アプリケーションを含む。サーバ・コンピューティング環境は、復号アプリケーションを含む。符号化アプリケーションは、コマンドを受け取り、それらのコマンドを第１キューに置く第１スレッドを含む。符号化アプリケーションは、第２キューから応答を受け取り、それらの応答をリモート・ディスプレイ・デバイスに通信する第２スレッドを含む。復号アプリケーションは、第１キューからコマンドを受け取り、それらのコマンドをグラフィックス・ハードウェアに通信し、グラフィックス・ハードウェアから応答を受け取り、それらの応答を第２キューに置く第３スレッドを含む。【選択図】図１
2009512921.tif 000002
【特許請求の範囲】
【請求項１】
サーバ・コンピューティング・デバイスであって、
グラフィックス関連コマンドをグラフィックス関連コマンド応答の形に処理するグラフィックス・ハードウェアと、
第１キューと、
第２キューと、
前記サーバ・コンピューティング・デバイスに通信可能に結合されたリモート・クライアント・コンピューティング・デバイスと相互作用する仮想クライアント・コンピューティング環境と、
前記仮想クライアント・コンピューティング環境を管理するサーバ・コンピューティング環境と
を備え、
前記仮想クライアント・コンピューティング環境は、
前記グラフィックス関連コマンドを発行する符号化アプリケーションであって、
前記グラフィックス関連コマンドを受け取り、前記グラフィックス関連コマンドを前記第１キューに置く第１スレッドと、
前記グラフィックス関連コマンド応答を前記第２キューから受け取り、前記グラフィックス関連コマンド応答を前記リモート・クライアント・コンピューティング・デバイスのディスプレイ・デバイスに通信する第２スレッドと
を含む符号化アプリケーション
を含み、
前記サーバ・コンピューティング環境は、
前記グラフィックス関連コマンドを前記第１キューから受け取り、前記グラフィックス関連コマンドを処理のために前記グラフィックス・ハードウェアと通信し、前記グラフィックス・ハードウェアから前記グラフィックス関連コマンド応答を受け取り、前記グラフィックス関連コマンド応答を前記第２キューに置く第３スレッドを含む復号アプリケーション
を含む
サーバ・コンピューティング・デバイス。
【請求項２】
前記グラフィックス・ハードウェアは、前記グラフィックス関連コマンドのソフトウェア処理より速く前記グラフィックス関連コマンドを処理することができる、請求項１に記載のサーバ・コンピューティング・デバイス。
【請求項３】
前記グラフィックス関連コマンドは、ＯｐｅｎＧＬコマンドである、請求項１または２に記載のサーバ・コンピューティング・デバイス。
【請求項４】
前記第１キューは、複数のキュー・エントリを含み、前記第１スレッドは、ヘッド・ポインタによってポイントされるキュー・エントリに前記グラフィックス関連コマンドの１つを置き、その結果、前記ヘッド・ポインタが、次の使用可能なキュー・エントリに移動されるようになっており、前記第３スレッドは、テール・ポインタによってポイントされるキュー・エントリの前記グラフィックス関連コマンドの１つを受け取り、その結果、前記テール・ポインタが、前記グラフィックス関連コマンドの１つを含む次のキュー・エントリに移動されるように構成される、請求項１ないし３のいずれかに記載のサーバ・コンピューティング・デバイス。
【請求項５】
前記第２キューは、複数のキュー・エントリを含み、前記第３スレッドは、ヘッド・ポインタによってポイントされるキュー・エントリに前記グラフィックス関連コマンド応答の１つを置き、その結果、前記ヘッド・ポインタが、次の使用可能なキュー・エントリに移動されるようになっており、前記第２スレッドは、テール・ポインタによってポイントされるキュー・エントリの前記グラフィックス関連コマンド応答の１つを受け取り、その結果、前記テール・ポインタが、前記グラフィックス関連コマンド応答の１つを含む次のキュー・エントリに移動されるように構成される、請求項１ないし４のいずれかに記載のサーバ・コンピューティング・デバイス。
【請求項６】
前記グラフィックス関連コマンドは、同期式グラフィックス関連コマンドを含み、前記第１スレッドは、前記同期式グラフィックス関連コマンドを前記第１キューに置き、前記第２スレッドが前記同期式グラフィックス関連コマンドに関連するグラフィックス関連コマンド応答を前記第２キューから受け取るまで前記第１キューにさらなるグラフィックス関連コマンドを置くのを待つ、請求項１ないし５のいずれかに記載のサーバ・コンピューティング・デバイス。
【請求項７】
サーバ・コンピューティング・デバイスであって、
ソフトウェアだけで達成できるよりすばやく特定のコマンドを応答の形に処理するハードウェアと、
前記サーバ・コンピューティング・デバイスに通信可能に結合されたリモート・クライアント・コンピューティング・デバイスと相互作用し、前記特定のコマンドを発行する仮想クライアント・コンピューティング環境と、
前記仮想クライアント・コンピューティング環境を管理するサーバ・コンピューティング環境と
を備え、
前記仮想クライアント・コンピューティング環境は、
前記仮想クライアント・コンピューティング環境内で発行された前記特定のコマンドを受け取り、前記特定のコマンドを第１キューに置く第１スレッドと、
前記応答を第２キューから受け取り、前記応答を前記リモート・クライアント・コンピューティング・デバイスの対応するハードウェアに通信する第２スレッドと
を含み、
前記サーバ・コンピューティング環境は、
前記特定のコマンドを前記第１キューから受け取り、前記特定のコマンドを処理のために前記ハードウェアに通信し、前記ハードウェアから前記応答を受け取り、前記応答を前記第２キューに置く第３スレッド
を含む
サーバ・コンピューティング・デバイス。
【請求項８】
前記仮想クライアント・コンピューティング環境は、前記第１スレッドおよび前記第２スレッドを含む符号化アプリケーションを含む、請求項７に記載のサーバ・コンピューティング・デバイス。
【請求項９】
前記サーバ・コンピューティング環境は、前記第３スレッドを含む復号アプリケーションを含む、請求項７または８に記載のサーバ・コンピューティング・デバイス。
【請求項１０】
前記ハードウェアは、グラフィックス・ハードウェアであり、前記特定のコマンドは、グラフィックス関連コマンドである、請求項７ないし９のいずれかに記載のサーバ・コンピューティング・デバイス。
【請求項１１】
仮想クライアント・コンピューティング環境及びサーバ・コンピューティング環境を備えるサーバ・コンピューティング・デバイスにおいて実行される方法であり、
前記仮想クライアント・コンピューティング環境は、前記サーバ・コンピューティング・デバイスに通信可能に結合されたリモート・クライアント・コンピューティング・デバイスと相互作用し、前記サーバ・コンピューティング環境は、前記仮想クライアント・コンピューティング環境を管理し、
前記方法は、  
前記仮想クライアント・コンピューティング環境内で動作する符号化アプリケーションによって発行される時に、グラフィックス関連コマンドを前記サーバ・コンピューティング・デバイスの仮想クライアント・コンピューティング環境の第１スレッドによって受け取ること、
前記グラフィックス関連コマンドを前記第１スレッドによって第１キューに置くこと、
前記グラフィックス関連コマンドを前記サーバ・コンピューティング環境の第３スレッドによって前記第１キューから受け取ること、
前記グラフィックス関連コマンドを、グラフィックス関連コマンド応答の形に処理するために前記第３スレッドによって前記サーバ・コンピューティング・デバイスのグラフィックス・ハードウェアに通信すること、
前記グラフィックス関連コマンド応答を前記第３スレッドによって前記グラフィックス・ハードウェアから受け取ること、
前記グラフィックス関連コマンド応答を前記第３スレッドによって第２キューに置くこと、
前記グラフィックス関連コマンド応答を前記仮想クライアント・コンピューティング環境の第２スレッドによって前記第２キューから受け取ること、および、
前記グラフィックス関連コマンド応答を前記第２スレッドによって前記リモート・クライアント・コンピューティング・デバイスのディスプレイ・デバイスに通信すること
を含む方法。
【請求項１２】
前記グラフィックス関連コマンドを前記第１スレッドによって前記第１キューに置くことは、前記第１スレッドによって、
ヘッド・ポインタによってポイントされる前記第１キューのキュー・エントリに前記グラフィックス関連コマンドを置くこと、
前記キュー・エントリに前記グラフィックス関連コマンドを置くことが、前記第１キューを空でなくする場合に、前記第３スレッドを覚醒させること、
前記ヘッド・ポインタを次のキュー・エントリに進めること、および、
前記第１キューが完全に満杯である場合に、前記第１キューのもう１つのキュー・エントリが空になるまでブロックすること
を含む、請求項１１に記載の方法。
【請求項１３】
前記グラフィックス関連コマンドを前記第３スレッドによって前記第１キューから受け取ることは、前記第３スレッドによって、
前記グラフィックス関連コマンドをテール・ポインタによってポイントされる前記第１キューのキュー・エントリから受け取ること、
前記キュー・エントリからの前記グラフィックス関連コマンドの受取が、前記第１キューを満杯でなくする場合に、前記第１スレッドを覚醒させること、
前記テール・ポインタを次のキュー・エントリに進めること、および、
前記第１キューが完全に空である場合に、前記第１キューのもう１つのキュー・エントリが空でなくなるまでブロックすること
を含む、請求項１１または１２に記載の方法。
【請求項１４】
前記グラフィックス関連コマンド応答を前記第３スレッドによって前記第２キューに置くことは、前記第３スレッドによって、
前記グラフィックス関連コマンド応答をヘッド・ポインタによってポイントされる前記第２キューのキュー・エントリに置くこと、
前記キュー・エントリに前記グラフィックス関連コマンド応答を置くことが、前記第２キューを空でなくする場合に、前記第２スレッドを覚醒させること、
前記ヘッド・ポインタを次のキュー・エントリに進めること、および、
前記第２キューが完全に満杯である場合に、前記第２キューのもう１つのキュー・エントリが空になるまでブロックすること
を含む、請求項１１ないし１３のいずれかに記載の方法。
【請求項１５】
前記グラフィックス関連コマンド応答を前記第２スレッドによって前記第２キューから受け取ることは、前記第２スレッドによって、
前記グラフィックス関連コマンド応答をテール・ポインタによってポイントされる前記第２キューのキュー・エントリから受け取ること、
前記キュー・エントリからの前記グラフィックス関連コマンド応答の受取が、前記第２キューを満杯でなくする場合に、前記第３スレッドを覚醒させること、
前記テール・ポインタを次のキュー・エントリに進めること、および、
前記第２キューが完全に空である場合に、前記第２キューのもう１つのキュー・エントリが空でなくなるまでブロックすること
を含む、請求項１１ないし１４のいずれかに記載の方法。
【請求項１６】
前記グラフィックス関連コマンドを前記第１スレッドによって前記第１キューに置いた後に、
前記第１スレッドによって、前記グラフィックス関連コマンドが同期式グラフィックス関連コマンドであることを判定すること、
それに応答して、前記第１スレッドが前記第１キューにさらなるグラフィックス関連コマンドを置かなくなるように、前記第１スレッドがブロックすること
前記グラフィックス関連コマンド応答を前記第２スレッドによって前記第２キューから受け取った後に、
前記第２スレッドによって、前記グラフィックス関連コマンド応答が同期式グラフィックス関連コマンド応答であることを判定すること、および、
それに応答して、前記第１スレッドが前記第１キューにさらなるグラフィックス関連コマンドを置くことをもう一度開始できるようにするために、前記第２スレッドが前記第１スレッドを覚醒させること
をさらに含む、請求項１１ないし１５のいずれかに記載の方法。
【請求項１７】
前記グラフィックス関連コマンドは、ＯｐｅｎＧＬコマンドである、請求項１１ないし１６のいずれかに記載の方法。
【請求項１８】
前記グラフィックス・ハードウェアは、ソフトウェア処理より速く前記グラフィックス関連コマンドを処理することができる、請求項１１ないし１７のいずれかに記載の方法。
【請求項１９】
実行されることでコンピュータを、
仮想クライアント・コンピューティング環境内で発行されたコマンドを受け取り、前記コマンドを第１キューに置く、第１手段と、
第２キューから応答を受け取り、前記応答を前記仮想クライアント・コンピューティング環境に関連するリモート・クライアント・コンピューティング・デバイスの対応するハードウェアに通信する、第２手段と、
前記第１キューから前記コマンドを受け取り、前記コマンドを前記応答の形に処理するためにハードウェアに前記コマンドを通信し、前記ハードウェアから前記応答を受け取り、前記応答を前記第２キューに置く、第３手段と
を含むように機能させるコンピュータ・プログラムを記録した記録媒体。
【請求項２０】
前記ハードウェアは、グラフィックス・ハードウェアであり、前記コマンドは、グラフィックス関連コマンドである、請求項１９に記載の記憶媒体。
【請求項２１】
プログラムがコンピュータ上で動作する時に当該コンピュータに請求項１１ないし１８のいずれかに記載の方法を実行させるコンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般にはＭｉｃｒｏｓｏｆｔ（Ｒ）Ｗｉｎｄｏｗｓ（登録商標）Ｔｅｒｍｉｎａｌ  Ｓｅｒｖｉｃｅｓ環境などの仮想クライアント・コンピューティング環境に関し、より具体的には、そのような環境内でのグラフィックス・ハードウェアによるグラフィックス関連コマンドの処理など、そのような環境内でのコマンドのハードウェア処理に関する（ＭｉｃｒｏｓｏｆｔおよびＷｉｎｄｏｗｓ（登録商標）は、米国、他国、またはその両方におけるＭｉｃｒｏｓｏｆｔ  Ｃｏｒｐｏｒａｔｉｏｎ社の商標である）。
【背景技術】
【０００２】
組織は、通常、数十人、数百人、または数千人のコンピュータ・ユーザを有する。従来、各コンピュータ・ユーザは、そのユーザ自身のクライアント・コンピューティング・デバイスを有した。すべてのコンピュータ・ユーザのクライアント・コンピューティング・デバイスは、通常、ネットワークを介して互いに接続され、このネットワークは、広い範囲でデバイスの管理を容易にする。しかし、一部の保守が、通常、クライアント・コンピューティング・デバイス自体の側で必要であり、これは、管理者および他の情報テクノロジ（ＩＴ）担当者が、各クライアント・コンピューティング・デバイスを周期的に訪問しなければならないことを意味し、これは、時間がかかり、コストが高い。さらに、各コンピュータ・ユーザに別々のコンピューティング・デバイスを提供すること自体が、コストのかかる努力である。
【０００３】
したがって、最近になって、多くの組織は、そのコンピューティング・リソースをターミナル・サービスタイプの環境に移植しており、ターミナル・サービスタイプの環境を、本明細書では仮想クライアント・コンピューティング環境とも称する。これらのタイプの環境では、中央サーバ・コンピューティング・デバイスが、多数のコンピュータ・ユーザをホスティングし、各ユーザには、サーバ・コンピューティング・デバイス上のオペレーティング・システム内で動作する別々のセッションが割り当てられる。各コンピュータ・ユーザは、それでも、クライアント・コンピューティング・デバイスを有するが、そのようなクライアント・コンピューティング・デバイスは、主にダム端末として働く。ユーザは、クライアント・コンピューティング・デバイスで入力を供給し、クライアント・コンピューティング・デバイスは、ユーザに出力を供給するが、そうでない場合には、すべてのアプリケーション・プログラム処理が、サーバ・コンピューティング・デバイスで実行される。そのような仮想クライアント・コンピューティング環境の例には、Ｍｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓ（登録商標）Ｔｅｒｍｉｎａｌ  Ｓｅｒｖｉｃｅｓ環境と、米国フロリダ州フォート・ローダーデールのＣｉｔｒｉｘ  Ｓｙｓｔｅｍｓ社から入手できる仮想クライアント・コンピューティング環境とが含まれる。
【０００４】
仮想クライアント・コンピューティング環境は、少なくとも２つの理由から有利である。第１に、コンピューティング・ユーザのクライアント・コンピューティング・デバイスは、入出力機能だけを実行するので、非常に洗練されたものである必要がない。その結果、ユーザあたりのコストが、実質的に低下する。最新の高価なプロセッサおよび他のハードウェア構成要素を有するのではなく、たとえば、クライアント・コンピューティング・デバイスは、より安価でより低速なプロセッサならびに他のより安価なハードウェア構成要素を有することができる。全体的な性能は、劣化しない。というのは、主なアプリケーション・プログラム処理が、クライアント・コンピューティング・デバイスではなくサーバ・コンピューティング・デバイスで実行されるからである。
【０００５】
第２に、そのような複数ユーザ・システムでの保守は、実質的に、クライアント・コンピューティング・デバイスではなくサーバ・コンピューティング・デバイス自体で実行される。たとえば、メモリ、処理能力、ハード・ディスク・ドライブ・ストレージなどのアップグレードは、クライアント・コンピューティング・デバイスではなくサーバ・コンピューティング・デバイスのこれらのリソースを増やすことによって実現される。その結果、ＩＴ担当者がこうむる保守コストが減らされる。というのは、ＩＴ担当者が、多数の定期的保守作業を実行するために各クライアント・コンピューティング・デバイスを訪れる必要がなくなるからである。
【０００６】
仮想クライアント・コンピューティング環境を使用することの欠点の１つが、グラフィックス処理の分野である。洗練されたグラフィックス処理は、通常、ソフトウェアだけではなく、少なくとも部分的に専用グラフィックス・ハードウェアによって実行される。グラフィックス関連コマンドは、ＯｐｅｎＧＬなどの標準規格に従って標準化されている。コンピューティング・デバイスで動作するアプリケーション・プログラムは、そのようなグラフィックス関連コマンドを、そのコンピューティング・デバイスで動作するオペレーティング・システムに供給する。オペレーティング・システムは、これらのコマンドをコンピューティング・デバイスのグラフィックス・ハードウェアに伝え、このグラフィックス・ハードウェアは、そのコンピューティング・デバイスのディスプレイ・デバイスでのレンダリングのためまたはアプリケーション・プログラムに戻って報告するために、それらのコマンドを処理する。専用グラフィックス・ハードウェアにグラフィックス関連コマンドを処理させることによって、そのようなグラフィックス関連コマンドが、ソフトウェアで、すなわち、専門のハードウェアによって支援されずに、他の任意のソフトウェアと同様に、コンピューティング・デバイスのプロセッサによって処理される場合より、通常、数桁高速のグラフィックス処理がもたらされる。
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかし、仮想クライアント・コンピューティング環境は、グラフィックス関連コマンドを処理するために専用グラフィックス・ハードウェアを活用するのに十分な位置にない。グラフィックス・ハードウェアが、クライアント・コンピューティング・デバイス自体に配置されている場合には、サーバ・コンピューティング・デバイス上の仮想クライアント・コンピューティング環境内で動作するクライアント・アプリケーション・プログラムは、そのグラフィックス・ハードウェア使用することができない。これは、クライアント・アプリケーション・プログラムが、サーバ・コンピューティング・デバイス上で提供されるオペレーティング・システムの境界の中で動作し、したがって、グラフィックス関連コマンドを処理するためのクライアント・コンピューティング・デバイス自体のグラフィックス・ハードウェアへのアクセスを有しないからである。さらに、そのようなアクセスが可能である場合であっても、クライアント・コンピューティング・デバイスに高価なグラフィックス・ハードウェアを追加することは、そもそも、クライアント・コンピューティング・デバイスに主にダム端末として働かせることによってコストを節約する、仮想クライアント・コンピューティング環境を有する目的を没却する。
【０００８】
さらに、グラフィックス・ハードウェアが、サーバ・コンピューティング・デバイスに配置される場合に、通常、そのグラフィックス・ハードウェアを、サーバ・コンピューティング・デバイス上の仮想クライアント・コンピューティング環境内で動作するクライアント・アプリケーション・プログラムによって使用することはできない。たとえば、Ｍｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓ（登録商標）環境では、グラフィックス・ハードウェアは、サーバ・コンピューティング・デバイスで動作するサーバ・アプリケーション・プログラムによってのみ直接にアクセスすることができ、サーバ・コンピューティング・デバイス上の仮想クライアント・コンピューティング環境内で動作するクライアント・アプリケーション・プログラムによって直接にアクセスすることはできない。
【０００９】
この問題に対するＬｉｎｕｘ（Ｒ）環境での解決策は、米国ニューヨーク州アーモンクのＩｎｔｅｒｎａｔｉｏｎａｌ  Ｂｕｓｉｎｅｓｓ  Ｍａｃｈｉｎｅｓ，Ｉｎｃ．，社から入手可能なＤｅｅｐ  Ｃｏｍｐｕｔｉｎｇ  Ｖｉｓｕａｌｉｚａｔｉｏｎ（ＤＣＶ）製品に見出される（Ｌｉｎｕｘは、米国、他国、またはその両方におけるＬｉｎｕｓ  Ｔｏｒｖａｌｄｓの登録商標である）。ＤＣＶは、一般に、サーバ・コンピューティング・デバイス上の仮想クライアント・コンピューティング環境内で動作するクライアント・アプリケーション・プログラムの出力が、サーバ・コンピューティング・デバイスではなくクライアント・コンピューティング・デバイスで表示される場合であっても、サーバ・コンピューティング・デバイスのグラフィックス・ハードウェアをそのクライアント・アプリケーション・プログラムによって活用することを可能にする。ＤＣＶは、さまざまなプロセス間通信（ＩＰＣ）機構を使用し、その結果、クライアント・アプリケーション・プログラムが、グラフィックス関連コマンドをサーバ・コンピューティング・デバイスのグラフィックス・ハードウェアに渡せるようにし、その後、このグラフィックス関連コマンドに対する応答が、プログラム自体に戻って渡されるか、クライアント・コンピューティング・デバイスで表示される。
【００１０】
しかし、ＤＣＶが、Ｍｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓ（登録商標）環境でのグラフィックス関連コマンド処理において最適より低い性能をもたらすことがわかっている。クライアント・コンピューティング・デバイスの利益のためにサーバ・コンピューティング・デバイスのグラフィックス・ハードウェアにアクセスすることの眼目が、グラフィックスの性能を高めることである限り、ＤＣＶの、最適より低い性能は、ＤＣＶがこの問題に対する適当な解決策ではないことを意味する。
【課題を解決するための手段】
【００１１】
本発明は、グラフィックス・ハードウェアによるグラフィックス関連コマンドの処理など、仮想クライアント・コンピューティング環境内でのコマンドのハードウェア処理に関する。
【００１２】
第１の態様によれば、グラフィックス・ハードウェアと、第１キューおよび第２キューと、仮想クライアント・コンピューティング環境と、サーバ・コンピューティング環境とを含むサーバ・コンピューティング・デバイスが提供される。グラフィックス・ハードウェアは、グラフィックス関連コマンドをグラフィックス関連コマンド応答の形に処理する。仮想クライアント・コンピューティング環境は、サーバ・コンピューティング・デバイスに通信可能に結合されたリモート・クライアント・コンピューティング・デバイスと相互作用する。仮想クライアント・コンピューティング環境は、グラフィックス関連コマンドを発行する符号化アプリケーションを含む。符号化アプリケーションは、グラフィックス関連コマンドを受け取り、グラフィックス関連コマンドを第１キューに置く第１スレッドを含む。符号化アプリケーションは、グラフィックス関連コマンド応答を第２キューから受け取り、グラフィックス関連コマンド応答をリモート・クライアント・コンピューティング・デバイスのディスプレイ・デバイスに通信する第２スレッドをも含む。サーバ・コンピューティング環境は、仮想クライアント・コンピューティング環境を管理し、復号アプリケーションを含む。復号アプリケーションは、グラフィックス関連コマンドを第１キューから受け取り、グラフィックス関連コマンドを処理のためにグラフィックス・ハードウェアに通信し、グラフィックス・ハードウェアからグラフィックス関連コマンド応答を受け取り、グラフィックス関連コマンド応答を第２キューに置く第３スレッドを含む。
【００１３】
好ましくは、Ｍｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓ（登録商標）ベースのサーバ・コンピューティング・デバイス上の仮想クライアント・コンピューティング環境内で動作するクライアント・アプリケーション・プログラムが、クライアント・コンピューティング・デバイスの利益のためにそのようなサーバ・コンピューティング・デバイスのグラフィックス・ハードウェアを活用することを可能にする機能がもたらされる。そのような活用は、好ましくは、グラフィックス・ハードウェアがクライアント・コンピューティング・デバイス自体にインストールされ、クライアント・アプリケーション・プログラムによってアクセス可能であるかのような性能とほぼ等しい性能をもたらす。
【００１４】
第２の態様によれば、ハードウェアと、仮想クライアント・コンピューティング環境と、サーバ・コンピューティング環境とを含むサーバ・コンピューティング・デバイスが提供される。ハードウェアは、ソフトウェアだけで達成できるよりすばやく特定のコマンドを応答の形に処理する。仮想クライアント・コンピューティング環境は、サーバ・コンピューティング・デバイスに通信可能に結合されたリモート・クライアント・コンピューティング・デバイスと相互作用し、特定のコマンドを発行し、第１スレッドと第２スレッドとを含む。サーバ・コンピューティング環境は、仮想クライアント・コンピューティング環境を管理し、第３スレッドを含む。第１スレッドは、仮想クライアント・コンピューティング環境内で発行された特定のコマンドを受け取り、それらのコマンドを第１キューに置く。第２スレッドは、応答を第２キューから受け取り、それらの応答をリモート・クライアント・コンピューティング・デバイスの対応するハードウェアに通信する。第３スレッドは、特定のコマンドを第１キューから受け取り、それらのコマンドを処理のためにハードウェアに通信し、ハードウェアから応答を受け取り、それらの応答を第２キューに置く。
【００１５】
第３の態様によれば、サーバ・コンピューティング・デバイスの仮想クライアント・コンピューティング環境内で動作する符号化アプリケーションによって発行される時に、グラフィックス関連コマンドをサーバ・コンピューティング・デバイスの仮想クライアント・コンピューティング環境の第１スレッドによって受け取ることを含む方法が提供される。仮想クライアント・コンピューティング環境は、サーバ・コンピューティング・デバイスに通信可能に結合されたリモート・クライアント・コンピューティング・デバイスと相互作用する。サーバ・コンピューティング環境は、仮想クライアント・コンピューティング環境を管理する。第１スレッドは、グラフィックス関連コマンドを第１キューに置く。サーバ・コンピューティング環境の第３スレッドは、グラフィックス関連コマンドを第１キューから受け取る。第３スレッドは、グラフィックス関連コマンドを、グラフィックス関連コマンド応答の形に処理するためにサーバ・コンピューティング・デバイスのグラフィックス・ハードウェアに通信する。第３スレッドは、グラフィックス関連コマンド応答をグラフィックス・ハードウェアから受け取り、これを第２キューに置く。仮想クライアント・コンピューティング環境の第２スレッドは、グラフィックス関連コマンド応答を第２キューから受け取り、これをリモート・クライアント・コンピューティング・デバイスのディスプレイ・デバイスに通信する。
【００１６】
第４の態様によれば、コンピュータ可読媒体と、媒体内の第１、第２、および第３の手段とを含む製造品が提供される。媒体は、記録可能データ記憶媒体、変調された搬送波信号、または別のタイプのコンピュータ可読媒体とすることができる。第１手段は、仮想クライアント・コンピューティング環境内で発行されたコマンドを受け取り、コマンドを第１キューに置く。第２手段は、第２キューから応答を受け取り、これらの応答を仮想クライアント・コンピューティング環境に関連するリモート・クライアント・コンピューティング・デバイスの対応するハードウェアに通信する。第３手段は、第１キューからコマンドを受け取り、これらのコマンドを応答への処理のためにハードウェアに通信し、ハードウェアから応答を受け取り、これらの応答を第２キューに置く。
【００１７】
本発明の実施形態は、従来技術に優る利益をもたらす。上で説明したＤｅｅｐ  Ｃｏｍｐｕｔｉｎｇ  Ｖｉｓｕａｌｉｚａｔｉｏｎ（ＤＣＶ）従来技術に似て、本発明の実施形態は、リモート・クライアント・コンピューティング・デバイスのディスプレイ・デバイスに情報を表示するためのサーバ・コンピューティング・デバイス上で動作するクライアント・アプリケーション・プログラムによる使用のためにサーバ・コンピューティング・デバイスのグラフィックス・ハードウェアを活用する。しかし、本発明の実施形態に固有のアーキテクチャは、ＤＣＶおよび他の従来技術に優る大きい性能の利益をもたらす。たとえば、上で説明したスレッドおよびキューの特定の利用は、本発明の実施形態に、ＤＣＶおよび他の従来技術に優る大きい性能の向上を与える。
【００１８】
本発明の他の利益、態様、および実施形態は、次の詳細な説明を読み、添付図面を参照することによって明白になる。
【００１９】
本発明の実施形態を、これから、図面を参照して、例としてのみ説明する。
【発明を実施するための最良の形態】
【００２０】
本発明の例示的実施形態の次の詳細な説明では、本明細書の一部を形成する添付図面を参照するが、添付図面には、例として、本発明を実践できる特定の例示的実施形態が示されている。これらの実施形態は、当業者が本発明を実践できるようにするのに十分に詳細に説明される。本発明の趣旨または範囲から逸脱せずに、他の実施形態を利用することができ、論理的変更、機械的変更、および他の変更を行うことができる。したがって、次の詳細な説明は、限定的な意味で解釈されてはおらず、本発明の範囲は、添付の特許請求の範囲のみによって定義される。
【００２１】
図１に、本発明の実施形態による、仮想クライアント・コンピューティング環境を達成するコンピュータ・アーキテクチャ１００を示す。仮想クライアント・コンピューティング環境は、Ｍｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓ（登録商標）Ｔｅｒｍｉｎａｌ  Ｓｅｒｖｉｃｅｓ環境、米国フロリダ州フォート・ローダーデールのＣｉｔｒｉｘ  Ｓｙｓｔｅｍｓ社が提供する仮想クライアント・コンピューティング環境、または別のタイプのターミナル・サービスもしくは仮想クライアント・コンピューティング環境とすることができる。コンピュータ・アーキテクチャ１００は、サーバ・コンピューティング・デバイス１０２およびリモート・クライアント・コンピューティング・デバイス１０４を含む。
【００２２】
サーバ・コンピューティング・デバイス１０２は、主にソフトウェア・アプリケーションである仮想クライアント・コンピューティング環境１０８およびサーバ・コンピューティング環境１１０と、プロセッサ１１４、グラフィックス・ハードウェア１１６、および例示の都合上図１には図示されていないがサーバ・コンピューティング・デバイスに一般的に見られる他のタイプのハードウェアとを含む。仮想クライアント・コンピューティング環境１０８は、リモート・クライアント・コンピューティング・デバイス１０４に対応する。リモート・クライアント・コンピューティング・デバイス１０４のユーザに関する入力および出力のすべてまたは実質的にすべてが、リモート・クライアント・コンピューティング・デバイス１０４で実行される。しかし、そのような出力を提供するためのそのような入力の処理のすべてまたは実質的にすべてが、仮想クライアント・コンピューティング環境１０８内で達成される。したがって、仮想クライアント・コンピューティング環境１０８は、リモート・クライアント・コンピューティング・デバイス１０４と相互作用すると言われ、リモート・クライアント・コンピューティング・デバイス１０４は、ネットワークまたは他の機構を介してサーバ・コンピューティング・デバイス１０２に通信可能に結合される。１つだけの仮想クライアント・コンピューティング環境および１つだけのリモート・クライアント・コンピューティング・デバイス１０４が図１に示されているが、実際には、通常、複数のそのようなコンピューティング環境および複数のそのようなクライアント・コンピューティング・デバイスがある。
【００２３】
仮想クライアント・コンピューティング環境１０８は、オペレーティング・システム内の１セッションとして動作する。したがって、クライアント・アプリケーション１１２などのクライアント・アプリケーション・プログラムは、リモート・クライアント・コンピューティング・デバイス１０４のコンピュータ・ユーザ用の仮想クライアント・コンピューティング環境１０８内で動作する。仮想クライアント・コンピューティング環境１０８は、一実施形態で、サーバ・コンピューティング・デバイス１０２のそれ自体のパーティション内で動作することができる。サーバ・コンピューティング環境１１０は、すべての仮想クライアント・コンピューティング環境に関する管理する環境であり、したがって、仮想クライアント・コンピューティング環境１０８を管理する。たとえば、サーバ・コンピューティング環境１１０は、仮想クライアント・コンピューティング環境内で動作するクライアント・アプリケーション・プログラムなど、仮想クライアント・コンピューティング環境の実行および管理を管理する責任を負うものとすることができ、また、そのような仮想クライアント・コンピューティング環境のインスタンス化および削除の責任を負うものとすることができる。サーバ・コンピューティング環境１１０は、一実施形態で、サーバ・コンピューティング・デバイス１０２のそれ自体のパーティション内で動作することができる。
【００２４】
したがって、ユーザは、クライアント・アプリケーション１１２がリモート・クライアント・コンピューティング・デバイス１０４にインストールされたオペレーティング・システム上で動作しているかのように、リモート・クライアント・コンピューティング・デバイス１０４と対話する。しかし、実際には、オペレーティング・システムは、サーバ・コンピューティング・デバイス１０２にインストールされている。ユーザからの入力は、プロセッサ１１４およびグラフィックス・ハードウェア１１６などのサーバ・コンピューティング・デバイス１０２のハードウェア・リソースを使用する、クライアント・アプリケーション１１２および仮想クライアント・コンピューティング環境１０８内の他のアプリケーションによる処理のために、リモート・クライアント・コンピューティング・デバイス１０４から仮想クライアント・コンピューティング環境１０８に伝えられる。次に、ユーザへの出力が、クライアント・アプリケーション１１２または仮想クライアント・コンピューティング環境１０８内の他のアプリケーションからリモート・クライアント・コンピューティング・デバイス１０４に伝えられ、リモート・クライアント・コンピューティング・デバイス１０４で、たとえばリモート・クライアント・コンピューティング・デバイス１０４のディスプレイ・デバイス１０６に、その出力を表示することができる。
【００２５】
したがって、リモート・クライアント・コンピューティング・デバイス１０４は、ダム端末として働く。クライアント・コンピューティング・デバイス１０４は、ユーザから入力を受け取り、ユーザに出力を表示するが、入力および出力自体は、サーバ・コンピューティング・デバイス１０２で、仮想クライアント・コンピューティング環境１０８内で処理される。したがって、たとえば、処理能力のアップグレードが必要な場合に、サーバ・コンピューティング・デバイス１０２のハードウェアだけをアップグレードする必要があり、リモート・クライアント・コンピューティング・デバイス１０４のハードウェアをアップグレードする必要はない。通常、ターミナル・サービスおよび他のタイプの仮想クライアント・コンピューティング環境に帰することのできる他の利益も、図１のコンピュータ・アーキテクチャ１００によって実現される。したがって、仮想クライアント・コンピューティング環境１０８は、コンピュータ・ユーザ自身のリモート・クライアント・コンピューティング・デバイス１０４に配置されるのではなく、通常はそのコンピュータ・ユーザによって物理的にアクセス可能ではないサーバ・コンピューティング・デバイス１０２に配置されるという点で、仮想環境である。
【００２６】
図２に、本発明の実施形態による、仮想クライアント・コンピューティング環境内で動作するクライアント・アプリケーション・プログラムによる高性能グラフィックス処理を達成するサーバ・コンピューティング・デバイス１０２のアーキテクチャをより詳細に示す。仮想クライアント・コンピューティング環境１０８は、ソフトウェアである符号化アプリケーション２０２を含む。サーバ・コンピューティング環境１１０は、やはりソフトウェアである復号アプリケーション２０４を含む。サーバ・コンピューティング・デバイス１０２は、仮想クライアント・コンピューティング環境１０８とサーバ・コンピューティング環境１１０との間で共用される第１キュー２１０および第２キュー２１２をも含む。第１キュー２１０および第２キュー２１２は、本発明の一実施形態で、従来のＭｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓ（登録商標）アプリケーション・プログラミング・インターフェース（ＡＰＩ）によって作成することができる。符号化アプリケーション２０２は、第１スレッド２０６および第２スレッド２０８を含み、復号アプリケーション２０４は、第３スレッド２１４を含む。スレッドは、より大きいプロセスまたはプログラムの一部である。したがって、第１スレッド２０６および第２スレッド２０８は、符号化アプリケーション２０２の一部であり、第３スレッド２１４は、復号アプリケーション２０４の一部である。符号化アプリケーション２０２および復号アプリケーション２０４は、第１キュー２１０および第２キュー２１２を共用する。
【００２７】
図２のアーキテクチャは、次のように動作する。第１スレッド２０６は、符号化アプリケーション２０２内からグラフィックス関連コマンドを受け取る。このグラフィックス関連コマンドは、プロセッサ１１４によって実行されるものなど、実質的にまたは完全にソフトウェア内であるものと比較して、グラフィックス・ハードウェア１１６によってよりすばやくグラフィックス関連コマンド応答の形に処理されるコマンドとすることができる。すなわち、グラフィックス関連コマンドは、最大の性能の利益をもたらすためにグラフィックス・ハードウェアによって処理される。グラフィックス関連コマンドは、ＯｐｅｎＧＬグラフィックス関連コマンドまたは他のタイプのグラフィックス関連コマンドとすることができる。
【００２８】
符号化アプリケーション２０２の第１スレッド２０６は、矢印２１８によって示されるように、グラフィックス関連コマンドを第１キュー２１０に置く。グラフィックス関連コマンドを第１キュー２１０に置くことが、第１キュー２１０を空でなくするすなわち、第１スレッド２０６がグラフィックス関連コマンドを第１キュー２１０に置く前に第１キュー２１０が空であった場合には、第１スレッド２０６は、復号アプリケーション２０４の第３スレッド２１４をも覚醒させる。第３スレッド２１４は、矢印２２０によって示されるように、第１キュー２１０からグラフィックス関連コマンドを受け取る、すなわち消費する。
【００２９】
第３スレッド２１４は、矢印２２２によって示されるように、グラフィックス関連コマンドをグラフィックス・ハードウェア１１６に通信し、グラフィックス・ハードウェア１１６は、そのコマンドをグラフィックス関連コマンド応答の形に処理する。グラフィックス・ハードウェア１１６は、プロセッサ１１４によるなど、応答へのコマンドの通常のソフトウェア処理が通常達成できるよりすばやく、グラフィックス関連コマンドをグラフィックス関連コマンド応答の形に処理する。第３スレッド２１４は、やはり矢印２２２によって示されるように、グラフィックス・ハードウェア１１６からグラフィックス関連コマンド応答を受け取る。
【００３０】
復号アプリケーション２０４の第３スレッド２１４は、矢印２２４によって示されるように、グラフィックス関連コマンド応答を第２キュー２１２に置く。グラフィックス関連コマンド応答を第２キュー２１２に置くことが、第２キュー２１２を空でなくするすなわち、第３スレッド２１４がグラフィックス関連コマンド応答を第２キュー２１２に置く前に第２キュー２１２が空であった場合に、第３スレッド２１４は、符号化アプリケーション２０２の第２スレッド２０８をも覚醒させる。第２スレッド２０８は、矢印２２６によって示されるように、第２キュー２１２からグラフィックス関連コマンド応答を受け取る、すなわち消費する。第２スレッド２０８は、矢印２２８によって示されるように、グラフィックス関連コマンド応答をリモート・クライアント・コンピューティング・デバイス１０４のディスプレイ・デバイス１０６に通信する。たとえば、この応答が、ディスプレイ・デバイス１０６に表示されるビットマップである場合に、第２スレッド２０８は、その応答をディスプレイ・デバイス１０６に通信する。
【００３１】
この形で、図２に示された本発明の実施形態は、ディスプレイ・デバイス１０６がグラフィックス・ハードウェア１１６に直接に接続されていない場合であっても、リモート・クライアント・コンピューティング・デバイス１０４のディスプレイ・デバイス１０６による最終的な表示のためのグラフィックス・ハードウェア１１６による機能強化されたグラフィックス関連コマンド処理を提供する。説明したＤｅｅｐ  Ｃｏｍｐｕｔｉｎｇ  Ｖｉｓｕａｌｉｚａｔｉｏｎ（ＤＣＶ）従来技術と比較して、図２の実施形態は、説明したように、３つのスレッドすなわち第１スレッド２０６、第２スレッド２０８、および第３スレッド２１４ならびに２つのキューすなわち第１キュー２１０および第２キュー２１２を使用する。この３つのスレッドすなわち第１スレッド２０６、第２スレッド２０８、および第３スレッド２１４およびこの２つのキューすなわち第１キュー２１０および第２キュー２１２の利用は、図２の実施形態に、ＤＣＶ従来技術ならびに他の従来技術に優る性能の利益を与える。
【００３２】
複数の特殊な状況と特定の態様およびより一般的な態様とを、これから、図２のサーバ・コンピューティング・デバイス１０２のアーキテクチャの動作に関して説明する。第１に、第１キュー２１０が、完全に満杯であり、第１スレッド２０６が第１キュー２１０により多くのグラフィックス関連コマンドを置くことができない場合がある。そのような場合には、第１スレッド２０６は、第１キュー２１０がもはや完全に満杯ではなくなり、その結果、第１スレッド２０６がより多くのグラフィックス関連コマンドを第１キュー２１０に置くことがもう一度可能になるまで、ブロックするか待機する。第１キュー２１０は、第３スレッド２１４が第１キュー２１０からグラフィックス関連コマンドを受け取るか消費する時に、満杯ではなくなる。第３スレッド２１４が、第１キュー２１０からコマンドを受け取るか消費し、これが、第１キュー２１０を満杯から非満杯に遷移させる時に、一実施形態で、これが、第１スレッド２０６を覚醒させて、第１スレッド２０６に、それが再び第１キュー２１０にコマンドを置くことができることを示す。本発明の一実施形態で達成されるスレッドの覚醒は、従来のスレッド間Ｍｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓ（登録商標）イベントを送ることによって達成することができる。
【００３３】
第２に、同様に、第２キュー２１２が完全に満杯であり、第３スレッド２１４が、第２キュー２１２により多くのグラフィックス関連コマンド応答を置くことができない場合がある。そのような状況で、第３スレッド２１４は、第２キュー２１２がもはや完全に満杯ではなくなり、その結果、第３スレッド２１４が第２キュー２１２により多くのグラフィックス関連コマンド応答をもう一度置くことができるようになるまでブロックするか待機する。第２キュー２１２は、第２スレッド２０８が第２キュー２１２からグラフィックス関連コマンド応答を受け取るか消費する時に満杯ではなくなる。第２スレッド２０８が、第２キュー２１２から応答を受け取るか消費し、これによって第２キュー２１２を満杯から非満杯に遷移させる時に、一実施形態で、第２スレッド２０８は、第３スレッド２１４を覚醒させて、第３スレッド２１４がもう一度第２キュー２１２に応答を置くことができることを第３スレッド２１４に示す。
【００３４】
第３に、図２の実施形態では、第２キュー２１２で供給されるグラフィックス関連コマンド応答を第１キュー２１０で供給されるグラフィックス関連コマンドに関連付けるための備えがないことに留意されたい。これは、グラフィックス関連コマンド、特にＯｐｅｎＧＬグラフィックス関連コマンドなどが、２つのカテゴリすなわち非同期式コマンドおよび同期式コマンドに分類される場合があるからである。前者は、グラフィックス関連コマンドを生成する符号化アプリケーション２０２が応答を必要としないコマンドである。そのようなコマンドには、特にＯｐｅｎＧＬグラフィックス関連コマンドの大多数である、ｖｏｉｄを返すコマンド、ならびに符号化アプリケーション２０２に関連するグラフィックス・ハードウェア・フレーム・バッファの内容を返す、ＯｐｅｎＧＬ  ＳｗａｐＢｕｆｆｅｒｓコマンドの特殊事例を含めることができる。このフレーム・バッファは、ディスプレイ・デバイス１０６に送られるが、符号化アプリケーション２０２は、これが発生したことを通知される必要がない。したがって、第２スレッド２０８は、ＳｗａｐＢｕｆｆｅｒｓコマンドに対する応答を第２キュー２１２から非同期に消費する。
【００３５】
したがって、グラフィックス関連コマンドの大部分が、通常は非同期式コマンドなので、第２キュー２１２で供給されるグラフィックス関連コマンド応答を第１キュー２１０で供給されるグラフィックス関連コマンドに関連付ける必要はない。グラフィックス関連コマンド応答を、グラフィックス関連コマンドと独立に処理することができ、後者を前者と同期化する必要はない。言い換えると、符号化アプリケーション２０２の第１スレッド２０６および第２スレッド２０８は、グラフィックス関連コマンドの大多数について、少なくとも実施的に独立に動作する。第１スレッド２０６は、グラフィックス関連コマンドを受け取る時に、それらを第１キュー２１０に置き、第２スレッド２０８は、第２キュー２１２からグラフィックス関連コマンド応答を受け取る時に、それらをディスプレイ・デバイス１０６に伝える。したがって、前者のアクティビティは、後者のアクティビティから分離されている。
【００３６】
しかし、一部のグラフィックス関連コマンドは、実際に同期式である。同期式コマンドとは、そのコマンドを生成した符号化アプリケーション２０２が、戻り値を必要とするコマンドである。同期式グラフィックス関連コマンドは、比較的低い頻度で発生する。したがって、そのようなコマンドに出会う時には、次の機構が使用される。第１スレッド２０６が、同期式グラフィックス関連コマンドを第１キュー２１０に置く時に、第１スレッド２０６は、ブロックし、このコマンドに対する応答が第２キュー２１２に到着するのを待つ。第２スレッド２０８は、当業者が了解できるとおり、第２キュー２１２から同期式コマンド応答を受け取るか消費する時に、矢印２３０によって示されるように、Ｍｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓ（登録商標）メッセージング・イベントを使用することによるなど、第１スレッド２０６にシグナリングするか、他の形で第１スレッド２０６に通知する。第１スレッド２０６は、これに対応して覚醒し、第２キュー２１２から結果（第２スレッド２０８によって供給できる）を読み取り、その結果を符号化アプリケーション２０２内に返す。この処理または機構を、第１スレッド２０６と第２スレッド２０８との間のランデブーと称する。
【００３７】
第４に、第２スレッド２０８が、次のように符号化アプリケーション２０２の第１スレッド２０６に加えて必要であることに留意されたい。第１スレッド２０６は、同期式コマンドの結果が入手可能になるまでブロックする場合であっても、第２キュー２１２内で供給される応答をも処理するのではなく、第２スレッド２０８が、第２キュー２１２内で供給される応答を処理する。というのは、ＳｗａｐＢｕｆｆｅｒｓコマンドなどの非同期式コマンドも応答を返すことができるからである。第１スレッド２０６は、非同期式コマンドを第１キュー２１０にキューイングした直後に、符号化アプリケーション２０２にプロセッサ制御を返し、符号化アプリケーション２０２が、プロセッサ制御に、非同期式コマンドに対する応答を処理するために第１スレッド２０６をもう一度実行させる保証はない。その結果、第２スレッド２０８が、非同期式コマンドによって生成される応答をタイムリーな形で処理できるようにするために設けられる。
【００３８】
第５に、一般に、各仮想クライアント・コンピューティング環境内の符号化アプリケーションごとに、本発明の一実施形態で第１スレッド２０６および第２スレッド２０８というスレッドの対があることに留意されたい。符号化アプリケーション２０２は、ＯｐｅｎＧＬグラフィックス関連コマンドなどのグラフィックス関連コマンドを作成するという点でエンコーダである。復号アプリケーション２０４は、ビットマップまたはグラフィックス・レンダリング状態などの応答を作るためにこれらのコマンドをレンダリングするという点でデコーダである。
【００３９】
特に、ＯｐｅｎＧＬグラフィックス関連コマンドの大多数が非同期式なので、符号化アプリケーションは、コマンドを作成したならば、符号化アプリケーションの処理を継続するためにそのコマンドの完了を待つ必要がない。符号化アプリケーション２０２は、復号アプリケーション２０４による後の処理のために、単純にコマンドを第１キュー２１０内にキューイングすることができる。同様に、上で説明したように、復号アプリケーション２０４は、グラフィックス関連コマンドをグラフィックス関連コマンド応答の形に非同期に処理し、符号化アプリケーション２０２による後の処理のために第２キュー２１２内にその応答をキューイングすることができる。
【００４０】
図３に、本発明の実施形態に従って、第１キュー２１０または第２キュー２１２として使用できる代表的なキュー３０２を示す。キュー３０２を、作成スレッド３１０および消費スレッド３１２に関して説明する。キュー３０２が、第１キュー２１０として使用される場合には、第１スレッド２０６が作成スレッド３１０であり、第３スレッド２１４が消費スレッド３１２である。キュー３０２が、第２キュー２１２として使用される場合には、第３スレッド２１４が作成スレッド３１０であり、第２スレッド２０８が消費スレッド３１２である。
【００４１】
キュー３０２は、集合的にキュー・エントリ３０４と称する、複数のキュー・エントリ３０４Ａ、３０４Ｂ、３０４Ｃ、…、３０４Ｎを有する。キュー・エントリ３０４のそれぞれは、キュー３０２が第１キュー２１０を実施する場合にはグラフィックス関連コマンドを格納することができ、キュー３０２が第２キュー２１２を実施する場合にはグラフィックス関連コマンド応答を格納することができる。キュー３０２に関連する２つのポインタすなわち、ヘッド・ポインタ３０６およびテール・ポインタ３０８がある。ヘッド・ポインタ３０６は、通常、コマンドまたはコマンド応答を置くことができる、空である次のキュー・エントリをポイントし、テール・ポインタ３０８は、通常、消費される次のコマンドまたはコマンド応答を含むキュー・エントリをポイントする。
【００４２】
しかし、テール・ポインタ３０８は、キュー３０２が完全に空の場合には空のキュー・エントリをポイントする。そのような状況では、テール・ポインタ３０８は、ヘッド・ポインタ３０６と同一の空のキュー・エントリをポイントし、その結果、テール・ポインタ３０８が空のキュー・エントリをポイントし、ヘッド・ポインタ３０６とテール・ポインタ３０８との両方が同一の空のキュー・エントリをポイントする時には、キューが完全に空であることがわかるようになる。したがって、最初の開始時には、キュー３０２が空であり、ヘッド・ポインタ３０６とテール・ポインタ３０８との両方が、最初のキュー・エントリ３０４Ａをポイントする。さらに、ヘッド・ポインタ３０６は、キュー３０２が完全に満杯の場合に、占められているキュー・エントリをポイントすることに留意されたい。そのような状況では、ヘッド・ポインタ３０６は、テール・ポインタ３０８がポイントするのと同一の占められているキュー・エントリをポイントし、その結果、ヘッド・ポインタ３０６が占められているキュー・エントリをポイントし、ヘッド・ポインタ３０６とテール・ポインタ３０８との両方が同一の占められているキュー・エントリをポイントする時には、キューが完全に満杯であることがわかるようになる。
【００４３】
作成スレッド３１０は、コマンドまたは応答をキュー・エントリに置かなければならない時に、そのコマンドまたは応答をヘッド・ポインタ３０６によってポイントされるキュー・エントリに置き、ヘッド・ポインタ３０６を、本発明の一実施形態では右（あるいは、別の実施形態では左）に１キュー・エントリだけ進める。ヘッド・ポインタ３０６が、既に最後のキュー・エントリ３０４Ｎをポイントしている場合には、ヘッド・ポインタ３０６は、最初のキュー・エントリ３０４Ａをポイントするようにロール・オーバーする。作成スレッド３１０が、ヘッド・ポインタ３０６によってポイントされるキュー・エントリが空である場合に限って、そのキュー・エントリにコマンドまたは応答を置くことに留意されたい。
【００４４】
しかし、作成スレッド３１０は、次のキュー・エントリが満杯である場合であっても、コマンドまたは応答をキュー３０２に置いた後に、ヘッド・ポインタ３０６を右側（あるいは、もう１つの実施形態では左側）の次のキュー・エントリに必ず進める。これは、コマンドおよび応答が、先入れ先出し（ＦＩＦＯ）の形で置かれ、消費されるからである。右側（あるいは、もう１つの実施形態では左側）の次のキュー・エントリが満杯であってもヘッド・ポインタ３０６をこのキュー・エントリに進めることが達成されるのは、満杯または占められている場合の、この、次のキュー・エントリが、消費スレッド３１２によって消費される次のキュー・エントリであり、このキュー・エントリが、次に空になるエントリであるからである。すなわち、この、次のキュー・エントリは、そのような場合にテール・ポインタ３０８によってポイントされることが保証されている。
【００４５】
消費スレッド３１２は、キュー・エントリ内のコマンドまたは応答を受け取るか消費しなければならない時に、テール・ポインタ３０８によってポイントされるコマンドまたは応答を受け取るか消費し、テール・ポインタ３０８を、本発明の一実施形態では右側（あるいは、もう１つの実施形態では左側）に１キュー・エントリだけ進める。テール・ポインタ３０８が、既に最後のキュー・エントリ３０４Ｎをポイントしている場合には、テール・ポインタ３０８は、最初のキュー・エントリ３０４Ａをポイントするようにロール・オーバーする。消費スレッド３１２が、テール・ポインタ３０８によってポイントされるキュー・エントリが占められている場合に限って、そのキュー・エントリからコマンドまたは応答を受け取るか消費することに留意されたい。
【００４６】
しかし、消費スレッド３１２は、次のキュー・エントリが空である場合であっても、コマンドまたは応答をキュー３０２から受け取るか消費した後に、テール・ポインタ３０８を右側（あるいは、もう１つの実施形態では左側）の次のキュー・エントリに必ず進める。前と同様に、これは、コマンドおよび応答が、ＦＩＦＯの形で置かれ、消費されるからである。右側（あるいは、もう１つの実施形態では左側）の次のキュー・エントリが空であってもテール・ポインタ３０８をこのキュー・エントリに進めることが達成されるのは、空である場合の、この、次のキュー・エントリが、別のコマンドまたは応答が作成スレッド３１０によって置かれる次のキュー・エントリであり、このキュー・エントリが、占められるか満杯になるからである。すなわち、この、次のキュー・エントリは、そのような場合にヘッド・ポインタ３０６によってポイントされることが保証されている。
【００４７】
本発明のもう１つの実施形態では、キュー３０２は、ヘッド・ポインタ３０６およびテール・ポインタ３０８が同一のキュー・エントリをポイントする時に空であると考えられ、キュー３０２は、ヘッド・ポインタ３０６を増分することによって、ヘッド・ポインタ３０６がテール・ポインタ３０８と等しくなるかこれを超える時に満杯であると考えられる。したがって、スレッドは、本発明のこの実施形態では、ヘッド・ポインタ３０６を増分することによって、ヘッド・ポインタ３０６がテール・ポインタ３０８と等しくなる場合には、ヘッド・ポインタ３０６を増分しない。本発明を実施するためには、前の段落で説明した実施形態、この段落で説明した実施形態、または本発明の別の実施形態のいずれかを実施することができる。
【００４８】
キュー３０２のヘッド・ポインタ３０６およびテール・ポインタ３０８を進めることが、望ましくは同期化され、当業者によって了解されるように、これをＭｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓ（登録商標）ＡＰＩ  ＩｎｔｅｒｌｏｃｋｅｄＣｏｍｐａｒｅＥｘｃｈａｎｇｅＰｏｉｎｔｅｒ（）の使用によって達成できることに留意されたい。作成スレッド３１０は、満杯のキューにエントリを追加することを許可されず、消費スレッド３１２は、エントリを空のキューから消費することを許可されない。この理由から、ヘッド・ポインタ３０６およびテール・ポインタ３０８を進めることまたはその移動を同期化することが望ましい。
【００４９】
図４に、本発明の実施形態による、キュー３０２のキュー・エントリ３０４のいずれかとして使用できる代表的なキュー・エントリ４０２を示す。キュー・エントリ４０２は、集合的にバイト４０４と称する複数のバイト４０４Ａ、４０４Ｂ、４０４Ｃ、…、４０４Ｍからなる。一実施形態で、最初の２つのバイト４０４Ａおよび４０４Ｂは、グラフィックス関連コマンドまたはグラフィックス関連コマンド応答のオペコード４０６を示すのに使用される。たとえば、ＯｐｅｎＧＬコマンドおよびＯｐｅｎＧＬ応答は、長さ２バイトの割り当てられたｕｎｓｉｇｎｅｄ  ｓｈｏｒｔ整数であるオペコードによって識別される。残りのバイト４０４Ｃから４０４Ｍまでは、グラフィックス関連コマンドおよびコマンド応答のパラメータ４０８を表すのに使用され、このパラメータ４０８は、問題のコマンドまたは応答に依存して、個数およびフォーマットにおいて変化する。たとえば、ＯｐｅｎＧＬコマンドｇｌＶｅｒｔｅｘ３ｆｖは、それぞれが型ＧＬｆｌｏａｔである３つのパラメータを使用する。
【００５０】
一実施形態で、キュー・エントリ４０２は、それが保持するグラフィックス関連コマンドまたはコマンド応答のタイプに関わりなく固定サイズを有し、一部のバイト４０４が所与のコマンドまたは応答についてキュー・エントリ４０２によって使用されない場合が生じるようになっている。言い換えると、一部のグラフィックス関連コマンドおよびコマンド応答が、他のコマンドまたはコマンド応答より長い場合がある。したがって、この実施形態のキュー・エントリ４０２は、最長のグラフィックス関連コマンドまたはコマンド応答を保持するサイズにされ、その結果、キュー・エントリ４０２が、必要に応じて任意のグラフィックス関連コマンドまたはコマンド応答を保持できることが保証されるようになっている。
【００５１】
図５、６、７、および８に、それぞれ、本発明のさまざまな実施形態による、仮想クライアント・コンピューティング環境内で高性能グラフィックス関連コマンド処理を達成する方法５００、５２０、５４０、および５６０を示す。方法５００、５２０、５４０、および５６０は、一緒に、そのような高性能グラフィックス関連コマンド処理を達成する単一の方法を形成する。しかし、方法５００、５２０、５４０、および５６０を、実質的に互いと同時に、互いと相対的に独立に実行することができる。方法５００、５２０、５４０、および５６０が実行されるかどうかは、それぞれ、第１キュー２１０に置かれるコマンドがあるかどうか、第１キュー２１０に消費されるコマンドがあるかどうか、第２キュー２１２に置かれる応答があるかどうか、および第２キュー２１２に消費される応答があるかどうかに、大いに依存する。
【００５２】
まず図５を参照すると、方法５００は、仮想クライアント・コンピューティング環境１０８内で、その中で動作する符号化アプリケーション２０２などによって発行されるものとすることができるグラフィックス関連コマンドが第１スレッド２０６によって受け取られる時（５０２）に実行される。第１スレッド２０６は、そのグラフィックス関連コマンドを第１キュー２１０に置くことを試みる（５０４）。第１キュー２１０のヘッド・ポインタによってポイントされるキュー・エントリが満杯である場合（５０６）には、第１スレッド２０６は、第３スレッド２１４によって覚醒されるまでブロックする（５０８）。ある点で、このキュー・エントリが、空であるか空になり、第１スレッド２０６が、ヘッド・ポインタによってポイントされるキュー・エントリにコマンドを置く（５１０）。その後、第１スレッド２０６は、ヘッド・ポインタを第１キュー２１０内の次のキュー・エントリに進める（５１２）。
【００５３】
部分５１０でのヘッド・ポインタによってポイントされるキュー・エントリへのコマンドの配置が、第１キュー２１０を空でなくする（５１４）（すなわち、第１キュー２１０が、前には空であったが今はもはや空ではない）場合に、第１スレッド２０６は、第３スレッド２１４がこのコマンドを消費するようにするために、第３スレッド２１４を覚醒させる（５１６）こともできる。その後、方法５００は、終了するが（５１８）、第１キュー２１０への配置のために第１スレッド２０６によってグラフィックス関連コマンドが受け取られるたびに繰り返される。すなわち、方法５００は、第１スレッド２０６が、グラフィックス関連コマンドを発行するために符号化アプリケーションによって進入されるたびに繰り返される。
【００５４】
次に図６を参照すると、方法５２０は、グラフィックス関連コマンドが第１キュー２１０から第３スレッド２１４によって受け取られなければならない時に実行される。方法５２０を、第３スレッド２１４が第１キュー２１０からグラフィックス関連コマンドを受け取ることを試みる（５２２）時に実行されることに関連して開始されるものとして説明する。したがって、第１キュー２１０のテール・ポインタによってポイントされるキュー・エントリが空である場合（５２４）には、第３スレッド２１４は、現在は第１キュー２１０に消費されるべきコマンドがあることを示すために第１スレッド２０６によって覚醒されるまで、ブロックする（５２６）。実際には、その後、方法５２０が、部分５２６で開始される。というのは、当初に、第１キュー２１０にコマンドがある状態になるまで、方法５２０が覚醒されないからである。しかし、方法５２０は、図６では、例示の一貫性および図５の方法５００との対応のために、部分５２２で第１キュー２１０からのグラフィックス関連コマンドの受取を試みることによって開始されるものとして示されている。
【００５５】
したがって、最終的に、第３スレッド２１４は、テール・ポインタによってポイントされるキュー・エントリのコマンドを受け取る（５２８）。コマンドを受け取ることによって、そのコマンドがキュー・エントリから消費され、このキュー・エントリは、その後、空になる。第３スレッド２１４は、テール・ポインタを第１キュー２１０内の次のキュー・エントリに進める（５３０）。さらに、テール・ポインタによってポイントされるキュー・エントリのコマンドの受取が、第１キュー２１０を満杯でなくする（５３２）（すなわち、第１キュー２１０が前には満杯であったが今はもはや満杯でない）場合には、第３スレッド２１４は、第１スレッド２０６を覚醒させ（５３４）、この第１スレッド２０６は、図５の方法５００の部分５０８でブロックしていた可能性がある。第３スレッド２１４は、最終的に、処理のためにグラフィックス関連コマンドをグラフィックス・ハードウェア１１６に通信する（５３６）。その後、第３スレッド２１４は、方法５２０を５２２で開始して繰り返す。すなわち、第３スレッド２１４は、ある点で、第１キュー２１０内のすべてのコマンドを受け取り、部分５２６でブロックするようになる可能性がある。
【００５６】
次に、図７を参照すると、方法５４０は、グラフィックス関連コマンド応答が第３スレッド２１４によってグラフィックス・ハードウェア１１６から受け取られる時（５４２）に実行される。方法５４０は、図６の方法５２０と同時に第３スレッド２１４によって実行される。したがって、第３スレッド２１４が、方法５２０の部分５２６でブロックすることは、第３スレッド２１４が方法５２０に関してブロックするのであって、図７の方法５４０に関してブロックするのではないことを意味する。同様に、第３スレッド２１４が方法５４０の部分５４８でブロックすることは、第３スレッド２１４が方法５４０に関してブロックするのであって、図６の方法５２０に関してブロックするのではないことを意味する。
【００５７】
第３スレッド２１４は、グラフィックス関連コマンド応答を第２キュー２１２に置くことを試みる（５４４）。第２キュー２１２のヘッド・ポインタによってポイントされるキュー・エントリが満杯である場合（５４６）には、第３スレッド２１４は、第２スレッド２０８によって覚醒されるまでブロックする（５４８）。ある点で、このキュー・エントリが、空であるか空になり、第３スレッド２１４が、ヘッド・ポインタによってポイントされるキュー・エントリに応答を置く（５５０）。その後、第３スレッド２１４は、ヘッド・ポインタを第２キュー２１２内の次のキュー・エントリに進める（５５２）。
【００５８】
部分５５０でのヘッド・ポインタによってポイントされるキュー・エントリへの応答の配置が、第２キュー２１２を空でなくする（５５４）（すなわち、第２キュー２１２が、前には空であったが今はもはや空ではない）場合に、第３スレッド２１４は、第２スレッド２０８がこの応答を消費するようにするために、第２スレッド２０８を覚醒させる（５５６）こともできる。その後、方法５４０は、終了するが（５５８）、第２キュー２１２への配置のために第３スレッド２１４によってグラフィックス関連コマンド応答が受け取られるたびに繰り返される。すなわち、方法５４０は、第３スレッド２１４が、グラフィックス・ハードウェア１１６から応答を受け取るたびに繰り返される。
【００５９】
最後に図８を参照すると、方法５６０は、グラフィックス関連コマンド応答が第２キュー２１２から第２スレッド２０８によって受け取られなければならない時に実行される。方法５６０を、第２スレッド２０８が第２キュー２１２からグラフィックス関連コマンド応答を受け取ることを試みる（５６２）時に実行されることに関連して開始されるものとして説明する。したがって、第２キュー２１２のテール・ポインタによってポイントされるキュー・エントリが空である場合（５６４）には、第２スレッド２０８は、現在は第２キュー２１２に消費されるべき応答があることを示すために第３スレッド２１４によって覚醒されるまで、ブロックする（５６６）。実際には、その後、方法５６０が、部分５６６で開始される。というのは、当初に、第２キュー２１２にコマンドがある状態になるまで、方法５６０が覚醒されないからである。しかし、方法５６０は、図８では、例示の一貫性および図７の方法５４０との対応のために、部分５６２で第２キュー２１２からのグラフィックス関連コマンド応答の受取を試みることによって開始されるものとして示されている。
【００６０】
したがって、最終的に、第２スレッド２０８は、テール・ポインタによってポイントされるキュー・エントリの応答を受け取る（５６８）。応答を受け取ることによって、その応答がキュー・エントリから消費され、このキュー・エントリは、その後、空になる。第２スレッド２０８は、テール・ポインタを第２キュー２１２内の次のキュー・エントリに進める（５７０）。さらに、テール・ポインタによってポイントされるキュー・エントリの応答の受取が、第２キュー２１２を満杯でなくする（５７２）（すなわち、第２キュー２１２が前には満杯であったが今はもはや満杯でない）場合には、第２スレッド２０８は、第３スレッド２１４を覚醒させ（５７４）、この第３スレッド２１４は、図７の方法５４０の部分５４８でブロックしていた可能性がある。第２スレッド２０８は、最終的に、グラフィックス関連コマンド応答をリモート・クライアント・コンピューティング・デバイス１０４のディスプレイ・デバイス１０６に通信する（５７６）。その後、第２スレッド２０８は、方法５６０を５６２で開始して繰り返す。すなわち、第２スレッド２０８は、ある点で、第２キュー２１２内のすべての応答を受け取り、部分５６６でブロックするようになる可能性がある。
【００６１】
特定の実施形態を本明細書で図示し、説明したが、同一の目的を達成するように計算された任意の配置を、図示の特定の実施形態と置換できることを当業者が了解するであろうことに留意されたい。したがって、本願は、本発明の実施形態のすべての適応または変形を含むことが意図されている。たとえば、本発明の実施形態を、実質的に、グラフィックス関連コマンドをグラフィックス関連コマンド応答の形に処理するグラフィックス関連ハードウェアに関して本明細書で説明した。しかし、本発明の他の実施形態は、他のタイプのコマンドを他のタイプのコマンド応答の形に処理する他のタイプのハードウェアに適用可能である。したがって、本発明が特許請求の範囲およびその同等物のみによって限定されることが、明らかに意図されている。
【図面の簡単な説明】
【００６２】
【図１】本発明の実施形態による、仮想クライアント・コンピューティング環境を実施するコンピュータ・アーキテクチャを示す図である。
【図２】本発明の実施形態による、仮想クライアント・コンピューティング環境内で高性能グラフィックス関連コマンド処理を達成するサーバ・コンピューティング・デバイスのアーキテクチャを示す図である。
【図３】本発明の実施形態による、図２のコンピュータ・アーキテクチャ内で使用できるキューを示す図である。
【図４】本発明の実施形態による、図３のキュー内で使用できるキュー・エントリを示す図である。
【図５】本発明の実施形態による、仮想クライアント・コンピューティング環境内で高性能グラフィックス関連コマンド処理を達成する方法を示す流れ図である。
【図６】本発明の実施形態による、仮想クライアント・コンピューティング環境内で高性能グラフィックス関連コマンド処理を達成する方法を示す流れ図である。
【図７】本発明の実施形態による、仮想クライアント・コンピューティング環境内で高性能グラフィックス関連コマンド処理を達成する方法を示す流れ図である。
【図８】本発明の実施形態による、仮想クライアント・コンピューティング環境内で高性能グラフィックス関連コマンド処理を達成する方法を示す流れ図である。
【符号の説明】
【００６３】
１００  コンピュータ・アーキテクチャ
１０２  サーバ・コンピューティング・デバイス
１０４  リモート・クライアント・コンピューティング・デバイス
１０６  ディスプレイ・デバイス
１０８  仮想クライアント・コンピューティング環境
１１０  サーバ・コンピューティング環境
１１２  クライアント・アプリケーション
１１４  プロセッサ
１１６  グラフィックス・ハードウェア
２０２  符号化アプリケーション
２０４  復号アプリケーション
２０６  第１スレッド
２０８  第２スレッド
２１０  第１キュー
２１２  第２キュー
２１４  第３スレッド
２１８  矢印
２２０  矢印
２２２  矢印
２２４  矢印
２２６  矢印
２２８  矢印
２３０  矢印
３０２  キュー
３０４  キュー・エントリ
３０４Ａ  キュー・エントリ
３０４Ｂ  キュー・エントリ
３０４Ｃ  キュー・エントリ
３０４Ｎ  キュー・エントリ
３０６  ヘッド・ポインタ
３０８  テール・ポインタ
３１０  作成スレッド
３１２  消費スレッド
４０２  キュー・エントリ
４０４  バイト
４０４Ａ  バイト
４０４Ｂ  バイト
４０４Ｃ  バイト
４０４Ｎ  バイト
４０６  オペコード
４０８  パラメータ
５００  方法
５０２  グラフィックス関連コマンドを第１スレッドによって受け取るステップ
５０４  第１スレッドによってグラフィックス関連コマンドを第１キューに置くステップ
５０６  ヘッド・ポインタによってポイントされるキュー・エントリが満杯かどうかを判定するステップ
５０８  覚醒されるまでブロックするステップ
５１０  ヘッド・ポインタによってポイントされるキュー・エントリにコマンドを置くステップ
５１２  ヘッド・ポインタを次のキュー・エントリに進めるステップ
５１４  ヘッド・ポインタによってポイントされるキュー・エントリへのコマンドの配置が、キューを空でなくするかどうかを判定するステップ
５１６  第３スレッドを覚醒させるステップ
５２０  方法
５２２  第３スレッドによって第１キューからグラフィックス関連コマンドを受け取るステップ
５２４  テール・ポインタによってポイントされるキュー・エントリが空かどうかを判定するステップ
５２６  覚醒されるまでブロックするステップ
５２８  テール・ポインタによってポイントされるキュー・エントリのコマンドを受け取るステップ
５３０  テール・ポインタを次のキュー・エントリに進めるステップ
５３２  テール・ポインタによってポイントされるキュー・エントリのコマンドの受取が、キューを満杯でなくするかどうかを判定するステップ
５３４  第１スレッドを覚醒させるステップ
５３６  グラフィックス関連コマンドを第３スレッドによってグラフィックス・ハードウェアに通信するステップ
５４０  方法
５４２  グラフィックス関連コマンド応答を第３スレッドによってグラフィックス・ハードウェアから受け取るステップ
５４４  グラフィックス関連コマンド応答を第３スレッドによって第２キューに置くステップ
５４６  ヘッド・ポインタによってポイントされるキュー・エントリが満杯かどうかを判定するステップ
５４８  覚醒されるまでブロックするステップ
５５０  ヘッド・ポインタによってポイントされるキュー・エントリに応答を置くステップ
５５２  ヘッド・ポインタを次のキュー・エントリに進めるステップ
５５４  ヘッド・ポインタによってポイントされるキュー・エントリへの応答の配置が、キューを空でなくするかどうかを判定するステップ
５５６  第２スレッドを覚醒させるステップ
５６０  方法
５６２  第２スレッドによって第２キューからグラフィックス関連コマンド応答を受け取るステップ
５６４  テール・ポインタによってポイントされるキュー・エントリが空かどうかを判定するステップ
５６６  覚醒されるまでブロックするステップ
５６８  テール・ポインタによってポイントされるキュー・エントリの応答を受け取るステップ
５７０  テール・ポインタを次のキュー・エントリに進めるステップ
５７２  テール・ポインタによってポイントされるキュー・エントリの応答の受取が、キューを満杯でなくするかどうかを判定するステップ
５７４  第３スレッドを覚醒させるステップ
５７６  グラフィックス関連コマンド応答を第２スレッドによってディスプレイ・デバイスに通信するステップ
【図１】
2009512921.tif 000003
【図２】
2009512921.tif 000004
【図３】
2009512921.tif 000005
【図４】
2009512921.tif 000006
【図５】
2009512921.tif 000007
【図６】
2009512921.tif 000008
【図７】
2009512921.tif 000009
【図８】
2009512921.tif 000010
2009512921.tif 000011
2009512921.tif 000012
2009512921.tif 000013
2009512921.tif 000014
【国際調査報告】
2009512921.tif 000015
2009512921.tif 000016
2009512921.tif 000017