(57)【要約】【課題】並行プログラムの安定した挙動を実現する。【解決手段】本発明の一態様としてのマルチタスク処理装置は、各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、各タスク間でのセクションの組み合わせを１つ以上定めた安定集合を記憶する安定集合記憶部と、前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他の各タスクの現在のセクションとの組をプログラム実行状態として求めるプログラム実行状態算出部と、各前記プログラム実行状態と前記安定集合との距離をそれぞれ計算する距離計算部と、各計算された距離に基づき、次に実行すべきタスクを選択し、選択したタスクを実行するタスク実行部と、を備える。【選択図】図３
2008269579.tif 000002
【特許請求の範囲】
【請求項１】
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
各前記タスク間でのセクションの組み合わせを１つ以上定めた安定集合を記憶する安定集合記憶部と、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求めるプログラム実行状態算出部と、
各前記プログラム実行状態と前記安定集合との距離を計算する距離計算部と、
各計算された距離に基づき、次に実行すべきタスクを選択し実行するタスク実行部と、
を備えたマルチタスク処理装置。
【請求項２】
前記距離計算部は、前記プログラム実行状態と同じセクションの組み合わせが前記安定集合に含まれる場合は第１の値を前記距離として計算し、含まれない場合は第２の値を前記距離として計算し、
前記タスク実行部は、前記第１の値をもつタスクの中から前記次に実行すべきタスクを優先的に選択する、
ことを特徴とする請求項１に記載のマルチタスク処理装置。
【請求項３】
前記安定集合記憶部に含まれる各前記セクションの組み合わせは、所定の計算機資源にアクセスするタスクの総数が第１閾値以下になるセクションの組み合わせ、または、各タスクによるメモリ使用量の合計が第２閾値以下になるセクションの組み合わせであることを特徴とする請求項１または２に記載のマルチタスク処理装置。
【請求項４】
前記距離計算部は、前記プログラム実行状態と、前記安定集合記憶部に含まれる各前記セクションの組み合わせとの間で、セクションの不一致数をそれぞれ計算し、各計算された不一致数のうちの最小値を前記距離として得ることを特徴とする請求項１に記載のマルチタスク処理装置。
【請求項５】
前記距離計算部は、前記プログラム実行状態と、前記安定集合記憶部に含まれる各前記セクションの組み合わせとの間でセクションの一致数をそれぞれ計算し、各計算された一致数のうちの最大値を前記距離として得ることを特徴とする請求項１に記載のマルチタスク処理装置。
【請求項６】
各セクションと、メモリ使用量とを対応づけた情報を保持するメモリ使用情報保持部をさらに備え、
前記安定集合記憶部に含まれる各前記セクションの組み合わせは、各タスクによるメモリ使用量の合計が第２閾値以下になるセクションの組み合わせであり、
前記距離計算部は、前記プログラム実行状態と同じセクションの組み合わせが前記安定集合に含まれる場合は第１の値を前記距離として計算し、含まれない場合は各セクションに対応するメモリ使用量の合計を前記距離として計算する、
ことを特徴とする請求項１に記載のマルチタスク処理装置。
【請求項７】
各セクションと、消費電力量とを対応づけた情報を保持する消費電力情報保持部をさらに備え、
前記タスク実行部は各々個別にタスクを実行する２つ以上の実行部を有し、
各前記セクションの組み合わせは、各前記実行部により実行されるタスクによる消費電力量の合計が第３閾値以下になるセクションの組み合わせであり、
前記プログラム実行状態算出部は、実行中のタスク以外の各タスクについて、前記実行中のタスクの現在のセクションと、空いている実行部に次に実行させるとしたときに実行が開始されるセクションとの組を前記プログラム実行状態として算出し、
前記距離計算部は、各前記プログラム実行状態について、前記プログラム実行状態と同じセクションの組み合わせが前記安定集合に含まれるときは第１の値を前記距離として計算し、含まれないときは第２の値を前記距離として計算する、
ことを特徴とする請求項１に記載のマルチタスク処理装置。
【請求項８】
各セクションと、消費電力量とを対応づけた情報を保持する消費電力情報保持部をさらに備え、
前記タスク実行部は各々個別にタスクを実行する２つ以上の実行部を有し、
各前記セクションの組み合わせは、各前記実行部により実行されるタスクによる消費電力量の合計が第３閾値以下になるセクションの組み合わせであり、
前記プログラム実行状態算出部は、実行中のタスク以外の各タスクについて、前記実行中のタスクの現在のセクションと、空いている実行部に次に実行させるとしたときに実行が開始されるセクションとの組を前記プログラム実行状態として算出し、
前記距離計算部は、各前記プログラム実行状態について、前記プログラム実行状態と同じセクションの組み合わせが前記安定集合に含まれるときは第１の値を前記距離として計算し、含まれないときは前記プログラム実行状態に含まれる各セクションに対応する消費電力量の合計を前記距離として計算する、
ことを特徴とする請求項１に記載のマルチタスク処理装置。
【請求項９】
前記タスク実行部は、
前記プログラム実行状態と前記安定集合から計算された距離に基づき各タスクの第１優先度を決定し、
最も高い第１優先度をもつタスクが１つの場合は該タスクを前記次に実行すべきタスクとして選択し、
最も高い第１優先度をもつタスクが２つ以上ある場合は、前記最も高い第１優先度をもつタスクのうち、あらかじめ指定された優先度である第２優先度が最も高いタスクを選択し、
選択されたタスクが１つのときは該タスクを前記次に実行するべきタスクとして選択し、
選択されたタスクが２つ以上存在する場合は、選択されたタスクのうち最も早く実行待ち状態になったタスクを前記次に実行すべきタスクとして選択する、
ことを特徴とする請求項１に記載のマルチタスク処理装置。
【請求項１０】
前記タスク実行部は、あらかじめ指定された優先度である第２優先度に基づき最も第２優先度の高いタスクを選択し、
選択されたタスクが１つの場合はこのタスクを前記次に実行すべきタスクとして選択し、
選択されたタスクが２つ以上の場合は、選択された前記２つ以上のタスクについて計算された前記距離に基づき、前記選択された２つ以上のタスクについてそれぞれ第１優先度を決定し、
最も高い第１優先度をもつタスクが１つのときは該タスクを前記次に実行するべきタスクとして選択し、
最も高い第１優先度をもつタスクが２つ以上存在するときは、前記最も高い第１優先度をもつタスクのうち最も早く実行可能待ち状態になったタスクを前記次に実行すべきタスクとして選択する、
ことを特徴とする請求項１に記載のマルチタスク処理装置。
【請求項１１】
前記タスク実行部によるタスクの実行により所定の不具合が発生したか否かを検査し、前記タスクに対応するプログラム実行状態と、不具合の発生の有無を示す情報とを、あらかじめ指定された遠隔監視装置に通知する通知部と、
前記遠隔監視装置から更新された安定集合を表すデータを受信し、受信したデータにより前記安定集合記憶部内の安定集合を更新する更新部と、
をさらに備えたことを特徴とする請求項１に記載のマルチタスク処理装置。
【請求項１２】
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
N（Nは２以上の整数）個のセクションからなるセクション系列を１つ以上定めた安定集合を記憶する安定集合記憶部と、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションを求めるセクション算出部と、
直前に実行されたN-1回の各セクションと前記セクション算出部により求められたセクションとからなるセクション系列と、前記安定集合との距離を前記タスク毎に計算する距離計算部と、
各計算された距離に基づき、次に実行すべきタスクを選択し実行するタスク実行部と、
を備えたマルチタスク処理装置。
【請求項１３】
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
１つ以上のタスクと、セクションとの組を１つ以上定めた安定集合を記憶する安定集合記憶部と、
前記複数のタスクのうち実行可能状態にあるタスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションを求めるセクション算出部と、
前記実行可能状態にあるタスク集合を、前記実行可能状態にあるタスク毎に求められたセクションと組み合わせて得られる複数の組と、前記安定集合との距離を計算する距離計算部と、
各計算された距離に基づき、前記実行可能状態にあるタスクの中から次に実行すべきタスクを選択し実行するタスク実行部と、
を備えたマルチタスク処理装置。
【請求項１４】
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
各前記タスクに含まれるセクションの特徴を表すセクション特徴値を記憶する記憶部と、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求めるプログラム実行状態算出部と、
各前記プログラム実行状態に含まれるセクションのセクション特徴値に基づき、次に実行すべきタスクを選択し実行するタスク実行部と、
を備えたマルチタスク処理装置。
【請求項１５】
前記セクション特徴値は、前記セクション特徴値に対応する前記セクションにおいて前記タスクが所定の計算機資源にアクセスするか否かを示し、
前記タスク実行部は、前記プログラム実行状態ごとに前記所定の計算機資源にアクセスするタスク数を計算し、前記タスク数が最も小さいプログラム実行状態に対応するタスクを選択する、
ことを特徴とする請求項１４に記載のマルチタスク処理装置。
【請求項１６】
前記セクション特徴値は、前記セクション特徴値に対応する前記セクションで消費されるメモリ使用量を示し、
前記タスク実行部は、前記プログラム実行状態ごとに各セクションのメモリ使用量の合計を計算し、前記メモリ使用量の合計が最小となるプログラム実行状態に対応するタスクを選択する、
ことを特徴とする請求項１４に記載のマルチタスク処理装置。
【請求項１７】
前記タスク実行部は、各々個別にタスクを実行する２つ以上の実行部を有し、
前記セクション特徴値は、前記セクション特徴値に対応する前記セクションで消費される電力消費量を示し、
前記プログラム実行状態算出部は、実行中のタスク以外の各タスクについて、前記実行中のタスクの現在のセクションと、空いている実行部に次に実行させるとしたときに実行が開始されるセクションとの組を前記プログラム実行状態として算出し、
前記タスク実行部は、各前記プログラム実行状態に含まれるセクションの電力消費量の合計をそれぞれ計算し、前記電力消費量の合計が最小となるプログラム実行状態に対応するタスクを選択する、
ことを特徴とする請求項１８に記載のマルチタスク処理装置。
【請求項１８】
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
各前記タスク間でのセクションの組と、１つ以上の共有資源の状態とのペアを１つ以上定めた安定集合を記憶する安定集合記憶部と、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求め、また前記プログラム実行状態毎に前記プログラム実行状態で用いられる共有資源の状態を特定する、プログラム実行状態算出部と、
各前記プログラム実行状態と、それぞれに対応して求められた共有資源の状態とのペアと前記安定集合との距離をそれぞれ計算する距離計算部と、
各計算された距離に基づき、次に実行すべきタスクを選択し実行するタスク実行部と、
を備えたことを特徴とするマルチタスク処理装置。
【請求項１９】
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
前記タスク毎に、前記タスクの個々のセクションと、１つ以上の共有資源の状態との組を１つ以上定めた安定集合を記憶する安定集合記憶部と、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求め、
前記プログラム実行状態毎に前記複数のタスクで用いられる共有資源の状態を特定し、
前記プログラム実行状態に含まれるセクションのそれぞれを前記特定した共有資源の状態と組み合わせて、それぞれ１つの前記セクションと前記特定した共有資源の状態とを含む複数の組を生成する、プログラム実行状態算出部と、
生成した複数の組と前記安定集合とのマッチ数に基づいて、前記安定集合との距離を計算する距離計算部と、
前記タスク毎に計算された距離に基づき、次に実行すべきタスクを選択し実行するタスク実行部と、
を備えたことを特徴とするマルチタスク処理装置。
【請求項２０】
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
前記タスク毎に、前記タスクの個々のセクションと、１つの共有資源の状態との組を１つ以上定めた安定集合を記憶する安定集合記憶部と、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求め、
前記プログラム実行状態に含まれるセクション毎に前記セクションで用いられる共有資源の状態を特定し、
前記プログラム実行状態に含まれるセクション毎に、前記セクションを、前記特定した共有資源の状態のそれぞれと組み合わせて、それぞれ１つの前記セクションと１つの前記特定した共有資源とを含む複数の組を生成する、プログラム実行状態算出部と、
生成した複数の組と前記安定集合とのマッチ数に基づいて、前記安定集合との距離を計算する距離計算部と、
前記タスク毎に計算された距離に基づき、次に実行すべきタスクを選択し実行するタスク実行部と、
を備えたことを特徴とするマルチタスク処理装置。
【請求項２１】
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
前記タスク毎に、前記タスクの個々のセクションと、１つ以上の共有資源の状態との組を１つ以上定めた安定集合を記憶する安定集合記憶部と、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求め、
前記プログラム実行状態に含まれるセクション毎に前記セクションで用いられる共有資源の状態を特定し、
前記プログラム実行状態に含まれるセクション毎に、前記セクションを前記特定した共有資源の状態と組み合わせて、それぞれ１つの前記セクションと前記特定した共有資源の状態とを含む複数の組を生成する、プログラム実行状態算出部と、
生成した複数の組と前記安定集合とのマッチ数に基づいて、前記安定集合との距離を計算する距離計算部と、
前記タスク毎に計算された距離に基づき、次に実行すべきタスクを選択し実行するタスク実行部と、
を備えたことを特徴とするマルチタスク処理装置。
【請求項２２】
前記安定集合記憶部に記憶された安定集合は、試験済のセクションと共有資源の組の集合であることを特徴とする請求項１８ないし２１のいずれか一項に記載のマルチタスク処理装置。
【請求項２３】
前記安定集合記憶部に記憶された安定集合は、テストケースに対して前記複数のタスクを実行することにより観測された、セクションと共有資源とに関する観測不変条件を満たすものであることを特徴とする請求項２１に記載のマルチタスク処理装置。
【請求項２４】
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理方法であって、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求め、
各前記プログラム実行状態と、各タスク間でのセクションの組み合わせを１つ以上定めた安定集合との距離をそれぞれ計算し、
各計算された距離に基づき、次に実行すべきタスクを選択し実行する、
ことを特徴とするマルチタスク処理方法。
【請求項２５】
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理方法であって、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求め、
各前記プログラム実行状態に含まれるセクションの特徴を表すセクション特徴値に基づき、次に実行すべきタスクを選択し実行する、
ことを特徴とするマルチタスク処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチタスク処理装置およびその方法に関し、たとえばコンピュータに代表される情報処理装置のプログラム開発および実行を支援する技術の改良に関するもので、より具体的には、信頼性の高く性能が安定したプログラムを開発する技術に関するものである。
【背景技術】
【０００２】
コンピュータのプログラムを開発するには、専用のプログラム開発支援装置を用いて、プログラムのソースコードを作成し、テスト実行やミスの除去（デバッグ）などを行なう。このようなプログラム開発支援装置は、エディタやテスト実行のためのシミュレータなど専用の機能を持ち、ＣＡＳＥツールなどとも呼ばれる。
【０００３】
本来、コンピュータのプログラムは状況に応じてコンピュータの動作を制御するものであるから、入力が変わればプログラム内容に応じて動作も変わる。しかし、このように予め設計された挙動の範囲（想定の範囲）を超えて、多様な動作を示すプログラムも存在する。そのようにプログラムの実行時の挙動が非決定的であるプログラムを非決定的なプログラムと呼ぶ。対して、前記のように入力が決まれば挙動が一意に定まるプログラムは決定的なプログラムと呼ぶ。
【０００４】
非決定的なプログラムの代表例は並行プログラムである。並行プログラムは、複数のプロセスが別々に動作しながら協調するので、各プロセスのどの部分がどのようなタイミングで実行されるかによって、全体としての動作が異なってくる。並行プログラムには、単一ＣＰＵ上で複数のタスクが概念的に並行に動くマルチタスク（マルチスレッド、マルチプロセスとも呼ぶ）システムと、複数のＣＰＵ上で物理的にも並行で動く並列マルチタスクシステムがある。また、プログラムそのものには並行性がない場合でも、外部からの入力のタイミングなどに起因して実行順序に非決定性が発生し、事実上の非決定性を示すプログラムも存在する。例えば、プラントを制御するシーケンス制御（ラダー，ＳＦＣ）プログラムやＩＦ−ＴＨＥＮ  ル−ル型のプログラムにはタスクという概念がないが、外部からの入力のタイミングでル−ルの実行順序が変わってしまう場合があり非決定性を持つ。
【特許文献１】特開平8-16429号公報
【特許文献２】特許第3675623号
【特許文献３】特許第3641090号
【特許文献４】特許第3278588号
【発明の開示】
【発明が解決しようとする課題】
【０００５】
ところで、並行プログラムに代表される非決定的なプログラムをテスト及びデバッグする開発作業は、文献「Ｃ．Ｅ．ＭｃＤｏｗｅｌｌ、  Ｄ．Ｐ．  Ｈｅｌｍｂｏｌｄ、  Ｄｅｂｕｇｇｉｎｇ  Ｃｏｎｃｕｒｒｅｎｔ  Ｐｒｏｇｒａｍｓ、  ＡＣＭ  Ｃｏｍｐｕｔｉｎｇ  Ｓｕｒｖｅｙｓ、  Ｖｏｌ．２１、  Ｎｏ．４、  １９８９．  」に示されているように、決定的なプログラムの開発作業に比べて非常に困難である。これは、非決定性を持つプログラムに従来のテスト・デバッグの手法を適用した場合、プログラムが非決定的な挙動を持つために、（１）必要なテストケ−スが条件の組合せによって膨大な数になり、また（２）バグの発生自体も再現性がない、といった問題が生じるためである。この問題を解決するために従来用いられていたアプロ−チは下記の３種類に分類できる。
（１）プログラムテスト技術（並行プログラム用デバッガなど）
（２）プログラム検証技術（並行プログラムの検証など）
（３）プログラム合成手法（論理による仕様記述からプログラム生成など）
しかし、これらのアプロ−チには、
（１）個々のユ−ザのスキルに依存する部分が大きい
（２）単純化した例題のような簡単なプログラムにしか適用できない
といった問題があった。
【０００６】
また、試験工程で十分テストを行なったプログラムでも、実際の実行時に試験工程と実行環境すなわちマシンの性能、入力のタイミング、処理系などが異なり、試験では起こらなかった非決定的な挙動により、不具合が発生する場合が多い。銀行のオンラインシステムなど高い信頼性を要求されるシステムにおいては、このようなバグが致命的な事故を引き起こす場合もある。
【０００７】
さらに、機能上の不具合だけでなく、意図しなかった非決定的な低消費電力やメモリ使用量などが想定範囲を超えてシステムとして不具合を生じる場合もある。
【０００８】
このような問題点を解決すべく、本出願人は、信頼性の高い並行プログラムを開発するための技術として、超逐次プログラミングを提案している（特開平8-16429号公報、特許第3675623号、特許第3641090号、特許第3278588号、米国特許第6598222号、米国特許第6275980号、米国特許第5956511号、米国特許第6067415号、米国特許第5860009号）。この技術は、並行プログラムを一旦逐次化し、そのプログラムについてテスト実行とデバッグを行ない、正しい実行ログだけをマージし、それを外れる挙動を除外したグローバル状態遷移システムから、改めて並行プログラム全体を再度生成するものである。
【０００９】
しかし、この技術では、プログラムの規模に応じたサイズの状態遷移モデルを扱わなければならず、また、並行プログラムを一旦逐次化して再度生成する必要がある。このため、並行プログラムが大規模化すると全体の処理量が多くなり、効率的な適用が困難であった。
【００１０】
また、本出願人は、シナリオを用いたプログラミング支援装置を提案している。この技術では、プロセスに含まれる各部分の実行順序を状態遷移図形式のシナリオで表している。このシナリオは、ノードをエッジで接続したネットワーク状のもので、ノードが状態を表し、ノードから延びるエッジはノードが表す状態から実行可能なプログラムの部分を表し、一つのノードから複数のエッジが出て行く場合も多い。このようなシナリオの分岐から、利用者が、妥当でないエッジを削除して行くと妥当な実行順序を表すエッジがシナリオに残る。この順序を実現するための同期命令を各プロセスに埋め込むことによってユーザが認める実行順序を実現するというものである。
【００１１】
しかし、この技術でも、複数のプロセスを含む並行プログラム全体を状態遷移図形式で表す必要があるため、複雑な並行プログラムについてはそれに比例して複雑な状態遷移図を扱わなければならないという問題点があった。また、プログラムに埋め込む同期命令の分だけ、プログラムが複雑化して理解しにくく、容量が増大するという問題点があった。さらに、このようにプログラムに同期命令を埋め込む場合、プログラミング（コーディング）の段階からプログラム中に存在する同期命令と、上記のような実行順序を実現するために新たに埋め込まれた同期命令が相互に影響する可能性もあり、これを避けるためにはその分注意してコーディングを行なわなければならなかった。
【００１２】
また、既存の超逐次プログラミングの発明では、実行履歴（ログ）に含まれる挙動を示すタスクの実行を優先するスケジューラの提案をしていた。ここで、実行履歴（ログ）に含まれる挙動は、過去に動いた実績があるという意味で本発明における「安定集合」の１つの具体例になっている。しかし、この技術では、安定集合に含まれるか否かの判断であり、安定集合からの距離という概念はなかった。実際、安定集合が小さく、ほとんどの場合安定集合外である時には、本技術は機能しなかった。
【００１３】
さらに、本出願人は、割り込み処理のプログラミングに適した超逐次プログラミングの発明を提案している。この技術では、割り込み処理を用いるプログラムにおいて、割り込みを許可しようとする候補の箇所を仮に指定して実行をテストする。そして、利用者が実行結果を正しいと認めると、その正しい結果を発生させた候補の箇所およびその周辺の問題のない範囲に実際に割り込み許可命令が付加されるというものである。
【００１４】
しかし、この技術では、割り込みを許可しようとする候補の箇所を予め指定しなければならない点で手数が煩雑である。特に、複数の割り込みが重なる複雑な場合に指定するのは難しかった。
【００１５】
本発明は、並行プログラムの安定した挙動を実現できるマルチタスク処理装置およびその方法を提供する。
【課題を解決するための手段】
【００１６】
本発明の一態様としてのマルチタスク処理装置は、
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
各前記タスク間でのセクションの組み合わせを１つ以上定めた安定集合を記憶する安定集合記憶部と、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求めるプログラム実行状態算出部と、
各前記プログラム実行状態と前記安定集合との距離を計算する距離計算部と、
各計算された距離に基づき、次に実行すべきタスクを選択し実行するタスク実行部と、
を備える。
【００１７】
上記マルチタスク処理装置では、安定した挙動を示すことをあらかじめ保証された状態から離れた状態に、プログラムの実行状態が遷移することを抑制する効果があり、プログラムの不具合の発生を抑制する効果がある。
【００１８】
本発明の一態様としてのマルチタスク処理装置は、
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
各タスクに含まれるセクションの特徴を表すセクション特徴値を記憶する記憶部と、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求めるプログラム実行状態算出部と、
各前記プログラム実行状態に含まれるセクションのセクション特徴値に基づき、次に実行すべきタスクを選択し実行するタスク実行部と、
を備える。
【００１９】
上記マルチタスク処理装置では、例えば各セクションのメモリ推定使用量や想定電力使用量などのセッションが使用する計算機資源に関する特徴値を用いて、プログラムの実行状態が計算機資源を想定以上に使用する状態に遷移することを抑制する効果があり、プログラムの不具合の発生を抑制する効果がある。
【００２０】
本発明の一態様としてのマルチタスク処理装置は、
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
各前記タスク間でのセクションの組み合わせと、１つ以上の共有資源の状態との組を１つ以上定めた安定集合を記憶する安定集合記憶部と、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求め、また各前記プログラム実行状態において前記複数のタスクで用いられる共有資源およびその状態を特定する、プログラム実行状態算出部と、
各前記プログラム実行状態と、それぞれに対応して求められた共有資源の状態との組と前記安定集合との距離を計算する距離計算部と、
各計算された距離に基づき、次に実行すべきタスクを選択し実行するタスク実行部と、
を備えたことを特徴とする。
【００２１】
本発明の一態様としてのマルチタスク処理装置は、
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
前記タスク毎に、前記タスクのセクションと、１つ以上の共有資源の状態との組を１つ以上定めた安定集合を記憶する安定集合記憶部と、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求め、
各前記プログラム実行状態において前記複数のタスクで用いられる共有資源およびその状態を特定し、
前記プログラム実行状態に含まれる各セクションを前記特定した共有資源の状態と組み合わせて、それぞれセクションと前記特定した共有資源の状態とを含む複数の組を生成する、プログラム実行状態算出部と、
生成した複数の組のうち前記安定集合記憶部に記憶されている組の個数に基づいて、前記安定集合との距離を計算する距離計算部と、
前記タスク毎に計算された距離に基づき、次に実行すべきタスクを選択し実行するタスク実行部と、
を備えたことを特徴とする。
【００２２】
本発明の一態様としてのマルチタスク処理装置は、
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
前記タスク毎に、前記タスクのセクションと、１つの共有資源の状態との組を１つ以上定めた安定集合を記憶する安定集合記憶部と、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求め、
前記プログラム実行状態に含まれるセクション毎に前記セクションで用いられる共有資源およびその状態を特定し、
前記プログラム実行状態に含まれるセクション毎に、前記セクションを、前記特定した共有資源の状態のそれぞれと組み合わせて、それぞれセクションと１つの特定した共有資源とを含む複数の組を生成する、プログラム実行状態算出部と、
生成した複数の組のうち前記安定集合記憶部に記憶されている組の個数に基づいて、前記安定集合との距離を計算する距離計算部と、
前記タスク毎に計算された距離に基づき、次に実行すべきタスクを選択し実行するタスク実行部と、
を備えたことを特徴とする。
【００２３】
本発明の一態様としてのマルチタスク処理装置は、
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
前記タスク毎に、前記タスクのセクションと、１つ以上の共有資源の状態との組を１つ以上定めた安定集合を記憶する安定集合記憶部と、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求め、
前記プログラム実行状態に含まれるセクション毎に前記セクションで用いられる共有資源およびその状態を特定し、
前記プログラム実行状態に含まれるセクション毎に、前記セクションを前記特定した共有資源の状態のすべてと組み合わせて、それぞれ前記セクションと前記特定した共有資源の状態のすべてとを含む複数の組を生成する、プログラム実行状態算出部と、
生成した複数の組のうち前記安定集合記憶部に記憶されている組の個数に基づいて、前記安定集合との距離を計算する距離計算部と、
前記タスク毎に計算された距離に基づき、次に実行すべきタスクを選択し実行するタスク実行部と、
を備えたことを特徴とする。
【００２４】
本発明の一態様としてのマルチタスク処理装置は、
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
各前記タスク間でのセクションの組と、１つ以上の共有資源の状態とのペアを１つ以上定めた安定集合を記憶する安定集合記憶部と、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求め、また前記プログラム実行状態毎に前記プログラム実行状態で用いられる共有資源の状態を特定する、プログラム実行状態算出部と、
各前記プログラム実行状態と、それぞれに対応して求められた共有資源の状態とのペアと前記安定集合との距離をそれぞれ計算する距離計算部と、
各計算された距離に基づき、次に実行すべきタスクを選択し実行するタスク実行部と、
を備えたことを特徴とする。
【００２５】
本発明の一態様としてのマルチタスク処理装置は、
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
前記タスク毎に、前記タスクの個々のセクションと、１つ以上の共有資源の状態との組を１つ以上定めた安定集合を記憶する安定集合記憶部と、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求め、
前記プログラム実行状態毎に前記複数のタスクで用いられる共有資源の状態を特定し、
前記プログラム実行状態に含まれるセクションのそれぞれを前記特定した共有資源の状態と組み合わせて、それぞれ１つの前記セクションと前記特定した共有資源の状態とを含む複数の組を生成する、プログラム実行状態算出部と、
生成した複数の組と前記安定集合とのマッチ数に基づいて、前記安定集合との距離を計算する距離計算部と、
前記タスク毎に計算された距離に基づき、次に実行すべきタスクを選択し実行するタスク実行部と、
を備えたことを特徴とする。
【００２６】
本発明の一態様としてのマルチタスク処理装置は、
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
前記タスク毎に、前記タスクの個々のセクションと、１つの共有資源の状態との組を１つ以上定めた安定集合を記憶する安定集合記憶部と、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求め、
前記プログラム実行状態に含まれるセクション毎に前記セクションで用いられる共有資源の状態を特定し、
前記プログラム実行状態に含まれるセクション毎に、前記セクションを、前記特定した共有資源の状態のそれぞれと組み合わせて、それぞれ１つの前記セクションと１つの前記特定した共有資源とを含む複数の組を生成する、プログラム実行状態算出部と、
生成した複数の組と前記安定集合とのマッチ数に基づいて、前記安定集合との距離を計算する距離計算部と、
前記タスク毎に計算された距離に基づき、次に実行すべきタスクを選択し実行するタスク実行部と、
を備えたことを特徴とする。
【００２７】
本発明の一態様としてのマルチタスク処理装置は、
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理装置であって、
前記タスク毎に、前記タスクの個々のセクションと、１つ以上の共有資源の状態との組を１つ以上定めた安定集合を記憶する安定集合記憶部と、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求め、
前記プログラム実行状態に含まれるセクション毎に前記セクションで用いられる共有資源の状態を特定し、
前記プログラム実行状態に含まれるセクション毎に、前記セクションを前記特定した共有資源の状態と組み合わせて、それぞれ１つの前記セクションと前記特定した共有資源の状態とを含む複数の組を生成する、プログラム実行状態算出部と、
生成した複数の組と前記安定集合とのマッチ数に基づいて、前記安定集合との距離を計算する距離計算部と、
前記タスク毎に計算された距離に基づき、次に実行すべきタスクを選択し実行するタスク実行部と、
を備えたことを特徴とする。
【００２８】
本発明の一態様としてのマルチタスク処理方法は、
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理方法であって、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求め、
各前記プログラム実行状態と、各前記タスク間でのセクションの組み合わせを１つ以上定めた安定集合との距離をそれぞれ計算し、
各計算された距離に基づき、次に実行すべきタスクを選択し、
選択したタスクを実行する。
【００２９】
上記マルチタスク処理方法では、安定した挙動を示すことをあらかじめ保証された状態から離れた状態に、プログラムの実行状態が遷移することを抑制する効果があり、プログラムの不具合の発生を抑制する効果がある。
【００３０】
本発明の一態様としてのマルチタスク処理方法は、
各々２つ以上のセクションに分割された複数のタスクをマルチタスク処理するマルチタスク処理方法であって、
前記タスク毎に、前記タスクを次に実行するとしたときに実行が開始されるセクションと、前記タスクと異なる他のタスクの現在のセクションとの組をプログラム実行状態として求め、
各前記プログラム実行状態に含まれるセクションの特徴を表すセクション特徴値に基づき、次に実行すべきタスクを選択し、選択したタスクを実行する。
【００３１】
上記マルチタスク処理方法では、例えば各セクションのメモリ推定使用量や想定電力使用量などのセッションが使用する計算機資源に関する特徴値を用いて、プログラムの実行状態が計算機資源を想定以上に使用する状態に遷移することを抑制する効果があり、プログラムの不具合の発生を抑制する効果がある。
【発明の効果】
【００３２】
本発明により、並行プログラム等の非決定性を持つプログラムにおける安定した挙動を実現できる。
【発明を実施するための最良の形態】
【００３３】
以下、図面を参照しながら、本発明の実施の形態について説明する。
【００３４】
図１は、本実施形態を実現するために用いるコンピュータシステムのハードウェア構成を示すブロック図である。
【００３５】
このコンピュータシステムは、プロセッサ１１と、Ｉ／Ｏインターフェース（バス）１２と、主記憶装置１３と、入出力装置（入力装置および出力装置）１４と、外部記憶装置１５とを備える。
【００３６】
プロセッサ１１は、本実施形態の機能を実現するためのソフトウェアを実行する。プロセッサ１１はＯＳ（Operating System：オペレーティングシステム）の制御の下、複数のタスクをマルチタスク処理するのに用いられる。プロセッサ１１は、Ｉ／Ｏインターフェース１２に接続され、このＩ／Ｏインターフェース１２を介して主記憶装置１３等の周辺装置にアクセスすることができる。
【００３７】
主記憶装置１３は、ＲＡＭ（Random Access Memory）等のメモリであり、各タスクが情報を交換して協調動作を行うのに用いられる。
【００３８】
入出力装置１４は、キーボードやポインティングデバイスなどを含み、ユーザによる各種コマンドやデータの入力を受け入れる。また入出力装置１４は、ＣＲＴディスプレイなどを含み、テキスト表示又はグラフィック表示を行う。ユーザは、入出力装置１４を用いて、対話的にコンピュータを操作することができる。
【００３９】
外部記憶装置１５は、磁気ディスク装置または光磁気ディスク装置などを用いて、プロセッサ１１に実行させるプログラム、および該プログラムで使用される情報を書き込み及び読み出すことができる。
【００４０】
本実施形態は主として単一ＣＰＵによるマルチタスク計算機を例として用いて説明するが、図２に示すようなマルチＣＰＵシステム、または、共有メモリのある並列計算機、または、共有メモリのない並列計算機、または、分散ネットワーク計算機システム、などを用いても本実施形態は実現可能である。図２のマルチＣＰＵシステムについて説明すると以下の通りである。
【００４１】
このコンピュータシステムは、Ｎ台のプロセッサ１０１−１、１０１−２、…、１０１−Ｎを有し、このうち少なくとも１つのプロセッサが、本実施形態の機能を実現するためのソフトウェアを実行する。また、各プロセッサ１０１−１、１０１−２、…、１０１−Ｎはそれぞれ、並行プログラムの各タスクを同時並行的に実行するのに用いられる。これら各プロセッサ１０１−１、１０１−２、…、１０１−Ｎは、Ｉ／Ｏインターフェース１０２に接続され、このＩ／Ｏインターフェース１０２を介して共有メモリ（主記憶装置）１０３等の周辺装置にアクセスすることができる。
【００４２】
共有メモリ１０３は、各プロセッサ１０１−１、１０１−２、…、１０１−Ｎ上で実行される各タスクが情報を交換して協調動作を行うのに用いられる。
【００４３】
入力装置１０４は、キーボードおよびポインティングデバイスなどを含み、ユーザによる各種コマンドおよびデータの入力を受け入れる。出力装置１０５は、ＣＲＴディスプレイなどを含み、テキスト表示又はグラフィック表示を行う。ユーザは、これら入力装置１０４及び出力装置１０５を用いて、対話的にコンピュータを操作することができる。
【００４４】
外部記憶装置１０６は、磁気ディスク装置や光磁気ディスク装置などを用いて、ＣＰＵに実行させるプログラムおよび該プログラムで使用される情報を書き込み及び読み出すことができる。
【００４５】
本実施形態の各機能は、先に述べたように、ソフトウェアによって実現されるが、このソフトウェアが上記のような一連のハードウェア資源を利用することによって本実施形態の効果を生じさせる。したがって、各ハードウェア資源の構成および種類は、それぞれ同様の機能を果たす他の構成および種類のものに置き換えても差しつかえない。
【００４６】
図３は、本実施形態にかかるマルチタスク処理装置の機能ブロック図を示す。
【００４７】
このマルチタスク処理装置は、たとえばＯＳの一部の機能を実現するものであり、タスク実行部２１、プログラム実行状態算出部２２、安定距離計算部２３、タスク優先度計算部（タスク選択部）２４、記憶部２５を備える。プログラム実行状態算出部２２、安定距離計算部２３、タスク優先度計算部（タスク選択部）２４はたとえばＯＳのスケジューラの一部に含まれる。記憶部２５は主記憶装置または外部記憶装置の一部に含まれる。
【００４８】
このマルチタスク処理装置は、複数のタスク（並行プログラム）をマルチタスク処理する。タスクの実行はタスク実行部２１により行われる。タスクには、実行されている状態、実行可能な待ち状態（実行可能待ち状態）、および実行可能でない事象待ち状態（実行不能状態）がある。図５にタスクの状態遷移図を示す。タスクが発生すると、発生したタスクは実行可能待ち状態になり（実行待ちタスクリストに格納され）、次に実行するべきタスクとして選択され実行されると、実行状態になる。実行状態にあったタスクの実行が終了すると該タスクは消滅する。また、実行状態にあるときに、タスクの切替時になると、タスクは、実行可能待ち状態になるか、事象待ち状態に遷移する。タスクが事象待ち状態にあるときに待っていた事象が発生すると、該タスクは実行可能待ち状態になる。
【００４９】
ここで各タスクは、各々複数のセクション（区間）に分割されている。より詳細には、各タスクには、あらかじめ１つ以上の「チェックポイント命令」が挿入されており、このチェックポイント命令により各タスクは複数のセクションに分割される。チェックポイント命令が挿入されたタスク中の箇所は「チェックポイント」と称される。タスク１およびタスク２のJava（登録商標）言語による記述の例を以下に示す。
// タスク１
class Task1 extends Task{
private gui gui ;
public Task1(String tname, Resource r){
super(tname,r) ;
System.out.println("*** Set Up Task1  ***") ;}
public void run(){
int i = 0, j = 0 ;
while(i++ < 100){
System.out.println("*** Task1 running ***") ;
arb.check_point(this,1) ;  ←チェックポイント命令
j = res.read() ;
System.out.println(j) ;
arb.check_point(this,2) ;   ←チェックポイント命令
res.write(j-1) ; }
System.out.println("*** End of Task1  ***") ;  
arb.check_point(this,3) ;   ←チェックポイント命令
gui.task_panel.set_stop(this) ;}
public void set_gui(gui g){
gui = g ;}}
// タスク２
class Task2 extends Task{
private gui gui ;
public Task2(String tname, Resource r){
super(tname,r) ;
System.out.println("*** Set Up Task2  ***") ; }
public void run(){
int i = 0, j = 0 ;
while(i++ < 100){
System.out.println("*** Task2 running ***") ;
arb.check_point(this,1) ;   ←チェックポイント命令
j = res.read() ;
System.out.println(j) ;
arb.check_point(this,2) ;    ←チェックポイント命令
res.write(j+1) ;}
System.out.println("*** End of Task2  ***") ;
arb.check_point(this,3) ;   ←チェックポイント命令
gui.task_panel.set_stop(this) ; }
public void set_gui(gui g){
gui = g ; }}
【００５０】
このように各タスクは、チェックポイント命令によって複数のセクションに分割されている。タスク１およびタスク２は、それぞれ３つのチェックポイント命令によって４つのセクションに分割されている。プログラム中に同期命令（wait，notifyなど）がある場合は、その同期命令をチェックポイント命令に含めても良い。
【００５１】
タスクは、セクションとチェックポイントによるフローとして表現できる。たとえばタスク１は図４のようなセクション（ＳＣ）とチェックポイント（ＣＰ）によるフローとして表現できる。タスクの開始時点で仮想のチェックポイントＣＰ０が存在すると定式化し、タスクの開始時点から最初のチェックポイントまでの区間はＳＣ０とする。チェックポイント命令を実行することで現在いるセクションを識別する値が記憶される。たとえばarb.check_point(this,1)を実行すると、現在セクションＳＣ１にいることを示す値（チェックポイント名ＣＰ１あるいはセクション名ＳＣ１）が取得され、主記憶装置１３に記憶される。
【００５２】
直前に通過した各タスクのチェックポイントの集合により、下記の例のようにプログラムの実行状態ｓを表現することができる。
ｓ＝（cp11，cp21，cp32，cp43）
cpij：タスクiが直前に通過した最新のチェックポイント名
または
ｓ＝（sc11，sc21，sc32，sc43）
scij：タスクiが直前に実行していた最新のセクション名
【００５３】
各タスク間でのチェックポイントの全ての組み合わせ（各タスク間でのセクションの全ての組み合わせ）は、「プログラム状態全体集合Ｓ」と称される。プログラムの実行状態sはプログラム状態全体集合Ｓの１つの要素である（s∈S）。プログラム実行状態ｓはプログラム実行状態算出部２２により算出される。
【００５４】
安定したプログラムの状態が得られるとされる各タスクのチェックポイントの組の集合は「安定集合Ａ」と称される。安定集合Ａは、プログラム状態全体集合の部分集合（Ｓ⊃Ａ）である。安定集合Aはあらかじめ与えられている。安定集合Ａは記憶部２５に格納されている。安定集合Aの具体例は後述する。
【００５５】
プログラム実行状態s（s∈S）が、安定集合Ａからどれくらい離れているかを示した指標は「安定距離Δ（ｓ、Ａ）」と称される。安定距離の算出は安定距離計算部２３により行われる。安定距離の算出には、プログラム実行状態ｓと、安定集合Aと、あらかじめ与えられる距離関数（距離算出式）Δとが用いられる。距離関数Δは記憶部２５に格納されている。安定距離計算部２３は、たとえばタスクの切替時に、現時点で実行可能なタスクの集合Ｔe⊂Ｔ（全タスクの集合）を抽出し、タスク集合Ｔeに含まれる各タスクの各々に対して、次に該タスクが実行されるとした場合のプログラム実行状態を、プログラム実行状態算出部２２を用いて取得する。各タスクから取得したプログラム実行状態の集合をS’ ⊂Ｓとする。安定距離計算部２３は、記憶部２５に格納されている安定集合と距離関数とを用いて、集合S’内の各プログラム実行状態に対して、安定距離を計算する。安定距離は、プログラム実行状態の安定集合からの距離を表すものであり、たとえば安定距離が小さければ小さいほど安定性が高くなるように定義される。プログラム実行状態が安定集合に含まれる場合は、距離は０である。また、すべてのプログラム実行状態が安定集合に属する場合は、通常のマルチタスク処理を行うのと同等となる。安定距離の算出の具体例については後述する。
【００５６】
タスク実行部２１に次に実行させるべきタスクは、タスク優先度計算部（タスク選択部）２４によって求められる。タスク優先度計算部２４は、タスク集合Te内の各タスクから求められた安定距離等に基づいて、次に実行するべきタスクをタスク集合Teから選択する。具体的には、安定距離が最も小さくなるようなプログラム実行状態を実現するタスクを選択する。すなわち、安定距離がより小さくなるようなプログラム実行状態を実現するタスクに高い優先度（安定タスク優先度）が付与される。タスク優先度計算部２４の処理を、図６を用いて説明する。
【００５７】
タスク優先度計算部２４は、次に実行するべきタスクを、安定距離に基づく安定タスク優先度と、プログラマが指定したタスクの優先度と、実行待ちタスクリストに到着したタスクの順序とに基づいて選択する。すなわち、タスク優先度計算部２４は、
（１）  プログラム中でプログラマが各タスクに対して指定した優先度（指定タスク優先度あるいは第２優先度）
（２）  安定距離に基づく各タスクの優先度（安定タスク優先度あるいは第１優先度）
（３）  実行待ちタスクリストに到着したタスクの順序（着順タスク優先度）
の３種類の優先度に基づいて、次に実行するべきタスクを選択する。
【００５８】
ここでは、（１）〜（３）の優先順を（１）＞（２）＞（３）とする実行順序ポリシーを考える。このポリシーのとき、図６のように、実行待ちタスクリストへ到着順にタスクを格納し、次に安定距離に基づく優先度で実行待ちタスクリスト内のタスクをソートし（安定タスク優先度が高いものを先頭側に配置するとともに、同じ優先度のタスク間では先に到着したものほど先頭側に配置する）、最後にプログラマが指定した優先度でソートする（プログラマが指定したタスク優先度が同じタスク間では安定優先度が高いものほど先頭側に配置する）。そして、実行待ちタスクリスト内の先頭のタスクを、次に実行するべきタスクとして選択する。これにより上記のポリシーに基づくタスクの実行が実現できる。実行順序ポリシーには上記以外のケースもある。例えば、安定性をより重視する場合は、安定距離による優先度をプログラマが指定したタスク優先度より優先する場合もありうる。この場合は、（２）＞（１）＞（３）となる。
【００５９】
以下、図１のマルチタスク処理装置の実行手順の具体例を示す。ここでは１つのＣＰＵ上でのマルチタスクシステムを説明するが、複数ＣＰＵ上のマルチタスクシステムでも通常のスケジューラの場合と同様に拡張できる。ここで、タスク切り替えのタイミングを、チェックポイント（同期命令を含む）でのみ行う場合（ノンプリエンプティブマルチタスク：non-preemptive multitasking）と、任意のタイミングでタスク切り替えが可能な場合（プリエンプティブマルチタスク：preemptive multitasking）に分けて考える。前者の方がスケジューラのオーバーヘッドが小さいという長所があるが、緊急の割り込みタスクが扱えないなどの短所がある。
【００６０】
図７は、ノンプリエンプティブマルチタスクにおけるスケジューラ（プログラム実行状態算出部２２、安定距離計算部２３、タスク優先度計算部（タスク選択部）２４を含む）の実行手順を説明するフローチャートである。
【００６１】
まずプログラムの実行状態を抽出する。具体的には、各タスクの現時点の実行セクションを示すチェックポイントの組ｓを抽出する（S11）。各タスクは、チェックポイントを通過する直前のセクションに存在すると考える。
【００６２】
次に、全タスクの集合Ｔから現時点で実行可能なタスクの集合Ｔe⊂Ｔを抽出する（S12）。
【００６３】
次に、タスク集合Ｔe内の各タスクに対して、該タスクが次に実行されたとした場合のプログラム実行状態を計算し、Ｔe各タスクから得られたプログラム実行状態の集合をS’とする（S13）。
【００６４】
次に、あらかじめ与えられた安定集合と距離関数とから、集合S’内の各プログラム実行状態に対して、安定距離を計算する（S14）。なお、距離を計算する際、タスク集合Ｔe内のタスク数が、安定集合における各要素のセクション数よりも少ないとき（たとえば事象待ち状態のタスクのセクションが該要素に含まれるとき）は、タスク集合Ｔe内のタスクのセクションのみを用いて安定距離を計算してもよい（たとえば事象待ち状態のタスクのセクションは無視するようにしてもよい）。
【００６５】
次に、各プログラム実行状態から計算された安定距離に基づき、タスク集合Ｔe内の各タスクについて安定タスク優先度を計算する（S15）。
【００６６】
次に、（１）指定タスク優先度、（２）安定タスク優先度、（３）着順タスク優先度を用いて、次に実行するタスクを選択する（S16）。例えば、（１）＞（２）＞（３）の優先順とする場合には、実行待ちタスクリスト（実行待ちキュー）内のタスクを（３）→（２）→（１）の順でソートする。ソートの結果、実行待ちタスクリストの先頭が次に実行するタスクとなる。
【００６７】
次に、選択されたタスクを次のチェックポイントに到達するまで（次のチェックポイント命令を実行するまで）実行する（S17）。この後、ステップS11に戻る。
【００６８】
以上に説明した手順の具体例を、図８に示す３つのタスクを例に説明する。
【００６９】
まずプログラムの実行状態を抽出する。具体的には、各タスクT1〜T3の現時点の実行セクションを示すセクションの組ｓ＝（ｔ１１，ｔ２０，ｔ３２）を抽出する（S11）。各タスクT1〜T3は、チェックポイントを通過する直前のセクションに存在すると考える。
【００７０】
現時点で実行可能なタスクの集合Ｔeを抽出する（S12）。ここでは、Te={T1,T2,T3}とする。
【００７１】
Ｔe内の各タスクに対して、次に該タスクが実行されたとした場合のプログラム実行状態を計算し、各タスクに対して計算されたプログラム実行状態の集合をS’とする（S13）。ここでは、S’={s1,s2,s3}, s1=(t12,t20,t32), s2=(t11,t21,t32), s=(t11,t20,t33)となる。
【００７２】
あらかじめ与えられた安定集合と距離関数から、S’={s1,s2,s3}の各プログラム実行状態に対して、安定距離を計算する（S14）。
【００７３】
Te={T1,T2,T3}の各タスクの安定距離に基づき、タスクの安定タスク優先度を計算する（S15）。ここでは、T1>T2>T3だったとする。
【００７４】
（１）指定タスク優先度、（２）安定タスク優先度、（３）着順タスク優先度を用いて、次に実行するタスクを選択する（S16）。例えば、（１）＞（２）＞（３）の優先順の場合には、実行待ちタスクリスト（実行待ちキュー）内のタスクを（３）→（２）→（１）の順でソートをかけることにより、実行待ちタスクリスト内の先頭が次に実行するタスクとなる。ここでは、指定タスク優先度は各タスクT1,T2,T3とも同じだとし、タスクT1が選ばれたとする。
【００７５】
選択されたタスクT1を次のチェックポイントcp13に到達するまで実行する（S17）。この後、ステップS11に戻る。このとき、新しいプログラム実行状態はs1=(t12,t20,t32)となる。
【００７６】
図９は、プリエンプティブマルチタスクにおけるスケジューラの実行手順を説明するフローチャートである。ここでタスクの切り替えは様々な理由に基づき任意のタイミングでセクションの任意の場所で行われる。様々な理由としては、たとえば（１）外界からの信号などをトリガーに優先度の高い割込みタスクが発生した場合、（２）実行中のタスクがスケジューラーによりチェックポイント以外で事象待ち状態になった場合、（３）実行中のタスクの同期命令(notify命令)で他の優先度の高いタスクが実行可能になった場合、（４）タイマーで待っていたタスクが時間の経過により実行可能になった場合、などがある。タスクの切り替えタイミングはスケジューラにより指定される。通常、スケジューラ側で割り込み処理等のイベントが発生するとフラッグを立て、フラッグが立つとタスクの実行をいったん中断してスケジューラに制御が戻る。以下、本実行手順について説明する。
【００７７】
まずプログラムの実行状態を抽出する。具体的には、各タスクの直前に通過したチェックポイントの組sを抽出する（S21）。
【００７８】
次に、全タスクの集合Ｔから現時点で実行可能なタスクの集合Ｔeを抽出する（S22）。
【００７９】
次に、Ｔe内の各タスクに対して、次に該タスクが実行されたとした場合のプログラム実行状態を計算し、各タスクについて計算されたプログラム実行状態の集合をS’とする（S23）。チェックポイントの直前で止まっているのでない（セクションの途中で止まっている）場合は、タスクが実行された場合のプログラム実行状態は変らない。
【００８０】
ステップS24〜S26は、ステップS14〜S16と同じであるため説明を省略する。
【００８１】
ステップS27において、ステップS16で選択されたタスクをスケジューラからタスク切り替えの指示があるまで、または、次のチェックポイントに到達するまで、実行する。この後、ステップS21に戻る。
【００８２】
以下、安定集合Ａおよび安定距離の具体例について説明する。
【００８３】
[１]機能的不具合に対する安定化その１
最もシンプルな安定集合の定義は、クリティカルセクション（計算機リソースにアクセスするセクション）に入っているタスク数の総和を１以下とするものである。クリティカルセクションはプログラムの解析により自動的に抽出することもできるが、ユーザにより指定しても良い。
【００８４】
安定集合の定義：
Ａ＝｛ｓ＝（ｔ１、ｔ２、ｔ３、ｔ４）｜ｔ１、ｔ２、ｔ３、ｔ４のうちクリティカルセクションに属しているタスクの総和≦１｝
【００８５】
安定距離の定義：
Δ（ｓ、Ａ）＝０  ｉｆ  ｓ∈Ａ
Δ（ｓ、Ａ）＝１  ｉｆ  ｓ∈Ａでない
【００８６】
すなわち、上記安定集合は、クリティカルセクションに入っているタスクの総数が１となるセクションの組の集合（プログラム実行状態の集合）である。評価対象となるプログラム実行状態が安定集合に入っていれば安定距離は０（第１の値）、入っていなければ安定距離は１（第２の値）である。
【００８７】
ここで、安定集合はあらかじめ計算し、記憶装置（１３または１５）に蓄積しておくこともできるが、プログラム実行状態が安定集合に属するか否かを毎回計算することもできる。
【００８８】
以上により、クリティカルセクションに入るタスクの総数が１以下となるタスクの優先度が高くなり、複数のタスクが同時にクリティカルセクションに入ることを抑止できる。
【００８９】
[２]機能的不具合に対する安定化その２
本例ではクリティカルセクション（計算機リソースにアクセスする区間）に入っているタスク数の総和を安定距離として定義する。
【００９０】
プログラム実行状態ｓ＝（ｔ１，ｔ２，ｔ３，ｔ４）に対する安定距離の定義：
Δ（ｓ）＝ｔ１，ｔ２，ｔ３，ｔ４のうちクリティカルセクションに属しているタスクの総和（タスク数）
【００９１】
すなわち各セクションについてクリティカルセクションに属するか否かをセクション特徴値として表すとすると（たとえばクリティカルセクションに属するセクションでは１、属さないセクションでは０とすると）、Δ（ｓ）は、プログラム実行状態においてセクション特徴値として１をもつセクションの数に相当する。
【００９２】
ここでは、安定集合はない（あるいは空集合）と考えることができ、特徴量だけから安定距離を計算する。すなわち、安定集合がなくても安定距離算出式だけでも機能を実現することができる。
【００９３】
以上により、クリティカルセクションに入るタスクの数を最小にするようなタスクのスケジューリングを行うことができる。
【００９４】
[３]機能的不具合に対する安定化その３
本例では、最もシンプルな安定集合の定義は、クリティカルセクション（計算機リソースにアクセスするセクション）に入っているタスク数の総和を１以下とし、クリティカルセクションに入っているタスク数の総和を安定距離として定義する。
【００９５】
安定集合の定義：
Ａ＝｛ｓ＝（ｔ１、ｔ２、ｔ３、ｔ４）｜ｔ１、ｔ２、ｔ３、ｔ４のうちクリティカルセクションに属しているタスクの総和≦１｝
【００９６】
安定距離の定義：
Δ（ｓ、Ａ）＝０  ｉｆ  ｓ∈Ａ
Δ（ｓ、Ａ）＝クリティカルセクションに属しているタスクの総和  ｉｆ  ｓ∈Ａでない
【００９７】
以上により、クリティカルセクションに入るタスクの総数が０または１となるタスクの優先度を最も高くし（０と１の優先度は同等）、２以上のタスクが同時にクリティカルセクションに入る場合でもタスクの数を最小にするようなタスクのスケジューリングを行うことができる。
【００９８】
［４］試験結果を用いた機能的不具合に対する安定化その１
本例では試験済みのセクションの組合せ（出荷前の試験段階において試験を行ったセクションの組合せ）を安定集合として定義する。
【００９９】
安定集合の定義：
Ａ＝｛ｓ＝（ｔ１，ｔ２，ｔ３，ｔ４）｜ｔ１，ｔ２，ｔ３，ｔ４は試験済である｝
【０１００】
安定距離の定義：
Δ（ｓ，Ａ）＝０  ｉｆ  ｓ∈Ａ
Δ（ｓ，Ａ）＝１  ｉｆ  ｓ∈Ａでない
【０１０１】
ここで、安定集合はあらかじめ計算し、記憶装置（１３または１５）に蓄積しておくこともできるが、状態数が大きい場合、メモリ使用量が大きくなってしまう可能性がある。安定集合に属する状態（セクションの組合せ）の集合を二分決定グラフ（BDD：Binary Decision Diagram)で効率よく表現することができる。二分決定グラフでコンパクトに表現された安定集合に対して、与えられたプログラム実行状態が含まれる（ｓ∈Ａ）か否かは簡単に計算できることが知られている（参考文献：Randal E. Bryant, Symbolic Boolean manipulation with ordered binary-decision diagrams, ACM Computing Surveys, Vol.24,No.3, pp.293 - 318,1992.）
【０１０２】
以上により、試験済の組合せを優先するようなタスクスケジューリングを行うことができる。
【０１０３】
［５］試験結果を用いた機能的不具合に対する安定化その２
本例でも［４］と同様に、試験済みのセクションの組合せを安定集合として定義するが、安定距離の定義が異なる。
【０１０４】
安定集合の定義：
Ａ＝｛ｓ＝（ｔ１，ｔ２，ｔ３，ｔ４）｜ｔ１，ｔ２，ｔ３，ｔ４は試験済である｝
【０１０５】
安定距離の定義：
Δ（ｓ，Ａ）＝min{δ(s,s’)| s’∈Ａ}
【０１０６】
ここで、δ(s,s’)はsとs’で一致していないタスクの数である。sは評価対象となるプログラム実行状態、s’は安定集合の要素である。δ(s,s’)の算出例を図１０に示す。たとえばs=(t11,t22,t31,t41)で、安定集合Aの１つの要素s1が(t12,t22,t31,t41)のとき、sとs1で一致していないタスクは１つであるため、δ(s,s1)=1となる。安定集合A内の他の要素s2〜s7についても同様にしてδ(s,s’)を求め、求めた７個のδ(s,s’)のうちの最小値が、安定距離となる。
【０１０７】
以上により、試験済の組合せを優先するようなタスクスケジューリングを行うことができる。
【０１０８】
以下、図１１を用いて、本例についてさらに具体的に説明する。
【０１０９】
３つのタスクT１〜タスクT3が存在し、各タスクとも実行可能待ち状態にあるとする。すなわちタスク集合T={T1,T2,T3}である。また３つのタスクの、プログラマにより指定された優先度（指定タスク優先度）は全て同じとする。安定集合の要素は１つとし、A={s’}、s’=(CP11,CP22,CP32)であるとする。また、現在のプログラム実行状態はs=(CP11,CP22,CP30)である。
【０１１０】
タスクＴ１のセクションＳＣ１１の実行中に、Wait命令がありタスクＴ１は事象待ち状態に遷移し、タスク選択部（スケジューラ）２４が、実行可能待ち状態にあるタスクＴ２、Ｔ３の中から次に実行すべきタスクを選択しなければならない。
【０１１１】
タスクT2を次に実行するとした場合のプログラム実行状態は、s=(CP11,CP21,CP30)であり、安定集合からの安定距離は２（Ｔ２、Ｔ３が一致していない）である。
【０１１２】
一方、タスクT3を次に実行するとした場合のプログラム実行状態は、s=(CP11,CP22,CP31) であり、安定集合からの安定距離は１（Ｔ３が一致していない）である。
【０１１３】
そこで、スケジューラはタスクＴ３を選択し、タスクＴ３を実行状態にする。タスク実行部２４は、選択されたタスクを実行する。
【０１１４】
上記例では、一致していないタスク数の最小値を安定距離とし、最小の安定距離を得られるタスクを選択したが、一致しているタスク数の最大値を安定距離とし最大の安定距離が得られるタスクを選択するようにしてもよい。
【０１１５】
［６］試験結果を用いた機能的不具合に対する安定化その３
本例では出荷前の試験段階において試験を行った際の各セクションの試験回数の逆数の総和を安定距離として定義する（逆数を用いるのは、セクションの試験回数が多くなるほど安定距離が小さくなるようにするため）。各セクションの試験回数の逆数は、あらかじめテーブルに保存されているとする。
【０１１６】
プログラム実行状態ｓ＝（ｔ１，ｔ２，ｔ３，ｔ４）に対する安定距離の定義：
Δ（ｓ）＝ｔ１，ｔ２，ｔ３，ｔ４の各セクションの試験回数の逆数の総和
【０１１７】
すなわち各セクションの試験回数の逆数をセクション特徴値として表すことで、Δ（ｓ）は、セクションの組合せが相対的に試験をしっかり実施しているかどうかの指標になっている。
【０１１８】
ここでは、安定集合はない（あるいは空集合）と考えることができ、特徴量だけから安定距離を計算する。すなわち、安定集合がなくても安定距離算出式だけでも機能を実現することができる。
【０１１９】
以上により、セクションの組合せがしっかり試験されているプログラム実行状態を実現するタスクを優先的に選択し、試験が不十分なセクション同士を同時に実行することを避けるようなスケジューリングを行うことができる。
【０１２０】
［７］性能的不具合に対する安定化
本例において、最もシンプルな安定集合の定義は、消費電力量あるいはメモリ使用量が一定（α：想定許容量）以下となる、セクションの組の集合（プログラム実行状態の集合）を安定集合とするものである。
【０１２１】
ここで、消費電力に関しては、複数のＣＰＵ上のスケジューリングが対象である。低消費電力化タスクスケジューリングに関しては、下記のＵＲＬから入手可能な、東京大学の研究「マルチプロセッサ の 低消費電力化タスクスケジューリングに関する研究」などがあるが、アドホックな方法であり、汎用性に欠けていた。
http://www.i.u-tokyo.ac.jp/edu/course/ipc/master/2005/RCAST/watanabe_r.pdf
【０１２２】
（１）使用メモリ量の場合その１（単一のＣＰＵ上のマルチタスクシステムを前提とする）
安定集合の定義：
Ａ＝｛ｓ＝（ｔ１、ｔ２、ｔ３、ｔ４）｜ｔ１、ｔ２、ｔ３、ｔ４の推定メモリ使用量の総和≦α、αはシステム上問題のないメモリ使用量｝
【０１２３】
安定距離の定義：
Δ（ｓ、Ａ）＝０  ｉｆ  ｓ∈Ａ
Δ（ｓ、Ａ）＝１  ｉｆ  ｓ∈Ａでない
【０１２４】
（２）メモリ使用量の場合その２（単一のＣＰＵ上のマルチタスクシステムを前提とする）
安定集合の定義：
Ａ＝｛ｓ＝（ｔ１，ｔ２，ｔ３，ｔ４）｜ｔ１，ｔ２，ｔ３，ｔ４の推定メモリ使用量の総和≦α，αはシステム上問題のないメモリ使用量｝
【０１２５】
安定距離の定義：
Δ（ｓ，Ａ）＝０  ｉｆ  ｓ∈Ａ
Δ（ｓ，Ａ）＝ｔ１，ｔ２，ｔ３，ｔ４の推定メモリ使用量の総和  ｉｆ  ｓ∈Ａでない
【０１２６】
推定メモリ使用量（セクション特徴値）は、あらかじめセクションごとに最大推定メモリ使用量（あるいは推定平均メモリ使用量）が計算され、テーブル形式で保存されているとする。テーブルの一例を図１２に示す。推定メモリ使用量は、あらかじめそのセクションを単独で実行してメモリ使用量を計算し、それを推定メモリ使用量とする。あるいはプログラムを解析して、推定メモリ使用量を理論的に推定する。
【０１２７】
以上によりメモリ使用量が許容量を超えるという状況を抑止できる。
【０１２８】
（３）メモリ使用量の場合その３（単一のＣＰＵ上のマルチタスクシステムを前提とする）
本例では各タスクで使用するメモリ使用量の総和を安定距離として定義する。 
【０１２９】
プログラム実行状態ｓ＝（ｔ１，ｔ２，ｔ３，ｔ４）に対する安定距離の定義：
Δ（ｓ）＝ｔ１，ｔ２，ｔ３，ｔ４の推定メモリ使用量の総和
【０１３０】
上述した「（２）消費メモリの場合その２」との相違点は、（２）ではメモリ使用量がα以内であれば、タスクの優先順位は同じなのに対し、（３）ではα以内の場合でもメモリ使用量が低いタスクが優先される。
【０１３１】
以上により、メモリ使用量の総和を最小にするようなタスクのスケジューリングを行うことができる。
【０１３２】
（４）消費電力の場合その１（複数ＣＰＵ上のマルチタスクシステムを前提とする）
１チップ上のマルチコアシステムのような複数のＣＰＵ（２つ以上の実行部）上のマルチタスクシステムにおいては、各タスクは、図１３に示すように、複数の実行中のタスクと、実行待ちタスクリスト（実行待ちキュー）で待っている実行待ちのタスクとに分類できる。このときタスク切り替えの対象は１つのＣＰＵであり、他の実行中のＣＰＵのタスク切り替えは行わない。図１３では、ＣＰＵ３のタスクを選択するために、以下の安定集合および安定距離に基づいてタスクの選択を行う。推定消費電力の総和の計算においては実行中のＣＰＵのタスクも対象となることに注意する。
【０１３３】
安定集合の定義：
Ａ＝｛ｓ＝（ｔ１，ｔ２，ｔ３，ｔ４）｜ｔ１，ｔ２，ｔ３，ｔ４の中で各ＣＰＵにより実行されるタスクの推定消費電力の量の総和≦α｝
【０１３４】
安定距離の定義：
Δ（ｓ，Ａ）＝０  ｉｆ  ｓ∈Ａ
Δ（ｓ，Ａ）＝１  ｉｆ  ｓ∈Ａでない
【０１３５】
ここで推定消費電力（セクション特徴値）は、あらかじめセクションごとに推定最大消費量（あるいは推定平均消費量）として計算され、テーブル形式で保存されているとする。テーブルの一例を図１２に示す。推定消費電力は、あらかじめそのセクションを単独で実行して、消費電力量を計算し、それを推定消費量とする。あるいはプログラムを解析して、消費電力量を理論的に推定する。
【０１３６】
以上により、消費電力が許容量を超えるという状況を抑止できる。
【０１３７】
（５）消費電力の場合その２（複数ＣＰＵ上のマルチタスクシステムを前提とする）
本例では各タスクで使用する推定消費電力の総和を安定距離として定義する。 
【０１３８】
プログラム実行状態ｓ＝（ｔ１，ｔ２，ｔ３，ｔ４）に対する安定距離の定義：
Δ（ｓ）＝ｔ１，ｔ２，ｔ３，ｔ４の推定消費電力量の総和
【０１３９】
以上により、消費電力量を最小にするようなタスクのスケジューリングを行うことができる。
【０１４０】
［８］プログラム作成時に設定された特徴量を用いた安定化その１
並行プログラムの不具合は、作成時にしっかり検討されたメイン処理ではなく、非メイン処理の組合せで発生することが多い。本例ではメイン処理と非メイン処理（例外処理など）を区別するメイン処理特徴量を用いた安定距離を定義する。具体的には、メイン処理であるセクションの特徴量は０、非メイン処理であるセクションの特徴量は１とする。この特徴量は、プログラム作成時に作成者が設定し、実行時はテーブル形式で保存されているとする。
【０１４１】
プログラム実行状態ｓ＝（ｔ１，ｔ２，ｔ３，ｔ４）に対する安定距離の定義：
Δ（ｓ）＝ｔ１，ｔ２，ｔ３，ｔ４のメイン処理特徴量の総和
【０１４２】
ここでは、安定集合はない（あるいは空集合）と考えることができ、特徴量だけから安定距離を計算する。すなわち、安定集合がなくても安定距離算出式だけでも機能を実現することができる。
【０１４３】
以上により、非メイン処理がなるべく同時に実行されることのないように、タスクのスケジューリングを行うことができる。
【０１４４】
［９］プログラム作成時に設定された特徴量を用いた安定化その２
並行プログラムの不具合は、密接に絡み合ったタスク間の処理の組合せで発生することが多い。本例ではプログラム作成時に設定したタスクのセクション間の密接度を特徴量（セクション密接度特徴量）として安定距離を定義する。具体的には、全てのセクション間の密接度を、プログラム作成時に作成者が設定し、実行時はテーブル形式で保存されているとする。現実的には、すべての組合せを設定する必要はなく、作成者が安定性に不安を持つ場合のみ０以上の密接度特徴量を設定し、それ以外は密接度特徴量を０としても良い。また、プログラム解析手法により変数の共有度などから密接度特徴量を自動計算することもできる。具体的な計算手法として、Myers のモジュール強度／接合度（G.J.Myers，Composite/Structured Design, Van Nostrand Reinhold, 1978.）を用いることもできる。
【０１４５】
プログラム実行状態ｓ＝（ｔ１，ｔ２，ｔ３，ｔ４）に対する安定距離の定義：
Δ（ｓ）＝ｔ１，ｔ２，ｔ３，ｔ４の各セクションの組合せの密接度特徴量の総和
【０１４６】
以上により、非メイン処理がなるべく同時に実行されることのないように、タスクのスケジューリングを行うことができる。
【０１４７】
図１４は、マルチタスク処理装置を有する機器（監視対象装置）２８と、この監視対象装置２８にネットワークを介して接続された遠隔監視装置３０とを示す。この遠隔監視装置３０は、監視対象装置２８のプログラム実行状態を監視し、この監視に基づき安定集合を作成し、作成した安定集合を監視対象装置２８に送り込んで、監視対象装置２８で使用する安定集合を更新する。これにより、出荷後の機器の使用状況にあわせて機器の機能的・性能的安定性を向上させることできる。従来は、プログラムの不具合の報告からバグの特定、プログラムの修正までに時間を要し、その間多くの機器で不具合が発生するという問題があったが、機器をネットワークを介して監視し、不具合にいたるプログラム実行状態を安定集合から外したり、実績上安定性が確認された実行状態を安定集合に追加することにより、他の機器での不具合の再発を防止できる。
【０１４８】
以下、監視対象装置２８および遠隔監視装置３０により行われる処理の手順について説明する。この手順は大きく以下のステップ１〜ステップ３からなる。
【０１４９】
ステップ１：遠隔監視装置３０における監視部３１が監視対象装置２８のプログラムの実行状態を監視する。
【０１５０】
ステップ２：遠隔監視装置３０における安定集合作成部３２が、監視の結果に基づき安定集合の改訂版を作成する。
【０１５１】
ステップ３：遠隔監視装置３０における安定集合送信部３３が、作成された安定集合改定版を監視対象装置２８に送り込み、安定集合を差し替える（更新する）。
【０１５２】
以下各ステップの詳細について、上述した実施例[１]機能的不具合に対する安定化その１、[２]機能的不具合に対する安定化その２、［４］試験結果を用いた機能的不具合に対する安定化その１、［５］試験結果を用いた機能的不具合に対する安定化その２、を想定して説明する。
【０１５３】
ステップ１：遠隔監視装置３０における監視部３１が監視対象装置２８のプログラム実行状態を監視する。
【０１５４】
具体的には、安定距離が０より大きい場合のプログラム実行において、不具合が発生したか否かを遠隔監視装置３０が、監視対象装置２８における通知部２６からの通知に基づき、監視する。通知部２６は、安定距離が０より大きい場合のタスクの実行のたびに、そのときのプログラム実行状態と不具合の発生の有無とを通知する。不具合が発生しなかった場合は、監視部３１は、通知されたプログラム実行状態を安定集合追加候補sとして抽出し、安定集合追加候補集合SCに記憶する(SC←SC∪{s})。逆に、安定距離が０にもかかわらず、不具合が発生した場合は、安定集合削除候補集合NSCに記憶する(NSC←NSC∪{s})。ここで、不具合の検出は、システムダウンまたはハングアップの検知から可能であり、リセットボタン等の操作履歴から自動判定することもできる。あるいは、ユーザからのフィードバック操作（不具合通知のボタンを押すなど）から検出することもできる。いったん安定集合追加候補集ＳＣに登録されても、その後のプログラム実行で安定集合追加候補sにおける不具合が検出されれば当該候補ｓをＳＣから削除する。図１１の場合、安定距離１のs2=(CP11,CP22,CP31)を実行して不具合が発生しなければ、s2=(CP11,CP22,CP31)を抽出し、集合SCに追加する。ここでは、安定集合削除候補集合NSCへの追加はなかったとする。
【０１５５】
ステップ２：監視の結果に基づき安定集合の改訂版を作成する。
【０１５６】
具体的には、ある指定された期間で蓄積された安定集合追加候補の集合ＳＣをオリジナルの安定集合Ａに追加し、安定集合の改訂版Ａ’を作成する（Ａ’←Ａ∪ＳＣ）。図１１の場合、Ａ’＝{s2}になる。ここでは説明の簡単のためオリジナルの安定集合Ａは空集合であるとしている。安定集合削除候補集合NSCがある場合は、安定集合からNSCを削除したモノ（Ａ’←Ａ−NＳＣ）を改訂版のＡ’とする。
【０１５７】
ステップ３：作成された安定集合改定版を監視対象装置３０に送り、監視対象装置３０における更新部２７が安定集合を差し替える。
【０１５８】
具体的には、監視対象装置３０の安定集合Ａを安定集合改訂版Ａ’で置き換える。
【０１５９】
図１１の場合、ＡをＡ’＝{s2}で置き換える。置き換えた後は、s2=(CP11,CP22.CP31)は安定距離が０になる。
【０１６０】
なお、上記の例では安定集合を更新を行ったが、安定集合の変わりに安定距離の更新を行うこともできる。
【０１６１】
上記の例では、監視対象装置が１台であったが、図１５に複数の監視対象装置を１台の遠隔監視装置で監視し、更新用の安定集合を作成する例を示す。
【０１６２】
ステップ１：遠隔監視装置３０における監視部３１が各監視対象装置２８のプログラム実行状態を監視し、前述の手順と同様に各監視対象装置２８ごとに安定集合追加候補集合SC1,SC2,SC3，および安定集合削除候補集合NSC1,NSC2,NSC3を算出する。
【０１６３】
ステップ２：監視の結果に基づき安定集合の改訂版を作成する。
【０１６４】
具体的には、各監視対象装置２８ごとに算出された安定集合追加候補集合SC1,SC2,SC3の共通集合を安定集合追加候補集合SCとし、安定集合削除候補集合NSC1,NSC2,NSC3の和集合を安定集合削除候補集合NSCとする。SCとNSCから安定集合改定版（Ａ’＝(Ａ∪SC)-NSC）を算出する。他の算出方法として、Ｎ箇所以上の遠隔監視装置から同じ追加／削除候補があった場合に、それをSCあるいはNSCとするなどの方法がある。
【０１６５】
ステップ３：作成された安定集合改定版を各監視対象装置２８に送り、監視対象装置３０における更新部２７が安定集合を差し替える。
【０１６６】
これまでの例では、安定集合はプログラム実行状態を要素として定義されたが、セクション実行系列、または、実行可能タスク集合と選択されたタスクの組、を安定集合とすることもできる。以下これについて、［１０］、［１１］において、説明する。
【０１６７】
［１０］試験済みのセクション実行系列を用いた安定化
本例では試験済みのセクション実行系列を安定集合として定義する。例えば、直前のプログラム実行状態s1で実行されたセクションti1と次のプログラム実行状態s2で実行するセクションｔi2とするとき、試験済みのセクション実行系列は、試験時に蓄積され、実行時にはテーブル形式で保存されているとする。本例では、セクション実行系列の長さは２としているが、２以上の系列を保存しても良い。
【０１６８】
安定集合の定義：
Ａ＝｛t11t12，t21t22，t31t32，t41t42｝，t11t12，t21t22，t31t32，t41t42は試験済のセクション実行系列である。
【０１６９】
安定距離の定義：
Δ（s2，Ａ）＝０  ｉｆ  ti1tj2∈Ａ，ti1はs1で実行されたセクション，ti2はs2で実行されたセクション
Δ（s2，Ａ）＝１  ｉｆ  ti1tj2∈Ａでない，ti1はs1で実行されたセクション，ti2はs2で実行されたセクション
【０１７０】
以上により、試験済みのセクション実行系列を優先するようなタスクスケジューリングを行うことができる。
【０１７１】
図１６に試験済みのセクション実行系列を安定集合とした場合のスケジューラの実行手順を示す。まず、プログラムの実行状態s1を抽出し（S31）、次に現時点で実行可能なタスク集合Teを抽出（S32）、タスク集合Te内の各タスクに対してプログラム実行状態s2を計算（S33）、s1と各プログラム実行状態s2から上記の定義に基づき安定距離を計算する（S34）。各プログラム実行状態s2から計算された安定距離に基づき、タスク集合Te内の各タスクについて安定タスク優先度を計算する（S35）。安定タスク優先度に基づきタスクスケジューリングを行う。
【０１７２】
［１１］試験済みの実行可能タスク集合と選択されたタスクの組を用いた安定化
本例では実行可能タスク集合（実行可能待ち状態にあるタスクの集合）と選択されたタスクの組を安定集合として定義する。例えば、直前のプログラム実行状態s1における実行可能なタスク集合SSと次のプログラム実行状態s2で実行するセクションscとするとき、(SS,sc)を、実行可能タスク集合と選択されたタスクの組とする。試験済みの実行可能タスク集合と選択されたタスクとの組は、試験時に蓄積され、実行時にはテーブル形式で保存されているとする。 
【０１７３】
安定集合の定義：
Ａ＝｛(SS,sc)｜SSとscは試験済み｝。
【０１７４】
安定距離の定義：
Δ（s2，Ａ）＝０  ｉｆ  s1の実行可能タスク集合SSとs2で選択されたセクションscの組みはＡに含まれる。
Δ（s2，Ａ）＝１  ｉｆ  s1の実行可能タスク集合SSとs2で選択されたセクションscの組みはＡに含まれない。
【０１７５】
以上により、試験済みのタスク選択パターンと一致するタスクを優先して選択するタスクスケジューリングを行うことができる。
【０１７６】
図１７に試験済みの実行可能タスク集合と選択されたタスクの組を安定集合とした場合のスケジューラの実行手順を示す。まず、プログラムの実行状態s1を抽出し（S41）、次に現時点で実行可能なタスク集合Teを抽出（S42）、タスク集合Te内の各タスクに対してプログラム実行状態s2を計算（S43），タスク集合Teをs1における実行可能タスクの集合SSとして決定し、各プログラム実行状態s2で実行されるべきセクションをscとして決定する（S44）。プログラム実行状態SSと各scを用いてそれぞれ安定距離を計算し、タスク集合Te内の各タスクについて安定タスク優先度を計算する（S45）。安定タスク優先度に基づきタスクスケジューリングを行う。
【０１７７】
以下、共有資源（たとえばタスク間で共有される変数、構造化データまたはオブジェクト）を考慮した安定化について、［１２］〜［１５］において、説明する。
【０１７８】
［１２］タスクの状態（セクション）と、共有資源とを用いた安定化その１
複数のタスクの状態（セクション）が、複数の共有資源の状態に対して試験済みであるような、複数のタスクの状態と複数の共有資源の状態との組み合わせs=(ts,rs)を安定集合として定義する。通常は、すべてのタスクの状態とすべての共有資源との組合せs=(ts,rs)を安定集合とするが、信頼性の観点で考慮しなくても良いタスクや共有資源に関しては対象外としても良い。
【０１７９】
安定集合の定義：
Ａ＝｛(ts,rs)｜(ts,rs)が試験済み｝
ここでts=(t1,t2,t3,…）、rs=(r1,r2,r3,…)である。tsはタスクの状態（セクション）の集合(tiはタスクiの状態)、rsは、tsに関連する共有資源の状態の集合(riは共有資源iの状態)を示す。tsはプログラム実行状態に相当する。
【０１８０】
安定距離の定義：
Δ（s，A）＝０  if  s∈Ａ，
Δ（s，A）＝１  if  s∈Ａでない
安定距離の計算例を示すと、図１８に示すタスクおよび共有資源の例では、状態（s1i,s2j,s3k,r1l,r2m）が試験済みか（安定集合Ａに属するか）どうかを判定し、属するときは０，属さないときは１となる。
【０１８１】
本例で定義した安定集合を用いたタスク選択処理の詳細は、図７または図９のフローチャートの処理と同様である。
【０１８２】
ただしステップS13またはS23では、プログラム実行状態の他に、このプログラム実行状態において用いられる共有資源の状態を求める。また、ステップS14またはS24では、求めたプログラム実行状態と共有資源の状態との組と、上記安定集合との距離を、上記定義に従い、計算する。
【０１８３】
［１３］タスクの状態と、共有資源とを用いた安定化その２
個々のタスクの状態（セクション）が、複数の共有資源の状態に対して試験済みであるような、複数のタスクの状態と複数の共有資源の状態との組み合わせを安定集合s=(ts,rs)として定義する。通常は、すべてのタスクの状態とすべての共有資源との組合せs=(ts,rs)を安定集合とするが、信頼性の観点で考慮しなくても良いタスクや共有資源に関しては対象外としても良い。
【０１８４】
安定集合の定義：
Ａ＝｛(ts,rs)｜tsの各tiに対して(ti,rs)が試験済み｝
ここでts=(t1,t2,t3,…）、rs=(r1,r2,r3,…)である。ti∈{t1,t2,t3…}はタスクの状態、rsは、共有資源の状態の集合を示す。すなわち、実施例［１２］がタスクの集合と共有資源の集合の組に対して試験済みかどうかで安定集合を定義したのに対し、本実施例では、各タスク状態と共有資源の集合の組に対して試験済みかどうかで安定集合を定義している。
【０１８５】
安定距離の定義：
Δ（s，A）＝０  if  s∈Ａ，
Δ（s，A）＝（タスク数）−(（ti,rs）が試験済みであるタスク数) if  s∈Ａでない
安定距離の計算例を示すと、図１８に示す例では、状態（s1i,s2j,s3k,r1l,r2m）を分解して（s1i,r1l,r2m）（s2j,r1l,r2m）（s3k,r1l,r2m）を取得し、それぞれ試験済みかどうか判定する。仮に１つのみが試験済みのときは、安定距離はタスク数３−１＝２となる。ただし、準備として、あらかじめ試験時の実行ログから、試験済みの(ts,rs)を取得し、これを複数の(ti, res)に分解して、リストLに格納しておく。安定集合は論理的な概念であり、実際のアルゴリズムでは、安定距離がゼロであれば安定集合に含まれるものとする。
【０１８６】
本例で定義した安定集合を用いたタスク選択処理の詳細は、図７または図９のフローチャートの処理と同様である。
【０１８７】
ただしステップS13またはS23では、プログラム実行状態の他に、複数の共有資源の状態を求める。
【０１８８】
そして、ステップS14またはS24では、求めたプログラム実行状態に含まれる個々のセクション（タスクの状態）を、求めた共有資源の状態と組み合わせて複数の組を生成する。そして、生成した複数の組のうちリストＬに含まれていない組数（生成した複数の組とリストＬとのマッチ数としてもよい）を安定距離として計算する。
【０１８９】
ステップS15またはS25では、選択されたタスクの(ti,rs)が試験済みであること、安定距離が小さいことの優先順位で、高い安定タスク優先度を付与するものとする。
【０１９０】
［１４］タスクの状態と、共有資源とを用いた安定化その３
個々のタスクの状態に対し、それぞれに関係する個々の共有資源の状態が試験済みであるような、複数のタスクの状態と複数の共有資源の状態との組み合わせを安定集合として定義する。ここで、タスクが共有資源と関係するとは、タスクが共有資源を利用（参照、更新など）することを意味する。
【０１９１】
安定集合の定義：
Ａ＝｛(ts,rs)｜tsの各tiおよびタスクiに関係する各資源rik∈{r1,r2,r3,…}に対して(ti,rik)が試験済み｝
ここでts=(t1,t2,t3,…）、rs=(r1,r2,r3,…)である。ti∈{t1,t2,t3…}はタスクiの状態、{ri1,ri2,ri3,…}は、状態tiに関係する共有資源の状態の集合、rik∈{ri1,ri2,ri3,…}は、状態tiに関係する個々の共有資源の状態を示す。
【０１９２】
安定距離の定義：
Δ（s，A）＝(タスクと、関連する共有資源との組数)−（（ti,rik）が試験済みであるタスク数）
安定距離の計算例を示すと、図１８に示す例では、状態（s1i,s2j,s3k,r1l,r2m）を分解して（s1i,r1l）（s2j,r1l）（s2j,r2m）（s3k,r2m）の４つの組を取得し、それぞれ試験済みかどうか判定する。仮に１つのみが試験済みのときは、安定距離は組数４−１＝３となる。ただし、準備として、あらかじめ試験時の実行ログから、試験済みの(ts,rs)を取得し、これを複数の(ti, rik)に分解して、リストLに格納しておく。安定集合は論理的な概念であり、実際のアルゴリズムでは、安定距離がゼロであれば安定集合に含まれるものとする。
【０１９３】
本例で定義した安定集合を用いたタスク選択処理の詳細は、図７または図９のフローチャートの処理と同様である。
【０１９４】
ただしステップS13またはS23では、プログラム実行状態の他に、各タスクの状態に関連する共有資源の状態を求める。
【０１９５】
そして、ステップS14またはS24では、求めたプログラム実行状態に含まれる個々のセクション（タスクの状態）を、それぞれ対応する個々の共有資源の状態と組み合わせて複数の組を生成する。そして、生成した複数の組のうちリストＬに含まれていない組数（生成した複数の組とリストＬとのマッチ数としてもよい）を安定距離として得る。
【０１９６】
ステップS15またはS25では、選択されたタスクiに対して、タスクiの状態tiと関係する共有資源の状態との組(ti,rki)が試験済みであること、安定距離が小さいことの優先順位で、高い安定タスク優先度を付与するものとする。
【０１９７】
［１５］タスクの状態と、共有資源とを用いた安定化その４
個々のタスクの状態に対し、それぞれに関係する複数の共有資源の状態が試験済みであるような、複数のタスクの状態と複数の共有資源の状態との組み合わせを安定集合s=(ts,rs)として定義する。
【０１９８】
安定集合の定義：
Ａ＝｛(ts,rs)｜tsの各tiおよびタスクiに関係する共有資源の集合の状態rsi⊂rsに対して、(ti,rsi)が試験済み｝
ここでts=(t1,t2,t3,…）、rs=(r1,r2,r3,…), rsi=(ri1, ri2, ri3,…)である。ti∈{t1,t2,t3…}はタスクの状態、rsi⊂rsは、状態tiに関係する共有資源の状態の集合（すなわち、rsiはrsの部分集合）、rik(=ri1,ri2,ri3,…)は、rsiに含まれる個々の共有資源の状態を示す。
【０１９９】
安定距離の定義：
Δ（s，A）＝(タスク数)−（（ti,rsi）が試験済みであるタスク数）
安定距離の計算例を示すと、図１８に示した例では、状態（s1i,s2j,s3k,r11,r2m）を分解して（s1i,r11）（s2j,r1l,r2m）（s3k,r2m）の３つの組を取得し、それぞれ試験済みかどうか判定する。仮に１つのみが試験済みのときは、安定距離は組数４−１＝３となる。ただし、準備として、あらかじめ試験時の実行ログから、試験済みの(ts,rs)を取得し、これを複数の(ti, rsi)に分解して、リストLに格納しておく。安定集合は論理的な概念であり、実際のアルゴリズムでは、安定距離がゼロであれば安定集合に含まれるものとする。
【０２００】
本例で定義した安定集合を用いたタスク選択処理の詳細は、図７または図９のフローチャートの処理と同様である。
【０２０１】
ただしステップS13またはS23では、プログラム実行状態の他に、各タスクに関連する共有資源の状態を求める。
【０２０２】
そして、ステップS14またはS24では、求めたプログラム実行状態に含まれる個々のセクション（タスクの状態）を、それぞれ対応する１つ以上の共有資源の状態と組み合わせて複数の組を生成する。そして、生成した複数の組のうちリストＬに含まれていない組数（生成した複数の組とリストＬとのマッチ数としてもよい）を安定距離として得る。
【０２０３】
ステップS15またはS25では、選択されたタスクの(ti,rsi)が試験済みであること、安定距離が小さいことの優先順位で、高い安定タスク優先度を付与するものとする。
【０２０４】
［１６］観測不変条件（likely invariant）を用いた安定化
［１２］〜［１５］では、タスクの状態と、共有資源とを用いた安定化について説明したが、試験済みの共有資源を集約するのは、集約数が爆発的に多くなり、現実的でない場合が多い。そこで本例では、試験済みのタスク状態および共有資源状態の特徴をマクロ的に観測不変条件として取得し、取得した観測不変条件に基づき安定化を図る。
【０２０５】
ここで、観測不変条件（likely invariant）とは、あらかじめ用意されたテストケースに対して、（複数のタスクを含む）プログラムを実行したときのログ（プログラム実行状態の履歴）から抽出された不変条件（実行ログにおいて常に満たされている条件）である。たとえば、変数に対して成立する条件、または変数間に成立する条件などがあり、前者の例として、変数Xに関して、X=1, 0<X<100, X!=nullがある。なお、観測不変条件の検出にはマサチューセッツ工科大学のM. Ernstの研究グループが開発したDaikon(http://people.csail.mit.edu.mernst/pubs/daikon-tool-scp2007.pdf)、Agitor社のAgitator（http://www.agitar.com/）を用いることができる。
【０２０６】
本例では、各タスクの状態（セクション）と、それぞれに関係する共有資源（たとえば変数あるいはオブジェクト）の状態との関係が、観測不変条件を満たすような、複数のタスクの状態と、複数の共有資源の状態との組み合わせを安定集合として定義する。
【０２０７】
安定集合の定義：
Ａ＝｛(ts,rs)｜tsの各tiに対して(ti,rsi)が観測不変条件を満たす｝
ここでts=(t1,t2,t3,…）、rs=(r1,r2,r3,…), rsi=(ri1, ri2, ri3,…)である。ti∈{t1,t2,t3…}はタスクの状態、rsi⊂rsは、状態tiに関係する共有資源の状態の集合（すなわち、rsiはrsの部分集合）、rik(=ri1,ri2,ri3,…)は、rsiに含まれる個々の共有資源の状態を示す。
【０２０８】
安定距離の定義：
Δ（s，A）＝（タスク数）−（（ti,rsi）が観測不変条件を満たすタスク数）
実際の計算では、準備として、各tiにおける共有変数の観測不変条件を実行ログから計算しておきリストLに格納する。そして、リストＬに基づき、（ti,rsi）が観測不変条件を満たすか否かを判定する。なお、安定集合は論理的な概念であり、実際のアルゴリズムでは、安定距離がゼロであれば安定集合に含まれるものとする。
【０２０９】
本例で定義した安定集合を用いたタスク選択処理の詳細は、図７または図９のフローチャートの処理と同様である。
【０２１０】
ただしステップS13またはS23では、プログラム実行状態の他に、個々のタスクの状態に関連する共有資源の状態を求める。
【０２１１】
そして、ステップS14またはS24では、求めたプログラム実行状態に含まれる個々のセクションを、それぞれ対応する共有資源の状態と組み合わせて複数の組を生成する。そして、生成した複数の組が観測不変条件を満たす数をタスク数から引いたものを安定距離として得る。
【０２１２】
ステップS15またはS25では、選択されたタスクの(ti,rsi)が観測不変条件を満たすこと、安定距離が小さいことの優先順位で、高い安定タスク優先度を付与するものとする。
【０２１３】
以下、観測不変条件に基づくタスク選択処理の具体例を３つ説明する。
【０２１４】
（例１）  タスクが２つで、共有資源が変数である例を、図１９を用いて説明する。
【０２１５】
図１９における２つのタスクは、Task1とTask2であり、共有資源は２つの共有変数X,Yである。観測不変条件（likely invariant）は、linvを用いて、以下のように２つ取得されているものとする。
linv(cp12,{X,Y})={Y!=null}：cp12に続くセクションでは、共有資源X,Yに関して、Yはヌルではない
linv(cp22,{X,Y})={X!=null}：cp22に続くセクションでは、共有資源X,Yに関して、Xはヌルではない
【０２１６】
上記の場合、Task1とTask2とは、両方がcp12とcp12に進むまで、次のセクションには進まないように制御される。これによりnullの変数で演算を行うことに起因するバグを回避できる。
【０２１７】
また、図１９において、観測不変条件が
linv(cp12,{X,Y})={Y=1}：cp12に続くセクションでは、共有資源X,Yに関して、Yは1である
linv(cp22,{X,Y})={X!=null}：cp22に続くセクションでは、共有資源X,Yに関して、Xはヌルではない
であるとする。
【０２１８】
この場合、Task1とTask2とは、両方がcp12とcp12に進むまで、次のセクションには進まないように制御される。また、ここでは、満たしている条件が厳しい（制約が多い）タスクを優先するルールが用いるとすると、両タスクともcp12,cp22に位置するときは、Task1を先に処理するように制御される。すなわち{Y=1}の条件は、X!=nullよりも制約が厳しい。
【０２１９】
（例２）  タスクが２つで、共有資源がオブジェクトの場合の例を、図２０を用いて説明する。
【０２２０】
図２０における２つのタスクは、Task1とTask2であり、共有資源は２つのオブジェクトsignal1, signal2である。観測不変条件（likely invariant）は、linvを用いて、以下のように取得されているものとする。
【０２２１】
linv(cp13,{signal1,signal2})={signal1.status==green, signal2.status==red}：cp13に続くセクションでは、共有資源signal1,signal2に関して、signal1のstatusはgreenであり、signal2のstatusはredである。
【０２２２】
linv(cp23,{signal1,signal2})={signal1.status==red, signal2.status==green}：cp23に続くセクションでは、共有資源signal1,signal2に関して、signal1のstatusはredであり、signal2のstatusはgreenである。
【０２２３】
上記の制約に基づいてタイミング安定化を図ることにより、signal1とsignal2とが同時にgreenの状態で、Task1とTask2とが関数do1(),do2()を動かしてしまうバグを回避できる。すなわちdo1()とdo2()をそれぞれ同時に動かすことを禁止する暗黙の仕様があり、それが試験時の実行ログで満たされていた場合に、上記観測不変条件に基づくタスク選択を行うことで、この仕様を実現できる。
【０２２４】
（例３）  タスクが３つで、共有資源がオブジェクトの場合の例を、図２１を用いて説明する。
【０２２５】
図２１における３つのタスクは、Taski(i=1,2,3)であり、共有資源は３つのオブジェクトsignali(i=1,2,3)である。観測不変条件（likely invariant）は、linvを用いて、以下のように取得されているものとする。
【０２２６】
linv(cp13,{signal1,signal2})={signal1.status==green, signal2.status==red}：cp13に続くセクションでは、共有資源signal1,signal2に関して、signal1のstatusはgreenであり、signal2のstatusはredである。
【０２２７】
linv(cp23,{signal2,signal3})={signal2.status==green, signal3.status==red}：cp23に続くセクションでは、共有資源signal2,signal3に関して、signal2のstatusはgreenであり、signa3のstatusはredである。
【０２２８】
linv(cp33,{signal3,signal1})={signal3.status==green, signal1.status==red}：cp33に続くセクションでは、共有資源signal3,signal1に関して、signal3のstatusはgreenであり、signa11のstatusはredである。
【０２２９】
上記の制約に基づいてタイミング安定化を図ることにより、do1()とdo2()、do2()とdo3()、do3()とdo1()をそれぞれ同時に動かしてしまうバグを回避できる。すなわちdo1()とdo2()、do2()とdo3()、do3()とdo1()をそれぞれ同時に動かすことを禁止する暗黙の仕様があり、それが試験時の実行ログで満たされていた場合に、上記観測不変条件に基づくタスク選択を行うことで、この仕様を実現できる。
【０２３０】
次に、先に説明した図１４のシステムにおいて、観測不変条件に基づく安定集合を用いる場合における、安定集合の更新処理について説明する。
【０２３１】
遠隔監視装置３０における監視部３１が監視対象装置２８のプログラムの実行状態を監視する。監視対象装置２０の記憶部２５には、出荷時の安定集合（観測不変条件に基づく安定集合）が格納されている。観測不変条件を求めた実行ログを格納しておくこともできる。
【０２３２】
遠隔監視装置３０における安定集合作成部３２が、観測不変条件を満たしかつ不具合が発生しないときの、監視部３１により逐次監視されるプログラム実行状態をトレース情報（実行ログ）として収集する。そして、プログラム安定集合作成部３２で既存の観測不変条件と新しく蓄積された実行ログから観測不変条件を更新し、新しい安定集合を導く。ここで、既存の実行ログを活用することもできる。
【０２３３】
安定集合送信部３３は、更新された安定集合を監視対象装置３０に送り、監視対象装置３０における更新部２７が安定集合を差し替える。
【０２３４】
監視対象装置２８で不具合が発生した場合は、安定集合の逸脱履歴（安定集合から逸脱したときのプログラム実行状態）と、トレース情報を用いて、不具合の原因を特定してもよい。
【０２３５】
以上説明したように、本発明の実施の形態によれば、信頼性（機能安定性）および品質安定性の高いプログラムを開発・実行を支援する技術を提供でき、大規模なプログラムについても機能的および性能的な安定性の高いプログラムを効率的に開発できるので、プログラム開発における生産性が向上する。
【図面の簡単な説明】
【０２３６】
【図１】本実施形態を実現するために用いるコンピュータシステムのハードウェア構成を示すブロック図。
【図２】マルチＣＰＵシステムを示す図。
【図３】本実施形態にかかるマルチタスク処理装置の機能ブロック図。
【図４】タスクをセクションとチェックポイントとによるフローとして表現した図。
【図５】タスクの状態遷移図。
【図６】タスク優先度計算部の処理を説明する図。
【図７】ノンプリエンプティブマルチタスクにおけるスケジューラの実行手順を説明するフローチャート。
【図８】図７の手順の具体例を説明するための３つのタスクの例を示す図。
【図９】プリエンプティブマルチタスクにおけるスケジューラの実行手順を説明するフローチャート。
【図１０】安定距離の算出例を示す図。
【図１１】実施例［５］の具体例を説明する図。
【図１２】セクションごとのメモリ使用量と消費電力との例を示す図。
【図１３】複数ＣＰＵ上のマルチタスクシステムの場合のタスク選択の例を示す図。
【図１４】マルチタスク処理装置とネットワークを介して接続された遠隔監視装置を示す図。
【図１５】複数のマルチタスク処理装置とネットワークを介して接続された遠隔監視装置を示す図。
【図１６】スケジューラの他の実行手順例を説明するフローチャート。
【図１７】スケジューラのさらに他の実行手順例を説明するフローチャート。
【図１８】タスクの状態と、共有資源とを用いた安定化その１〜その４を説明する図。
【図１９】観測不変条件を用いた安定化の例１を説明する図。
【図２０】観測不変条件を用いた安定化の例２を説明する図。
【図２１】観測不変条件を用いた安定化の例３を説明する図。
【符号の説明】
【０２３７】
２１：タスク実行部
２２：プログラム実行状態算出部（セクション算出部）
２３：安定距離計算部
２４：タスク優先度計算部（タスク選択部）
２５：記憶部
２６：通知部
２７：更新部
２８：監視対象装置
３０：遠隔監視装置
３１：監視部
３２：安定集合作成部
３３：安定集合送信部
【図１】
2008269579.tif 000003
【図２】
2008269579.tif 000004
【図３】
2008269579.tif 000005
【図４】
2008269579.tif 000006
【図５】
2008269579.tif 000007
【図６】
2008269579.tif 000008
【図７】
2008269579.tif 000009
【図８】
2008269579.tif 000010
【図９】
2008269579.tif 000011
【図１０】
2008269579.tif 000012
【図１１】
2008269579.tif 000013
【図１２】
2008269579.tif 000014
【図１３】
2008269579.tif 000015
【図１４】
2008269579.tif 000016
【図１５】
2008269579.tif 000017
【図１６】
2008269579.tif 000018
【図１７】
2008269579.tif 000019
【図１８】
2008269579.tif 000020
【図１９】
2008269579.tif 000021
【図２０】
2008269579.tif 000022
【図２１】
2008269579.tif 000023