コンピュータ講座 応用編 会報トップへ戻る
本ページの内容をPDFファイルでダウンロードできます >> PDFダウンロード
「コンピュータ講座 応用編」でのご意見やご要望をお寄せください >> アンケート
第1回  |  第2回  |  第3回  |  第4回  |  第5回  |  第6回  |  第7回  |  第8回  |  第9回  |  第10回  |  第11回  |  第12回

第2回 CPUの計算のしかたは意外に単純、速さで勝負

第二回目は、CPUがデータをどのように処理するかを解説します。
CPUが行っている処理は、意外に単純です。単純だからこそ、高速動作ができるのです。
今日では処理速度を上げるために、いっそう単純化する傾向にあります。CPUの論理的な動作を通じてどのようにそれが実現されるかを説明します。


CPUの内部構成

前回はIC(集積回路)の1種としてCPUの構造やしくみを紹介しましたが、今回は、CPUのコンピュータとしての構造やしくみを紹介します。

CPUの機能ブロックの名称とはたらき

数百万から数千万個のトランジスタで構成される論理回路を組み合わせて、CPUの内部にはデータを処理する仕組みが作られています。次の図は、単純化したCPUの内部構成です。各部のはたらきを簡単に説明しておきます。
なお、図中の「バス」と「レジスタ」については、次の項で詳しく説明します。


CPUの内部構成

  • 内部バス
    CPU内の各ブロックと外部とやりとりするデータバスを結んでデータや命令をやりとりします。
  • データバス
    読み込み・書き込み用のデータをやりとりします。
  • アドレスバス
    CPUが読み書きするデータや命令を格納したメモリやI/Oのアドレスを送信します。
  • コントロールバス
    CPUからメモリやI/O、メモリからI/Oへのデータ転送をコントロールします。
  • アドレスレジスタ
    CPUが命令やデータを読み書きするときに、目的のメモリやI/Oポートのアドレスをアドレスバスに出力するレジスタです。
  • レジスタ群
    CPUが作業するための小容量・高速なメモリ群です。CPUは、このレジスタにデータと命令を読み込んで処理を行います。
  • 命令レジスタ
    命令を記録するための専用レジスタ。このレジスタの読み込まれた内容を命令デコーダが翻訳します。
  • 命令デコーダ
    命令レジスタに読み込まれた命令を、制御情報に置き換えて制御ユニットに通知します。
  • 制御ユニット
    命令に応じた処理を行うCPU内部の回路を制御します。命令デコーダから送られる制御情報で制御線のスイッチをオン/オフして各機能ブロックやコントロールバスに出力します。
  • 演算レジスタ
    演算処理専用のレジスタです。演算結果を置いたり、データを一時的に保存したりします。加減算などの基本的な演算を行う回路が付属しています。アキュムレータと呼びます。
  • 演算ユニット
    演算レジスタに読み込まれているデータに所定の演算処理をします。
    演算論理装置またはALU(Arithmetic Logic Unit)とも呼ばれます。

バスはCPUの動脈

バスとはCPUの内部の処理装置どうしや外部のメモリやチップセットとを結ぶ「信号線の束」のことをいいます。データバスにはCPUが受け取るデータだけでなく、CPUから送出されるデータも流れます。このように複数の装置がデータの送受信をするために、共有する信号線の束がバスなのです。
CPU内部には「内部バス」、「データバス」、「アドレスバス」と「コントロールバス」の4つのバスが装備されています。
「内部バス」はCPU内部の処理装置やデータバスに接続され、内部どうしと内部と外部のデータや命令のやりとりに使用されます。
「データバス」はCPUとメモリやI/Oを結び、読み書き用のデータをやりとりするための双方向バスです。アドレスバスとコントロールバスとセットで動作します。アドレスバスで指定されたメモリやI/Oに対して書き込むまたは読み込むデータや命令をやりとりします。読み込みか書き込みかはコントロールバスの信号で判別します。
「アドレスバス」はCPUから外部への一方通行のバスです。CPUのアドレスレジスタから読み書きするデータや命令のアドレスが出力されます。
コントロールバスは、クロックパルスや制御シグナルなどの多種の信号線を含んでいます。動作のタイミングや読み込みか、書き込みか、などを指示するための制御信号をやりとりしています。
データバスとアドレスバスが一度にやりとりできる情報量をビットで表したものがバス幅です。
歴代のCPUのビット数(アーキテクチャー)にバスをまとめました。

CPUのビット数とバス幅
  4004 8080 8086 i486 Pentium /2/3
アーキテクチャー 4ビット 8ビット 16ビット 16ビット 32ビット
データバス幅 4ビット 8ビット 16ビット 32ビット 64ビット
アドレスバス幅 8ビット 16ビット 16ビット 32ビット 32ビット

16ビットCPU 8086はデータバス幅16ビットですから、一度に16ビットのデータを読み込むことができます。アドレスバス幅は16ビットですから、16ビットのアドレスを指定することができます。アドレスバスで指定できる範囲のことをアドレス空間と言います。16ビットの場合、64Kビット(216=65534ビット)となりますが、8086ではセグメントレジスタによるページ切り替えのような機能で4ビット分拡張しており、1MBのアドレス空間を持っています。このアドレスバスが32ビットになると、アドレス空間は4GB(ギガバイト=109バイト)まで拡大します。

レジスタはCPUの仕事場所

「レジスタ」はCPU内部の作業用のメモリで、小容量ですが高速に読み書きできます。
フリップフロップという論理回路の一種で構成されています。フリップフロップ回路は、入力信号があるたびに1と0を交互に切り替え、次の入力信号が来るまでその状態を保持(記憶)します。動作が単純なので高速に動作しますが、1ビットに1回路が必要で、大きな容量のメモリには向いていません。高速小容量のメモリであるレジスタには最適なのです。フリップフロップは、他にもSRAM(スタティックRAM)やCPUの内部キャッシュに使われています。
CPUは、すべての仕事をこのレジスタを使って行います。
次の図はCPUが演算動作をするときにレジスタを使用する様子を示したものです。

CPUは、「レジスタへの読み込み」、「演算処理」を行って、「レジスタからの出力」するのが仕事の全てです。レジスタはCPUの仕事の道具であり、仕事場所でもあります。そのため、1つひとつに名前が付いており、1つひとつに専用の機能があります。Pentiumが内蔵しているレジスタを例に説明します。Pentiumのレジスタは1本が32ビット構成です。これを16ビットで使用したり、8ビット×2本で使用したりすることができます。

  • 汎用レジスタ
    データの記憶や演算に使用できる汎用のレジスタです。演算レジスタとしてもアドレスレジスタとしても使用できます。
  • ベースポインタ
    メインメモリのアドレスのオフセットを格納します。ベースレジスタ、ベースポインタとも呼ばれます。
  • スタックポインタ
    レジスタの値を一時的に保存したり,サブルーチンなどの戻り先を保存したりするためのメモリ領域のアドレスを示します。
  • インストラクションポインタ
    CPUが次に実行する命令のアドレスを格納します。プログラムカウンタともいいます。
  • フラグレジスタ
    桁あふれや演算結果の正負の記号を自動的に読み込み、あらかじめ決められたビットを変化させます。
  • セグメントレジスタ
    メモリのアドレス範囲を選択するのに使います。セグメントセレクタともいいます。

以上のレジスタは、多少名称が異なっている場合もありますが、どの種類のCPUにも装備されています。レジスタには、CPUごとに機能強化のために独自なものがあります。Pentiumにも次のような独自のレジスタが装備されています。

  • 浮動小数点レジスタ
    double型変数など、浮動小数点を使用するプログラムが使用するレジスタ。
  • MMXレジスタ
    一度に複数の整数演算を行うプログラムが使用するレジスタ。64ビット×8本
  • SSEレジスタ
    一度に複数の浮動小数点演算を行うプログラムが使用するレジスタ。128ビット×8本
  • システムレジスタ
    OSが使用するレジスタ。Pentiumのメモリやタスクの管理に使われます。一般のアプリケーションが使うことはできません。
  • デバッグレジスタ
    主にデバッガが利用するレジスタ。

単純な処理を高速に実行

複雑に見えるアプリケーションソフトの動作時でも、CPUはその動作を30億分の1秒(クロック3GHzのCPU)で実行する単純な動作に分解して実行しています。その時の動作の単位を、CPUの動作サイクルといいます。

CPUの内部動作サイクル

次の図はCPU内部の動作サイクルです。CPUはクロック1回ごとに1動作ずつ進め、クロック4回で1サイクルになります。しかし、Pentiumなど一部のCPUでは、内部構造を工夫して(パイプラインやスーパースケーラなど、詳しくは次回説明します)1クロックで4動作進むようにしています。
クロック3GHzのCPUでは、1秒間に30億回(3GHz=3×109)の動作が行われることになります。1ずつカウントアップしても1秒間に30億まで数えられることになります。


CPUの動作サイクル

CPUの外部動作

次の図は、今度はCPUが動作中に、外部にはどのように動作しているように見えるかを示しています。

レジスタへの読み込み 命令の解釈と実行 メモリへの書き込み

※CLKはクロック信号:常時出力されています。

CPUはデータバスから命令やデータを読み込んで、計算し、再びデータバスに書き出す動作をしています。CPUがメインメモリやI/Oポートに対して行っているのは、これだけの動作です。この動作を高速に繰り返しています。
PCが複雑な処理や大きな数値の計算、高度な計算を行えるのは、この単純な動作を高速に行うことができるからです。クロック3GHzのCPUでは上記の動作を30億分の1秒(3×109分の1秒)で実行しています。
実際のメモリへの読み書きはCPUにとっては時間がかかる作業ですが、最近ではCPU内部の高速なキャッシュに保存することで高速化が実現しています。その他にも、CPU内部ではフラグレジスタにプログラムのジャンプやサブルーチンの戻り先を保存したり、アドレスレジスタによりメモリのアドレスをコントロールしたり、プログラムメモリに対してアドレスを自動的に増やしていくインストラクションポインタなど多くの機能が動作しています。

命令の処理

CPUがどんな命令で動作しているかを紹介しておきましょう。
CPUに直接命令を伝えることができるのが機械語です。その機械語を人間が読めるように最低限の英数字で記述できるようにしたのがアセンブラです。

機械語

機械語は数字の0と1(電気信号のオフとオンに相当)からなる2進数か、または4ビットずつを16進数で表現します。
PCの黎明期のROM-BASIC搭載のPCには、機械語モニタとよばれる機械語入力エディタが付属しており、比較的簡単に機械語を見ることができましたが、今日では簡単に見ることはできませんし、また、今日のCPUはOSやアプリケーションが複雑に組み合わさって動作しており、安易に機械語レベルでコードを実行することはお勧めできません。また、現実的にPCのアプリケーションが機械語でプログラミングされることはほとんどありません。
これは機械語がCPUに依存しており、機械語でプログラミングするとなるとCPUの種類ごとにプログラムが必要になります。そのため、今日では、「C」や「Basic」などのプログラミング言語でソースコードを作成し、それぞれのコンパイラやインタプリタによって機械語に翻訳する方法が一般的です。こうすればアプリケーションのソースコードは他のCPUと共通で使うことができ、コンパイラやインタプリタだけCPU専用のものを用意すればよいことになり、プログラミングが効率的になります。

Aレジスタの内容にBレジスタの内容を加えるという処理を機械語では、次のように記述します。

加算する Aレジスタ Bレジスタ
00010110 110001 110010 (2進数)
16H 31H 32H (16進数)

上記のような、1と0だけまたは16進の数字だけのプログラミングは実用的ではありません。そこで、機械語をもう少し人間が分かるように工夫されたのがアセンブラです。

アセンブラ

機械語と、アルファベットの文字または文字列を、1対1で対応させたのがアセンブラです。
アルファベットにした部分をニーモニック(mnemonic)と呼びます。ニーモニックは人間が読んだときに、分かりやすいまたは連想しやすい単語になっています。
例えば、mov→コピーする(move)、cmp 比較する(compare)、jmp→ジャンプする(jump)などがあります。
この命令の文字列を2進数の命令や引数に「翻訳」すれば機械語になります。
前述の機械語の「AレジスタにBレジスタの内容を加える」という処理をアセンブラで記述すると次のようになります。

加算する Aレジスタ Bレジスタ
ADD A B (アセンブラ)

アセンブラで記述されたプログラムも最終的には機械語に翻訳します。この作業をアセンブルといいます。ベテランの中にはハンドアセンブルという方法をご存じの方もおありでしょう。その通り手作業による翻訳です。また、機械語からアセンブラに翻訳することを逆アセンブルまたはディスアセンブルと呼びます。リバースエンジニアリングの1種です。

命令セットとは

CPUで使用できる機械語命令の集まりを命令セットといいます。
x86系CPUは、8086からPentium4に至るまで命令の互換性を保っています。これにより、OSがMS-DOSからWindows3.1、WindowsXPまで一定の互換性を維持しているのです。
しかし、ハードウェアは変化し続けており、旧機種と同じというわけにはいきません。
互換性を保った命令部分を命令セットアーキテクチャー、内部構造やキャッシュなどハードウェア部分をマイクロアーキテクチャーと呼んでいます。


命令セットアーキテクチャとマイクロアーキテクチャ

MS-DOSやWindowsPCの主流であるx86系、Macintoshに使用されてきたPowerPCなど、CPUの種類ごとに命令セットは異なります。同じCPUでも、OSによっては使用する命令セットは異なります。例えば、Intel社製のCPUで動作するMacOSは、使用する命令セットがWindowsが使用するものとは一部異なると思われます。命令セットにはWindows専用のものがあるからです。
CPUは次々に新製品が登場して、命令セット自体も拡張されていますが、互換のある命令セットだけで組まれたプログラムであれば、基本的にはx86系CPUならどれでも動作することになっています。また、x86はIntel社製ですが、AMD社のCPUも同じ命令セットで動作します。これを互換CPUと呼びます。互換CPUは同じ機械語の命令セットを持っています。
現在、CPUは64ビット化への移行期にあります。ここで問題になるのが、x86の命令セットです。30年間にわたり互換性を保ってきたことで、命令体系がすっかり旧式なものになってしまったのです。
アセンブラの例で、「Aレジスタ + Bレジスタ」を次にように記述しました。

add A B

x86系の命令セットでは、「Aレジスタ」と「Bレジスタ」の内容を足して、結果を「Aレジスタ」に書き込みます。命令の後の引数(オペランドといいます)は2つまでしか使えません。
通常は、この後、「Aレジスタ」の内容をメモリやI/Oに転送しますので、次のような命令が必要です。

mov A C

あらたにその命令を用意しなくてはなりません。
ところが、3オペランドを実装していれば、次のように1つの命令で記述することができます。

add A B C

3オペランドは、PowerPCなどの新しいCPUには実装されています。
互換性を重視するx86アーキテクチャーでは実現できません。x86は、1979年に作られた8086を源流とし、8ビットの8080との互換性を保ちながら16ビット命令を追加した関係で、扱いやすい命令体系にはなっていないのです。

x86の次へ

x86アーキテクチャーは旧CPUとの互換性を維持することで、ユーザーもメーカーも開発者も大きな恩恵を受けてきました。しかし、技術革新の最も激しい分野であるコンピュータの世界で、しかもCPUが32ビットから64ビットへの移行期にある今日、x86アーキテクチャーと、別れを考えるときが近いのかもしれません。2007年1月のWindowsVistaの登場が大きな転機になりそうです。

今回は命令や実際の処理という面からCPUを解説しましたが、実際にはキャッシュメモリやFPUなど、基本機能以外にさまざまな機能がCPUには装備されています。次回は、そういったCPUをフォローする機能とともに、今日のCPUに採用されている注目すべき機能と、今後のCPUの動向を占う技術についてのお話しです。


【参考書籍】
大原雄介『64ビットがわかる』株式会社技術評論社
馬場敬信『コンピュータのしくみを理解するための10章』株式会社技術評論社
蒲地輝尚・水越康博『はじめて読むPentiumマシン語入門編』アスキー

ページの先頭へ
タイトル一覧
CPU編
第2回   CPUの計算のしかたは意外に単純、速さで勝負
     
バス編
   
     
ディスク編
   
     
メディア編
   
     
ページの先頭へ
All Rights Reserved, Copyright(C) FUJITSUファミリ会