ウォッチドッグタイマーとは?リセットと割り込みの仕組みを初心者向けに解説
この記事でわかること
・ウォッチドッグタイマーとは何か
・なぜシステムの監視に使われるのか
・タイマーをリセットする意味
・マスカブル割り込みとノンマスカブル割り込みの違い
・ウォッチドッグタイマーと割り込み、リセットの関係
・試験で注意すべきキーワード
ウォッチドッグタイマーとは?


ウォッチドッグタイマーは、簡単に言うと、
システムが止まっていないかを見張るためのタイマーだよ。

見張るためのタイマー?

そう。
システムが正常に動いている間は、定期的にウォッチドッグタイマーをリセットする。
でも、プログラムが暴走したり固まったりしてリセットできなくなると、タイマーが時間切れになる。

時間切れになるとどうなるの?

システムを再起動したり、異常処理を実行したりする。
つまり、固まったシステムを自動で立て直すための仕組みだね。
ウォッチドッグってどういう意味?

ウォッチドッグって、直訳すると「番犬」だよね?

そう。
ウォッチドッグタイマーは、まさにシステムの番犬みたいなもの。

番犬がシステムを見張ってる感じ?

うん。
システムがちゃんと動いていれば、番犬に定期的に「大丈夫だよ」と合図する。
でも合図が来なくなったら、番犬が「何かおかしい!」と判断して動く。
システムが正常に動く
↓
定期的にタイマーをリセット
↓
番犬「よし、正常だな」
システムが固まる
↓
タイマーをリセットできない
↓
番犬「異常だ!再起動だ!」

なぜウォッチドッグタイマーが必要なの?

でも、システムが固まったら、強制的に再起動するんじゃなくて、人が再起動すればよくない?

パソコンならそれでもいい場合があるね。
でも、組込み機器やサーバー、産業機器だと、人がすぐ対応できないことも多い。

サーバーとか産業機械かぁ。

たとえば、
- 工場の制御装置
- 車載システム
- ルーター
- 監視カメラ
- 家電
- 医療機器
- IoT機器
みたいなもの。


確かに、全部を人が見張るのは無理だね。

そう。
だから、異常が起きたときに自動で検知して、再起動や復旧処理をする仕組みが必要になる。
それがウォッチドッグタイマー。
基本の流れ

ウォッチドッグタイマーの基本の流れはこんな感じ。
1. ウォッチドッグタイマーを開始する
2. プログラムが正常に動いている間は、定期的にタイマーをリセットする
3. プログラムが固まると、タイマーをリセットできなくなる
4. タイマーが時間切れになる
5. システムをリセット、または異常処理を実行する


正常ならタイマーをリセットし続けるんだね。

そう。
この「タイマーをリセットする」ことを、よく ウォッチドッグを蹴る と言ったりする。
「蹴る」といっても本当に何かを壊すわけではなく、タイマーをリセットして「まだ正常に動いているよ」と知らせるイメージだよ。

番犬にエサをあげるみたいな感じ?

その例えもいいね。
定期的にエサが来ていれば正常。
来なくなったら異常、みたいな感じ。
身近な例:自動で再起動するルーター

身近な例はある?

家のWi-Fiルーターで考えると分かりやすいよ。

たまにネットがつながらなくなるやつ?

ルーターの中のプログラムが固まって、通信できなくなることがある。
もしウォッチドッグタイマーがあれば、一定時間正常な動作確認ができなかったときに、自動で再起動できる。


ルーターが正常に通信する
↓
ウォッチドッグタイマーをリセット
↓
異常なし
ルーターが固まる
↓
リセットできない
↓
ウォッチドッグタイマーが時間切れ
↓
ルーターを再起動

人が電源を抜き差しする代わりに、自動でやってくれる感じだね。
ウォッチドッグタイマーが検知できる異常

ウォッチドッグタイマーは、どんな異常を見つけられるの?

代表的なのは、プログラムが止まる・暴走するような異常だね。

| 異常 | 内容 |
|---|---|
| 無限ループ | 同じ処理から抜け出せなくなる |
| フリーズ | プログラムが固まる |
| デッドロック | 複数の処理が互いに待ち続ける |
| 処理遅延 | 処理が極端に遅れて、期限内に応答できない |
| 暴走 | 想定外の動きを続ける |

つまり、正常なら定期的に合図できるけど、異常だと合図できなくなるんだね。

そう。
だから「合図が来ない」ことを異常のサインとして使う。
割り込みって何?

ところで、ウォッチドッグタイマーと割り込み処理が関係あるって聞いたんだけど。

関係することがあるよ。
まず割り込みは、簡単に言うと、CPUに対して急ぎの用事を知らせる仕組みだね。

急ぎの用事?

たとえばCPUが普通の処理をしているときに、
タイマーが時間になった
通信データが届いた
ボタンが押された
異常が発生した
みたいなことが起きる。
そのとき、CPUに「ちょっと今の処理を中断して、こっちを先に処理して」と知らせるのが割り込み。


作業中に電話が鳴るみたいな感じ?

そう。
今やっている作業をいったん止めて、電話に出るイメージだね。
マスカブル割り込みとは?

マスカブル割り込みは、一時的に無視したり禁止したりできる割り込みのことだよ。

無視できる割り込み?

そう。
「今は大事な処理中だから、この割り込みはちょっと待って」とできる。
マスカブル割り込み
= 必要に応じて受け付けないようにできる割り込み
だね。

さっきの電話の例だと?

スマホをマナーモードや通知オフにする感じかな。
電話や通知は来ているけど、今は出ないようにできる。


なるほど。
通常の割り込みだけど、止めることもできるんだ。

そう。
たとえば、通常のタイマー処理や通信処理など、状況によっては一時的に割り込みを止めたい場合がある。
ノンマスカブル割り込みとは?

ノンマスカブル割り込みは、基本的に無視できない重要な割り込みだよ。

無視できない?

そう。
システムにとって重大な異常が起きたときなどに使われる。
ノンマスカブル割り込み
= CPUが基本的に無視できない緊急の割り込み
だよ。


スマホの通知オフでも鳴る緊急地震速報は確かに強制的に割り込んでいる感じがするね。

通常の通知はオフにできるけど、緊急性の高い通知は止められない、みたいなイメージだね。
マスカブル割り込みとノンマスカブル割り込みの違い

表で整理するとこうなるよ。

| 種類 | 意味 | 例え |
|---|---|---|
| マスカブル割り込み | 一時的に禁止・無視できる割り込み | 通知オフにできる普通の通知 |
| ノンマスカブル割り込み | 基本的に無視できない割り込み | 緊急地震速報のような重要通知 |

マスカブルは止められる。
ノンマスカブルは止められない。
これが違いだね。

そう。
「mask」は覆い隠す、無効化するようなイメージ。
だからマスカブルは隠せる、ノンマスカブルは隠せないと覚えるといいよ。

ウォッチドッグタイマーと割り込みの関係

それで、
ウォッチドッグタイマーはマスカブル割り込みなの?
それともノンマスカブル割り込みなの?

ここは少し注意が必要。
システムやCPU、設定によって違うんだ。

決まってないの?

うん。
ウォッチドッグタイマーの時間切れ時の動作には、いくつかパターンがある。
1. リセットを発生させる
2. 割り込みを発生させる
3. まず割り込みを出して、その後リセットする


必ず割り込みになるわけじゃないんだ。

そう。
ウォッチドッグタイマーは「時間切れを検知する仕組み」で、その結果として何をするかは設計による。
ウォッチドッグタイマーがマスカブル割り込みの場合

もしマスカブル割り込みだったらどうなるの?

マスカブル割り込みとして扱われる場合、ソフトウェア側で一時的に割り込みを禁止できる可能性がある。

それって便利そうだけど、危なくない?

そう。
もしシステムが暴走していて、割り込みを受け付けない状態になっていたら、ウォッチドッグの通知も処理されない可能性がある。

番犬が吠えてるのに、耳栓してる感じ?


いい例えだね。
だから、本当に深刻な異常を確実に扱いたい場合には、マスカブル割り込みだけに頼るのは不安なことがある。
ウォッチドッグタイマーがノンマスカブル割り込みの場合

じゃあノンマスカブル割り込みだったら?

ノンマスカブル割り込みなら、通常の割り込み禁止状態でもCPUに通知できる。

緊急地震速報みたいに、無視しにくいんだね。

そう。
ウォッチドッグタイマーの時間切れをノンマスカブル割り込みとして扱えば、重大な異常時でも処理に入れる可能性が高くなる。
ただし、ノンマスカブル割り込みでも、CPUやシステムが深刻に壊れた状態では、必ず正常に処理できるとは限らないよ。
だから、最終的にはリセットで復旧させる設計がよく使われるんだ。


たとえば、
異常ログを保存する
安全状態に移行する
最低限の後片付けをする
その後リセットする
みたいな処理だね。
でも最終的にはリセットが多い

ウォッチドッグタイマーは、最終的にはリセットすることが多いの?

多いね。
ウォッチドッグタイマーの目的は、システムが固まったときに復旧させることだから、最終的にはリセットにつなげることが多い。

割り込みは、その前の警告みたいなもの?

そう考えると分かりやすい。
たとえば、
ウォッチドッグタイマー時間切れ
↓
ノンマスカブル割り込み発生
↓
異常ログ保存
↓
システムリセット
みたいな流れがあり得る。


いきなり再起動じゃなくて、まず緊急処理をする場合もあるんだね。

そう。
ただし、異常状態ではソフトウェアがどこまで正常に動くか分からないから、リセットを重視する設計も多い。
ウォッチドッグタイマーを使うときの注意点

ウォッチドッグタイマーって便利だけど、注意点はある?

もちろんあるよ。
正常に動いていないのにタイマーをリセットしてはいけない

一番大事なのは、
本当に正常なときだけウォッチドッグをリセットすること。

どういうこと?

メイン処理が固まっているのに、別の簡単な処理だけが動いていてウォッチドッグをリセットし続けると、異常を検知できない。

番犬にエサだけあげ続けて、実は家の中は大変なことになってる感じ?

そう。
だから、システム全体が正常に動いていることを確認してからリセットするのが大事。
タイムアウト時間を短くしすぎない

タイムアウト時間が短すぎると、正常な処理中でも再起動してしまう。

重い処理をしていただけなのに、異常扱いされちゃうのか。

そう。
逆に長すぎると、本当に固まったときの復旧が遅くなってしまうよ。

ちょうどいい時間設定が必要なんだね。
リセット後の原因調査も大事

ウォッチドッグで再起動できても、原因が分からないと同じ問題がまた起きる。

再起動できれば終わりじゃないんだ。

そう。
だから、可能ならリセット前や起動時に、
なぜリセットされたのか
どの処理で止まったのか
最後に何をしていたのか
を記録できるようにしておくといい。

試験で注意すべきキーワード

試験でどういう言葉が出てきたら、ウォッチドッグタイマーのことを問われていることになりそう?

このあたりかな。
| キーワード | 意味 |
|---|---|
| 番犬 | ウォッチドッグのイメージ |
| タイマーをリセット | 正常動作の合図 |
| タイムアウト | 異常と判断 |
| システムリセット | 復旧動作 |
| ノンマスカブル割り込み | 重要な異常通知に使われる場合がある |
| マスカブル割り込み | 一時的に禁止できる割り込み |
まとめ

ウォッチドッグタイマーとは、
システムが正常に動いているかを監視し、一定時間応答がなければリセットや割り込みを発生させる仕組みだよ。

| 用語 | 意味 |
|---|---|
| ウォッチドッグタイマー | システムの異常停止や暴走を見張るタイマー |
| タイマーリセット | 正常に動いていることを示す合図 |
| タイムアウト | 合図が来ず、異常と判断する状態 |
| マスカブル割り込み | 一時的に無視・禁止できる割り込み |
| ノンマスカブル割り込み | 基本的に無視できない重要な割り込み |

つまり、ウォッチドッグタイマーはシステムの番犬で、
合図が来なくなったら「異常だ!」と判断して、リセットや割り込みを起こすんだね。

その通り。
一言でまとめるなら、
ウォッチドッグタイマーは、システムが固まったときに自動で気づいて復旧につなげる番犬タイマー
だね。

