JPH05204656A - スレッド固有データ保持方法 - Google Patents
スレッド固有データ保持方法Info
- Publication number
- JPH05204656A JPH05204656A JP4065772A JP6577292A JPH05204656A JP H05204656 A JPH05204656 A JP H05204656A JP 4065772 A JP4065772 A JP 4065772A JP 6577292 A JP6577292 A JP 6577292A JP H05204656 A JPH05204656 A JP H05204656A
- Authority
- JP
- Japan
- Prior art keywords
- thread
- data
- area
- threads
- address
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/468—Specific access rights for resources, e.g. using capability register
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
(57)【要約】
【目的】 データ空間を共有するスレッドが大域的に宣
言された変数を固有に保持する方法の提供を目的とす
る。 【構成】 アドレス空間を定義するタスク内に実行主体
のスレッドが複数存在するプログラムを解析して複数ス
レッド毎に固有な大域データの抽出、領域の大きさおよ
び領域中の固有データのオフセットの決定、そして、実
行時に設定される領域のベースアドレスとオフセットで
アクセスする実行命令の生成を固有データ認識部3で行
い、スレッド生成時に大域データ領域の大きさをもとに
スレッドのスタックに割り当てる固有データ領域の開始
アドレスの設定をスレッド生成部6で行い、前記大域デ
ータを割り付ける領域をスタック7中に確保するととも
に上記領域の開始アドレスをプログラム実行中にスレッ
ドごとに固有データ領域開始アドレスレジスタ8に保持
するようにしている。
言された変数を固有に保持する方法の提供を目的とす
る。 【構成】 アドレス空間を定義するタスク内に実行主体
のスレッドが複数存在するプログラムを解析して複数ス
レッド毎に固有な大域データの抽出、領域の大きさおよ
び領域中の固有データのオフセットの決定、そして、実
行時に設定される領域のベースアドレスとオフセットで
アクセスする実行命令の生成を固有データ認識部3で行
い、スレッド生成時に大域データ領域の大きさをもとに
スレッドのスタックに割り当てる固有データ領域の開始
アドレスの設定をスレッド生成部6で行い、前記大域デ
ータを割り付ける領域をスタック7中に確保するととも
に上記領域の開始アドレスをプログラム実行中にスレッ
ドごとに固有データ領域開始アドレスレジスタ8に保持
するようにしている。
Description
【0001】
【産業上の利用分野】本発明は、電子計算機の並列処理
において、アドレス空間を共有しスタックのみを持つス
レッドが、大域的に宣言されたデータを固有に保持する
スレッド固有データ保持方法に関する。
において、アドレス空間を共有しスタックのみを持つス
レッドが、大域的に宣言されたデータを固有に保持する
スレッド固有データ保持方法に関する。
【0002】
【従来の技術】従来、並列処理を効率よく実現するため
プロセスという概念をタスクとスレッドという2つの概
念に分解するモデルが提案され、実現されている。
プロセスという概念をタスクとスレッドという2つの概
念に分解するモデルが提案され、実現されている。
【0003】ここで、タスクとはアドレス空間などの静
的な実行環境を定義するものであり、スレッドとは、ス
タックやプログラムカウンタなどの動的な実行環境を定
義するものである。
的な実行環境を定義するものであり、スレッドとは、ス
タックやプログラムカウンタなどの動的な実行環境を定
義するものである。
【0004】このようなモデルでは、1つのタスク内に
複数のスレッドが同時に存在することが可能である。こ
のことは、1つのタスク内の同じデータを用いて、複数
の処理を同時に行うことができることを意味する。ま
た、タスクとスレッドのモデルは、単純にプロセスによ
る並列処理を行う場合と比べて、次のような利点があ
る。 ・スレッド間の通信は、共有データを介して行うために
高速である。 ・スレッドはプロセスに比べて独自に持つ資源が少ない
ため、生成・消滅のオーバヘッドが少ない。
複数のスレッドが同時に存在することが可能である。こ
のことは、1つのタスク内の同じデータを用いて、複数
の処理を同時に行うことができることを意味する。ま
た、タスクとスレッドのモデルは、単純にプロセスによ
る並列処理を行う場合と比べて、次のような利点があ
る。 ・スレッド間の通信は、共有データを介して行うために
高速である。 ・スレッドはプロセスに比べて独自に持つ資源が少ない
ため、生成・消滅のオーバヘッドが少ない。
【0005】また、このようなタスクとスレッドのモデ
ルの場合、スレッド間でアドレス空間を共有しているた
め、大域データはすべてのスレッドから共有されるよう
になる。
ルの場合、スレッド間でアドレス空間を共有しているた
め、大域データはすべてのスレッドから共有されるよう
になる。
【0006】例えば、C言語のプログラムで使用される
データは、大域変数、Auto変数の2つに大別でき、
このうち大域変数は、複数の関数からアクセスできるも
ので通常データ空間に割り当てられ、上述の大域データ
に相当しスレッド間で共有されるものである。一方、A
uto変数は、関数内で宣言され、宣言された関数内で
有効なもので、通常スタックに割り当てられる。
データは、大域変数、Auto変数の2つに大別でき、
このうち大域変数は、複数の関数からアクセスできるも
ので通常データ空間に割り当てられ、上述の大域データ
に相当しスレッド間で共有されるものである。一方、A
uto変数は、関数内で宣言され、宣言された関数内で
有効なもので、通常スタックに割り当てられる。
【0007】さて、1つのタスク中に複数のスレッドが
存在するマルチスレッド環境においては、大域的に宣言
されたデータをスレッド毎に保持する必要がある。スレ
ッド固有の大域データの必要な例として、マルチスレッ
ドサーバを次に示す。
存在するマルチスレッド環境においては、大域的に宣言
されたデータをスレッド毎に保持する必要がある。スレ
ッド固有の大域データの必要な例として、マルチスレッ
ドサーバを次に示す。
【0008】ここでのマルチスレッドサーバは、同じサ
ービスを行うスレッドが1つのタスク内に複数存在し、
他のサーバからのサービス要求を同時に複数処理するも
ので、次のようなプログラムにより実現される。 struct msg m; get_job(){ ・・・ receive(&m); ・・・ job(); }
ービスを行うスレッドが1つのタスク内に複数存在し、
他のサーバからのサービス要求を同時に複数処理するも
ので、次のようなプログラムにより実現される。 struct msg m; get_job(){ ・・・ receive(&m); ・・・ job(); }
【0009】この場合、各スレッドは外部からのサービ
ス要求を受けるために、関数get_jobを呼び出
し、その内部で関数receiveを呼び出し、メッセ
ージの内容を変数mで受けとる。このメッセージ変数m
は通常複数の関数で処理されるため、大域的に扱う必要
がある。しかし、マルチスレッド環境では、大域的に宣
言されたデータは、スレッド間で共有されるため、上記
のようなプログラムでは、メッセージが破壊される可能
性がある。例えば、複数のサービス要求が来た場合、そ
れらの要求内容はメッセージ変数mに格納されるが、メ
ッセージ変数mはスレッド間で共有しているため、後か
ら来たメッセージの内容が上書きされ、前のメッセージ
が破壊されるおそれがある。このため、大域データをス
レッド固有に保持するための特別なデータ管理方式が必
要になっている。従来、提案されてきた方法として、以
下の2つの方法が知られている。 1.動的にスタックに割り当てる方法
ス要求を受けるために、関数get_jobを呼び出
し、その内部で関数receiveを呼び出し、メッセ
ージの内容を変数mで受けとる。このメッセージ変数m
は通常複数の関数で処理されるため、大域的に扱う必要
がある。しかし、マルチスレッド環境では、大域的に宣
言されたデータは、スレッド間で共有されるため、上記
のようなプログラムでは、メッセージが破壊される可能
性がある。例えば、複数のサービス要求が来た場合、そ
れらの要求内容はメッセージ変数mに格納されるが、メ
ッセージ変数mはスレッド間で共有しているため、後か
ら来たメッセージの内容が上書きされ、前のメッセージ
が破壊されるおそれがある。このため、大域データをス
レッド固有に保持するための特別なデータ管理方式が必
要になっている。従来、提案されてきた方法として、以
下の2つの方法が知られている。 1.動的にスタックに割り当てる方法
【0010】この方法は、各スレッドが実行する関数内
でAuto変数として宣言することにより、スレッド固
有データをスタックに割り当てる。しかし、その関数を
呼び出した他の関数内で、その変数を参照する場合、A
uto変数は宣言された関数外では直接参照できないた
め、変数のアドレスを関数引数として渡す必要が生じ
る。この方法によるとプログラム例として図9に示すも
のがある。
でAuto変数として宣言することにより、スレッド固
有データをスタックに割り当てる。しかし、その関数を
呼び出した他の関数内で、その変数を参照する場合、A
uto変数は宣言された関数外では直接参照できないた
め、変数のアドレスを関数引数として渡す必要が生じ
る。この方法によるとプログラム例として図9に示すも
のがある。
【0011】この場合、各スレッドは、その生成後、関
数startから実行を開始する。また、スレッド毎に
固有データshared_dataを保持するために、
関数start内で宣言し、スタックに割り当てる。関
数startから関数func1、func2を呼び出
す場合、それぞれの関数内では固有データshared
_dataが参照できないため、そのアドレスを関数引
数として渡す必要がある。 2.変数をスレッド毎に拡張し、スレッドIDでアクセ
スする方法。
数startから実行を開始する。また、スレッド毎に
固有データshared_dataを保持するために、
関数start内で宣言し、スタックに割り当てる。関
数startから関数func1、func2を呼び出
す場合、それぞれの関数内では固有データshared
_dataが参照できないため、そのアドレスを関数引
数として渡す必要がある。 2.変数をスレッド毎に拡張し、スレッドIDでアクセ
スする方法。
【0012】この方法は、固有に保持すべきデータを、
スレッド数の要素を持つ大域的な配列として宣言し、ス
レッド毎に一意に与えられたIDによりアクセスする方
法である。このような方法では、スレッドIDがOSレ
ベルでサポートされていない場合、スレッドID自体を
上述の方法1で保持する必要があり、また、スレッドの
数が動的に変化する場合には対応できない。この方法に
よるプログラム例として図10に示すものがある。
スレッド数の要素を持つ大域的な配列として宣言し、ス
レッド毎に一意に与えられたIDによりアクセスする方
法である。このような方法では、スレッドIDがOSレ
ベルでサポートされていない場合、スレッドID自体を
上述の方法1で保持する必要があり、また、スレッドの
数が動的に変化する場合には対応できない。この方法に
よるプログラム例として図10に示すものがある。
【0013】この場合、固有データshared_da
taは、大域的な配列として宣言されている。その要素
数は、定数THREAD_NUMで定義している。ま
た、固有データのアクセスはスレッドIDであるTHR
EAD_SELFを使用して行われる。
taは、大域的な配列として宣言されている。その要素
数は、定数THREAD_NUMで定義している。ま
た、固有データのアクセスはスレッドIDであるTHR
EAD_SELFを使用して行われる。
【0014】この例では、配列の要素数は静的にTHR
EAD_NUMまでに定まってしまい、スレッドの数に
制限が生じる。また、固有データへアクセスする場合に
は、スレッドIDであるTHREAD_SELFのOS
レベルでのサポートが必要である。
EAD_NUMまでに定まってしまい、スレッドの数に
制限が生じる。また、固有データへアクセスする場合に
は、スレッドIDであるTHREAD_SELFのOS
レベルでのサポートが必要である。
【0015】
【発明が解決しようとする課題】このように従来のスレ
ッドが大域データを固有に持つ方法において、関数内で
Auto変数として宣言する方法では、他の関数を呼び
出す場合に固有データのアドレスを関引引数として渡す
必要があるため、固有データの操作を行なう関数の呼び
出しでは、アドレスを指定する引数を含み、プログラム
が繁雑になってしまう。また、呼び出された関数では、
固有データのアドレスをスタックに保存する必要があ
り、さらに、固有データへのアクセスはアドレスによる
間接アクセスしか行なえないため、実行効率が低下する
ことになる。
ッドが大域データを固有に持つ方法において、関数内で
Auto変数として宣言する方法では、他の関数を呼び
出す場合に固有データのアドレスを関引引数として渡す
必要があるため、固有データの操作を行なう関数の呼び
出しでは、アドレスを指定する引数を含み、プログラム
が繁雑になってしまう。また、呼び出された関数では、
固有データのアドレスをスタックに保存する必要があ
り、さらに、固有データへのアクセスはアドレスによる
間接アクセスしか行なえないため、実行効率が低下する
ことになる。
【0016】一方、大域的な配列として宣言する方法で
は、スレッドIDが必要であり、さらにスレッドの動的
な生成・消滅に容易に対応できない。また、スレッドの
動的生成・消滅に対応するためには、スレッドIDをハ
ッシングして配列を引くような構造にしなくてはならな
いために実行効率が低下することになる。また、スレッ
ドの最大個数は、配列の要素数に制限されるようにもな
る。
は、スレッドIDが必要であり、さらにスレッドの動的
な生成・消滅に容易に対応できない。また、スレッドの
動的生成・消滅に対応するためには、スレッドIDをハ
ッシングして配列を引くような構造にしなくてはならな
いために実行効率が低下することになる。また、スレッ
ドの最大個数は、配列の要素数に制限されるようにもな
る。
【0017】このように、従来のものでは、スレッド固
有の大域データを実現するために、プログラムの書き易
さや実行効率を犠牲にしなければならないなどの問題点
を有している。
有の大域データを実現するために、プログラムの書き易
さや実行効率を犠牲にしなければならないなどの問題点
を有している。
【0018】本発明は、上記事情に鑑みてなされたもの
で、スレッド固有データを大域変数と同様に宣言するこ
とができ、また、スレッド数の動的な変化にも対応でき
るスレッド固有データ保持方法を提供することを目的と
する。
で、スレッド固有データを大域変数と同様に宣言するこ
とができ、また、スレッド数の動的な変化にも対応でき
るスレッド固有データ保持方法を提供することを目的と
する。
【0019】
【課題を解決するための手段】本発明に係るスレッド固
有データ保持方法は、アドレス空間を定義するタスク内
に実行主体のスレッドが複数存在するよう電子計算機を
動作させるプログラムを入力し、このプログラムから、
複数のスレッドから大域的にアクセス可能でかつ各スレ
ッド毎に固有に保持すべきデータを抽出し、各スレッド
毎に保有するスタックのそれぞれに抽出した前記データ
を割り当てる領域を確保し、この確保した領域の基準と
なるアドレスを前記各スレッド毎に保持し、前記データ
に対するアクセスは、保持した前記アドレスに基づいて
行うことを特徴とするものである。
有データ保持方法は、アドレス空間を定義するタスク内
に実行主体のスレッドが複数存在するよう電子計算機を
動作させるプログラムを入力し、このプログラムから、
複数のスレッドから大域的にアクセス可能でかつ各スレ
ッド毎に固有に保持すべきデータを抽出し、各スレッド
毎に保有するスタックのそれぞれに抽出した前記データ
を割り当てる領域を確保し、この確保した領域の基準と
なるアドレスを前記各スレッド毎に保持し、前記データ
に対するアクセスは、保持した前記アドレスに基づいて
行うことを特徴とするものである。
【0020】複数のスレッドから大域的にアクセス可能
でかつ各スレッド毎に固有に保持すべきデータが前記プ
ログラム中に複数個ある場合には、この複数個のデータ
を割り当てるのに要する領域の大きさと、この領域内で
の各データの位置とを決定し、この決定した位置に基づ
いて各データのアクセス命令を生成しておき、各スレッ
ドが保有するスタックにおける領域確保は、決定した前
記大きさに基づいて行い、前記データに対するアクセス
は、生成した前記アクセス命令と保持した前記アドレス
とに基づいて行うものである。また、領域確保と基準と
なるアドレス保持はスレッド生成時に行い、データへの
アクセスの際に用いるアドレスは、実行中のスレッドに
ついて保持されているものとするというものである。
でかつ各スレッド毎に固有に保持すべきデータが前記プ
ログラム中に複数個ある場合には、この複数個のデータ
を割り当てるのに要する領域の大きさと、この領域内で
の各データの位置とを決定し、この決定した位置に基づ
いて各データのアクセス命令を生成しておき、各スレッ
ドが保有するスタックにおける領域確保は、決定した前
記大きさに基づいて行い、前記データに対するアクセス
は、生成した前記アクセス命令と保持した前記アドレス
とに基づいて行うものである。また、領域確保と基準と
なるアドレス保持はスレッド生成時に行い、データへの
アクセスの際に用いるアドレスは、実行中のスレッドに
ついて保持されているものとするというものである。
【0021】
【作用】本発明によれば、複数のスレッドから可視の大
域データであって且つ各スレッド毎に固有に保持すべき
データであるものは、その旨をプログラム中で宣言して
おけば、このような宣言をされたデータについてはその
ための領域を各スレッド毎にスタックに確保し、その領
域の基準となるアドレスを保持し、保持したアドレスに
基づいてデータへのアクセスを行うため、このデータは
各スレッドから大域的にアクセス可能なものであって且
つスレッド独自に保持されるものとなる。つまり、スレ
ッド固有データを大域変数と同様に宣言すると、これを
データ空間ではなく各スレッドのスタックに多重的に割
り当て、各スレッドが自スタックにアクセスすることに
より、そのデータはスレッド固有に保持されていること
になる。よって、上記の宣言さえ行えば良いのでプログ
ラムが簡素化される。また、固有データのアドレスでは
なくデータそのものがスタックに保存されているため、
実行効率が向上する。さらに、上記の領域確保と基準と
なるアドレス保持をスレッド生成時にそのスレッドの自
スタックについて行うので、スレッドの生成・消滅に伴
うスレッド数の動的な変化にも対応することができる。
域データであって且つ各スレッド毎に固有に保持すべき
データであるものは、その旨をプログラム中で宣言して
おけば、このような宣言をされたデータについてはその
ための領域を各スレッド毎にスタックに確保し、その領
域の基準となるアドレスを保持し、保持したアドレスに
基づいてデータへのアクセスを行うため、このデータは
各スレッドから大域的にアクセス可能なものであって且
つスレッド独自に保持されるものとなる。つまり、スレ
ッド固有データを大域変数と同様に宣言すると、これを
データ空間ではなく各スレッドのスタックに多重的に割
り当て、各スレッドが自スタックにアクセスすることに
より、そのデータはスレッド固有に保持されていること
になる。よって、上記の宣言さえ行えば良いのでプログ
ラムが簡素化される。また、固有データのアドレスでは
なくデータそのものがスタックに保存されているため、
実行効率が向上する。さらに、上記の領域確保と基準と
なるアドレス保持をスレッド生成時にそのスレッドの自
スタックについて行うので、スレッドの生成・消滅に伴
うスレッド数の動的な変化にも対応することができる。
【0022】
【実施例】以下、本発明の一実施例を図面に従い説明す
る。図1は同実施例にかかるスレッド固有データ保持方
法を行うシステム構成を示すものであり、図4はこの方
法を概念的に説明するものである。
る。図1は同実施例にかかるスレッド固有データ保持方
法を行うシステム構成を示すものであり、図4はこの方
法を概念的に説明するものである。
【0023】この場合、固有データ認識部3(101)
は、コンパイル部2がプログラム入力部1により入力さ
れたプログラム102をコンパイルする際に、このプロ
グラムを解析し、プログラム102中のスレッド固有デ
ータを認識し、それらのデータを割り付けるために必要
な領域の大きさ、および、その領域内での各データのオ
フセットを決定するようにしている。この処理を施され
たプログラムは実行ファイル103として実行ファイル
記憶部4にて記憶される。また、固有データ認識部3
(101)は、スレッド固有データ用の領域の大きさを
実行ファイル103のヘッダ部に記録し、さらに固有デ
ータのオフセットおよび実行時に決定される固有データ
領域の開始アドレス(ベースアドレス)により固有デー
タをアクセスする実行コードを実行ファイル103のテ
キスト部分に記録するようにもしている。以上の動作
は、実行前に実行ファイルを作成するにあたって行われ
るものである。
は、コンパイル部2がプログラム入力部1により入力さ
れたプログラム102をコンパイルする際に、このプロ
グラムを解析し、プログラム102中のスレッド固有デ
ータを認識し、それらのデータを割り付けるために必要
な領域の大きさ、および、その領域内での各データのオ
フセットを決定するようにしている。この処理を施され
たプログラムは実行ファイル103として実行ファイル
記憶部4にて記憶される。また、固有データ認識部3
(101)は、スレッド固有データ用の領域の大きさを
実行ファイル103のヘッダ部に記録し、さらに固有デ
ータのオフセットおよび実行時に決定される固有データ
領域の開始アドレス(ベースアドレス)により固有デー
タをアクセスする実行コードを実行ファイル103のテ
キスト部分に記録するようにもしている。以上の動作
は、実行前に実行ファイルを作成するにあたって行われ
るものである。
【0024】上述した固有データ認識部3の動作を図2
のフローチャートに示し、これをプログラム102の一
例を示す図5を参照しながら説明する。図5のプログラ
ムは、固有データ202、203のようにアクセスする
命令を含むfunc1,func2なる関数を実行しよ
うとするものである。図6には、図5に示すプログラム
をコンパイルするときの固有データ認識部3の内部デー
タの例を示してある。図7は、図5に示すプログラムを
コンパイルして生成される実行ファイル中に、固有デー
タ認識部3が生成して記録する固有データへのアクセス
命令の例を示すものである。
のフローチャートに示し、これをプログラム102の一
例を示す図5を参照しながら説明する。図5のプログラ
ムは、固有データ202、203のようにアクセスする
命令を含むfunc1,func2なる関数を実行しよ
うとするものである。図6には、図5に示すプログラム
をコンパイルするときの固有データ認識部3の内部デー
タの例を示してある。図7は、図5に示すプログラムを
コンパイルして生成される実行ファイル中に、固有デー
タ認識部3が生成して記録する固有データへのアクセス
命令の例を示すものである。
【0025】図5において、プログラム中の固有データ
data1,data2は固有データであることを示す
ためにprivate宣言(201)されている。する
と、固有データ認識部3では、privateというキ
ーワードにより、スレッド固有データを認識する(S
1)。そして、図5の場合は固有データが4バイトの整
数型の変数2個であるから、固有データ領域(図4の1
06)の大きさを8バイト(図6の301)と求める
(S2)。求めた固有データ領域の大きさを実行ファイ
ル103のヘッダ部分に記録する(S3)。また、各固
有データに対してそれぞれ固有データ領域106の内部
位置(オフセット)(図6の302)を決定する(S
4)。そして、決定したオフセットを基にアクセス命令
(図7の401、402)を生成し、これを実行ファイ
ル103のテキスト部分に記録する(S5)。図7に示
される命令の意味は、固有データ領域開始アドレス(P
SP;Private Stack Pointer )から上記のオフセット
分離れたアドレスにアクセスせよということである。
尚、この例では固有データへの値を代入する命令(図5
の202、203)に対応する命令であるから、st
(store )命令となっている。
data1,data2は固有データであることを示す
ためにprivate宣言(201)されている。する
と、固有データ認識部3では、privateというキ
ーワードにより、スレッド固有データを認識する(S
1)。そして、図5の場合は固有データが4バイトの整
数型の変数2個であるから、固有データ領域(図4の1
06)の大きさを8バイト(図6の301)と求める
(S2)。求めた固有データ領域の大きさを実行ファイ
ル103のヘッダ部分に記録する(S3)。また、各固
有データに対してそれぞれ固有データ領域106の内部
位置(オフセット)(図6の302)を決定する(S
4)。そして、決定したオフセットを基にアクセス命令
(図7の401、402)を生成し、これを実行ファイ
ル103のテキスト部分に記録する(S5)。図7に示
される命令の意味は、固有データ領域開始アドレス(P
SP;Private Stack Pointer )から上記のオフセット
分離れたアドレスにアクセスせよということである。
尚、この例では固有データへの値を代入する命令(図5
の202、203)に対応する命令であるから、st
(store )命令となっている。
【0026】このように作成された実行ファイルの実行
時には、実行部5が実行ファイル記憶部4から実行ファ
イルを読み込み実行を行うが、その際にスレッドを生成
したりスレッドを切り替えたりする。スレッドを生成す
る際のスレッド生成部6(104)の動作を図3(a)
に示す。スレッド生成部6(104)は、まず実行ファ
イル103中のヘッダ部分に記録されたスレッド固有デ
ータ用領域の大きさを読み(S11)、この大きさを基
に今から生成するスレッドkのスタック105(7のう
ちスレッドkに対応するもの)の最下位部分に固有デー
タ領域106を割り当てる(S12)。そして、これと
共に、スレッドの自スタックの最下位アドレスを固有デ
ータ領域開始アドレスレジスタ8(107)のPSPの
セットする(S13)。さらに、PSPから上に上記の
大きさ分固有データ領域を確保し、このときの上端のア
ドレスをスタックポインタ9のSP(Stack Pointer )
にセットする(S4)。このSPは実行時には通常のス
タックポインタとして用いられることになる。このよう
にスレッドを次々と生成していくと、スレッド1〜nの
各スタックにそれぞれ固有データ領域106が割り当て
られ、それぞれの開始アドレスがスレッド毎のPSPの
セットされることになる。この様子を図8に示す。尚、
PSPを各スタックの最下位アドレスとしたのは便宜上
であり、各スタック中の任意の位置の固有データ用の領
域を設ける基準アドレスと置き換えても良い。
時には、実行部5が実行ファイル記憶部4から実行ファ
イルを読み込み実行を行うが、その際にスレッドを生成
したりスレッドを切り替えたりする。スレッドを生成す
る際のスレッド生成部6(104)の動作を図3(a)
に示す。スレッド生成部6(104)は、まず実行ファ
イル103中のヘッダ部分に記録されたスレッド固有デ
ータ用領域の大きさを読み(S11)、この大きさを基
に今から生成するスレッドkのスタック105(7のう
ちスレッドkに対応するもの)の最下位部分に固有デー
タ領域106を割り当てる(S12)。そして、これと
共に、スレッドの自スタックの最下位アドレスを固有デ
ータ領域開始アドレスレジスタ8(107)のPSPの
セットする(S13)。さらに、PSPから上に上記の
大きさ分固有データ領域を確保し、このときの上端のア
ドレスをスタックポインタ9のSP(Stack Pointer )
にセットする(S4)。このSPは実行時には通常のス
タックポインタとして用いられることになる。このよう
にスレッドを次々と生成していくと、スレッド1〜nの
各スタックにそれぞれ固有データ領域106が割り当て
られ、それぞれの開始アドレスがスレッド毎のPSPの
セットされることになる。この様子を図8に示す。尚、
PSPを各スタックの最下位アドレスとしたのは便宜上
であり、各スタック中の任意の位置の固有データ用の領
域を設ける基準アドレスと置き換えても良い。
【0027】このように設けられた固有データ領域中の
固有データへのアクセスの実行は、上述したようにコン
パイル時に固有データ認識部3が生成した実行ファイル
中のコード401、402の中のPSPのところに、現
在のスレッドの固有データ領域開始アドレスレジスタ8
(107)に格納されたアドレスの値を代入し、この値
とコード中のオフセットの値とで計算されるアドレスに
アクセスすることにより行われる。
固有データへのアクセスの実行は、上述したようにコン
パイル時に固有データ認識部3が生成した実行ファイル
中のコード401、402の中のPSPのところに、現
在のスレッドの固有データ領域開始アドレスレジスタ8
(107)に格納されたアドレスの値を代入し、この値
とコード中のオフセットの値とで計算されるアドレスに
アクセスすることにより行われる。
【0028】一方、実行時にスレッドを切り替える際の
スレッド切替え部10(108)の動作を図3(b)に
示す。スレッド切替え部10(108)は、スレッド切
替えを行う際に、現在のPSPを他のレジスタ(SP
等)と共に読み出して(S21)これらの値をスレッド
コンテキスト管理部10に保存する(S22)。スレッ
ドコンテキスト管理部10には、スレッド生成時にセッ
トされた固有データ領域の開始アドレス、SP等をスレ
ッド毎に保持してある。そこでスレッド切替え部10
は、このスレッドコンテキスト管理部10から次に実行
するスレッドのPSP、SPを読み出して(S23)こ
れらの値を固有データ領域開始アドレスレジスタ8、ス
タックポインタ9にセットする(24)。
スレッド切替え部10(108)の動作を図3(b)に
示す。スレッド切替え部10(108)は、スレッド切
替えを行う際に、現在のPSPを他のレジスタ(SP
等)と共に読み出して(S21)これらの値をスレッド
コンテキスト管理部10に保存する(S22)。スレッ
ドコンテキスト管理部10には、スレッド生成時にセッ
トされた固有データ領域の開始アドレス、SP等をスレ
ッド毎に保持してある。そこでスレッド切替え部10
は、このスレッドコンテキスト管理部10から次に実行
するスレッドのPSP、SPを読み出して(S23)こ
れらの値を固有データ領域開始アドレスレジスタ8、ス
タックポインタ9にセットする(24)。
【0029】このような操作により、常に、あるスレッ
ドの実行中はそのスレッドの固有データ領域の開始アド
レスがPSPにセットされていることになり、固有デー
タへのアクセス命令は実行中のスレッドの固有データ領
域に対して行われるようになり、現在実行されていない
スレッドの固有データ領域へのアクセスは行われないこ
とになる。
ドの実行中はそのスレッドの固有データ領域の開始アド
レスがPSPにセットされていることになり、固有デー
タへのアクセス命令は実行中のスレッドの固有データ領
域に対して行われるようになり、現在実行されていない
スレッドの固有データ領域へのアクセスは行われないこ
とになる。
【0030】
【発明の効果】本発明によれば、スレッドに固有な大域
データは、一般の大域データと同様に記述することがで
きるようになる。このため、Auto変数として宣言し
て記述した時に問題となるプログラムの繁雑さを防ぐこ
とができ、プログラムの生成が向上するだけでなく、バ
グの混入を防止する上でも大きな効果がある。また、固
有データは、静的に固有データ領域中の位置が定められ
るため、アドレスによる間接アクセスの必要がないこと
と、関数呼び出しごとにそのアドレスを引き渡す必要が
ないため、実行効率を向上させることができる。さら
に、固有データ領域を各スレッドのスタック中に確保す
るため、スレッド数に制限がなく、大域的な配列として
宣言する場合と比べてスレッドの動的生成・消滅に容易
に対応できることになる。このように実用上多大なる効
果を奏するスレッド固有データ保持方法が実現できる。
データは、一般の大域データと同様に記述することがで
きるようになる。このため、Auto変数として宣言し
て記述した時に問題となるプログラムの繁雑さを防ぐこ
とができ、プログラムの生成が向上するだけでなく、バ
グの混入を防止する上でも大きな効果がある。また、固
有データは、静的に固有データ領域中の位置が定められ
るため、アドレスによる間接アクセスの必要がないこと
と、関数呼び出しごとにそのアドレスを引き渡す必要が
ないため、実行効率を向上させることができる。さら
に、固有データ領域を各スレッドのスタック中に確保す
るため、スレッド数に制限がなく、大域的な配列として
宣言する場合と比べてスレッドの動的生成・消滅に容易
に対応できることになる。このように実用上多大なる効
果を奏するスレッド固有データ保持方法が実現できる。
【図1】本発明の一実施例に係るスレッド固有データ保
持方法を行うシステム構成を表わすブロック図。
持方法を行うシステム構成を表わすブロック図。
【図2】図1の固有データ認識部3の動作を示すフロー
チャート。
チャート。
【図3】図1の実行部5が(a)スレッド生成部6を起
動した場合の6の動作、(b)スレッド切替部10を起
動した場合の10の動作を示すフローチャート。
動した場合の6の動作、(b)スレッド切替部10を起
動した場合の10の動作を示すフローチャート。
【図4】本発明の一実施例に係るスレッド固有データ保
持方法を概念的に示す図。
持方法を概念的に示す図。
【図5】本実施例に用いられるプログラム例を示す図。
【図6】図5に示すプログラムを解析した場合の固有デ
ータ解析部の内部データを示す図。
ータ解析部の内部データを示す図。
【図7】図5に示すプログラムをコンパイルした実行フ
ァイルを示す図。
ァイルを示す図。
【図8】実行中のスレッドのスタック状態を示す図。
【図9】従来のスレッド固有データを保持する方法のプ
ログラム例を示す図。
ログラム例を示す図。
【図10】従来のスレッド固有データを保持する方法の
プログラム例を示す図。
プログラム例を示す図。
1…プログラム入力部、2…コンパイル部、3,101
…固有データ認識部、4…実行ファイル記憶部、5…実
行部、6,104…スレッド生成部、7,105…スタ
ック、8,107…固有データ領域開始アドレスレジス
タ、9…スタックポインタ、10,108…スレッド切
替え部、11…スレッドコンテキスト管理部、102…
プログラム、103…実行ファイル、106…固有デー
タ領域。
…固有データ認識部、4…実行ファイル記憶部、5…実
行部、6,104…スレッド生成部、7,105…スタ
ック、8,107…固有データ領域開始アドレスレジス
タ、9…スタックポインタ、10,108…スレッド切
替え部、11…スレッドコンテキスト管理部、102…
プログラム、103…実行ファイル、106…固有デー
タ領域。
Claims (2)
- 【請求項1】 アドレス空間を定義するタスク内に実行
主体のスレッドが複数存在するよう電子計算機を動作さ
せるプログラムを入力し、 この複数のスレッドから大域的にアクセス可能でかつ各
スレッド毎に固有に保持すべきデータを、入力した前記
プログラムから抽出し、 各スレッド毎に保有するスタックにそれぞれ、抽出した
前記データを割り当てる領域を確保し、 この確保した領域の基準となるアドレスを前記各スレッ
ド毎に保持し、 前記データに対するアクセスは、保持した前記アドレス
に基づいて行うことを特徴とするスレッド固有データ保
持方法。 - 【請求項2】 アドレス空間を定義するタクス内に実行
主体のスレッドが複数存在するよう電子計算機を動作さ
せるプログラムを入力し、 この複数のスレッドから大域的にアクセス可能でかつ各
スレッド毎に固有に保持すべきデータを複数個、入力し
た前記プログラムから抽出し、 この抽出した複数個のデータを割り当てるのに要する領
域の大きさと、この領域内での各データの位置とを決定
し、 この決定した位置に基づいて各データのアクセス命令を
生成しておき、 前記スレッドを生成する際に、決定した前記大きさに基
づいてこのスレッドが保有するスタックに前記データを
割り当てる領域を確保し、 この確保した領域の基準となるアドレスを、生成した前
記スレッドが他のスレッドに切り替えられるかあるいは
消滅するまでの間保持し、 前記データに対してアクセスする際には、生成した前記
アクセス命令と保持した前記アドレスとに基づいてアク
セスを行うことを特徴とするスレッド固有データ保持方
法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP4065772A JPH05204656A (ja) | 1991-11-30 | 1992-03-24 | スレッド固有データ保持方法 |
US07/983,407 US5511192A (en) | 1991-11-30 | 1992-11-30 | Method and apparatus for managing thread private data in a parallel processing computer |
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP3-339572 | 1991-11-30 | ||
JP33957291 | 1991-11-30 | ||
JP4065772A JPH05204656A (ja) | 1991-11-30 | 1992-03-24 | スレッド固有データ保持方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
JPH05204656A true JPH05204656A (ja) | 1993-08-13 |
Family
ID=26406919
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP4065772A Pending JPH05204656A (ja) | 1991-11-30 | 1992-03-24 | スレッド固有データ保持方法 |
Country Status (2)
Country | Link |
---|---|
US (1) | US5511192A (ja) |
JP (1) | JPH05204656A (ja) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7039905B1 (en) | 1999-11-10 | 2006-05-02 | Fujitsu Limited | Compiler device and computer-readable recording medium recorded with compiler program |
JP2006164061A (ja) * | 2004-12-09 | 2006-06-22 | Denso Corp | マルチタスクシステム、プログラム、及びプログラム生成方法 |
JP2012530995A (ja) * | 2009-06-26 | 2012-12-06 | コードプレイ、ソフトウェア、リミテッド | 処理方法 |
JP2013016192A (ja) * | 2008-03-24 | 2013-01-24 | Nvidia Corp | 同期並列スレッドプロセッサにおける間接的な関数呼び出し命令 |
Families Citing this family (38)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5812811A (en) * | 1995-02-03 | 1998-09-22 | International Business Machines Corporation | Executing speculative parallel instructions threads with forking and inter-thread communication |
JPH1091443A (ja) * | 1996-05-22 | 1998-04-10 | Seiko Epson Corp | 情報処理回路、マイクロコンピュータ及び電子機器 |
US5913925A (en) * | 1996-12-16 | 1999-06-22 | International Business Machines Corporation | Method and system for constructing a program including out-of-order threads and processor and method for executing threads out-of-order |
US5835705A (en) * | 1997-03-11 | 1998-11-10 | International Business Machines Corporation | Method and system for performance per-thread monitoring in a multithreaded processor |
US5895467A (en) * | 1997-04-11 | 1999-04-20 | Informix Software, Inc. | Selectively switching memory access permission for manipulating data in a database |
US5958028A (en) * | 1997-07-22 | 1999-09-28 | National Instruments Corporation | GPIB system and method which allows multiple thread access to global variables |
US6691118B1 (en) * | 1997-10-31 | 2004-02-10 | Oracle International Corporation | Context management system for modular software architecture |
US6272518B1 (en) | 1998-08-17 | 2001-08-07 | International Business Machines Corporation | System and method for porting a multithreaded program to a job model |
US6105049A (en) * | 1998-08-25 | 2000-08-15 | International Business Machines Corporation | Resource lock/unlock capability in multithreaded computer environment |
US6105050A (en) * | 1998-08-25 | 2000-08-15 | International Business Machines Corporation | System for resource lock/unlock capability in multithreaded computer environment |
US6112222A (en) * | 1998-08-25 | 2000-08-29 | International Business Machines Corporation | Method for resource lock/unlock capability in multithreaded computer environment |
US6633974B1 (en) * | 1999-11-04 | 2003-10-14 | International Business Machines Corporation | Apparatus and method for controlling link stack corruption during speculative instruction branching using multiple stacks |
US6742112B1 (en) * | 1999-12-29 | 2004-05-25 | Intel Corporation | Lookahead register value tracking |
US7069556B2 (en) * | 2001-09-27 | 2006-06-27 | Intel Corporation | Method and apparatus for implementing a parallel construct comprised of a single task |
US20030066056A1 (en) * | 2001-09-28 | 2003-04-03 | Petersen Paul M. | Method and apparatus for accessing thread-privatized global storage objects |
US7065765B2 (en) * | 2001-12-05 | 2006-06-20 | International Business Machines Corporation | Serializing event handling in a threaded system with no wait states |
US6968445B2 (en) * | 2001-12-20 | 2005-11-22 | Sandbridge Technologies, Inc. | Multithreaded processor with efficient processing for convergence device applications |
CA2387200A1 (en) * | 2002-05-22 | 2003-11-22 | Ibm Canada Limited-Ibm Canada Limitee | Implementation of thread-static data in multi-threaded computer systems |
US20040103414A1 (en) * | 2002-11-27 | 2004-05-27 | Vomlehn David M. | Method and apparatus for interprocess communications |
US7233335B2 (en) * | 2003-04-21 | 2007-06-19 | Nividia Corporation | System and method for reserving and managing memory spaces in a memory resource |
US7444547B2 (en) | 2003-06-19 | 2008-10-28 | International Business Machines Corproation | Method, system, and product for programming in a simultaneous multi-threaded processor environment |
EP1505490A1 (en) * | 2003-08-05 | 2005-02-09 | Sap Ag | Method and computer system for accessing thread private data |
US7418585B2 (en) * | 2003-08-28 | 2008-08-26 | Mips Technologies, Inc. | Symmetric multiprocessor operating system for execution on non-independent lightweight thread contexts |
US9032404B2 (en) * | 2003-08-28 | 2015-05-12 | Mips Technologies, Inc. | Preemptive multitasking employing software emulation of directed exceptions in a multithreading processor |
US7870553B2 (en) * | 2003-08-28 | 2011-01-11 | Mips Technologies, Inc. | Symmetric multiprocessor operating system for execution on non-independent lightweight thread contexts |
US7836450B2 (en) * | 2003-08-28 | 2010-11-16 | Mips Technologies, Inc. | Symmetric multiprocessor operating system for execution on non-independent lightweight thread contexts |
US7711931B2 (en) * | 2003-08-28 | 2010-05-04 | Mips Technologies, Inc. | Synchronized storage providing multiple synchronization semantics |
US7376954B2 (en) * | 2003-08-28 | 2008-05-20 | Mips Technologies, Inc. | Mechanisms for assuring quality of service for programs executing on a multithreaded processor |
US20050050305A1 (en) * | 2003-08-28 | 2005-03-03 | Kissell Kevin D. | Integrated mechanism for suspension and deallocation of computational threads of execution in a processor |
US7849297B2 (en) * | 2003-08-28 | 2010-12-07 | Mips Technologies, Inc. | Software emulation of directed exceptions in a multithreading processor |
EP1660993B1 (en) | 2003-08-28 | 2008-11-19 | MIPS Technologies, Inc. | Integrated mechanism for suspension and deallocation of computational threads of execution in a processor |
US7594089B2 (en) * | 2003-08-28 | 2009-09-22 | Mips Technologies, Inc. | Smart memory based synchronization controller for a multi-threaded multiprocessor SoC |
US7380039B2 (en) | 2003-12-30 | 2008-05-27 | 3Tera, Inc. | Apparatus, method and system for aggregrating computing resources |
US9189230B2 (en) | 2004-03-31 | 2015-11-17 | Intel Corporation | Method and system to provide concurrent user-level, non-privileged shared resource thread creation and execution |
US7769853B2 (en) * | 2007-06-12 | 2010-08-03 | International Business Machines Corporation | Method for automatic discovery of a transaction gateway daemon of specified type |
US7991962B2 (en) * | 2007-12-10 | 2011-08-02 | International Business Machines Corporation | System and method of using threads and thread-local storage |
US8326886B2 (en) * | 2010-01-21 | 2012-12-04 | Microsoft Corporation | Per-thread, per-instance data storage |
US10922074B2 (en) * | 2017-09-28 | 2021-02-16 | Oracle International Corporation | Deferred state mutation |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4545016A (en) * | 1983-01-07 | 1985-10-01 | Tandy Corporation | Memory management system |
US4847754A (en) * | 1985-10-15 | 1989-07-11 | International Business Machines Corporation | Extended atomic operations |
US5047919A (en) * | 1986-04-03 | 1991-09-10 | Harris Corporation | Method and apparatus for monitoring software execution in a parallel multiprocessor computer system |
JPH01303527A (ja) * | 1988-05-31 | 1989-12-07 | Hitachi Ltd | 共有資源の管理方法 |
US5353418A (en) * | 1989-05-26 | 1994-10-04 | Massachusetts Institute Of Technology | System storing thread descriptor identifying one of plural threads of computation in storage only when all data for operating on thread is ready and independently of resultant imperative processing of thread |
US5339415A (en) * | 1990-06-11 | 1994-08-16 | Cray Research, Inc. | Dual level scheduling of processes to multiple parallel regions of a multi-threaded program on a tightly coupled multiprocessor computer system |
-
1992
- 1992-03-24 JP JP4065772A patent/JPH05204656A/ja active Pending
- 1992-11-30 US US07/983,407 patent/US5511192A/en not_active Expired - Fee Related
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7039905B1 (en) | 1999-11-10 | 2006-05-02 | Fujitsu Limited | Compiler device and computer-readable recording medium recorded with compiler program |
JP2006164061A (ja) * | 2004-12-09 | 2006-06-22 | Denso Corp | マルチタスクシステム、プログラム、及びプログラム生成方法 |
JP2013016192A (ja) * | 2008-03-24 | 2013-01-24 | Nvidia Corp | 同期並列スレッドプロセッサにおける間接的な関数呼び出し命令 |
US9639365B2 (en) | 2008-03-24 | 2017-05-02 | Nvidia Corporation | Indirect function call instructions in a synchronous parallel thread processor |
JP2012530995A (ja) * | 2009-06-26 | 2012-12-06 | コードプレイ、ソフトウェア、リミテッド | 処理方法 |
Also Published As
Publication number | Publication date |
---|---|
US5511192A (en) | 1996-04-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JPH05204656A (ja) | スレッド固有データ保持方法 | |
US8631219B2 (en) | Method and system for dynamic memory management | |
US6601235B1 (en) | Method and apparatus for dynamically deoptimizing compiled activations | |
US8677331B2 (en) | Lock-clustering compilation for software transactional memory | |
US20060026183A1 (en) | Method and system provide concurrent access to a software object | |
US20040098724A1 (en) | Associating a native resource with an application | |
JP2001147819A (ja) | 最適化装置および記録媒体 | |
JPH04268927A (ja) | メモリ管理方法 | |
JP2008546086A (ja) | 共有リソースのためのアクセス協調を伴うプログラムコードを変換する方法および装置 | |
JP2003167737A (ja) | スタック使用方法 | |
US8200938B2 (en) | Computer system and method providing a memory buffer for use with native and platform-independent software code | |
US7086044B2 (en) | Method, article of manufacture and apparatus for performing automatic intermodule call linkage optimization | |
Taura et al. | Fine-grain multithreading with minimal compiler support—a cost effective approach to implementing efficient multithreading languages | |
US6959430B2 (en) | Specialized heaps for creation of objects in object-oriented environments | |
US8296742B2 (en) | Automatic native generation | |
JPH06337794A (ja) | プログラム制御方式 | |
US6499094B1 (en) | Management of memory heap space for data files accessible to programs operating in different addressing modes | |
US7770152B1 (en) | Method and apparatus for coordinating state and execution context of interpreted languages | |
US7036120B2 (en) | Two tier clusters for representation of objects in Java programming environments | |
JP3241214B2 (ja) | 分散処理装置及びプロセス実行方法 | |
JP3807860B2 (ja) | コンパイル方法および装置、並びにメソッド活動度計算方法および装置 | |
US7082597B2 (en) | Representation of objects in a Java programming environment | |
JP2000035890A (ja) | コンパイル方法、フレーム検出方法及び装置、コード破棄方法、並びにコンピュータ | |
JPH09146772A (ja) | 手続き呼出し方法 | |
KR19990086969A (ko) | 메모리 할당방법 |