JP2008210038A - ユーザスレッドの実装方法 - Google Patents
ユーザスレッドの実装方法 Download PDFInfo
- Publication number
- JP2008210038A JP2008210038A JP2007044281A JP2007044281A JP2008210038A JP 2008210038 A JP2008210038 A JP 2008210038A JP 2007044281 A JP2007044281 A JP 2007044281A JP 2007044281 A JP2007044281 A JP 2007044281A JP 2008210038 A JP2008210038 A JP 2008210038A
- Authority
- JP
- Japan
- Prior art keywords
- thread
- user
- stack
- execution state
- kernel
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Abstract
【課題】 スタックポインタによって実行状態にあるスレッドを特定する設計のカーネルスレッド上で、ユーザスレッド実行中にエラーを発生することなく実行状態にあるカーネルスレッドを特定することの可能なユーザスレッドの実装方法を提供すること。
【解決手段】 本発明のユーザスレッド実装方法は、第1のメモリ領域にスタックを配置するように設定されたカーネルスレッド上にユーザスレッドを実装する方法において、実行状態にあるユーザスレッドのスタックは前記第1のメモリ領域に、実行状態にないユーザスレッドのスタックは前記第1のメモリ領域の外に設けられた第2のメモリ領域に保存し、実行状態にあるユーザスレッドを切り替える際に、実行状態から非実行状態に遷移させるユーザスレッドのスタックを前記第1の領域から前記第2の領域に退避するとともに、非実行状態から実行状態に遷移させるユーザスレッドのスタックを前記第2の領域から前記第1の領域に復元する。
【選択図】図1
【解決手段】 本発明のユーザスレッド実装方法は、第1のメモリ領域にスタックを配置するように設定されたカーネルスレッド上にユーザスレッドを実装する方法において、実行状態にあるユーザスレッドのスタックは前記第1のメモリ領域に、実行状態にないユーザスレッドのスタックは前記第1のメモリ領域の外に設けられた第2のメモリ領域に保存し、実行状態にあるユーザスレッドを切り替える際に、実行状態から非実行状態に遷移させるユーザスレッドのスタックを前記第1の領域から前記第2の領域に退避するとともに、非実行状態から実行状態に遷移させるユーザスレッドのスタックを前記第2の領域から前記第1の領域に復元する。
【選択図】図1
Description
本発明は、ユーザスレッドの実装方法に関するものである。
コンピュータシステムで実行されるプログラムのインスタンスであるプロセス(タスク)を複数生成し、それらを切り替えながら実行することにより複数の処理を同時並行的に実現するマルチタスク機能は、各種オペレーティングシステム(OS)に搭載され、サーバコンピュータやパーソナルコンピュータから組み込みシステムにまで広く利用されている。
OSのマルチタスク機能は、プロセスごとに独立した仮想メモリマップ、ファイル記述子、ユーザIDを提供し、各プロセスについて各々固有のデータ、コード、カーネル状態、1セットのCPUレジスタ群を管理する。ここで、プロセスとプロセスは互いに独立した存在であり、1つのプロセスを他のプロセスと連携させるには、プロセス間通信や共有メモリ等の機能を利用する必要がある。
これに対して、1つのプロセス上で行う処理をより細かい単位に分割し、データや変数等はプロセス内で共用しつつ、分割された単位で同時並行的に処理を実行するものがスレッドである。スレッドは、OSの基本的なコンポーネントであるカーネルのレベルで実装されたカーネルスレッドと、カーネルよりも高いユーザレベルで実装されたユーザスレッドとに大別することができる。ここで、カーネルスレッドのコードは、カーネルプロセスに割り当てられたメモリ空間であるカーネル空間に配置され、カーネルモード(スーパーバイザーモード)のCPUで実行される。これに対して、ユーザスレッドのコードは、ユーザプロセスに割り当てられたメモリ空間であるユーザ空間に配置され、ユーザモードのCPUで実行される。
カーネルスレッドは各種アプリケーションで共通的に利用されるものであり、汎用的な機能を備えたものであるため、特定のアプリケーション向けに最適化することはできない。これに対して、ユーザスレッドはアプリケーションの特性に応じて最適化することが可能であり、設計によってはカーネルスレッドよりもスレッド切り替えのオーバーヘッドを小さくすることもでき、消費メモリを低減することも可能である。また、1つのカーネルスレッド上で複数のユーザスレッドを動作させることにより、カーネルスレッドとユーザスレッドを併存させることも可能である。
スレッドを実装するにあたっては、少なくとも、スレッドが利用するためのスタック領域と、スレッド上でのプログラム実行を制御するスタックポインタやプログラムカウンタといったレジスタの状態を保存するための領域を確保する必要がある。
ユーザスレッドのスタックを取り扱う方法に関する先行技術としては、非実行状態にあるスレッドのスタック領域を二次記憶装置のスワップ領域ではなくファイル領域に保存する特開平6−51980号公報、実際に使用されているスタック領域のみを退避/復元する特開平6−67978号公報および特開平6−250923号公報を挙げることができる。
特開平6−51980号公報
特開平6−67978号公報
特開平6−250923号公報
しかし、ユーザスレッドをカーネルスレッドの1つの上で実行する場合、ユーザスレッドのスタックを、カーネルスレッドに割り当てられたスタック領域の外に確保すると以下に述べるような不都合を生じる。
すなわち、一部のカーネルスレッドの実装は、現在のスタックポインタが指しているメモリがどのカーネルスレッドのスタックに割り当てられているか判断し、それに基づいて実行中のカーネルスレッドを特定している。このため、ユーザスレッドのスタックがカーネルスレッドのスタック領域の外に配置されていると、このような実装ではスタックポインタが指している位置から実行状態にあるカーネルスレッドを特定することはできず、エラーが発生してしまう。
このようなエラーの発生を防止するためには、例えば利用されるユーザスレッドの数が予め分かっている場合には、カーネルスレッドのスタック領域を、利用されるユーザスレッド用スタックが全て入るようなサイズだけ確保し、カーネルスレッドのスタック領域内にユーザスレッド用スタックを全て収容することが有効であると考えられる。しかし、利用されるユーザスレッドの数が確定していない場合には、ユーザスレッド数の増大によりカーネルスレッドのスタック領域が足りなくなるおそれがある。
このような問題は、カーネルスレッドの実装方法によって発生するので、カーネルスレッドの機能を提供するコード(OSカーネルに含まれる)を修正することによって対処可能である。しかし、影響範囲が広いOSカーネルに手を入れることは難しい場合もあるため、ユーザスレッドの実装方法によって解決することが望ましい。
上記事情に鑑み、本発明は、スタックポインタによって実行状態にあるスレッドを特定する設計のカーネルスレッド上で、ユーザスレッド実行中にエラーを発生することなく実行状態にあるカーネルスレッドを特定することの可能なユーザスレッドの実装方法を提供することを目的とする。
上記課題を解決するため、本発明の第1の観点は、第1のメモリ領域にスタックを配置するように設定されたカーネルスレッド上にユーザスレッドを実装する方法において、
実行状態にあるユーザスレッドのスタックは前記第1のメモリ領域に、実行状態にないユーザスレッドのスタックは前記第1のメモリ領域の外に設けられた第2のメモリ領域に保存し、
実行状態にあるユーザスレッドを切り替える際に、実行状態から非実行状態に遷移させるユーザスレッドのスタックを前記第1の領域から前記第2の領域に退避するとともに、非実行状態から実行状態に遷移させるユーザスレッドのスタックを前記第2の領域から前記第1の領域に復元することを特徴とするユーザスレッドの実装方法を提供する。
実行状態にあるユーザスレッドのスタックは前記第1のメモリ領域に、実行状態にないユーザスレッドのスタックは前記第1のメモリ領域の外に設けられた第2のメモリ領域に保存し、
実行状態にあるユーザスレッドを切り替える際に、実行状態から非実行状態に遷移させるユーザスレッドのスタックを前記第1の領域から前記第2の領域に退避するとともに、非実行状態から実行状態に遷移させるユーザスレッドのスタックを前記第2の領域から前記第1の領域に復元することを特徴とするユーザスレッドの実装方法を提供する。
また、本発明の第2の観点は、仮想記憶機能を備えた環境にて、第1の論理アドレス領域にスタックを配置するように設定されたカーネルスレッド上にユーザスレッドを実装する方法において、
実行状態にあるユーザスレッドのスタックを記憶した物理アドレスを前記第1の論理アドレス領域内にマッピングし、
実行状態にあるユーザスレッドを切り替える際には、非実行状態から実行状態に遷移させるユーザスレッドのスタックを記憶した物理アドレスを前記第1の論理アドレス領域内にマッピングし直すことを特徴とするユーザスレッドの実装方法を提供する。
実行状態にあるユーザスレッドのスタックを記憶した物理アドレスを前記第1の論理アドレス領域内にマッピングし、
実行状態にあるユーザスレッドを切り替える際には、非実行状態から実行状態に遷移させるユーザスレッドのスタックを記憶した物理アドレスを前記第1の論理アドレス領域内にマッピングし直すことを特徴とするユーザスレッドの実装方法を提供する。
さらに、本発明の第3の観点は、ページング方式の仮想記憶機能を備えた環境にて、第1の論理アドレス領域にスタックを配置するように設定されたカーネルスレッド上にユーザスレッドを実装する方法において、
実行状態にあるユーザスレッドのスタックを記憶したページを前記第1の論理アドレス領域にマッピングし、
実行状態にあるユーザスレッドを切り替える際には、非実行状態から実行状態に遷移させるユーザスレッドのスタックを記憶したページを前記第1の論理アドレス領域内にマッピングし直すことを特徴とするユーザスレッドの実装方法を提供する。
実行状態にあるユーザスレッドのスタックを記憶したページを前記第1の論理アドレス領域にマッピングし、
実行状態にあるユーザスレッドを切り替える際には、非実行状態から実行状態に遷移させるユーザスレッドのスタックを記憶したページを前記第1の論理アドレス領域内にマッピングし直すことを特徴とするユーザスレッドの実装方法を提供する。
本発明にかかるユーザスレッドの実装方法によれば、実行状態にあるユーザスレッドのスタックは常にカーネルスレッドのスタック領域に配置されるので、エラーを発生することなくスタックポインタの指す位置に基づいて実行状態にあるカーネルスレッドを特定することができる。また、実行状態から非実行状態に遷移したユーザスレッドのスタックはカーネルスレッドのスタック領域から退避されるので、カーネルスレッドのスタック領域には常にユーザスレッド1個分のスタックしか存在せず、ユーザスレッド数が増えてもカーネルスレッドのスタック領域が足りなくなることはない。
また、このようなユーザスレッドの実装方法は、ページング方式等の仮想記憶機能を利用して実現すればユーザスレッド切替のオーバーヘッドを最低限とすることができ、より好適である。
以下、本発明を実施するための最良の形態について説明する。図1は、本発明の一実施形態にかかるユーザスレッド実装方法を適用したシステムの概略的な構成を示した図面である。図1に示すように、このシステム100のソフトウェア構成は、主として、プロセス管理モジュール102、カーネルスレッド管理モジュール103および仮想メモリ管理モジュール104を含むカーネル101と、このカーネル101によって生成される第1のプロセス110上で実行されるユーザスレッド管理モジュール142およびアプリケーションモジュール143からなっている。なお、図1には論理的な構成であるプロセスおよびスレッドについても併せて示し、さらにメモリ上の構成についても一部言及している。
カーネル101は、CPU、メモリ、入出力等のハードウェアを抽象化して、アプリケーションに各種機能を提供するオペレーティングシステムの中心をなすコンポーネントであり、プロセス管理モジュール102と、カーネルスレッド管理モジュール103と、仮想メモリ管理モジュール104とを含んでいる。プロセス管理モジュール102は、システム100のメモリ上に複数のプロセス空間を生成し、各プロセス空間にて互いに独立してプログラムを実行する。さらにプロセス管理モジュール102は、CPUの処理時間を短い時間に分割して複数のプロセスへ順に割り当てることによって、1つのシステムで複数のプログラムを同時並行的に動作させることが可能である。図1には、プロセス管理モジュール102によって、第1のプロセス110および第2のプロセス111が生成されている状態を示す。このようなプロセスにおけるプログラムの実行はユーザ空間201内で行われるが、プロセスの生成および終了、プロセスの切替は、いずれもカーネル101のプロセス管理モジュール102によって行われる。
仮想メモリ管理モジュール104は、システム100を実行するハードウェアが持っているメモリの実際のアドレス(物理アドレス)を仮想アドレスに変換し、また、仮想アドレスを物理アドレスに変換する。仮想メモリ管理モジュール104は、例えば、CPUに内蔵される等したMMU(Memory Management Unit)を利用してアドレス変換の機能を実現するようにしてもよい。
カーネルスレッド管理モジュール103は、各プロセス上にカーネルスレッドを生成し、生成されたカーネルスレッド上ではプロセス内のメモリを共有しながら各々プログラムが実行される。さらにカーネルスレッド管理モジュール103は、CPUの処理時間を短い時間に分割して複数のスレッドへ順に割り当てることによって、1つのプロセス内で複数の処理を同時並行的に行うことが可能である。図1には、スレッド管理モジュール103によって、第1のプロセス110上に第1のカーネルスレッド120および第2のカーネルスレッド121が生成されている状態を示す。このようなカーネルスレッドにおいても、プログラムの実行は前述のプロセスと同様にユーザ空間201内で行われるが、カーネルスレッドの生成および終了、カーネルスレッドの切替は、いずれもカーネル101のカーネルスレッド管理モジュール103によって行われる。
以上のようなモジュールを含んだカーネル101は、カーネル空間200に配置されてCPUにより実行される。また、第1および第2のプロセス110および111については、それらのプロセス管理情報はカーネル空間200に配置される一方、れぞれのプロセス空間はユーザ空間に配置される。
次に、第1のプロセス110において実現される機能と、そのプロセス空間におけるメモリ配置について説明する。図1に矩形で示すように、第1のプロセス110のメモリ配置はカーネル空間200とユーザ空間201との双方にまたがっている。このうちカーネル空間200内にはプロセスID、プロセスが利用するレジスタ群の値、プロセスが利用するユーザ空間(プロセス空間)のアドレス管理データ、オープンしているファイルとソケットのリスト等のプロセス管理情報が配置される。一方、ユーザ空間201内には、まず第1のプロセス110上で実行されるプログラムのコードおよび変数を格納したコード・変数領域140と、第1のプロセス110上でプログラム実行中になされた動的なメモリ確保要求に対応するためのメモリ領域であるヒープ領域141とが設けられている。コード・変数領域140には、第1のプロセス110上で実行されるアプリケーションモジュール143と、第1のプロセス110に生成されたカーネルスレッド上にユーザスレッドを生成するユーザスレッド管理モジュール142が配置されている。
図1に示すとおり、このアプリケーションモジュール143は、カーネル101のカーネルスレッド管理モジュール103を呼び出すことにより第1および第2のカーネルスレッド120および121を生成し、さらに、プロセス110内でユーザスレッド管理モジュール142を呼び出すことにより第1のカーネルスレッド120上に第1,第2および第3のユーザスレッド130,131および132を生成し、これらのスレッド上で実行される。その際、アプリケーションモジュール143またはユーザスレッド管理モジュール142から一時的に利用するためのメモリ要求がなされた場合には、カーネル100がヒープ領域110の所定サイズを確保してメモリ割り当てを行う。
図1において、第1および第2のカーネルスレッド120および121と、第1,第2および第3のユーザスレッド130,131および132とは、いずれも機能的な構成を示したものである。これらのスレッドは、それぞれプログラムカウンタ(インストラクションポインタ)を含むレジスタ群の値とスタックとが個々に管理されており、実行中スレッドの切り替えはカーネルスレッド管理モジュール103またはユーザスレッド管理モジュール142がこれらを切り替えることにより行われる。
また、第1および第2のカーネルスレッド120および121については、第1および第2のプロセス110および111と同様に、管理情報はカーネル空間200に配置されるが、その実体であるスタック等はユーザ空間201内に配置される。
ここで、カーネルスレッド管理モジュール103は、カーネルスレッドの生成時または初期化時に当該プロセスで利用可能なユーザ空間の一部をスタック領域として割り当てられるようになっている。本実施形態では、第1のカーネルスレッド120には第1のメモリ領域150がスタック領域として割り当てられており、第2のカーネルスレッド121には別のメモリ領域(不図示)がスタック領域として割り当てられている。
一方、図1に示すように、第1のカーネルスレッド120上には、ユーザスレッド管理モジュール142によって第1,第2および第3のユーザスレッド130,131および132が生成されている。これらのスタックデータについては、実行状態にあるユーザスレッドのスタックデータは第1のメモリ領域150に配置されるが、実行状態にないユーザスレッドのスタックデータは第2のメモリ領域151に配置される。したがって、第1,第2および第3のユーザスレッド130,131および132の間でユーザスレッドの切り替えが行われる際には、第1のメモリ領域150および第2のメモリ領域151の間でスタックデータの復元/退避が行われる。この復元/退避の動作については、実メモリ上でデータを移動させる第1の動作と仮想メモリを利用する第2の動作とに分けて、以下に詳述する。
[第1の動作]
図2は、スタックデータの復元/退避を、実メモリ上でデータを移動させることにより行う第1の動作におけるメモリの利用形態を説明するための図(要部のみ図示)である。
図2に示すように、第1の動作では、第1のメモリ領域150には常に実行状態にあるユーザスレッドのスタックデータ152が配置され、実行状態にあるユーザスレッドが非実行状態に遷移した際に当該ユーザスレッドのスタックデータは第1のメモリ領域150から第2のメモリ領域151に移される。また、非実行状態にあるユーザスレッドが実行状態に遷移した場合には前回保存された当該ユーザスレッドのスタックデータが第2のメモリ領域151から第1のメモリ領域150に戻される。
図2は、スタックデータの復元/退避を、実メモリ上でデータを移動させることにより行う第1の動作におけるメモリの利用形態を説明するための図(要部のみ図示)である。
図2に示すように、第1の動作では、第1のメモリ領域150には常に実行状態にあるユーザスレッドのスタックデータ152が配置され、実行状態にあるユーザスレッドが非実行状態に遷移した際に当該ユーザスレッドのスタックデータは第1のメモリ領域150から第2のメモリ領域151に移される。また、非実行状態にあるユーザスレッドが実行状態に遷移した場合には前回保存された当該ユーザスレッドのスタックデータが第2のメモリ領域151から第1のメモリ領域150に戻される。
以下、第1の動作を図3のフローチャートを参照しながら説明する。ここでは、実行状態にあるユーザスレッドを、第1のユーザスレッド130から第2のユーザスレッド131へ遷移させる場合について示す。
まず、ユーザスレッド管理モジュール142がスレッド切り替えのトリガーを検出する(ST101)。このようなトリガーは、実行中スレッドが自発的に発行するものと、実行中スレッドが発行するもの以外との2種類に大別される。前者としては、例えば、実行中スレッドが所定の入出処理を完了した場合やロックの解放待ちに入る場合に発行されるものを挙げることができる。また、後者としては、実行中スレッドのCPU占有時間が所定時間を超えたことの通知や、実行中のスレッドよりも優先順位の高いスレッドが実行可能状態になったことの通知を挙げることができる。
まず、ユーザスレッド管理モジュール142がスレッド切り替えのトリガーを検出する(ST101)。このようなトリガーは、実行中スレッドが自発的に発行するものと、実行中スレッドが発行するもの以外との2種類に大別される。前者としては、例えば、実行中スレッドが所定の入出処理を完了した場合やロックの解放待ちに入る場合に発行されるものを挙げることができる。また、後者としては、実行中スレッドのCPU占有時間が所定時間を超えたことの通知や、実行中のスレッドよりも優先順位の高いスレッドが実行可能状態になったことの通知を挙げることができる。
スレッド切り替えのトリガーを検出したユーザスレッド管理モジュール142は、まず第1のユーザスレッド130を停止させ(ST102)、第1のユーザスレッド130が使用していたレジスタのコンテキストを保存する(ST103)。ST103でレジスタを保存する先には、特に制限はなく、レジスタの内容を第1のユーザスレッド130のスタックに積むことにより保存しても構わない。
続いて、第1のユーザスレッド130が使用していたスタックデータ152が第1のメモリ領域150から第2のメモリ領域に退避される(ST104)。ここでは、図2に示すように、第2のメモリ領域151として第1,第2および第3のユーザスレッドのスタックデータ153,154および155がそれぞれ退避できるような容量を確保し、それぞれのスタックデータを個々に保存する。ここでは、図2に矢印で示すように、第1のユーザスレッドのスタックデータ155を第1のメモリ領域150から第2のメモリ領域151にコピーすることにより退避させる。
その後、第2のユーザスレッド131について保存されているスタックデータ154を第2のメモリ領域151から第1のメモリ領域150に復元し(ST105)、さらに第2のユーザスレッド131について保存されているレジスタのコンテキストを復元する(ST106)。ここで、前述のようにレジスタの内容をユーザスレッドのスタックに積んで保存している場合には、スタックからポップした内容を各レジスタに配置することになる。
以上のようにして、前回第2のユーザスレッド131を実行状態から非実行状態へ遷移させた際に保存されたスタックデータとレジスタのコンテキストとが復元された後、これらを利用して第2のユーザスレッド131の実行が開始され(ST107)、ユーザスレッドの切り替え動作は完了する。
このような第1の動作によれば、実メモリ上でデータの移動/コピーを行うことにより、実行状態から非実行状態に遷移されるユーザスレッドのスタックデータは第1のメモリ領域150(第1のカーネルスレッド120のスタック領域)から退避され、非実行状態から実行状態に遷移されるユーザスレッドのスタックデータは第1のメモリ領域150(第1のカーネルスレッド120のスタック領域)に復元される。したがって、カーネルスレッド上で任意のユーザスレッドを実行している状態において、スタックポインタは常に第1のメモリ領域150(カーネルスレッドのスタック領域)の内部をポイントすることになる。これにより、カーネルスレッド管理モジュール103が現在のスタックポインタがポイントしている位置から実行中のカーネルスレッドを特定する実装となっていても、ユーザスレッドを利用している状態で、常に正しく実行中のカーネルスレッドを特定することが可能である。
[第2の動作]
図4は、スタックデータの復元/退避を、仮想メモリ技術を利用して行う第2の動作におけるメモリの利用形態を説明するための図(要部のみ図示)である。
図4に示すように、第2の動作では、ページング方式を利用して物理メモリページを仮想メモリページにマッピングする仮想メモリ機能を備えた環境下で、仮想アドレス空間上に第1のメモリ領域150が設けられ、第2のメモリ領域151は物理アドレス空間上、すなわち実メモリ上に設けられる。そして、この第2のメモリ領域151内に第1から第3のユーザスレッドのスタックデータ153,154,155が配置され、仮想メモリ管理モジュール104が実行中のユーザスレッドのスタックデータを格納した物理メモリページを第1のメモリ領域152の仮想メモリページにマッピングする。また、実行状態にあるユーザスレッドを切り替える際には、仮想メモリ管理モジュール104が第1のメモリ領域150にマッピングする物理メモリページを図4中にA〜Cで示すように切り替える。このように仮想メモリ管理モジュール104がマッピングを変更することは、例えば仮想メモリ管理モジュール104を保持しているページテーブルの記述を書き換えることにより行うことができる。
図4は、スタックデータの復元/退避を、仮想メモリ技術を利用して行う第2の動作におけるメモリの利用形態を説明するための図(要部のみ図示)である。
図4に示すように、第2の動作では、ページング方式を利用して物理メモリページを仮想メモリページにマッピングする仮想メモリ機能を備えた環境下で、仮想アドレス空間上に第1のメモリ領域150が設けられ、第2のメモリ領域151は物理アドレス空間上、すなわち実メモリ上に設けられる。そして、この第2のメモリ領域151内に第1から第3のユーザスレッドのスタックデータ153,154,155が配置され、仮想メモリ管理モジュール104が実行中のユーザスレッドのスタックデータを格納した物理メモリページを第1のメモリ領域152の仮想メモリページにマッピングする。また、実行状態にあるユーザスレッドを切り替える際には、仮想メモリ管理モジュール104が第1のメモリ領域150にマッピングする物理メモリページを図4中にA〜Cで示すように切り替える。このように仮想メモリ管理モジュール104がマッピングを変更することは、例えば仮想メモリ管理モジュール104を保持しているページテーブルの記述を書き換えることにより行うことができる。
以下、第2の動作を図5のフローチャートを参照しながら説明する。ここでも、実行状態にあるユーザスレッドを、第1のユーザスレッド130から第2のユーザスレッド131へ遷移させる場合について示す。
まず、第1の動作と同様に、ユーザスレッド管理モジュール142がスレッド切り替えのトリガーを検出し(ST201)、第1のユーザスレッド130を停止させ(ST202)、第1のユーザスレッド130が使用していたレジスタのコンテキストを保存する(ST203)。
まず、第1の動作と同様に、ユーザスレッド管理モジュール142がスレッド切り替えのトリガーを検出し(ST201)、第1のユーザスレッド130を停止させ(ST202)、第1のユーザスレッド130が使用していたレジスタのコンテキストを保存する(ST203)。
続いて、仮想メモリ管理モジュール104にてページテーブルが書き換えられ、第1のメモリ領域150の仮想メモリページに第2のユーザスレッドのスタックデータ154が保存された物理メモリページがマッピングされる(ST204)。ここでは、図4でAを付して示したようにマッピングされていたページテーブルが、Bを付して示したようにマッピングするように書き換えられる。
その後は、第1の動作と同様に、第2のユーザスレッド131について保存されているレジスタのコンテキストが復元され(ST205)、第2のユーザスレッドの実行を開始(ST206)することで、ユーザスレッドの切り替えは完了する。
第2の動作によれば、仮想メモリ技術を利用することによって実メモリ上でデータの移動/コピーを行うことなく、第1のカーネルスレッド120のスタック領域である第1のメモリ領域150の仮想メモリページに、常に実行中のスタックデータを格納した物理メモリページがマッピングされる。したがって、カーネルスレッド上で任意のユーザスレッドを実行している状態において、スタックポインタは常に仮想アドレス空間上に設けられた第1のメモリ領域150内をポイントすることになる。これにより、カーネルスレッド管理モジュール103が現在のスタックポインタがポイントしている位置から実行中のカーネルスレッドを特定する実装となっていても、ユーザスレッドを利用している状態で、常に正しく実行中のカーネルスレッドを特定することが可能である。このような第2の動作では、第1の動作と比較して実メモリ上でデータの移動/コピーを行わないので、ユーザスレッドの切り替えに要するオーバーヘッドを第1の動作よりも低く抑えることができる。
以上説明したように、本実施形態によれば、実行状態にあるユーザスレッドのスタックは常にカーネルスレッドのスタック領域に配置されるので、スタックポインタの指す位置に基づいて実行状態にあるカーネルスレッドを特定する実装のカーネルスレッド管理モジュール103を利用しても、エラーを発生することなく正しく実行中のカーネルスレッドを特定することができる。また、実行状態から非実行状態に遷移したユーザスレッドのスタックはカーネルスレッドのスタック領域から退避されるので、カーネルスレッドのスタック領域には常にユーザスレッド1個分のスタックしか存在せず、ユーザスレッド数が増えてもカーネルスレッドのスタック領域が足りなくなることはない。
以上、本発明の実施の形態について説明したが、本発明はこれに限定されることなく、その趣旨を逸脱しない範囲で種々の改良・変更が可能であることは勿論である。
例えば、上記ではカーネル100が仮想メモリ管理モジュール104を有している場合を示したが、上述した第1の動作を行う場合には仮想メモリ機能は必須ではないので、仮想メモリ管理モジュール104が無くても構わない。また、上記では固定長のページ単位で仮想メモリの管理を行うページング方式の場合を示したが、本発明は非固定長のセグメントを利用したセグメント方式の仮想メモリにおいても適用することが可能である。
例えば、上記ではカーネル100が仮想メモリ管理モジュール104を有している場合を示したが、上述した第1の動作を行う場合には仮想メモリ機能は必須ではないので、仮想メモリ管理モジュール104が無くても構わない。また、上記では固定長のページ単位で仮想メモリの管理を行うページング方式の場合を示したが、本発明は非固定長のセグメントを利用したセグメント方式の仮想メモリにおいても適用することが可能である。
本発明によれば、カーネルスレッド管理モジュールが現在スタックポインタが指している位置から実行中のカーネルスレッドを特定する実装であっても、そのようなカーネルスレッド上で最小限のスタック領域を利用してマルチスレッド環境を実現することの可能なユーザスレッドの実装方法が提供される。したがって、本発明のユーザスレッド実装方法は、カーネルやオペレーティングシステムに関わらず汎用的であり、またメモリ消費量も低く抑えられる。
100;システム、101;カーネル、102;プロセス管理モジュール、103;カーネルスレッド管理モジュール、104;仮想メモリ管理モジュール、110;第1のプロセス、120;第1のカーネルスレッド、130;第1のカーネルスレッド、131;第2のカーネルスレッド、132;第3のカーネルスレッド、142;ユーザスレッド管理モジュール、150;第1のメモリ領域、151;第2のメモリ領域
Claims (3)
- 第1のメモリ領域にスタックを配置するように設定されたカーネルスレッド上にユーザスレッドを実装する方法において、
実行状態にあるユーザスレッドのスタックは前記第1のメモリ領域に、実行状態にないユーザスレッドのスタックは前記第1のメモリ領域の外に設けられた第2のメモリ領域に保存し、
実行状態にあるユーザスレッドを切り替える際に、実行状態から非実行状態に遷移させるユーザスレッドのスタックを前記第1の領域から前記第2の領域に退避するとともに、非実行状態から実行状態に遷移させるユーザスレッドのスタックを前記第2の領域から前記第1の領域に復元することを特徴とするユーザスレッドの実装方法。 - 仮想記憶機能を備えた環境にて、第1の論理アドレス領域にスタックを配置するように設定されたカーネルスレッド上にユーザスレッドを実装する方法において、
実行状態にあるユーザスレッドのスタックを記憶した物理アドレスを前記第1の論理アドレス領域内にマッピングし、
実行状態にあるユーザスレッドを切り替える際には、非実行状態から実行状態に遷移させるユーザスレッドのスタックを記憶した物理アドレスを前記第1の論理アドレス領域内にマッピングし直すことを特徴とするユーザスレッドの実装方法。 - ページング方式の仮想記憶機能を備えた環境にて、第1の論理アドレス領域にスタックを配置するように設定されたカーネルスレッド上にユーザスレッドを実装する方法において、
実行状態にあるユーザスレッドのスタックを記憶したページを前記第1の論理アドレス領域にマッピングし、
実行状態にあるユーザスレッドを切り替える際には、非実行状態から実行状態に遷移させるユーザスレッドのスタックを記憶したページを前記第1の論理アドレス領域内にマッピングし直すことを特徴とするユーザスレッドの実装方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2007044281A JP2008210038A (ja) | 2007-02-23 | 2007-02-23 | ユーザスレッドの実装方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2007044281A JP2008210038A (ja) | 2007-02-23 | 2007-02-23 | ユーザスレッドの実装方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2008210038A true JP2008210038A (ja) | 2008-09-11 |
Family
ID=39786301
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2007044281A Pending JP2008210038A (ja) | 2007-02-23 | 2007-02-23 | ユーザスレッドの実装方法 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2008210038A (ja) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8478956B2 (en) | 2009-11-13 | 2013-07-02 | Samsung Electronics Co., Ltd. | Computing system and method controlling memory of computing system |
CN111221535A (zh) * | 2019-12-31 | 2020-06-02 | 深圳市九洲电器有限公司 | 线程分配方法、服务器及计算机可读存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPS62241050A (ja) * | 1986-04-11 | 1987-10-21 | Hitachi Ltd | 計算機システムのメモリ管理方式 |
JPH04373026A (ja) * | 1991-06-24 | 1992-12-25 | Fuji Electric Co Ltd | プログラム中断方法 |
JPH11242602A (ja) * | 1998-02-25 | 1999-09-07 | Nec Corp | 動的ワークエリア制御方式,それを用いた装置および動的ワークエリア制御プログラムを記録した記録媒体 |
JP2001318787A (ja) * | 2000-05-08 | 2001-11-16 | Toshiba Corp | マイクロプロセッサ、これを用いたマルチタスク実行方法、およびマルチレッド実行方法 |
-
2007
- 2007-02-23 JP JP2007044281A patent/JP2008210038A/ja active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPS62241050A (ja) * | 1986-04-11 | 1987-10-21 | Hitachi Ltd | 計算機システムのメモリ管理方式 |
JPH04373026A (ja) * | 1991-06-24 | 1992-12-25 | Fuji Electric Co Ltd | プログラム中断方法 |
JPH11242602A (ja) * | 1998-02-25 | 1999-09-07 | Nec Corp | 動的ワークエリア制御方式,それを用いた装置および動的ワークエリア制御プログラムを記録した記録媒体 |
JP2001318787A (ja) * | 2000-05-08 | 2001-11-16 | Toshiba Corp | マイクロプロセッサ、これを用いたマルチタスク実行方法、およびマルチレッド実行方法 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8478956B2 (en) | 2009-11-13 | 2013-07-02 | Samsung Electronics Co., Ltd. | Computing system and method controlling memory of computing system |
CN111221535A (zh) * | 2019-12-31 | 2020-06-02 | 深圳市九洲电器有限公司 | 线程分配方法、服务器及计算机可读存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9798595B2 (en) | Transparent user mode scheduling on traditional threading systems | |
JP4072271B2 (ja) | 複数のオペレーティングシステムを実行する計算機 | |
US6128641A (en) | Data processing unit with hardware assisted context switching capability | |
US10248456B2 (en) | Method and system for providing stack memory management in real-time operating systems | |
EP2172844A1 (en) | Memory protection method, information processing apparatus, program, and computer-readable storage medium | |
KR100791296B1 (ko) | 멀티 코어 시스템에서 협력적 스케줄링을 제공하는 장치 및방법 | |
JP2018022345A (ja) | 情報処理システム | |
EP3770759A1 (en) | Wake-up and scheduling of functions with context hints | |
JP3970609B2 (ja) | プロセッサシステム | |
JP5131269B2 (ja) | マルチプロセッシングシステム | |
JP2008210038A (ja) | ユーザスレッドの実装方法 | |
US20190232891A1 (en) | Vehicle Control Device | |
JP5289688B2 (ja) | プロセッサシステム及びプロセッサシステムを動作させるオペレーティングシステムプログラムの処理方法 | |
US20100299672A1 (en) | Memory management device, computer system, and memory management method | |
US9946665B2 (en) | Fetch less instruction processing (FLIP) computer architecture for central processing units (CPU) | |
JP7217341B2 (ja) | プロセッサおよびレジスタの継承方法 | |
JP5644380B2 (ja) | 情報処理装置 | |
JP2022079764A (ja) | 同期制御システムおよび同期制御方法 | |
JP2008102847A (ja) | マルチスレッドプログラム処理方法及び装置 | |
JP4017005B2 (ja) | 演算装置 | |
US9619277B2 (en) | Computer with plurality of processors sharing process queue, and process dispatch processing method | |
CN117692416B (zh) | 网络报文处理方法、装置、计算机设备和存储介质 | |
JP3726701B2 (ja) | カーネル空間のデマンドページング・スワップアウト方式および方法 | |
KR100930017B1 (ko) | 다수 개의 커널을 운영하는 시스템 및 방법 | |
JPH07210400A (ja) | マルチタスク処理の処理装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20100223 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20110627 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20110705 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20111101 |