デバッグは今すぐに

『プログラミング作法』

ブライアン・カーニハン

忙しすぎるせいで問題が生じるケースはこれ以外にもある。クラッシュが発生したら放置せずにただちに原因をつきとめること。手遅れになるまで再発しない場合があるからだ。有名なのは火星探査機Mars Pathfinderのミッションで発生した事例だろう。1997年7月に無事着陸を果たした後、1日に約1回の割合で宇宙船のコンピュータにリセットが発生するようになったのだ。エンジニアたちは頭を抱えた。問題をつきとめたところ、彼らはその問題に見覚えがあった。そのリセットは発射前のテスト中にも発生していたのに、エンジニアたちが別の問題に忙殺されていたために無視されていたのだ。その結果エンジニアたちは後回しにしてしまった問題に対処しなければならなくなったが、そのときマシンは数千万キロも遠くにあり、修正作業は困難をきわめた。

The First Bug on Mars: OS Scheduling, Priority Inversion, and the Mars Pathfinder | by Wahome | Medium

火星でいったい何が起きたのか?

確実に間違っている答えのひとつは問題を無視することだ。1998年11月号の「Scientific American」誌には、アメリカ海軍の誘導ミサイル巡洋艦ヨークタウンで起こった事件に関する記事が掲載されている。ある乗組員がデータ値として間違ってゼロを入力してしまい、その結果ゼロによる除算エラーが発生した。そしてそのエラーが次々に伝播し、最終的には艦の推進システムをダウンさせてしまった。プログラムが入力の有効性チェックをさぼったおかげで、ヨークタウンは海上で2時立ち往生するはめになったのだ。

米軍のミサイル巡洋艦がシステムダウン!緊急事態の驚くべき原因は簡単な「割り算の失敗」だった | ニュース | Book Bang -ブックバン-

 

『リアルタイム/マルチタスクシステムの徹底研究』
藤倉利幸

もつ一つの方法はプライオリティインヘリタンス(優先度継承)という手法である。クリティカルセクションを実行中に自分より優先するプロセスがクリティカルセクションに到達して待ちに入ったら、一時的に実行中のプロセスが待っているプロセスと同じプライオリティになるというアイデアである。そして、クリティカルセクションを終了したところで元のプライオリティに戻る。


 VxWorksでは、mutexという名でサポートされている。以前、火星に行ったMars PathfinderのRoverでは、このmutexのプライオリティインヘリタンス(優先度継承)オプションをOFFにしていたため、実際にプライオリティインバージョン(優先度逆転)が起こり、ウォッチドッグによるシステムリセットが発生するトラブルがあったそうである。

(用語)

 preempt:優先度の高いタスクが優先度の低いタスクの

      実行制御を取り上げ、待たせること

 block:同期や排他アクセスのために処理を待たせること

 

(優先度逆転)

優先度逆転

  ●社長(タスクA)が新人君(タスクC)にコピーをお願いした。

  ●新人君(タスクC)がコピーをしていたら、先輩(タスクB)が

           やってきて「ちょっと急ぐので」といってコピー機を

   使い始めた。

  ●新人君(タスクC)は先輩のコピー待ち。

   社長(タスクA)も先輩(タスクB)のコピーで待たされることに...

 

(優先度継承)

優先度継承

  ●社長(タスクA)が新人君(タスクC)にコピーをお願いした。

  ●新人君(タスクC)がコピーをしていたら、先輩(タスクB)が

           やってきて「ちょっと急ぐので」と言ってきた。

  ●新人君(タスクC)は「今、社長にコピーを依頼されている

           ので...」と先輩(タスクB)の割り込みを断った。