割込みと入出力の制御方式
割込みが起きたときにCPUが何をどの順で行うかを答えられ、多重割込みのタイムチャートからメイン処理が使えるCPU時間を計算できるようになる。あわせて、ポーリング・割込み・DMAの違いを選択肢から見分けられるようになる。
CPUは、キーボード入力・ディスクの読込完了・タイマなどの「急ぎの用事」に応じながら、本来の処理も続けなければならない。その仕組みが割込みであり、手順・優先度・時間計算の3つが科目Aで繰り返し問われている。
このレッスンで稽古する(用語チェック・過去問)結論:割込み=本を読んでいる途中に電話が鳴ったときのしおり
割込みは、実行中のプログラムを一時的に止めて、急ぎの処理を先に行い、終わったら元の場所から再開する仕組みです。再開するために必ず保存するのは**プログラムカウンタ(PC)**です。PCは「次に実行する命令の番地」を記録しているレジスタで、ここを残せば中断した場所に戻れます。
たとえるなら、本を読んでいる途中で電話が鳴ったときに挟むしおりがPCです。しおりがあれば、電話のあとで続きのページから読み直せます。
| レジスタ | 中身 | 割込みで退避する? |
|---|---|---|
| プログラムカウンタ | 次に実行する命令の番地 | 再開位置そのもの。試験の正解はこれ |
| 命令レジスタ | いま実行中の命令の中身 | 再開位置ではない |
| データレジスタ | 計算途中のデータ | 再開位置ではない |
| インデックスレジスタ | 配列の何番目かを指す補正値 | 再開位置ではない |
割込み発生時の手順(いちばん出る)
過去問の正解を合わせると、順番は次の5段階です。受付 → 特権モードへ移行 → PCなどを退避 → 開始番地を決定 → ルーチンを実行。
- 特権モード:OSだけが使える、何でも実行できる権限の強い状態です。普通のアプリはユーザモード(できることが制限された状態)で動きます。
- 割込み処理ルーチン:割込みの原因ごとに用意された処理プログラムです。どこにあるかは割込みの種類から決まります(番地の一覧表を割込みベクタと呼びます)。
flowchart TD
A["① 割込み要求の受付"] --> B["② ユーザモード → 特権モード"]
B --> C["③ プログラムカウンタなどを退避"]
C --> D["④ 割込み処理ルーチンの開始番地を決定"]
D --> E["⑤ 割込み処理ルーチンを実行"]
E --> F["⑥ 退避した PC を戻し中断箇所から再開"]
覚え方は「受けて・権限を上げて・しおりを挟んで・行き先を調べて・実行」です。行き先(開始番地)が分からないまま実行はできないので、決定 → 実行の順は絶対に崩れません。
内部割込みと外部割込み・優先順位
割込みは原因がCPUの中(実行中のプログラム)か外(装置やハードウェア)かで2つに分かれます。入出力装置からの完了通知はCPUの外から来るので外部割込みです。
| 区分 | 原因の場所 | 代表例 |
|---|---|---|
| 内部割込み | 実行中のプログラム | ゼロ除算、オーバフロー、ページフォールト、SVC(OSへの機能呼出し) |
| 外部割込み | CPUの外 | 入出力完了、タイマ、ハードウェア障害(マシンチェック)、電源異常 |
複数の割込みが同時に起きても困らないよう、割込み原因ごとに優先順位が付けられ、高いものから処理されます。再開に必要な情報は高速に出し入れできる**レジスタや主記憶(スタック)**に退避するもので、磁気ディスクには書きません。
多重割込み:優先度の高い割込みは、割込み処理にも割り込める
多重割込みとは、割込み処理の実行中にさらに別の割込みを受け付けることです。許可されていれば、優先度の高い割込みは、実行中の低い割込み処理を中断できます。逆に、低い割込みは高い割込みの処理が終わるまで待たされます。
計算問題では、横軸の時間に沿って「いまCPUを使っているのは誰か」を0.5ミリ秒ずつ塗り分けます。最後に、誰も割込み処理をしていない区間を足したものがメイン処理の時間です(下の例題を参照)。
入出力の制御方式:ポーリング・割込み・DMA
CPUが入出力装置とやり取りする方法は3つあり、選択肢で取り違えさせる問題が出ます。ポーリングは郵便受けを何度も見に行くやり方、割込みは届いたらチャイムが鳴るやり方です。
| 方式 | 誰が何をする | 見分けるキーワード |
|---|---|---|
| ポーリング | CPUが状態レジスタ・ビジー信号を繰り返し読み出して装置の状態を見に行く | 「監視する」「読み出して」 |
| 割込み | 装置の側から終わったことを知らせ、CPUは実行中の処理を中断して対応する | 「中断して」「緊急度の高い処理」 |
| DMA | **専用の制御回路(DMAコントローラ)**が、CPUを介さずに装置と主記憶の間でデータを転送する | 「専用の制御回路」「CPUを介さず」 |
似た名前のまぎらわしい選択肢もまとめておきます。
| 選択肢に出る説明 | 正体 |
|---|---|
| CPUが磁気ディスクと主記憶のデータ受渡しを行う | CPUが自分で転送する方式(DMAではない) |
| 主記憶のアドレス空間に入出力装置のレジスタを割り当てる | メモリマップドI/O |
| 命令の実行ステージを重ねて同時に処理する | パイプライン |
| 送信側がデータをメモリに置き、受信側にアドレスを伝える | タスク間のメッセージ通信 |
| 共有資源を1つのタスクが占有できるようにする | 排他制御 |
多重割込みでメイン処理が使えるCPU時間を求める
| 割込み | 処理時間(ミリ秒) | 割込み優先度 |
|---|---|---|
| A | 0.5 | 高 |
| B | 1.5 | 低 |
ア 2
イ 2.5
ウ 3.5
エ 5
解き方と答えを見る
- 条件を整理する。A=処理0.5ミリ秒・優先度高、B=処理1.5ミリ秒・優先度低。Bは0ミリ秒と5ミリ秒、Aは1ミリ秒・2.5ミリ秒・3.5ミリ秒で発生する。5ミリ秒ちょうどのBは区間の終わりなので、0〜5ミリ秒の計算には影響しない。
- 0〜1.0ミリ秒:0ミリ秒でBが発生し、Bを実行する。1.0ミリ秒の時点でBは 1.0 ミリ秒分が済み、残りは 1.5 − 1.0 = 0.5 ミリ秒。
- 1.0〜1.5ミリ秒:Aが発生する。Aの優先度が高いので実行中のBを中断し、Aを0.5ミリ秒実行する(1.0 + 0.5 = 1.5)。
- 1.5〜2.0ミリ秒:中断していたBを再開し、残り0.5ミリ秒を実行して完了する(1.5 + 0.5 = 2.0)。
- 2.0〜2.5ミリ秒:割込み処理がないので**メイン処理 0.5ミリ秒**。
- 2.5〜3.0ミリ秒:Aが発生し0.5ミリ秒実行。3.0〜3.5ミリ秒:**メイン処理 0.5ミリ秒**。
- 3.5〜4.0ミリ秒:Aが発生し0.5ミリ秒実行。4.0〜5.0ミリ秒:**メイン処理 1.0ミリ秒**。
- メイン処理を合計する:0.5 + 0.5 + 1.0 = 2.0 ミリ秒。
- 検算:割込み処理の合計は B 1.5 + A 0.5 × 3 = 3.0 ミリ秒。全時間5ミリ秒から引くと 5 − 3.0 = 2.0 ミリ秒で一致する(この引き算が使えるのは、すべての割込み処理が区間内で終わるときだけなので、タイムチャートで確かめる)。
答え:ア(2ミリ秒)
割込み発生時の処理手順を並べる
ア ① → ③ → ④ → ②
イ ① → ④ → ② → ③
ウ ② → ① → ③ → ④
エ ② → ③ → ④ → ①
解き方と答えを見る
- 最初は権限の切替え。割込み処理はOSの仕事なので、まず②ユーザモードから特権モードへ移る。
- 次にしおりを挟む。①プログラムカウンタなどを退避する。
- 行き先を調べる。③割込み処理ルーチンの開始番地を決める。
- 最後に④割込み処理ルーチンを実行する。開始番地が決まる前に実行はできないので、③ → ④ は固定。
- ② → ① → ③ → ④ を選択肢から探す。
答え:ウ(② → ① → ③ → ④)
要点(試験直前に読む)
- 割込み後に中断箇所から再開するために保存するのはプログラムカウンタ(次に実行する命令の番地)。
- 手順は「受付 → 特権モードへ移行 → PC退避 → 開始番地決定 → ルーチン実行」。開始番地の決定はルーチン実行より必ず先。
- 入出力の完了通知・タイマは外部割込み、ゼロ除算・ページフォールト・SVCは内部割込み。割込み原因には優先順位が付く。
- 多重割込みでは、優先度の高い割込みが実行中の低い割込み処理を中断する。タイムチャートを0.5ミリ秒刻みで塗り分け、空いた区間を足すとメイン処理の時間になる。
- ポーリング=CPUが状態を読み出しに行く/割込み=装置から通知が来て中断する/DMA=専用回路がCPUを介さずに転送する。
ひっかけ
- 「命令レジスタを保存する」:命令レジスタは実行中の命令の中身であり、再開位置ではない。番地を持つプログラムカウンタが正解。
- 手順問題で「PC退避 → 特権モード移行」や「実行 → 開始番地決定」と順序を入れ替えている:権限を上げる → しおり → 行き先 → 実行、の流れで確かめる。
- 「再開情報を磁気ディスクに格納する」「入出力完了通知は内部割込み」:どちらも誤り。退避先はレジスタや主記憶、入出力完了は外部割込み。
- 多重割込みの計算で、Bが途中でAに中断されることを見落とし、Bが0〜1.5ミリ秒で連続して動いたものとして数えてしまう:Aの発生時刻ごとにBの残り時間を書き出す。
- ポーリングの選択肢に「実行中の処理を中断して緊急度の高い処理を実行する」(=割込み)、DMAの選択肢に「CPUが転送を行う」「アドレス空間に装置のレジスタを割り当てる」(=メモリマップドI/O)を混ぜてくる。
用語(15)
実行中の処理を一時的に止めて急ぎの処理を先に行い、終わったら元の場所から再開する仕組み。
⚠ ポーリングとの違いは「知らせが来る」か「CPUが見に行く」か。割込みは装置側から通知が来る。
次に実行する命令が主記憶のどの番地にあるかを保持するレジスタ。
⚠ 命令レジスタは「いま実行中の命令の中身」を持つ。再開位置を表すのは番地を持つプログラムカウンタ。
主記憶から取り出した、いま実行中の命令そのものを一時的に保持するレジスタ。
⚠ プログラムカウンタと混同させる選択肢が定番。中身なら命令レジスタ、番地ならプログラムカウンタ。
配列の要素を順に扱うときなど、番地を補正する値を保持するレジスタ。
⚠ 割込みからの再開には使わない。
OSが動作する、すべての命令や資源を使える権限の強い実行状態。
⚠ ユーザモードは権限が制限された状態。割込みが起きるとユーザモードから特権モードへ移る(逆ではない)。
アプリケーションが動作する、使える命令や資源が制限された実行状態。
⚠ 特権モードと逆。
割込みの原因ごとに用意され、割込み発生時に実行される処理プログラム。
⚠ 手順問題では「開始番地の決定」の後に「実行」が来る。この順は入れ替わらない。
ゼロ除算やページフォールト、SVCなど、実行中のプログラムが原因で起きる割込み。
⚠ 入出力完了通知やタイマはCPUの外が原因なので外部割込み。
入出力完了、タイマ、ハードウェア障害など、CPUの外の装置や事象が原因で起きる割込み。
⚠ 「入出力の完了通知は内部割込み」という選択肢は誤り。
割込み処理の実行中に、より優先度の高い別の割込みを受け付けて処理すること。
⚠ 優先度が低い割込みは、高い割込みの処理中には割り込めず待たされる。
複数の割込みが重なったときに、どれを先に処理するかを決めるために原因ごとに付ける順位。
CPUが状態レジスタやビジー信号を繰り返し読み出して、入出力装置の状態を監視する方式。
⚠ 割込み(装置側から通知・処理を中断)との取り違えが定番。「CPUが読み出して監視」ならポーリング。
入出力装置が処理中で次の要求を受け付けられないことを示す信号。
⚠ ポーリングでCPUが読み出す対象(状態レジスタと並べて出る)。
専用の制御回路(DMAコントローラ)がCPUを介さずに入出力装置と主記憶の間でデータを転送する方式。
⚠ 「CPUが転送を行う」はDMAではない。「アドレス空間に装置のレジスタを割り当てる」はメモリマップドI/O、「実行ステージを重ねる」はパイプライン。
主記憶のアドレス空間の一部に入出力装置のレジスタを割り当て、メモリと同じ命令で装置を操作する方式。
⚠ DMAの選択肢に紛れ込む。データ転送を専用回路に任せるのがDMA、番地の割当て方の話がメモリマップドI/O。
このレッスンの過去問
- 割込み時のプログラムカウンタ退避平成30年度 秋期 基本情報技術者試験 午前 問10
- 割込みの優先順位制御基本情報技術者試験 科目A免除 修了試験 200906 実施分 問10
- 多重割込み時のCPU使用時間計算令和元年度 秋期 基本情報技術者試験 午前 問13
- ポーリング制御の定義平成29年度 秋期 基本情報技術者試験 午前 問17
- DMA(ダイレクトメモリアクセス)の定義基本情報技術者試験 科目A免除 修了試験 20231210 実施分 問10