CPUが入出力の完了を繰り返し確認(ポーリング)する制御方式
プログラム制御方式とは、CPU(=中央処理装置。コンピュータの頭脳)が、入出力の手続きを最初から最後まで自分で行う制御方式のことです。入出力装置(I/O)にデータを頼んだあと、CPUが「もう準備できた?」と繰り返し確認し、できていたら自分でデータを運びます。
身近な例で考えると、電子レンジの前にずっと立って、チンするまで何度ものぞき込み続けるのに似ています。本当は温まるまでに別のことができるはずなのに、レンジの前から離れずに見張っているので、その間は他の家事が一切進みません。
上のツールで▶ボタンを押すと、CPUがI/Oに依頼したあと「終わった?まだ?」と何度も状態を確認し、その間ずっと遊んでいる様子を確認できます。最後にやっとデータを運んで完了します。
ポーリング(polling)とは、CPUがI/O装置の「状態レジスタ」を一定間隔で何度も読みに行き、完了したかどうかを確認する方法です。状態レジスタとは、装置の今の状況(準備中/完了/エラーなど)を表す小さな記憶場所のことです。
処理の流れは、ぐるぐる回るループになっています。
・① 状態レジスタを読む:今「準備中」か「完了」かを調べる
・② まだ準備中なら①に戻る:完了になるまで何度も繰り返す
・③ 完了ならデータを転送する:CPU自身がI/Oからデータを読み出す
この「完了するまでひたすら確認を繰り返してCPUが待つ状態」をビジーウェイト(ビジー待ち)と呼びます。CPUは確認以外の仕事をしておらず、見かけは忙しそうでも実質的には遊んでいる、という点がポイントです。
プログラム制御方式の最大の欠点は、I/Oの完了を待っている間ずっとCPUが拘束され、他の仕事ができないことです。
なぜこれが問題かというと、CPUと入出力装置のスピード差がとても大きいからです。CPUは1秒間に何億回も命令を処理できますが、ディスクやプリンタなどのI/O装置は機械的な動作を含むため、桁違いに遅いのです。速いCPUが、遅い装置の完了をただ待ち続けるのは、大きな時間の無駄になります。
具体的な不利な点を整理すると、次のようになります。
・CPU時間の浪費:待ち時間の間、本来できたはずの計算が止まる
・並行処理ができない:他のプログラムを同時に進められない
・I/Oが遅いほど無駄が増える:遅い装置ほど待ち時間が長くなる
この「待っている間も離れられない」問題を解決するために考え出されたのが、完了したら向こうから知らせてもらう割込み制御方式や、転送そのものを専用回路に任せるDMA制御方式です。プログラム制御方式は、これらの出発点となる最も単純な仕組みだと考えると分かりやすいでしょう。