« 既にNANDです | トップページ | ムシキングとオシャレ魔法 »

フリーズ

アプリケーションがフリーズする原因は、主に状態のすれ違いと、無限ループによって引き起こされる。


状態のすれ違いというのは、2つのタスクがお互いに通信をして同期を取り合う場合、片方のタスクが連絡用のメッセージを送信するが、もう片方のタスクが別なメッセージを送信中であり、その処理中にメッセージ受信に対する処理が抜けていたりすると、送信したタスクが応答待ち状態になってしまい、フリーズするというパターン。


Photo_3

人間同士でいえば、駅で待ち合わせをしたのだが、Aさんは東口、Bさんは西口で待ってしまい、さらに一向に相手が来ないことを不思議に思ったお互いが、同時に反対の出口に移動してしまい、結果として合えないという不幸な状態が発生することである。

さらには、お互いの携帯電話に同時にかけてしまい、一向につながらない(話し中)状態も発生し、お互い腹を立ててしまい、関係改善が困難になるという恐ろしい現象が発生する。

・・・ん、何か微妙に違うような・・・

これに関しては、設計段階でのケアにより、ある程度までは防ぐことが可能だ。

ここを逃してしまうと、捕まえるのが難しくなる。


もう一つは無限ループ。

これはマイクロソフトが得意とする項目だ。

限界を越えてループしてしまい、そこから先へ処理が進まなくなる。

設計の段階で限界値を決めて、コーディングでは"=="で判断などせずに">"などでループさせれば、かなり防ぐことが出来るはずだが、オープンソースなどを見ていると、限界値コーディングが甘いことが多い。

こちらはコードレビューで防ぐことが出来る。


表面上は、
「アプリケーションの応答がありません」
ということになるのだが、その裏側には全く異なった理由があるというわけだ。


これ以外にレアなケースとして、スタックオーバーフローを起こしてしまい、プログラムがあらぬところを走ってしまうパターンがあるが、こちらもコードレビューで押さえ込める。


個人的にはリセットよりも、フリーズの方がたちが悪いと思っている。

なので、無限ループに陥りそうなコーディングをするヤツには、ことのほか厳しい。

ほかのソフト屋さんも、同じような考えをお持ちではないだろうか?

« 既にNANDです | トップページ | ムシキングとオシャレ魔法 »

エンジニアのつぶやき」カテゴリの記事

コメント

volatileに頼りすぎた無限ループもありがちですよね。レジスタの値が変わらない、HWの異常系を念頭に置いた設計・コーディングは重要なのですが、なかなか・・・(^^;

volatileですか。なるほど。
私はあまり使ったことがないのでなんとも言えませんが、コンパイラがどう落とすか、というのは常に意識しないと怖い所ですね。

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/99166/11648937

この記事へのトラックバック一覧です: フリーズ:

« 既にNANDです | トップページ | ムシキングとオシャレ魔法 »

Ad


2017年4月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

最近のトラックバック

無料ブログはココログ