割り込み - 頭の体操
プログラミングを始めるとき、基本的には上から下へ順を追って実行するようなプログラムを学びます。もちろん途中で他の場所に飛んで実行する場所を変えることも、そのための命令文を実行すると出来るようにはなっています。古のフローチャートで表せば、途中で行ったり来たりがあるにせよ、開始から終了までひとつの流れで書けるわけです。
ところで実生活で考えると、何かの作業をするときも、基本的には手順を順にこなして、作業が終わるという意味では何も変わりません。ところが実際には、作業中に作業に必要な材料が無くなったり、電話がかかってきたり、途中で昼休みになってご飯を食べにいったりするわけです。
こういった途中で、今やっていることを中断して、何らかの作業をして、終わったら元の作業に戻るような処理を「割り込み処理」と呼びます。
プログラムを書く対象が、このように何らかの外部のイベントに対応する必要があるときに、この割り込み処理が登場するわけです。元のプログラムが生きている状態で他の処理をするので、いろいろと配慮する点があります。わかりやすいのが変数の値で、割り込み処理の中で変数の値を書き換えると、元に戻った後に、付近のコードで値を変えるような処理が無いのに、急に値が変わっているなんて言うことがあるわけです。
割り込みのキッカケは、実際に本当にハードウェアの割り込み信号から発生することが多く、これをハードウェア割り込みと呼びます。これと同じような処理を特定の命令を実行してキッカケとすることをソフトウェア割り込みといいます。
ハードウェア割り込みのキッカケとしては、ディスクやキーボードなどの入出力処理であるとか時刻や時間(間隔)などのタイマー関係があります。ソフトウェア割り込みとしては、処理系のエラーが発生したというケースがあります。
ハードウェアに近い話から行くと、何らかの外部の状態を一定時間ごとに読み出すとすると、タイマーをセットして割り込みを発生させるという使い方がありますし、ソフトウェアとしては、Windowsやブラウザ上のプログラムは、マウスをクリックした、ドラッグしたなんていう時に、それに合わせた処理を動かすわけです。そもそもいろいろなサーバなんかは、クライアントが接続してきたというイベントをもって処理が始まるように書かれているんです。
このように割り込み処理というのは、結構、広い意味があって、対象となるイベントごとに、また処理系ごとに覚えることがあります。処理系自身に割り込み処理の機能を持っている場合と、割り込みはOSやライブラリの機能に依存していて処理系自身には、その機能がない場合もあります(マシン語やBASICは言語として割り込み命令がありますが、C言語にはありません)。
以前は基本的にCPUがひとつしかなかったので、割り込み処理中は、元のプログラムが中断していることを期待できたのですが、最近は割り込み処理中でも元のプログラムが別のCPUで実行を続けているようなことも起きるので、きちんと並行処理を理解しておく必要も出てきましたね。
上から下に走るプログラムを覚えた人でも、この割り込み処理に出会うと、急に理解が難しくなってしまうことが多いみたいです。どうも脳みその別の部分を使う必要があるみたいです。フローチャートではなくて状態遷移図が基本になりますし(状態遷移って何?)、ましてや並行処理なんて何を言っているのかもわからないと言われます。確かにデバッグをどうするかは、コペルニクス的転回が必要かもしれません。
せっかくプログラミングを覚えたのであれば、この割り込み処理はぜひ理解してほしいことではあります。最初はなにか特定の処理、例えばタイマーであるとか、キーボード入力やネットワークソケットからの読み出しの部分だけでいいから理解するとか、イベントドリブンというキーワードでJavaScriptに取り組んでみるとかが良いかと思います。朧気ながらでも慣れてしまうのがおすすめです。
いずれ処理系ごとに具体例でもまとめてみるつもりです。
割り込み (コンピュータ)
ヘッダ画像は、以下のものを使わせていただきました。
https://www.irasutoya.com/2015/07/blog-post_107.html