PC 教室ハードウエアCPU

ハードウエア~とにかく CPU でしょ

CPU が出来る事は、 計算だけではありません。 先ほどさり気なく書いてしまいましたが、データをメモリに記憶させる事が出来ます。 これは、メモリへの書き込みです。もちろん、メモリから読み込む事も出来ます。 読み込み、書き込み動作を纏めて、アクセス(Access)する、と言ったりします。

そして大切な事、プログラムという脚本は、メモリに記憶されていないと CPU は、読む事が出来ません。 インストラクションを実行する前に、CPU は、 インストラクションをメモリから読み込んで、 どんな仕事をしないといけないのかを判断します。 この動作をインストラクションフェッチ(Instruction Fetch)といいます。

同時に複数の仕事をこなせる CPU の場合、 インストラクションフェッチと、インストラクションの実行を同時に行えます。 今実行しなければならないインストラクションは、その前のサイクルで、 インストラクションフェッチしているというわけです。

メモリに対して出来ることと同じようなことは、 外部装置制御の為のコントローラに対しても出来ます。 SCSI 接続された HDD からの読み込みを例題にして、 説明してみましょう。

HDD に記録したり、もしくは、記録した物を読み込んだりするには、場所、つまり、 セクターを指定しないといけません。 読み込み動作を行う時、CPU は、 SCSI コントローラに、読み込みの最初のセクター番号と、 読み込むデータのサイズをセクター数で指定して、「データ、ちょうだいな」とお願いするんです。 そのお願いは、CPU が、 SCSI コントローラに、そのお願いを意味するデータを書き込むことで伝わります。

そのお願いを受けて、SCSI コントローラは、「わかったよ~ん」とか、 「今は駄目」とか、「そんなお願い知らないっ」とか、お返事をくれるわけです。 CPU は、 SCSI コントローラからの読み込みでそれを知ります。 そして、お返事によって次の動作を決めるんです。

CPU が、色々な事をこなせるのはここに在ります。 データによって、自分がやるべき仕事を切り替える事が出来るのです。 勿論、やるべき仕事を切り替えられるのは、プログラムがそういう脚本になっているからです。

それからもう一つ、 CPU には、 割り込み(Interrupt、インタラプト)という機能があります。 割り込みは、今進めているプログラムの実行を一旦中断して、一時的に違う仕事に切り替える事です。 一時的な仕事が終わると、先ほどまで進めていた仕事を、中断した所から、実行を再開します。

CPU が持っている機能は、割り込みを受けて、仕事を切り替える事と、 切り替えた割り込みの仕事が終わると、中断していた仕事を再開するという事だけです。

割り込みの仕事そのものは、やはりプログラムです。 そのプログラムの最後は、ここで割り込み仕事はお終いだよ、というインストラクションで終わらせます。 CPU は、その「終わり」を読み取って、中断していた仕事を再開します。

自分が自分の仕事をしている時に、 会社の同僚から「申し訳ないんだけど、一寸手伝ってくれる?」と尋ねられたら、 取りあえず今やっている仕事の手を止めて、その人の話を聞きますよね。 その人の話を聞いて、その人のお手伝いをした方が良いと思ったら、お手伝いをしますよね。

CPU の割り込みは、これに似ています。 お手伝いをしようと切り替える所まで行かないんですが、 とりあえず相手の話を聞く、という仕事に切り替える、という感じです。

具体的に説明しましょう。 どんな時に使われるのかというと、キーボードからの入力などに使われます。 キーボードから、「入力があったよ」というお知らせをキーボードコントローラが受取ると、 CPU に割り込みをかけます。 「キーボードから入力があったから、受取ってちょうだい」という割り込みです。

CPU は、今進めている仕事を一旦中断して、 入力されたキーの種別をキーボードコントローラから読み取り、一時的に記憶します。 そして、中断していた仕事に戻って、中断していた場所から仕事を再開します。

何故こんな事をする必要が在るのかというと、 キーボードからの入力は、CPU から見ると、いつ行われるのか解らないからです。 もし、割り込みの機能が無かったら、仕事を少し進めては、 キーボードからの入力はあるかな? と確かめ、また仕事を進めては、キーボードからの入力はあるかな? と確かめ... というプログラムにしないと、キーボードからの入力を取りこぼしてしまう事になってしまいます。

プログラムをそういう風に作るのも大変ですが、何よりも、効率よく仕事を進める事が出来ません。 キーボードからの入力があった時にだけ、入力されたものを処理した方が効率が良いですよね。 こういう事の為に、割り込みがあります。

割り込みについては、そんなに詳しく知る必要はないと思いますが、 割り込みという機能が CPU にはあるということは、知っておいた方が良いと思います。