JP2008257594A - 情報処理装置および情報処理方法 - Google Patents

情報処理装置および情報処理方法 Download PDF

Info

Publication number
JP2008257594A
JP2008257594A JP2007100989A JP2007100989A JP2008257594A JP 2008257594 A JP2008257594 A JP 2008257594A JP 2007100989 A JP2007100989 A JP 2007100989A JP 2007100989 A JP2007100989 A JP 2007100989A JP 2008257594 A JP2008257594 A JP 2008257594A
Authority
JP
Japan
Prior art keywords
lock
group
information processing
processing apparatus
exclusive control
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
Application number
JP2007100989A
Other languages
English (en)
Inventor
Motoki Obata
元樹 小幡
Hiroyasu Nishiyama
博泰 西山
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2007100989A priority Critical patent/JP2008257594A/ja
Publication of JP2008257594A publication Critical patent/JP2008257594A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

【課題】効率的に排他制御を行うことができるようにする。
【解決手段】マルチスレッドで動作するアプリケーションプログラムを実行する情報処理装置が、アプリケーションプログラムに含まれる、第1の排他制御用リソースに対してロックを取得してから解除するまでのプログラムである複数のクリティカルセクションを特定し、特定した各クリティカルセクションを実行した場合に読み書きしうる記憶領域である使用領域を特定し、使用領域の少なくとも一部が重なるクリティカルセクションをグループ化し、第1の排他制御用リソースに対するロックに代えて、グループごとに異なる第2の排他制御用リソースに対して前記クリティカルセクションがロックを取得するようにする。
【選択図】図1

Description

本発明は、情報処理装置および情報処理方法に関する。
マルチスレッドで実行中のプログラムにおいて、複数のスレッド間で共有する共有データに対する読み書き(定義および参照)を排他的に行うことがある。これは、あるスレッドから共有データへの書き込み(定義)が行われている間に、他のスレッドからその共有データを参照すると、タイミングによっては想定外のデータの組み合わせが生じて、誤動作が発生する可能性があるためである。
オブジェクト内のデータへのアクセスを排他的に行うため、例えばC言語でのPOSIX(Portable Operating System Interface)規格に定義されるPスレッド (非特許文献1)や、Java(登録商標)言語でのsynchronized修飾子などが知られている。
synchronized修飾子はメソッド全体を排他制御するために用いられる。synchronized修飾子が記述されたメソッドはsynchronizedメソッドとも呼ばれる。典型的には、各インスタンスオブジェクトに排他制御を行うためのロック用のリソース(以下、ロックリソースという。)が1つ付帯されており、synchronizedメソッドでは、メソッドの所属するクラスオブジェクトまたはインスタンスオブジェクトに付帯されるロックリソースに対するロックを取得することによって排他制御を実現する。
例えば、クラスAに2つのsynchronizedメソッドMs1、Ms2があり、これらのメソッドからフィールドdにアクセスする場合について考える。クラスAのインスタンスオブジェクトobjAが生成されており、スレッドT1がobjAのメソッドMs1を呼び出す場合、スレッドT1は、メソッドMs1の呼び出し直前にobjAに付帯されるロックリソースに対するロックを取得し、フィールドdにアクセスし、その後objAのロックリソースに対するロックを解除する。スレッドT2が、objAのメソッドMs2を実行する場合も同様であり、objAのロックリソースに対するロックの取得および解除を行う。ここで、スレッドT1とT2とがobjAを用いてほぼ同時にメソッドMs1、Ms2を実行しようとした場合、objAに付帯されるロックリソースへのロックを互いに取得しようとする。先にT1がロックを取得できた場合、T2はT1がロックを解除するまで待ち状態となる。逆に、T2が先にロックを取得できた場合は、T1が待ち状態となる。つまり、objAのロック用リソースに対するロックを要求するsynchronizedメソッドMs1、Ms2は絶対に同時に実行されることはなく、objAのフィールドdに対する排他的なアクセスが実現される。なお、synchronizedメソッドMs1やMs2のように、排他制御が適用されるプログラム区間は、クリティカルセクションと呼ばれる。
ロックリソースに対するロックの取得および解除に係る処理は、一般的にオーバヘッドが大きく、各種の最適化手法(非特許文献2〜5)が考案されてきた。例えば、上述のobjAに対するロック取得および解除の例は、複数スレッドが1つのロックリソースに対するロックを取得しあう競合状態の例である。しかし、一般的なプログラムでは、ロック競合の発生は少なく、発生するとしても、ロック競合がなるべく少なくなるように、プログラムが作成されていることが多い。そこで、Meta−Lock手法(非特許文献2)や、Thin−Lock手法(非特許文献3)のように、競合状態が少ないことを利用して、オーバヘッドを減らす手法が研究されている。
例えばThin−Lock手法では、図25に示すようなコードによって、オブジェクトに付帯されるロックリソースにスレッドID、ネストロック回数、識別ビットなどを書き込み、ロックを取得する。なお、図25に示すコードは、実行ファイルの一部として生成されるコードを説明するための擬似コードであり、各行左側の数値は行番号である。
図25に示すコードは、ロック用リソースが8バイト幅である場合の例であり、3行目において、8バイトのlocked_wordとして初期のロック状態を生成し、9行目でロックリソースに対してアトミック(atomic)命令「cmpxchg8」によるlocked_wordの書き込みを試行する。アトミック命令とは、読み込み、比較、書き込みの一連の動作を不可分に(アトミックに)行うよう指示するコマンドである。アトミック命令cmpxchg8(compare&exchange 8 byte)は第1引数のアドレス(ロック用リソースのアドレス &object->lock_part)が示すメモリから8バイトの部分の内容を第2引数(unlocked_word)の内容と比較し、等しければ第3引数(locked_word)の内容を第1引数のアドレスで示されるメモリに書き込む命令である。cmpxchg8のようなアトミック命令は、一般的なCPUでサポートされており、8バイトの以外にも2バイト、4バイト、16バイト幅でデータにアトミックにアクセスする命令をサポートしていることが多い。
1つのスレッドから複数回ロックが取得された場合、すなわちロックがネストした場合には、ロックリソースのネストロック回数を増やす。複数のスレッドが同一のロックリソースに対するロックを取得しあうロック競合が発生した場合は、12行目に入りThin−Lock手法によるロックの取得処理に代えて、重量ロックと呼ばれる異なるロック処理(非特許文献2、3参照。)を行う。Thin−Lock手法は非競合状態におけるロックの取得および解除を行うための手法であるため、ロックの競合が生じる場合には、効率が低下するからである。この場合、ロックリソースには重量ロックに必要な専用データ構造のIDを書き込み、識別ビットを立てる。クリティカルセクション終了時は、図25の18行目以降を実行して、ロックリソースに対するロックを解除する。まず、23行目でオブジェクトのロックリソースの識別ビットをチェックし、競合時の専用データ構造のIDを持っている場合はその構造を用いたロックの解除処理(24行目)を行い、そうでない場合は28行目でロックリソースを0に書き換えることでロックの解除処理を行う。なお、ネストしたロックを解除する場合はロックリソースのネスト回数を1減らす。
また、Lock Reservation手法(非特許文献4)のように、クリティカルセクションでのロック競合が発生する可能性が生じるまでは、ロックリソースに対するロックの取得および解除を行わないように回避する手法や、プログラムにおいてアクセスするデータについて、他スレッドへの露出の有無を調べるEscape解析(非特許文献5)という手法を用い、クリティカルセクション内でアクセスする全データが露出しない場合は、クリティカルセクションの指定自体を削除するという手法も開発されている。
ビル・ルイス、ダニエル・バーグ、「Pスレッドプログラミング」、ピアソン・エデュケーション、1999年 Ole Agesen (他4名), "An Efficient Meta-lock for Implementing Ubiquitous Synchronization", In proceedings of the 14th Annual ACM Conference on Object-Oriented Programming, Systems, Languages, and Applications, 1999 David F. Bacon (他3名), "Thin Locks: Featherweight Synchronization for Java", In proceedings of the ACM Conference on Programming Language Design and Implementation, ACM SIGPLAN Notices Vol.33, No.6, 1998 Kiyokuni Kawachiya (他2名), "Lock Reservation: Java Locks Can Mostly Do Without Atomic Operations", In proceedings of the 17th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications, 2002 B. Branchet, "Escape Analysis for Java: Theory and Practice", In ACM Transactions on Programming Language and Systems, vol.25, No.6, 2003
排他制御を行うために、複数のクリティカルセクションから同一のロックリソースに対するロックを取得する処理が行われる場合であっても、各クリティカルセクションから読み書きされる記憶領域が異なる場合には、排他制御を行うことなく並行してそれらのクリティカルセクションを実行したとしても不具合は生じない。
しかしながら、排他制御を行うプログラムでは、例えば、同一のクラスの複数のメソッドに対してsynchronized修飾子を設定するなど、多数のクリティカルセクションから同一のロックリソースに対してロックを取得するような記述がなされていることが多い。
本発明は、このような背景を鑑みてなされたものであり、効率的に排他制御を行うことのできる情報処理装置および情報処理方法を提供することを目的とする。
上記課題を解決するための本発明の主たる発明は、ママルチスレッドで動作するアプリケーションプログラムを実行する情報処理装置であって、前記アプリケーションプログラムに含まれる、第1の排他制御用リソースに対してロックを取得してから前記ロックを解除するまでのプログラムである複数のクリティカルセクションを抽出するクリティカルセクション抽出部と、抽出した各前記クリティカルセクションを実行した場合に読み書きしうる記憶領域である使用領域を決定する使用領域決定部と、前記使用領域の少なくとも一部が重なる前記クリティカルセクションをグループ化するグループ処理部と、前記第1の排他制御用リソースに対するロックに代えて、前記グループごとに異なる第2の排他制御用リソースに対して前記クリティカルセクションがロックを取得するようにする最適化処理部とを備えることとする。
本発明によれば、効率的に排他制御を行うことができる。
以下、本発明の一実施形態に係る情報処理装置10について説明する。本実施形態の情報処理装置10ではJava(登録商標)プログラムを実行するための仮想マシンが実行される。仮想マシンでは、ユーザが作成したJava(登録商標)言語により記述されるアプリケーションプログラム(以下、ユーザプログラムという。)が実行される。本実施形態の仮想マシンは、ユーザプログラムのインタプリタとして機能するが、実行頻度の高いメソッドについては、情報処理装置10におけるネイティブ形式の実行ファイルを生成する、いわゆるJIT(Just In Time)コンパイル処理を行う。
ユーザプログラムは、マルチスレッドで動作し、複数のスレッドから同一の共有リソースを読み書きすることが可能である。共有リソースとは、例えば、構造化言語における変数や、オブジェクト指向言語におけるオブジェクトのメンバフィールドにより示される記憶領域である。共有リソースに対するアクセス時には、一般的に排他制御が行われる。Java(登録商標)言語では、排他制御を行う命令としてメソッドに対するsynchronized修飾子が定義されている。メソッドにsynchronized修飾子が指定された場合、仮想マシンは、メソッドの開始時にそのメソッドが所属するオブジェクトに対するロックを取得し、メソッドの終了時にそのロックを解除することで排他制御を行う。すなわち、メソッド全体が排他制御の対象となる、いわゆるクリティカルセクションと呼ばれる部分となる。
本実施形態の情報処理装置10では、JITコンパイルを行う際に、synchronized修飾子が指定されたメソッドをグループ化し、グループごとに異なる排他制御を行うようにすることで、スレッドがロックの解除待ちとなる時間を短縮し、スレッドの動作の並行性を高めている。
図1は、本実施形態に係る情報処理装置10のハードウェア構成を示す図である。同図に示すように、情報処理装置10は、CPU101、メモリ102、記憶装置103、入力装置104、出力装置105を備えている。記憶装置103は、各種のプログラムやデータを記憶する、例えばハードディスクドライブやCD−ROMドライブ、フラッシュメモリなどである。CPU101は、記憶装置103に記憶されているプログラムを実行することにより、各種の機能を実現する。入力装置104は、データの入力を受け付ける、例えばキーボードやマウス、トラックボール、タッチパネルなどである。出力装置105は、データを出力する、例えばディスプレイやプリンタなどである。
図2は情報処理装置10のソフトウェア構成を示す図である。同図に示すように、情報処理装置10は、仮想マシン11、プログラム記憶部15、実行プロファイル記憶部16および実行ファイル記憶部17を備えている。また、仮想マシン11は、プログラムローダ111、インタプリタ112およびJITコンパイラ12を含んでおり、JITコンパイラ12は、プログラム解析部121、コード生成部122およびコンパイル処理部123を含んでいる。なお、仮想マシン11は、記憶装置103に記憶されている仮想マシン用のアプリケーションプログラムを、CPU101がメモリ102に読み出して実行することにより実現される。
プログラム記憶部15は、ユーザプログラムを記憶する。プログラム記憶部15は、例えば、情報処理装置10で実行されるオペレーティングシステム上のファイルシステムにおけるディレクトリなど、記憶装置103が提供する記憶領域として実現される。
プログラム記憶部15に記憶されるユーザプログラムの一例を図3に示す。なお、プログラム記憶部15に記憶されるユーザプログラムは、バイトコードと呼ばれる仮想マシン11が実行しやすい形式に予めコンパイルするのが一般的であるが、本実施形態では、簡単のため、図3に示すような可読性の高いプログラムがプログラム記憶部15に記憶されているものとする。
図3の例において、Exampleクラスは、9つのメソッド151〜156を有しており、各メソッドにはsynchronized修飾子が指定されている。また、Exampleクラスは3つのフィールド157を有しており、これらのフィールド157はすべてprivate属性となっている。synchronized修飾子が指定されたメソッドが実行される場合には、上述したように排他制御が行われる。すなわち、クラスExampleのインスタンスオブジェクトが生成されて、synchronized修飾子が指定されたメソッドが実行される場合、そのメソッドの処理が終了するまでインスタンスオブジェクトはロックされる。
各インスタンスオブジェクトのヘッダ部分には、排他制御用のリソース(以下、ロックリソースという。)として、64ビットの領域が確保されており、このロックリソースに対してロックを取得したスレッドのみが、メソッドの処理が終了するまでの間、インスタンスオブジェクトのフィールドにアクセスできる。なお、本実施形態では、ロックリソースに対してThin−Lock方式によりロックを取得するものとする。
本実施形態におけるインスタンスオブジェクトの構成例を図4に示す。同図に示すように、本実施形態の仮想マシン11では、インスタンスオブジェクト40は、ヘッダ部分にマーク(mark)ヘッダ41、クラス(klass)ヘッダ42、およびロック(lock)ヘッダ43を備えており、データサイズはいずれも1ワードである。なお、本実施形態では、1ワードは64ビットであるものとする。
マークヘッダ41は、例えば、ガベージコレクション処理におけるコピー回数やインスタンスオブジェクトのハッシュ値などの各種の値を含む。クラスヘッダ42は、インスタンスオブジェクトが所属するクラスを示す。ロックヘッダ43は、排他制御を行うためのロックリソースであり、ロックを取得しているスレッドの識別子(スレッドID)などが含まれる。なお、一般的なJava(登録商標)の仮想マシンでは、マークヘッダ41がロックヘッダ43の役割を兼ねることがある。
一般的なJava(登録商標)の仮想マシンでは、ロックヘッダ43の全体に対してロックが取得され、ロックヘッダ43には、ロックを取得したスレッドのスレッドIDなどが1セット格納されることになる。すなわち、一般的なJava(登録商標)の仮想マシンでは、第1スレッドにおいて、あるインスタンスオブジェクトのsetter_F1メソッドを実行し、第2スレッドにおいて、同時に同一のインスタンスオブジェクトのgetter_F3メソッドを実行する場合、同一のロックヘッダ43に対してロックの取得処理が行われ、ロックを先に取得できた方のスレッドのみが上記メソッドを実行することが可能となり、他方のスレッドは、ロックリソースに対するロックが解除されるまで待ち状態となる。
これに対し、本実施形態の仮想マシン11では、ロックヘッダ43を16ビットずつの4つの部分ロックヘッダに分割し、後述するように、1つのインスタンスオブジェクトに対して4つのスレッドが並行してロックを取得するようにしている。つまり、4つのメソッドがそれぞれ独立したロックリソースに対してロックを取得することができるようにしている。これにより、ロックの待ち時間を低減し、効率的にメソッドを実行することを可能としている。なお、ロックの取得処理の詳細については後述する。
部分ロックヘッダ431〜434はそれぞれ、スレッドID501、ネスト回数502、および識別ビット503が含まれており、これはThin−Lockとして知られる手法に用いられる構成である。Thin−Lock手法では、ロックを取得したるスレッドのスレッドIDをスレッドID501に設定する。同一のスレッドから複数のロックが取得された場合(ロックがネストした場合)には、ネスト回数502がインクリメントされ、ロックの解除命令に応じてネスト回数502がデクリメントされ、ネスト回数502が「0」である場合に、ロック解除処理を行うときは、スレッドID501を0とすることによってロックが解除されることになる。識別ビット503は、Thin−Lock手法においてロックの競合が発生する場合に用いられるフラグ値である。
プログラムローダ111(本発明のクリティカルセクション抽出部に該当する。)は、プログラム記憶部15に記憶されているユーザプログラムをメモリ102に読み出す。また、本実施形態においてプログラムローダ111は、ユーザプログラムからクラスごとに、クリティカルセクションを抽出する処理も行うものとする。
インタプリタ112は、プログラムローダ111が読み出したユーザプログラムを実行する。また、インタプリタ112は、ユーザプログラムの実行時に、ユーザプログラムに含まれる各クラスについて、フィールドごとに読み書きされた回数をカウントし、メソッドごとに呼び出された回数をカウントする。インタプリタ112は、カウントしたフィールドごとのアクセス回数や、メソッドごとの呼出し回数を含む、ユーザプログラムの実行に係る統計情報(以下、実行プロファイル情報という。)を実行プロファイル記憶部16に登録する。
実行プロファイル記憶部16に記憶される実行プロファイル情報の構成例を図5に示す。同図に示すように、実行プロファイル情報には、メソッド統計161およびフィールド統計162が含まれる。メソッド統計161には、メソッド名に対応付けて、メソッドの呼出し回数が記憶される。メソッド名には、クラス名が含まれ、インタプリタ112が実行したユーザプログラムに含まれるすべてのクラスのすべてのメソッドについて、呼出し回数が記憶される。フィールド統計162には、フィールド名に対応づけて、フィールドに対して読み書きされた回数(アクセス回数)が記憶される。フィールド名には、クラス名が含まれ、インタプリタ112が実行したユーザプログラムに含まれるすべてのクラスのすべてのフィールドについて、アクセス回数が記憶される。なお、メソッド統計161およびフィールド統計162には、所定のクラスについてのみ、メソッドの呼出回数やフィールドのアクセス回数が登録されるようにしてもよい。
JITコンパイラ12は、インタプリタ112が実行しているユーザプログラムを、情報処理装置10のネイティブ形式に変換する。本実施形態では、JITコンパイラ12は、メソッドの呼出回数が所定数を超えた場合に、そのメソッドを含むクラスのみをネイティブ形式に変換する処理を行う。メソッドの呼出回数は、実行プロファイル記憶部16に記憶されるメソッド統計161に記憶されている。なお、本実施形態では、JITコンパイラ12は、Java(登録商標)言語で記述されたクラスに基づいて、直接ネイティブ形式の実行ファイルを生成するものとする。
JITコンパイラ12に含まれるプログラム解析部121(本発明の使用領域決定部に該当する。)は、Java(登録商標)言語で記述されたクラスを解析し、コンパイル対象となるクラスのメソッドから呼び出される他のメソッドを示す情報(以下、メソッド呼出情報という。)と、メソッドからアクセスされる1または複数のフィールド(以下、アクセスフィールドという。本実施形態の使用領域に対応する。)に関する情報(以下、データフロー情報という。)とを生成する。
プログラム解析部121が生成するメソッド呼出情報20の構成例を図6に示す。なお、図6の例は、図3に示すExampleクラスを解析した結果例である。図6に示すように、メソッド呼出情報20には、メソッド名201および呼出メソッド202が含まれている。メソッド名201は、メソッドの名称であり、呼出メソッド202は、そのメソッドから呼び出される他のメソッドの名称のリストである。図6の例では、Exampleクラスのcall_otherメソッドから、OtherClassクラスのother_methodメソッドが呼び出されていることが示されている。
プログラム解析部121が生成するデータフロー情報21の構成例を図7に示す。なお、図7の例についても、図3に示すExampleクラスを解析した結果例である。図7に示すように、データフロー情報21には、メソッド名211および処理内容212が含まれている。メソッド名211には、メソッドを名称が設定され、処理内容212には、そのメソッドにおいてフィールドに対する書き込み(定義)や、フィールドからの読み出し(参照)が行われるコードの記述位置が設定される。
コード生成部122(本実施形態のグループ処理部および最適化処理部に対応する。)は、メソッド呼出情報20およびデータフロー情報21、並びに実行プロファイル記憶部16に記憶されている情報に基づいて実行ファイルを生成する。コード生成部122は、生成した実行ファイルを実行ファイル記憶部17に記憶する。実行ファイル記憶部17は、例えば、ファイルシステムにおけるディレクトリなどの、メモリ102や記憶装置103が提供する記憶領域として実現される。
以下、JITコンパイラ12の処理について説明する。図8は、JITコンパイラ12による処理の流れを示す図である。なお、上述したように、JITコンパイラ12は、実行プロファイル記憶部16に記憶されているメソッド統計161において、呼出回数が所定数を超えた場合に起動される。
プログラム解析部121は、呼出回数が所定数を超えたメソッドが所属するクラス(以下、所属クラスという。)のコードをプログラム記憶部15から読み出し(S301)、読み出したコードを解析してメソッド呼出情報20およびデータフロー情報21を生成する(S302)。
コード生成部122は、所属クラスに含まれるメソッドのグループ化処理を行う(S303)。メソッドのグループ化処理の流れを図9に示す。
コード生成部122は、所属クラスの各メソッドについて以下の処理を行う。
コード生成部122は、メソッドの修飾子として「synchronized」が指定されている場合(S321:YES)、メソッドに対応するメソッド呼出情報20の呼出メソッド202に他のメソッドが含まれていなければ(S322:YES)、メソッドに対応するデータフロー情報21の処理内容212から、フィールド名を重複なく抽出してアクセスフィールドとする(S323)。一方、呼出メソッド202に他のメソッドが含まれている場合には(S322:NO)、コード生成部122は、所属クラスに含まれるすべてのフィールドのフィールド名をアクセスフィールドとする(S324)。
コード生成部122は、メソッド名とアクセスフィールドとを対応付けて、作業用のリストであるグループリスト22に登録する(S325)。グループリスト22の構成例を図10に示す。同図に示すように、グループリスト22には、メソッド名に対応付けて、アクセスフィールドおよびグループが登録される。グループは、メソッドが所属するグループを示す情報(以下、グループIDという。)であるが、上記(S324)の段階では、グループには値は設定されないものとする。
コード生成部122は、以上の処理を繰り返して、グループリスト22を生成すると、次に図11に示す作業リスト23の生成処理を行う(S326)。コード生成部122は、グループリスト22に登録されている各レコードについて、アクセスフィールドが所属クラスの全フィールドではなく(S341:NO)、アクセスフィールドが「private」フィールドであり、かつ作業リスト23にアクセスフィールドが登録されていない場合には(S342:NO)、レコードのアクセスフィールドを作業リスト23に登録する(S343)。
以上の処理により生成される作業リスト23の一例を図12に示す。図12に示すように、作業リスト23には、グループリスト22から重複なくアクセスフィールドを読み出したリストから、さらに所属クラスの全フィールドを含むアクセスフィールドを除いたものになる。
コード生成部122は、以上の処理により作業リスト23を生成した後、図13に示す、グループ化のためのアクセスフィールドリスト24の生成処理を行う(S327)。
コード生成部122は、作業リスト23に登録されている各アクセスフィールドについて、当該アクセスフィールドの少なくとも一部と重なる他のアクセスフィールドをアクセスフィールドリスト24から検索する(S361)。例えば、「f1」のアクセスフィールドがアクセスフィールドリスト24に既に登録されている場合、「f1,f2」のアクセスフィールドは、「f1」と一部と重なると判断される。上記他のアクセスフィールドがなければ(S362:NO)、当該アクセスフィールドをアクセスフィールドリスト24に登録する(S363)。
以上の処理により生成されるアクセスフィールドリスト24の一例を図14に示す。図14に示すように、アクセスフィールドリスト24に登録されている各アクセスフィールドは、他のアクセスフィールドと重なるフィールドを含んでいないことになる。
コード生成部122は、以上のようにしてアクセスフィールドリスト24を生成した後、グループIDを「0」として(S328)、アクセスフィールドリスト24に含まれる各アクセスフィールドについて、グループIDをインクリメントし(S329)、アクセスフィールドに一致するグループリスト22のレコードにグループIDを設定する(S330)。
コード生成部122は、グループリスト22に含まれるレコードのうちグループが設定されていないものには、「ALL」を設定する(S331)。
以上のようにして、図10に示すようなグループリスト22が生成される。なお、グループIDが数値であるグループが本発明の第1のグループに該当し、グループIDが「ALL」であるグループが本発明の第2のグループに該当する。
上記の処理を、図3に示したExampleクラスに適用した場合には、以下のようになる。図9の(S321)〜(S325)の処理により、setter_F1メソッドおよびgetter_F1メソッドのアクセスフィールドはf1であり、setter_F2メソッドおよびgetter_F2メソッドのアクセスフィールドはf2であり、setter_F3メソッドおよびgetter_F3メソッドのアクセスフィールドはf3である。また、setter_F1F2メソッドのアクセスフィールドはf1およびf2であり、setter_allメソッドのアクセスフィールドはf1、f2およびf3である。call_otherメソッドは、他のメソッド(OtherClass.other_method)を呼び出しているため(S324:NO)、アクセスフィールドとしてExampleクラスのすべてのフィールドであるf1、f2およびf3が設定される。
図11に示す作業リスト23の生成処理により、Exampleクラスの全フィールドを含む「f1,f2,f3」を除く、「f1」、「f2」、「f3」および「f1,f2」という4つのアクセスフィールドが登録された作業リスト23が生成される。
図13に示すアクセスフィールドリスト24の生成処理では、「f1」と一部が重なる「f1,f2」はアクセスフィールドリスト24に登録されず(S362:YES)、図14の例のように、「f1」「f2」および「f3」がアクセスフィールドリスト24に登録された状態となる。
次に、図9の(S329)〜(S330)では、「f1」に対応するsetter_F1メソッドおよびgetter_F1メソッドのグループリスト22のグループに「1」が設定され、「f2」に対応するsetter_F2メソッドおよびgetter_F2メソッドのグループに「2」が設定され、「f3」に対応するsetter_F3メソッドおよびgetter_F3メソッドのグループに「3」が設定される。
最後に、(S331)において、グループに値が設定されなかったsetter_F1F2メソッド、setter_allメソッド、およびcall_otherメソッドのそれぞれに対応するグループに「ALL」が設定される。
コード生成部122は、上記のようにしてグループ化処理を行った後、所属クラスのコードに基づいてネイティブ形式の実行ファイルを生成する(S304)。なお、コード生成部122によるコードの生成処理には、排他処理を行うsynchronizedメソッド以外の部分については、一般的なJITコンパイラに用いられている手法を用いることができる。synchronizedメソッドに係るコードの生成処理の流れを図15に示す。
コード生成部122は、メソッドに「synchronized」修飾子が付いている場合(S381:YES)、メソッド名に対応するグループをグループリスト22から取得する(S382)。
コード生成部122は、取得したグループが「ALL」であった場合には(S383:YES)、すべての部分ロックヘッダ431〜434に対するロックを取得するためのコードを出力する(S384)。本実施形態では、コード生成部122は、部分ロックヘッダ431〜434のすべてに対して同時に読み込み、比較および書き込みを行うアトミック命令cmpxchg8を出力するものとする。
ステップS384においてコード生成部122が出力する、すべての部分ロックヘッダに対するロックを取得するコードを擬似コードで表現した例を図16に示す。図16に示すコードが、図25に示す従来のThin−Lock手法のコードと異なるのは、ロックヘッダ43に書き込む値が1つのロック状態(スレッドID、ネスト回数および識別ビット)に代えて、4つのロック状態の論理和とした点である。図16に示すように、スレッドID、ネスト回数および識別ビットを設定したper_lock_word変数を、インスタンスオブジェクトのヘッダ部分の64ビットのロックヘッダ43に含まれる4つの部分ロックヘッダ431〜434のすべてに対して設定するための64ビットのデータlocked_wordを生成し(411)、アトミック命令(412)によりロックヘッダ43に書き込むようにしている。
一方、グループが「ALL」でない場合(S383:NO)、コード生成部122は、グループ(1〜4)番目の部分ロックヘッダ431〜434に対するロックを取得するためのコードを出力する(S385)。本実施形態では、コード生成部122は、部分ロックヘッダ431〜434のいずれかに対してアトミックに書き込みを行う、16ビット(2バイト)幅のアトミック命令chpxchg2を出力するものとする。
ステップS385においてコード生成部122が出力する、部分ロックヘッダに対するロックを取得するコードを擬似コードで表現した例を図17に示す。図17に示すコードでは、図16に示すコードと異なり、ロックを取得するコード421として、64ビット幅のアトミック命令cmpxchg8に代えて、16ビット幅のアトミック命令cmpxchg2を出力している(422)。また、部分ロックヘッダ431に設定するデータは、per_lock_wordに代えて、locked_wordになっている(423)。
図17に示すコードを実行した場合、部分ロックヘッダ431に対するロックを取得しようとする同一グループのメソッド(図10の例では、setter_F1およびgetter_F1の2つである。)は、排他的に実行される。しかし、グループが異なるメソッドは、異なる部分ロックヘッダに対してロックを取得しようとするため、同時に実行が可能である。例えば、グループ「2」に所属するsetter_F2は、部分ロックヘッダ432に対してロックを取得する。したがって、setter_F1が部分ロックヘッダ431に対するロックを取得していたとしても、setter_F2は、部分ロックヘッダ432のロックを取得することができる。よって、setter_F1とsetter_F2とは、同時に実行可能となる。
一方、グループ「ALL」に所属するメソッド(例えば、setter_allなどである。)については、図16に示すコード実行され、部分ロックヘッダ431〜434のすべてに対するロックを取得することになる。したがって、グループ「1」に所属するsetter_F1が部分ロックヘッダ431のロックを取得している間は、グループ「ALL」に所属するsetter_allはロックを取得することができず、排他制御されることになる。
以上説明したように、本実施形態の情報処理装置10によれば、同一のロックヘッダ43に対してロックを取得する複数のメソッドを、フィールドが一部重なるアクセスフィールドごとにグループ化し、グループごとに異なる部分ロックヘッダ431〜434に対してロックを取得するようにすることができる。つまり、異なるグループに属するメソッドから同じフィールドにアクセスすることがないので、異なるグループに属するメソッド間での排他制御を行わないようにすることができる。これにより、ロックの競合の発生を低減し、効率的にユーザプログラムを実行することができる。
その一方で、アクセスフィールドが、他のグループに属するメソッドのアクセスフィールドと必ず重なるメソッド、すなわち、所属クラスのすべてのフィールドをアクセスフィールドとするメソッドについては、部分ロックヘッダ431〜434のすべてに対してロックを取得するようにしているので、実行排他性を保ち、実行結果の安全性を確保することができる。
また、あるメソッドが他のメソッドを呼び出している場合に、そのメソッドについてのアクセスフィールドを判定するためには、呼出し先のメソッドについても解析を行う必要があるが、本実施形態の情報処理装置10では、他のメソッドを呼び出すメソッドについては、所属クラスのすべてのフィールドがアクセスフィールドであるものとして処理を行っている。したがって、解析処理に係る時間を軽減し、迅速にネイティブ形式の実行ファイルを生成することができる。
なお、本実施形態では、部分ロックヘッダ431〜434は、既存のロックヘッダ43を分割するものとしたが、ロックヘッダ43と同じ大きさのフィールドをヘッダ部分に追加するようにしてもよい。この場合のインスタンスオブジェクトの構成例を図18に示す。同図の例では、部分ロックヘッダ431〜434が、64ビット幅でヘッダ部分に確保されている。
ここで、CPU101が複数ワードに対するアトミック命令をサポートしていない場合には、例えば、ヘッダ内にロック用のフラグを格納する管理領域を設け、ロックリソースにアクセスを行っている間は管理領域にフラグ値を格納したり、部分ロックヘッダ431〜434のそれぞれに対して、すべてのロック処理において常に一定の順序でロックを得るようにすることにより対応することができる。
この場合、ロックリソースとして1ワードのデータ長を用いることができるので、ロックの取得に際してポインタ値を書き込むMeta−Lock手法のような既存のロック手法を適用することが容易になる。
また、例えば、インスタンスオブジェクトのヘッダ部分に格納されるロックヘッダ43のデータサイズが固定長であるような場合には、グループの数を制限する必要があり、このような場合には、上述したメソッドのグループ化処理において、生成するグループの数を制限するようにしてもよい。この場合、上述の図13に示すアクセスフィールドリスト24の生成処理において、アクセスフィールドリスト24に登録されるアクセスフィールドの数を所定数以下に制限するようにする。図19は、グループ数を所定数以下に制限する場合のアクセスフィールドリスト24の生成処理の流れを示す図である。同図に示すように、コード生成部122は、図13のステップS363の処理の後に、アクセスフィールドリスト24の登録数が部分ロックヘッダの数(本実施形態では「4」である。)を超えていれば(S501:YES)処理を終了するようにしている。これにより、アクセスフィールドの数を部分ロックヘッダの数以下に制限することが可能となる。したがって、図9のステップS329〜ステップS330において各メソッドに対して付与するグループIDの数を制限することができる。
また、グループ数を制限することにより、例えばロックヘッダ43の大きさが固定長として規定されている場合や、ヒープメモリの空き容量が少ない場合などにも、これらの制約を満たすようにすることができる。
例えば、本実施形態の場合でも、インスタンスオブジェクトのヘッダ部分が固定長であり、ロックリソースは、部分ロックヘッダ431〜434の4つのみである場合には、「ALL」を除くグループは4つまでに制限する必要があるが、上記の処理により4つ以下のグループを生成するようにすることができる。
グループの数を制限する場合、アクセスフィールドの優先順位を決定し、優先順位の順に所定数のグループを生成するようにしてもよい。優先度は、アクセスフィールド(フィールドの組み合わせ)へのアクセス頻度に応じて決定する。アクセスフィールドへのアクセス頻度は、(1)グループリスト22からアクセスフィールドに対応するメソッドの数をカウントし、(2)実行プロファイル記憶部16に記憶されているフィールド統計162のアクセス回数に基づいて算出し、(3)データフロー情報21の処理内容にアクセスフィールドに含まれるすべてのフィールドが含まれている場合に、処理内容に含まれる各フィールドが定義または参照された回数に基づいて算出し、あるいは(4)プログラム記憶部15に記憶されているユーザプログラム中の同一メソッド内において、アクセスフィールドに含まれている各フィールドが記述されている回数に基づいて算出することにより、求めることができる。
優先順位順にグループ数を制限する場合のアクセスフィールドリスト24の生成処理を図20に示す。同図に示すように、この場合は、図19の処理の前に、コード生成部122は、作業リスト23に含まれている各アクセスフィールドについて、(1)グループリスト22からアクセスフィールドに対応するメソッドの数をカウントして優先度とし、(2)アクセスフィールドに含まれる各フィールドに対応する実行プロファイル記憶部16のフィールド統計162のアクセス回数を集計して優先度とし、(3)アクセスフィールドに含まれるすべてのフィールドがデータフロー情報21の処理内容に含まれている場合には処理内容において各フィールドが定義または参照された回数を集計して優先度とし、すべてのフィールドが含まれていない場合には優先度を「0」とし、あるいは(4)プログラム記憶部15に記憶されているユーザプログラムを走査して、同一のメソッド内においてアクセスフィールドに含まれるすべてのフィールドが記述されている場合には、フィールドの記述数を集計して優先度とし、すべてのフィールドが記述されていない場合には優先度を「0」として、優先度を決定する(S521)。コード生成部122は、優先度順に作業用リストをソートする(S522)。
以上のようにして、優先度の高いアクセスフィールドから順に、他のアクセスフィールドと重ならないものをアクセスフィールドリスト24に登録することができる。例えば、作業リスト23に「f1,f2」「f1」「f2」の集合が登録されており、部分ロックヘッダが2つのみであったと仮定した場合に、(1)グループリスト22からアクセスフィールドに対応するメソッドの数をカウントして優先度とするときには、図10の例では、「f1」に対応するメソッド数は「2」、「f2」に対応するメソッド数は「2」、「f1,f2」に対応するメソッド数は「1」となり、優先度の順に「f1」および「f2」の2つのアクセスフィールドがアクセスフィールドリスト24に登録されることになり、この場合には、「f1」に対応する2つのメソッドがグループ「1」、「f2」に対応する2つのメソッドがグループ「2」、その他の5つのメソッドがグループ「ALL」に配属されることになる。
以上のように、優先度の高いアクセスフィールドについて、優先的にグループ化を行うことにより、グループごとに独立した部分ロックヘッダを用いて排他制御を行うことが可能となる。したがって、アクセス頻度の高いフィールドについての排他制御を、他のフィールドとは独立したロックリソースを用いて行うようにすることができる。よって、頻繁にアクセスされるフィールドについて、頻繁にロックが取得されても、他のフィールドについてのアクセスは、異なるロックリソースに対して同時にロックを取得することができるので、ロックの解除待ちとなる時間を短縮し、メソッド実行の並行性を高めることができる。したがって、メソッドの実行効率を向上することができる。
なお、本実施形態では、JITコンパイラ12がメソッドからアクセスされるフィールドを決定し、決定したフィールドに基づいてグループ化を行うものとしたが、ユーザがプログラム中に、メソッドが使用するフィールドを記述するようにしてもよい。この場合のメソッドのグループ化処理の流れを図21に示す。同図に示すように、この場合、上述した図9の(S322)の処理の前に、コード生成部122は、プログラム記憶部15に記憶されているプログラムを走査し、フィールドを指定する記述である「UseField.set」命令が記述されているかどうかを判定する(S541)。なお、本実施形態では、フィールドを指定する記述として、独自に規定した「UseField.set」命令を用いるものとしたが、例えば、コメントとして記述するようにしてもよいし、メソッドの修飾子として記述するようにしてもよい。UseField.set命令が記述されている場合には(S541:YES)、その引数をアクセスフィールドとし(S542)、記述されていなければ(S322)に進む。
フィールドを指定する記述を含むユーザプログラムの一例を図22に示す。同図の例では、call_otherメソッドにおいて「UseField.set(f1)」が記述されている(561)。したがって、call_otherメソッドに対応するアクセスフィールドは「f1」として図10のグループリスト22に登録されることになる。
通常、メソッドから他のメソッドが呼び出される場合には、呼出し元のメソッドの処理が終了するまでに、所属クラスのどのフィールドが使用されるのかは、呼出し先のメソッドおよびさらに呼出し先のメソッドからの呼出し先などについても連鎖的に解析する必要がある。しかし、上記のように、プログラムに記述されているアクセスフィールドの指定にしたがって、アクセスフィールドを決定することにより、解析処理を行うことなくアクセスフィールドを決定し、高精度なグループ化を行うことができる。したがって、グループごとに異なるロックリソースを用いてロックを行うことにより、クリティカルセクションの実行の並行性を向上し、ロックの解除待ちの状態をより少なくすることができる。
なお、本実施形態ではJava(登録商標)言語によるプログラムを実行することを前提としたが、これに限らず同一のロックリソースに対してロックを取得する排他制御を行うクリティカルセクションを記述可能な各種のプログラム言語に適用することができる。例えば、C言語によるPスレッドであっても、同一のロックリソース(mutex)に対してロックを取得する複数のクリティカルセクションのそれぞれについて、アクセスされる変数群を特定して、変数群ごとにグループ化して、異なるmutexに対するロックを取得するようにすることができる。
また、本実施形態では、仮想マシン11におけるJITコンパイラ12がJava(登録商標)言語のユーザプログラムを読み込んでネイティブ形式の実行ファイルを出力するものとしたが、これに限らず、例えば、インタプリタ112がユーザプログラムの実行時に、メソッドをグループ化して、ロックヘッダ43に対してロックを取得する代わりに、部分ロックヘッダ431〜434に対してロックを取得するようにしてもよい。
また、本実施形態では、ロックリソースに対するロックの取得は、Thin−Lock手法により行うものとしたが、これに限らず、各種の手法を用いるようにすることができる。この場合には、ロックリソースの構成を、ロックの手法に合わせたものにする。
また、プログラムローダ111が、プログラム記憶部15からユーザプログラムを読み出すときに、メソッドのグループ化およびロックの取得先を変更するように、ユーザプログラムを書き換えるようにしてもよい。この場合、例えば、プログラムローダ111は、複数のロック用のインスタンスオブジェクトを生成するコードを追加し、各synchronizedメソッドについてグループ化を行い、グループごとに異なるロック用のインスタンスオブジェクトに対してロックを行うように記述を変更することができる。
また、本実施形態では、クリティカルセクションはsynchronizedメソッドであるものとしているが、同一のオブジェクトに対するロックを取得するsynchronizedブロックに対しても容易に適用可能である。
また、本実施形態では、他のメソッドを呼び出しているメソッドについては、所属クラスのすべてのフィールドをアクセスフィールドとするようにしたが、呼出し先のすべてのメソッドを解析して、アクセスフィールドを特定するようにしてもよい。この場合、コード生成部122が呼出し先のメソッドの解析を行うようにしてもよいし、プログラム解析部121が、呼出し先のメソッドを含めてフィールドにアクセスしているかどうかを解析した結果を出力するようにしてもよい。
また、本実施形態では、private属性のフィールドのみを有するExampleクラスを例として説明したが、所属クラスがpublicやprotected属性のフィールドを有する場合には、private属性のフィールドのみを対象として、アクセスフィールドを特定するようにしてもよいし、publicやprotected属性のフィールドであっても、他のクラスのコードに、当該所属クラスのフィールドを読み書きするコードが記述されているかどうかを判定するようにして、すべてのフィールドを対象として、アクセスフィールドを特定するようにしてもよい。
また、本実施形態では、1ワードは64ビットであるものとして、64ビットのロックリソースに対するアトミック命令がCPU101によってサポートされるものとしたが、例えば、1ワードが32ビットや16ビットであってもよい。
また、本実施形態では、CPU101が記憶装置103に記憶されているプログラムを実行することにより仮想マシン11を実現するものとしたが、これに限らず仮想マシン11の一部または全部をハードウェアにより実現するようにしてもよい。
また、本実施形態では、コード生成部122は直接ネイティブ形式の実行ファイル、すなわち機械語で記述されたプログラムを生成するものとしたが、例えば、アセンブラ言語で記述されたソースコードを生成して、一般的なアセンブラにより機械語に翻訳するようにしてもよいし、C言語で記述されたソースコードを生成して、一般的なコンパイラによりコンパイルするようにしてもよい。
また、本実施形態では、ロックヘッダ43を4つに分割した部分ロックヘッダ431〜434を用いるものとしたが、これに限らず任意の数に分割するようにしてもよい。
また、本実施形態では、すべてのオブジェクトは同じ大きさのロックヘッダ43を有するものとしたが、クラスごとに可変数の部分ロックヘッダを確保するようにしてもよい。この場合のインスタンスオブジェクトおよび部分ロックヘッダの構成例を図23に示す。同図に示すように、ロックヘッダ43は、部分ロックヘッダが格納されるメモリ領域へのポインタであるものとし、ロックヘッダ43が示すアドレスに可変数の部分ロックヘッダを設けるようにする。図23の例では、「ClassA」のオブジェクトについては、部分ロックヘッダ431および432の2つの部分ロックヘッダが確保されているが、「ClassB」のオブジェクトについては、部分ロックヘッダ431〜435の5つの部分ロックヘッダが確保されている。
このように、クラスごとに可変長のロックリソースを設けることにより、例えば、クリティカルセクションが多いクラスについてはロックリソースを多く設け、クリティカルセクションが少ないクラスについてはロックリソースを少なく設けるようにすることで、管理者は排他制御に係るチューニングを行うことができる。
また、ロックリソースを可変数とする場合に、優先度が所定のしきい値以下のアクセスフィールドについては、ロックリソースを設けないようにしてもよい。この場合のアクセスフィールドリスト24の生成処理の流れを図24に示す。
図24に示すアクセスフィールドの生成処理において、コード生成部122は、図20のステップS522の次に、作業リスト23から、優先度がしきい値以上であるアクセスフィールド数をカウントして組み合わせ数とする(S561)。コード生成部122は、組み合わせ数が所定の最大値よりも大きい場合には(S562:YES)、所定の最大値をグループ数とし(S563)、そうでなければ組み合わせ数をグループ数とする(S564)。所定の最大値とは、各クラスのインスタンスについて確保されるロックリソースの数の最大値であり、例えば8や16などの値に予め設定されているものとする。所定の最大値は、管理者が設定を行うようにしてもよいし、情報処理装置10のメモリの大きさなどに基づいて算出するようにしてもよい。
図24の処理では、コード生成部122は、作業リスト23の各アクセスフィールドについて、優先度がしきい値未満となった場合に(S565:NO)、処理を終了するようにする。また、コード生成部122は、(S501)において、登録数がグループ数を超える場合に(S501:YES)処理を終了するようにする。
なお、コード生成部122は、この処理で決定したグループ数のロックリソースを確保するようにコードを出力するようにする。
以上のようにして、優先度の高いアクセスフィールドの数に応じて、クラスごとにロックリソースの数を決定することができる。したがって、クラスの特定に応じて、適切な数のグループ化を行うことができるので、適切にメソッドを並行処理することができる。よって、全体として処理効率を向上することができる。
また、図24の処理では、優先度の高いアクセスフィールドが数多くある場合でも、所定の最大値超えないようにグループ数を制限することができるので、ロックリソースを確保しすぎて情報処理装置10のリソースを消費し過ぎないように抑制することができる。
以上、本実施形態について説明したが、上記実施形態は本発明の理解を容易にするためのものであり、本発明を限定して解釈するためのものではない。本発明は、その趣旨を逸脱することなく、変更、改良され得ると共に、本発明にはその等価物も含まれる。
情報処理装置10のハードウェア構成を示す図である。 情報処理装置10のソフトウェア構成を示す図である。 プログラム記憶部15に記憶されるユーザプログラムの一例を示す図である。 インスタンスオブジェクトの構成例を示す図である。 実行プロファイル情報の構成例を示す図である。 メソッド呼出情報20の構成例を示す図である。 データフロー情報21の構成例を示す図である。 JITコンパイラ12による処理の流れを示す図である。 メソッドのグループ化処理の流れを示す図である。 グループリスト22の構成例を示す図である。 作業リスト23の生成処理の流れを示す図である。 作業リスト23の一例を示す図である。 アクセスフィールドリスト24の生成処理の流れを示す図である。 アクセスフィールドリスト24の一例を示す図である。 排他処理を行うsynchronizedメソッドに係るコード生成処理の流れを示す図である。 すべての部分ロックヘッダに対するロックを取得するコードの一例を示す図である。 部分ロックヘッダに対するロックを取得するコードの一例を示す図である。 ロックヘッダ43と同じ大きさのフィールドをヘッダ部分に追加した場合のインスタンスオブジェクトの構成例を示す図である。 グループ数を所定数以下に制限する場合のアクセスフィールドリスト24の生成処理の流れを示す図である。 優先順位順にグループ数を制限する場合のアクセスフィールドリスト24の生成処理の流れを示す図である。 メソッドが使用するフィールドがプログラム中に記述される場合の、メソッドのグループ化処理の流れを示す図である。 フィールドを指定する記述を含むユーザプログラムの一例を示す図である。 クラスごとに可変数の部分ロックヘッダを確保する場合のインスタンスオブジェクトおよび部分ロックヘッダの構成例を示す図である。 優先度が所定のしきい値以下のアクセスフィールドについては、ロックリソースを設けないようにする場合のアクセスフィールドリスト24の生成処理の流れを示す図である。 Thin−Lock手法による排他制御を行う場合のコードを説明するための図である。
符号の説明
10 情報処理装置
101 CPU
102 メモリ
103 記憶装置
104 入力装置
105 出力装置
11 仮想マシン
12 JITコンパイラ
15 プログラム記憶部
16 実行プロファイル記憶部
17 実行ファイル記憶部
111 プログラムローダ
112 インタプリタ
121 プログラム解析部
122 コード生成部
161 メソッド統計
162 フィールド統計
20 メソッド呼出情報
201 メソッド名
202 呼出メソッド
21 データフロー情報
211 メソッド名
212 処理内容
22 グループリスト
23 作業リスト
24 アクセスフィールドリスト
40 インスタンスオブジェクト
43 ロックヘッダ
431 部分ロックヘッダ
432 部分ロックヘッダ
433 部分ロックヘッダ
434 部分ロックヘッダ
501 スレッドID
502 ネスト回数
503 識別ビット

Claims (8)

  1. マルチスレッドで動作するアプリケーションプログラムを実行する情報処理装置であって、
    前記アプリケーションプログラムに含まれる、第1の排他制御用リソースに対してロックを取得してから前記ロックを解除するまでのプログラムである複数のクリティカルセクションを抽出するクリティカルセクション抽出部と、
    抽出した各前記クリティカルセクションを実行した場合に読み書きしうる記憶領域である使用領域を決定する使用領域決定部と、
    前記使用領域の少なくとも一部が重なる前記クリティカルセクションをグループ化するグループ処理部と、
    前記第1の排他制御用リソースに対するロックに代えて、前記グループごとに異なる第2の排他制御用リソースに対して前記クリティカルセクションがロックを取得するようにする最適化処理部と、
    を備えることを特徴とする情報処理装置。
  2. 請求項1に記載の情報処理装置であって、
    前記グループ処理部は、各前記グループに所属する前記クリティカルセクションの数を算出し、前記数が大きい順または小さい順に所定数の前記グループを第1のグループとし、前記第1のグループ以外のグループに所属する前記クリティカルセクションを、すべて同一の第2のグループとすること、
    を特徴とする情報処理装置。
  3. 請求項1に記載の情報処理装置であって、
    前記記憶領域ごとに、過去に前記アプリケーションプログラムを実行した際に読み書きされた回数を記憶する実行プロファイル記憶部を備え、
    前記グループ処理部は、各前記グループに対応する前記使用領域についての前記回数を前記実行プロファイル記憶部から読み出し、読みだした前記回数の順に所定数の前記グループを第1のグループとし、前記第1のグループ以外のグループに所属する前記クリティカルセクションを、すべて同一の第2のグループとすること、
    を特徴とする情報処理装置。
  4. 請求項1に記載の情報処理装置であって、
    前記グループ処理部は、前記使用領域ごとに、前記使用領域を示す文字列が前記アプリケーションプログラム中に記述されている個数をカウントし、前記個数の順に所定数の前記グループを第1のグループとし、前記第1のグループ以外のグループに所属する前記クリティカルセクションを、すべて同一の第2のグループとすること、
    を特徴とする情報処理装置。
  5. 請求項1に記載の情報処理装置であって、
    前記アプリケーションプログラムには、前記クリティカルセクションに対応する前記記憶領域の指定が記述可能であり、
    前記使用領域決定部は、前記記憶領域の指定が前記クリティカルセクションに記述されているかどうかを判定し、前記記憶領域の指定が記述されている場合には、当該記憶領域の指定に基づいて前記クリティカルセクションに対応する前記記憶領域を決定すること、
    を特徴とする情報処理装置。
  6. 請求項2乃至5のいずれかに記載の情報処理装置であって、
    前記最適化処理部は、前記第1のグループに所属する前記クリティカルセクションについては、前記第1のグループごとに異なる前記第2の排他制御用リソースに対してロックを取得するようにし、前記第2のグループに所属する前記クリティカルセクションについては、各前記第1のグループに対応するすべての前記第2の排他制御用リソースに対してロックを取得するようにすること、
    を特徴とする情報処理装置。
  7. マルチスレッドで動作するアプリケーションプログラムのソースコードを読み込んで前記アプリケーションプログラムの実行ファイルを生成する情報処理装置であって、
    第1の前記ソースコードに含まれる、第1の排他制御用リソースに対してロックを取得してから前記ロックを解除するまでの部分である複数のクリティカルセクションを抽出するクリティカルセクション抽出部と、
    抽出した前記クリティカルセクションを実行した場合に読み書きしうる記憶領域である使用領域を決定する使用領域決定部と、
    前記使用領域の少なくとも一部が重なる前記クリティカルセクションをグループ化するグループ処理部と、
    前記第1のソースコードに基づいて、前記実行ファイルを生成するコンパイル処理用の第2のソースコードを出力する際に、前記第1の排他制御用リソースに対するロックを取得するコードに代えて、前記グループごとに異なる第2の排他制御用リソースに対するロックを取得するコードを出力する予備処理部と、
    前記予備処理部が出力した前記第2のソースコードに基づいて前記実行ファイルを生成するコンパイル処理部と、
    を備えることを特徴とする情報処理装置。
  8. マルチスレッドで動作するアプリケーションプログラムを実行するコンピュータによる情報処理方法であって、
    前記コンピュータが、
    前記アプリケーションプログラムに含まれる、第1の排他制御用リソースに対してロックを取得してから前記ロックを解除するまでのプログラムである複数のクリティカルセクションを抽出し、
    抽出した各前記クリティカルセクションを実行した場合に読み書きしうる記憶領域である使用領域を決定し、
    前記使用領域の少なくとも一部が重なる前記クリティカルセクションをグループ化し、
    前記第1の排他制御用リソースに対するロックに代えて、前記グループごとに異なる第2の排他制御用リソースに対して前記クリティカルセクションがロックを取得するようにすること、
    を特徴とする情報処理方法。
JP2007100989A 2007-04-06 2007-04-06 情報処理装置および情報処理方法 Pending JP2008257594A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2007100989A JP2008257594A (ja) 2007-04-06 2007-04-06 情報処理装置および情報処理方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2007100989A JP2008257594A (ja) 2007-04-06 2007-04-06 情報処理装置および情報処理方法

Publications (1)

Publication Number Publication Date
JP2008257594A true JP2008257594A (ja) 2008-10-23

Family

ID=39981082

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007100989A Pending JP2008257594A (ja) 2007-04-06 2007-04-06 情報処理装置および情報処理方法

Country Status (1)

Country Link
JP (1) JP2008257594A (ja)

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010205170A (ja) * 2009-03-05 2010-09-16 Internatl Business Mach Corp <Ibm> マルチスレッド上で動作するプログラムのプログラム・コードをロック衝突が少ないプログラム・コードに変換するための方法、並びにそのコンピュータ・プログラム及びコンピュータ・システム
JP2011081610A (ja) * 2009-10-07 2011-04-21 Internatl Business Mach Corp <Ibm> オブジェクト最適配置装置、オブジェクト最適配置方法、及びオブジェクト最適配置プログラム
WO2011158441A1 (ja) * 2010-06-17 2011-12-22 日本電気株式会社 データ処理装置および方法、そのプロセッサユニット
WO2011161830A1 (ja) * 2010-06-25 2011-12-29 富士通株式会社 マルチコアシステムおよびスケジューリング方法
JP2013258626A (ja) * 2012-06-14 2013-12-26 Oki Data Corp 画像形成装置及び画像形成システム
US9250980B2 (en) 2009-12-18 2016-02-02 International Business Machines Corporation System, method, program, and code generation unit
CN109857566A (zh) * 2019-01-25 2019-06-07 天翼爱动漫文化传媒有限公司 一种内存读写过程的资源锁定算法

Cited By (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010205170A (ja) * 2009-03-05 2010-09-16 Internatl Business Mach Corp <Ibm> マルチスレッド上で動作するプログラムのプログラム・コードをロック衝突が少ないプログラム・コードに変換するための方法、並びにそのコンピュータ・プログラム及びコンピュータ・システム
US8572584B2 (en) 2009-03-05 2013-10-29 International Business Machines Corporation Converting program code of a multi-threaded program into program code causing less lock contentions
JP2011081610A (ja) * 2009-10-07 2011-04-21 Internatl Business Mach Corp <Ibm> オブジェクト最適配置装置、オブジェクト最適配置方法、及びオブジェクト最適配置プログラム
US11086680B2 (en) 2009-10-07 2021-08-10 International Business Machines Corporation Object optimal allocation device, method and program
US10296388B2 (en) 2009-10-07 2019-05-21 International Business Machines Corporation Object optimal allocation device, method and program
US9009715B2 (en) 2009-10-07 2015-04-14 International Business Machines Corporation Object optimal allocation device, method and program
US10169092B2 (en) 2009-12-18 2019-01-01 International Business Machines Corporation System, method, program, and code generation unit
US9250980B2 (en) 2009-12-18 2016-02-02 International Business Machines Corporation System, method, program, and code generation unit
JP5737290B2 (ja) * 2010-06-17 2015-06-17 日本電気株式会社 データ処理装置および方法、そのプロセッサユニット
US9158542B2 (en) 2010-06-17 2015-10-13 Nec Corporation Data processing device and method, and processor unit of same
US9389864B2 (en) 2010-06-17 2016-07-12 Nec Corporation Data processing device and method, and processor unit of same
WO2011158441A1 (ja) * 2010-06-17 2011-12-22 日本電気株式会社 データ処理装置および方法、そのプロセッサユニット
JP5397544B2 (ja) * 2010-06-25 2014-01-22 富士通株式会社 マルチコアシステム、マルチコアシステムのスケジューリング方法およびマルチコアシステムのスケジューリングプログラム
US9367349B2 (en) 2010-06-25 2016-06-14 Fujitsu Limited Multi-core system and scheduling method
WO2011161830A1 (ja) * 2010-06-25 2011-12-29 富士通株式会社 マルチコアシステムおよびスケジューリング方法
JP2013258626A (ja) * 2012-06-14 2013-12-26 Oki Data Corp 画像形成装置及び画像形成システム
CN109857566A (zh) * 2019-01-25 2019-06-07 天翼爱动漫文化传媒有限公司 一种内存读写过程的资源锁定算法
CN109857566B (zh) * 2019-01-25 2020-09-29 天翼爱动漫文化传媒有限公司 一种内存读写过程的资源锁定方法

Similar Documents

Publication Publication Date Title
US8413125B2 (en) Asynchronous dynamic compilation based on multi-session profiling to produce shared native code
JP5284103B2 (ja) ソフトウェアトランザクショナルメモリ動作の最適化
US8990786B2 (en) Program optimizing apparatus, program optimizing method, and program optimizing article of manufacture
JP2008257594A (ja) 情報処理装置および情報処理方法
US8037460B2 (en) Code persistence and dependency management for dynamic compilation in a database management system
JP5813165B2 (ja) トランザクションを用いるシーケンシャルフレームワークの並行化
US9229697B2 (en) Speculative object shapes
GB2341465A (en) Determining the actual class of an object at run time
Feldman et al. A wait-free multi-word compare-and-swap operation
US8972959B2 (en) Method of converting program code of program running in multi-thread to program code causing less lock collisions, computer program and computer system for the same
Laborde et al. A wait-free hash map
US9292446B2 (en) Speculative prefetching of remote data
JP2005285122A (ja) マルチスレッド化されたプログラムにおける潜在的な競合を検出するための方法およびシステム
JP5435741B2 (ja) 競合管理を容易にするための型固定性の使用
US20130174131A1 (en) Code converting method, program, and system
US10102046B2 (en) In-memory data analytic system that provides an integrated tracking mechanism for explicit memory resources
Prokopec Cache-tries: concurrent lock-free hash tries with constant-time operations
JP5178852B2 (ja) 情報処理装置およびプログラム
US7991976B2 (en) Permanent pool memory management method and system
US20050080981A1 (en) Structure and method for managing workshares in a parallel region
US9189297B2 (en) Managing shared memory
JP5871589B2 (ja) 情報処理装置、配列の初期サイズ調整プログラム及び方法
JP6011329B2 (ja) プログラム生成装置、プログラム生成方法、および、コンピュータ・プログラム
US20160371066A1 (en) Computer that performs compiling, compiling method and storage medium that stores compiler program
KR20220083036A (ko) 시대 기반 메모리 수집 기법과 포인터 기반 메모리 수집 기법 혼합을 위한 컴퓨터 시스템 및 그의 방법