CPUの世界観です。ハードウェア1(半導体)やアセンブリ言語も参照のこと。
CPUは、コンピュータの中枢であり、全ての計算と実行を行うハードウェア装置。
加減乗除やシフト演算などの基本的な演算・計算ができる。
また、レジスタと呼ばれる高速の記憶領域を何個か持っていて、計算の時に使う。レジスタにはAX, BX, CX, DXのように名前がついている。
記憶を保管するためのメモリや、バスなどを通じて周辺機器ともつながっていて、メモリの中の記憶にアクセスしたり、メモリの中に記憶を保存したり、周辺機器に対するI/O操作を行うことができる。
また、実行中のプログラムに関しては、現在の命令の位置を任意の位置にジャンプする「ジャンプ命令」を使うことができる。
命令は機械が解釈できる機械語の命令で行うが、このそれぞれの命令を人間が理解しやすいように言葉(ニーモニック)に置き換えたアセンブリ言語というものがあり、機械語のプログラムを作る時はこうしたアセンブリ言語を用いる。アセンブリ言語を参照のこと。
後日注記:CPUの基本は、シフト演算、加減乗除、ジャンプ、メモリへのアクセスと操作。これらの命令を、メモリ上から読みだして実行し、メモリを変更することができる。
現在のコンピュータでは、CPUやメモリのような低レベルなハードウェアを直接触ることは少ない。OSが仮想CPUや仮想メモリの機構を用意しているため、プログラムを動かす時は原則プログラムはOSの管理下に置かれる。プログラムはマルチタスクを実現するコンテキストスイッチ(プログラムを並列で動かすためのOSの機構)やスケジューリング、あるいはプログラムが利用する変数などの記憶が物理アドレスの中のどの場所に保管されるのか、などといったことを意識することなく、独自の論理アドレス空間を用いて、並列でプログラムを動かすことができる。
だが、そうしたOSの低レベルなカーネル処理は、全て現実のCPUとメモリの上に実現されている。OSのコードを実行する場合でも、実際に動いているのはCPUであり、プログラムを動かす時も、実際に計算しているのはCPUである。CPUによっては「カーネルモード」と「ユーザーモード」が分かれていることがあり、カーネルはそうしたCPUの機能を用いて作られている。
また、機械語やアセンブリ言語でプログラムを書くこと自体、現在のコンピュータでは稀であり、多くの場合C言語のようなプログラミング言語を用いて、それを機械語に翻訳するコンパイラを用いて機械語を生成する。手動でハンドアセンブルするよりは遅く非効率的になるかもしれないが、機械語やアセンブリ言語で書くよりもはるかに人間に分かりやすく、書きやすく、読みやすく、また移植性も高い。多くのコンパイラで「最適化」が行われており、ハンドアセンブル並みに高速かつ効率的な機械語をコンパイラが生成することも少なくない。
もっとも高速なのはFORTRANやC/C++だが、遅くても生産性が高い他の言語を使うことで、さらに書きやすく、読みやすく、作りやすく、また移植性が高くなる。また、オブジェクト指向言語のような高水準の機能のある言語を用いて、より大規模かつ簡単な開発が可能となる。
ただし、現在のコンピュータではCPUを意識しないからといって、CPUが無関係になるわけではない。実際のところコンピュータの中枢として動いているのはCPUであり、そのため、CPUのクロックやコア数が上がるとコンピュータのスピードが速くなる。
また、OS開発者にとっては、CPUの処理は知っておかなければならない。近代のOSでは、CPUを有効に使うために、特にマルチプロセッサ環境やクラスタシステムなどにおいて、複数のプロセッサ(マルチプロセッサ)をいかに効率よく利用するか、などといった課題がある。
後日注記:本当のことを言うと、機械語やアセンブラでの開発をしていると、CPUの命令体系にじかに触れる機会は結構多い。特に、x86アセンブラをやろうとすると、Intel CPUの演算命令(ニーモニック)を覚える必要があるし、セグメント、レジスタ、アドレスなどの概念を知っておかなければならない。C/C++言語を用いて開発をする上でも、メモリアドレスを格納する変数であるポインタに触る機会はわりと多い。また、2進数や16進数の考え方は、デジタル処理を行う上で多用される。CPUの仕組みを知っておいて、損になることはなく、ためになる知識がそのままスキルアップになる。詳しくはアセンブリ言語を参照のこと。
CPUはコンピュータの「頭脳」だが、人間の頭脳との違いは、プログラムを書かなければ動かない、ということ。機械語の命令に変換(コンパイル)することのできるプログラム言語を用いて、プログラムを書かなければ動かない。自らプログラムを考える、ということをCPUはしない。
その代わり、いったんプログラムが与えられてしまえば、それを計算するのは高速であり、人間よりはるかに速く、人間のするのと同じ計算をすることができる。また、CPUは柔軟で、どんなプログラムであっても、休まず、何度でも、ひたすらその通り計算することができる。
その代わり、プログラムに書いたことしか理解できないため、プログラムに書くことのできない曖昧で厳密性を欠いたことについては理解することができない。必ず、厳密な命令が必要であり、そしてどんなに細かすぎるようであっても、機械が理解することができるように、極めて細かく、厳密に、間違いなく丁寧に書かなければならない。
プログラムという方式の利点としては、「抽象性」が挙げられる。どんなに関数やサブルーチンを繰り返しても、その通りきちんと実行する。変数を用いることで、同じ言葉を繰り返さなくても、ひとつのサブルーチンでどんな場合にでも対応できる。人間であれば学習してひとつひとつ覚えなければならないことを、その計算式に基づいて簡単に計算できる。そのため、人間が頭で考えるには不可能な膨大な情報を瞬時かつ自動的に計算してくれる。そのため、形式的・手続き的な処理を行うのであれば、マウスやキーボードで行うより、プログラムを書いて行った方が楽である。OSのソースコードなどはとても膨大であるが、CPUは文句を言わずOSのコードを簡単に計算する。
CPUは、基本的に二進数の0と1の組み合わせと桁上がりで足し算と引き算を行います。
技術の進歩とともに、計算出来る量が増えてきました。ですが、これは計算する人数が増えたのであって、決して計算する頭が賢くなったわけではありません。だから、基本的に昔のプロセッサと原理は変わらないのです。
計算を行うための論理回路についてはコンピュータの計算原理を参照のこと。
Wikipedia
「平成18年度 イメージ&クレバー方式でよくわかる栢木先生の基本情報技術者教室 (情報処理技術者試験)」を参考に執筆しました。
CPUの中には、「レジスタ」と呼ばれるパソコンの中でもっとも高速な記憶装置が存在する。(詳しくはアセンブリ言語を参照のこと。)
後日注記:たとえば、4bitのレジスタは桁ごとに値を分割し、4つのデータをそれぞれの記憶素子に対応させて入出力する。CPUにはこのようなレジスタが数種類から数十種類用意されており、CPUの演算対象・演算結果を参照・格納する直接の場所となる。
(放送大学「コンピュータの動作と管理 ('17)」を参考に執筆しました。)
2023.04.21編集
機械語命令は、命令部(命令が機械語で指定される)とアドレス部(オペランドデータのアドレスが指定される)から成り立つ。
以下の1~6までの段階(ステージ)を順次、繰り返してプログラムは実行される。
サイクル | 説明 |
---|---|
1.機械語命令の取り出し | 命令アドレスから命令をひとつ取り出す。命令アドレスは次の命令を指すようになる。 |
2.デコーダによる機械語命令の解読 | デコーダによって命令を解読する。 |
3.データの実効アドレスを計算 | オペランド(データのこと)の実効アドレスを計算し、取り出しを指示する。 |
4.データの取り出し | データを取り出す。 |
5.機械語命令の実行 | 計算を実行処理する。 |
6.演算した結果の格納 | 計算結果をメモリに格納する。 |
(「平成18年度 イメージ&クレバー方式でよくわかる栢木先生の基本情報技術者教室 (情報処理技術者試験)」を参考に執筆しました。)
オペコードとは命令のこと、オペランドとはデータ(たとえばレジスタや値、変数)のことです。
後日注記:CPUでは、文字列や数字をビットで表現する。CPUが一回の演算で処理できるビットを「ワード」、ワードの長さを「ワード長」という。また、データのビット長は「データ長」という。たとえば、32bitのワード長では、64bitのデータを二回に分けて演算するが、64bitのワード長では、64bitのデータを一回で演算できる。このため、CPUのビット数が上がるとデータの計算が高速になる。
(放送大学「コンピュータの動作と管理 ('17)」を参考に執筆しました。)
2023.04.21編集
(計算機アーキテクチャ (情報工学入門選書)を参考に執筆しました。)
CPUには、IF(命令の取り出し) - ID(命令のデコーダによる解読) - AC(実効アドレスの計算) - OF(オペランドデータの取り出し) - EX(演算処理の実行) - MW(メモリへの演算結果の書き込み)のように、命令ひとつであってもそれぞれのステージがある。
このそれぞれのステージを独立させ、複数の命令が実行される場合、ひとつの命令のすべてが終わるのを待ってから次の命令を実行させるのではなく、命令を構成するステージごとにステージが終わった段階で次の命令のステージを次々と実行させる方法をパイプライン処理という。
パイプラインがない状態では、CPUの命令は以下のように実行される。
時間 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
命令A | IF | ID | AC | OF | EX | MW | ||||||
命令B | IF | ID | AC | OF | EX | MW |
パイプラインがある状態では、CPUの命令は以下のように実行される。
時間 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
命令A | IF | ID | AC | OF | EX | MW | ||||||
命令B | IF | ID | AC | OF | EX | MW | ||||||
命令C | IF | ID | AC | OF | EX | MW | ||||||
命令D | IF | ID | AC | OF | EX | MW | ||||||
命令E | IF | ID | AC | OF | EX | MW | ||||||
命令F | IF | ID | AC | OF | EX | MW | ||||||
命令G | IF | ID | AC | OF | EX | MW |
パイプライン制御については以下を参照のこと。
CISCは、複雑な命令セットを持つCPUプロセッサで、RISCは、単純な命令セットを持つCPUプロセッサ。
RISCのように単純な命令セットだけを持つことで、それぞれの命令の処理速度が等速度になり、パイプラインによる処理効率が劇的に向上する。
詳しくはCPUアーキテクチャを参照のこと。
CPUの命令について考える上で重要となる技術が、プログラムカウンタと呼ばれるデータ。
プログラムカウンタは、CPUの命令ごとに与えられる、命令の順番を表したデータである。
一行ごとに1ずつ増えることもあれば、命令の数や長さによっては2や3のように1以上増えることもある。
プログラムカウンタによって、CPUは今どの命令を実行しているのかということが分かる。
プログラムカウンタの使い道として、たとえばジャンプ命令を行った時、プログラムカウンタの値を編集して、別のプログラムカウンタの命令にジャンプすることがある。
ほかにも、ハードウェアやソフトウェアの割り込みが行われた時に、割り込みのためのプログラムカウンタを代入して、割り込み処理が終わった段階で元あったプログラムカウンタへの値に戻すことが考えられる。
また、マルチタスクのOSを実行していた時、現在のプログラムカウンタの値をメモリ上に退避して、プログラムを停止し、別のプログラムのプログラムカウンタを代入してタスクを切り替え、停止しておいた元のタスクを再実行する際に元のプログラムカウンタを再代入することなどが考えられる。
機械語やアセンブラ、あるいはFORTRANやBASICのプログラムを実行する上で行の最初に記述する行番号も、プログラムカウンタと同様の考え方であると言える。
(放送大学「コンピュータの動作と管理 ('17)」を参考に執筆しました。)
2023.04.21
LSIを作るためには、シリコンウエーハという材料を使う。
LSIの製造は、まず、シリコンウエーハの表面に化学的な膜を作る。そして、この膜の中に、論理回路のパターンを書きこむ。これをフォトリソグラフィという手法で行う。
LSIの製造には、前工程と後工程がある。
前工程はさらに「フロントエンド」と「バックエンド」に分かれる。フロントエンドでは、トランジスタ素子を作る。バックエンドでは、素子と素子を配線で繋ぐ。
後工程では、ウエーハを検品し、チップの良品と不良品を分ける。そして、リードフレームにチップをマウントし、電極をボンディング(金線で接続)する。
以下の書籍が参考になります。
2023.01.22-23編集
ワイヤードロジックは、物理的に形作られた論理回路のこと。RISC系のCPUで高速化を行うために使われる。
(放送大学「コンピュータの動作と管理 ('17)」を参考に執筆しました。)
2023.04.21
CPUについて言えることとして、「ソフトウェアやOSでいくら仮想化しても、動いているのはCPUである」ということ。
マルチタスクや並列性のような技術は確かにソフトウェアでCPUを仮想化して実現しますが、それでも、パソコンで中央処理をしているのは、現実にあるCPU自身に他なりません。
Intel 4004以降のマイクロプロセッサでは、CPUやハードウェアに機械的回路を作って計算するのではなく、ソフトウェアで「プログラミング」を行って計算を実現します。(ちなみに、Intel 4004をインテルとともに開発したのは、嶋正利という日本人エンジニアです。)
そのため、プログラミングは必ず必要ですが、それでも、動いているのはCPUであり、それは機械語の命令を読み出し、解読し、データを取得し、計算し、実行結果を保管する、一連のステージを実行できるCPUプロセッサなのです。
コンピュータの計算原理については、コンピュータの計算原理を参照のこと。
情報科学については、コンピュータ科学を参照のこと。
デジタル情報については、デジタル情報を参照のこと。
半導体装置については、ハードウェア(1.半導体)を参照のこと。
メモリやIOデバイスについては、メモリやハードウェア(2.周辺機器)を参照のこと。
GPUについては、GPUを参照のこと。
CPUアーキテクチャについては、CPUアーキテクチャを参照のこと。
具体的なCPUアーキテクチャについては、Intel、ARM、RISC-Vなどを参照のこと。
コンピュータの歴史については、古いコンピュータ(1.メインフレーム・ミニコン)を参照のこと。
パソコンの歴史については、古いコンピュータ(2.パソコン)、ホビーパソコンを参照のこと。
x86アセンブラについては、アセンブリ言語を参照のこと。
C言語のインラインアセンブラについては、C言語(6.プリプロセッサとインラインアセンブラ)を参照のこと。
C言語のポインタについては、C言語(4.配列とポインタ)を参照のこと。
コンパイラ技術については、コンパイラ、C/C++開発ツール、UNIXシステム管理(2.コンパイラ)、GNUツールチェイン、LLVM/Clang、Makeなどを参照のこと。
C言語についてはC言語(1.基本)を、libcについてはlibcを参照のこと。
昔の言語については昔の言語を、FORTRANについてはFORTRANを参照のこと。
OSについてはOSを参照のこと。
LinuxカーネルについてはLinux カーネル開発(開発、プロセス、メモリ管理、デバイス、ソースコード・カーネルモジュールなど)を参照のこと。
電子機器については電子機器を参照のこと。
CPUについての基本は、以下のような書籍が参考になります。