(57)【要約】【課題】シミュレーションプログラム間におけるデッドロックを回避することができるシミュレーションプログラム、シミュレーション装置及びシミュレーション方法を提供することを目的とする。【解決手段】他のシミュレーションプログラム１１と通信してシミュレーションを分散して実行するシミュレーションプログラム１２であって、コンピュータに、スケジューラから継続命令を受けると処理を再開し、一定時間経過したら処理を停止してスケジューラに停止を通知し、他のシミュレーションプログラムからデータの読み込み要求又は書き込み要求を受けると、データの読み込み要求又は書き込み要求を処理する処理実行単位２５を生成する処理を実行させ、生成された処理実行単位２５は、データの読み込み要求又は書き込み要求を処理することにより上記課題を解決する。【選択図】  図９
2012063872.tif 000002
【特許請求の範囲】
【請求項１】
スケジューラと他のシミュレーションプログラムと通信してシミュレーションを分散して実行するシミュレーションプログラムであって、
コンピュータに、
前記スケジューラから継続命令を受けると、処理を再開し、一定時間経過したら該処理を停止して前記スケジューラに停止を通知し、
前記他のシミュレーションプログラムからデータの読み込み要求又は書き込み要求を受けると、該データの読み込み要求又は書き込み要求を処理する処理実行単位を生成する、
処理を実行させ、
生成された前記処理実行単位は、前記データの読み込み要求又は書き込み要求を処理する、
シミュレーションプログラム。
【請求項２】
前記処理実行単位は、前記データの読み込み要求又は書き込み要求を終了すると、終了の通知を前記他のシミュレーションプログラムに通知する、
請求項１記載のシミュレーションプログラム。
【請求項３】
スケジューラと他のシミュレーションプログラムと通信してシミュレーションを分散して実行するシミュレーションプログラムであって、
コンピュータに、
前記スケジューラから継続命令を受けると、処理を再開し、一定時間経過したら該処理を停止して前記スケジューラに停止を通知し、
前記他のシミュレーションプログラムへデータの読み込み要求又は書き込み要求を発行するとき、該データの読み込み要求又は書き込み要求に識別子を付加して発行し、
前記他のシミュレーションプログラムからデータの読み込み要求又は書き込み要求の応答を受ける処理実行単位に、前記他のシミュレーションプログラムへ発行した前記データの読み込み要求又は書き込み要求と、該データの読み込み要求又は書き込み要求に付加した識別子との対応を通知し、
前記他のシミュレーションプログラムへ発行した前記データの読み込み要求又は書き込み要求と、該データの読み込み要求又は書き込み要求に付加した識別子との対応に応じて前記他のシミュレーションプログラムからデータの読み込み要求又は書き込み要求の応答を受けた処理実行単位から、前記他のシミュレーションプログラムへ発行した前記データの読み込み要求又は書き込み要求の処理が完了した旨を通知される
処理を実行させる、
シミュレーションプログラム。
【請求項４】
スケジューラと他のシミュレーションプログラムと通信してシミュレーションを分散して実行するシミュレーション装置であって、
前記スケジューラから継続命令を受けると、処理を再開し、一定時間経過したら該処理を停止して前記スケジューラに停止を通知する手段と、
前記他のシミュレーションプログラムからデータの読み込み要求又は書き込み要求を受けると、該データの読み込み要求又は書き込み要求を処理する処理実行単位を生成する手段とを有し、
生成された前記処理実行単位は、前記データの読み込み要求又は書き込み要求を処理する、
シミュレーション装置。
【請求項５】
スケジューラと他のシミュレーションプログラムと通信してシミュレーションを分散して実行するシミュレーション方法であって、
コンピュータが、
前記スケジューラから継続命令を受けると、処理を再開し、一定時間経過したら該処理を停止して前記スケジューラに停止を通知し、
前記他のシミュレーションプログラムからデータの読み込み要求又は書き込み要求を受けると、該データの読み込み要求又は書き込み要求を処理する処理実行単位を生成する、
処理を実行させ、
生成された前記処理実行単位は、前記データの読み込み要求又は書き込み要求を処理する、
シミュレーション方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は分散環境上で分散シミュレーションを実行するシミュレーションプログラム、シミュレーション装置及びシミュレーション方法に関する。
【背景技術】
【０００２】
例えば大規模なＬＳＩ回路システム全体をシミュレーションする場合は、ＬＳＩ回路システムを複数の部分に分割し、それぞれの部分をモデルとしてモデル化する。個々のモデルは、そのモデルが持つ抽象度に合ったシミュレーションプログラム（以下、単にＳＰという）を用いてシミュレーションされる。
【０００３】
モデルが持つ抽象度には、回路レベル、ＲＴレベル、Ｃレベルがある。回路レベルでは例えばSPICE（Simulation Program with Integrated Circuit Emphasis）と呼ばれるＳＰが用いられる。また、ＲＴレベルでは例えばVerilog Simulatorと呼ばれるＳＰが用いられる。また、Ｃレベルでは例えばSystemCと呼ばれるＳＰが用いられる。
【０００４】
複数のＳＰは互いに通信し合って時間やデータの同期（ＳＰ間通信）を行い、ＬＳＩ回路システム全体のシミュレーションを遂行するという、分散シミュレーション環境を構築する。
【０００５】
例えば同時実行制御方式のシミュレーション装置は従来から知られている。
【０００６】
また、実際の半導体集積回路の動作と同様の並列処理をシミュレーションすることができる半導体集積回路機能シミュレーション装置は従来から知れている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開平５−１０１０１５号公報
【特許文献２】特開２００４−２６５０５４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
ＳＰの種類と、ＳＰの提供ベンダとは、多岐に上る。このため、最小限の手間で互いのＳＰが通信する機構を実現することは、分散シミュレーション環境の早期立ち上げに貢献できる。分散シミュレーションの高速化技術の一つとして、Loosely-Timed Modelに基づくＳＰ間の非同期実行は従来から知られている。
【０００９】
しかし、SystemVerilogやSystemCのように分散シミュレーションを想定していないＳＰでは、デッドロックフリーなＳＰ間通信を実現するモデルを記述することが難しかった。デッドロックとは複数のＳＰが互いの処理終了を待ち、結果として処理が進まなくなることを言う。また、デットロックフリーとはデットロックにならないことを言う。
【００１０】
本発明の一実施形態は、シミュレーションプログラム間におけるデッドロックを回避できるシミュレーションプログラム、シミュレーション装置及びシミュレーション方法を提供することを目的とする。
【課題を解決するための手段】
【００１１】
上記課題を解決するため、本発明の一実施形態は、スケジューラと他のシミュレーションプログラムと通信してシミュレーションを分散して実行するシミュレーションプログラムであって、コンピュータに、前記スケジューラから継続命令を受けると、処理を再開し、一定時間経過したら該処理を停止して前記スケジューラに停止を通知し、前記他のシミュレーションプログラムからデータの読み込み要求又は書き込み要求を受けると、該データの読み込み要求又は書き込み要求を処理する処理実行単位を生成する、処理を実行させ、生成された前記処理実行単位は、前記データの読み込み要求又は書き込み要求を処理する、シミュレーションプログラムである。
【００１２】
なお、本発明の一実施形態の構成要素、表現又は構成要素の任意の組合せを、方法、装置、システム、コンピュータプログラム、記録媒体、データ構造などに適用したものも本発明の態様として有効である。
【発明の効果】
【００１３】
本発明の一実施形態によれば、シミュレーションプログラム間におけるデッドロックを回避できる。
【図面の簡単な説明】
【００１４】
【図１】分散シミュレーション環境の一例のシステム構成図である。
【図２】Loosely-Timed Modelに基づく分散シミュレーションの一例のタイムチャートである。
【図３】ＳＰのモデル構成を表した一例の模式図である。
【図４】図３のＳＰ１２のモデル構成において、ＳＰ１１からのCmdWriteDataコマンドをＳＰ１２のターゲットスレッド２４で処理する一例のタイムチャートである。
【図５】分散シミュレーション環境の一例のシステム構成図である。
【図６】スケジューラ又はＳＰを実行するコンピュータの一例のハードウェア構成図である。
【図７】ターゲットスレッドの動作を表す一実施例のタイムチャートである。
【図８】イニシエータスレッドの動作を表す一実施例のタイムチャートである。
【図９】本実施例の効果について説明する為のタイムチャートである。
【図１０】本実施例の効果について説明する為の模式図である。
【図１１】シミュレーションプロセスの構成を表した一例の説明図である。
【図１２】初期化スレッドの処理の一例のフローチャートである。
【図１３】ターゲットスレッドの処理の一例のフローチャートである。
【図１４】処理スレッドの処理の一例のフローチャートである。
【図１５】イニシエータスレッドの処理の一例のフローチャートである。
【図１６】終了処理スレッドの処理の一例のフローチャートである。
【図１７】Ｃレベルの関数を表した一例の構成図である。
【図１８】Ｃレベルの関数を表した一例の構成図である。
【図１９】Ｃレベルの関数を表した一例の構成図である。
【発明を実施するための形態】
【００１５】
次に、本発明を実施するための形態を、以下の実施例に基づき図面を参照しつつ説明していく。本実施例では、Loosely-Timed Modelに基づく分散シミュレーションに対応していないSystemVerilogやSystemCのようなＳＰに対して、ＳＰ間におけるデッドロックを回避するモデルを提供する。
【００１６】
図１は、分散シミュレーション環境の一例のシステム構成図である。図１に示した分散シミュレーション環境は、スケジューラ１０と複数のＳＰ１１〜１４とを有するように構成されている。複数のＳＰ１１〜１４は並列動作することで、ＬＳＩ回路システム全体のシミュレーションを実現するものである。
【００１７】
スケジューラ１０は、グローバルなシミュレーション時刻を管理する。スケジューラ１０は、各ＳＰ１１〜１４に対して、ＳＰ間通信機能を用いてシミュレーションの実行・停止を指示して、シミュレーション時刻の同期を司る。
【００１８】
各ＳＰ１１〜１４は、スケジューラ１０からの指示に従って、自分が管轄するモデルのシミュレーションを行う。各ＳＰ１１〜１４はシミュレーション中に他のＳＰとデータの読み書きが必要な場合、ＰｏｒｔというＳＰ間通信機能を使って他のＳＰとデータの授受を行う。例えば図１のＳＰ１１とＳＰ１２とはＰｏｒｔ＃０を使ってデータの授受を行うことができる。
【００１９】
図２はLoosely-Timed Modelに基づく分散シミュレーションの一例のタイムチャートである。スケジューラ１０は、ＳＰ１１、１２に対してQuantumと呼ばれるタイムスロット値を与え、ＳＰ１１、１２にQuantum期間分のシミュレーションを実行させる。なお、Quantum期間内でのイベント処理のスケジュールはＳＰ１１、１２の裁量に任されるため、シミュレーションの自由度が増す。結果として、Loosely-Timed Modelに基づく分散シミュレーションは高速化される。
【００２０】
スケジューラ１０の動作は、Quantum期間の最初でCmdContinueProc（シミュレーション継続命令）コマンドをＳＰ１１、１２に渡す。ＳＰ１１、１２はCmdContinueProcコマンドを受け取ったらシミュレーションをQuantum期間だけ進める。Quantum期間中、ＳＰ１１、１２は他のＳＰとデータの授受が必要な場合、CmdWriteData（データ書き込み要求）コマンドか、CmdReadData（データ読み込み要求）コマンドを発行する。
【００２１】
そして、ＳＰ１１、１２は、シミュレーション時刻がQuantum期間の最後になるとシミュレーションを一時停止させて、ResContinueProc（シミュレーション完了）をスケジューラ１０に通知する。スケジューラ１０は、全てのＳＰ１１、１２からResContinueProcが返ったことを確認後、グローバルなシミュレーション時刻を次のQuantum期間に進める。
【００２２】
ここでは、本実施例の理解を容易とするため、従来の問題について説明する。図３はＳＰのモデル構成を表した一例の模式図である。
【００２３】
ＳＰ１２はシミュレーションカーネル（ローカルスケジューラ）２１、ユーザモデル２２を有する。ユーザモデル２２はイニシエータスレッド２３、ターゲットスレッド２４を有する。従来のSystemVerilogやSystemCのようなＳＰは分散シミュレーションを考慮していない。
【００２４】
そこで、図３のＳＰ１２はシミュレーションカーネル２１に手を入れることが困難なことから、ＳＰ間通信機能をユーザモデル２２のイニシエータスレッド２３、ターゲットスレッド２４に組み込んでいる。
【００２５】
SystemVerilogやSystemCのようなＳＰ１２には、シミュレーション以外のホストＯＳ機能（socket()、send()、recv()等のTCP/IP通信関数）を呼び出す機能がある。本実施例のＳＰ１２ではホストＯＳ機能をイニシエータスレッド２３、ターゲットスレッド２４から呼び出すことを考える。
【００２６】
イニシエータスレッド２３は他のＳＰへ（CmdWriteData、CmdReadData）コマンドを発行する。また、ターゲットスレッド２４はスケジューラ１０へResContinueProcを通知する。
【００２７】
ターゲットスレッド２４はＳＰ間通信に使われる（CmdContinueProc、CmdWriteData、CmdReadData）コマンドを待つ必要がある。また、ＳＰ１２で実行されるシミュレーション上のイベントを待つ必要がある。
【００２８】
図４は図３のＳＰ１２のモデル構成において、ＳＰ１１からのCmdWriteDataコマンドをＳＰ１２のターゲットスレッド２４で処理する一例のタイムチャートである。ＳＰ１２はトランザクション処理に掛かるシミュレーション時間を予測不能とする。
【００２９】
図４ではＳＰ１２のトランザクション処理に時間が掛かり、与えられたQuantum期間内にトランザクション処理が終わらない例を表している。もし、与えられたQuantum期間をシミュレーション時刻が越えてしまうと、ＳＰ１２はResContinueProcをスケジューラ１０に返せなくなる危険性がある。スケジューラ１０にResContinueProcを返せなければ、ＳＰ１２は結果的に分散シミュレーションのデッドロックを引き起こす。
【００３０】
さらに、ＳＰ１１などの他のＳＰの動作を止めないため、ＳＰ１２はトランザクション処理中も後続のCmdWriteDataコマンドを受け付ける必要がある。トランザクション処理中も後続のCmdWriteDataコマンドを受け付けなければ、ＳＰ１２は、やはり分散シミュレーションのデッドロックを引き起こす。このように、従来、分散シミュレーションのＳＰ１２のターゲットスレッド２４のモデル記述は難しい問題を持っていた。
【００３１】
そこで、本実施例の分散シミュレーションのＳＰ１２ではターゲットスレッド２４とは別に、トランザクション処理を行うトランザクション処理スレッド（以下、処理スレッドと略称する）を設ける。ターゲットスレッド２４はスケジューラ１０及び他のＳＰからのＳＰ間通信の受信と、Quantum期間の管理とに専念させる。なお、本実施例は処理実行単位がスレッドの例を示しているが、処理実行単位がタスクであってもよい。
【００３２】
ターゲットスレッド２４は他のＳＰからCmdWriteDataコマンドかCmdReadDataコマンドを受け付けたら、処理スレッドを生成し、その処理スレッドにトランザクション処理を任せる。そして、ターゲットスレッド２４は後続のCmdWriteDataコマンドかCmdReadDataコマンドの受け付けに備える。
【００３３】
処理スレッドは、ターゲットスレッド２４に生成された後、ターゲットスレッド２４から要求されたトランザクション処理を行い、要求元の他のＳＰへ返答する。その後、処理スレッドは自身を終了させる。
【００３４】
イニシエータスレッド２３は他のＳＰへCmdWriteDataコマンドかCmdReadDataコマンドを発行する場合、CmdWriteDataコマンドかCmdReadDataコマンドにＩＤを付加して発行する。そして、イニシエータスレッド２３は発行したCmdWriteDataコマンドかCmdReadDataコマンドの情報と、そのCmdWriteDataコマンドかCmdReadDataコマンドに付加したＩＤとを対応付け、ターゲットスレッド２４に通知する。ターゲットスレッド２４はイニシエータスレッド２３の発行したCmdWriteDataコマンドかCmdReadDataコマンドの情報と、そのCmdWriteDataコマンドかCmdReadDataコマンドに付加したＩＤとを対応付けてテーブルに記憶する。
【００３５】
ターゲットスレッド２４は他のＳＰからのCmdWriteDataコマンドかCmdReadDataコマンドの返答を一旦、受け取る。ターゲットスレッド２４はテーブルを参照し、返答に記載されたＩＤに対応するCmdWriteDataコマンドかCmdReadDataコマンドの情報を得る。
【００３６】
そして、ターゲットスレッド２４は得た情報を元に、CmdWriteDataコマンドかCmdReadDataコマンドを発行したイニシエータスレッド２３にCmdWriteDataコマンドかCmdReadDataコマンドが完了した旨の通知を行う。また、CmdReadDataコマンドの返答（ResReadData）場合、ターゲットスレッド２４は、指定された領域に読み込み結果のデータを格納する。
【００３７】
（システム構成）
図５は分散シミュレーション環境の一例のシステム構成図である。図５のシステムはスケジューラ用コンピュータ３０と複数のシミュレーション用コンピュータ３１〜３３とがインターネットやＬＡＮ（Local Area Network：構内通信網）等のネットワーク３４を介してデータ通信可能に接続されている。
【００３８】
スケジューラ用コンピュータ３０はスケジューラ１０を実行する。シミュレーション用コンピュータ３１〜３３は、例えばＳＰ１１〜１４を実行する。なお、図５のシステムは３台のシミュレーション用コンピュータ３１〜３３の例を表しているが、３台以外の構成であってもよい。また、図５のシステムは仮想化プラットフォームを利用し、仮想化されたコンピュータ上でスケジューラ１０及びＳＰ１１〜１４を実行することにより実現してもよい。
【００３９】
（ハードウェア構成）
図６は、スケジューラ又はＳＰを実行するコンピュータの一例のハードウェア構成図である。図６のコンピュータは、バスＢで相互に接続されている入力装置４１，出力装置４２，ドライブ装置４３，補助記憶装置４４，主記憶装置４５，演算処理装置４６及びインターフェース装置４７を有する。
【００４０】
入力装置４１はキーボードやマウス等である。入力装置４１は、各種信号を入力するために用いられる。出力装置４２はディスプレイ装置等である。出力装置４２は、各種ウインドウやデータ等を表示するために用いられる。インターフェース装置４７は、モデム又はＬＡＮカード等である。インターフェース装置４７は、ネットワーク３４に接続する為に用いられる。
【００４１】
本実施例のスケジューラ１０は、スケジューラ用コンピュータ３０を制御する各種プログラムの少なくとも一部である。本実施例のＳＰ１１〜１４は、シミュレーション用コンピュータ３１〜３３を制御する各種プログラムの少なくとも一部である。スケジューラ１０及びＳＰ１１〜１４は例えば記録媒体４８の配布やネットワーク３４からダウンロードすることによって提供される。スケジューラ１０及びＳＰ１１〜１４を記録した記録媒体４８はＣＤ−ＲＯＭ、フレキシブルディスク、光磁気ディスク等の様に情報を光学的，電気的或いは磁気的に記録する記録媒体、ＲＯＭ、フラッシュメモリ等の様に情報を電気的に記録する半導体メモリ等、様々なタイプの記録媒体を用いることができる。
【００４２】
スケジューラ１０を記録した記録媒体４８がドライブ装置４３にセットされると、スケジューラ１０は、記録媒体４８からドライブ装置４３を介して補助記憶装置４４にインストールされる。なお、ネットワーク３４からダウンロードされたスケジューラ１０はインターフェース装置４７を介して、補助記憶装置４４にインストールされる。補助記憶装置４４はインストールされたスケジューラ１０を格納すると共に、必要なファイル，データ等を格納する。
【００４３】
主記憶装置４５は、スケジューラ１０の起動時に補助記憶装置４４からスケジューラ１０を読み出して格納する。演算処理装置４６は主記憶装置４５に格納されたスケジューラ１０に従って、後述するような各種処理を実現している。
【００４４】
ＳＰ１１〜１４を記録した記録媒体４８がドライブ装置４３にセットされると、ＳＰ１１〜１４は記録媒体４８からドライブ装置４３を介して補助記憶装置４４にインストールされる。ネットワーク３４からダウンロードされたＳＰ１１〜１４は、インターフェース装置４７を介して、補助記憶装置４４にインストールされる。補助記憶装置４４はインストールされたＳＰ１１〜１４を格納すると共に、必要なファイル，データ等を格納する。
【００４５】
主記憶装置４５は、ＳＰ１１〜１４の起動時に補助記憶装置４４からＳＰ１１〜１４を読み出して格納する。演算処理装置４６は主記憶装置４５に格納されたＳＰ１１〜１４に従って、後述するような各種処理を実現している。
【００４６】
（処理手順）
図７はターゲットスレッドの動作を表す一実施例のタイムチャートである。図７は２つのＳＰ１１、１２の例を表している。まず、ステップＳ１において、スケジューラ１０はＳＰ１１、１２に対してCmdContinueProcコマンドを渡す。CmdContinueProcコマンドを受け取ったＳＰ１１、１２はシミュレーションをQuantum期間だけ進める。
【００４７】
ステップＳ２において、イニシエータプロセスであるＳＰ１１はCmdReadDataコマンドをターゲットプロセスであるＳＰ１２に対して発行する。CmdReadDataコマンドを発行した後、ＳＰ１１はステップＳ３に進み、ブロックされる。ここで、ブロックとは発行したCmdReadDataコマンドが完了するまで制御が戻らないことをいう。
【００４８】
ステップＳ４において、ＳＰ１２のターゲットスレッド２４はコールバックルーティンのための処理スレッド２５を生成することで、処理スレッド２５にトランザクション処理を任せる。ステップＳ５において、処理スレッド２５はCmdReadDataコマンドのコールバックルーティンを実行する。
【００４９】
もし、シミュレーション時刻がQuantum期間の最後になると、イニシエータプロセスであるＳＰ１１及びターゲットプロセスであるＳＰ１２のターゲットスレッド２４はステップＳ６において、ResContinueProcをスケジューラ１０に通知する。スケジューラ１０はステップＳ７において、全てのＳＰ（図７の例ではＳＰ１１、１２）に対して、次のQuantum期間のCmdContinueProcコマンドを渡す。
【００５０】
ステップＳ８において、コールバックルーティンが終了したあと、処理スレッド２５はイニシエータプロセスであるＳＰ１１に対して、CmdReadDataコマンドの返答である応答パケット（ResReadData）を返す。その後、処理スレッド２５はステップＳ９において自身を終了させる。
【００５１】
シミュレーション時刻がQuantum期間の最後になると、イニシエータプロセスであるＳＰ１１及びターゲットプロセスであるＳＰ１２のターゲットスレッド２４はステップＳ１０において、ResContinueProcをスケジューラ１０に通知する。
【００５２】
図８はイニシエータスレッドの動作を表す一実施例のタイムチャートである。図８は２つのＳＰ１１、１２の例を表している。まず、ステップＳ２１において、スケジューラ１０はＳＰ１１、１２に対してCmdContinueProcコマンドを渡す。CmdContinueProcコマンドを受け取ったＳＰ１１、１２はシミュレーションをQuantum期間だけ進める。
【００５３】
ステップＳ２２において、ＳＰ１２のイニシエータスレッド２３はＩＤを付加したCmdReadDataコマンドをＳＰ１１に対して発行する。さらに、ＳＰ１２のイニシエータスレッド２３は発行したCmdReadDataコマンドのコマンドパケットの情報と、そのCmdReadDataコマンドに付加したＩＤとを対応付け、ターゲットスレッド２４に通知する。ステップＳ２３において、ターゲットスレッド２４はCmdReadDataコマンドのコマンドパケットの情報と、そのCmdReadDataコマンドに付加したＩＤとを対応付けてリクエストテーブルに登録する。なお、CmdReadDataコマンドをＳＰ１１に対して発行したあと、ＳＰ１２のイニシエータスレッド２３はステップＳ２４において、ブロックされる。
【００５４】
ステップＳ２５において、ターゲットプロセスであるＳＰ１１はCmdReadDataコマンドを受け付けると、コールバックルーティンを呼び出し、コールバックルーティンを実行する。もし、シミュレーション時刻がQuantum期間の最後になると、ターゲットプロセスであるＳＰ１１及びイニシエータプロセスであるＳＰ１２のターゲットスレッド２４はステップＳ２６において、ResContinueProcをスケジューラ１０に通知する。スケジューラ１０はステップＳ２７において、全てのＳＰ（図８の例ではＳＰ１１、１２）に対して、次のQuantum期間のCmdContinueProcコマンドを渡す。
【００５５】
ステップＳ２８において、コールバックルーティンが終了したあと、ターゲットプロセスであるＳＰ１１はイニシエータプロセスであるＳＰ１２のターゲットスレッド２４に対して応答パケット（ResReadData）を返す。ターゲットスレッド２４は、ステップＳ２９において、応答パケットに記載されたＩＤに基づき、リクエストテーブルに登録されたコマンドパケットの情報から一致するものを見付ける。
【００５６】
ステップＳ３０において、ＳＰ１２のターゲットスレッド２４はCmdReadDataコマンドが完了した旨と、ブロックされた状態から戻る旨とをイニシエータスレッド２３に通知する。ターゲットスレッド２４からの通知により、イニシエータスレッド２３はブロックされた状態から元の状態に戻る。
【００５７】
シミュレーション時刻がQuantum期間の最後になると、ターゲットプロセスであるＳＰ１１及びイニシエータプロセスであるＳＰ１２のターゲットスレッド２４はステップＳ３１において、ResContinueProcをスケジューラ１０に通知する。
【００５８】
図９は本実施例の効果について説明する為のタイムチャートである。本実施例のＳＰ１２ではターゲットスレッド２４と処理スレッド２５とを分離して動作させるため、トランザクション処理に時間が掛かる場合でも、常にターゲットスレッド２４で他のＳＰ（図９の例ではＳＰ１１）からのCmdWriteData（データ書き込み要求）コマンド又はCmdReadData（データ読み込み要求）コマンドを受け付けることが可能となる。
【００５９】
図９の例では「データ１読み込み要求」のトランザクション処理中であっても「データ２読み込み要求」をターゲットスレッド２４で受け付けることができる。すなわち、ＳＰ１１が発行するCmdWriteDataコマンド又はCmdReadDataコマンドなどのトランザクション要求はＳＰ１２によって待たされることが無い。また、トランザクションの返答であるトランザクション応答は、処理スレッド２５での実行によってＳＰ１１が確実に受け取れる。したがって、分散シミュレーションはデッドロックに陥る危険性が大幅に少なくなる。
【００６０】
図１０は本実施例の効果について説明する為の模式図である。例えば図１０のＳＰ１２特有の処理は、トランザクション処理用のコールバックルーティン２６にカプセル化することが可能である。
【００６１】
ＳＰ１２特有の処理をコールバックルーティン２６にカプセル化できるため、図１０のＳＰ１２はＳＰ毎にターゲットスレッド２４を記述し直すことなく、ターゲットスレッド２４にＳＰ間通信の受信と、Quantum期間の管理とに専念させて、ＳＰ間通信に起因するデッドロックを回避できる。
【実施例１】
【００６２】
シミュレーションプロセスは、図１１に示すような、初期化スレッド２７、ターゲットスレッド２４、処理スレッド２５、イニシエータスレッド２３、終了処理スレッド２８の５つのパーツから成り立つ。図１１はシミュレーションプロセスの構成を表した一例の説明図である。なお、図１１に示したターゲットスレッド２４、処理スレッド２５、イニシエータスレッド２３はシミュレーションプロセスで並行して実行される。
【００６３】
初期化スレッド２７は後述のプロキシサーバへ接続する。ターゲットスレッド２４はターゲットデバイスとして動作し、受け付けるパケットの全てを取り扱う。処理スレッド２５はコールバックルーティン２６を実行する為のスレッドとして、ターゲットスレッド２４により生成される。
【００６４】
イニシエータスレッド２３はイニシエータデバイスとして動作し、CmdWriteDataコマンド又はCmdReadDataコマンドのコマンドパケットを送る。終了処理スレッド２８は後述のプロキシサーバとの接続を終了する。
【００６５】
なお、以下の実施例の説明ではデータ構造の一例として、Ｃレベルのデータ構造を例として説明する。本実施例ではデータ構造としてパケット（Packet）、ソケット（Socket）及びポート（Port）を利用している。
【００６６】
実際のパケットはPacket_CmdXXXまたはPacket_ResYYYのようなパケットタイプに特有の構造を有している。しかし、全てのパケットはデータ要素が同じくセットされたパケットヘッダを有するため、パケットヘッダを利用することで全てのパケットのポインタを照会できる。
【００６７】
それぞれのシミュレーションプロセスは、ただ一つのソケットを持つ。入ってくるパケットの全てはソケットに到着する。スケジューラ１０に対して出て行くパケットの全てもソケットが使われる。ソケットは一つ以上のポートを持つ。CmdWriteDataコマンド又はCmdReadDataコマンドのコマンドパケットはポートから送られる。
【００６８】
図１２は初期化スレッドの処理の一例のフローチャートである。ステップＳ５１では初期化スレッド２７がスケジューラ１０とのコネクションをオープンする。具体的に、初期化スレッド２７はＯｐｅｎ関数を用いてソケットを生成する。Ｏｐｅｎ関数には引数としてproxyServer及びtcpPortを指定する。例えば初期化スレッド２７はproxyServerにスケジューラ１０を指定し、tcpPortにスケジューラ１０のＴＣＰポートを指定することによりスケジューラ１０とのコネクションをオープンできる。
【００６９】
ステップＳ５２では初期化スレッド２７が、データを読み／書きする為のポートを生成する。具体的に、初期化スレッド２７はＮｅｗＰｏｒｔ関数を用いてデータを読み／書きする為のポートを生成する。ＮｅｗＰｏｒｔ関数には引数としてsocket及びConnNameを指定する。例えば初期化スレッド２７はsocketにステップＳ５１で生成したソケットを指定し、ConnNameに接続名を指定することによりポートを生成できる。
【００７０】
それぞれのポートにはConnNameにより指定された接続名が与えられる。ConnNameにより指定された接続名は、全てのシミュレーションプロセスの中の１つとグローバルに結び付けるため、同じ接続名のポートとなる。同じ接続名のポートはスケジューラ１０によって接続される。
【００７１】
ステップＳ５３では初期化スレッド２７がシミュレーションプロセスに処理の開始を準備させる。具体的に、初期化スレッド２７はＳｔａｒｔＰｒｏｃ関数を用いてシミュレーションプロセスに処理の開始を準備させる。ＳｔａｒｔＰｒｏｃ関数には引数としてsocketを指定する。例えば初期化スレッド２７はsocketにステップＳ５１で生成したソケットを指定することにより、シミュレーションプロセスに処理の開始を準備させることができる。なお、シミュレーションプロセスのポートの情報はスケジューラ１０に通知される。この後、シミュレーションプロセスはCmdContinueProcコマンドをスケジューラ１０から受信すると、ResStartProcを送り返したあと、処理を開始できる。
【００７２】
図１３はターゲットスレッドの処理の一例のフローチャートである。図１３の処理は初期化スレッド２７による初期化のあと、繰り返し行われる。
【００７３】
ステップＳ６１に進み、ターゲットスレッド２４はブロッキングの方法でパケットの受信を待つ。具体的に、ターゲットスレッド２４はＲｅｃｖＰａｃｋｅｔ関数を用いて、ブロッキングの方法でsocketからパケットの受信を待つ。ＲｅｃｖＰａｃｋｅｔ関数には引数としてsocket及びブール変数blockingを指定する。
【００７４】
例えばターゲットスレッド２４はsocketにステップＳ５１で生成したソケットを指定し、ブール変数blockingにtrueを指定することにより、指定したソケットにパケットが来るまでブロッキングの方法で待つことができる。
【００７５】
ステップＳ６２において、ターゲットスレッド２４は指定したソケットに来たパケットのパケットタイプがコマンドパケットか否かを判定する。コマンドパケットであると判定すると、ターゲットスレッド２４はステップＳ６３に進み、指定したソケットに来たコマンドパケットを受け取り、そのコマンドパケットのパケットタイプがCmdContinueProcコマンドか否かを判定する。
【００７６】
CmdContinueProcコマンドであると判定すると、ターゲットスレッド２４はステップＳ６４に進み、remain_timeを求める。remain_timeはCmdContinueProcコマンドを受信した次のQuantum期間の開始時刻から現在のシミュレーション時刻を引くことで算出できる。
【００７７】
ステップＳ６５に進み、ターゲットスレッド２４は、シミュレーション時刻を例えばステップＳ６４で算出したremain_timeだけ待ったあとで進ませる。ステップＳ６６に進み、ターゲットスレッド２４はResContinueProcをスケジューラ１０に通知する。具体的に、ターゲットスレッド２４はＳｅｎｄ＿ＲｅｓＣｏｎｔｉｎｕｅＰｒｏｃ関数を用いてResContinueProcをスケジューラ１０に通知する。Ｓｅｎｄ＿ＲｅｓＣｏｎｔｉｎｕｅＰｒｏｃ関数には引数としてsocketを指定する。例えばターゲットスレッド２４はsocketにステップＳ５１で生成したソケットを指定することによりResContinueProcをスケジューラ１０に通知できる。
【００７８】
ステップＳ６７に進み、ターゲットスレッド２４は指定したソケットに来たパケットを削除する。具体的に、ターゲットスレッド２４はＤｅｌＰａｃｋｅｔ関数を用いて、指定したソケットに来たパケットを削除する。ＤｅｌＰａｃｋｅｔ関数には引数としてPacketを指定する。例えばターゲットスレッド２４はPacketに、指定したソケットに来たパケット（rpkt）を指定することで、指定したソケットに来たパケットを削除すると共に、そのパケットに割り当てたメモリを解放する。
【００７９】
ステップＳ６３においてCmdContinueProcコマンドでないと判定すると、ターゲットスレッド２４は指定したソケットに来たパケット（rpkt）の為の処理スレッド２５を生成する。
【００８０】
ステップＳ６２において、コマンドパケットでないと判定すると、ターゲットスレッド２４はステップＳ６８に進み、指定したソケットに来た応答パケットを受け取り、その応答パケットが、イニシエータスレッド２３によって送られたコマンドパケットと一致するかを調べる。
【００８１】
具体的に、ターゲットスレッド２４はＦｉｎｄＰａｃｋｅｔＥｎｔｒｙ関数を用いることで、応答パケットが、イニシエータスレッド２３によって送られたコマンドパケットと一致するかを調べる。ＦｉｎｄＰａｃｋｅｔＥｎｔｒｙ関数は引数としてsocket及びpacketIdを指定する。
【００８２】
例えばターゲットスレッド２４はsocketにステップＳ５１で生成したソケットを指定し、packetIdに応答パケットに記載されたＩＤを指定することで、リクエストテーブルから応答パケットに一致するコマンドパケットの登録を見つけることができる。
【００８３】
そして、ステップＳ６９に進み、ターゲットスレッド２４は応答パケットのための処理を行う。ステップＳ７０に進み、ターゲットスレッド２４はリクエストテーブルから応答パケットに一致するコマンドパケットの情報の登録を削除する。具体的に、ターゲットスレッド２４はＤｅｌＰａｃｋｅｔＥｎｔｒｙ関数を用いることで、リクエストテーブルから応答パケットに一致するコマンドパケットの情報の登録を削除する。
【００８４】
ＤｅｌＰａｃｋｅｔＥｎｔｒｙ関数は引数としてsocket及びent0を指定する。例えばターゲットスレッド２４はsocketにステップＳ５１で生成したソケットを指定し、ent0にステップＳ６８で見つけた登録（エントリ）を指定することで、リクエストテーブルから応答パケットに一致するコマンドパケットの情報の登録を削除できる。
【００８５】
ステップＳ７１に進み、ターゲットスレッド２４は指定したソケットに来たパケットをステップＳ６７と同様に削除する。ステップＳ７２に進み、ターゲットスレッド２４はトランザクション処理の終了をイニシエータスレッド２３に通知する。
【００８６】
図１４は、処理スレッドの処理の一例のフローチャートである。ステップＳ８１ではブロッキングされたトランザクションのコールバックルーティンの処理命令により、コールバックルーティンが処理スレッド２５で実行される。処理スレッド２５はターゲットスレッド２４により受信されたパケット（rpkt）をパスされる。
【００８７】
ステップＳ８２に進み、処理スレッド２５はパケット（rpkt）に対応するポートを得てport1とする。ステップＳ８３に進み、処理スレッド２５は応答パケットタイプの新しいパケット（spkt）を生成する。具体的に、処理スレッド２５はＮｅｗＰａｃｋｅｔ関数を用いて応答パケットタイプの新しいパケット（spkt）を生成する。ＮｅｗＰａｃｋｅｔ関数には引数としてPacketTypeを指定する。例えば処理スレッド２５はPacketTypeにResPacketTypeを指定することにより応答パケットタイプの新しいパケット（spkt）を生成できる。
【００８８】
ステップＳ８４に進み、処理スレッド２５は新しいパケット（spkt）に記載させるpacketIdを、パケット（rpkt）からコピーしたpacketIdとする。つまり、処理スレッド２５はパケット（rpkt）及びパケット（spkt）に記載させるpacketIdを同じにする。
【００８９】
ステップＳ８５に進み、処理スレッド２５は新しいパケット（spkt）をport１から送信する。具体的に、処理スレッド２５はＳｅｎｄＰａｃｋｅｔ関数を用いることで新しいパケット（spkt）をport１から送信できる。ＳｅｎｄＰａｃｋｅｔ関数は引数としてport及びpacketを指定する。処理スレッド２５はportにport1を指定し、packetに新しいパケット（spkt）を指定することで、新しいパケット（spkt）をport１から送信できる。
【００９０】
ステップＳ８６に進み、ターゲットスレッド２４は新しいパケット（spkt）をステップＳ６７と同様に削除する。また、ステップＳ８７に進み、ターゲットスレッド２４はターゲットスレッド２４により受信されたパケット（rpkt）をステップＳ６７と同様に削除する。
【００９１】
図１５はイニシエータスレッドの処理の一例のフローチャートである。イニシエータスレッド２３は、シミュレーションプロセスが他のシミュレーションプロセスとデータの読み書きが必要なとき、CmdWriteDataコマンド又はCmdReadDataコマンドのコマンドパケットの情報を送信する。
【００９２】
初期化スレッド２７による初期化のあと、イニシエータスレッド２３はステップＳ９１に進み、コマンドパケットタイプの新しいパケット（spkt2）を生成する。具体的に、イニシエータスレッド２３はＮｅｗＰａｃｋｅｔ関数を用いてコマンドパケットタイプの新しいパケット（spkt2）を生成する。ＮｅｗＰａｃｋｅｔ関数には引数としてPacketTypeを指定する。例えばイニシエータスレッド２３はPacketTypeにCmdPacketTypeを指定することによりコマンドパケットタイプの新しいパケット（spkt2）を生成できる。
【００９３】
ステップＳ９２に進み、イニシエータスレッド２３は新しいパケット（spkt2）をport2から送信する。具体的に、イニシエータスレッド２３は、ＳｅｎｄＰａｃｋｅｔ関数を用いることでステップＳ８５と同様、新しいパケット（spkt2）をport2から送信できる。
【００９４】
ステップＳ９３に進み、イニシエータスレッド２３は新しいパケット（spkt2）を送信したあと、パケットエントリテーブルに登録する。このため、ターゲットスレッド２４は一致する応答パケットを待つことができる。具体的に、イニシエータスレッド２３はＡｄｄＰａｃｋｅｔＥｎｔｒｙ関数を用いて、新しいパケット（spkt2）をパケットエントリテーブルに登録する。ＡｄｄＰａｃｋｅｔＥｎｔｒｙ関数は引数としてsocket及びPacketIdを指定する。
【００９５】
例えばイニシエータスレッド２３はsocketにステップＳ５１で生成したソケットを指定し、PacketIdに新しいパケット（spkt2）のPacketIdを指定することにより、新しいパケット（spkt2）をパケットエントリテーブルに登録できる。
【００９６】
ステップＳ９４に進み、イニシエータスレッド２３はパケットエントリテーブルのent2に登録されたパケットをspkt2とする。ステップＳ９５に進み、イニシエータスレッド２３はイベントがあるまで待機する。ステップＳ９６に進み、イニシエータスレッド２３はステップＳ８６と同様、新しいパケット（spkt2）を削除する。
【００９７】
図１６は終了処理スレッドの処理の一例のフローチャートである。ステップＳ１００において、終了処理スレッド２８はプロキシサーバとのコネクションをクローズし、割り当てていたリソースを開放する。具体的に、終了処理スレッド２８はＣｌｏｓｅ関数を用いてコネクションのクローズ、リソースの開放を行う。Ｃｌｏｓｅ関数には引数としてsocketを指定する。例えば終了処理スレッド２８はsocketにステップＳ５１で生成したソケットを指定することにより、プロキシサーバとの間にオープンしてソケット、全てのポートをクローズできる。
【００９８】
図１２〜図１６に示したフローチャートの処理では様々な関数が利用されている。例えば関数はＡＰＩ（Application Program Interface）として提供される。ここでは一例としてＣレベルの関数を図１７〜図１９に、参考として示しておく。図１７〜図１９はＣレベルの関数を表した一例の構成図である。
【００９９】
本実施例におけるシミュレーションプログラムはパッケージソフトの他、ＷＥＢサービス等によっても提供可能である。
【０１００】
本発明は、具体的に開示された実施例に限定されるものではなく、特許請求の範囲から逸脱することなく、種々の変形や変更が可能である。なお、特許請求の範囲に記載した処理実行単位はスレッドやタスク等である。
【符号の説明】
【０１０１】
１０    スケジューラ
１１〜１４    シミュレーションプログラム（ＳＰ）
２１    シミュレーションカーネル（ローカルスケジューラ）
２２    ユーザモデル
２３    イニシエータスレッド
２４    ターゲットスレッド
２５    処理スレッド
２６    コールバックルーティン
２７    初期化スレッド
２８    終了処理スレッド
３０    スケジューラ用コンピュータ
３１〜３３    シミュレーション用コンピュータ
３４    ネットワーク
４１    入力装置
４２    出力装置
４３    ドライブ装置
４４    補助記憶装置
４５    主記憶装置
４６    演算処理装置
４７    インターフェース装置
４８    記録媒体
Ｂ    バス
【図１】
2012063872.tif 000003
【図２】
2012063872.tif 000004
【図３】
2012063872.tif 000005
【図４】
2012063872.tif 000006
【図５】
2012063872.tif 000007
【図６】
2012063872.tif 000008
【図７】
2012063872.tif 000009
【図８】
2012063872.tif 000010
【図９】
2012063872.tif 000011
【図１０】
2012063872.tif 000012
【図１１】
2012063872.tif 000013
【図１２】
2012063872.tif 000014
【図１３】
2012063872.tif 000015
【図１４】
2012063872.tif 000016
【図１５】
2012063872.tif 000017
【図１６】
2012063872.tif 000018
【図１７】
2012063872.tif 000019
【図１８】
2012063872.tif 000020
【図１９】
2012063872.tif 000021