(57)【要約】【課題】  スタックポインタによって実行状態にあるスレッドを特定する設計のカーネルスレッド上で、ユーザスレッド実行中にエラーを発生することなく実行状態にあるカーネルスレッドを特定することの可能なユーザスレッドの実装方法を提供すること。【解決手段】  本発明のユーザスレッド実装方法は、第１のメモリ領域にスタックを配置するように設定されたカーネルスレッド上にユーザスレッドを実装する方法において、実行状態にあるユーザスレッドのスタックは前記第１のメモリ領域に、実行状態にないユーザスレッドのスタックは前記第１のメモリ領域の外に設けられた第２のメモリ領域に保存し、実行状態にあるユーザスレッドを切り替える際に、実行状態から非実行状態に遷移させるユーザスレッドのスタックを前記第１の領域から前記第２の領域に退避するとともに、非実行状態から実行状態に遷移させるユーザスレッドのスタックを前記第２の領域から前記第１の領域に復元する。【選択図】図１
2008210038.tif 000002
【特許請求の範囲】
【請求項１】
第１のメモリ領域にスタックを配置するように設定されたカーネルスレッド上にユーザスレッドを実装する方法において、
実行状態にあるユーザスレッドのスタックは前記第１のメモリ領域に、実行状態にないユーザスレッドのスタックは前記第１のメモリ領域の外に設けられた第２のメモリ領域に保存し、
実行状態にあるユーザスレッドを切り替える際に、実行状態から非実行状態に遷移させるユーザスレッドのスタックを前記第１の領域から前記第２の領域に退避するとともに、非実行状態から実行状態に遷移させるユーザスレッドのスタックを前記第２の領域から前記第１の領域に復元することを特徴とするユーザスレッドの実装方法。
【請求項２】
仮想記憶機能を備えた環境にて、第１の論理アドレス領域にスタックを配置するように設定されたカーネルスレッド上にユーザスレッドを実装する方法において、
実行状態にあるユーザスレッドのスタックを記憶した物理アドレスを前記第１の論理アドレス領域内にマッピングし、
実行状態にあるユーザスレッドを切り替える際には、非実行状態から実行状態に遷移させるユーザスレッドのスタックを記憶した物理アドレスを前記第１の論理アドレス領域内にマッピングし直すことを特徴とするユーザスレッドの実装方法。
【請求項３】
ページング方式の仮想記憶機能を備えた環境にて、第１の論理アドレス領域にスタックを配置するように設定されたカーネルスレッド上にユーザスレッドを実装する方法において、
実行状態にあるユーザスレッドのスタックを記憶したページを前記第１の論理アドレス領域にマッピングし、
実行状態にあるユーザスレッドを切り替える際には、非実行状態から実行状態に遷移させるユーザスレッドのスタックを記憶したページを前記第１の論理アドレス領域内にマッピングし直すことを特徴とするユーザスレッドの実装方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ユーザスレッドの実装方法に関するものである。
【背景技術】
【０００２】
コンピュータシステムで実行されるプログラムのインスタンスであるプロセス（タスク）を複数生成し、それらを切り替えながら実行することにより複数の処理を同時並行的に実現するマルチタスク機能は、各種オペレーティングシステム（ＯＳ）に搭載され、サーバコンピュータやパーソナルコンピュータから組み込みシステムにまで広く利用されている。
【０００３】
ＯＳのマルチタスク機能は、プロセスごとに独立した仮想メモリマップ、ファイル記述子、ユーザＩＤを提供し、各プロセスについて各々固有のデータ、コード、カーネル状態、１セットのＣＰＵレジスタ群を管理する。ここで、プロセスとプロセスは互いに独立した存在であり、１つのプロセスを他のプロセスと連携させるには、プロセス間通信や共有メモリ等の機能を利用する必要がある。
【０００４】
これに対して、１つのプロセス上で行う処理をより細かい単位に分割し、データや変数等はプロセス内で共用しつつ、分割された単位で同時並行的に処理を実行するものがスレッドである。スレッドは、ＯＳの基本的なコンポーネントであるカーネルのレベルで実装されたカーネルスレッドと、カーネルよりも高いユーザレベルで実装されたユーザスレッドとに大別することができる。ここで、カーネルスレッドのコードは、カーネルプロセスに割り当てられたメモリ空間であるカーネル空間に配置され、カーネルモード（スーパーバイザーモード）のＣＰＵで実行される。これに対して、ユーザスレッドのコードは、ユーザプロセスに割り当てられたメモリ空間であるユーザ空間に配置され、ユーザモードのＣＰＵで実行される。
【０００５】
カーネルスレッドは各種アプリケーションで共通的に利用されるものであり、汎用的な機能を備えたものであるため、特定のアプリケーション向けに最適化することはできない。これに対して、ユーザスレッドはアプリケーションの特性に応じて最適化することが可能であり、設計によってはカーネルスレッドよりもスレッド切り替えのオーバーヘッドを小さくすることもでき、消費メモリを低減することも可能である。また、１つのカーネルスレッド上で複数のユーザスレッドを動作させることにより、カーネルスレッドとユーザスレッドを併存させることも可能である。
【０００６】
スレッドを実装するにあたっては、少なくとも、スレッドが利用するためのスタック領域と、スレッド上でのプログラム実行を制御するスタックポインタやプログラムカウンタといったレジスタの状態を保存するための領域を確保する必要がある。
【０００７】
ユーザスレッドのスタックを取り扱う方法に関する先行技術としては、非実行状態にあるスレッドのスタック領域を二次記憶装置のスワップ領域ではなくファイル領域に保存する特開平６−５１９８０号公報、実際に使用されているスタック領域のみを退避／復元する特開平６−６７９７８号公報および特開平６−２５０９２３号公報を挙げることができる。
【特許文献１】特開平６−５１９８０号公報
【特許文献２】特開平６−６７９７８号公報
【特許文献３】特開平６−２５０９２３号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかし、ユーザスレッドをカーネルスレッドの１つの上で実行する場合、ユーザスレッドのスタックを、カーネルスレッドに割り当てられたスタック領域の外に確保すると以下に述べるような不都合を生じる。
【０００９】
すなわち、一部のカーネルスレッドの実装は、現在のスタックポインタが指しているメモリがどのカーネルスレッドのスタックに割り当てられているか判断し、それに基づいて実行中のカーネルスレッドを特定している。このため、ユーザスレッドのスタックがカーネルスレッドのスタック領域の外に配置されていると、このような実装ではスタックポインタが指している位置から実行状態にあるカーネルスレッドを特定することはできず、エラーが発生してしまう。
【００１０】
このようなエラーの発生を防止するためには、例えば利用されるユーザスレッドの数が予め分かっている場合には、カーネルスレッドのスタック領域を、利用されるユーザスレッド用スタックが全て入るようなサイズだけ確保し、カーネルスレッドのスタック領域内にユーザスレッド用スタックを全て収容することが有効であると考えられる。しかし、利用されるユーザスレッドの数が確定していない場合には、ユーザスレッド数の増大によりカーネルスレッドのスタック領域が足りなくなるおそれがある。
【００１１】
このような問題は、カーネルスレッドの実装方法によって発生するので、カーネルスレッドの機能を提供するコード（ＯＳカーネルに含まれる）を修正することによって対処可能である。しかし、影響範囲が広いＯＳカーネルに手を入れることは難しい場合もあるため、ユーザスレッドの実装方法によって解決することが望ましい。
【００１２】
上記事情に鑑み、本発明は、スタックポインタによって実行状態にあるスレッドを特定する設計のカーネルスレッド上で、ユーザスレッド実行中にエラーを発生することなく実行状態にあるカーネルスレッドを特定することの可能なユーザスレッドの実装方法を提供することを目的とする。
【課題を解決するための手段】
【００１３】
上記課題を解決するため、本発明の第１の観点は、第１のメモリ領域にスタックを配置するように設定されたカーネルスレッド上にユーザスレッドを実装する方法において、
実行状態にあるユーザスレッドのスタックは前記第１のメモリ領域に、実行状態にないユーザスレッドのスタックは前記第１のメモリ領域の外に設けられた第２のメモリ領域に保存し、
実行状態にあるユーザスレッドを切り替える際に、実行状態から非実行状態に遷移させるユーザスレッドのスタックを前記第１の領域から前記第２の領域に退避するとともに、非実行状態から実行状態に遷移させるユーザスレッドのスタックを前記第２の領域から前記第１の領域に復元することを特徴とするユーザスレッドの実装方法を提供する。
【００１４】
また、本発明の第２の観点は、仮想記憶機能を備えた環境にて、第１の論理アドレス領域にスタックを配置するように設定されたカーネルスレッド上にユーザスレッドを実装する方法において、
実行状態にあるユーザスレッドのスタックを記憶した物理アドレスを前記第１の論理アドレス領域内にマッピングし、
実行状態にあるユーザスレッドを切り替える際には、非実行状態から実行状態に遷移させるユーザスレッドのスタックを記憶した物理アドレスを前記第１の論理アドレス領域内にマッピングし直すことを特徴とするユーザスレッドの実装方法を提供する。
【００１５】
さらに、本発明の第３の観点は、ページング方式の仮想記憶機能を備えた環境にて、第１の論理アドレス領域にスタックを配置するように設定されたカーネルスレッド上にユーザスレッドを実装する方法において、
実行状態にあるユーザスレッドのスタックを記憶したページを前記第１の論理アドレス領域にマッピングし、
実行状態にあるユーザスレッドを切り替える際には、非実行状態から実行状態に遷移させるユーザスレッドのスタックを記憶したページを前記第１の論理アドレス領域内にマッピングし直すことを特徴とするユーザスレッドの実装方法を提供する。
【発明の効果】
【００１６】
本発明にかかるユーザスレッドの実装方法によれば、実行状態にあるユーザスレッドのスタックは常にカーネルスレッドのスタック領域に配置されるので、エラーを発生することなくスタックポインタの指す位置に基づいて実行状態にあるカーネルスレッドを特定することができる。また、実行状態から非実行状態に遷移したユーザスレッドのスタックはカーネルスレッドのスタック領域から退避されるので、カーネルスレッドのスタック領域には常にユーザスレッド１個分のスタックしか存在せず、ユーザスレッド数が増えてもカーネルスレッドのスタック領域が足りなくなることはない。
【００１７】
また、このようなユーザスレッドの実装方法は、ページング方式等の仮想記憶機能を利用して実現すればユーザスレッド切替のオーバーヘッドを最低限とすることができ、より好適である。
【発明を実施するための最良の形態】
【００１８】
以下、本発明を実施するための最良の形態について説明する。図１は、本発明の一実施形態にかかるユーザスレッド実装方法を適用したシステムの概略的な構成を示した図面である。図１に示すように、このシステム１００のソフトウェア構成は、主として、プロセス管理モジュール１０２、カーネルスレッド管理モジュール１０３および仮想メモリ管理モジュール１０４を含むカーネル１０１と、このカーネル１０１によって生成される第１のプロセス１１０上で実行されるユーザスレッド管理モジュール１４２およびアプリケーションモジュール１４３からなっている。なお、図１には論理的な構成であるプロセスおよびスレッドについても併せて示し、さらにメモリ上の構成についても一部言及している。
【００１９】
カーネル１０１は、ＣＰＵ、メモリ、入出力等のハードウェアを抽象化して、アプリケーションに各種機能を提供するオペレーティングシステムの中心をなすコンポーネントであり、プロセス管理モジュール１０２と、カーネルスレッド管理モジュール１０３と、仮想メモリ管理モジュール１０４とを含んでいる。プロセス管理モジュール１０２は、システム１００のメモリ上に複数のプロセス空間を生成し、各プロセス空間にて互いに独立してプログラムを実行する。さらにプロセス管理モジュール１０２は、ＣＰＵの処理時間を短い時間に分割して複数のプロセスへ順に割り当てることによって、１つのシステムで複数のプログラムを同時並行的に動作させることが可能である。図１には、プロセス管理モジュール１０２によって、第１のプロセス１１０および第２のプロセス１１１が生成されている状態を示す。このようなプロセスにおけるプログラムの実行はユーザ空間２０１内で行われるが、プロセスの生成および終了、プロセスの切替は、いずれもカーネル１０１のプロセス管理モジュール１０２によって行われる。
【００２０】
仮想メモリ管理モジュール１０４は、システム１００を実行するハードウェアが持っているメモリの実際のアドレス（物理アドレス）を仮想アドレスに変換し、また、仮想アドレスを物理アドレスに変換する。仮想メモリ管理モジュール１０４は、例えば、ＣＰＵに内蔵される等したＭＭＵ（Ｍｅｍｏｒｙ  Ｍａｎａｇｅｍｅｎｔ  Ｕｎｉｔ）を利用してアドレス変換の機能を実現するようにしてもよい。
【００２１】
カーネルスレッド管理モジュール１０３は、各プロセス上にカーネルスレッドを生成し、生成されたカーネルスレッド上ではプロセス内のメモリを共有しながら各々プログラムが実行される。さらにカーネルスレッド管理モジュール１０３は、ＣＰＵの処理時間を短い時間に分割して複数のスレッドへ順に割り当てることによって、１つのプロセス内で複数の処理を同時並行的に行うことが可能である。図１には、スレッド管理モジュール１０３によって、第１のプロセス１１０上に第１のカーネルスレッド１２０および第２のカーネルスレッド１２１が生成されている状態を示す。このようなカーネルスレッドにおいても、プログラムの実行は前述のプロセスと同様にユーザ空間２０１内で行われるが、カーネルスレッドの生成および終了、カーネルスレッドの切替は、いずれもカーネル１０１のカーネルスレッド管理モジュール１０３によって行われる。
【００２２】
以上のようなモジュールを含んだカーネル１０１は、カーネル空間２００に配置されてＣＰＵにより実行される。また、第１および第２のプロセス１１０および１１１については、それらのプロセス管理情報はカーネル空間２００に配置される一方、れぞれのプロセス空間はユーザ空間に配置される。
【００２３】
次に、第１のプロセス１１０において実現される機能と、そのプロセス空間におけるメモリ配置について説明する。図１に矩形で示すように、第１のプロセス１１０のメモリ配置はカーネル空間２００とユーザ空間２０１との双方にまたがっている。このうちカーネル空間２００内にはプロセスＩＤ、プロセスが利用するレジスタ群の値、プロセスが利用するユーザ空間（プロセス空間）のアドレス管理データ、オープンしているファイルとソケットのリスト等のプロセス管理情報が配置される。一方、ユーザ空間２０１内には、まず第１のプロセス１１０上で実行されるプログラムのコードおよび変数を格納したコード・変数領域１４０と、第１のプロセス１１０上でプログラム実行中になされた動的なメモリ確保要求に対応するためのメモリ領域であるヒープ領域１４１とが設けられている。コード・変数領域１４０には、第１のプロセス１１０上で実行されるアプリケーションモジュール１４３と、第１のプロセス１１０に生成されたカーネルスレッド上にユーザスレッドを生成するユーザスレッド管理モジュール１４２が配置されている。
【００２４】
図１に示すとおり、このアプリケーションモジュール１４３は、カーネル１０１のカーネルスレッド管理モジュール１０３を呼び出すことにより第１および第２のカーネルスレッド１２０および１２１を生成し、さらに、プロセス１１０内でユーザスレッド管理モジュール１４２を呼び出すことにより第１のカーネルスレッド１２０上に第１，第２および第３のユーザスレッド１３０，１３１および１３２を生成し、これらのスレッド上で実行される。その際、アプリケーションモジュール１４３またはユーザスレッド管理モジュール１４２から一時的に利用するためのメモリ要求がなされた場合には、カーネル１００がヒープ領域１１０の所定サイズを確保してメモリ割り当てを行う。
【００２５】
図１において、第１および第２のカーネルスレッド１２０および１２１と、第１，第２および第３のユーザスレッド１３０，１３１および１３２とは、いずれも機能的な構成を示したものである。これらのスレッドは、それぞれプログラムカウンタ（インストラクションポインタ）を含むレジスタ群の値とスタックとが個々に管理されており、実行中スレッドの切り替えはカーネルスレッド管理モジュール１０３またはユーザスレッド管理モジュール１４２がこれらを切り替えることにより行われる。
【００２６】
また、第１および第２のカーネルスレッド１２０および１２１については、第１および第２のプロセス１１０および１１１と同様に、管理情報はカーネル空間２００に配置されるが、その実体であるスタック等はユーザ空間２０１内に配置される。
【００２７】
ここで、カーネルスレッド管理モジュール１０３は、カーネルスレッドの生成時または初期化時に当該プロセスで利用可能なユーザ空間の一部をスタック領域として割り当てられるようになっている。本実施形態では、第１のカーネルスレッド１２０には第１のメモリ領域１５０がスタック領域として割り当てられており、第２のカーネルスレッド１２１には別のメモリ領域（不図示）がスタック領域として割り当てられている。
【００２８】
一方、図１に示すように、第１のカーネルスレッド１２０上には、ユーザスレッド管理モジュール１４２によって第１，第２および第３のユーザスレッド１３０，１３１および１３２が生成されている。これらのスタックデータについては、実行状態にあるユーザスレッドのスタックデータは第１のメモリ領域１５０に配置されるが、実行状態にないユーザスレッドのスタックデータは第２のメモリ領域１５１に配置される。したがって、第１，第２および第３のユーザスレッド１３０，１３１および１３２の間でユーザスレッドの切り替えが行われる際には、第１のメモリ領域１５０および第２のメモリ領域１５１の間でスタックデータの復元／退避が行われる。この復元／退避の動作については、実メモリ上でデータを移動させる第１の動作と仮想メモリを利用する第２の動作とに分けて、以下に詳述する。
【００２９】
[第１の動作]
図２は、スタックデータの復元／退避を、実メモリ上でデータを移動させることにより行う第１の動作におけるメモリの利用形態を説明するための図（要部のみ図示）である。
図２に示すように、第１の動作では、第１のメモリ領域１５０には常に実行状態にあるユーザスレッドのスタックデータ１５２が配置され、実行状態にあるユーザスレッドが非実行状態に遷移した際に当該ユーザスレッドのスタックデータは第１のメモリ領域１５０から第２のメモリ領域１５１に移される。また、非実行状態にあるユーザスレッドが実行状態に遷移した場合には前回保存された当該ユーザスレッドのスタックデータが第２のメモリ領域１５１から第１のメモリ領域１５０に戻される。
【００３０】
以下、第１の動作を図３のフローチャートを参照しながら説明する。ここでは、実行状態にあるユーザスレッドを、第１のユーザスレッド１３０から第２のユーザスレッド１３１へ遷移させる場合について示す。
まず、ユーザスレッド管理モジュール１４２がスレッド切り替えのトリガーを検出する（ＳＴ１０１）。このようなトリガーは、実行中スレッドが自発的に発行するものと、実行中スレッドが発行するもの以外との２種類に大別される。前者としては、例えば、実行中スレッドが所定の入出処理を完了した場合やロックの解放待ちに入る場合に発行されるものを挙げることができる。また、後者としては、実行中スレッドのＣＰＵ占有時間が所定時間を超えたことの通知や、実行中のスレッドよりも優先順位の高いスレッドが実行可能状態になったことの通知を挙げることができる。
【００３１】
スレッド切り替えのトリガーを検出したユーザスレッド管理モジュール１４２は、まず第１のユーザスレッド１３０を停止させ（ＳＴ１０２）、第１のユーザスレッド１３０が使用していたレジスタのコンテキストを保存する（ＳＴ１０３）。ＳＴ１０３でレジスタを保存する先には、特に制限はなく、レジスタの内容を第１のユーザスレッド１３０のスタックに積むことにより保存しても構わない。
【００３２】
続いて、第１のユーザスレッド１３０が使用していたスタックデータ１５２が第１のメモリ領域１５０から第２のメモリ領域に退避される（ＳＴ１０４）。ここでは、図２に示すように、第２のメモリ領域１５１として第１，第２および第３のユーザスレッドのスタックデータ１５３，１５４および１５５がそれぞれ退避できるような容量を確保し、それぞれのスタックデータを個々に保存する。ここでは、図２に矢印で示すように、第１のユーザスレッドのスタックデータ１５５を第１のメモリ領域１５０から第２のメモリ領域１５１にコピーすることにより退避させる。
【００３３】
その後、第２のユーザスレッド１３１について保存されているスタックデータ１５４を第２のメモリ領域１５１から第１のメモリ領域１５０に復元し（ＳＴ１０５）、さらに第２のユーザスレッド１３１について保存されているレジスタのコンテキストを復元する（ＳＴ１０６）。ここで、前述のようにレジスタの内容をユーザスレッドのスタックに積んで保存している場合には、スタックからポップした内容を各レジスタに配置することになる。
【００３４】
以上のようにして、前回第２のユーザスレッド１３１を実行状態から非実行状態へ遷移させた際に保存されたスタックデータとレジスタのコンテキストとが復元された後、これらを利用して第２のユーザスレッド１３１の実行が開始され（ＳＴ１０７）、ユーザスレッドの切り替え動作は完了する。
【００３５】
このような第１の動作によれば、実メモリ上でデータの移動／コピーを行うことにより、実行状態から非実行状態に遷移されるユーザスレッドのスタックデータは第１のメモリ領域１５０（第１のカーネルスレッド１２０のスタック領域）から退避され、非実行状態から実行状態に遷移されるユーザスレッドのスタックデータは第１のメモリ領域１５０（第１のカーネルスレッド１２０のスタック領域）に復元される。したがって、カーネルスレッド上で任意のユーザスレッドを実行している状態において、スタックポインタは常に第１のメモリ領域１５０（カーネルスレッドのスタック領域）の内部をポイントすることになる。これにより、カーネルスレッド管理モジュール１０３が現在のスタックポインタがポイントしている位置から実行中のカーネルスレッドを特定する実装となっていても、ユーザスレッドを利用している状態で、常に正しく実行中のカーネルスレッドを特定することが可能である。
【００３６】
[第２の動作]
図４は、スタックデータの復元／退避を、仮想メモリ技術を利用して行う第２の動作におけるメモリの利用形態を説明するための図（要部のみ図示）である。
図４に示すように、第２の動作では、ページング方式を利用して物理メモリページを仮想メモリページにマッピングする仮想メモリ機能を備えた環境下で、仮想アドレス空間上に第１のメモリ領域１５０が設けられ、第２のメモリ領域１５１は物理アドレス空間上、すなわち実メモリ上に設けられる。そして、この第２のメモリ領域１５１内に第１から第３のユーザスレッドのスタックデータ１５３，１５４，１５５が配置され、仮想メモリ管理モジュール１０４が実行中のユーザスレッドのスタックデータを格納した物理メモリページを第１のメモリ領域１５２の仮想メモリページにマッピングする。また、実行状態にあるユーザスレッドを切り替える際には、仮想メモリ管理モジュール１０４が第１のメモリ領域１５０にマッピングする物理メモリページを図４中にＡ〜Ｃで示すように切り替える。このように仮想メモリ管理モジュール１０４がマッピングを変更することは、例えば仮想メモリ管理モジュール１０４を保持しているページテーブルの記述を書き換えることにより行うことができる。
【００３７】
以下、第２の動作を図５のフローチャートを参照しながら説明する。ここでも、実行状態にあるユーザスレッドを、第１のユーザスレッド１３０から第２のユーザスレッド１３１へ遷移させる場合について示す。
まず、第１の動作と同様に、ユーザスレッド管理モジュール１４２がスレッド切り替えのトリガーを検出し（ＳＴ２０１）、第１のユーザスレッド１３０を停止させ（ＳＴ２０２）、第１のユーザスレッド１３０が使用していたレジスタのコンテキストを保存する（ＳＴ２０３）。
【００３８】
続いて、仮想メモリ管理モジュール１０４にてページテーブルが書き換えられ、第１のメモリ領域１５０の仮想メモリページに第２のユーザスレッドのスタックデータ１５４が保存された物理メモリページがマッピングされる（ＳＴ２０４）。ここでは、図４でＡを付して示したようにマッピングされていたページテーブルが、Ｂを付して示したようにマッピングするように書き換えられる。
【００３９】
その後は、第１の動作と同様に、第２のユーザスレッド１３１について保存されているレジスタのコンテキストが復元され（ＳＴ２０５）、第２のユーザスレッドの実行を開始（ＳＴ２０６）することで、ユーザスレッドの切り替えは完了する。
【００４０】
第２の動作によれば、仮想メモリ技術を利用することによって実メモリ上でデータの移動／コピーを行うことなく、第１のカーネルスレッド１２０のスタック領域である第１のメモリ領域１５０の仮想メモリページに、常に実行中のスタックデータを格納した物理メモリページがマッピングされる。したがって、カーネルスレッド上で任意のユーザスレッドを実行している状態において、スタックポインタは常に仮想アドレス空間上に設けられた第１のメモリ領域１５０内をポイントすることになる。これにより、カーネルスレッド管理モジュール１０３が現在のスタックポインタがポイントしている位置から実行中のカーネルスレッドを特定する実装となっていても、ユーザスレッドを利用している状態で、常に正しく実行中のカーネルスレッドを特定することが可能である。このような第２の動作では、第１の動作と比較して実メモリ上でデータの移動／コピーを行わないので、ユーザスレッドの切り替えに要するオーバーヘッドを第１の動作よりも低く抑えることができる。
【００４１】
以上説明したように、本実施形態によれば、実行状態にあるユーザスレッドのスタックは常にカーネルスレッドのスタック領域に配置されるので、スタックポインタの指す位置に基づいて実行状態にあるカーネルスレッドを特定する実装のカーネルスレッド管理モジュール１０３を利用しても、エラーを発生することなく正しく実行中のカーネルスレッドを特定することができる。また、実行状態から非実行状態に遷移したユーザスレッドのスタックはカーネルスレッドのスタック領域から退避されるので、カーネルスレッドのスタック領域には常にユーザスレッド１個分のスタックしか存在せず、ユーザスレッド数が増えてもカーネルスレッドのスタック領域が足りなくなることはない。
【００４２】
以上、本発明の実施の形態について説明したが、本発明はこれに限定されることなく、その趣旨を逸脱しない範囲で種々の改良・変更が可能であることは勿論である。
例えば、上記ではカーネル１００が仮想メモリ管理モジュール１０４を有している場合を示したが、上述した第１の動作を行う場合には仮想メモリ機能は必須ではないので、仮想メモリ管理モジュール１０４が無くても構わない。また、上記では固定長のページ単位で仮想メモリの管理を行うページング方式の場合を示したが、本発明は非固定長のセグメントを利用したセグメント方式の仮想メモリにおいても適用することが可能である。
【００４３】
本発明によれば、カーネルスレッド管理モジュールが現在スタックポインタが指している位置から実行中のカーネルスレッドを特定する実装であっても、そのようなカーネルスレッド上で最小限のスタック領域を利用してマルチスレッド環境を実現することの可能なユーザスレッドの実装方法が提供される。したがって、本発明のユーザスレッド実装方法は、カーネルやオペレーティングシステムに関わらず汎用的であり、またメモリ消費量も低く抑えられる。
【図面の簡単な説明】
【００４４】
【図１】本発明の一実施形態にかかるユーザスレッド実装方法を適用したシステムの概略的な構成を示した図である。
【図２】第１の動作におけるメモリの利用形態を説明するための図である。
【図３】第１の動作のフローチャートである。
【図４】第２の動作におけるメモリの利用形態を説明するための図である。
【図５】第２の動作のフローチャートである。
【符号の説明】
【００４５】
１００；システム、１０１；カーネル、１０２；プロセス管理モジュール、１０３；カーネルスレッド管理モジュール、１０４；仮想メモリ管理モジュール、１１０；第１のプロセス、１２０；第１のカーネルスレッド、１３０；第１のカーネルスレッド、１３１；第２のカーネルスレッド、１３２；第３のカーネルスレッド、１４２；ユーザスレッド管理モジュール、１５０；第１のメモリ領域、１５１；第２のメモリ領域
【図１】
2008210038.tif 000003
【図２】
2008210038.tif 000004
【図３】
2008210038.tif 000005
【図４】
2008210038.tif 000006
【図５】
2008210038.tif 000007