(57)【要約】【課題】古典的トレース式ごみ集めでは、実行にあたって全スレッドを停止するが、多数のスレッドを使うサーバアプリケーションでは全スレッドを停止しようとすると長い時間がかかり、その間システムのサービスが停止してしまう。【解決手段】プログラムの実行中に、データ構造を参照しうるスレッドが割付けたスレッドのみかという情報を管理しておく。そして、あるスレッドが単独でごみ集めの実行するときに、スレッド固有のルート集合（実行時スタック）からトレースできず、かつ、該スレッドのみが参照しうるデータ構造を求め、これを空き領域にすることで、スレッドが単独で自身の割付用メモリ空間をごみ集めすることを可能にする。これにより、スレッドが単独でごみ集めを実施する場合には他のスレッドを止める必要がなくなる。【選択図】  図６
2004287870.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサとメモリを含む情報処理装置において、前記プロセッサにより複数スレッドが実行される環境で前記プロセッサの処理としてメモリのごみ集めを行う方法であって、
前記プロセッサが実行するスレッド毎に固有に割り付けられた領域の範囲でごみ集めを行うことを特徴とするごみ集め方法。
【請求項２】
請求項１のごみ集め方法において、前記スレッドが割り付けたデータ構造について、該データ構造を参照する可能性があるスレッドが当該スレッド以外にはないデータ構造をごみ集めの対象とすることを特徴とするごみ集め方法。
【請求項３】
プロセッサとメモリを含む情報処理装置において、前記プロセッサにより複数スレッドが実行される環境で前記プロセッサの処理としてメモリのごみ集めを行う方法であって、
前記プロセッサが実行するスレッド毎に固有に割り付けられた領域毎のごみ集め処理と、全領域のごみ集め処理のいずれの処理を行うかを判断し、
決定された範囲内のごみ集め処理を実行することを特徴とするごみ集め方法。
【請求項４】
データ構造について、前記データ構造を参照する可能性があるスレッドが、前記データ構造を割付けたスレッドのみである状態Ｌと、そうとは限らない状態Ｓの２つの状態を設け、
あるスレッドが割付けたデータ構造Ａが、前記状態Ｌにあるとき、前記スレッドが前記データ構造Ａへの参照を、前記状態Ｓにあるデータ構造に記録しようとする場合に、該記録に先行して前記データ構造Ａと、前記データ構造Ａから参照を再帰的に辿って到達しうる、前記状態Ｌにあるデータ構造の状態を、前記状態Ｓに変更する処理を実施しておき、
前記スレッドがごみ集めを実施する際に、前記スレッド固有のルート集合から参照を辿って到達することができず、かつ、前記スレッドのみが参照する可能性がある状態Ｌにあるデータ構造を空き領域にするごみ集め方法。
【請求項５】
データ構造を割付けるコードについて、前記データ構造を参照する可能性があるスレッドが、前記データ構造を割付けたスレッド以外にない状態Ｌで割付ける第一のコードと、そうとは限らない状態Ｓで割付ける第二のコードを用意し、入力プログラム中のデータ構造の割付けを実施する文について、該実施文向けのコードとして前記第一のコードを用いた場合に、割付けたデータ構造の状態が、状態を変更する動作によって状態Ｌから状態Ｓに変わる確率が高いか否かを、プロファイル情報またはフロー解析から求め、高いと判断できる場合に、前記実施文向けのコードとして、前記第二のコードを出力し、そうでない場合に前記第一のコードを出力することを特徴とするコンパイル方法。
【請求項６】
参照Ｒをデータ構造Ｂに書きこむコードについて、前記データ構造Ｂが、前記データ構造を参照する可能性があるスレッドが、前記データ構造を割付けたスレッド以外にないことを示す状態Ｌであるか検査し、状態Ｌでない場合に、前記参照Ｒを再帰的にたどって到達しうるデータ構造の状態を前記データ構造を参照する可能性があるスレッドが、前記データ構造を割付けたスレッド以外にあることを示す状態Ｓにした上で前記参照Ｒを前記データ構造Ｂに書きこむコードγと、前記検査および変更を実施せずに前記参照Ｒを前記データ構造Ｂに書きこむコードδを用意し、入力プログラム中の参照をデータ構造に書きこむ文Ｆについて、該文Ｆが書きこむ参照Ｒが指示するデータ構造の状態Ｕや、書きこみ先のデータ構造Ｂの状態Ｖをフロー解析によって調べ、前記状態Ｕが前記状態Ｓにあると判明した場合、あるいは前記状態Ｖが必ず前記状態Ｌにあると判明した場合に、前記文Ｆ向けのコードとして、前記コードδを出力し、そうでない場合に、前記コードγを出力することを特徴とするコンパイル方法。
【請求項７】
参照Ｑをデータ構造Ｃに書きこむコードについて、前記参照Ｑを前記データ構造Ｃに書きこむ前に前記データ構造Ｃの状態が、前記データ構造を参照する可能性があるスレッドが前記データ構造を割付けたスレッド以外にない状態Ｌか検査し、そうでない場合に前記参照Ｑを再帰的に辿って到達しうるデータ構造の状態を、前記データ構造を参照する可能性があるスレッドが、前記データ構造を割付けたスレッド以外にあることを示す状態Ｓにするコードεと、前記参照Ｑを前記データ構造Ｃに書きこむ前に前記参照Ｑを再帰的に辿って到達しうるデータ構造の状態を前記状態Ｓにするコードωを用意し、入力プログラム中の参照をデータ構造に書きこむ文Ｇについて、書きこみ先の前記データ構造Ｃの状態Ｖをフロー解析によって調べ、前記状態Ｖが前記状態Ｓであると判明した場合に、前記文Ｇ向けのコードとして、前記コードωを出力し、そうでない場合に、前記コードεを出力することを特徴とするコンパイル方法。
【請求項８】
プロセッサとメモリを含む情報処理装置において、前記プロセッサにより複数スレッドが実行される環境で前記プロセッサの処理としてメモリのごみ集めを行うプログラムであって、
前記プロセッサが実行するスレッドごとに固有に割り付けられた領域を特定するステップと、
特定された領域の範囲でごみ集めを実行するステップとを有するプログラム。
【請求項９】
請求項８のプログラムにおいて、前記スレッドが割り付けたデータ構造について、該データ構造を参照する可能性があるスレッドが当該スレッド以外にはないデータ構造をごみ集めの対象とすることを特徴とするプログラム。
【請求項１０】
プロセッサとメモリを含む情報処理装置において、前記プロセッサにより複数スレッドが実行される環境で前記プロセッサの処理としてメモリのごみ集めを行うプログラムであって、
前記プロセッサが実行するスレッド毎に固有に割り付けられた領域毎のごみ集め処理と、全領域のごみ集め処理のいずれの処理を行うかを判断し、
決定された範囲内のごみ集め処理を実行することを特徴とするプログラム。
【請求項１１】
データ構造を割付けるコードについて、前記データ構造を参照する可能性があるスレッドが、前記データ構造を割付けたスレッド以外にない状態Ｌで割付ける第一のコードと、そうとは限らない状態Ｓで割付ける第二のコードを用意し、
入力プログラム中のデータ構造の割付けを実施する文について、該実施文向けのコードとして前記第一のコードを用いた場合に、割付けたデータ構造の状態が、状態を変更する動作によって状態Ｌから状態Ｓに変わる確率が高いか否かを、プロファイル情報またはフロー解析から求め、高いと判断できる場合に、前記実施文向けのコードとして、前記第二のコードを出力し、そうでない場合に前記第一のコードを出力することを特徴とするコンパイラ。
【請求項１２】
参照Ｒをデータ構造Ｂに書きこむコードについて、前記データ構造Ｂが、前記データ構造を参照する可能性があるスレッドが、前記データ構造を割付けたスレッド以外にないことを示す状態Ｌであるか検査し、状態Ｌでない場合に、前記参照Ｒを再帰的にたどって到達しうるデータ構造の状態を前記データ構造を参照する可能性があるスレッドが、前記データ構造を割付けたスレッド以外にあることを示す状態Ｓにした上で前記参照Ｒを前記データ構造Ｂに書きこむコードγと、前記検査および変更を実施せずに前記参照Ｒを前記データ構造Ｂに書きこむコードδを用意し、入力プログラム中の参照をデータ構造に書きこむ文Ｆについて、該文Ｆが書きこむ参照Ｒが指示するデータ構造の状態Ｕや、書きこみ先のデータ構造Ｂの状態Ｖをフロー解析によって調べ、前記状態Ｕが前記状態Ｓにあると判明した場合、あるいは前記状態Ｖが必ず前記状態Ｌにあると判明した場合に、前記文Ｆ向けのコードとして、前記コードδを出力し、そうでない場合に、前記コードγを出力することを特徴とするコンパイラ。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、プログラムの実行系およびプログラミング言語の処理系の技術に関する。特に、ごみ集めによって自動的にメモリ管理をおこなうプログラミング言語およびその実行形式に関する。
【０００２】
【従来の技術】
使い終わったメモリ空間を自動的に検出して空き空間に還元し、再利用できるようにするメモリ管理技法にごみ集めがある。ごみ集めには様々な実施方法があるが、トレース式のごみ集めの実施手順を次に示す。まず、実行時に空きメモリを使い果たしたら、ルート集合と呼ぶ、実行時スタックや大域変数などプログラムが参照可能であることが自明なデータ領域中にある参照の集合を求め、該集合からデータ構造を再帰的に辿る。この過程が終了した時点で辿ることがなかったデータ構造を使っていないデータ構造であるとみなし、使っていないデータ構造が占有している領域を空き領域に還元する（例えば非特許文献１参照）。
【０００３】
【非特許文献１】Ｒｉｃｈａｒｄ  Ｊｏｎｅｓ  ａｎｄ  Ｒａｆａｅｌ  Ｌｉｎｓ、  ”Ｇａｒｂａｇｅ  Ｃｏｌｌｅｃｔｉｏｎ、”  Ｊｏｈｎ  Ｗｉｌｅｙ  ＆  Ｓｏｎｓ、１９９６
【０００４】
【発明が解決しようとする課題】
複数のスレッドが動作する環境下でごみ集めを実施する際に、たとえばごみ集めを実施するきっかけとなったスレッド以外の全てのスレッドが停止される等、スレッド間の同期をとるためのオーバヘッド処理が生じる。サーバなど数多くのスレッドを駆動する環境では、スレッド間の同期をとるためのオーバヘッドの影響が一層大きくなり、システムが長期間に渡って停止することがある。本発明の目的は、ごみ集めの際にスレッド間の同期をとる回数を減らし、システムが長期間に渡って停止する頻度を少なくすることにある。
【０００５】
【課題を解決するための手段】
上記目的を達成するために、スレッドに、固有にデータ構造を割り付ける領域を与え、スレッドが該領域中の空き空間を使い果たした場合に、該スレッド単独で、該領域のごみ集めを実施することにより、スレッド間の同期を減らし、システムが長期間停止することを防ぐ。
【０００６】
また、スレッド固有の領域のごみ集めはスレッドが割り付けたデータ構造について、該データ構造を参照する可能性があるスレッドが当該スレッド以外にはないデータ構造をごみ集めの対象とすることにより、ごみ集め時の処理を更に軽くする。
【０００７】
更に、スレッド毎のごみ集めとヒープ領域全体のごみ集めを選択して実施することで、領域全体のごみ集めも行い、空き領域を十分確保することを可能にする。
【０００８】
より詳細には、まず、スレッドが割付けたデータ構造のうち、自スレッドのみが参照する可能性があるものを把握する。具体的には、データ構造に対し、割付けたスレッドのみが参照する可能性がある状態Ｌと、そうでない状態Ｓを用意する。大域変数など、スレッド間で共有するデータ構造は状態Ｓである。データ構造は、割付け時点では割付け元のスレッドのみから参照可能であり、したがってスレッドは割付け時点でデータ構造に状態Ｌを与える。スレッドは、参照を状態Ｓのデータ構造にストアするにあたり、ストアに先だって、参照先のデータ構造を含め、参照を再帰的にたどって到達しうるデータ構造群が他スレッドから可視になるとみなし、前記データ構造群の状態をＳにする。次に、スレッド固有の割付け領域を使い果たしたとき、該スレッド固有のルート集合から状態がＬのデータ構造のみを再帰的にたどって到達できない、状態がＬのデータ構造の集合を求める。該集合に属するデータ構造は、参照する可能性があるスレッドが自身を割付けたスレッドのみであり、なおかつ、自身を割付けたスレッドに固有のルート集合から到達できないので、使い終わったとみなして解放できる。本ごみ集めでは、参照をデータ構造にストアするに先立ち、ストア先のデータ構造が状態Ｓか検査し、真ならば参照を再帰的にたどって到達しうる状態Ｌのデータ構造群の状態をＳに変更する。
【０００９】
本明細書では、更に上述した検査や状態の変更のオーバヘッドを軽減するためにコンパイラによる最適化時に新しい処理を行う発明も開示する。
【００１０】
まず最適化でデータ構造を割付けた時点での初期状態を最適化し、状態の変更が発生する確率を抑える発明である。具体的には、割付けを実施する個々の文について、該文が割付けるデータ構造が状態Ｌから状態Ｓに遷移する可能性が高いか調べ、可能性が高いならば、該割付け文のコードとして、最初から状態Ｓの状態でデータ構造を割付けるコードを出力する。ある割付け文が生成するデータ構造の状態が遷移する確率が高いか否かは、プロファイル情報やフロー解析によって判断できる。
【００１１】
最適化により参照を書きこむコードを高速化する発明も開示する。参照を書き込むコードは、書きこみ先のデータ構造の状態がＳか検査するコード、検査結果が真である場合に参照を再帰的にたどって到達しうる状態Ｌのデータ構造の状態をＳに変更するコード、参照を書き込むコードという３種類のコードからなるが、前記３種類のコードのうち前２者から生じるオーバヘッドを抑止する。まず、フロー解析によって書きこむ参照が指示するデータ構造の状態νおよび書き込み先のデータ構造の状態ιをフロー解析によって調べる。フロー解析の結果、前記状態νが必ずＳであると判った場合、あるいは前記状態ιが必ずＬであると判った場合には、遷移が不要であり、書きこみ先のデータ構造の状態を検査するコードおよび書きこむ参照を再帰的にたどって状態を遷移させるコードの全体を省略する。この最適化で前記検査および遷移のコードを省略できなかった場合には、前記検査のコードの省略を試みる。具体的には、書きこむ参照が指示するデータ構造書き込み先のデータ構造の状態ιをフロー解析によって調べる。フロー解析の結果、状態ιが必ずＳであると判明した場合には、前記検査のコードを省略できる。
【００１２】
【発明の実施の形態】
以下本発明の実施例を図面を用いて詳細に説明する。なお、本発明はこの実施例に限定されなるものではない。
【００１３】
本実施例の言語処理系のプログラムは図１に示すような計算機上で動作する。計算機はプロセッサ１０１と主記憶１０２、バス１０３、ディスク装置１０４、ＣＤ−ＲＯＭドライブ１０５を有する。ごみ集めを実施するプログラムや、コンパイラなどの言語処理系のプログラムはディスク装置１０４に保持される。プロセッサ１０１は、ディスク装置１０４から言語処理系のプログラムなどを、バス１０３を介して主記憶１０２にとりこんで実行する。上述したプログラムは記録媒体、たとえばＣＤ−ＲＯＭ１０６からＣＤ−ＲＯＭドライブ１０５を介してディスク装置１０４にとりこまれる。計算機にネットワークコントローラを持たせ、ネットワークを介してとりこむようにしてもよい。
【００１４】
図２に、ごみ集め２０１および最適化を実施する最適化系２０２を含む言語処理系の例を示す。図２の言語処理系では、次の手順でソースファイル２０３を実行形式プログラム２０４に変換する。まず、ソースファイル２０３をコンパイラ２０５でオブジェクトファイル２０６に変換する。変換の過程で、最適化系２０２により、最適化を実施する。最適化系は本実施例の特徴部分であるが詳細は後述する。次に、リンカ２０７により、オブジェクトファイル２０６と実行時ライブラリ２０８をリンクして実行形式プログラム２０４を得る。ごみ集め２０１は実行時ライブラリ２０８の一部としてオブジェクトファイルとリンクされる。ごみ集め２０１も本実施例の特徴部分であり詳細を後述する。コンパイラ２０５はプロファイル情報を生成するコードをオブジェクトコード中に挿入することも可能であり、プロファイル情報を生成するコードを含む実行形式プログラム２０４を実行するとプロファイル情報２０９が得られる。プロファイル情報２０９はソースファイル２０３を再度コンパイルする際の最適化処理時などに利用する。
【００１５】
図３に、プロファイル情報２０９が含む情報のうち、本実施例での特徴的な最適化処理に利用される情報の例を示す。図３に示す情報は割付け文の固有の番号３０１と、該割付け文で割付けを実施した回数３０２、該割付け文で割付けたデータ構造のうち、状態がＬからＳに変化したものの数３０３、割付け文の位置を表す情報３０４を記録している。ここで、状態Ｌとはデータ構造に対し、割付けたスレッドのみが参照する可能性がある状態のことであり、状態Ｓはそうでない状態のことをいう。大域変数など、スレッド間で共有するデータ構造は状態Ｓである。データ構造の「状態」の値によりスレッドが割付けたデータ構造のうち、自スレッドのみが参照する可能性があるものが把握される。
【００１６】
このプロファイル情報は、コンパイル時に個々の割付け文に固有の番号３０１を割り振り、それに対応する割付け文の位置３０４を記録しておき、次に、割付け回数３０２を得るために、個々の割付け文に割付けた回数を記録するためのコードを織り込んでおくことにより得られる。
【００１７】
図４に、プロファイル情報を得るための割付け文（メモリ割付を実行するコード）の例を示す。処理４０１がプロファイル情報を取得するために挿入したコードであり、プロファイル情報の取得をおこなわない実行形式プログラム２０４を生成するときには、処理４０１を省略できる。図４に示すコードは、次の手順で割付けを実施する。まず、判断４０２で空き領域があるか確認し、あれば処理４０３に進んで空き領域を確保し、なければ処理４０４に進んでごみ集めを実施し、空き領域を確保した上で処理４０３に進む。処理４０３で空き領域を確保したら、処理４０１に進み、該割付け文で割付けを実施した回数３０２に１を加算し、また、割付けたデータ構造の先頭（ヘッダ）部分に状態遷移回数３０３を取得するために必要な情報、つまり該割付け文に固有な番号３０１を書き込む。
【００１８】
図５に割付け文により割り付けられるデータ構造の例を示す。データ構造のヘッダ部分には、割付け文に固有な番号を記録するフィールド５０１と、データ構造を参照しうるスレッドが割付け元のスレッドのみか否の状態を記録するフィールド５０２、ごみ集めのときに、実行時スタックなど、ルート集合から参照を再帰的にたどって到達できるか否かを記録するためのフィールド５０３がある。
【００１９】
図４に戻り、処理４０１でプロファイルに関する処理を実施したら、処理４０５に進み、割付けたデータ構造の状態フィールド５０２を初期化し、値Ｌを書き込む。本実施例では値Ｌを１、値Ｓを０とする。続いて処理４０６に進んでマークフィールド５０３に「到達できていない」ことを意味する値０を書き込む。最後に処理４０７で割付け文を実施した結果として、割付けたデータ構造のアドレスを返戻する。
【００２０】
図６に、処理４０４で実施するごみ集めの例を示す。図６の処理６０１および処理６０２において、本実施例の特徴的なごみ集めを実施している。図６に示すごみ集め処理では、まず判断６０３で、空き領域が足らなくなったスレッドが単独で自身の割付け領域（図７の領域７０４）のみを対象にごみ集めを実施するか、それともヒープ領域全域を対象に、全スレッドを止める従来技術のごみ集め６０４を実施するかを決める。スレッド固有の割付領域のみのごみ集めではスレッド間で共有しているデータ構造をごみ集めできないので、時折従来技術によるごみ集め６０４を実施する必要がある。判断６０３でどちらを実施するか決定する方法としては、たとえば、それぞれのごみ集めを交互に実行する方法や、カウンタを設けてスレッド固有の割付領域だけのごみ集め回数が所定回数に達したかにより全ヒープ領域のごみ集めを実行する方法や、タイマーにより時間的に決める方法、処理が複雑になるがごみ集めにより確保できる空き領域を計数してその割合に応じて決める方法等が考えられる。
【００２１】
図７に、実行形式のプログラム２０４を実行した場合のプロセス７０１の例を示す。プロセス７０１は複数のスレッド７０２とヒープ記憶領域７０３を有する。ヒープ記憶領域７０３は、個々のスレッド７０２に固有の割り付け領域７０４と、スレッド間で共有する領域７０５を含む。
【００２２】
図６に戻り、判断６０３においてスレッド単独でごみ集めを実施することにした場合には処理６０１に進み、そうでなければ処理６０４に進んで従来技術によるごみ集めを実施する。処理６０１に進んだ場合、まず、スレッド固有のルート集合（実行時スタック）にある参照を再帰的にたどって到達できる状態フィールド５０２の値がＬ（つまり１）のデータ構造のマークフィールド５０３に、順次１を記録する。この処理により当該スレッド固有のルート集合からたどれるデータ構造、即ち現在スレッドにより使用中と考えられるデータ構造が特定される。記録する作業が終わったら、処理６０２に進み、スレッド固有の割付け領域７０４の中にある全てのデータ構造を順次走査し、状態フィールド５０２の値が１でなおかつマークフィールドの値が０のデータ構造があったら空き領域にする。また、次のごみ集め時にステップ６０１を実行する準備のために状態フィールド５０２の値が１でなおかつマークフィールドの値が１のデータ構造があったらマークフィールド５０３の値を０にする。
【００２３】
図３に戻り、状態遷移回数３０３の計算方法について述べる。これには、図４の処理４０１で図５のデータ構造のヘッダに書き込んだ割付け文に固有の番号を使い、データ構造への参照を書き込む時点で状態の遷移が発生したら、状態遷移回数３０３を１加算する。
【００２４】
参照を書き込むコードの例を図８に示す。図８のコードではまず、判断８０１で書き込み先のデータ構造の状態フィールド５０２を参照し、状態がＬ、つまり１か検査する。状態がＬであれば処理８０２に進んで参照の書き込みを実施し、そうでないならば処理８０３、処理８０４で参照が指示するデータ構造の状態遷移を実施した上で処理８０２に進む。処理８０３では書き込む参照を起点として状態フィールド５０２の値がＬ（つまり１）のデータ構造だけをたどって到達しうる状態Ｌのデータ構造の集合を求め、集合中にある全データ構造の状態フィールド５０２の値をＳ（つまり０）に変更する。続いて処理８０４で集合中にある全データ構造について、割り付け元固有の番号を記録したフィールド５０１を参照し、対応する割付け文の状態遷移回数フィールド３０３に１を加算する。なお、処理８０４はプロファイル情報を生成するためだけに必要な処理であり、プロファイル情報を生成しない実行形式ファイル２０４では省略できる。
【００２５】
本実施例によれば、言語処理系により実行形式プログラムに、メモリ割付を実行するコード（図４）、参照の書き込みを実行するコード（図８）を埋め込んでおき、図６のごみ集め処理を実行することで、スレッド固有領域毎のごみ集めと、ヒープ領域全体のごみ集めとを使い分けることができ、ごみ集め処理時にスレッド全体を止める頻度を下げることでシステム性能を向上することができる。
【００２６】
次に、最適化処理を工夫することで、実行形式プログラムの実行時の、参照を書き込む処理でデータ構造の状態を変更するときの処理負荷を軽減する他の実施例（第二の実施例）を示す。
【００２７】
本実施例では、状態が遷移する確率が高いデータ構造に関しては、最適化処理時に図９で示す割付けコードを割り付ける。メモリ割付時に状態フィールド５０２の値を最初からＳにすることで、参照の書き込みを実行する時の負荷の軽減を図る。図９の割付けコードは状態フィールド５０２を初期化するときに「状態」フィールドに値Ｓ（０）を書き込む処理９０１を除いて、図４の割付けコードと同一である。
【００２８】
図１０に最適化の例を示す。図１０の処理は図２の最適化処理２０２の一部を示す。図１０の処理では、個々の割付け文について、まず、判断１００１でプロファイル情報２０９があるか調べ、あるならば処理１００２に進んでプロファイル情報２０９から状態遷移の発生する確率を求め、ないならば処理１００３に進んでフロー解析により状態が変化する確率を推論し、判断１００４に進む。ここで処理１００３におけるフロー解析による状態が変化する確率の推定とは、たとえば図１１のプログラムの１行目にある割付け文について、その直後にある文で割付けたデータ構造への参照を共有変数へ書き込んでいる、つまり状態がＬからＳに変化することを検知し、変化する確率が高い（この場合は１００％）と推定する作業を表す。続いて、判断１００４で変換する確率が高いか判断し、高いならば処理１００５に進み、割付け文のコードとしてデータ構造の初期状態をＳとする図９のコードを出力し、さもなければ処理１００６に進み、割付け文のコードとしてデータ構造の初期状態をＬとする図４のコードを出力する。
【００２９】
ここで、判断１００４での高いかの判断は、実行時の参照書き込み実行時のオーバヘッドと、ごみ集めによる停止時間を短縮する必要性との関係で決まる割合であり、一概には決まらないが、参照書き込み時に状態をＬからＳに遷移させるためには大きな負荷が生じうることから，簡単には０％を超えたら高いと判断してよい。
【００３０】
実行時の負荷を軽減する最適化の他の実施例（第三の実施例）として、参照を書き込むコードを工夫した例を示す。
【００３１】
コンパイル時にフロー解析を実施した結果、書き込む参照が指示するデータ構造の状態が必ずＳであると判った場合、あるいは書き込み先のデータ構造の状態が必ずＬであると判った場合には図１２に示す、判断８０１、処理８０３、処理８０４を省略したコードによって参照の書き込みを実施できる。たとえば図１１の３行目にある参照の書き込みについては、直前の２行目で同じ参照をクラス変数、つまり複数のスレッドが参照可能なデータ構造に書き込んでいることから、参照が指示するデータ構造の状態が２行目までに必ずＳになっていると判断できる。この結果として３行目の参照の書き込みには図１２に示す参照書き込みを実行するコードを使用する最適化を適用可能である。
【００３２】
また、フロー解析の結果、書き込み先のデータ構造の状態が必ずＳであると判った場合には、図１３に示す、図８に対して判断８０１を省略したコードによって参照の書き込みを実施できる。
【００３３】
図１４に、本実施例の最適化処理の流れを示す。図１４の最適化は図２の最適化処理２０２の一部である。まず、処理１４０１で、書き込む参照が指示するデータ構造の状態νと書き込み先のデータ構造の状態ιを求め、判断１４０２で「νが必ずＳ」あるいは「ιが必ずＬ」か調べ、そうであるならば処理１４０３に進み、参照を書き込むコードとして図１２のコードを出力する。さもなければ判断１４０４に進んでιが必ずＳか調べ、そうであるならば処理１４０５に進み、参照を書き込むコードとして図１３のコードを出力し、さもなければ処理１４０６に進んで図８のコードを出力する。以上に記載の最適化により、ごみ集め処理実施時の負荷を軽減できる。
【００３４】
なお、上記のいずれの実施例でもデータ構造の状態を、データ構造のヘッダに記録するビットとして表現しているが、これはデータ構造を配置する場所として表現することもできる。たとえば、割付けたスレッドのみが参照しうる状態Ｌのデータ構造を該スレッド固有の割り付け領域に配置し、複数のスレッドが参照しうる状態Ｓのデータ構造をスレッド間共有ヒープに配置する。この場合、状態Ｌから状態Ｓへの遷移はデータ構造をスレッド固有の割付け領域からスレッド間共有ヒープに移動することにより実現する。
【００３５】
また、上記の実施例ではクラス変数を含む全てのデータ構造が図５の形式をもち、ヘッダ部に状態ＬまたはＳが記載してあるものとしているが、クラス変数のように複数のスレッドから参照可能なデータ構造が自明なデータ構造については状態の記載を省略し、クラス変数へ参照を書きこむ際には必ず参照が指示するデータ構造の状態をＳに変更するような特例措置を設けることもできる。
【００３６】
なお、上記実施例適用前のシステムにおいてデータ構造のうち、割付けたスレッドのみが参照できるものの比率が５０％、参照を書き込むコストが実行負荷全体の０．１％を占め、かつ本発明により参照を書き込むコストが１０倍になると仮定するとき、プログラム実行時の実行速度が１％程度低下すると見積もれるが、従来技術の全域一括ごみ集めの発生頻度が半分程度になることで処理性能の向上が図れる。
【００３７】
【発明の効果】
本発明によれば、スレッドが単独で、つまり他のスレッドを止めることなく、一部のデータ構造について、ごみ集めを実施可能になり、ごみ集めのためにシステムが長期間停止する頻度を下げることができる。
【図面の簡単な説明】
【図１】実行機械のブロック構成を示す図。
【図２】言語処理系の構成例を示す図。
【図３】プロファイル情報を示す図。
【図４】メモリ割付けを実行するコード例（１）を示す図。
【図５】データ構造を示す図。
【図６】ごみ集めの処理を示す図。
【図７】プロセスが実施される状態を模式的に示す図。
【図８】参照の書き込みを実行するコード例（１）を示す図。
【図９】メモリ割付けを実行するコード例（２）を示す図。
【図１０】割付け文向け最適化処理を示す図。
【図１１】メモリ割付けと参照の書き込みをおこなうソースコードの例を示す図。
【図１２】参照の書き込みを実行するコード例（２）を示す図。
【図１３】参照の書き込みを実行するコード例（３）を示す図。
【図１４】参照の書き込みを実施するコード向け最適化処理を示す図。
【符号の説明】
１０１…プロセッサ、１０２…主記憶、１０３…バス、１０４…ディスク装置、１０５…ＣＤ−ＲＯＭ読み取り装置、１０６…ＣＤ−ＲＯＭ。
【図１】
2004287870.tif 000003
【図２】
2004287870.tif 000004
【図３】
2004287870.tif 000005
【図４】
2004287870.tif 000006
【図５】
2004287870.tif 000007
【図６】
2004287870.tif 000008
【図７】
2004287870.tif 000009
【図８】
2004287870.tif 000010
【図９】
2004287870.tif 000011
【図１０】
2004287870.tif 000012
【図１１】
2004287870.tif 000013
【図１２】
2004287870.tif 000014
【図１３】
2004287870.tif 000015
【図１４】
2004287870.tif 000016