CPU
 Computer >> コンピューター >  >> ハードウェア >> CPU

CPUの仕組みを徹底解説!コンピュータの「頭脳」が命令を処理する流れとは

CPU(Central Processing Unit/中央演算処理装置)は、マイクロプロセッサとも呼ばれ、コンピュータの心臓部であり頭脳にあたる存在です。CPUの内部構造を深く理解することは、効率的なプログラムを書くうえで大きな助けになります。本記事では、コンピュータの中核であるCPUの仕組みを詳しく見ていきましょう。

「道具は通常、機械よりも単純である。道具は一般に手で使われるが、機械は動物や蒸気の力で動かされることが多い。」
— チャールズ・バベッジ

コンピュータは主に電力で駆動される機械ですが、その柔軟性とプログラマビリティ(プログラム可能な性質)によって、あたかも道具のようなシンプルさを実現しています。

CPUはコンピュータの心臓であり頭脳です。与えられた命令(インストラクション)を実行し、算術演算や論理演算を行いながら、全体の命令の流れを統括するのが主な役割です。まずは、CPUを構成する主要なパーツとそれぞれの役割から確認していきます。

プロセッサを構成する2つの主要コンポーネント

  • 制御ユニット(Control Unit:CU)
  • 演算論理ユニット(Arithmetic and Logical Unit:ALU)

制御ユニット(CU)とは

制御ユニット(CU)は、CPU内で命令の実行を統括する部分です。「何をすべきか」を指示する司令塔であり、命令の内容に応じて、CPUとコンピュータの他の部分(ALUを含む)をつなぐ配線を活性化させます。また、処理対象の命令を最初に受け取るのもこの制御ユニットです。

制御ユニットには以下の2種類があります。

  • ハードワイヤード方式(固定配線)の制御ユニット
  • マイクロプログラム方式の制御ユニット

ハードワイヤード方式はハードウェアそのものであり、動作を変更・追加するには物理的な回路の変更が必要です。一方、マイクロプログラム方式はプログラムによって動作を変更できます。処理速度ではハードワイヤード方式が優れ、柔軟性ではマイクロプログラム方式が勝っています。

演算論理ユニット(ALU)とは

演算論理ユニット(ALU)は、その名のとおり、すべての算術演算と論理演算を担当します。加算や減算などの操作を実行し、その内部はロジック回路(論理ゲート)で構成されています。

多くの論理ゲートは2つの入力を受け取り、1つの出力を生成します。下図は半加算器(Half Adder)回路の例です。AとBが入力、Sが出力、Cは桁上がり(キャリー)を表します。

CPUの仕組みを徹底解説!コンピュータの「頭脳」が命令を処理する流れとは
半加算器 出典:https://en.wikipedia.org/wiki/Adder_(electronics)#/media/File:Half_Adder.svg

記憶装置 ― レジスタとメモリ

CPUの主な仕事は命令を実行することですが、その処理にはデータが必要です。データには中間結果、入力値、出力値などがあり、これらのデータと命令は次の場所に格納されます。

レジスタ(Registers)

レジスタは、データを一時的に保存できる小さな記憶領域の集合体です。レジスタはラッチ(latch)の組み合わせで構成されており、ラッチ(フリップフロップとも呼ばれます)は論理ゲートを組み合わせた回路で、1ビットの情報を保持できます。

ラッチには「書き込み用」と「入力用」の2本の入力線と1本の出力線があります。書き込み線を有効にすると保存データを変更でき、無効にすると出力は常に同じ状態を保ちます。

CPUの仕組みを徹底解説!コンピュータの「頭脳」が命令を処理する流れとは
NORゲート2つを交差接続して構成されたSRラッチ

CPUには出力データを保持するためのレジスタがあります。中間データをいちいちメインメモリ(RAM)へ送ると時間がかかるため、バス(BUS)で接続された別のレジスタへデータを送ります。レジスタには命令、出力データ、ストレージのアドレスなど、あらゆる種類のデータを格納できます。

メモリ(RAM)

RAMは、レジスタを最適化された形で密に配置・集約したものであり、より多くのデータを格納できるようにしたものです。RAM(Random Access Memory:ランダムアクセスメモリ)は揮発性メモリであり、電源を切るとデータは失われます。

RAMはレジスタの集合体なので、読み書きの際には8ビットのアドレス入力、実際に格納するデータの入力、そしてラッチと同様に機能する読み書きイネーブル信号が必要となります。

命令(インストラクション)とは何か

命令とは、コンピュータが実行できる最小単位の計算処理のことです。CPUが処理できる命令にはさまざまな種類があります。

命令の例:

  • 算術命令:add(加算)、subtract(減算)など
  • 論理命令:andornot など
  • データ命令:moveinputoutputloadstore など
  • 制御フロー命令:gotoif … gotocallreturn など
  • プログラム終了の通知:Halt

命令はアセンブリ言語でコンピュータに直接与えられるか、コンパイラによって生成されるか、一部の高水準言語ではインタプリタによって解釈されます。

これらの命令はCPU内部にハードワイヤードされており、算術・論理命令はALUが、制御フローはCUが担当します。

1つのクロックサイクルでコンピュータは1つの命令を実行できますが、現代のコンピュータは複数の命令を同時に処理できます。

コンピュータが実行できる命令のグループは命令セット(Instruction Set)と呼ばれます。

CPUクロック

クロックサイクル

コンピュータの速度はクロックサイクルによって決まります。これはコンピュータが1秒間に処理するクロック周期の数を指します。1クロックサイクルは約250×10⁻¹²秒という非常に短い時間です。クロックサイクルが高いほど、プロセッサは高速になります。

CPUのクロックサイクルはGHz(ギガヘルツ)で測定されます。1GHzは10⁹Hz(ヘルツ)に相当し、1ヘルツは1秒あたり1回の周期を意味します。つまり、1ギガヘルツは毎秒10億サイクルということです。

クロックサイクルが速いほど、CPUはより多くの命令を実行できます。
クロックサイクル = 1 ÷ クロックレート
CPU時間 = クロックサイクル数 ÷ クロックレート

つまり、CPU時間を改善するには、クロックレートを上げるか、CPUに渡す命令を最適化してクロックサイクル数を減らす必要があります。一部のプロセッサではクロックを引き上げる(オーバークロック)ことも可能ですが、物理的な変更であるため、過熱や最悪の場合は発煙・発火のリスクも伴います。

命令はどのように実行されるのか

命令はRAM上に順番に格納されています。仮想的なCPUを例にとると、命令はオペコード(OP code:操作コード)メモリまたはレジスタのアドレスで構成されます。

制御ユニット内部には2つの重要なレジスタがあります。命令のオペコードを読み込む命令レジスタ(IR:Instruction Register)と、現在実行中の命令のアドレスを保持する命令アドレスレジスタです。さらにCPU内には、命令の末尾4ビットのアドレスに格納された値を保持する他のレジスタもあります。

ここで、2つの数値を足し合わせる命令セットを例に見てみましょう。

STEP 1 — LOAD_A 8

命令は最初、RAM上に例えば<1100 1000>として保存されています。先頭4ビットがオペコードで、これが命令の種類を決定します。この命令は制御ユニットのIRフェッチ(取り込み)され、デコード(解読)されて「LOAD_A」であることが判別されます。これは、命令の末尾4ビット(1000=アドレス8)にあるデータをレジスタAにロードせよ、という意味です。

STEP 2 — LOAD_B 2

上記と同様に、メモリアドレス2(0010)のデータをCPUのレジスタBへロードします。

STEP 3 — ADD B A

次の命令は、この2つの数値を加算することです。CUがALUに対して加算操作を指示し、結果をレジスタAに書き戻します。

STEP 4 — STORE_A 23

以上が、2つの数値を足し合わせるための非常にシンプルな命令セットです。これで2つの数値の加算に成功しました!

バス(BUS)

CPU、レジスタ、メモリ、IOデバイス間のすべてのデータはバスを介して転送されます。先ほど計算した結果をメモリに格納する場合、CPUはアドレスバスにメモリアドレスを、データバスに加算結果を載せ、制御バスで書き込み信号を有効にします。こうしてバスの働きにより、データがメモリへ書き込まれるのです。

CPUの仕組みを徹底解説!コンピュータの「頭脳」が命令を処理する流れとは
出典:https://en.wikipedia.org/wiki/Bus_(computing)#/media/File:Computer_system_bus.svg

キャッシュ(Cache)

CPUには、命令をキャッシュにプリフェッチ(先読み)する仕組みもあります。プロセッサは1秒間に数百万もの命令を処理できるため、RAMから命令をフェッチする時間の方が、実行時間よりも長くなりがちです。そこでCPUキャッシュは命令やデータを先読みすることで、実行速度を向上させています。

キャッシュ内のデータとメインメモリのデータが一致しない場合、そのデータにはダーティビット(dirty bit)が設定されます。

命令パイプライン(Instruction Pipelining)

最新のCPUは命令パイプラインを使って命令実行を並列化しています。フェッチ→デコード→実行という各段階において、ある命令がデコード段階にある間に、別の命令をフェッチ段階で処理できるのです。

CPUの仕組みを徹底解説!コンピュータの「頭脳」が命令を処理する流れとは
出典:https://en.wikipedia.org/wiki/Instruction_pipelining#/media/File:Pipeline,_4_stage.svg

ただしこの手法には、ある命令が別の命令に依存している場合に問題が生じます。そこでプロセッサは、依存関係のない命令を優先的に、順序を入れ替えて実行します。

マルチコアコンピュータ

マルチコアとは、実質的に複数のCPUを搭載する形態で、キャッシュなどの一部のリソースを共有しています。

CPUのパフォーマンス

CPUの性能は実行時間によって決まります。
性能 = 1 ÷ 実行時間

例えば、あるプログラムの実行に20msかかる場合、CPUの性能は1÷20=0.05となります。
相対性能 = 実行時間1 ÷ 実行時間2

CPUの性能に影響する要素は、命令の実行時間とCPUのクロック速度です。したがって、プログラムの性能を高めるには、クロック速度を上げるか、プログラム内の命令数を減らす必要があります。プロセッサの速度には限界があり、マルチコアの現代のコンピュータでも毎秒数百万の命令が処理できる程度です。もし書いたプログラムに大量の命令が含まれていれば、全体的なパフォーマンスは低下してしまいます。

ビッグオー記法(Big O notation)は、与えられた入力に対して性能がどのように影響を受けるかを評価する指標です。

CPU側でも高速化のためにさまざまな最適化が施されていますが、私たちプログラマも、CPUに渡す命令数をいかに減らせるかを意識することで、コンピュータプログラムの性能を大きく向上させることができるのです。

  1. データスクレイピングの仕組みを徹底解説!自動化の基本と始め方

    この記事を読んでいるということは、データスクレイピングのメリットについてすでに耳にしたことがあるかもしれません。自動化された技術を活用すれば、面倒な手作業なしに大量のデータを収集できる――そんな話です。では、データスクレイピングは実際にどのように機能するのでしょうか?難易度は高いのか、それとも誰でも習得できるのでしょうか?純粋な好奇心から知りたい方もいれば、自分のビジネスや副業に活用できるかどうか検討している方もいるでしょう。いずれにしても、この記事を読み終える頃には、データスクレイピングの概要、スクレイピングプロセスの実際の仕組み、そして始め方まで、しっかりと理解できるようになっています。そ

  2. Snapchatの仕組みとは?基本用語から使い方まで初心者向けに徹底解説

    モバイルメッセージアプリの世界に革命をもたらしたと言えば、それはSnapchat(スナップチャット)についての言葉として決して大げさではありません。Snapchatが登場する以前、友達とこんなユニークな方法でコミュニケーションができると想像した人はほとんどいませんでした。送った画像や動画が自動的に消えるという「自己消滅型メッセージ」という独自のコンセプトにより、Snapchatは従来のメッセージアプリやSNSとは一線を画す存在となっています。2011年の登場以来、Snapchatは1日あたり1億8000万人以上のアクティブユーザーを抱える、世界で最も人気のあるアプリの一つへと成長しました。また