JPH0816430A - 並列プログラムトレース装置 - Google Patents

並列プログラムトレース装置

Info

Publication number
JPH0816430A
JPH0816430A JP6144883A JP14488394A JPH0816430A JP H0816430 A JPH0816430 A JP H0816430A JP 6144883 A JP6144883 A JP 6144883A JP 14488394 A JP14488394 A JP 14488394A JP H0816430 A JPH0816430 A JP H0816430A
Authority
JP
Japan
Prior art keywords
lock
deadlock
thread
program
information
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
JP6144883A
Other languages
English (en)
Inventor
Akiko Ishizuka
章子 石塚
Yushi Fukuchi
雄史 福地
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.)
Mitsubishi Electric Corp
Original Assignee
Mitsubishi Electric Corp
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 Mitsubishi Electric Corp filed Critical Mitsubishi Electric Corp
Priority to JP6144883A priority Critical patent/JPH0816430A/ja
Publication of JPH0816430A publication Critical patent/JPH0816430A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

(57)【要約】 【目的】 特にマルチスレッドをサポートしている並列
計算機において、トレースデータ採取中にデッドロック
に陥っているかどうかを知ることができる。また、トレ
ースが正常終了した場合にもデッドロックに陥った場合
にもトレースデータとロック情報を保存することができ
る。並列プログラムトレース装置を得ることを目的とす
る。 【構成】 トレース実行中にロック情報採取部108
が、各スレッドのロック情報(ロック変数獲得待ち/ロ
ック変数獲得/ロック変数解除)を共有メモリ115上
のロック情報テーブル105に書き込み、ロック情報表
示部113が、そのデータを表示する。また、デッドロ
ック検出部110が、トレース中にロック情報テーブル
105を走査してデッドロックの検出を行う。

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明は、例えばマルチスレッド
をサポートしている共有メモリ型並列計算機において、
並列プログラムの実行時情報を採取する並列プログラム
トレース装置に関するものである。
【0002】
【従来の技術】従来、ソースプログラムの動的特性を解
析するために実行時情報を採取する方法としては、特開
昭63-163545 が示すような方法がとられている。ここで
いう、プログラムの実行時の動的特性を解析するための
実行時情報とは、ソースプログラムの各プログラム単位
の実行時間、各文の実行回数、各手続き呼び出し回数、
各文・手続き呼び出しの実行時間、各文・手続き呼び出
しの実行時刻(タイムログ)、プログラム実行にともな
う並列度の変化等を指す。並列プログラムの上記のよう
な動的特性を採取する方法として商用化されているもの
としては、例えば、Express C ``User■s Guide■■ ve
rsion3.0(ParaSoft Corp., 1988,1989,1990) Chapter 8
に示された、Parasoft 社で作成された共有/分散メモ
リ型並列計算機や、ワークステーョンnetwork-cluster
向けの並列プログラミング環境である、Expressのサブ
システム、ETOOL(Event profiling TOOL)やXTOOL(eXecu
tion profiling TOOL) のようなものがある。ここで
は、被測定プログラムに計測文を挿入して、測定用プロ
グラムを作成し、この測定用プログラムを実行して実行
時情報を採取し、トレース終了後にファイルに保存す
る、という方法が用いられている。ところで、一般に並
列計算機用のプログラムでは、データロック制御や同期
制御の実行文がユーザプログラムに記述されているた
め、プログラミングの誤りがあり、デッドロックに陥る
ことがある。しかし、上記のような並列プログラムの実
行時情報の採取方法だと、トレース採取中にデッドロッ
クにおちいっているかどうか知ることができない。実行
プログラムのデータロック制御や同期制御の誤りを検出
する方法には、特開平3-218539が示すような方法があ
る。しかしこれはデバッグ方法であり、従来のトレース
装置には、ユーザが、トレース中にプログラム中のデー
タロック制御や同期制御の誤りを知るような機能をもっ
たものはない。ここでは、プログラム中の各手続きの実
行時刻(タイムログ)を収集する場合を例にして、従来
例の動作を説明する。図15は、被解析ソースプログラ
ムを測定用プログラム生成装置に入力して、測定用ソー
スプログラムを出力する流れを示した図である。図15
においては、(201)は被解析ソースプログラムであ
り、(202)は測定用プログラム生成装置であり、
(203)は測定用ソースプログラムである。図16は
測定用プログラム生成装置内の処理の流れを示した図で
ある。
【0003】従来までの測定用ソースプログラム生成法
においては、被解析ソースプログラム(201)を測定
用ソースプログラム生成装置(202)に入力すると、
測定用ソースプログラム生成装置(202)は、被解析
ソースプログラム(201)を解析して、被解析ソース
プログラム(201)内の全ての手続き呼び出し文に対
して、実行時刻(タイムログ)計測文を付加して、測定
用ソースプログラム(203)を出力する。このように
して生成された測定用ソースプログラム(203)を実
行して、トレースデータを採取する。測定用ソースプロ
グラム生成装置(202)内の処理を、図16に沿って
説明する。測定用ソースプログラム生成装置(202)
は、被解析プログラム(201)から、1文ずつソース
プログラムを読み込み、その文が手続き呼び出し文かど
うかを判定する。読み込んだ文が手続き呼び出し文でな
ければ、測定用ソースプログラム(203)にその文を
そのまま出力する。読み込んだ文が手続き呼び出し文で
あれば、計測文を付加して、測定用ソースプログラム
(203)にその文を出力する。被解析プログラム(2
01)中の全ての文に対して以上のような作業を行な
い、測定用ソースプログラム(203)を生成する。こ
の測定用ソースプログラムを実行すると、上記のように
して埋め込んだ計測文のところで毎回実行時情報が採取
され、採取された情報は共有メモリ上に書き込まれるこ
とになる。すべて実行時情報の収集が終了すると、ファ
イルに書き込んで、測定用ソースプログラムを終了す
る。図17は、従来の並列プログラムの実行時情報採取
時の状態を示すものである図17において、(115)
は共有メモリ、(104)は実行時情報を書き込むトレ
ース情報格納領域、(503、504、505、50
6)は実行時情報の採取の対象となる実行単位である。
【0004】
【発明が解決しようとする課題】従来のような実行時情
報を採取する方法では、実行時情報を採取するための測
定用プログラムを実行している時に、デッドロックにお
ちいった場合のサポートはされていない。そのため、デ
ッドロックが発生しても、ユーザはそれを認識してトレ
ースプログラムを終了することができない。また、トレ
ースプログラムの実行を強制終了させてトレースを途中
で終了する場合には、終了する前に採取してメモリ上に
書き込んだトレースデータを、全く採取することができ
ないという問題がある。
【0005】本発明は、例えばマルチスレッドをサポー
トしている共有メモリ型並列計算機において、トレース
採取中にデッドロックに陥っているかどうかを、知るこ
とができる並列プログラムトレース装置を得ることを目
的とする。さらに、トレースが正常終了した時にも、デ
ッドロックに陥る可能性がある箇所があるかどうかを判
定できる並列プログラムトレース装置を得ることを目的
とする。さらに、トレース中にデッドロックにおちいっ
た場合に、デッドロック発生の原因となった部分を検出
できる並列プログラムトレース装置を得ることを目的と
する。
【0006】
【課題を解決するための手段】この発明に係わる並列プ
ログラムトレース装置は、複数の実行単位が並列に動作
することができる並列計算機において、トレース実行中
に、各実行単位のロックに関する実行状態を書き込むた
めのロック情報テーブルを保持し、そのロック情報を採
取するロック情報採取手段を有することを特徴とする。
【0007】この発明に係わる上記並列プログラムトレ
ース装置は、任意の時刻に現時点でのロック情報を表示
するためのロック情報表示手段を有することを特徴とす
る。
【0008】この発明に係わる上記並列プログラムトレ
ース装置は、トレース終了後に採取した少なくともロッ
ク情報をファイルに保存する終了時格納手段を有するこ
とを特徴とする。
【0009】この発明に係わる上記並列プログラムトレ
ース装置は、各実行単位がロックをかけにいく場合にデ
ッドロックに陥るかどうかを判断するデッドロック検出
手段を有することを特徴とする。
【0010】この発明に係わる上記並列プログラムトレ
ース装置は、デッドロックを検出するための実行単位を
新たに生成するデッドロック検出用実行単位生成手段
と、デッドロック検出用実行単位は、デッドロックに陥
っている実行単位があるかどうか判断するデッドロック
検出手段を有することを特徴とする。
【0011】この発明に係わる上記並列プログラムトレ
ース装置は、デッドロックを検出した時点で少なくとも
ロック情報をファイルに保存する採取時格納手段を有す
ることを特徴とする。
【0012】
【作用】本発明にかかる並列プログラムトレース装置に
おけるロック情報採取手段は、トレース情報とは別に、
各実行単位のロック情報例えば、ロック変数名、時刻、
実行単位の実行状態等を採取し、ロック情報テーブルに
書き込む。そのため、ロック情報テーブルを走査すれ
ば、全ての実行単位のロック情報を知り、デッドロック
に陥っているかどうかを知ることができる。
【0013】また、ロック情報表示手段は、トレース実
行中の任意の時刻に上記ロック情報テーブルからロック
情報を読みだし、表示することができる。
【0014】また、終了時格納手段は、トレース終了時
にロック情報テーブルのデータをファイルに書き込むた
め、トレース終了後に実行タイミングによってはデッド
ロックに陥る可能性がある箇所をチェックすることがで
きる。
【0015】また、デッドロック検出手段により、各実
行単位がロックをかける前にロック情報テーブルを走査
して、そのロックをかけるとデッドロックに陥るかどう
かを判断することができる。
【0016】また、デッドロック検出用実行単位生成手
段は、同一プログラム中でデッドロック検出用に別実行
単位を生成し、その生成されたデッドロック検出用実行
単位はデッドロックの検出を行なうデッドロック検出手
段を持つ。そのため、デッドロックに陥るかどうかの判
断を各実行単位が行なうことにより、発生するオーバー
ヘッドを削減する事ができる。
【0017】また、採取時格納手段はデッドロックを検
出した時に、ロック情報と例えばトレースデータをファ
イルに保存してからプログラムを終了するため、ユーザ
がデッドロックがどこで発生したのかを知ることができ
る。
【0018】
【実施例】
実施例1.本実施例においては、複数の実行単位が一つ
のアドレス空間を共有して並列に動作することができる
マルチスレッドをサポートしている並列計算機を対象と
して述べる。本実施例が対象としているマルチスレッド
について説明する。スレッドとは、計算の実行単位であ
り、プログラムの中で生成し、実行させ休止させること
ができる。本実施例が対象としているマルチスレッドで
は、ひとつのアドレス空間を複数のスレッドが共有し
て、それぞれが独立して(並列に)実行することができ
る。例えば、マルチスレッドをサポートするアドレス空
間を図1に示す。(401)は複数のスレッドが共有す
るアドレス空間(メモリ)、(402)はすべてのスレ
ッドがアクセスできる空間で、実行の命令コードやデー
タが置かれるテキストデータ領域、(403)は各スレ
ッドごとに固有に与えられるスタック領域である(例え
ば、スレッド(1)→スタック1、スレッド(2)→ス
タック2…)。上記のように、各スレッドは同一アドレ
ス空間に固有のスタックを持ち、同一のテキストデータ
領域をアクセスしている。このようにして、各スレッド
は独立して(並列に)実行することができる。また、ス
レッドの生成は、関数呼び出しによって行なうことがで
きる。
【0019】図2は、測定用プログラムの生成の流れを
示した図である。(101)は、被解析プログラム、
(102)はトレースプログラム生成部、(103)は
測定用プログラムである。図2は、被解析プログラム
(101)をトレースプログラム生成部(102)に入
力して、測定用プログラム(103)を出力する流れを
示した図である。被解析プログラム(101)と測定用
プログラム(103)の中には複数のスレッド(1)〜
(N)が含まれている。
【0020】図3はトレースプログラム生成部(10
2)内の処理の流れを示した図である。被解析プログラ
ム(101)をトレースプログラム生成部(102)に
入力すると、トレースプログラム生成部(102)は、
被解析プログラム(101)を解析して、被解析プログ
ラム(101)内の手続き呼び出し文に、時刻(タイム
ログ)計測文を付加する。そして、この手続き呼び出し
が、ロック機構を実現するための手続き(ロック関数例
えば、lock(), unlock()) であるならば、さらにロック
情報採取文も付加し、測定用プログラム(103)を生
成する。
【0021】以下では、プログラム中の各手続きの実行
時刻(タイムログ)をトレースする場合のトレースプロ
グラム生成部(102)内の処理を図3に沿って説明す
る。トレースプログラム生成部(102)は、被解析プ
ログラム(101)から1文ずつソースプログラムを読
み込み、まず、その文が手続き呼び出し文かどうかを判
定する。読み込んだ文が手続き呼び出し文でなければ、
測定用プログラム(103)にその文をそのまま出力す
る。読み込んだ文が手続き呼び出し文でありロック機構
を実現する手続き文でないならば、時刻計測文を付加し
て、測定用プログラム(103)にその文を出力する。
読み込んだ文が手続き呼び出し文でありロック機構を実
現する手続き文でもあるならば、時刻計測文とロック情
報採取文を付加して測定用プログラム(103)にその
文を出力する。被解析プログラム(101)中のすべて
の文に対して以上のような作業を行ない、測定用プログ
ラム(103)を生成する。つまり、被解析プログラム
(101)の中には、スレッド(1)〜スレッド(N)
が含まれており、この各々のスレッドの中に手続き呼び
出し文あるいはロック機構を実現する手続き文があるな
らば必要に応じて時刻計測文あるいはロック情報採取文
が付加され、測定用プログラム(103)が生成され
る。
【0022】図4は本実施例における並列プログラムト
レース装置のブロック図である。(104)はトレース
情報格納領域、(105)はロック情報テーブルであ
る。(106)はトレースデータ採取部、(108)は
ロック情報を採取する手段であるロック情報採取部、
(109)はロック情報を逐次表示する表示部である。
(115)は共有メモリであり、図1のテキストデータ
領域(402)に相当する。トレース情報格納領域(1
04)〜表示部(109)は共有メモリ(115)上に
ある。(1)〜(N)はスレッドである。図5は、ロッ
ク情報テーブル(105)の一例を示すものであり、ス
レッド番号、ロック変数名を表すロック変数、スレッド
の実行状態を示す状態(state)、(実行)時刻に
よって構成される。図6は、被解析プログラム(10
1)にロック情報採取文を付加してできた、測定用プロ
グラム(103)の一例である。このロック情報採取文
を実行すると、ロック情報採取部(108)において、
ロック変数を操作しようとするスレッド番号、その時の
スレッドの状態(ロック変数獲得待ち/ロック変数獲得
/ロック変数解除)、実行時点の時刻などのデータを採
取する機能と、ロック情報テーブルに書き込む機能を実
行し、表示部(109)においてディスプレイに表示す
る機能を実行する。図6に示す測定用プログラム(スレ
ッド(1)において実行されるものとする。)を実行す
ると、ロック情報採取文Tlock_in(A)が実行
され、ロック情報採取部(108)が呼ばれロック情報
が採取される。このとき採取されたロック情報は、表示
部(109)にて逐次ディスプレイに表示される。図7
(1)の表示例では1行目で示され、スレッド番号1、
ロック変数A、状態Wait(ロック変数獲得待ち)、
時刻2001とディスプレイされる。また、次にロック
情報採取文Tlock_out(A)が実行されると、
ロック情報採取部(108)が実行され、図7(1)の
2行目に示すようにスレッド番号1、ロック変数A、状
態lock(ロック変数獲得)、時刻2050が表示さ
れる。
【0023】次に、図7を用いてディスプレイ表示をも
とにユーザがどのようにしてデッドロックを検出するか
を示す。図7(2)に示すようにまず、スレッド(1)
がロック変数Aを獲得し(901)、スレッド(2)が
ロック変数Bを獲得し(902)、その後でスレッド
(1)がロック変数Bの獲得待ちに入り(903)、そ
の後でスレッド(2)はロック変数Aの獲得待ちに入っ
た(904)ことがわかる。このことから、ユーザは、
スレッド(1)とスレッド(2)はお互いに獲得し(ブ
ロック)しているロック変数の獲得待ちに入ってしまっ
ているため、永久に獲得待ち状態から抜けることができ
ない、つまり、デッドロックに陥っていることを推測す
ることができる。
【0024】このようにして、本実施例にかかる並列プ
ログラムトレース装置では、測定用プログラム(10
3)を実行すると、トレースデータ採取部(106)が
トレースデータを採取しながら、ロック情報採取部(1
08)が各スレッドがどのロック変数に対して、どのよ
うな操作(ロック変数獲得待ち/ロック変数獲得/ロッ
ク変数解除)を行なっているかという情報も採取し、表
示部(109)が表示することができる。そのため、ト
レース中にユーザは表示されたデータをもとにデッドロ
ックの検出ができる。
【0025】実施例2.上記実施例1では、採取した全
部のロック情報をただちにディスプレイに表示している
が、本実施例では、任意の時刻に現時点のロック情報を
表示するトレース装置について説明する。
【0026】図8は、本実施例における並列プログラム
トレース装置のブロック図である。上記実施例で示した
図4のブロック図とほぼ同様であるが、(107)の情
報格納部が加わった点と、図4の表示部(109)がロ
ック情報表示部(113)に変わった点が異なる点であ
る。情報格納部(107)は、ロック情報とトレースデ
ータをファイルに落す手段である。情報格納部(10
7)は、終了時格納部(111)と採取時格納部(11
2)に分かれており、終了時格納部(111)はトレー
ス終了後に採取したロック情報とトレースデータをファ
イルに保存する終了時格納手段である。また、採取時格
納部(112)はデッドロックを検出したときにロック
情報とトレースデータをファイルに落す採取時格納手段
である。また、図4の表示部(109)は測定用プログ
ラムが採取した全部のロック情報を直ちにディスプレイ
に表示するものであるが、ロック情報表示部(113)
は任意の時点のロック情報を表示するためのロック情報
表示手段である。
【0027】例えばUNIX OS (登録商標)においては、
プログラム実行開始後に外部機器からの信号(シグナ
ル:割り込み)の処理の仕方を指定することができる機
能(signal()) がある。そこで、この割り込み処理とし
てロック情報をディスプレイ表示する処理を指定すれ
ば、トレースデータの採取を行ないながら、任意の時刻
にロック情報を表示することができる。任意の時刻の設
定方法として例えばContrl_Cを押すことにより
シグナルを発生させることができる。図9にこの機能を
用いた例を示す。シグナル発生時(1004)に、それ
まで実行していた測定用プログラムを中断して(100
1)、指定した割り込み処理を行ない(1002)、そ
の割り込み処理が終ると、中断していたプログラムを中
断した箇所から再実行する(1003)ことができる。
以下では、その一実施例を示す。まず、トレースプログ
ラム生成部(102)で、上記実施例1のような付加コ
ード即ち時刻計測文とロック情報採取文に加えて、トレ
ース実行開始後のキー入力(例えば Contrl-C )によ
り、ロック情報を表示することができるようにシグナル
処理ルーチン(ロック情報表示関数)を設定するコード
も挿入する。このようにして生成した測定用プログラム
を実行中に、キー(Contrl-C )をおすと、測定用プログ
ラムの実行を中断してロック情報表示関数に移る。この
ロック情報表示関数が実行されると、図8のロック情報
表示部(113)が呼び出され、ロック情報テーブルを
走査して、各スレッドの現時点までのロック変数獲得待
ち状態、あるいはロック変数獲得状態等の情報をディス
プレイに表示する。ロック情報表示関数の処理が終了す
ると、中断していた測定用プログラムを中断したところ
から再び実行し、トレースデータの採取を続行すること
ができる。
【0028】さらに、トレースプログラム生成部(10
2)で、メモリ上のロック情報とトレース情報をファイ
ルに書き込んでプログラムを終了する、シグナル処理ル
ーチン(情報格納関数)を設定するコードも挿入する。
このようにして生成した測定用プログラムを実行中に、
ユーザは上記のようにして表示されたロック情報をもと
にトレース中にデッドロックが発生したと判断したとき
に設定したキーを押す。すると、情報格納関数が実行さ
れ、採取時格納部(112)を呼び出し、メモリ上のト
レース情報とロック情報をファイルに書き込んで、トレ
ースを終了することができる。また、トレース中にデッ
ドロックが発生しなかった場合は、終了時格納部(11
1)がトレース終了後に採取したロック情報とトレース
データをファイルに書き込むことができる。
【0029】このようにして、ロック情報を指定された
ときにだけディスプレイに表示することにより、表示に
かかるオーバーヘッドを削減することができる。また、
デッドロックに陥ったときにトレースを中断しても、採
取したトレースデータとロック情報を得ることができ
る。
【0030】実施例3.上記実施例では、ユーザが表示
されたロック情報からデッドロックが発生していること
を認識(検出)することになる。つまり、デッドロック
の検出はユーザ自身が行なう。本実施例では、スレッド
自身がロック変数にアクセスする前(ロックをとりにい
く前)に、このロック変数をとるとデッドロックになる
かどうかを判断してからロックをとりにいく方法、つま
り自動的にデッドロックを検出する場合について説明す
る。
【0031】図10は、本実施例の並列プログラムトレ
ース装置のブロック図である。実施例2で用いたブロッ
ク図8との違いは、デッドロック検出部(110)が加
わった点である。トレース実行時に自動的にデッドロッ
クの検出をするためには、上記実施例1のロック情報採
取文の処理内容に、ロック変数にアクセスする前(ロッ
クをかけにいく前)に、このロック変数を獲得する(ロ
ックをかける)とデッドロックになるかどうかを、判断
する処理を追加すればよい。
【0032】図11は、デッドロック検出部(110)
の処理手順を示した図であり、永久に解放されることが
ないロック変数の獲得待ちに入ることにより起こるデッ
ドロックを検出する手順を示している。
【0033】デッドロック検出部(110)における処
理の流れの概略は次にようになる。スレッド(i)はロ
ック変数Aにアクセスする前にロック情報テーブル(1
05)を走査し、ロック変数Aがすでに獲得されている
かどうかを調べる。もし、どのスレッドにも獲得されて
いないならば、デッドロックは発生しないと判断し、ロ
ック変数Aにアクセスする(処理を続ける)。ロック変
数Aがすでにスレッド(k)に獲得されているとする
と、ロック情報テーブルからスレッド(k)の現時点で
の状態を調べ、ロック変数獲得待ち状態でなければ、ス
レッド(i)がロック変数Aにアクセスしてもデッドロ
ックが発生しないと判断し、処理を続ける。もし、スレ
ッド(k)がロック変数Bの獲得待ち状態にあるなら
ば、ロック変数Bをすでに獲得しているスレッド番号を
調べる。ロック変数Bを獲得しているのがスレッド
(i)であるならば、スレッド(i)がロック変数Aに
アクセスするとデッドロックが発生すると判断し、ディ
スプレイにデッドロック発生メッセージを表示する。こ
のようにして、ユーザはトレース中にデッドロックが発
生したことを自動的に知ることができる。
【0034】次に、図7(2)で示したデッドロックの
例を用いて図11の処理の流れを説明する。図7(2)
で示したように、スレッド(1)がロック変数Aを獲得
していながら(901)ロック変数Bの獲得待ちに入る
が(903)、既にスレッド(2)がロック変数Bを獲
得している(902)状態を考える。このような状態の
時にスレッド(2)がロック変数Aにアクセス(ロック
をかけにいく)すると、すでにロック変数Aがスレッド
(1)に獲得されていることからロック変数獲得待ち
(904)の状態に入る。図11において、s1201
で初期設定をする。このときスレッド(2)がロック変
数Aにアクセスしようとしているので、thread=
スレッド(2),lock_var=Aとする。次にこ
の処理の中でのみ使用される変数を初期化する。loc
king_var_que[ ] =empty,loc
k_wait=null,locking_threa
d=nullである。
【0035】次にs1202において、threadが
獲得しているロック変数は存在するかどうか判断する。
NOであればデッドロックに陥らないので終了する。こ
の場合スレッド(2)が獲得しているロック変数はBで
あるのでYESとなり、s1203の処理へ行く。s1
203において、locking_var_queにス
レッド(2)が獲得しているロック変数すべて、この場
合はBを加える。s1204において、lock_va
rを獲得しているスレッドがあるかどうかを調べる。獲
得しているスレッドがないならばデッドロックに陥らな
いので処理を終了する。この場合は、lock_var
はAであるので、ロック情報テーブル(105)を走査
するとスレッド(1)が相当する。そこで有りとなり、
s1205においてlocking_threadにl
ock_varを獲得しているスレッド番号をいれる。
この場合1が入る。
【0036】s1206において、locking_t
hreadが獲得待ちしているロック変数があるかどう
かを調べる。獲得待ちしている、即ち解放されるのを待
っているロック変数がないならば、デッドロックに陥ら
ないので処理を終了する。この場合スレッド(1)は、
ロック変数Bを獲得待ちしているので有りとなり、s1
207において、lock_waitにlocking
_threadが獲得待ちしているロック変数をいれ
る。この場合lock_waitにはロック変数Bが入
る。s1208において、lock_waitはloc
king_var_queに入っているかどうかを調べ
る。s1203においてlocking_var_qu
eにロック変数Bを加えていたので、lock_wai
tのロック変数Bが入っていることになり、YESとな
る。YESならばs1210において、デッドロックが
発生すると判断し、デッドロック発生メッセージを表示
し終了する。また、s1208においてNOならば、s
1209においてthread=locking_th
readとし、またlock_var=lock_wa
itとし、そして再びs1202の処理へ行く。以上
が、2個のスレッドがデッドロックに陥る場合のデッド
ロック検出部(110)の処理の流れである。
【0037】次に3個以上のスレッドが、ロックを取り
あってデッドロックに陥る場合について説明する。図1
2(1)に、スレッド(1),スレッド(2),スレッ
ド(3)がロック変数を取り合っているときのディスプ
レイ表示を示す。図12(2)は、3個のスレッドがお
互いにロックを取り合っているときにスレッド(2)が
ロック変数Aの獲得待ち状態に入ると、デッドロックに
陥ることを示している。このとき、図11のデッドロッ
ク検出部(110)の処理の流れがどうなるかを述べ
る。s1201において、thread=スレッド
(2),lock_var=A,locking_va
r_que[ ] =empty,lock_var=n
ull,locking_thread=nullとす
る。
【0038】次にs1202において、スレッド(2)
が獲得しているロック変数が存在するかどうか調べる
と、ロック変数Bを獲得しているのでYESとなり、s
1203の処理へ行く。s1203において、スレッド
(2)が獲得しているロック変数を全てlocking
_var_queに加えるとBが入る。s1204にお
いて、ロック変数Aを獲得しているスレッドが有るかど
うかを調べると、スレッド(1)が獲得しているのであ
りとなる。そこで、s1205においてlocking
_threadにスレッド(1)のスレッド番号1を入
れる。次にs1206おいて、locking_thr
ead(スレッド(1))が獲得待ちしているロック変
数を調べると、ロック変数Cを獲得待ちしているので有
りとなり、s1207においてlock_waitにロ
ック変数Cを入れる。次にs1208において、loc
k_wait(ロック変数C)はlocking_va
r_que(ロック変数B)に入っていないのでNOと
なる。
【0039】s1209において、threadとlo
ck_varの値を更新する。つまり、threadに
スレッド(2)が入っていたものをlocking_t
hreadの値即ち、スレッド(1)に替える。loc
k_varにAが入っていたものを、lock_wai
tの値Cに変える。そしてs1202からの処理を再び
繰り返す。s1202においてスレッド(1)が獲得し
ているロック変数が存在するかを調べる。スレッド
(1)はロック変数Aを獲得しているのでYESとなる
ので、s1203へ行く。s1203において、loc
king_var_queにスレッド(1)が獲得して
いるロック変数Aを加える。するとlocking_v
ar_queには、先にスレッド(2)が獲得していた
ロック変数Bに加えてスレッド(1)が獲得しているロ
ック変数Aが加わり、BとAが値として入る。
【0040】次にs1204において、lock_va
r(C)を獲得しているスレッドがあるかどうかを調べ
ると、スレッド(3)となり有りとなる。そこで、s1
205においてlocking_threadにスレッ
ド(3)のスレッド番号3を入れる。次にs1206に
おいて、licking_threadが(スレッド
(3))が獲得待ちしているロック変数があるかどうか
を調べる。この場合ロック変数Bを獲得待ちしているの
でありとなり、s1207においてlock_wait
にBを入れる。s1208においてlock_wait
(B)はlocking_var_que(B,A)に
入っているかどうかを調べる。するとYESとなりs1
210において、デッドロックが発生すると判断しデッ
ドロック発生メッセージを表示し、処理を終了する。以
上が3個のスレッドでデッドロックに陥る場合の図11
における処理の流れである。
【0041】以上のように、この実施例ではロック変数
を獲得しようとしているスレッド自身がデッドロックに
陥るかどうを判断する、つまり自動的にデッドロックを
検出するデッドロック検出部(110)を持つ並列プロ
グラムトレース装置について述べた。
【0042】実施例4.上記実施例3における、デッド
ロックを検出するための処理手順に、デッドロックが発
生すると判断したら、それまで採取したトレースデータ
とロック情報をファイルにおとしてプログラムを終了す
る処理機能を付け加える。これにより、デッドロックが
発生する場合でもそれまで採取したトレースデータとロ
ック情報をえることができる。デッドロックが発生する
と判断したら、トレースデータとロック情報をファイル
に落してプログラムを終了する時は、図10における採
取時格納部(112)を使用する。この場合、図5のロ
ック情報テーブルの内容に、そのロックに関わる手続き
が記述されているソースファイル名とライン番号も付加
すると、デッドロックの発生箇所を限定することができ
る。ユーザはこのロック情報を基に、どの辺りでデッド
ロックが発生するのかを知ることができる。
【0043】実施例5.上記実施例においては、トレー
スデータを採取しているスレッドがデッドロックの検出
も行なっている。本実施例では、デッドロックの検出を
行なうスレッドを別にもつ場合について説明する。図1
3は、本実施例におけるブロック図である。上記実施例
3のブロック図10との違いはデッドロック検出用スレ
ッド生成部(114)とデッドロック検出スレッド(1
30)とスレッド終了テーブル(131)が加わった点
である。デッドロック検出部(110)はデッドロック
検出用スレッド生成部(114)で作られたデッドロッ
ク検出スレッド(130)だけが使用する。スレッド終
了テーブル(131)は、各スレッドの生成、実行、終
了、等を記憶しておくテーブルであり共有メモリ(11
5)上にある。デッドロックの検出用のスレッドの生成
は、測定用プログラム(103)の中で上記実施例1の
ような付加コードに加えて、デッドロックを検出するた
めのスレッドを新たに生成するコードも挿入すれば実現
することができる。このようにすると、各スレッド毎に
トレースデータとロック情報を採取すると同時に、デッ
ドロックを検出するスレッドを独立して実行することが
できる。各スレッド(1)〜(N)は、トレースデータ
とロック情報を共有メモリ上のテーブルに書き込み、デ
ッドロック検出スレッド(130)は、一定時間ごとに
ロック情報テーブルを走査してデッドロックが発生して
いないかどうかを調べる。
【0044】図13においてデッドロック検出スレッド
(130)は、他のスレッドと同一アドレス空間をアク
セスすることができるため、ロック情報テーブル(10
5)も共有している。各スレッド(1)〜(N)はトレ
ースデータ採取部(106)を呼び出しトレース情報
を、ロック情報採取部(108)を呼び出しロック情報
をそれぞれのテーブルに書き込んでいく。並行してデッ
ドロック検出スレッド(130)はロック情報テーブル
(105)を用いてデッドロックの検出をデッドロック
検出部(110)を呼び出し行なうことができる。
【0045】デッドロック検出用スレッドの処理手順の
一例を図14に示す。以下では、図14のデッドロック
検出スレッド(130)の処理の概略を説明する。トレ
ースが開始されると、デッドロック検出スレッド(13
0)は次の処理を繰り返す。スレッド終了テーブル(1
31)を見て他のスレッドの実行が終了したかどうかを
調べ(s1301)、終了していればトレース情報の採
取が正常終了していると判断し、終了時格納部(11
1)が採取したトレース情報とロック情報をファイルに
書き込み、プログラムを終了する(s1316)。実行
中のスレッドが存在する場合にはロック情報テーブル
(105)を走査し、実行中のスレッドすべてが待機状
態であるかどうか調べ(s1302)、実行中のスレッ
ドがすべて待機状態であるならばデッドロックに陥って
いると判断し、採取時格納部(112)は採取したトレ
ース情報とロック情報をファイルに書き込み、デッドロ
ック発生メッセージをディスプレイに表示しプログラム
を終了する(s1315)。待機状態でない実行中のス
レッドが存在するならば、s1303からs1315に
て順番に、各スレッドが解放される(unlock される)の
を待っているロック変数について実施例3のようにデッ
ドロックが発生しているかどうかを調べる。このような
処理を、トレースの正常終了を認識するか、あるいはデ
ッドロックを検出するまで続ける。
【0046】以上のように、この実施例ではデッドロッ
ク検出スレッドを持つ並列プログラムトレース装置につ
いて述べた。
【0047】
【発明の効果】本発明によれば、並列プログラムのトレ
ース実行中に、各スレッドのロックに関する情報を採取
し、ロック情報テーブルに書き込むので、ロック情報テ
ーブルの情報を解析することによりデッドロックを検出
することができる。
【0048】また、本発明によれば、任意の時刻に現時
点でのロック情報を表示することができるため、逐次表
示する場合に比べ、表示にかかるオーバヘッドを削減す
ることができる。
【0049】また、本発明によれば、トレースが正常に
終了した場合でも、ロック情報と例えばトレース情報を
ファイルに保存するため、タイミングによってはデッド
ロックが発生する箇所を検出することができるようにな
る。
【0050】また、本発明によれば、自動的にデッドロ
ックの検出を行うことができる。
【0051】また、本発明によれば、デッドロック検出
用の実行単位を生成することにより、自動的にデッドロ
ックの検出を行なうことができる。また、デッドロック
検出用の実行単位だけがデッドロックの検出を行うた
め、すべての実行単位でデッドロックの検出を行う場合
に比べ、オーバーヘッドを削減することができる。
【0052】また、デッドロック発生が原因でトレース
を中断したときにロック情報と例えばトレース情報をフ
ァイルに保存することができるため、ユーザはトレース
後に、採取した実行時情報からプログラムの一部を解析
することができ、どこでデッドロックが起こったかを解
析することもできるようになる。
【図面の簡単な説明】
【図1】 マルチスレッドを実現しているアドレス空間
を示す図である。
【図2】 本発明の一実施例の測定用プログラムを生成
する流れを示した図である。
【図3】 本発明によるトレースプログラム生成部の一
実施例の処理の流れを示した図である。
【図4】 本発明の一実施例における並列プログラムト
レース装置のブロック図である。
【図5】 本発明によるロック情報テーブルの一実施例
を示した図である。
【図6】 本発明による測定用ソースプログラムの一実
施例を示した図である。
【図7】 本発明によるロック情報のディスプレイ表示
の一例とデッドロックの解析図を示した図である。
【図8】 本発明の一実施例における並列プログラムト
レース装置のブロック図である。
【図9】 本発明の一実施例におけるシグナル処理方法
を示した図である。
【図10】 本発明の一実施例における並列プログラム
トレース装置のブロック図である。
【図11】 本発明によるデッドロック検出部の一実施
例の処理の流れを示した図である。
【図12】 3個のスレッドでデッドロックに陥る例を
示した図である。
【図13】 本発明の一実施例における並列プログラム
トレース装置のブロック図である。
【図14】 本発明による、デッドロック検出用スレッ
ドを生成したときのデッドロック検出部の一実施例の処
理の流れを示した図である。
【図15】 従来例の測定用ソースプログラムを生成す
る流れを示した図である。
【図16】 従来例の測定用プログラム生成装置内の処
理の流れを示した図である。
【図17】 従来例の並列プログラム用トレースプログ
ラム(スレッドプログラム)の実行形態を示した図であ
る。
【符号の説明】
10,11,12 スレッド、13 デッドロック検出
スレッド、101 被解析プログラム、102 トレー
スプログラム生成部、103 測定用プログラム、10
4 トレース情報格納領域、105 ロック情報テーブ
ル、106 トレースデータ採取部、107 情報格納
部、108 ロック情報採取部、109情報表示部、1
10 デッドロック検出部、111 終了時格納部、1
12採取時格納部、113 ロック情報表示部、114
デッドロック検出用スレッド生成部、115 共有メ
モリ、201 被解析ソースプログラム、202 測定
用プログラム生成装置、203 測定用ソースプログラ
ム。

Claims (6)

    【特許請求の範囲】
  1. 【請求項1】 複数の実行単位が並列に動作することが
    できる並列計算機において、トレース実行中に、各実行
    単位のロックに関する実行状態を書き込むためのロック
    情報テーブルを保持し、そのロック情報を採取するロッ
    ク情報採取手段を有する並列プログラムトレース装置。
  2. 【請求項2】 上記並列プログラムトレース装置におい
    て、任意の時刻に現時点でのロック情報を表示するため
    のロック情報表示手段を有することを特徴とする請求項
    1記載の並列プログラムトレース装置。
  3. 【請求項3】 上記並列プログラムトレース装置におい
    て、トレース終了後に採取した少なくともロック情報を
    ファイルに保存する終了時格納手段を有することを特徴
    とする請求項1記載の並列プログラムトレース装置。
  4. 【請求項4】 上記並列プログラムトレース装置におい
    て、各実行単位がロックをかけにいく場合にデッドロッ
    クに陥るかどうかを判断するデッドロック検出手段を有
    することを特徴とする請求項1記載の並列プログラムト
    レース装置。
  5. 【請求項5】 上記並列プログラムトレース装置におい
    て、デッドロックを検出するための実行単位を新たに生
    成するデッドロック検出用実行単位生成手段と、デッド
    ロック検出用実行単位は、デッドロックに陥っている実
    行単位があるかどうか判断するデッドロック検出手段を
    有することを特徴とする請求項1記載の並列プログラム
    トレース装置。
  6. 【請求項6】 上記並列プログラムトレース装置におい
    て、デッドロックを検出した時点で、少なくともロック
    情報をファイルに保存する採取時格納手段を有すること
    を特徴とする請求項1記載の並列プログラムトレース装
    置。
JP6144883A 1994-06-27 1994-06-27 並列プログラムトレース装置 Pending JPH0816430A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP6144883A JPH0816430A (ja) 1994-06-27 1994-06-27 並列プログラムトレース装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP6144883A JPH0816430A (ja) 1994-06-27 1994-06-27 並列プログラムトレース装置

Publications (1)

Publication Number Publication Date
JPH0816430A true JPH0816430A (ja) 1996-01-19

Family

ID=15372593

Family Applications (1)

Application Number Title Priority Date Filing Date
JP6144883A Pending JPH0816430A (ja) 1994-06-27 1994-06-27 並列プログラムトレース装置

Country Status (1)

Country Link
JP (1) JPH0816430A (ja)

Cited By (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2009032197A (ja) * 2007-07-30 2009-02-12 Fujitsu Microelectronics Ltd ソフトウェアのシミュレーション方法、ソフトウェアのシミュレーションのためのプログラム、及びソフトウェアのシミュレーション装置
JP2009187189A (ja) * 2008-02-05 2009-08-20 Nec Corp ストール検出装置、ストール検出方法、及びストール検出プログラム
JP2013127782A (ja) * 2004-09-14 2013-06-27 Synopsys Inc マルチコアアーキテクチャーにおけるデバッグ
CN103279417A (zh) * 2013-06-05 2013-09-04 福州瑞芯微电子有限公司 检测锁异常的方法与装置
JP2014119964A (ja) * 2012-12-17 2014-06-30 Hitachi Ltd 計算機システムおよびプログラム
JP2015075871A (ja) * 2013-10-08 2015-04-20 株式会社リコー 排他制御プログラム、情報処理装置、排他制御方法
JP2019219755A (ja) * 2018-06-15 2019-12-26 富士通株式会社 監視プログラム、監視方法、および並列処理装置
JP2021072074A (ja) * 2019-11-03 2021-05-06 ルネサスエレクトロニクス株式会社 半導体装置および半導体装置の制御方法
CN116225970A (zh) * 2023-05-08 2023-06-06 麒麟软件有限公司 一种多线程程序分析方法

Cited By (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2013127782A (ja) * 2004-09-14 2013-06-27 Synopsys Inc マルチコアアーキテクチャーにおけるデバッグ
JP2013239196A (ja) * 2004-09-14 2013-11-28 Synopsys Inc マルチコアアーキテクチャーにおけるデバッグ
JP2009032197A (ja) * 2007-07-30 2009-02-12 Fujitsu Microelectronics Ltd ソフトウェアのシミュレーション方法、ソフトウェアのシミュレーションのためのプログラム、及びソフトウェアのシミュレーション装置
JP2009187189A (ja) * 2008-02-05 2009-08-20 Nec Corp ストール検出装置、ストール検出方法、及びストール検出プログラム
JP2014119964A (ja) * 2012-12-17 2014-06-30 Hitachi Ltd 計算機システムおよびプログラム
CN103279417A (zh) * 2013-06-05 2013-09-04 福州瑞芯微电子有限公司 检测锁异常的方法与装置
JP2015075871A (ja) * 2013-10-08 2015-04-20 株式会社リコー 排他制御プログラム、情報処理装置、排他制御方法
JP2019219755A (ja) * 2018-06-15 2019-12-26 富士通株式会社 監視プログラム、監視方法、および並列処理装置
JP2021072074A (ja) * 2019-11-03 2021-05-06 ルネサスエレクトロニクス株式会社 半導体装置および半導体装置の制御方法
CN116225970A (zh) * 2023-05-08 2023-06-06 麒麟软件有限公司 一种多线程程序分析方法
CN116225970B (zh) * 2023-05-08 2023-08-04 麒麟软件有限公司 一种多线程程序分析方法

Similar Documents

Publication Publication Date Title
Edelstein et al. Framework for testing multi‐threaded Java programs
US7415699B2 (en) Method and apparatus for controlling execution of a child process generated by a modified parent process
Bielik et al. Scalable race detection for android applications
Edelstein et al. Multithreaded Java program test generation
US7752605B2 (en) Precise data-race detection using locksets
Xiong et al. Ad hoc synchronization considered harmful
Harrow Jr Runtime checking of multithreaded applications with visual threads
US7383538B2 (en) Storing and restoring snapshots of a computer process
US7185320B2 (en) System and method for processing breakpoint events in a child process generated by a parent process
US8392930B2 (en) Resource contention log navigation with thread view and resource view pivoting via user selections
Agarwal et al. Run-time detection of potential deadlocks for programs with locks, semaphores, and condition variables
US20090320021A1 (en) Diagnosis of application performance problems via analysis of thread dependencies
US20100318852A1 (en) Visualization tool for system tracing infrastructure events
Li et al. Pulse: A Dynamic Deadlock Detection Mechanism Using Speculative Execution.
JP2000235511A (ja) アプリケーションプログラムのパフォーマンス解析方法、アプリケーションプログラムのパフォーマンス解析に用いられるシステム及び装置
JPH0816430A (ja) 並列プログラムトレース装置
Hovemeyer et al. Finding concurrency bugs in java
Reiss The challenge of helping the programmer during debugging
US8046760B2 (en) Lock contention pinpointing
US6131109A (en) Multitask processor, a multitask processing method, a multitask processing display method and a storage medium for processing by correlating task and object
Ronsse et al. Non-intrusive on-the-fly data race detection using execution replay
KR20200077297A (ko) 멀티 프로세스/멀티 스레드에서 사용하는 공유 메모리에 대한 원자성 위반 결함 탐지 방법 및 장치
Reiss Event-based performance analysis
Lei et al. Uml activity diagram based testing of java concurrent programs for data race and inconsistency
Aumayr et al. Capturing high-level nondeterminism in concurrent programs for practical concurrency model agnostic record & replay