(57)【特許請求の範囲】
【請求項１】
複数のプロセッサと、
前記複数のプロセッサがアクセス可能な記憶装置と、
を有し、
前記複数のプロセッサの各々は、
当該プロセッサが実行するプログラムのうち実行中の命令が配置されている、前記記憶装置上の領域を示す情報を、当該命令の実行時に前記記憶装置に保存し、
前記複数のプロセッサのうち第１プロセッサは、
前記複数のプロセッサのうち第２プロセッサがハングアップした場合、前記第２プロセッサによって前記記憶装置に保存された前記情報に基づき、ハングアップした時に実行されていた命令が配置されている領域を特定し、
特定した前記領域に配置されている前記命令を、特定の割込みを発生させる命令に書き換え、
前記第２プロセッサは、
前記特定の割込みを発生させる命令を実行することによって発生した前記特定の割込みに応じてハングアップ状態を解除する、
処理を実行する情報処理システム。
【請求項２】
前記情報は、前記実行中の命令を含む関数の先頭アドレス及び当該関数のサイズの情報とを含む、
請求項１記載の情報処理システム。
【請求項３】
前記複数のプロセッサのうち第３プロセッサが、
前記第２プロセッサとの間で実行する同期処理が完了しない場合、前記第１プロセッサに、前記第２プロセッサがハングアップしたことを通知する、
処理をさらに実行する請求項１又は２記載の情報処理システム。
【請求項４】
前記複数のプロセッサの各々は、
メインルーチンの開始時及び関数への遷移時に、当該関数の先頭アドレス及び当該関数のサイズの情報を前記記憶装置に保存する、
請求項２記載の情報処理システム。
【請求項５】
プロセッサが、
他のプロセッサがハングアップした場合、前記他のプロセッサによって記憶装置に保存された、前記他のプロセッサが実行するプログラムのうち実行中の命令が配置されている前記記憶装置上の領域を示す情報に基づき、ハングアップした時に実行されていた命令が配置されている領域を特定し、
特定した前記領域に配置されている前記命令を、特定の割込みを発生させる命令に書き換える、
処理を実行する実行制御方法。
【請求項６】
プロセッサに、
他のプロセッサがハングアップした場合、前記他のプロセッサによって記憶装置に保存された、前記他のプロセッサが実行するプログラムのうち実行中の命令が配置されている前記記憶装置上の領域を示す情報に基づき、ハングアップした時に実行されていた命令が配置されている領域を特定し、
特定した前記領域に配置されている前記命令を、特定の割込みを発生させる命令に書き換える、
処理を実行させる実行制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチプロセッサシステムの実行制御技術に関する。
【背景技術】
【０００２】
マルチプロセッサシステムにおける複数のプロセッサの試験においては、各プロセッサに試験プログラムを実行させることで、各プロセッサが正常に動作しているか否かが確認される。
【０００３】
複数のプロセッサが同期をとりながら試験プログラムの実行を進める場合、或るプロセッサがハングアップすると、他のプロセッサはハングアップしたプロセッサとの間で同期をとることができない。他のプロセッサは同期ポイントにおいて、タイムアウトとしてハングアップしたプロセッサを検知することはできるが、ハングアップ状態を解除できない。
【０００４】
このような問題に対して適切に対処可能な従来技術は知られていない。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平８−２５５０９１号公報
【特許文献２】特開平９−６９０８２号公報
【特許文献３】特開昭６１−２９４５５１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
本発明の目的は、１つの側面では、マルチプロセッサシステムにおける複数のプロセッサの試験を、いずれかのプロセッサがハングアップした場合にも継続させるための技術を提供することである。
【課題を解決するための手段】
【０００７】
本発明に係る情報処理システムは、複数のプロセッサと、複数のプロセッサがアクセス可能な記憶装置とを有する。そして、複数のプロセッサの各々は、当該プロセッサが実行するプログラムのうち実行中の命令が配置されている、記憶装置上の領域を示す情報を、当該命令の実行時に記憶装置に保存し、複数のプロセッサのうち第１プロセッサは、複数のプロセッサのうち第２プロセッサがハングアップした場合、第２プロセッサによって記憶装置に保存された情報に基づき、ハングアップした時に実行されていた命令が配置されている領域を特定し、特定した領域に配置されている命令を、特定の割込みを発生させる命令に書き換え、第２プロセッサは、特定の割込みを発生させる命令を実行することによって発生した特定の割込みに応じてハングアップ状態を解除する処理を実行する。
【発明の効果】
【０００８】
１つの側面では、マルチプロセッサシステムにおける複数のプロセッサの試験を、いずれかのプロセッサがハングアップした場合にも継続させることができるようになる。
【図面の簡単な説明】
【０００９】
【図１】図１は、クロスコールによってハングアップを解除する方法の一例を示す図である。
【図２】図２は、試験の進行及びプロセッサの離脱について説明するための図である。
【図３】図３は、試験の進行及びプロセッサの離脱について説明するための図である。
【図４】図４は、情報処理装置のハードウエア構成図である。
【図５】図５は、メモリの構成の一例を示す図である。
【図６】図６は、関数ネストカウンタの一例を示す図である。
【図７】図７は、関数情報領域に格納されるデータの一例を示す図である。
【図８】図８は、タスクの生成について説明するための図である。
【図９】図９は、マルチプロセッサシステムにおける試験の進行の概要を説明するための図である。
【図１０】図１０は、マルチプロセッサシステムにおける試験の進行の概要を説明するための図である。
【図１１】図１１は、マルチプロセッサシステムにおける試験の進行の概要を説明するための図である。
【図１２】図１２は、マスタプロセッサが実行する処理の処理フローを示す図である。
【図１３】図１３は、タスクとメモリ領域との関係を示す図である。
【図１４】図１４は、試験命令列及び試験データの展開態様を示す図である。
【図１５】図１５は、領域の書き換えについて説明するための図である。
【図１６】図１６は、スレーブプロセッサが実行する処理の処理フローを示す図である。
【図１７】図１７は、関数ネストカウンタ及び関数情報領域の状態の遷移を示す図である。
【図１８】図１８は、メモリの状態の一例を示す図である。
【図１９】図１９は、関数の進行と関数ネストカウンタ及び関数情報領域の更新との関係について説明するための図である。
【図２０】図２０は、処理Ａ及び処理Ｂと割り込みとの関係について説明するための図である。
【図２１】図２１は、マスタプロセッサ及びスレーブプロセッサの動作を具体的に説明するための図である。
【図２２】図２２は、マスタプロセッサ及びスレーブプロセッサの動作を具体的に説明するための図である。
【図２３】図２３は、マスタプロセッサ及びスレーブプロセッサの動作を具体的に説明するための図である。
【図２４】図２４は、マスタプロセッサが実行する処理の処理フローを示す図である。
【図２５】図２５は、スレーブプロセッサが実行する処理の処理フローを示す図である。
【発明を実施するための形態】
【００１０】
プロセッサがハングアップした場合には、クロスコールを使って割り込みを起こすことによりハングアップを解除することができる。
【００１１】
図１を用いて、クロスコールによってハングアップを解除する方法の一例を示す。図１においては、マルチプロセッサシステムが、試験を制御するマスタプロセッサと、試験を実行するスレーブプロセッサとを含む。マスタプロセッサは、スレーブプロセッサがハングアップした場合にクロスコールを発行する。スレーブプロセッサは、クロスコールが発行されると、割り込みを発生させる。マスタプロセッサの割り込みハンドラは、スレーブプロセッサの割り込みに応じて、スレーブプロセッサのハングアップ状態を解除するための終了処理を実行する。これにより、スレーブプロセッサのハングアップ状態が解除される。なお、図１においてはマスタプロセッサの割り込みハンドラによってハングアップ状態が解除されるが、スレーブプロセッサの割り込みハンドラによってハングアップ状態が解除されてもよい。
【００１２】
但し、この方法では、クロスコール割り込みがマスクされている場合には割り込みが発生しないため、ハングアップ状態が解除されない。このような場合、ハングアップしたプロセッサは試験の対象から外され、以降の試験には参加しない。図２及び図３を用いて、試験の進行及びプロセッサの離脱について説明する。図２及び図３において、括弧内の数字はプロセッサの番号を表し、「タスク」とは、マルチプロセッサに含まれる複数のプロセッサを試験で動作するプロセッサの数で分けた場合における１グループである。タスク内のプロセッサのうちそのタスクの試験を制御するプロセッサをタスクマスタと呼び、マルチプロセッサシステム内のタスクマスタのうち１つのタスクマスタをシステムマスタと呼ぶ。例えば、６つのプロセッサが試験の対象であり且つ試験で動作するプロセッサの数が３である場合、２つのタスクが生成される。
【００１３】
試験１においては、図２（ａ）に示すように、試験で動作するプロセッサの数が３であるので、３つのタスクが生成される。そして、試験が正常終了したとする。試験２においては、図２（ｂ）に示すように、試験で動作するプロセッサの数が４であるので、２つのタスクが生成される。プロセッサ９は、タスクＴ０の試験が終わってからタスクＴ２に割り当てられる。そして、試験が正常終了したとする。試験３においては、図３（ａ）に示すように、試験で動作するプロセッサの数が３であるので、３つのタスクが生成される。但し、プロセッサ３がハングアップしたとする。ここでは、クロスコール割り込みがマスクされているため、プロセッサ３は試験の対象から外される。試験４においては、図３（ｂ）に示すように、試験で動作するプロセッサの数が４であるので、２つのタスクが生成される。但し、プロセッサ７及びプロセッサ９がハングアップしたとする。ここでは、クロスコール割り込みがマスクされているため、プロセッサ７及びプロセッサ９は試験の対象から外される。試験５においては、図３（ｃ）に示すように、試験で動作するプロセッサの数が３であるので、２つのタスクが生成される。そして、試験が正常終了したとする。
【００１４】
図２及び図３を用いて説明したように、クロスコール割り込みがマスクされている場合にはハングアップ状態を解除することができず、プロセッサが試験の対象から外される。ここで、ハングアップしたプロセッサが実行していたプログラムのメモリ領域をクリアすることで、マスクの影響を受けない特定の割り込みを発生させ、特定の割り込みを契機としてハングアップ状態を解除することも考えられる。しかし、ハングアップしたプロセッサは他のプロセッサとの通信を行うことができないため、他のプロセッサはハングアップしたプロセッサが実行していたプログラムのメモリ領域を特定することができない。そのため、結局はメモリ領域全体をクリアすることになるので、命令列だけでなく、プログラムの実行に使用されるデータ（例えば、各種のパラメタ及びジャンプ先のアドレス等）までクリアされることがある。すると、クリアされるデータを使用する命令の動作を予測することができないので、最悪の場合、他のデータ領域内のデータが破壊されたり、また、コンピュータ自体の再起動や破壊等の２次的な障害が発生することもある。
【００１５】
また、上記のような２次的な障害が発生しなかったとしても、ハングアップしたプロセッサは必ずしも試験に復帰できるとは限らないため、それ以降の試験では、ハングアップしたプロセッサを除いてタスクが生成される。このように、全プロセッサでの試験を継続して行うことができない場合には、最初からもう一度全プロセッサでの試験をやり直すことになる場合がある。
【００１６】
そこで以下では、上記のような２次的な障害を発生させることなく、試験対象である全プロセッサでの試験を継続して行う方法について説明する。
【００１７】
図４に、本実施の形態における情報処理装置１のハードウエア構成図を示す。情報処理装置１は、プロセッサ０乃至Ｎ（Ｎは２以上の自然数）と、例えばメインメモリであるメモリ１００と、例えばＲＯＭ（Read Only Memory）或いはＨＤＤ（Hard Disk Drive）等である記憶装置１１０とを有する。プロセッサ０乃至Ｎとメモリ１００と記憶装置１１０とは、バスによって接続される。記憶装置１１０は、本実施の形態の処理を実行するためのプログラム及びマルチプロセッサシステムのマイクロアーキテクチャを検証するための試験プログラムを格納しており、これらのプログラムは、プロセッサ０乃至Ｎによってメモリ１００にロードされて実行される。プロセッサ０乃至Ｎは、例えばＣＰＵ（Central Processing Unit）コアであるが、ＣＰＵそのものであってもよい。
【００１８】
図５に、メモリ１００の構成の一例を示す。メモリ１００は、システムマスタであるマスタプロセッサに対応付けられた制御部１０００の領域と、各々がスレーブプロセッサに対応付けられた複数の試験部２０００の領域とを有する。
【００１９】
制御部１０００の領域は、監視部１００１の領域と、書き換え部１００２の領域と、起動部１００３の領域と、割り込みハンドラ１００４の領域と、展開部１００５の領域と、領域特定部１００６の領域と、第１初期化部１００７の領域と、第２初期化部１００８の領域と、関数ネストカウンタ１００９の領域と、関数情報領域１０１０と、フラグ設定部１０１１の領域と、フラグ領域１０１２とを有する。
【００２０】
監視部１００１は、試験の終了を監視する。書き換え部１００２は、ハングアップが発生した際に実行していた命令列を、特定の割り込みを発生させる命令列（例えば、未定義の命令列）に書き換える処理を実行する。起動部１００３は、試験部２０００を起動する。割り込みハンドラ１００４は、割り込みに応じて処理を実行する。展開部１００５は、メモリ１００に試験部２０００を展開する。領域特定部１００６は、関数ネストカウンタ１００９の値及び関数情報領域１０１０に格納された情報を読み出し、書き換え部１００２に渡す。第１初期化部１００７は、関数ネストカウンタ１００９を初期化する。第２初期化部１００８は、関数情報領域１０１０を初期化する。関数ネストカウンタ１００９は、実行中の関数を特定するためのカウンタである。関数情報領域１０１０は、関数の先頭アドレス及びサイズの情報を格納する。フラグ設定部１０１１は、フラグ領域１０１２の強制終了フラグを設定する。フラグ領域１０１２は、強制終了フラグの領域であり、各スレーブプロセッサについて設けられる。
【００２１】
試験部２０００の領域は、実行部２００１の領域と、設定部２００２の領域と、割り込みハンドラ２００３の領域とを有する。
【００２２】
実行部２００１は、試験を実行する。設定部２００２は、関数ネストカウンタ１００９の値及び関数情報領域１０１０内の情報を設定する。割り込みハンドラ２００３は、割り込みに応じて処理を実行する。
【００２３】
図６に、関数ネストカウンタ１００９の一例を示す。関数ネストカウンタ１００９は試験部２０００毎に設けられる。関数ネストカウンタ１００９の値は、メイン試験関数及びその他の関数の開始時及び終了時にインクリメント又はデクリメントされ、スレーブプロセッサが実行中の関数を特定するために使用される。
【００２４】
図７に、関数情報領域１０１０に格納されるデータの一例を示す。図７の例では、メイン試験関数の先頭アドレス及びサイズと、関数の先頭アドレス及びサイズとが格納される。
【００２５】
図８に、本実施の形態におけるタスクの生成について説明する。本実施の形態においては、試験において動作するプロセッサの数がｎ（ｎは２以上の自然数）であるとし、ｍ個のタスクが生成されるものとする。すなわち、Ｎ＝ｎ＊（ｍ＋１）であり、プロセッサ１乃至ｎはタスクＴ０に含まれ、プロセッサ（ｎ＋１）乃至２ｎはタスクＴ１に含まれ、・・・、プロセッサ（ｎ＊ｍ＋１）乃至プロセッサ（ｎ＊（ｍ＋１））はタスクＴｍに含まれる。プロセッサ０はマスタプロセッサであり、プロセッサ０以外のプロセッサがスレーブプロセッサである。なお、以下ではマスタプロセッサであるプロセッサ０が試験を実行しない例を示すが、マスタプロセッサが試験を制御する処理だけでなく試験をも実行するようにしてもよい。
【００２６】
図９乃至図１１を用いて、本実施の形態のマルチプロセッサシステムにおける試験の進行の概要を説明する。
【００２７】
図９を用いて、スレーブプロセッサのハングアップが発生しない場合における試験の進行について説明する。マスタプロセッサであるプロセッサ０は、スレーブプロセッサに実行させる試験プログラムを選択し、試験プログラムの試験命令列及び試験データをメモリ１００に展開する。そして、プロセッサ０は各スレーブプロセッサの試験部２０００を起動する。各スレーブプロセッサの実行部２００１は処理を実行し、試験が終了すると各タスクでの同期（以下、タスク同期と呼ぶ）を実行する。タスク同期は、タスクに含まれるタスクマスタによって行われる。タスク同期が完了すると、プロセッサ０が、全タスクにおいて試験が完了したか確認する（以下、この処理をシステム同期と呼ぶ）。システム同期が完了すると、次の試験に移行する。
【００２８】
図１０及び図１１を用いて、スレーブプロセッサがハングアップした場合における試験の進行について説明する。マスタプロセッサであるプロセッサ０は、試験部２０００を起動した後、各スレーブプロセッサの実行部２００１は処理を実行する。ここで、プロセッサｎがハングアップしたとする。この場合、プロセッサ１乃至プロセッサ（ｎ−１）はタスク同期を完了することができないので、タスクマスタであるプロセッサ１はプロセッサｎのハングアップを検知し、プロセッサｎがハングアップしたことをプロセッサ０に通知する。一方、図１１に示すように、タスクＴ０以外のタスクにおいてはタスク同期が完了しているが、タスクＴ０のタスク同期が完了していないためにシステム同期が完了しない。
【００２９】
プロセッサ０は、ハングアップの通知を受信すると、関数ネストカウンタ１００９を使用して、プロセッサｎが処理中の関数の先頭アドレス及びサイズを関数情報領域１０１０から読み出す。そして、プロセッサ０は、読み出された先頭アドレス及びサイズから特定される、関数の命令列を、特定の割り込みを発生させる命令列に書き換える。すると、プロセッサｎは、発生した特定の割り込みに応じて、ハングアップ状態を解除するための終了処理を実行する。これにより、タスクＴ０においてタスク同期が完了するので、プロセッサ０においてシステム同期が行われるようになる。
【００３０】
次に、図１２乃至図２３を用いて、情報処理装置１の動作をより詳細に説明する。
【００３１】
まず、図１２乃至図１９を用いて、マスタプロセッサが実行する処理について説明する。マスタプロセッサの制御部１０００における展開部１００５は、記憶装置１１０に格納されている試験プログラムのうち、未処理の試験プログラムであって走行させる試験プログラムを選択する。そして、展開部１００５は、情報処理装置１におけるスレーブプロセッサの数である（Ｎ＋１）と選択した試験プログラムで使用されるスレーブプロセッサの数とから、タスク数とスレーブプロセッサの割り当てとを特定する（図１２：ステップＳ１）。試験プログラムで使用されるスレーブプロセッサの数の情報は、試験プログラムとともに記憶装置１１０に格納されているとする。
【００３２】
展開部１００５は、選択された試験プログラムの試験命令列及び試験データを、特定されたタスク数の分だけメモリ１００に展開する（ステップＳ３）。
【００３３】
図１３に、メモリ１００への展開態様の一例を示す。図１３（ａ）においては、試験１のプログラムの試験命令列及び試験データが、タスクＴ０乃至タスクＴｌについて展開されている。図１３（ｂ）においては、試験２のプログラムの試験命令列及び試験データが、タスクＴ０乃至タスクＴｍについて展開されている。図１３（ｃ）においては、試験３のプログラムの試験命令列及び試験データが、タスクＴ０乃至タスクＴｎについて展開されている。各タスクの試験命令列及び試験データは、試験が始まる前に制御部１０００によって展開される。その際には、直前の試験の試験命令列及び試験データは上書きされて消失する。試験ごとに試験命令列及び試験データのサイズが異なるため、各タスクの先頭アドレスは毎回異なる。例えば、タスクＴｎについての試験命令列及び試験データは、図１４に示すようにメモリ１００の領域に展開される。
【００３４】
フラグ設定部１０１１は、フラグ領域１０１２の強制終了フラグを初期化（ここでは、０に設定）し、第１初期化部１００７は、関数ネストカウンタ１００９を初期化（ここでは、０に設定）し、第２初期化部１００８は、関数情報領域１０１０を初期化（ここでは、０に設定）する（ステップＳ５）。
【００３５】
起動部１００３は、各スレーブプロセッサの試験部２０００を起動することで試験を開始する（ステップＳ７）。各スレーブプロセッサの動作については、後で説明する。
【００３６】
監視部１００１は、試験が終了していないタスクが有るか判定する（ステップＳ９）。試験が終了したタスクであれば、タスク同期が完了している。試験が終了していないタスクが有る場合（ステップＳ９：Ｙｅｓルート）、タイムアウトしたスレーブプロセッサが有るか判定する（ステップＳ１１）。ここでは、タイムアウトしたスレーブプロセッサとはハングアップしたスレーブプロセッサのことであり、タスクマスタからの通知によって検知される。
【００３７】
タイムアウトしたスレーブプロセッサが無い場合（ステップＳ１１：Ｎｏルート）、ステップＳ９の処理に戻る。一方、タイムアウトしたスレーブプロセッサが有る場合（ステップＳ１１：Ｙｅｓルート）、フラグ設定部１０１１は、タイムアウトしたスレーブプロセッサについての強制終了フラグを「１」に設定する。そして、領域特定部１００６は、タイムアウトしたスレーブプロセッサのプロセッサ番号に基づき、そのスレーブプロセッサについての関数ネストカウンタ１００９からカウンタ値を読み出すと共に、そのスレーブプロセッサについての関数情報領域１０１０から、読み出したカウンタ値が指し示す関数の先頭アドレス及びサイズを読み出す（ステップＳ１３）。領域特定部１００６は、読み出した先頭アドレス及びサイズを書き換え部１００２に渡す。
【００３８】
書き換え部１００２は、領域特定部１００６から渡された先頭アドレス及びサイズから特定される領域の命令列を、特定の割り込みを発生させる命令列に書き換える（ステップＳ１５）。そしてステップＳ９の処理に戻る。
【００３９】
ステップＳ１５の処理によって、図１５に示すように、試験命令列の領域が書き換えられるが、試験データ領域は書き換えられない。そして、マスクの影響を受けない特定の割り込みが発生し、割り込みハンドラ２００３の終了処理によってスレーブプロセッサのハングアップ状態は解除され、スレーブプロセッサは次の試験を実行できるようになる。なお、終了処理の実行主体は割り込みハンドラ１００４であってもよい。
【００４０】
これに対し、試験が終了していないタスクが無い場合（ステップＳ９：Ｎｏルート）、制御部１０００は、システム同期を完了する。そしてステップＳ１７の処理に移行する。
【００４１】
監視部１００１は、記憶装置１１０に格納された試験プログラムを確認することで、終了していない試験が有るか判定する（ステップＳ１７）。終了していない試験が有る場合（ステップＳ１７：Ｙｅｓルート）、ステップＳ１の処理に戻る。一方、終了していない試験が無い場合（ステップＳ１７：Ｎｏルート）、処理は終了する。
【００４２】
次に、図１６乃至図２０を用いて、スレーブプロセッサが実行する処理について説明する。各スレーブプロセッサは、マスタプロセッサによって試験部２０００が起動されるまで待機（或いはスリープ）する（図１６：ステップＳ２１）。試験部２０００が起動された場合、実行部２００１は、試験の実行を開始する（ステップＳ２３）。
【００４３】
実行部２００１は、実行中の命令が新しいネスト（ここでは、１つの関数）の命令であるか判定する（ステップＳ２５）。新しいネストの命令ではない場合（ステップＳ２５：Ｎｏルート）、ステップＳ３１の処理に移行する。
【００４４】
一方、新しいネストの命令である場合（ステップＳ２５：Ｙｅｓルート）、設定部２００２は、自スレーブプロセッサについての関数ネストカウンタ１００９の値を１インクリメントする（ステップＳ２７）。また、設定部２００２は、自スレーブプロセッサについての関数の先頭アドレス及び関数のサイズを関数情報領域１０１０に書き込む（ステップＳ２９）。
【００４５】
実行部２００１は、ネストが終了したか判定する（ステップＳ３１）。ネストが終了していない場合（ステップＳ３１：Ｎｏルート）、ステップＳ３５の処理に移行する。一方、ネストが終了した場合（ステップＳ３１：Ｙｅｓルート）、設定部２００２は、自スレーブプロセッサについての関数ネストカウンタ１００９の値を１デクリメントする（ステップＳ３３）。
【００４６】
図１７を用いて、関数ネストカウンタ１００９及び関数情報領域１０１０の状態の遷移について説明する。マスタプロセッサの初期化によって、関数ネストカウンタ１００９の値は０に設定され、関数情報領域１０１０にも０が設定されている。ステップＳ２７及びＳ２９の処理が実行されると、例えば（１）の状態に遷移する。（１）の状態においては、「０ｘ１１０００」はメイン試験関数の先頭アドレスを表し、「０ｘ３００」はメイン試験関数のサイズを表す。（１）の状態においてさらにステップＳ２７及びＳ２９の処理が実行されると、例えば（２）の状態に遷移する。（２）の状態においては、「０ｘ１１３００」は関数ｆ１の先頭アドレスを表し、「０ｘ２００」は関数ｆ１のサイズを表す。（２）の状態においてステップＳ３３の処理が実行されると、（３）の状態に遷移する。
【００４７】
図１８に、図１７に示した（２）及び（３）の状態に対応するメモリ１００の状態の一例を示す。図１８に示すように、制御部１０００用の領域には制御命令、関数情報領域１０１０及び関数ネストカウンタ１００９等が含まれ、試験部２０００用の領域にはメイン試験関数の領域及び関数ｆ１の領域等が含まれる。例えばメイン試験関数が書き換えの対象である場合には、アドレス０ｘ１１０００−０ｘ１１３００が特定の割り込みを発生させる命令列に書き換えられる。
【００４８】
図１９を用いて、関数の進行と関数ネストカウンタ１００９及び関数情報領域１０１０の更新との関係について説明する。図１９において、処理ＡとはステップＳ２７及びＳ２９の処理であり、処理ＢとはステップＳ３３の処理であり、ＰＡとはメモリ１００の物理アドレスである。また、関数ネストカウンタ１００９及び関数情報領域１０１０は初期化された状態であるとする。まず、メイン試験関数において実行される処理Ａにおいて、関数ネストカウンタ１００９の値が１インクリメントされ、関数情報領域１０１０にメイン試験関数の先頭ＰＡ及びメイン試験関数のサイズが追加される。メイン試験関数において呼び出された関数ｆ１の処理Ａにおいては、関数ネストカウンタ１００９の値が１インクリメントされ、関数情報領域１０１０に関数ｆ１の先頭ＰＡ及び関数ｆ１のサイズが追加される。関数ｆ１の処理Ｂにおいては、関数ネストカウンタ１００９の値が１デクリメントされる。メイン試験関数において実行される処理Ｂにおいては、関数ネストカウンタ１００９の値が１デクリメントされる。
【００４９】
なお、処理Ａ及び処理Ｂは関数だけではなく、特定の割り込み以外の割り込みについての割り込みハンドラの処理においても行われる。例えば図２０に示すように、メイン試験関数の処理によって割り込みが発生し割り込みハンドラの処理が開始される場合には、処理Ａ及び処理Ｂが実行された後にメイン試験関数に戻る。
【００５０】
図１６の説明に戻り、実行部２００１は、実行する命令が特定の割り込みを発生させる命令であるか判定する（ステップＳ３５）。実行する命令が特定の割り込みを発生させる命令列である場合（ステップＳ３５：Ｙｅｓルート）、特定の割り込みを発生させる命令列の実行によって割り込みが発生する（ステップＳ３７）。ステップＳ３７は処理ではなく状態を表すので、ステップＳ３７のブロックは破線で示されている。以下の破線のブロックも同様とする。
【００５１】
割り込みハンドラ２００３は、フラグ領域１０１２の強制終了フラグの値が「１」であるか判定する（ステップＳ３９）。強制終了フラグの値が「１」である場合（ステップＳ３９：Ｙｅｓルート）、ハングアップ状態を解除するため、ステップＳ４５の処理に移行する。一方、強制終了フラグの値が「１」ではない場合（ステップＳ３９：Ｎｏルート）、割り込みの種類に応じて割り込み処理を実行する（ステップＳ４１）。そしてステップＳ４３の処理に移行する。
【００５２】
一方、特定の割り込みを発生させる命令列ではない場合（ステップＳ３５：Ｎｏルート）、実行部２００１は、試験が終了する（すなわち、実行中の命令が最後の命令である）か判定する（ステップＳ４３）。試験が終了しない場合（ステップＳ４３：Ｎｏルート）、ステップＳ２５の処理に戻る。これに対し、試験が終了する場合（ステップＳ４３：Ｙｅｓルート）、割り込みハンドラ２００３は、終了処理を実行する（ステップＳ４５）。
【００５３】
実行部２００１は、終了していない試験が有る（すなわち、マスタプロセッサから新たな試験の実行を指示されている）か判定する（ステップＳ４７）。終了していない試験が有る場合（ステップＳ４７：Ｙｅｓルート）、ステップＳ２１の処理に戻る。一方、終了していない試験が無い場合（ステップＳ４７：Ｎｏルート）、処理は終了する。
【００５４】
以上のような処理を実行すれば、複数のプロセッサのプログラム実行を、いずれかのプロセッサがハングアップした場合にも継続できるようになる。
【００５５】
ここで、図２１乃至図２３を用いて、マスタプロセッサ及びスレーブプロセッサの動作をより具体的に説明する。説明を簡単にするため、マスタプロセッサ側の動作主体を「マスタプロセッサ」とし、スレーブプロセッサ側の動作主体を「スレーブプロセッサ」とする。
【００５６】
まず、マスタプロセッサは、走行させる試験プログラムを選択し、選択した試験プログラムの試験命令列及び試験データをメモリ１００に展開する（ステップＳ５１）。
【００５７】
マスタプロセッサは、フラグ領域１０１２の強制終了フラグを０に設定し（ステップＳ５３）、各スレーブプロセッサについて、関数ネストカウンタ１００９の値及び関数情報領域１０１０を初期化する（ステップＳ５５）。
【００５８】
マスタプロセッサは、各スレーブプロセッサに試験を開始させる（ステップＳ５７）。
【００５９】
スレーブプロセッサが試験の実行を開始すると（ステップＳ５９）、各スレーブプロセッサにおいてメイン試験関数が開始する（ステップＳ６１）。
【００６０】
スレーブプロセッサは、関数ネストカウンタ１００９の値を１インクリメントし、且つ、関数ネストカウンタ１００９の値が示す、関数情報領域１０１０のエントリに関数の先頭アドレス及びサイズを設定する処理（本処理は、上で説明した処理Ａに相当する）を実行する（ステップＳ６３）。
【００６１】
スレーブプロセッサは、関数ｆ１を呼び出す（ステップＳ６５）。処理は端子Ａ及びＢを介して図２２に移行する。
【００６２】
図２２の説明に移行し、マスタプロセッサは、試験が終了したか判定する（図２２：ステップＳ６７）。試験が終了した場合（ステップＳ６７：Ｙｅｓルート）、処理は端子Ｃを介して図２３に移行し終了する。
【００６３】
一方、試験が終了していない場合（ステップＳ６７：Ｎｏルート）、マスタプロセッサは、タイムアウトしたプロセッサが有るか判定する（ステップＳ６９）。タイムアウトしたスレーブプロセッサが無い場合（ステップＳ６９：Ｎｏルート）、ステップＳ６７の処理に移行する。タイムアウトした場合（ステップＳ６９：Ｙｅｓルート）、ステップＳ９１の処理に移行する。
【００６４】
関数ｆ１の呼び出し後、スレーブプロセッサにおいて関数ｆ１が開始する（ステップＳ７１）。そして、スレーブプロセッサは処理Ａを実行する（ステップＳ７３）。
【００６５】
スレーブプロセッサは、関数ｆ１の処理を実行する（ステップＳ７５）。
【００６６】
スレーブプロセッサは、関数ネストカウンタ１００９の値を１デクリメントする処理（本処理は、上で説明した処理Ｂに相当する）を実行する（ステップＳ７７）。
【００６７】
スレーブプロセッサの処理が関数ｆ１から復帰し（ステップＳ７９）、関数ｆ１は終了する（ステップＳ８１）。
【００６８】
スレーブプロセッサは、関数ｆ２を呼び出し（ステップＳ８３）、処理Ａを実行する（ステップＳ８５）。
【００６９】
スレーブプロセッサは、関数ｆ２の処理を実行し（ステップＳ８７）、関数ｆ２の処理の実行中にハングアップ状態に移行する（ステップＳ８９）。
【００７０】
一方、いずれかのスレーブプロセッサがハングアップした場合にはタスク同期のタイムアウトが発生するので、マスタプロセッサは、ハングアップしたスレーブプロセッサを含むタスクの各スレーブプロセッサに対してクロスコールを発行する（ステップＳ９１）。但し、クロスコール割り込みがマスクされているため、ハングアップ状態は継続する（ステップＳ９２）。
【００７１】
マスタプロセッサは、クロスコールの発行後、試験が終了したか判定する（ステップＳ９３）。試験が終了した場合（ステップＳ９３：Ｙｅｓルート）、処理は端子Ｄを介して図２３に移行し終了する。
【００７２】
一方、試験が終了していない場合（ステップＳ９３：Ｎｏルート）、マスタプロセッサは、タイムアウトしたプロセッサが有るか判定する（ステップＳ９５）。タイムアウトしたプロセッサが無い場合（ステップＳ９５：Ｎｏルート）、ステップＳ９３の処理に移行する。タイムアウトしたプロセッサが有る場合（ステップＳ９５：Ｙｅｓルート）、マスタプロセッサは、タイムアウトしたスレーブプロセッサについての強制終了フラグを「１」に設定する（ステップＳ９７）。
【００７３】
マスタプロセッサは、ハングアップしたスレーブプロセッサについて、関数ネストカウンタ１００９の値と、ハングアップ時に実行されていた関数の先頭アドレス及びサイズとを読み出す（ステップＳ９９）。処理は端子Ｅ及びＦを介して図２３に移行する。
【００７４】
図２３の説明に移行し、マスタプロセッサは、スレーブプロセッサがハングアップ時に実行していた関数の先頭アドレスから関数サイズ分だけ、特定の割り込みを発生させる命令列に書き換える（図２３：ステップＳ１０１）。
【００７５】
すると、スレーブプロセッサにおいて割り込みが発生し（ステップＳ１０３）、スレーブプロセッサの割り込みハンドラ２００３は、強制終了フラグの値が「１」である場合には終了処理を実行する（ステップＳ１０５）。そして、ハングアップしたスレーブプロセッサを含むタスクのタスク同期が完了し、その後システム同期が完了すると試験は終了する。
【００７６】
一方、マスタプロセッサは、試験が終了した（すなわち、システム同期が完了した）ことを確認し（ステップＳ１０７）、処理は終了する。
【００７７】
以上のように、本実施の形態においては、ハングアップ時に実行していた関数の命令列のみを書き換えるため、データ領域は破壊されない。従って、２次的な障害等の問題を発生することなく、試験対象である全プロセッサの試験を継続することができるようになる。
【００７８】
以上本発明の一実施の形態を説明したが、本発明はこれに限定されるものではない。例えば、上で説明した情報処理装置１の機能ブロック構成は実際のプログラムモジュール構成に一致しない場合もある。
【００７９】
また、上で説明したデータ構造は一例であって、上記のようなデータ構造でなければならないわけではない。さらに、処理フローにおいても、処理結果が変わらなければ処理の順番を入れ替えることも可能である。さらに、並列に実行させるようにしても良い。
【００８０】
また、上で述べた例ではマスタプロセッサが試験を実行していないが、マスタプロセッサも試験を実行してもよい。
【００８１】
また、上で述べた例では試験プログラムが実行されるが、試験プログラム以外のプログラム（例えば並列計算のプログラム）を実行するマルチプロセッサシステムに対して本実施の形態を適用してもよい。
【００８２】
［付録］
本付録においては、本実施の形態の方法を利用しない場合においてマスタプロセッサ及びスレーブプロセッサが実行する処理の一例を説明する。
【００８３】
まず、図２４を用いて、マスタプロセッサが実行する処理について説明する。マスタプロセッサの制御部１０００における展開部１００５は、記憶装置１１０に格納されている試験プログラムのうち、未処理の試験プログラムであって走行させる試験プログラムを選択する。そして、展開部１００５は、情報処理装置１におけるスレーブプロセッサの数である（Ｎ＋１）と選択した試験プログラムで使用されるスレーブプロセッサの数とから、タスク数とスレーブプロセッサの割り当てとを特定する（図２４：ステップＳ１１１）。試験プログラムで使用されるスレーブプロセッサの数の情報は、試験プログラムとともに記憶装置１１０に格納されているとする。
【００８４】
展開部１００５は、選択された試験プログラムの試験命令列及び試験データを、特定されたタスク数の分だけメモリ１００に展開する（ステップＳ１１３）。
【００８５】
起動部１００３は、各スレーブプロセッサの試験部２０００を起動することで試験を開始する（ステップＳ１１５）。
【００８６】
監視部１００１は、試験が終了していないタスクが有るか判定する（ステップＳ１１７）。試験が終了したタスクであれば、タスク同期が完了している。試験が終了していないタスクが有る場合（ステップＳ１１７：Ｙｅｓルート）、タイムアウトしたスレーブプロセッサが有るか判定する（ステップＳ１１９）。ここでは、タイムアウトしたスレーブプロセッサとはハングアップしたスレーブプロセッサのことであり、タスクマスタからの通知によって特定される。
【００８７】
タイムアウトしたスレーブプロセッサが無い場合（ステップＳ１１９：Ｎｏルート）、ステップＳ１１７の処理に戻る。一方、タイムアウトしたスレーブプロセッサが有る場合（ステップＳ１１９：Ｙｅｓルート）、タイムアウトしたスレーブプロセッサを、試験が終了したスレーブプロセッサとして以降の試験に参加させないように設定する（ステップＳ１２１）。そしてステップＳ１１７の処理に戻る。
【００８８】
一方、試験が終了していないタスクが無い場合（ステップＳ１１７：Ｎｏルート）、制御部１０００は、システム同期を完了する。そしてステップＳ１２３の処理に移行する。
【００８９】
監視部１００１は、記憶装置１１０に格納された試験プログラムを確認することで、終了していない試験が有るか判定する（ステップＳ１２３）。終了していない試験が有る場合（ステップＳ１２３：Ｙｅｓルート）、ステップＳ１１１の処理に戻る。一方、終了していない試験が無い場合（ステップＳ１２３：Ｎｏルート）、処理は終了する。
【００９０】
このように、タイムアウトしたスレーブプロセッサを試験の対象から外してしまうと、全スレーブプロセッサでの試験が行われないため、最初から全スレーブプロセッサでの試験をやり直すことになる場合がある。
【００９１】
次に、図２５を用いて、スレーブプロセッサが実行する処理について説明する。まず、各スレーブプロセッサは、マスタプロセッサによって試験部２０００が起動されるまで待機（或いはスリープ）する（図２５：ステップＳ１３１）。試験部２０００が起動された場合、実行部２００１は、試験の実行を開始する（ステップＳ１３３）。
【００９２】
その後、試験プログラムの最後まで達した場合に、実行部２００１は終了処理を実行する（ステップＳ１３５）。
【００９３】
実行部２００１は、終了していない試験が有る（すなわち、マスタプロセッサから新たな試験の実行を指示されている）か判定する（ステップＳ１３７）。終了していない試験が有る場合（ステップＳ１３７：Ｙｅｓルート）、ステップＳ１３１の処理に戻る。一方、終了していない試験が無い場合（ステップＳ１３７：Ｎｏルート）、処理は終了する。
【００９４】
このような処理を実行した場合には、ハングアップした場合に適切な対処が行われない為、２次的な障害等を発生させる可能性が有る。
【００９５】
以上で本付録を終了する。
【００９６】
以上述べた本発明の実施の形態をまとめると、以下のようになる。
【００９７】
本実施の形態の第１の態様に係る情報処理システムは、（Ａ）複数のプロセッサと、（Ｂ）複数のプロセッサがアクセス可能な記憶装置とを有する。そして、複数のプロセッサの各々は、（ａ１）当該プロセッサが実行するプログラムのうち実行中の命令が配置されている、記憶装置上の領域を示す情報を、当該命令の実行時に記憶装置に保存し、複数のプロセッサのうち第１プロセッサは、（ａ２）複数のプロセッサのうち第２プロセッサがハングアップした場合、第２プロセッサによって記憶装置に保存された情報に基づき、ハングアップした時に実行されていた命令が配置されている領域を特定し、（ａ３）特定した領域に配置されている命令を、特定の割込みを発生させる命令に書き換え、第２プロセッサは、（ａ４）特定の割込みを発生させる命令を実行することによって発生した特定の割込みに応じてハングアップ状態を解除する処理を実行する。
【００９８】
これにより、複数のプロセッサのプログラム実行を、いずれかのプロセッサがハングアップした場合に継続できるようになる。
【００９９】
また、上で述べた情報は、実行中の命令を含む関数の先頭アドレス及び当該関数のサイズの情報を含んでもよい。これにより、書き換えの対象を関数に含まれる命令に限定し、データ領域が書き換えられることを防げるので、２次的な障害が発生することを防げるようになる。
【０１００】
また、複数のプロセッサのうち第３プロセッサが、（ａ５）第２プロセッサとの間で実行する同期処理が完了しない場合、第１プロセッサに、第２プロセッサがハングアップしたことを通知してもよい。これにより、第１プロセッサは第２プロセッサがハングアップしたことを認識できるようになる。
【０１０１】
また、複数のプロセッサの各々は、（ａ６）メインルーチンの開始時及び関数への遷移時に、当該関数の先頭アドレス及び当該関数のサイズの情報を記憶装置に保存してもよい。
【０１０２】
本実施の形態の第２の態様に係る実行制御方法は、（Ｃ）他のプロセッサがハングアップした場合、記他のプロセッサによって記憶装置に保存された、他のプロセッサが実行するプログラムのうち実行中の命令が配置されている記憶装置上の領域を示す情報に基づき、ハングアップした時に実行されていた命令が配置されている領域を特定し、（Ｄ）特定した領域に配置されている命令を、特定の割込みを発生させる命令に書き換える処理を含む。
【０１０３】
なお、上記方法による処理をプロセッサに行わせるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブルディスク、ＣＤ−ＲＯＭ、光磁気ディスク、半導体メモリ、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。尚、中間的な処理結果はメインメモリ等の記憶装置に一時保管される。
【０１０４】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【０１０５】
（付記１）
複数のプロセッサと、
前記複数のプロセッサがアクセス可能な記憶装置と、
を有し、
前記複数のプロセッサの各々は、
当該プロセッサが実行するプログラムのうち実行中の命令が配置されている、前記記憶装置上の領域を示す情報を、当該命令の実行時に前記記憶装置に保存し、
前記複数のプロセッサのうち第１プロセッサは、
前記複数のプロセッサのうち第２プロセッサがハングアップした場合、前記第２プロセッサによって前記記憶装置に保存された前記情報に基づき、ハングアップした時に実行されていた命令が配置されている領域を特定し、
特定した前記領域に配置されている前記命令を、特定の割込みを発生させる命令に書き換え、
前記第２プロセッサは、
前記特定の割込みを発生させる命令を実行することによって発生した前記特定の割込みに応じてハングアップ状態を解除する、
処理を実行する情報処理システム。
【０１０６】
（付記２）
前記情報は、前記実行中の命令を含む関数の先頭アドレス及び当該関数のサイズの情報と含む、
付記１記載の情報処理システム。
【０１０７】
（付記３）
前記複数のプロセッサのうち第３プロセッサが、
前記第２プロセッサとの間で実行する同期処理が完了しない場合、前記第１プロセッサに、前記第２プロセッサがハングアップしたことを通知する、
処理をさらに実行する付記１又は２記載の情報処理システム。
【０１０８】
（付記４）
前記複数のプロセッサの各々は、
メインルーチンの開始時及び関数への遷移時に、当該関数の先頭アドレス及び当該関数のサイズの情報を前記記憶装置に保存する、
付記２記載の情報処理システム。
【０１０９】
（付記５）
プロセッサが、
他のプロセッサがハングアップした場合、前記他のプロセッサによって記憶装置に保存された、前記他のプロセッサが実行するプログラムのうち実行中の命令が配置されている前記記憶装置上の領域を示す情報に基づき、ハングアップした時に実行されていた命令が配置されている領域を特定し、
特定した前記領域に配置されている前記命令を、特定の割込みを発生させる命令に書き換える、
処理を実行する実行制御方法。
【０１１０】
（付記６）
プロセッサに、
他のプロセッサがハングアップした場合、前記他のプロセッサによって記憶装置に保存された、前記他のプロセッサが実行するプログラムのうち実行中の命令が配置されている前記記憶装置上の領域を示す情報に基づき、ハングアップした時に実行されていた命令が配置されている領域を特定し、
特定した前記領域に配置されている前記命令を、特定の割込みを発生させる命令に書き換える、
処理を実行させる実行制御プログラム。
【０１１１】
（付記７）
複数のプロセッサと、前記複数のプロセッサがアクセス可能な記憶装置とを有する情報処理システムにおいて実行される実行制御方法であって、
前記複数のプロセッサの各々は、
当該プロセッサが実行するプログラムのうち実行中の命令が配置されている、前記記憶装置上の領域を示す情報を、当該命令の実行時に前記記憶装置に保存し、
前記複数のプロセッサのうち第１プロセッサは、
前記複数のプロセッサのうち第２プロセッサがハングアップした場合、前記第２プロセッサによって前記記憶装置に保存された前記情報に基づき、ハングアップした時に実行されていた命令が配置されている領域を特定し、
特定した前記領域に配置されている前記命令を、特定の割込みを発生させる命令に書き換え、
前記第２プロセッサは、
前記特定の割込みを発生させる命令を実行することによって発生した前記特定の割込みに応じてハングアップ状態を解除する、
処理を実行する実行制御方法。
【符号の説明】
【０１１２】
１  情報処理装置    １００  メモリ
１１０  記憶装置    １０００  制御部
１００１  監視部    １００２  書き換え部
１００３  起動部    １００４  割り込みハンドラ
１００５  展開部    １００６  領域特定部
１００７  第１初期化部    １００８  第２初期化部
１００９  関数ネストカウンタ    １０１０  関数情報領域
１０１１  フラグ設定部    １０１２  フラグ領域
２０００  試験部    ２００１  実行部
２００２  設定部    ２００３  割り込みハンドラ
【図１】
0006597414.tif 000002
【図２】
0006597414.tif 000003
【図３】
0006597414.tif 000004
【図４】
0006597414.tif 000005
【図５】
0006597414.tif 000006
【図６】
0006597414.tif 000007
【図７】
0006597414.tif 000008
【図８】
0006597414.tif 000009
【図９】
0006597414.tif 000010
【図１０】
0006597414.tif 000011
【図１１】
0006597414.tif 000012
【図１２】
0006597414.tif 000013
【図１３】
0006597414.tif 000014
【図１４】
0006597414.tif 000015
【図１５】
0006597414.tif 000016
【図１６】
0006597414.tif 000017
【図１７】
0006597414.tif 000018
【図１８】
0006597414.tif 000019
【図１９】
0006597414.tif 000020
【図２０】
0006597414.tif 000021
【図２１】
0006597414.tif 000022
【図２２】
0006597414.tif 000023
【図２３】
0006597414.tif 000024
【図２４】
0006597414.tif 000025
【図２５】
0006597414.tif 000026