基本情報技術者試験の割込みは、「実行中のプログラムの命令が原因か」「タイマや入出力装置からの通知が原因か」で分類すると整理できます。ゼロ除算やページフォールトは内部割込み、タイマの時間経過通知や入出力完了は外部割込みです。OSが処理すること自体は、分類の決め手になりません。
もう一つの要点は、割込み処理が終わったときに戻れるよう、再開位置と作業中の値を退避すること。この記事では発生原因、プログラムカウンタ、退避・復帰の流れを順に確認し、ポーリングとの違いと科目A向けの例題まで扱います。「割込み」と「割り込み」は、この文脈では同じ仕組みを指す表記です。
- 内部・外部は、現在の命令が引き金かどうかで判断する
- 退避では戻り先の番地と、再開に必要な実行状態を残す
- 割込みの発生、受付、処理開始は同じ瞬間とは限らない
- ポーリングは自分から確認し、割込み方式は通知を受けて処理する
基本情報の割込みは何が原因で発生するか

割込みはCPUの制御を必要な処理へ移す仕組み
割込みとは、通常の命令実行の流れをいったん中断し、発生した事象に対応する処理へ制御を移す仕組みです。対応するプログラムを割込み処理ルーチン、割込みハンドラ、ISRなどと呼びます。処理後に再開できる場合は、退避しておいた状態を戻して通常の実行へ復帰します。
例えば、CPUが数値を集計している間に、ストレージへの読み出しが完了したとします。集計処理が完了を何度も問い合わせる代わりに、装置側から通知を受けて必要な処理を行えます。集計を一時中断する理由は、読み出しの終了を受け付けるためです。集計プログラムの計算が間違ったからではありません。
一方、実行中の命令が許されない操作を試みた場合にも、通常の実行を続けず対応処理へ移る必要があります。こちらは命令の実行そのものが引き金です。どちらも制御を移す点は共通ですが、起点が異なるため、試験では内部割込みと外部割込みに分けて問われます。すべての割込みを「装置から届くお知らせ」とだけ覚えると、この違いを見失います。
内部割込みは実行中のプログラムの命令が引き金
内部割込みの代表例は、ゼロによる除算、存在しない命令コードの実行、ページフォールト、システムコール命令の実行です。まず「どの命令を実行した結果、その事象が起きたか」を考えます。入力装置や時計から届いた通知を受ける場面とは、原因の位置が違います。
ゼロ除算なら、プログラムが除算命令を実行し、除数が0だったことが原因です。存在しない命令コードなら、命令として処理できないコードを実行しようとしたことが原因です。「CPUが異常を検出した」という結果だけを追うのでなく、その検出を招いた操作まで戻ると内部と判断できます。
内部割込みには、誤りを知らせるものと、意図的にOSへ処理を依頼するものがあります。したがって内部割込み=全部エラーという覚え方も不十分です。異常か正常かは事象の性質、内部か外部かは発生原因の分類であり、別の軸として扱います。後で出てくるシステムコールは、この二つを分けるよい例です。

外部割込みはタイマや入出力装置からの通知
外部割込みの代表例は、タイマによる時間経過の通知と、入出力動作の完了通知です。試験では電源異常など、実行中の命令とは別の要因による通知も外部として扱われます。現在のプログラムがゼロ除算をしたかどうかとは関係なく、装置の状態や時間の経過を契機に通知が届きます。
タイマ割込みは、設定された時間に到達したことを知らせます。CPUがどのアプリケーションを実行しているかにかかわらず、タイマの条件が成立する点に注目してください。プログラムが前もってタイマを設定していても、時間経過の通知自体は外部割込みです。「設定したのがプログラムだから内部」と考えないようにします。
入出力完了も同様です。プログラムが読み出しを依頼したことと、装置が処理を終えて完了通知を出すことは別の事象です。依頼のためにOSを呼ぶ場面と、完了を受け取る場面を分ければ、一連の作業の中に内部・外部の異なる契機があることを説明できます。入出力の依頼元だけで最後まで同じ分類にしないことが大切です。

試験の分類はチップの内側・外側だけで決めない
「内部」「外部」という言葉から、部品の物理的な位置を思い浮かべると迷いやすくなります。タイマ機能をCPUと同じチップに組み込む実装であっても、基本情報の分類問題でいうタイマの時間経過通知は外部割込みです。反対に、主記憶や補助記憶が関わるページフォールトも、実行中の参照命令が引き金なら内部として判断します。
| 事象 | 基本情報での分類 | 判断する発生原因 |
|---|---|---|
| ゼロによる除算 | 内部割込み | 実行中の除算命令 |
| 存在しない命令コードの実行 | 内部割込み | 実行しようとした命令 |
| ページフォールト | 内部割込み | 必要なページへの参照 |
| システムコール命令の実行 | 内部割込み | プログラムが発行した命令 |
| タイマの時間経過通知 | 外部割込み | 設定時間への到達 |
| 入出力完了通知 | 外部割込み | 装置の動作完了 |
この表は、基本情報でよく問われる原因による整理です。実際のCPUの仕様書には、interrupt、exception、trap、faultなど別の分類や用語が登場します。試験上の内部・外部を、それらの英単語へ一対一で置き換える必要はありません。まず問題文が何の分類を求めているかを確認し、CPU固有の名称は補足として区別します。
ページフォールトは参照が原因で、読込み完了とは別
ページフォールトは、実行中のプログラムがページを参照し、その参照をそのまま完了できないために起きる例外です。基本情報で代表的に扱われるのは、必要なページが主記憶にない場合です。原因は「そのページを必要とする命令を実行したこと」なので内部割込みに分類します。補助記憶を使って解決することは、分類の根拠ではありません。
学習用に、命令XがページPのデータを読む場面を考えます。Pが主記憶になければXを完了できず、対応処理へ移ります。OSが必要なページを用意した後、再実行できる状態ならXをもう一度実行します。最初の参照と、必要なデータをそろえる処理と、その後の再実行を分けると流れを追いやすくなります。
そのためのストレージ読込みが完了した通知は、別の入出力完了割込みです。ページフォールトは内部、読込み完了通知は外部と、原因を一つずつ判定します。また、ページフォールトは必ず回復できるとは限りません。無効な参照や権限違反などでは、OSがプログラムを終了させる場合もあります。ページを読み込めば必ず続行できる、とは断定しません。

システムコールはOSを呼ぶから外部、ではない
システムコールは、アプリケーションがOSのサービスを要求する入口です。試験で「システムコール命令の実行による割込み」と示された場合、発行した命令が原因なので内部割込みです。OSという別のプログラムへ移ることや、ファイル・装置を操作する目的だけを見て外部と判定すると誤ります。
例えば、プログラムがファイルの読み出しを要求する場面では、要求を受け付けるOSの処理へ移ります。その後で装置が動作し、読み出し完了の通知を出す場合があります。「要求のための命令」と「装置からの完了通知」は別です。選択肢が前者を述べているか後者を述べているかを、文の最後まで読んで判断します。
なお、システムコールの入口はCPUやOSによって異なり、すべてが同じソフトウェア割込み命令を使うわけではありません。Armの例外モデル資料では、SVCなどを同期例外の契機として説明しています。基本情報の設問では、指定された発生原因に従って分類すれば十分です。
科目Aの分類問題は四つの原因を別々に判定する
IPAの科目Aサンプル問題セットの問10は、外部割込みの原因を選ぶ問題です。論点を言い換えると、ゼロ除算、不正な命令、時間経過の通知、ページフォールトの中から、現在の命令に直接起因しないものを見分けます。公式解答はウで、時間経過の通知が該当します。
最初に消去したいのは、「エラーっぽいから外部」という判断です。ゼロ除算と不正命令は、実行中の命令に原因があります。次にページフォールトを見ます。メモリの話でも、プログラムがページを参照したことが引き金なので内部です。残った時間経過の通知は、タイマが条件成立を知らせる外部の契機です。
覚えた単語に印を付けるだけでなく、「何が起点か」を各選択肢について一文で説明すると理解を確認できます。出題文でタイマの設定命令とタイマの通知が混在したら、どの事象について問われているかを線で区切ってください。前後に別の処理が登場しても、問われた事象の原因だけで分類します。
基本情報の割込み処理を退避・復帰と例題で理解する

通常実行から割込み処理、復帰までを追う
ここからは分類した事象をCPUがどう扱うかを見ます。基本の流れは、事象の発生→受付→実行状態の退避→対応するハンドラの実行→状態の復元と復帰です。ただし、CPUが自動で保存する部分と、ハンドラが保存する部分の分担は実装によって変わります。順序問題では、設問が与えた手順や前提に従います。
- 通常のプログラムが命令を実行している
- 割込み要求や例外が生じ、CPUが規則に従って受け付ける
- 再開に必要な戻り位置・状態を保存し、対応処理へ制御を移す
- ハンドラが原因に応じた処理を行う
- 続行可能なら保存した状態を復元して再開する
この流れでは、「受付」と「処理開始」を区別してください。装置が要求を出した時点で、いつでも同じ瞬間にハンドラが動き出すとは限りません。受付を制限している場合や、より優先される処理がある場合には待つことがあります。要求があることと、その要求の処理をCPUが実行中であることは別の状態です。
また、割込みが起きたら必ず別のアプリケーションへ切り替えるわけではありません。同じプログラムへ戻る場合もあります。CPUがハンドラへ制御を移す仕組みと、OSが次にどのタスクを動かすかという判断を分けて考えます。後者の全体像は基本情報のOSとスケジューリングの解説で確認できます。
何を退避するかは再開位置と計算状態で考える
退避とは、あとで戻せるように値や状態を別の保存場所へ残すことです。試験で「中断した処理を再開するために保存するレジスタ」を問われたとき、再開する命令の位置を示すプログラムカウンタが要点になります。名称だけでなく、命令の番地を保持する役割と結び付けてください。
| 保存する情報の例 | 役割 | 失うと困ること |
|---|---|---|
| 再開位置を示す情報 | 復帰後に実行する命令を特定する | どこへ戻るか分からなくなる |
| 汎用レジスタの値 | 計算途中の値やアドレスを保持する | 途中の計算が別の値になる |
| 状態・フラグ | 比較結果や実行モードなどを保持する | 分岐や実行条件が変わる |
| 必要なスタックの状態 | 呼出しや一時保存の関係を維持する | 正しい呼出し元や保存値へ戻れない |
表の項目を、すべてのCPUが同じ形式で一度に自動保存するという意味で覚えないようにします。ハードウェアが戻り位置などを残し、ハンドラ側が使用するレジスタを追加で保存する実装もあります。実際に保存が必要な範囲はCPUの仕様と処理の約束に従います。基本情報では、戻り位置と作業中の値の両方が必要だと理解するのが先です。
退避は、プログラムのソースファイルを磁気ディスクへバックアップすることではありません。再開に必要な実行状態を保持する操作です。保存先にはスタックなどが使われますが、具体的な保存先・自動保存範囲をすべての機種へ一般化しないでください。アドレスと値の区別が曖昧なら、アドレス指定方式と実効アドレスの解説も役立ちます。
プログラムカウンタだけ戻しても計算は戻らない
退避の必要性を、自作の学習例で考えます。主処理が「レジスタRに12を入れる→Rに8を足す→Rを結果として保存する」という順に進み、8を足す直前に割込みを受けたとします。ハンドラもRを使い、その値を99へ変更するなら、主処理へ戻る前にRを12へ戻す必要があります。
戻り位置だけを正しく復元しても、Rが99のままなら、主処理は99に8を足して107を保存してしまいます。Rを保存・復元していれば、12に8を足して20になります。この例で守るものは二つです。次に実行する命令の位置と、その命令が使う値をそろえて初めて、中断がなかったときと同じ計算を続けられます。

逆に、Rだけ12へ戻しても、再開位置を間違えて加算命令を飛ばすと20にはなりません。プログラムカウンタと汎用レジスタの役割を入れ替えないことが大切です。例題で選択肢が「命令の位置」「演算結果」「命令そのもの」「装置のアドレス」を混ぜていたら、何を再開したいのかに立ち返って選びます。
ハンドラの開始位置と元の戻り先は異なる
割込み処理へ移るときには、対応するハンドラの開始位置を決めます。原因ごとの入口を調べる仕組みに、割込みベクタやベクタ表があります。ハンドラの開始位置は「これから対応処理を始める場所」、退避した戻り位置は「対応後に再開する場所」です。どちらも番地に関わりますが、用途は別です。
例えば主処理の再開位置をA、入力装置のハンドラの入口をBと置けば、退避するのはAへ戻るための情報で、ハンドラ実行中はB側の命令を進めます。Bだけを覚えていても元の主処理へ戻れません。反対にAを保存していても、どの原因のハンドラを実行するかは別に決める必要があります。
ベクタ表の具体的な形式はCPUによって異なります。入口の情報を表から選ぶという役割を押さえれば、基本情報の理解には十分です。表の中身を「必ず単なる開始番地だけ」と断定したり、割込み番号そのものを主処理の戻り番地と考えたりしないようにしましょう。
復帰先は常に次の命令、とは限らない
通常の外部割込みでは、受付が行われた位置に応じて主処理の続きへ戻ります。一方、回復可能なページフォールトのように、問題が解決してから原因の命令を再実行する例外もあります。したがって「割込み後は必ず次の命令」「必ず原因の命令を再実行」のどちらも、全種類へ広げると不正確です。
Intelのx86系では、例外をfault、trap、abortなどに分け、復帰位置や再開可能性を区別します。faultでは通常、原因の命令を再実行できるようにし、trapでは原因の命令の実行後の位置へ戻ります。abortは確実な再開ができない重大な事象を扱います。これはIntelのシステムプログラミング資料の6.5・6.6節で確認できます。
これらはCPU仕様を読むための補足で、基本情報の内部・外部の分類そのものではありません。Armではinterruptをexceptionの一種として扱うなど、用語の階層も異なります。試験対策では「原因で分類する問い」と「どこへ復帰するかを問う問い」を分け、問題にある前提から答えます。英単語の暗記だけで全CPU共通の動作を推測しないことが重要です。
優先度と割込み禁止は受付条件の話
複数の割込み要求がある場合、優先度などの規則に従って対応するものを選びます。また、処理の途中で別の割込みを受けると困る場面では、特定の割込みの受付を一時的に制限することがあります。これがマスクや割込み禁止に関わる考え方です。事象が起きないようにすることと、受付を止めることは同じではありません。
例えば短い保護処理の間に受付を制限しても、装置側の動作完了という事象は発生し得ます。要求を保留する仕組みやフラグの扱いは装置・CPUによって変わるので、「禁止中の通知は全部消える」とは覚えません。受付を再び許可した後に処理するものもあります。時間の図では発生時刻と実行開始時刻を別に記入すると混乱を減らせます。
ただし、すべての割込み・例外を一つの禁止設定で止められるわけではありません。マスク不能割込みなどもあります。基本情報の問題では「多重割込みを許可する」「より高い優先度のみ受け付ける」といった条件が重要です。優先度の大小の表記も設問によって違うため、数字が大きい方を無条件に優先しないでください。
多重割込みは入れ子になり、内側から復帰する

自作例として、主処理の実行中に割込みAを受け、Aの実行中にAより優先度の高いBが発生した場面を考えます。高優先度の多重割込みが許可されているなら、Aの途中の状態も保存してBへ移り、Bが終わってからAの残りへ戻ります。Aが終わった後に、最初の主処理へ戻ります。
| 時点 | CPUが実行する処理 | 戻るために残す状態 |
|---|---|---|
| Aを受ける前 | 主処理 | まだAへの退避なし |
| Aの開始 | A | 主処理の状態 |
| Aの途中でBを受ける | B | 主処理の状態+Aの途中の状態 |
| Bの終了後 | Aの残り | 主処理の状態 |
| Aの終了後 | 主処理の続き | この例の割込み処理は終了 |
この例の実行順は、主処理→A→B→Aの残り→主処理です。Bが終了したからといって主処理へ直接戻すと、Aの残りが抜け落ちます。何段階の処理を中断しているかを意識し、直前に中断した処理へ戻ると考えれば、時系列の問題を追えます。Aを最初からやり直すという前提でもありません。
多重割込みが禁止されていれば、この例のBはAをすぐ中断する条件を満たしません。いつBを処理するかは、保留や受付の規則に従います。図から時間を求める設問では、発生した瞬間にすべて実行する線を引かず、優先度・禁止区間・処理時間を最初に読んでください。計算の前に実行順を確定するのが要点です。
ポーリングとの違いは誰が完了を知らせるか
ポーリングは、CPU側のプログラムが装置の状態を繰り返し読んで、準備完了や動作完了を確認する方式です。割込み方式は、装置が要求を通知し、CPUが受け付けて必要な処理へ移る方式です。自分から見に行くか、通知を契機に処理するかという違いで整理できます。
| 比較項目 | ポーリング | 割込み方式 |
|---|---|---|
| 完了を知るきっかけ | プログラムが状態を確認する | 装置からの通知を受け付ける |
| 待つ間の処理 | 確認命令を繰り返す場合がある | 確認を続けず他の処理を進められる |
| 確認・通知に伴う負担 | 状態確認の回数や頻度に左右される | 受付・退避・復帰などの処理が必要 |
| 扱う事象が多いとき | 順に確認する設計が必要 | 通知の頻度や優先度の設計が必要 |
割込み方式なら確認ループをずっと回さずに済みますが、負担がゼロになるわけではありません。受付や退避・復帰、ハンドラの処理時間があります。通知が極端に多い場面では、その負担を考慮します。ポーリングも、待つ時間が短い場合や一定周期でまとめて確認する設計では選ばれ得ます。問題の条件を無視して「割込みなら常に最速」とは言えません。
実際にMicrochipの割込み制御レジスタの資料は、受付の許可状態とは別にフラグが設定され、ソフトウェアによるポーリングにも使える例を示しています。同じ装置の状態を扱っていても、確認・受付の方法は区別できます。

科目A向け自作例題で原因・退避・受付を判定する
次の三問は理解確認用の自作問題です。過去問の原文ではなく、この記事の要点を異なる場面に当てはめるためのものです。正解の選択肢だけでなく、誤りの原因も説明できるか確かめてください。
例題1:プログラムがストレージへ読込みを依頼した後、CPUは別の計算を続けている。装置が読込み完了を通知したときの分類はどれか。ア:依頼元がプログラムなので内部。イ:装置の完了通知なので外部。ウ:OSが処理するので必ず内部。エ:データを読むのでページフォールト。
答えはイ。問われているのは、依頼を出した時点でなく、装置が完了を知らせた時点です。アは過去の依頼と現在の通知を混同しています。ウは処理担当と発生原因を混同しています。エは読込みという語だけでページフォールトと決めています。ページフォールトなら、実行中の参照命令が必要なページへアクセスしたことが原因です。
例題2:主処理の戻り位置を保存してハンドラへ移ったが、ハンドラが書き換えた汎用レジスタを元へ戻さなかった。何が問題か。ア:戻り先が保存されていれば問題ない。イ:元の計算に必要な値が失われ得る。ウ:必ず内部割込みになる。エ:すべての命令がポーリングへ変わる。
答えはイ。戻る場所と計算に使う値は別です。主処理の命令位置が合っていても、途中の値が変われば計算結果は変わり得ます。ウの内部・外部は発生原因の分類で、退避漏れの有無では変わりません。エのポーリングは装置状態の確認方式であり、復元漏れから自動的に変更されるものではありません。
例題3:Aの処理中に、より高い優先度のBが発生した。高優先度の多重割込みを許可し、AもBも正常に復帰できる。Bの処理終了直後に再開するのはどれか。ア:主処理。イ:Aの先頭。ウ:中断されたAの続き。エ:Bの先頭。
答えはウ。Bが直接中断したのはAです。Bを終えたらAの途中へ戻り、Aが終わってから主処理へ戻ります。アは入れ子の一段を飛ばし、イは退避した途中位置を無視しています。問題に再実行を必要とする例外の条件がないので、BやAを先頭からやり直すと勝手に補わないことも大切です。
基本情報の割込みは原因と退避・復帰で整理する
分類・レジスタ・時系列をまとめて問われても、すべてを同時に判断する必要はありません。まず事象の原因を読み、次にCPUが何を保存してどこへ移るかを追い、最後に受付条件と復帰先を確認します。単語の連想で即答するより、問われた対象を一つずつ固定する方が、似た選択肢を区別しやすくなります。
- 原因:実行中の命令か、時間経過や装置の通知か
- 退避:戻り位置だけでなく、再開に必要な値を守っているか
- 移行:ハンドラの入口と、主処理の戻り先を区別しているか
- 受付:優先度、割込み禁止、多重割込みの条件を読んだか
- 復帰:直前に中断した処理か、原因の命令の再実行か
誤答した問題では「内部と外部を間違えた」だけで終えず、「依頼と完了を混同した」「戻り位置と値を混同した」「発生と受付を同時だと思った」のように原因を言葉にします。違う場面でも同じ判断を使えるか、自作例の装置やレジスタの値を変えて確認すると、用語だけの暗記から一歩進めます。
基礎を整理したら、基本情報の過去問アプリで無料演習して、科目A・科目Bの問題にも取り組めます。正解後に各選択肢の理由を説明し、割込みでは発生原因と再開に必要な状態をセットで確認しましょう。


コメント