(57)【要約】【課題】  スレッドを管理する方法、装置、およびコンピュータ命令群を提供する。【解決手段】  まず、ユーザ・スレッドに関連付けられたカーネル・スレッドが前記ユーザ・スレッドによって不必要にされていることを検出する。次いで、前記カーネル・スレッドが不必要にされていることに応答して、前記カーネル・スレッドに対して半切り離しを行う。その際、前記スレッド用のデータはスタックを変更しない。
2005539322.tif 000002
【特許請求の範囲】
【請求項１】
データ処理システムにおいてスレッドを管理する方法であって、
ユーザ・スレッドに関連付けられたカーネル・スレッドが前記ユーザ・スレッドによって不必要にされていることを検出するステップと、
前記カーネル・スレッドが不必要にされていることに応答して、前記カーネル・スレッドに対して半切り離しを行うステップであって、前記スレッド用のデータはスタックを変更しない、ステップと
を備えた
方法。
【請求項２】
さらに、
前記カーネル・スレッドを半切り離し済みリストに配置するステップと、  前記カーネル・スレッドを前記ユーザ・スレッドと並行的に非実行可能状態に置くステップと
を備えた、
請求項１に記載の方法。
【請求項３】
さらに、
前記ユーザ・スレッドが休眠からウェイクするのに応答して、前記カーネル・スレッドを前記半切り離し済みリストから除去するステップであって、前記ユーザ・スレッドへの再取り付けは不要である、ステップ
を備えた、
請求項２に記載の方法。
【請求項４】
さらに、
前記ユーザ・スレッドが休眠状態からウェイクするのに応答して、第２のカーネル・スレッドに対して半切り離しではなく切り離しを行うか否かを判断するステップと、
前記第２のカーネル・スレッドが切り離されるのに応答して、前記ユーザ・スレッドに前記第２のカーネル・スレッドを取り付けるステップと
を備えた、
請求項２に記載の方法。
【請求項５】
前記非実行可能状態が待機状態および休眠状態のうちの一方である、
請求項２に記載の方法。
【請求項６】
スレッドを管理するデータ処理システムであって、
ユーザ・スレッドに関連付けられたカーネル・スレッドが前記ユーザ・スレッドによって不必要にされていることを検出する検出手段と、
前記カーネル・スレッドが不必要にされていることに応答して、前記カーネル・スレッドに対して半切り離しを行う半切り離し手段であって、前記スレッド用のデータはスタックを変更しない、半切り離し手段と
を備えた
データ処理システム。
【請求項７】
さらに、
前記カーネル・スレッドを半切り離し済みリストに配置する第１の配置手段と、
前記カーネル・スレッドを前記ユーザ・スレッドと並行的に非実行可能状態に置く第２の配置手段と
を備えた、
請求項６に記載の方法。
【請求項８】
さらに、
前記ユーザ・スレッドが休眠からウェイクするのに応答して、前記カーネル・スレッドを前記半切り離し済みリストから除去する除去手段であって、前記ユーザ・スレッドへの再取り付けは不要である、除去手段
を備えた、
請求項７に記載の方法。
【請求項９】
さらに、
前記ユーザ・スレッドが休眠状態からウェイクするのに応答して、第２のカーネル・スレッドに対して半切り離しではなく切り離しを行うか否かを判断する判断手段と、
前記第２のカーネル・スレッドが切り離されるのに応答して、前記ユーザ・スレッドに前記第２のカーネル・スレッドを取り付ける取り付け手段と
を備えた、
請求項７に記載の方法。
【請求項１０】
前記非実行可能状態が待機状態および休眠状態のうちの一方である、
請求項７に記載の方法。
【請求項１１】
スレッドを管理する、コンピュータ読み取り可能な媒体中のコンピュータ・プログラム製品であって、前記コンピュータ・プログラム製品は請求項１〜６のうちの１項に記載の方法を実行する命令群を備えている、
コンピュータ・プログラム製品。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は一般に改良されたデータ処理システムに関し、特にデータ処理システムにおいてスレッドを管理する方法と装置に関する。
【背景技術】
【０００２】
スレッドとは中央処理装置（ＣＰＵ）を利用するための基本単位である。スレッドは通常、プログラム・カウンタ、レジスタ・セット、およびスタック空間を有している。スレッドはそのコード部、データ部、およびオペレーティング・システムのリソース（たとえば、オープン・ファイルや信号など）を他のスレッドと共用している。これらのコンポーネントは「タスク」とも呼ばれている。一部のシステムでは、ユーザ・スレッドをシステム・コールを経由するのではなく、ユーザ・レベルのライブラリ中に実装しているから、スレッド・スイッチ（スレッドの切り換え）の際に、オペレーティング・システムを呼び出したり、カーネルに割り込みをかけたりする必要がない。
【０００３】
スレッドは多くの点でプロセスと同じ態様で動作する。スレッドは次に示すいくつかの状態のうちの１つの状態にある。すなわち、実行可能状態、阻止状態、休眠状態、実行状態、または終了状態である。ユーザ空間中のユーザ・スレッドはカーネル中のカーネル・スレッドが実行する。カーネル・スレッドは「仮想プロセッサ」とも呼ばれる。ある場合には、各ユーザ・スレッドが対応するカーネル・スレッドを有する１対１モデルを使用する。他の場合には、多くのユーザ・スレッドを数個のカーネル・スレッド上で実行するＭ：Ｎモデルを使用してパフォーマンスを向上させる。このモデルでは、特定のユーザ・スレッドを実行するのにカーネル・スレッドをもはや必要としない状況（たとえば相互排除（mutex)における阻止(blocking)）が生じる。相互排除とはロッキング機構のことであり、オブジェクトをグラブ（grab）したり（つかんだり）解放したりするのに用いるプログラミング・フラグを使用することが含まれる。共用できないデータを取得すると、あるいは、システム内のどこにおいても同時に実行しえない処理を開始すると、相互排除は「ロック」状態にセットされる。相互排除が「アンロック」状態にセットされるのは、データがもはや必要でなくなったとき、または、ルーチンが終了したときである。現在実行しうるユーザ・スレッドがなくなると、このカーネル・スレッドは当該特定のユーザ・スレッドから自身を切り離したのち、休眠状態に入る。
【０００４】
カーネル・スレッドを切り離して（detachment）休眠状態に入れると、多数のアクションが処理されることになる。処理されるアクションの１つは、カーネル・スレッドがユーザ・スタックからそれ自身のより小さなスタックに転換することである。また、カーネル・スレッドはほとんどの信号を阻止するために信号マスキングを設定する。カーネル・スレッドが再び必要になると、このスレッドはユーザ・スレッドのスタックに転換し、いくつかのスレッド固有の属性（たとえば、信号マスク）を設定する。
【０００５】
本発明の認識によれば、現在使用しているこの切り離しとそれ続いて再取り付け（reattachment）を行う機構はパフォーマンス上の大きなオーバーヘッドを伴っている。切り離しまたは再取り付けを行うには各々、ユーザ空間からカーネル空間へ、あるいはカーネル空間からユーザ空間へデータをコピーするのにシステム・コールを必要とする。また、カーネル・ライブラリおよびカーネルの双方でロックを使用するから、ロック・コンテンション（ロックの争奪）が増大する可能性がある。さらに、この種の切り離しには信号処理上の問題が発生する可能性もある。特に、カーネル・スレッドが信号を阻止する前に短い空白期間（window）が存在するから、その期間中にカーネル・スレッドはその小さなカーネル・スタックを用いて実行中に信号を受信する可能性がある。本発明のさらなる認識によれば、より大きなユーザ・スタックを用いて良好に実行している信号ハンドラはカーネル・スレッドのより小さなスタックをオーバーフローさせて、メモリを破損させる、および／または、アプリケーションをコア・ダンプさせる可能性がある。（「Ａおよび／またはＢ」は「ＡおよびＢ、Ａ、またはＢ」を表わす。）
【発明の開示】
【発明が解決しようとする課題】
【０００６】
パフォーマンス上のオーバーヘッドとスタックのオーバーフローというこれら２つの問題点は別々の問題ではあるが、それらには類似した根本原因がある。その原因とは「アイドル」状態にあるカーネル・スレッドを切り離していることである。したがって、パフォーマンス上のオーバーヘッドを低減させるとともにスタックのオーバーフローを避けうる態様で、アイドル状態にあるカーネル・スレッドを取り扱う改良された方法、装置、およびコンピュータ命令を実現するのが好都合である。
【課題を解決するための手段】
【０００７】
本発明はスレッドを管理する方法、装置、およびコンピュータ命令群を提供する。まず、ユーザ・スレッドに関連付けられたカーネル・スレッドが前記ユーザ・スレッドによって不必要にされていることを検出する。次いで、前記カーネル・スレッドが不必要にされていることに応答して、前記カーネル・スレッドに対して半切り離しを行う。その際、前記スレッド用のデータはスタックを変更しない。
【０００８】
前記カーネル・スレッドは半切り離し済みリストに配置するとともに、前記ユーザ・スレッドと並行的に非実行可能状態に置くのが望ましい。
【０００９】
前記ユーザ・スレッドが休眠から覚醒（awake)したら、前記カーネル・スレッドを前記半切り離し済みリストから除去するが、前記ユーザ・スレッドへの再取り付けは不要であるのが望ましい。
【００１０】
前記スレッドはＡＩＸ(R) オペレーティング・システム中で実行するのが望ましい。
【００１１】
前記カーネル・スレッドに対して半切り離しを行うには、前記カーネル・スレッド用のデータをユーザ・スタックに残置しておき、前記データをカーネル・スタックにコピーする必要をなくすのが望ましい。
【００１２】
カーネル・スレッドが必要とされていないことの検出、および、前記カーネル・スレッドに対する半切り離しは、ライブラリを用いて行うのが望ましい。
【００１３】
前記ユーザ・スレッドが休眠状態から覚醒したら、第２のカーネル・スレッドに対して半切り離しではなく切り離しを行うか否かを判断し、前記第２のカーネル・スレッドが切り離されたら、前記ユーザ・スレッドにそれを取り付けるのが望ましい。
【００１４】
前記非実行可能状態が待機状態および休眠状態のうちの一方であるのが望ましい。
【００１５】
本発明の別の側面によると、次に示すデータ処理システムが実現される。
バス・システムと、
前記バス・システムに接続された通信装置と、
前記バス・システムに接続された記憶装置であって、前記記憶装置は１組の命令群を格納している、記憶装置と、
前記バス・システムに接続された処理装置であって、前記処理装置は前記１組の命令群を実行して、ユーザ・スレッドに関連付けられたカーネル・スレッドが前記ユーザ・スレッドによって不必要にされていることを検出し、前記カーネル・スレッドが不必要にされていることに応答して前記カーネル・スレッドに対して半切り離しを行うが、その際、前記スレッド用のデータはスタックを変更しない、処理装置と
を備えた
データ処理システム。
【発明を実施するための最良の形態】
【００１６】
次に、図面を参照する。特に、図１を参照する。図１は本発明を実現しうるデータ処理システムを本発明の好適な実施形態に従って実体的に示す図である。図１にはコンピュータ１００が示されている。コンピュータ１００はシステム・ユニット１０２、画像表示端末１０４、キーボード１０６、記憶装置１０８（これにはフロッピー(R) 駆動装置および他の種類の永続的かつ着脱可能な記憶媒体が含まれる）、およびマウス１１０を備えている。パーソナル・コンピュータ１００は追加の入力装置（たとえば、ジョイスティック、タッチパッド、タッチスクリーン、トラックボール、マイクロフォンなど）を備えていてもよい。コンピュータ１００は好適な任意のコンピュータ（たとえばＩＢＭ(R) eServer (R) コンピュータやＩＢＭ(R) IntelliStation(R) コンピュータ〔これらはインターナショナル・ビジネス・マシーンズ・コーポレーション（International Business Machines Corporation)（ニューヨーク州アーモンク所在）の製品である〕など）を用いて実現することができる。図はコンピュータを示しているが、本発明の他の実施形態は他の種類のデータ処理システム（たとえばネットワーク・コンピュータ）で実現してもよい。また、コンピュータ１００はグラフィカル・ユーザ・インタフェース（ＧＵＩ）を備えているのが望ましい。このＧＵＩはコンピュータ１００内で動作中にコンピュータ読み取り可能な媒体中に存在するシステム・ソフトウェアによって実現することができる。
【００１７】
次に、図２を参照する。図２は本発明を実現しうるデータ処理システムのブロック図である。データ処理システム２００は本発明のプロセスを実現するコードすなわち命令群を配置しうるコンピュータ（たとえば、図１に示すコンピュータ１００）の一例である。データ処理システム２００はＰＣＩ（peripheral component interconnect)ローカル・バス・アーキテクチャを採用している。図示した例ではＰＣＩバスを採用しているが、他のバス・アーキテクチャ（たとえば、ＡＧＰ（Accelerated Graphics Port)やＩＳＡ（Industry Standard Archtecture)など）を使用してもよい。ＰＣＩローカル・バス２０６にはＰＣＩブリッジ２０８を介してプロセッサ２０２とメイン・メモリ２０４が接続されている。ＰＣＩブリッジ２０８はプロセッサ２０２用の統合型メモリ・コントローラ／キャッシュ・メモリも備えている。図示した例では、ＬＡＮ（local area network）アダプタ２１０、ＳＣＳＩ（small computer system interface)ホスト・バス・アダプタ２１２、および拡張バス・インタフェース２１４が直接コンポーネント接続によってＰＣＩローカル・バス２０６に接続されている。これに対して、音声アダプタ２１６、グラフックス・アダプタ２１８、および音声／画像アダプタ２１９が、拡張スロットに挿入されたアドイン・ボードによってＰＣＩローカル・バス２０６に接続されている。拡張バス・インタフェース２１４はキーボード／マウス・アダプタ２２０、モデム２２２、および追加のメモリ２２４用の接続手段を提供している。ＳＣＳＩホスト・バス・アダプタ２１２はハード・ディスク駆動装置２２６、テープ駆動装置２２８、およびＣＤ−ＲＯＭ駆動装置２３０用の接続手段を提供している。典型的なＰＣＩローカル・バスのインプリメンテーションは３個または４個のＰＣＩ拡張スロットまたはＰＣＩ拡張アドイン・コネクタをサポートすることができる。
【００１８】
プロセッサ２０２上ではオペレーティング・システムが実行されているが、それを用いて図２に示すデータ処理システム２００内の様々なコンポーネントを調整するとともにそれらを制御している。このオペレーティング・システムとしては市販のオペレーティング・システム（たとえば、ＡＩＸ(R) （Advanced Interactive eXectuve)やＷｉｎｄｏｗｓ(R) ＸＰなど）を使用することができる。ＡＩＸ(R) はＵＮＩＸ(R) のバージョンの１つであり、インターナショナル・ビジネス・マシーンズ・コーポレーション（International Business Machines Corporation)から入手することができる。Ｗｉｎｄｏｗｓ(R) ＸＰはマイクロソフト・コーポレーション（Microsoft(R) Corporation)から入手することができる。オペレーティング・システム、およびアプリケーションすなわちプログラム用の命令群は記憶装置（たとえばハード・ディスク駆動装置２２６）に格納しておき、メイン・メモリ２０４にロードしてプロセッサ２０２による実行の用に供する。
【００１９】
当業者が認識しうるように、図２に示すハードウェアはインプリメンテーションに応じて変動しうる。図２に示すハードウェアに加え、あるいはそれらに代えて、他の内部ハードウェアまたは周辺装置（たとえば、フラッシュ型ＲＯＭ（read-only memory）、等価の不揮発性メモリ、光ディスク駆動装置など）を使用することができる。また、本発明のプロセスはマルチプロセッサ型のデータ処理システムにも適用することができる。
【００２０】
たとえば、データ処理システム２００は、任意事項としてネットワーク・コンピュータとして構成されている場合、ＳＣＳＩホスト・アダプタ２１２、ハード・ディスク駆動装置２２６、テープ駆動装置２２８、およびＣＤ−ＲＯＭ駆動装置２３０を備えてない。その場合、当該コンピュータは（正確にはクライアント・コンピュータと呼ぶべきだが）何らかの種類のネットワーク通信インタフェース（たとえば、ＬＡＮアダプタ２１０やモデム２２２など）を備えている。別の例では、データ処理システム２００として、当該データ処理システム２００が何らかの種類のネットワーク通信インタフェースを備えているか否かとは無関係に、いかなる種類のネットワーク通信インタフェースにも依存することなくブートしうるように構成されたスタンドアローン型のシステムを用いてもよい。さらなる例では、データ処理システム２００として、オペレーティング・システムのファイルおよび／またはユーザが作成したデータを格納するための不揮発性記憶を提供するＲＯＭおよび／またはフラッシュＲＯＭを備えるように構成したＰＤＡ（personal digital assistant）を用いてもよい。
【００２１】
図２に示した例および上述した例はアーキテクチャ上の限界を示唆することを意図していない。たとえば、データ処理システム２００はＰＤＡの形態をとるのに加え、ノート型コンピュータまたはハンドヘルド型コンピュータであってもよい。また、データ処理システム２００はキオスクやウェブ機器であってもよい。
【００２２】
本発明のプロセスはプロセッサ２０２が、コンピュータ用に実装された命令群を用いて実行する。それらの命令群はメモリ（たとえば、メイン・メモリ２０４、メモリ２２４、または少なくとも１つの周辺装置２２６〜２３０）に配置しておくことができる。
【００２３】
次に、図３を参照する。図３はカーネル・スレッドを処理する際に使用するコンポーネント群を本発明の好適な実施形態に従って示すブロック図である。この例では、ユーザ・スレッド３００、３０２、３０４、３０６、３０８はユーザ空間３１０に配置されており、一方、カーネル・スレッド３１２、３１４はカーネル空間３１８に配置されている。この例では、これらのスレッドはＭ：Ｎモデルに従っている。Ｍ：Ｎモデルでは、数個のカーネル・スレッドを用いて多数のユーザ・スレッドを実行することによりパフォーマンスを向上させている。
【００２４】
説明中の現時点では、ユーザ・スレッド３００はカーネル・スレッド３１２が実行しており、ユーザ・スレッド３０４はカーネル・スレッド３１４が実行しており、ユーザ・スレッド３０６はカーネル・スレッド３１６が実行している。これらのユーザ・スレッド用に実行するオペレーションはユーザ・スレッド・スタック群３２０に配置されている。各ユーザ・スレッドは１つのユーザ・スレッド・スタックに関連付けられいてる。カーネル・スレッド３１２、３１４、３１６はユーザ・スレッド・スタック群３２０にデータを配置させている。カーネル・スレッドが実行中のユーザ・スレッドにはユーザ・スレッド・スタック群３２０中の特定のスタックが関連付けられている。
【００２５】
通常、カーネル・スレッド（たとえばカーネル・スレッド３１２）がユーザ・スレッド（たとえばユーザ・スレッド３００）をそれ以上実行する必要がなくなったら、カーネル・スレッド３１２は自身を切り離し（detach）、ユーザ・スレッド３００とともに休眠状態に入る。休眠状態にあるカーネル・スレッドは通常、切り離し済みリスト３２２に配置する。切り離し済みリスト３２２はＰスレッド・ライブラリ３２４が管理している。Ｐスレッド・ライブラリ３２４はＡＩＸ(R) で使用される動的にロード可能なライブラリである。ユーザ・スレッド３００から切り離したら、カーネル・スレッド３１２用の情報を次に示すように変更する。すなわち、ユーザ・スレッド・スタック群３２０中の当該ユーザ・スレッド用のスタックを指している現在のスタック・ポインタを表している、カーネル・スレッド３１２用の情報を、カーネル・スレッド・スタック群３２６中の当該カーネル・スレッドのスタック用に予約した領域を指すように変更する。ユーザ・スレッド３００が休眠状態からウェイク（wake、実行可能状態になる）したら、カーネル・スレッド３１２を切り離し済みリスト３２２から除去し、ユーザ・スレッド３００に再び取り付ける（reattach）。あるいは、カーネル・スレッド３１２が利用不能の場合には、切り離し済みリスト３２２中にある別に利用可能なカーネル・スレッドをユーザ・スレッド３００に取り付けもよい。
【００２６】
本発明の好適な実施形態によれば、ユーザ・スレッド３００が、カーネル・スレッド３１２が不必要な状態に入ると、Ｐスレッド・ライブラリ３２４はカーネル・スレッド３１２を切り離し済みリスト３２２ではなく半切り離し済み（semi-detached)リスト３２８に配置する。半切り離しであるから、カーネル・スレッド３１２はそのスタックまたは信号マスクを変更しない。その代わり、カーネル・スレッド３１２は半切り離し済みリスト３２８に配置され、ユーザ・スレッド３００とともに並行的に休眠する。この平行的休眠状態において、カーネル・スレッド３１２は自身が並行的に休眠し続けている原因をなしたユーザ・スレッドのスタックと信号マスクなどの情報を保持している。この情報は「ユーザ・スレッド固有属性（user thread specific attribute）」とも呼ばれる。この平行的休眠によって、カーネル・スレッド３１２は他のユーザ・スレッドを実行しうると称するが、切り離し済みリスト３２２中のスレッドを先に使用してもらいたいと思っている。優先するのは、カーネル・スレッド３１２に付随するユーザ・スレッド、すなわちユーザ・スレッド３００を実行することである。半切り離し済みリスト３２８は様々な態様で実現できるが、特定のインプリメンテーションによって決まる。この例では、このリストはスレッド構造体から成るリンクされたカーネルとして実現している。
【００２７】
ユーザ・スレッド３００が休眠状態からウェイクすると、カーネル・スレッド３１２は半切り離し済みリスト３２８から自身を除去した後、ユーザ・スレッド３００の実行を継続する。この機構によって、Ｐスレッド・ライブラリ３２４中のスレッドをウェイクさせる際に要するレイテンシ（待ち時間、遅延時間）を小さくする経路が実現する。このような機構が有用なのは、争奪状態にある相互排除（contested mutex)、状態変数（condition variable）、または信号（signal）からウェイクアップ（waking up)する（実行可能状態になる）ときである。なぜなら、これらのイベントに続いて実行するアクションはプログラムの残部が先に進む前に完了している必要があるからてある。
【００２８】
半切り離し済みリスト３２８中のカーネル・スレッドが後刻、別のユーザ・スレッドを実行する必要がある場合、切り離しを後で実行するために負うことになるパフォーマンス上のペナルティは次のようにすることにより回避することができる。すなわち、カーネル・スレッドを切り離すことなく、現在のユーザ・スレッドの状態から新たなユーザ・スレッドの状態へ移行させることによってである。たとえば、カーネル・スレッド３１２が半切り離し済みリスト３２８にあり、別のユーザ・スレッド（たとえばユーザ・スレッド３０２）が当該スレッドを実行するカーネル・スレッド３１２を必要としている場合、ユーザ・スレッド３００に付随するスタックをユーザ・スレッド３０２に取り付ける。これはユーザ・スレッド３０２の属性に合致する、ユーザ・スレッド３００用のスタック中の属性を変更することにより行う。たとえば、スタック・ポインタと信号マスクをユーザ・スレッド３００用のものからユーザ・スレッド３０２用のものへ変更する。
【００２９】
この結果、カーネル・スレッドが完全に切り離されるのは当該カーネル・スレッドに付随するユーザ・スレッドが出る（exit）すなわち終了するときだけになる。したがって大部分の場合、通常の切り離しに付随するパフォーマンス上のオーバーヘッドは避けられる。
【００３０】
次に、図４〜図６を参照する。図４〜図６は半切り離し済みリスト中で使用するデータ構造を本発明の好適な実施形態に従って示す図てある。これらのデータ構造は半切り離し済みリスト（たとえば、図３に示す半切り離し済みリスト３２８）を実現するのに使用することができる。
【００３１】
図４では、異なる複数のカーネル・スレッドを指すのにリンク済みリストを使用している。たとえば、異なる複数のカーネル・スレッドを指すのにエントリ４００とエントリ４０２を使用している。リスト・ヘッド・マーカ４０６はリンク済みリストの開始位置を特定している。エントリ４００は前ポインタ４０８と次ポインタ４１０を備えている。エントリ４０２は前ポインタ４１２と次ポインタ４１４を備えている。これらのポインタはリンク済みリスト中の前エントリと次エントリを指すのに使用する。また、エントリ４００はポインタ４１６を備え、エントリ４０２はポインタ４１８を備えている。これらのポインタはカーネル・スレッド（たとえばカーネル・スレッド４２０、４２２）を指している。
【００３２】
次に図５において、上記リスト構造で使用する情報はスレッド構造に取り込まれている。この例では、リスト・ヘッド・マーカ４３０は開始位置すなわち第１のスレッド（カーネル・スレッド４３２）を指している。カーネル・スレッド４３２はカーネル・スレッド４３６を指す次ポインタ４３４を備えている。カーネル・スレッド４３２は上記リスト中の何らかの前カーネルを指す前ポインタ４３８も備えている。カーネル・スレッド４３６はカーネル・スレッド４３２を差し返す前ポインタ４４０を備えている。カーネル・スレッド４３６中の次ポインタ４４２は上記リスト中の次のカーネル・スレッドを指している。この例は説明中の例における好適なリスト構造である。
【００３３】
図６では、異なる複数のカーネル・スレッドを指すのにアレイ４５０を使用している。リスト・ヘッド・マーカ４５２が、ポインタ４５４、４５６、４５８を備えたアレイ４５０の開始位置を指している。これらのポインタはカーネル・スレッド４６０、４６２、４６４をそれぞれ指している。これらの例は半切り離し済みリストを実現する方法を説明するものとしてのみ提示されている。他の種類の構造（たとえばツリーなど）を使用することもできるが、それは特定のインプリメンテーションによって決まる。
【００３４】
次に、図７を参照する。図７はブロック化呼び出し（blocking call)を処理するのに使用する既知の方法のフローチャートを示す図である。図７に示す方法はライブラリ（たとえば、図３に示したＰスレッド・ライブラリ３２４など）に実装することができる。ブロック化呼び出しとはユーザ・レベルのスレッドを実行状態または実行可能状態から別の状態、すなわち待機状態または休眠状態に変化させうる任意の呼び出しのことである。
【００３５】
本方法は潜在的なブロック化呼び出しを検出することにより開始する（ステップ５００）。次いで、本方法はユーザ・スレッドからカーネル・スレッドを切り離す（ステップ５０２）。ステップ５０２にはユーザ・スレッドのスタックからカーネル・スレッドのスタックへの情報のコピーおよび他のオペレーション（たとえば、信号を阻止するための信号マスキングの変更など）のためのオーバーヘッドが伴う。次いで、本方法は実行すべき新たなユーザ・スレッドを探索する（ステップ５０４）。実行可能なスレッドが見つかったら、当該新たなユーザ・スレッドにカーネル・スレッドを取り付ける（ステップ５０６）。ステップ５０６にはカーネル・スレッドのスタックから当該ユーザ・スレッドのスタックへのデータのコピーおよび信号マスクの設定などのオーバーヘッドが伴う。次いで、当該新たなユーザ・スレッドを実行した後（ステップ５０８）、本方法は終了する。
【００３６】
ステップ５０４を再度参照する。実行可能なスレッドがない場合、カーネル・スレッドを切り離し済みリストに配置した後、休眠状態に入れる。以後、本方法はユーザ・スレッドが実行可能になるのを検出するのを待ち受ける（ステップ５１２）。その後、実行可能であることが検出されたユーザ・スレッドにカーネル・スレッドを取り付ける（ステップ５１４）。次いで、カーネル・スレッドがこのユーザ・スレッドを実行する。その後、本方法は終了する。
【００３７】
次に、図８を参照する。図８はアイドル状態にあるスレッドを管理する方法のフローチャートを本発明の好適な実施形態に従って示す図である。図８に示す方法はライブラリ（たとえば、図３に示したＰスレッド・ライブラリ３２４）に実装することができる。
【００３８】
本方法は潜在的なブロック化呼び出しを検出することにより開始する（ステップ６００）。この潜在的なブロック化呼び出しはユーザ・レベルのスレッドを待機状態または休眠状態に置くものである。休眠状態または待機状態にあるスレッドを「非実行可能」スレッドと呼ぶ。次いで、本方法は実行すべき新たなスレッドを探索する（ステップ６０２）。実行可能なユーザ・スレッドが見つかったら、本方法はカーネル・スレッドを当該新たなユーザ・スレッドに切り換える（ステップ６０４）。ステップ６０４の切り換えはユーザ・レベルのディスパッチャによって行う。ディスパッチャのインプリメンテーション次第で、この切り換えはカーネル・スレッドの切り離しと再取り付けを伴ったり、伴わなかったりする。次いで、カーネル・スレッドが当該ユーザ・スレッドを実行する（ステップ６０６）。その後、本方法は終了する。
【００３９】
ステップ６０２を再度参照する。実行可能なユーザ・スレッドが見つからなかった場合、カーネル・スレッドを半切り離し済み休眠状態に配置する（ステップ６０８）。この種の休眠状態においては、カーネル・スレッドを半切り離し済みリストに配置した後、休眠状態にいれる。カーネル・スレッドに付随するユーザ・スレッドは現状を維持させるか、あるいはカーネル・スレッドとともに半切り離し済みリストに列挙する。この関連付けを行うのは、当該特定のカーネル・スレッドを使用して、必要でない限り、別のユーザ・スレッドを実行させるのではなく、当該ユーザ・スレッドを実行させるのを選好したということを表示するためである。
【００４０】
その後、イベントを検出して処理する（ステップ６１０）。そのイベントが、カーネル・スレッドに付随するユーザ・スレッドが実行可能になるというものであるなら、カーネル・スレッドが当該ユーザ・スレッドを実行する（ステップ６１２）。その後、本方法は終了する。ステップ６１０を再度参照する。カーネル・スレッドに付随するユーザ・スレッドが出る、またはカーネル・スレッドを必要としなくなった場合、カーネル・スレッドを切り離し済みリストに配置した後、休眠させる（ステップ６１４）。その後、本方法は終了する。詳述すると、ステップ６１４は図７に示す一連のステップ群に入り、ステップ５１０から開始する。
【００４１】
ステップ６１０に戻る。当該イベントが他の任意のイベントである場合、本方法は実行すべきユーザ・スレッドを探索する（ステップ６１６）。実行可能なスレッドが見つからなければ、本方法はステップ６０８に戻る。そうではなく、別のユーザ・スレッドが実行可能になるなら、本方法はカーネル・スレッドを実行可能になったユーザ・スレッドに切り換える（ステップ６１８）。このステップには２つのオペレーション、すなわち切り離しと取り付けが含まれている。あるいは、カーネル・スレッドを現在のユーザ・スレッドから新たなユーザ・スレッドに切り換える単一のオペレーションを用いてもよい。次いで、カーネル・スレッドが当該ユーザ・スレッドを実行する（ステップ６２０）。その後、本方法は終了する。
【００４２】
次に、図９を参照する。図９はカーネル・スレッドをウェイクさせるのに使用する既知の方法のフローチャートを示す図である。図９に示す方法はライブラリ（たとえば、図３に示したＰスレッド・ライブラリ３２４）に実装することができる。この図に示す方法によって、スレッド（a thread）はユーザ・スレッドが実行可能になるのが検出されるまで待機または休眠することが可能になる。
【００４３】
本方法はカーネル・スレッドを求めて切り離し済みリストを検査することにより開始する（ステップ７００）。この切り離し済みリストが空でない場合、当該切り離し済みリストからカーネル・スレッドを除去する（ステップ７０２）。次いで、このカーネル・スレッドをウェイクさせる（ステップ７０４）。その後、本方法を終了する。ステップ７００を再度参照する。上記切り離し済みリストが空である場合、本方法は終了する。
【００４４】
次に、図１０を参照する。図１０はカーネル・スレッドを処理するのに使用する方法のフローチャートを本発明の好適な実施形態に従って示す図である。図１０に示す方法はライブラリ（たとえば、図３に示したＰスレッド・ライブラリ３２４）に実装することができる。本方法は別のカーネル・スレッドを実行可能にするカーネル・スレッドにおいて開始する。
【００４５】
本方法はカーネル・スレッドを求めて切り離し済みリストを検査することにより開始する（ステップ８００）。当該切り離し済みリストが空なら、本方法はカーネル・スレッドを求めて半切り離し済みリストを検査する（ステップ８０２）。当該半切り離し済みリストが空なら、本方法は終了する。そうではなく、当該半切り離し済みリストが空でないなら、当該半切り離し済みリストからカーネル・スレッドを除去する（ステップ８０４）。次いで、当該半切り離し済みリストから除去したカーネル・スレッドをウェイクさせる（ステップ８０６）。その後、本方法は終了する。その時点で、当該カーネル・スレッドは実行している。
【００４６】
ステップ８００を再度参照する。上記切り離し済みリストが空でない場合、カーネル・スレッドを当該切り離し済みリストから除去する（ステップ８０８）。次いで、当該カーネル・スレッドをウェイクさせる（ステップ８１０）。その後、本方法は終了する。本発明の機序が切り離し済みリストを依然として採用しているのは半切り離しではなく切り離しを必要とする状況が存在するからである。このリストは既存のユーザ・スレッドのために必要になる可能性がある。その場合、ユーザ・スレッドをウェイクさせるときに、カーネル・スレッドを半切り離し済みリストから選択するのよりもカーネル・スレッドを切り離し済みリストから選択することの方が選好される。
【００４７】
したがって、本発明はアイドル状態にあるカーネル・スレッドを取り扱うための改良された方法、装置、およびコンピュータ命令群を提供する。本発明の機序によれば、カーネル・スレッドを切り離した後、引き続いて再取り付けすることに現在は伴うオーバーヘッドを回避することが可能になる。また、本発明の機序によれば、起こりうるスタックのオーバーフローを回避することも可能になる。これらの利点は半切り離し法を用いることにより得られる。この方法はカーネル・スレッドを半切り離し済みリストに配置するステップと、その後に当該カーネル・スレッドを休眠状態にするステップとを含んでいる。これらのステップはカーネル・スレッドをユーザ・スレッドから切り離す際に通常は必要とされるステップ群を必要とすることなく実行される。
【００４８】
次に示す点に留意するのが重要である。すなわち、完全に機能するデータ処理システムの文脈で本発明を説明したが、当業者が認識しうるように、本発明のプロセスは命令群から成るコンピュータ読み取り可能な媒体の形態など、様々な形態で頒布することができる、さらに、本発明は頒布を行うのに実際に使用する特定の種類の信号担持媒体とは無関係に等しく適用することができる。コンピュータ読み取り可能な媒体の例としては記録可能型媒体（たとえば、フロッピー(R) ディスク、ハード・ディスク駆動装置、ＲＡＭ、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭなど）、ならびに伝送型媒体（たとえば、ディジタル通信リンクおよびアナログ通信リンク、無線周波数伝送や光波伝送などの伝送形態を用いた有線通信リンクまたは無線通信リンクなど）が挙げられる。このコンピュータ読み取り可能な媒体は、復号して特定のデータ処理システムにおける実際の使用に供する符号化済みフォーマットの形態をとりうる。
【図面の簡単な説明】
【００４９】
【図１】本発明を実現しうるデータ処理システムの実体を本発明の好適な実施形態に従って示す図である。
【図２】本発明を実現しうるデータ処理システムのブロック図である。
【図３】カーネル・スレッドを取り扱う際に使用するコンポーネントを示す図である。
【図４】半切り離しリストで使用するデータ構造を示す図である。
【図５】半切り離しリストで使用するデータ構造を示す図である。
【図６】半切り離しリストで使用するデータ構造を示す図である。
【図７】ブロック化呼び出しを処理するのに使用する既知の方法のフローチャートを示す図である。
【図８】アイドル状態にあるスレッドを管理するのに使用する方法のフローチャートを示す図である。
【図９】カーネル・スレッドをウェイクさせるのに使用する既知の方法のフローチャートを示す図である。
【図１０】カーネル・スレッドを取り扱うのに使用する方法のフローチャートを示す図である。
【符号の説明】
【００５０】
１００  コンピュータ
１０２  システム・ユニット
１０４  画像表示端末
１０６  キーボード
１０８  記憶装置
１１０  マウス
２００  データ処理システム
２０２  プロセッサ
２０４  メイン・メモリ
２０６  ＰＣＩローカル・バス
２０８  ＰＣＩブリッジ
２１０  ＬＡＮアダプタ
２１２  ＳＣＳＩホスト・バス・アダプタ
２１４  拡張バス・インタフェース
２１６  音声アダプタ
２１８  グラフックス・アダプタ
２１９  音声／画像アダプタ
２２０  キーボード／マウス・アダプタ
２２２  モデム
２２４  メモリ
２２６  ハード・ディスク駆動装置
２２８  テープ駆動装置
２３０  ＣＤ−ＲＯＭ駆動装置
３００  ユーザ・スレッド
３０２  ユーザ・スレッド
３０４  ユーザ・スレッド
３０６  ユーザ・スレッド
３０８  ユーザ・スレッド
３１０  ユーザ空間
３１２  カーネル・スレッド
３１４  カーネル・スレッド
３１８  カーネル空間
３２０  ユーザ・スレッド・スタック群
３２２  切り離し済みリスト
３２４  Ｐスレッド・ライブラリ
３２６  カーネル・スレッド・スタック群
３２８  半切り離し済みリスト
４００  エントリ
４０２  エントリ
４０６  リスト・ヘッド・マーカ
４０８  前ポインタ
４１０  次ポインタ
４１２  前ポインタ
４１４  次ポインタ
４１６  ポインタ
４１８  ポインタ
４２０  カーネル・スレッド
４２２  カーネル・スレッド
４３０  リスト・ヘッド・マーカ
４３２  カーネル・スレッド
４３４  次ポインタ
４３６  カーネル・スレッド
４３８  前ポインタ
４４０  前ポインタ
４４２  次ポインタ
４５０  アレイ
４５２  リスト・ヘッド・マーカ
４５４  ポインタ
４５６  ポインタ
４５８  ポインタ
４６０  カーネル・スレッド
４６２  カーネル・スレッド
４６４  カーネル・スレッド
【図１】
2005539322.tif 000003
【図２】
2005539322.tif 000004
【図３】
2005539322.tif 000005
【図４】
2005539322.tif 000006
【図５】
2005539322.tif 000007
【図６】
2005539322.tif 000008
【図７】
2005539322.tif 000009
【図８】
2005539322.tif 000010
【図９】
2005539322.tif 000011
【図１０】
2005539322.tif 000012
【国際調査報告】
2005539322.tif 000013
2005539322.tif 000014