(57)【要約】【課題】リクエストに応じた処理の割り当てをこれまでよりも効率化する。【解決手段】クライアント装置から受信したリクエストに応じて動作するサーバ装置であって、システムメモリ空間に、クライアント装置から受信したリクエストをその識別情報に対応付けて記憶しているリクエスト記憶領域を有し、かつ、ユーザメモリ空間に、処理待ちのリクエストの識別情報を記憶するための識別情報記憶領域を有する、記憶装置と、識別情報記憶領域に記憶されている識別情報の数が基準数以下に減少したことを条件に、リクエスト記憶領域から１以上の処理待ちのリクエストを検索して、その識別情報を識別情報記憶領域に格納する識別情報格納部と、相互に並列に動作し、識別情報記憶領域から識別情報を取得し、その識別情報により識別されるリクエストをリクエスト記憶領域から取得し、そのリクエストに応じた処理を行う複数の要求処理部とを備えるサーバ装置を提供する。
2008140053.tif 000002
【特許請求の範囲】
【請求項１】
クライアント装置から受信したリクエストに応じて動作するサーバ装置であって、
システムメモリ空間に、クライアント装置から受信したリクエストをその識別情報に対応付けて記憶しているリクエスト記憶領域を有し、かつ、ユーザメモリ空間に、処理待ちのリクエストの識別情報を記憶するための識別情報記憶領域を有する、記憶装置と、
前記識別情報記憶領域に記憶されている識別情報の数が、予め定められた基準数以下に減少したことを条件に、前記リクエスト記憶領域から１以上の処理待ちのリクエストを検索して、その識別情報を前記識別情報記憶領域に格納する識別情報格納部と、
相互に並列に動作し、前記識別情報記憶領域から識別情報を取得できたことを条件に、その識別情報により識別されるリクエストを前記リクエスト記憶領域から取得し、そのリクエストに応じた処理を行う複数の要求処理部と
を備えるサーバ装置。
【請求項２】
前記識別情報格納部、および、前記複数の要求処理部、のそれぞれは、互いに異なる複数のスレッドのそれぞれによって実現され、
少なくとも１の前記要求処理部は、前記識別情報記憶領域から識別情報を取得した結果、前記識別情報記憶領域に記憶されている識別情報の数が前記基準数以下に減少した場合に、前記識別情報格納部に動作の開始を指示し、
前記識別情報格納部は、何れかの前記要求処理部から指示を受けて動作を開始し、前記リクエスト記憶領域から１以上の処理待ちのリクエストを検索して、その識別情報を前記識別情報記憶領域に格納する
請求項１に記載のサーバ装置。
【請求項３】
前記記憶装置は、ユーザメモリ空間に、前記識別情報記憶領域に格納した識別情報の数および前記識別情報記憶領域から取得した識別情報の数の少なくとも一方に基づく、前記識別情報記憶領域の状態を記憶するための状態記憶領域を更に有し、
前記識別情報格納部は、識別情報を前記識別情報記憶領域に新たに格納したことに応じて、新たに格納した識別情報の数に基づき前記状態記憶領域に記憶された状態を更新し、  前記要求処理部は、前記識別情報記憶領域から識別情報を取得したことに応じて、取得した識別情報の数に基づき前記状態記憶領域に記憶された状態を更新し、更新後の状態に基づいて、前記識別情報記憶領域に記憶されている識別情報の数が前記基準数以下に減少したかどうかを判断する
請求項２に記載のサーバ装置。
【請求項４】
前記要求処理部は、前記識別情報記憶領域から識別情報を取得したことに応じて、前回に前記識別情報格納部により識別情報が前記識別情報記憶領域に格納されてから、前記識別情報記憶領域から取得した識別情報の数が、前回に前記識別情報記憶領域に格納された識別情報の数に達したかどうかを、前記状態記憶領域に記憶された状態に基づいて判断する
請求項３に記載のサーバ装置。
【請求項５】
前記識別情報格納部は、動作の開始を示す一度の指示について、予め定められた数を上限数として１以上のリクエストを前記リクエスト記憶領域から検索して、その識別情報を前記識別情報記憶領域に格納し、
前記要求処理部は、前記識別情報記憶領域から識別情報を取得したことに応じて、前回に前記識別情報格納部により識別情報が前記識別情報記憶領域に格納されてから、前記識別情報記憶領域から取得した識別情報の数が、前記上限数に達したかどうかを、前記状態記憶領域に記憶された状態に基づいて判断する
請求項３に記載のサーバ装置。
【請求項６】
前記状態記憶領域は、異なる２以上の時点のそれぞれにおける、前記識別情報記憶領域に記憶された識別情報の数を記憶しており、
前記要求処理部は、前記識別情報記憶領域から識別情報を取得したことに応じて、前記状態記憶領域に記憶された状態に基づき、単位時間当たりに識別情報が前記識別情報記憶領域から取得される数の速度を算出し、この速度に基づき、前記識別情報記憶領域に記憶されている識別情報の数が前記基準数以下に減少する予測時刻を算出し、この予測時刻に前記識別情報格納部の動作を開始させる設定を行う
請求項３に記載のサーバ装置。
【請求項７】
前記識別情報格納部は、さらに、予め設定した時間間隔で動作し、一度の動作について、予め定められた数を上限数として１以上のリクエストを前記リクエスト記憶領域から検索して、その識別情報を前記識別情報記憶領域に格納し、かつ
前記上限数に対する、動作一度あたりに検索される識別情報の数の割合である情報充填率が、より高いことを条件に、この情報充填率がより低い場合と比較して前記時間間隔をより短く設定する
請求項１に記載のサーバ装置。
【請求項８】
前記リクエスト記憶領域からリクエストの識別情報を検索するための所要時間が予め定められており、
前記識別情報格納部は、この所要時間がより小さい場合に、この所要時間がより大きい場合と比較して、前記時間間隔をより短く設定する
請求項７に記載のサーバ装置。
【請求項９】
前記識別情報格納部は、予め定められた期間が経過する毎に動作を開始して、前記識別情報記憶領域に記憶されている識別情報の数が、予め定められた基準数以下に減少したかどうかを判断し、減少したことを条件に、前記リクエスト記憶領域から１以上の処理待ちのリクエストを検索して、その識別情報を前記識別情報記憶領域に格納する
請求項２に記載のサーバ装置。
【請求項１０】
前記識別情報格納部は、システムコールを発行してリクエストを前記リクエスト記憶領域から検索し、
それぞれの前記要求処理部は、システムコールを発行することなく識別情報を前記識別情報記憶領域から取得することを試みて、取得できたことを条件に、システムコールを発行してリクエストを前記リクエスト記憶領域から取得する
請求項１に記載のサーバ装置。
【請求項１１】
前記識別情報格納部は、前記リクエスト記憶領域に対するアクセスの排他権を獲得してから、リクエストを前記リクエスト記憶領域から検索し、
それぞれの前記要求処理部は、前記リクエスト記憶領域に対するアクセスの排他権を獲得することなく識別情報を前記識別情報記憶領域から取得することを試みて、取得できたことを条件に、取得したその識別情報により識別されるリクエストを記憶する前記リクエスト記憶領域内の領域の排他権を獲得してそのリクエストを前記リクエスト記憶領域から取得する
請求項１に記載のサーバ装置。
【請求項１２】
サーバ装置に、クライアント装置から受信したリクエストに応じて処理をさせる方法であって、
前記サーバ装置は、
システムメモリ空間に、クライアント装置から受信したリクエストをその識別情報に対応付けて記憶しているリクエスト記憶領域を有し、かつ、ユーザメモリ空間に、処理待ちのリクエストの識別情報を記憶するための識別情報記憶領域を有する、記憶装置を有し、  前記サーバ装置の識別情報格納部により、前記識別情報記憶領域に記憶されている識別情報の数が、予め定められた基準数以下に減少したことを条件に、前記リクエスト記憶領域から１以上の処理待ちのリクエストを検索させて、その識別情報を前記識別情報記憶領域に格納させるステップと、
前記サーバ装置の複数の要求処理部を、相互に並列に動作させ、前記識別情報記憶領域から識別情報を取得できたことを条件に、その識別情報により識別されるリクエストを前記リクエスト記憶領域から取得し、そのリクエストに応じた処理を行わせるステップと、  を備える方法。
【請求項１３】
クライアント装置から受信したリクエストに応じて動作するサーバ装置として、コンピュータを機能させるプログラムであって、
前記コンピュータを、
システムメモリ空間に、クライアント装置から受信したリクエストをその識別情報に対応付けて記憶しているリクエスト記憶領域を有し、かつ、ユーザメモリ空間に、処理待ちのリクエストの識別情報を記憶するための識別情報記憶領域を有する、記憶装置と、
前記識別情報記憶領域に記憶されている識別情報の数が、予め定められた基準数以下に減少したことを条件に、前記リクエスト記憶領域から１以上の処理待ちのリクエストを検索して、その識別情報を前記識別情報記憶領域に格納する識別情報格納部と、
相互に並列に動作し、前記識別情報記憶領域から識別情報を取得できたことを条件に、その識別情報により識別されるリクエストを前記リクエスト記憶領域から取得し、そのリクエストに応じた処理を行う複数の要求処理部と
して機能させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、受信したリクエストに応じて動作するサーバ装置に関する。特に、本発明は、受信した複数のリクエストに応じて複数の処理部が並列に動作するサーバ装置に関する。
【背景技術】
【０００２】
近年、ウェブ・サーバを利用したビジネスは益々盛んになっており、ウェブ・サーバに求められる機能も高度かつ複雑になっている。例えば、ウェブ・サーバは多数のリクエストを同時並行的に受信する場合がある。これらに効率的に応えるため、大規模なウェブ・サーバは、複数のＣＰＵを備えており、オペレーティング・システム上で複数のスレッドを動作させ、そのそれぞれに各リクエストを割り当てて、並列に処理させている。【０００３】
【非特許文献１】Ｗｉｎｓｏｃｋについて。ホームページＵＲＬ「http://e-words.jp/w/Winsock.html」２００７年４月１８日検索
【発明の開示】
【発明が解決しようとする課題】
【０００４】
ウェブ・サーバによりリクエストを効率的に処理するためには、スレッドがあるリクエストの処理を終えてから、次のリクエストの処理を開始するまでの待ち時間（以降、アイドル時間と称す）を短縮し、あるいはアイドル時間を無くすことが有効である。これを実現するためには、各スレッドは、前回のリクエストの処理を終えたら直ちに、受信済みで未処理のリクエストを検索すればよいとも考えられる。しかしながら、複数のスレッドのそれぞれが他のスレッドとは独立にこのようなリクエストを検索した場合には、効率が悪い場合がある。【０００５】
具体的には、ウェブ・サーバに限らずサーバ装置がクライアント装置との間でＴＣＰ／ＩＰプロトコル等に準拠して通信する場合には、ソケット・インターフェイスとして知られているインターフェイスを用いる場合が多い。例えば、ＢＳＤ系のＵＮＩＸオペレーティング・システム向けに開発されたＳｏｃｋｅｔインターフェイスやウィンドウズ・オペレーティング・システムのＷｉｎｓｏｃｋインターフェイスなどが良く知られている（非特許文献１を参照。）。【０００６】
このソケット・インターフェイスにおいて、クライアント装置から受信したリクエストは、オペレーティング・システムやデバイスドライバなどの機能によって、ファイル・ディスクリプタと呼ばれる識別情報に対応付けられてシステムメモリ空間に格納される。各スレッドは、受信済みかつ未処理のリクエストを検索しようとする場合には、このシステムメモリ空間を走査して、個々のファイル・ディスクリプタに対応するリクエストを読み出して、そのリクエストが受信済みかつ未処理であるか判断しなければならない。【０００７】
この検索にはシステムメモリ空間へのアクセスが必要なため、システムコールの呼び出しが必要になる場合が多い。また、各スレッドがこの検索を独立して行うと１つのリクエストが複数のスレッドに割り当てられてしまうなどの不都合があるため、この検索のためには他のスレッドとの間の排他制御を行うことが望ましい（この排他制御もシステムコールの機能として実現されている場合が多い）。このため、各スレッドが独立にこのような検索を行うと処理に時間がかかり、ウェブ・サーバ全体としての性能を却って低下させてしまうおそれがある。【０００８】
これに対し、ある特定のスレッドのみがその他のスレッドにリクエストを割り当てるためにこのような検索を行うことで、システムコールに必要な処理間を短縮することも考えられる。但し、この特定のスレッドの処理はウェブ・サーバ本来のリクエストに応じた処理ではないので、頻繁に動作し過ぎるとウェブ・サーバ全体としての処理能力を却って低下させてしまう。一方で、この特定のスレッドの動作頻度を低下させ過ぎると、リクエストが受信済みにも関わらずそれを他のスレッドに割り当てることができず、アイドル時間を増加させてしまう。【０００９】
そこで本発明は、上記の課題を解決することのできるサーバ装置、方法およびプログラムを提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
【課題を解決するための手段】
【００１０】
上記課題を解決するために、本発明の一側面においては、クライアント装置から受信したリクエストに応じて動作するサーバ装置であって、システムメモリ空間に、クライアント装置から受信したリクエストをその識別情報に対応付けて記憶しているリクエスト記憶領域を有し、かつ、ユーザメモリ空間に、処理待ちのリクエストの識別情報を記憶するための識別情報記憶領域を有する、記憶装置と、前記識別情報記憶領域に記憶されている識別情報の数が、予め定められた基準数以下に減少したことを条件に、前記リクエスト記憶領域から１以上の処理待ちのリクエストを検索して、その識別情報を前記識別情報記憶領域に格納する識別情報格納部と、相互に並列に動作し、前記識別情報記憶領域から識別情報を取得できたことを条件に、その識別情報により識別されるリクエストを前記リクエスト記憶領域から取得し、そのリクエストに応じた処理を行う複数の要求処理部とを備えるサーバ装置、当該サーバ装置によりリクエストを処理する方法、および、当該サーバ装置としてコンピュータを機能させるプログラムを提供する。
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションもまた、発明となりうる。
【発明を実施するための最良の形態】
【００１１】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。【００１２】
図１は、情報システム１０の全体構成を示す。情報システム１０は、複数のクライアント装置１５と、サーバ装置２０とを備える。複数のクライアント装置１５は通信ネットワークを介してサーバ装置２０に接続されている。そして、複数のクライアント装置１５のそれぞれは、その利用者の指示などに応じ、サーバ装置２０に対しリクエストを送信する。サーバ装置２０がウェブ・サーバである場合において、このリクエストは例えばＨＴＴＰリクエストである。そして、サーバ装置２０は、このリクエストに応じた処理を行い、その処理結果として例えば新たなウェブページを生成し、ＨＴＴＰレスポンスに含めてクライアント装置１５に返信する。【００１３】
サーバ装置２０は、コンピュータにより実現され、そのハードウェア構成の少なくとも一部として、記憶装置２００と、１以上のＣＰＵ２１０と、通信インターフェイス２２０とを有する。記憶装置２００は、このコンピュータをサーバ装置２０として機能させるためのプログラムおよびデータを記憶している。少なくとも１のＣＰＵ２１０は、これらのプログラムおよびデータを読み込んで情報処理を行う。通信インターフェイス２２０は、プログラムに基づき動作するＣＰＵ２１０の指示に基づいて、複数のクライアント装置１５との間で通信を行う。
本実施の形態に係るサーバ装置２０は、これらのＣＰＵ２１０の処理能力を有効活用して、多数のリクエストを同時並行的に受信した場合であってもそれらを効率的に処理することを目的とする。【００１４】
図２は、本実施の形態に係るサーバ装置２０の第１の構成例の概要を示す。サーバ装置２０は、記憶装置２００のシステムメモリ空間にリクエスト記憶領域２０５Ａを有し、記憶装置２００のユーザメモリ空間に識別情報記憶領域２０５Ｂを有する。システムメモリ空間は、オペレーティング・システムまたは各種のデバイスドライバにより管理されたメモリ領域である。このシステムメモリ空間にアクセスするためには、多くの場合、オペレーティング・システム等が提供する所定のシステムコールを呼び出す必要がある。システムメモリ空間に記憶されたデータは、ハードウェアやオペレーティング・システム自体の動作と密接に関連しており、ユーザ・プログラムによる自由なアクセスを許すとサーバ装置２０の動作に支障をきたすからである。【００１５】
リクエスト記憶領域２０５Ａは、クライアント装置１５から受信したリクエストをその識別情報に対応付けて記憶している。リクエストは、例えば、クライアント装置１５がサーバ装置２０に要求する処理の内容を示すものである。一例として、このリクエストは、要求する処理を実行するためのサービス・プログラムの所在およびそれに与えるパラメータである。サービス・プログラムの所在とは、例えば、パス名、ファイル名、拡張子などを含み、ＵＲＬ（Ｕｎｉｆｏｒｍ  Ｒｅｓｏｕｒｃｅ  Ｌｏｃａｔｏｒ）と呼ばれる。オペレーティング・システムおよび通信用のデバイスドライバは、サーバ装置２０がクライアント装置１５からリクエストを受信すると、そのリクエストをこのリクエスト記憶領域２０５Ａに順次格納する。記憶するリクエストの数は、運営するウェブサイトの規模によって異なるが、数万から数十万に及ぶ場合もある。【００１６】
リクエストに対応する識別情報は、そのリクエストやそれに対応するレスポンスを授受するための接続（コネクションとも呼ばれる）を識別するための情報である。一例として、Ｓｏｃｋｅｔインターフェイスを用いてＴＣＰ／ＩＰ接続を行う場合において、この識別情報はファイル・ディスクリプタと呼ばれ、ユーザ・プログラムがリクエストを処理したりレスポンスを返信したりする場合に用いられる。図ではこれらのファイル・ディスクリプタを、ｆｄ１、ｆｄ２、ｆｄ３、…、ｆｄＮなどの記号で示す。接続が確立されていてもリクエストが到着していない場合には、（たとえばクライアント装置１５側の処理が完了していない場合やその前のリクエストをサーバ装置２０で処理している場合である）、ファイル・ディスクリプタのみがリクエスト記憶領域２０５Ａに記憶されていてそれに対応するリクエストは記憶されていない。【００１７】
一方で、ユーザメモリ空間は、ユーザ・プログラムによりシステムコールを呼び出すことなくアクセス可能なメモリ領域である。識別情報記憶領域２０５Ｂは、このユーザメモリ空間に、処理待ちのリクエストの識別情報を記憶するために設けられている。識別情報記憶領域２０５Ｂは先入れ先出し（ＦＩＦＯ：Ｆｉｒｓｔ  Ｉｎ  Ｆｉｒｓｔ  Ｏｕｔ）のキューであり、識別情報格納部２１５により格納された識別情報を末尾に記憶し、先頭から要求処理部２１８−１〜ｎに対し識別情報を供給する。処理待ちのリクエストは、たとえば、サーバ装置２０が受信済みであるがまだ後述の要求処理部２１８によって処理が開始されていないリクエストのことである。従って、ファイル・ディスクリプタがリクエスト記憶領域２０５Ａに記憶されているがそれに対応するリクエストが記憶されていない場合には、識別情報記憶領域２０５Ｂは、そのファイル・ディスクリプタを記憶しない。一方、識別情報記憶領域２０５Ｂは、一旦は記憶したものの既に何れかの要求処理部２１８により取得されて処理が開始されたリクエストの識別情報は、記憶していない。【００１８】
サーバ装置２０は、少なくとも１つのＣＰＵ２１０の制御によって動作する識別情報格納部２１５および要求処理部２１８−１〜ｎを有する。識別情報格納部２１５および要求処理部２１８−１〜ｎの実現方法の概要は以下の通りである。オペレーティング・システムは、プログラマやユーザの視点ではあたかもＣＰＵのように動作する、スレッドという実行主体を複数動作させている。その実体は、プログラムを順次実行するためのプログラム・カウンタ、プログラムが処理中のデータの格納する記憶装置２００中の位置を記録するためのスタック・ポインタ、プログラムが処理中のデータを格納するためのレジスタ、および、そのプログラム専用に用意されたユーザメモリ空間内の記憶領域である。【００１９】
そして、オペレーティング・システムは、複数のＣＰＵ２１０のそれぞれを何れかのスレッドに割り当てて、各スレッドにより実際にプログラムを実行させる。プログラムが比較的低速な入出力デバイスの処理完了を待つ場合や、他のスレッドの所定の動作の完了を待つ場合等には、オペレーティング・システムは、そのスレッドに割り当てていたＣＰＵを、他のスレッドに割り当てることで、ＣＰＵの能力を処理完了待ちに浪費することを避け、ＣＰＵを有効活用する。即ち、スレッドとは、ＣＰＵの数と同時並行的に動作するプログラムの数が異なる場合にＣＰＵを有効活用し、また、入出力完了待ちの時間を有効活用するために、ＣＰＵの動作を仮想化した実行主体である。【００２０】
このようにスレッドが処理待ちとなってＣＰＵを他のスレッドに割り当てることを、スレッドのブロックまたはスレッドのブロック動作という。スレッドのブロックは、具体的には、例えば、そのＣＰＵのプログラム・カウンタ、スタック・ポインタ、および、レジスタの値を、処理完了待ちのスレッドに対応して予め定められた記憶領域に退避したうえで、当該他のスレッドのプログラム・カウンタ、スタック・ポインタ、および、レジスタの値を、そのＣＰＵのプログラム・カウンタ、スタック・ポインタ、およびレジスタに格納することで実現される。スレッドのブロックはオペレーティング・システムにより迅速に処理されるものの、処理にある程度の時間はかかることから、ブロックの回数は少ない方が処理の効率は向上する。【００２１】
本実施の形態に係る識別情報格納部２１５、および、要求処理部２１８−１〜ｎのそれぞれは、互いに異なる複数のスレッドのそれぞれによって実現される。即ち、オペレーティング・システムが各ＣＰＵ２１０を、識別情報格納部２１５および要求処理部２１８−１〜ｎの何れかに割り当てて動作させる。ＣＰＵ２１０が複数であれば、これらの各部は並列に動作する。また、ＣＰＵ２１０の数が識別情報格納部２１５および要求処理部２１８−１〜ｎの総数に満たない場合には、（ＣＰＵ２１０の処理能力をできるだけ活用しようとすれば多くの場合はこのようになるが、）、あるスレッドが頻繁に動作し過ぎると、他のスレッドの動作を妨害し得る。【００２２】
次に、このようにして実現される識別情報格納部２１５および要求処理部２１８−１〜ｎの機能について説明する。識別情報格納部２１５は、リクエスト記憶領域２０５Ａから１以上の処理待ちのリクエストを検索して、その識別情報を識別情報記憶領域２０５Ｂに格納する。図２の例ではファイル・ディスクリプタｆｄ１およびｆｄ３が検索されて、識別情報記憶領域２０５Ｂに格納される。好ましくは、識別情報格納部２１５は、予め定められた数を上限数として１以上のリクエストをリクエスト記憶領域２０５Ａからまとめて検索するためのシステムコールを発行し、その結果として得られた識別情報を識別情報記憶領域２０５Ｂに格納する。一例としてこのシステムコールは、Ｓｏｃｋｅｔインターフェイスのｐｏｌｌｓｅｔシステムコールである。これにより、リクエストを１つずつ検索するのと比較して処理を効率化できる。【００２３】
要求処理部２１８−１〜ｎは、相互に並列に動作する。但し、このように動作するのは、既に説明してきたように、ＣＰＵ２１０の数が少なくとも２以上であって十分に多いことが前提となる。そして、要求処理部２１８−１〜ｎのそれぞれは、ＦＩＦＯキューである識別情報記憶領域２０５Ｂの先頭から識別情報を取得することを試みる。１つのリクエストを複数の要求処理部２１８で重複して処理してしまうことを防ぐため、この識別情報の取得には排他制御が必要となる。但し、この排他制御は、ユーザメモリ空間の記憶領域を対象とするから、システムコールの発行は不要であって、極めて高速な処理として実現される。たとえば、ｃｏｍｐａｒｅ＿ａｎｄ＿ｓｗａｐと呼ばれる命令を含む数命令であって、ＣＰＵによっては数サイクルから数十サイクルで実行可能な命令列により実現され、システムコールの発行などと比較すれば極めて高速に処理される。【００２４】
排他制御において排他権を獲得し、なおかつ識別情報記憶領域２０５Ｂが空でない（少なくとも１つの識別情報を記憶していることをいう、以下同じ）場合には、識別情報の取得に成功する。なお取得とは、対象となる情報を読み出した上で、その情報をその後に読出し不能となるようにする（例えば消去する）ことをいうものとして、以降「読出し」などの用語と区別して用いる。識別情報が取得できたことを条件に、要求処理部２１８−１〜ｎのそれぞれは、その識別情報により識別されるリクエストをリクエスト記憶領域２０５Ａから取得する。リクエストの取得には、システムメモリ空間に対するアクセスが必要なので、多くの場合はシステムコールの発行が必要である。但し、識別情報が取得できた時点でそのリクエストを独占的に取得できることは保証されているので、このシステムコールにおいてリクエストが取得できなくてスレッドがブロックすることは無い。【００２５】
そして、要求処理部２１８−１〜ｎのそれぞれは、取得したそのリクエストに応じた処理を行う。例えば、要求処理部２１８−１〜ｎは、リクエストに応じた処理を行うものとして予め作成されたＪａｖａプログラムにより実現され、そのＪａｖａプログラムをＪａｖａ仮想機械により実行させることでリクエストに応じた処理を行う。必要に応じて、要求処理部２１８−１〜ｎのそれぞれは、処理結果を例えば新たなウェブページに含めてＨＴＴＰレスポンスとしてクライアント装置１５に返信する。返信の処理もＴＣＰ／ＩＰに準拠した通信であるからファイル・ディスクリプタが用いられる。【００２６】
以上、図２を参照して説明した第１の構成例においては、処理待ちのリクエストを識別する識別情報をユーザメモリ空間に記憶して、それを１つのスレッドのみが随時更新することで、要求処理部２１８−１〜ｎを実現する多数のスレッドがシステムメモリ空間へのアクセスにおいて競合することを防止する。この結果、スレッドがブロックする可能性を低減し、また、システムコールの発行回数や頻度を低減して、本来処理に費やされるＣＰＵ２１０の利用率を向上させることができる。
しかしながら、識別情報格納部２１５が頻繁に動作し過ぎると、ＣＰＵ２１０をその動作のために費やすあまり、リクエストに応じた本来の処理を行う要求処理部２１８の動作を阻害するおそれがある。一方で、識別情報格納部２１５の動作頻度が低すぎると、リクエスト記憶領域２０５Ａに処理待ちのリクエストがあるにもかかわらず識別情報記憶領域２０５Ｂにその識別情報が格納されておらず、要求処理部２１８のアイドル時間を増加させ、あるいは、要求処理部２１８を実現するスレッド（ワーカ・スレッドと呼ぶ）を頻繁にブロックさせるおそれがある。これに対し、以下に説明する第２の構成例によれば、識別情報格納部２１５を状況に応じて適度な頻度で実行させることで、識別情報格納部２１５により本来処理を阻害しないようにしつつも識別情報記憶領域２０５Ｂを空にしないようにし、なおかつ頻度調整の処理もまたリクエストに応じた本来の処理をできるだけ阻害しないようにすることができる。【００２７】
図３は、本実施の形態に係るサーバ装置２０の第２の構成例の概要を示す。サーバ装置２０が、リクエスト記憶領域２０５Ａと、識別情報記憶領域２０５Ｂと、識別情報格納部２１５と、要求処理部２１８−１〜ｎとを有すること、およびその処理機能および実現方法については図２に述べたものと同様であるから、以下一部の相違点を除き説明を省略する。一方、第２の構成例におけるサーバ装置２０は、第１の構成例におけるサーバ装置２０に加えて、さらに、サーバ装置２０のユーザメモリ空間に状態記憶領域２０５Ｃを有する。【００２８】
状態記憶領域２０５Ｃは、識別情報記憶領域２０５Ｂの状態を記憶するために設けられている。そして、その状態は、識別情報格納部２１５が識別情報記憶領域２０５Ｂに格納した識別情報の数、および、要求処理部２１８−１〜ｎが識別情報記憶領域２０５Ｂから取得した識別情報の数の、少なくとも一方に基づく。少なくとも要求処理部２１８（例えばここでは要求処理部２１８−ｎとする、すべての要求処理部２１８のそれぞれであってもよい）は、既に述べた処理によって識別情報記憶領域２０５Ｂから識別情報を取得したことに応じ、取得した識別情報の数に基づき状態記憶領域２０５Ｃに記憶された状態を更新すると共に、識別情報格納部２１５に対し動作の開始を指示するかどうかを判断する。【００２９】
具体的には、まず、要求処理部２１８−ｎは、識別情報記憶領域２０５Ｂから識別情報を取得した結果、識別情報記憶領域２０５Ｂに記憶されている識別情報の数が、予め定められた基準数以下に減少したかどうかを判断する。この判断は、識別情報記憶領域２０５Ｂを走査して識別情報の数をカウントすることによって実現されてもよいが、状態記憶領域２０５Ｃにアクセスして識別情報記憶領域２０５Ｂ中の識別情報をカウントしているカウンタを参照することで、迅速な処理として実現される。そして、要求処理部２１８−ｎは、識別情報の数が基準数以下に減少した場合に、識別情報格納部２１５に動作の開始を指示する。また、この処理と共に、既に述べた要求処理部２１８と同様、要求処理部２１８−ｎは、取得した識別情報により識別されるリクエストを取得して、それに応じた処理を行う。【００３０】
識別情報格納部２１５は、何れかの要求処理部２１８（例えば要求処理部２１８−ｎ）から指示を受けて動作を開始する。即ち動作を開始するときには、識別情報の数についての所定の条件、例えば、識別情報記憶領域２０５Ｂに格納されている識別情報の数が基準数以下に減少したという条件が満たされている。そして、識別情報格納部２１５は、リクエスト記憶領域２０５Ａから１以上の処理待ちのリクエストを検索して、それらの識別情報をＦＩＦＯキューである識別情報記憶領域２０５Ｂの末尾に順次格納する。そして、識別情報格納部２１５は、識別情報を識別情報記憶領域２０５Ｂに新たに格納したことに応じ、新たに格納した識別情報の数に基づき識別情報記憶領域２０５Ｂに記憶された状態を更新する。【００３１】
以上、図３を参照して説明した第２の構成例によれば、識別情報記憶領域２０５Ｂの識別情報が基準数以下に減少して空になりそうなときに、かつ、空になる前に、識別情報格納部２１５を動作させて、識別情報記憶領域２０５Ｂを識別情報で満たすことができるので、要求処理部２１８−１〜ｎを実現するワーカ・スレッドのアイドル時間、あるいはワーカ・スレッドのブロック回数を低減できる。また、そのように識別情報格納部２１５の動作開始を識別情報記憶領域２０５Ｂの状態に基づいて決定することで、要求処理部２１８−１〜ｎがすべて処理継続中の場合には識別情報格納部２１５は一切動作せず、サーバ装置２０全体として本来処理の性能を向上できる。さらには、識別情報格納部２１５の動作を開始させるべきかどうかは要求処理部２１８が新たなリクエストの処理を開始しようとする場合にのみ、その開始をするための処理過程で判断するので、識別情報格納部２１５の動作頻度の調整に必要なＣＰＵ２１０資源も最小限にすることができる。なお、基準数の決め方によっては処理の効率を一層高めることもできる。以下、図４以降を参照して基準数の決め方およびそれに適した状態記憶領域２０５Ｃの更新方法について説明する。【００３２】
図４は、本実施の形態に係る識別情報格納部２１５の動作を示すフローチャートである。サーバ装置２０が起動し、または、サーバ装置２０がリセットされると、サーバ装置２０は識別情報格納部２１５を実現するためのスレッドを生成する（Ｓ４００）。識別情報格納部２１５は、このようにスレッドが生成された場合や、後にＳ４５０として説明するように動作の開始を指示された場合に動作を開始して、リクエスト記憶領域２０５Ａから１以上の処理待ちのリクエストを検索する（Ｓ４１０）。これは、既に述べたｐｏｌｌｓｅｔシステムコールの引数に、検索するリクエストの上限数（厳密にはリクエストを具体化したデータのパケットサイズ）を引数として与えて発行することによって実現される。また、識別情報格納部２１５がＪａｖａプログラムにより実現されている場合には、このシステムコールの発行に際しＪＮＩ（Ｊａｖａ  Ｎａｔｉｖｅ  Ｉｎｔｅｒｆａｃｅ）が用いられる。また、多くの場合はリクエスト記憶領域２０５Ａの全部または一部についての排他アクセス権の獲得が必要である。これにより、動作の開始を示す一度の指示について、あるいは、初回のスレッド生成１回について、この上限数を上限とする複数の識別情報がまとめて検索される。【００３３】
そして、識別情報格納部２１５は、検索されたリクエストの識別情報をＦＩＦＯキューである識別情報記憶領域２０５Ｂの末尾に順次格納する（Ｓ４２０）。この格納にも、識別情報記憶領域２０５Ｂに対する排他アクセス権の獲得が必要であるが、要求処理部２１８は識別情報記憶領域２０５Ｂの先頭をアクセスするのに対し識別情報格納部２１５はその末尾をアクセスするので、多くの場合排他アクセス権の獲得は成功する。また、排他アクセス権はユーザメモリ空間についてのものであるから、その処理も極めて迅速に完了する。そして、識別情報格納部２１５は、識別情報を識別情報記憶領域２０５Ｂに新たに格納したことに応じ、新たに格納した識別情報の数に基づき状態記憶領域２０５Ｃに記憶された状態を更新する（Ｓ４３０）。【００３４】
次に、識別情報格納部２１５は、リクエストの受信待ち状態にあった他のスレッドを起床させる（Ｓ４４０）。例えば、本実施の形態の制御にも関わらず識別情報記憶領域２０５Ｂが空となって他のワーカ・スレッドがブロックしている場合もあり得る（例えば後述のＳ５１０）。このため、識別情報格納部２１５は、ブロックしているそのようなワーカ・スレッドの検出を試みて、検出できた場合にはそのワーカ・スレッドを起床させる。起床したワーカ・スレッドは後に図５を参照して説明するように、リクエストの取得を試みたうえでそれに応じた処理を行う。【００３５】
次に、識別情報格納部２１５は、検索された識別情報の数が予め定められた上記の上限数と等しいかどうかを判断する（Ｓ４４５）。この上限数は、サーバ装置２０とクライアント装置１５との間の接続（コネクション）数と比較して極めて小さく、例えば数十程度であってよい。これは、リクエストの検索に要するシステムコールのオーバヘッド、例えば、識別情報記憶領域２０５Ｂの記憶容量、初期化や直列化に要する時間などの制約のためである。上限数と識別情報の数が等しいということは、処理待ちで未検索のリクエストが存在し得るということである。このため、識別情報格納部２１５は、識別情報の数が上限数と等しいことを条件に（Ｓ４４５：ＹＥＳ）、Ｓ４１０に処理を戻して直ちにリクエストを検索させる。【００３６】
一方、検索された識別情報の数が上限数未満であれば（Ｓ４４５：ＮＯ）、識別情報格納部２１５は、動作を開始する指示をワーカ・スレッド、即ちここでは要求処理部２１８−１〜ｎの何れかから受けるまで待機する（Ｓ４５０）。この指示は後のＳ５５０として説明する処理によって発行されるものである。また、好ましくは、識別情報格納部２１５は、待機開始前に、あるいはそれと同時に、識別情報格納部２１５を実現するスレッドに割り当てられたＣＰＵ２１０の制御を、他のスレッドに割り当てるためにオペレーティング・システムに返す処理を行う。この処理の詳細については、今日のオペレーティング・システムの機能として知られたものであるから説明を省略する。【００３７】
図５は、本実施の形態に係る要求処理部２１８−１の動作を示すフローチャートである。要求処理部２１８−２〜ｎのそれぞれについても要求処理部２１８−１と略同様に動作する。ここではそれらを代表して要求処理部２１８−１についてその動作を説明する。要求処理部２１８−１は、スレッド・プールから選択されたスレッドを割り当てられると動作を開始する。スレッド・プールとは、サーバ装置２０の起動時またはリセット時に予め生成されたスレッドの集合である。オペレーティング・システム又はミドルウェアは、このようなスレッド・プールを予め生成しておき、それの一部を適宜要求処理部２１８を実現するためのプログラムを実行するために割り当ててもよい。なお、これに代えて、要求処理部２１８−１は、サーバ装置２０の起動時またはリセット時に直ちに動作を開始して、その後も動作し続けてもよい。即ち、図５を参照して説明する動作は、要求処理部２１８−１を実現するワーカ・スレッドがどのように起動されるかに関わらず、要求処理部２１８−１を実現するワーカ・スレッドによる要求処理部２１８−１としての動作を示している。【００３８】
要求処理部２１８−１は、動作を開始すると、まず、リクエスト記憶領域２０５Ａに対するアクセスの排他権を獲得することなく、既に述べた処理によって識別情報記憶領域２０５Ｂから識別情報の取得を試みる（Ｓ５１０）。識別情報記憶領域２０５Ｂはユーザメモリ空間に設けられているのでシステムコールの発行は不要である。但し、識別情報記憶領域２０５Ｂのアクセスには排他アクセス権の取得は必要な場合がある。この取得の処理は、既に説明したように極めて迅速に完了する。ここで、識別情報の取得に失敗した場合（失敗した、というのは、唯一度だけ識別情報の取得を試行して取得できなかった場合であってもよいし、予め定められた回数の試行が連続して失敗した場合であってもよい）、要求処理部２１８−１は、処理待ちのリクエストが新たに受信されるまで待機する。この待機は、図４のＳ４４０によって解除される。【００３９】
次に、要求処理部２１８−１は、取得した識別情報の数に基づき状態記憶領域２０５Ｃに記憶された状態を更新する（Ｓ５２０）。要求処理部２１８−１が自ら処理するリクエストを取得する場合において、取得する識別情報の数は１個である。次に、要求処理部２１８−１は、識別情報格納部２１５に対し動作の開始を指示するかどうかを判断する（Ｓ５３０）。条件が成立した場合に（Ｓ５４０：ＹＥＳ）、要求処理部２１８−１は、識別情報格納部２１５に動作の開始を指示する（Ｓ５５０）。この指示は前述のＳ４５０の受信待ちに対するものである。識別情報を取得できたので、次に、要求処理部２１８−１は、取得したその識別情報により識別されるリクエストをリクエスト記憶領域２０５Ａから取得する（Ｓ５６０）。リクエストの取得のために、要求処理部２１８−１は、取得したその識別情報により識別されるリクエストを記憶するリクエスト記憶領域２０５Ａ内の領域の排他権を獲得する。【００４０】
リクエストの取得には、システムメモリ空間に対するアクセスが必要なので、多くの場合はシステムコールの発行が必要である。但し、識別情報が取得できた時点でそのリクエストを独占的に取得できることは保証されているので、このシステムコールにおいてリクエストが取得できなくてワーカ・スレッドがブロックすることは無い。このため、要求処理部２１８−１は、例えば、スレッドをブロックさせる機能を省略して高速に動作可能な専用のシステムコールを発行してもよい。スレッドをブロックさせる機能とは、たとえば、取得しようとするリクエストが既に処理待ち状態になっているかどうかをチェックして処理待ち状態でなければスレッドをブロックさせる機能、または、取得しようとするリクエストを記憶する記憶領域への排他権を獲得して獲得できなければスレッドをブロックさせる機能のことをいう。そして、要求処理部２１８−１は、取得したそのリクエストに応じた処理を行う（Ｓ５７０）。処理完了後には、要求処理部２１８−１は、直ちにＳ５１０に処理を戻して他の識別情報の取得を試みる。【００４１】
図６は、Ｓ４３０、Ｓ５２０、およびＳ５３０における動作の詳細を示す。Ｓ４３０において、具体的には、識別情報格納部２１５は、新たに識別情報記憶領域２０５Ｂに格納した識別情報の数を、状態記憶領域２０５Ｃに格納する（Ｓ６００）。また、Ｓ５２０において、具体的には、要求処理部２１８−１は、Ｓ６００において格納されたその識別情報の数から、１減じる。また、Ｓ５３０において、具体的には、要求処理部２１８−１は、状態記憶領域２０５Ｃに記憶された識別情報の数が０かどうかを判断する（Ｓ６２０）。これにより、前回に識別情報格納部２１５により識別情報が識別情報記憶領域２０５Ｂに格納されてから、識別情報記憶領域２０５Ｂから取得した識別情報の総数が、前回に識別情報記憶領域２０５Ｂに格納された識別情報の数に達したかどうかが判断される。【００４２】
識別情報の数が０であれば（Ｓ６２０：ＹＥＳ）、要求処理部２１８−１は、条件成立と判断し（Ｓ６３０）、状態記憶領域２０５Ｃに記憶した識別情報の数を初期値にリセットする（Ｓ６５０）。即ち、この場合の上記の予め定められた基準数とは、識別情報格納部２１５が前回に識別情報を識別情報記憶領域２０５Ｂに格納した場合における、その格納の直前における識別情報記憶領域２０５Ｂ中の識別情報の数となる。一方、識別情報の数が０でなければ（Ｓ６２０：ＮＯ）、要求処理部２１８−１は、条件不成立と判断する（Ｓ６４０）。
以上、図６の例によれば、前回に格納した数の識別情報が既に取得された場合に識別情報格納部２１５を動作させることで、リクエストに依存した処理量の偏りに関わらず識別情報記憶領域２０５Ｂ内の識別情報の数を安定的に推移させ、識別情報記憶領域２０５Ｂが空になることを防ぐことができる。【００４３】
識別情報格納部２１５が動作するタイミングは他の基準によって決定されてもよい。他の基準を用いる場合について変形例として以降順次説明してゆく。
図７は、本実施の形態の第１変形例について、Ｓ４３０、Ｓ５２０、およびＳ５３０における動作の詳細を示す。Ｓ４３０において、具体的には、識別情報格納部２１５は、新たに識別情報記憶領域２０５Ｂに識別情報を格納したことに応じて、リクエストを検索するために指定したそのリクエストの上限数を、状態記憶領域２０５Ｃに格納する（Ｓ７００）。また、Ｓ５２０において、具体的には、要求処理部２１８−１は、Ｓ６００において格納されたその識別情報の上限数から、１減じる。また、Ｓ５３０において、具体的には、要求処理部２１８−１は、状態記憶領域２０５Ｃに記憶された識別情報の数が０かどうかを判断する（Ｓ７２０）。これにより、前回に識別情報格納部２１５により識別情報が識別情報記憶領域２０５Ｂに格納されてから、識別情報記憶領域２０５Ｂから取得した識別情報の総数が、上記の上限数に達したかどうかが判断される。【００４４】
識別情報の数が０であれば（Ｓ７２０：ＹＥＳ）、要求処理部２１８−１は、条件成立と判断し（Ｓ７３０）、状態記憶領域２０５Ｃに記憶した識別情報の数を初期値にリセットする（Ｓ７５０）。一方、識別情報の数が０でなければ（Ｓ７２０：ＮＯ）、要求処理部２１８−１は、条件不成立と判断する（Ｓ７４０）。
以上、この第１変形例によれば、新たに格納した識別情報の数という変数ではなく、上限数という定数をＳ７００において格納すればよいので、Ｓ４３０における更新の処理を簡素にすることができる。また、格納する数値が定数であれば、定数という性質を利用した更なる効率化、例えばＳ７５０の数値のリセット時にＳ７００において定数が格納される予定であることを見越してその定数を予め格納するとともにＳ７００を省略する等の効率化が可能であることが、当業者にとって明らかである。【００４５】
図８は、本実施の形態の第２変形例について、要求処理部２１８−１の動作を示すフローチャートである。本第２変形例において、識別情報格納部２１５の動作については図４を参照して説明したものと同様である。また、図８のＳ５１０およびＳ５２０については、図５を参照して説明したＳ５１０およびＳ５２０と同様である。即ち、要求処理部２１８−１は、識別情報記憶領域２０５Ｂから識別情報の取得を試みる（Ｓ５１０）。識別情報の取得に失敗した場合、要求処理部２１８−１は、処理待ちのリクエストが新たに受信されるまで待機する。次に、要求処理部２１８−１は、取得した識別情報の数に基づき状態記憶領域２０５Ｃに記憶された状態を更新する（Ｓ５２０）。但し、本第２変形例において、要求処理部２１８−１は、状態記憶領域２０５Ｃに記憶された状態を単に更新するのではなく、更新の時刻を更新後の状態に対応付けて記憶する。また、要求処理部２１８−１は、更新時には、更新前の状態および前回の更新時刻を履歴として状態記憶領域２０５Ｃに記憶しておく。【００４６】
そして、要求処理部２１８−１は、状態記憶領域２０５Ｃに記憶した状態および履歴に基づいて、単位時間当たりに識別情報が識別情報記憶領域２０５Ｂから取得される数の速度を算出する（Ｓ５８０）。速度算出の具体例を図９に示す。要求処理部２１８−１は、ある時点１における識別情報の数の履歴と、他の時点２における識別情報の数の履歴とに基づいて、これらの間の時間における識別情報が取得される数の速度を算出する。一例としては２時点間の識別情報の数の差分を、２時転換の経過時間で割り算することによって実現される。算出する速度は、この２時点間における識別情報の数の変化を示す直線の傾きΔで表される。速度算出に用いる異なる２時点の組については、任意の方法により選択されたものでよい。例えば、要求処理部２１８−１は、直近の２時点の履歴に基づいて速度を算出してもよい。速度の算出処理自体も、要求処理部２１８−１が識別情報を取得したときに毎回でなくてもよく、予め定められた回数ごとに算出してよい。【００４７】
図８に戻る。次に、要求処理部２１８−１は、この算出した速度に基づいて、識別情報記憶領域２０５Ｂに記憶されている識別情報の数が基準数以下に減少することが予測される時刻（以降、単に予測時刻という）を算出する（Ｓ５９０）。この予測時刻の算出例を図９に示す。要求処理部２１８−１は、上述の速度Δを傾きとし、この予測時刻の算出時点に対する識別情報記憶領域２０５Ｂに記憶された識別情報の数を示す座標を通過する一次関数を生成する。そして、要求処理部２１８−１は、この１次関数が、識別情報の数が基準数であることを示す定数関数と交わる点を求め、その点の時間軸上の座標値を予測時刻１として算出する。【００４８】
要求処理部２１８−１は、この予測時刻１の時点で識別情報格納部２１５の動作を開始させてもよいが、識別情報格納部２１５が動作を開始してから実際に識別情報が新たに識別情報記憶領域２０５Ｂに格納されるまでの時間を考慮して、それよりも早く識別情報格納部２１５の動作を開始させてもよい。例えば、要求処理部２１８−１は、識別情報格納部２１５が動作を開始してから実際に識別情報が新たに識別情報記憶領域２０５Ｂに格納されるまでに要する、予め定められた所要時間を、予測時刻１から減じて、予測時刻２を算出してもよい。この所要時間は、このように予め定められたものであってもよいが、識別情報格納部２１５が識別情報記憶領域２０５Ｂに識別情報を格納する数の変化を観測した上でその速度を算出することによって求められてもよい。【００４９】
図８に戻る。次に、要求処理部２１８−１は、上記のように算出した予測時刻（予測時刻２が望ましいが予測時刻１でもよい）に識別情報格納部２１５の動作を開始させる設定を行う（Ｓ５９０）。これは、予め定め設定した時刻に動作を開始するアラーム・スレッドを生成することによって実現されてよい。このアラーム・スレッドは、動作を開始すると直ちに識別情報格納部２１５に動作の開始を指示して処理を終了する。これにより、識別情報格納部２１５を予測時刻に動作させることができる。なお、既にアラーム・スレッドが生成されているときには、重複して識別情報格納部２１５に動作の開始を指示することを防ぐため、要求処理部２１８−１は、ここで説明した速度計算の処理自体を行わなくてよい。また、続いて行うＳ５６０およびＳ５７０の処理については図５を参照して説明したとおりであるから説明を省略する。【００５０】
以上、この第２変形例によれば、識別情報が基準数以下に減少する速度を一旦予測すれば、その後に識別情報格納部２１５の動作開始を指示するかどうか判断する処理を省略でき、要求処理部２１８−１〜ｎの処理効率を向上させることができる。また、予測は実際に観測された識別情報の数に基づいて行われるので、サーバ装置２０の運用状況に応じて識別情報格納部２１５の動作頻度を柔軟に調整することができる。【００５１】
図１０は、本実施の形態の第３変形例について、識別情報格納部２１５の動作を示すフローチャートである。本第３変形例において、要求処理部２１８−１の動作については図５やその変形例において説明したものと同様であるから説明を省略する。また、識別情報格納部２１５の動作についても、図４を参照して説明したＳ４００からＳ４４５までの動作については同様である。即ち、識別情報格納部２１５は、受信済みのリクエストをリクエスト記憶領域２０５Ａから検索してその識別情報を識別情報記憶領域２０５Ｂに格納すると共に、状態記憶領域２０５Ｃの状態を更新する。そして、識別情報格納部２１５は、検索されたリクエストの数が、検索するリクエストの上限数と等しいか判断する（Ｓ４４５）。【００５２】
以降の処理は図５を参照して説明した処理とは相違する。検索された識別情報の数が上限数未満であれば（Ｓ４４５：ＮＯ）、識別情報格納部２１５は、動作を開始する指示を他のワーカ・スレッド、即ちここでは要求処理部２１８−１〜ｎの何れかから受けたかどうか判断する（Ｓ４６０）。動作を開始する指示を受けた場合には（Ｓ４６０：ＹＥＳ）、識別情報格納部２１５は、Ｓ４１０に処理を戻して、次のリクエストを検索する。受けていない場合には（Ｓ４６０：ＮＯ）、識別情報格納部２１５は、前回に動作を開始してから予め定められた期間が経過したかどうかを判断する（Ｓ４７０）。経過していれば（Ｓ４７０：ＹＥＳ）、識別情報格納部２１５は、動作を開始して、予め定められた条件が成立したかどうかを判断する（Ｓ４８０）。この期間が経過したかどうかの判断は、オペレーティング・システムなどにより予め提供されたタイマー機能により実現されることが好ましい。条件が成立した場合にはＳ４１０に処理を戻し（Ｓ４９０）、次のリクエストを検索する。【００５３】
Ｓ４８０として示すこの条件判断は、上記のＳ５３０として説明した要求処理部２１８−１による判断と同様である。即ち、本第３変形例では、要求処理部２１８−１のみならず識別情報格納部２１５もが、この条件判断を行う。即ち例えば、具体的には、識別情報格納部２１５は、予め定められた期間が経過する毎に動作を開始して、識別情報記憶領域２０５Ｂに記憶されている識別情報の数が基準数以下に減少したかどうかを判断し、減少したことを条件に、リクエスト記憶領域２０５Ａから１以上の処理待ちのリクエストを検索する。このようにすることで、判断の頻度を高めることができ、識別情報記憶領域２０５Ｂを識別情報で満たし易くすることができる。【００５４】
なお、これに代えて、本第３変形例においては、要求処理部２１８−１が、条件判断を行わず、識別情報格納部２１５のみが図１０に示す判断を行ってもよい。これにより、識別情報格納部２１５−１〜ｎはリクエストに応じた本来処理に費やす時間を増加させることができ、効率的である。【００５５】
図１１は、本実施の形態の第４変形例について、識別情報格納部２１５の動作を示すフローチャートである。本第４変形例において、要求処理部２１８−１の動作については図５やその変形例において説明したものと同様であるから説明を省略する。また、識別情報格納部２１５の動作についても、図４を参照して説明したＳ４００からＳ４４５までの動作については同様である。即ち、識別情報格納部２１５は、受信済みのリクエストをリクエスト記憶領域２０５Ａから検索してその識別情報を識別情報記憶領域２０５Ｂに格納すると共に、状態記憶領域２０５Ｃの状態を更新する。そして、識別情報格納部２１５は、検索されたリクエストの数が、検索するリクエストの上限数と等しいか判断する（Ｓ４４５）。【００５６】
以降の処理は図５を参照して説明した処理とは相違する。検索された識別情報の数が上限数未満であれば（Ｓ４４５：ＮＯ）、識別情報格納部２１５は、上限数に対する、動作一度あたりに検索される識別情報の数の割合である情報充填率を算出する（Ｓ１０００）。情報充填率は、２以上の所定回数の動作において検索された識別情報の数の平均に基づいて算出されてもよい。即ち例えば、識別情報格納部２１５は、Ｓ４３０における状態情報の更新において、直近から数えて予め定められた回数の検索動作において検索された識別情報の数の履歴を状態記憶領域２０５Ｃに格納する。そして、Ｓ１０００における情報充填率の算出処理において、識別情報格納部２１５は、それら識別情報の数の履歴に基づいて、一度の動作で検索された識別情報の数の平均を算出して、上記上限数で割り算することにより、情報充填率を算出する。【００５７】
そして、次に、識別情報格納部２１５は、この情報充填率に基づいて、識別情報格納部２１５が動作する時間間隔を算出して設定する（Ｓ１０１０）。例えば、識別情報格納部２１５は、この情報充填率がより高いことを条件に、この情報充填率がより低い場合と比較してこの時間間隔をより短く設定する。情報充填率が高い場合には処理待ちのリクエストがリクエスト記憶領域２０５Ａにまだ残っている可能性が高く、すぐに次の検索動作を開始しても多くの識別情報を検索できる可能性が高いからである。【００５８】
そして、次に、識別情報格納部２１５は、設定したこの時間間隔が経過したかどうかを判断する（Ｓ１０２０）。経過していれば（Ｓ１０２０：ＹＥＳ）、識別情報格納部２１５は、Ｓ４００に処理を戻して次の検索に処理を移す。経過していなければ（Ｓ１０２０：ＮＯ）、識別情報格納部２１５は、動作を開始する指示を他のワーカ・スレッド、即ちここでは要求処理部２１８−１〜ｎの何れかから受けたかどうか判断する（Ｓ１０３０）。動作を開始する指示を受けた場合には（Ｓ１０３０：ＹＥＳ）、識別情報格納部２１５は、Ｓ４１０に処理を戻して、次のリクエストを検索する。受けていない場合には（Ｓ１０３０：ＮＯ）、識別情報格納部２１５は、Ｓ１０２０に処理を戻して設定時間が経過したかどうかを判断する。【００５９】
以上、この第４変形例によれば、識別情報格納部２１５は、情報充填率に基づいてリクエスト記憶領域２０５Ａの現在の状態や近い将来の状態を予測して、一度の動作あたりに検索できる識別情報の数が多いと予測される場合には頻繁に動作する。これにより、識別情報記憶領域２０５Ｂのみならずリクエスト記憶領域２０５Ａの状態に基づきリクエスト検索の頻度を調整して、識別情報格納部の動作を効率化できる。この第４変形例の更なる変形として、ウェブサイトの運用状況に応じて動作頻度を更に細かく変更すれば、識別情報格納部２１５の動作頻度を調整して更なる性能向上を実現することができる。例えば、サーバ装置２０が同時に受信し得るリクエストの総数やサーバ装置２０を実現するシステム・ソフトウェアの種類によって、識別情報格納部２１５が発行するシステムコールの１回あたりの所要時間、即ち、リクエスト記憶領域２０５Ａからリクエストの識別情報を検索するための所要時間は異なる場合がある。【００６０】
もしシステムコールの所要時間が極めて短いならば、情報充填率がたとえ低くても高頻度でシステムコールを呼び出すことによる性能低下は小さい。一方、システムコールの所要時間が長い場合には、情報充填率が高い場合にのみ低頻度でシステムコールを呼び出すのが望ましい。以上の観点から、識別情報格納部２１５は、この所要時間がより小さい場合に、この所要時間がより大きい場合と比較して、時間間隔をより短く設定する。この設定は、サーバ装置２０の起動時またはリセット時に識別情報格納部２１５が予め行ってもよいし、運用中に適宜変更してもよい。
以上のように、第４変形例においては、識別情報格納部２１５の動作を情報充填率という観点から調整可能とすることで、ウェブサイト運営上の様々な環境に柔軟に対応して、サーバ装置２０の動作を効率化できる。【００６１】
図１２は、本実施の形態に係るサーバ装置２０として機能するコンピュータのハードウェア構成の一例を示す。サーバ装置２０は、ホストコントローラ１０８２により相互に接続される少なくとも１のＣＰＵ２１０、ＲＡＭ１０２０、及びグラフィックコントローラ１０７５を有するＣＰＵ周辺部を備える。この図１２においてサーバ装置２０はＳＭＰ（Symmetric Multiple Processor）型のアーキティクチャを採用する。即ち、ＣＰＵ２１０がＲＡＭ１０２０を中心に対称的に配置され、それぞれのＣＰＵ２１０がＲＡＭ１０２０を共有してアクセスする。また、サーバ装置２０は、入出力コントローラ１０８４によりホストコントローラ１０８２に接続される通信インターフェイス２２０、記憶装置（例えばハードディスクドライブ）２００、及びＣＤ−ＲＯＭドライブ１０６０を有する入出力部と、入出力コントローラ１０８４に接続されるＲＯＭ１０１０、フレキシブルディスクドライブ１０５０、及び入出力チップ１０７０を有するレガシー入出力部とを備える。【００６２】
ホストコントローラ１０８２は、ＲＡＭ１０２０と、高い転送レートでＲＡＭ１０２０をアクセスするＣＰＵ２１０及びグラフィックコントローラ１０７５とを接続する。ＣＰＵ２１０は、ＲＯＭ１０１０及びＲＡＭ１０２０に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ１０７５は、ＣＰＵ２１０等がＲＡＭ１０２０内に設けたフレームバッファ上に生成する画像データを取得し、表示装置１０８０上に表示させる。これに代えて、グラフィックコントローラ１０７５は、ＣＰＵ２１０等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。【００６３】
入出力コントローラ１０８４は、ホストコントローラ１０８２と、比較的高速な入出力装置である通信インターフェイス２２０、記憶装置２００、及びＣＤ−ＲＯＭドライブ１０６０を接続する。通信インターフェイス２２０は、ネットワークを介して外部の装置と通信する。記憶装置２００は、サーバ装置２０が使用するプログラム及びデータを格納する。ＣＤ−ＲＯＭドライブ１０６０は、ＣＤ−ＲＯＭ１０９５からプログラム又はデータを読み取り、ＲＡＭ１０２０又は記憶装置２００に提供する。【００６４】
また、入出力コントローラ１０８４には、ＲＯＭ１０１０と、フレキシブルディスクドライブ１０５０や入出力チップ１０７０等の比較的低速な入出力装置とが接続される。ＲＯＭ１０１０は、サーバ装置２０の起動時にＣＰＵ２１０が実行するブートプログラムや、サーバ装置２０のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ１０５０は、フレキシブルディスク１０９０からプログラム又はデータを読み取り、入出力チップ１０７０を介してＲＡＭ１０２０または記憶装置２００に提供する。入出力チップ１０７０は、フレキシブルディスク１０９０や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。【００６５】
サーバ装置２０に提供されるプログラムは、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５、又はＩＣカード等の記録媒体に格納されて利用者によって提供される。プログラムは、入出力チップ１０７０及び/又は入出力コントローラ１０８４を介して、記
録媒体から読み出されサーバ装置２０にインストールされて実行される。プログラムがサーバ装置２０等に働きかけて行わせる動作は、図１から図１１において説明したサーバ装置２０における動作と同一であるから、説明を省略する。【００６６】
以上に示したプログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５の他に、ＤＶＤやＰＤ等の光学記録媒体、ＭＤ等の光磁気記録媒体、テープ媒体、ＩＣカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はＲＡＭ等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムをサーバ装置２０に提供してもよい。【００６７】
以上、本実施の形態および各種の変形例に沿って説明したように、サーバ装置２０によれば、同時並行的に多数のリクエストを受信する場合であっても、それらを各スレッドに効率的に割り当てて処理を効率化できる。本願発明者によりこのサーバ装置２０をウェブ・サーバとして動作させて性能を計測した結果、ウェブ・トランザクションを擬似的に発生させるベンチマークプログラム（通常の改良技術では１％の性能向上も極めて困難である）の処理効率を６％も向上させることができた。また、ストレステストにおいては３０％程度の性能向上が観測された。【００６８】
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることのできることが当業者にとって明らかである。例えば、要求処理部２１８−１〜ｎおよび識別情報格納部２１５はそれぞれ別々のスレッドにより実現されなくともよく、要求処理部２１８−１〜ｎを実現するワーカ・スレッドのうちの１つが、識別情報格納部２１５を実現するスレッドを兼ねてもよい。即ちこの場合、要求処理部２１８−１が図５のＳ５５０に示す動作の開始の指示に代えて、図４に示す繰り返し処理を１回分行ってよい。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【図面の簡単な説明】
【００６９】
【図１】情報システム１０の全体構成を示す。
【図２】本実施の形態に係るサーバ装置２０の第１の構成例の概要を示す。
【図３】本実施の形態に係るサーバ装置２０の第２の構成例の概要を示す。
【図４】本実施の形態に係る識別情報格納部２１５の動作を示すフローチャートである。
【図５】本実施の形態に係る要求処理部２１８−１の動作を示すフローチャートである。
【図６】Ｓ４３０、Ｓ５２０、およびＳ５３０における動作の詳細を示す。
【図７】本実施の形態の第１変形例について、Ｓ４３０、Ｓ５２０、およびＳ５３０における動作の詳細を示す。
【図８】本実施の形態の第２変形例について、要求処理部２１８−１の動作を示すフローチャートである。
【図９】本実施の形態の第２変形例について、識別情報を取得する速度に基づき動作開始時刻を算出する処理の概要を示すフローチャートである。
【図１０】本実施の形態の第３変形例について、識別情報格納部２１５の動作を示すフローチャートである。
【図１１】本実施の形態の第４変形例について、識別情報格納部２１５の動作を示すフローチャートである。
【図１２】本実施の形態に係るサーバ装置２０として機能するコンピュータのハードウェア構成の一例を示す。
【符号の説明】
【００７０】
１０  情報システム
１５  クライアント装置
２０  サーバ装置
２００  記憶装置
２０５Ａ  リクエスト記憶領域
２０５Ｂ  識別情報記憶領域
２０５Ｃ  状態記憶領域
２１０  ＣＰＵ
２１５  識別情報格納部
２１８  要求処理部
２２０  通信インターフェイス
【図１】
2008140053.tif 000003
【図２】
2008140053.tif 000004
【図３】
2008140053.tif 000005
【図４】
2008140053.tif 000006
【図５】
2008140053.tif 000007
【図６】
2008140053.tif 000008
【図７】
2008140053.tif 000009
【図８】
2008140053.tif 000010
【図９】
2008140053.tif 000011
【図１０】
2008140053.tif 000012
【図１１】
2008140053.tif 000013
【図１２】
2008140053.tif 000014
【国際調査報告】
2008140053.tif 000015
2008140053.tif 000016
2008140053.tif 000017