!!!技術的雑談-CPUって何ですか? !!「CPU」とは? CPUとは'''C'''entral '''P'''rocessing '''U'''nitの頭文字をとった略語です。 日本語に訳す時は「中央演算装置」とでも訳しているようです。 また、文献によってはMPUと言ったりします。 '''M'''icro '''P'''rocessing '''U'''nitの略です。 おおよその意味において、CPUもMPUもおんなじです。気にしないで下さい。 !!CPUは何からできているのか? CPUの世代だとかアーキテクチャなどによって異なるのですが、大雑把に言えば以下の機能を持っているはずです。 *レジスタ CPUの中で一時的な記憶を行う為の領域です。 基本的にCPUの中で行われる演算や操作は全てレジスタを通して行われます。 CPUから見ての読み書き速度的にはココが一番速いです。 但しレジスタ数(=ビット数、本数)は限られているので、多量のデータは主記憶装置(メモリ)に置くことになります。 主なレジスタには以下のようなものがあります。 **PC(Program Counter) : 今、CPUがメインメモリのどこのアドレスを実行しているかを指す。ある意味一番重要なレジスタ。 **SP(Stuck Pointer) : プログラム上でデータを退避する為の領域のアドレスを指します。多分PCの次ぐらいに重要なレジスタ。 **汎用レジスタ : 普通に、演算などをするための整数や、メモリ操作の為のアドレスを入れておくレジスタ。CPUの種類や世代によって本数やビット数が異なる。古いCPUではレジスタによって実行できる命令が限定されていたりする。 **浮動小数点レジスタ : 浮動小数点演算機能を持っているCPUがその為の値を保持する為のレジスタ。いや、実は汎用レジスタとモノは同じなのですが、適用されるコマンドが別なんです。 **フラグレジスタ : CPUで命令を実行した際の結果や例外や状態を表すレジスタ。大抵の場合参照しかできません。 *整数演算機 実は、CPUは何をするにも整数演算をしないと先に進めません。 理由は後述しますが、例えば次に実行する命令の入っているアドレスを求めるのにも使いますし。 *浮動小数点演算機 古いCPUだと「FPU(Floating Point Unit)」なんて名前で別チップになったりしていました。 *命令実行機 CPUに与えられた「プログラム」を実行する為のロジックです。 CPUの心臓部です。 *メモリ・インターフェース メインメモリにアクセスする為の機能です。 *I/Oインターフェース メモリ以外の他のチップにアクセスする為の機能です。 新しいCPUには他にもイロイロ入っていたりしますが、大抵のものは上記のどれかの補助装置や機能拡張、またはCPU外にあった機能の高速化・省スペース化の為の取り込みだったりします。 (CPU内キャッシュとかはその典型ですね。) !!CPUは何をしているのか? CPUは基本的に以下の流れで延々と仕事をします。 +PC(Program Counter)の指すメインメモリのアドレスから「命令」を読んできます。 +その命令が何をする為のものなのか判断します。 +必要なら「命令」の次のアドレスから命令のために必要なデータを読んできます。 +命令を実行します。 +必要なら命令の実行結果をレジスタやメインメモリに書き込みます。 以上を延々と繰り返しています。 「停止コマンド」を受けるか、電源が切られるまで。 難しくないでしょ? ってか、むしろ単純だったりします。 !!CPUの「命令」って何? CPUは「機械語(マシンコード)」と呼ばれる命令しかわかりません。 JavaだのC++だのとは全然別物です。 人間が読んでも単なる数字の羅列です。わけがわかりません。 なので、人間が理解しやすいようにアセンブラだのJavaだのCだのという「言語」を作り、「言語」を解読してマシンコードに直す「コンパイラ」というプログラムを使うのです。 しかも、マシンコードは実は極々限られた機能しか(本来は)持っていません。 **ロード命令 : レジスタ→メモリ、メモリ→レジスタ、レジスタ→レジスタなどで数値を移動させる命令。最近のCPUはメモリ→メモリのロード命令とか持っていますが、結局メモリ→レジスタ→メモリの複合命令だったりします。 **演算命令 : レジスタの内容を他の対象(レジスタやメモリ)と計算し、その結果をレジスタやメモリに書き込みます。 **ジャンプ命令 : PCの内容を操作してプログラムの実行位置を変えます。フラグレジスタの条件によってジャンプをしたりしなかったりなんてこともできます。 **コール命令 : ジャンプに似ているのですが、変更する前のPCの値をSPのアドレスに記憶しておいて、リターン命令で戻れるようになっているのが違うところです。ある意味、複合命令です。 **CPU制御命令 : CPUの実行を止める命令や、割り込みを許可したり禁止したりする命令。 **I/O命令 : I/Oインターフェースに値を書き込んだり、値を読んできたりする命令。 あとは…と考えてみたのですが、よくよく考えると他は全て上記の組み合わせで実現可能です。 !!履歴 2006/01/06 -- 初版 [[技術的雑談]]へ戻る !!突っ込み {{comment}} [[技術的雑談]]へ戻る {{trackback}} [[技術的雑談]]へ戻る