このページでは、CISCとRISC、CPUの中の部品と命令実行の流れ、アドレス指定方式の計算、ビッグエンディアンとリトルエンディアン、割込みの種類がわかります。
- 一言で言うと:
- CPUの中身と動き方の話。CPUの種類、命令の作り方(CISCとRISC)、命令を実行する手順、データの場所の指し方、データの並べ方、割込みまで。
CPUの種類 → 中の部品と動き → データの場所を指す(アドレス計算)→ データの並べ方(バイト順序)→ 途中で割り込む(割込み制御)
覚え方の軸
- 命令セットは「複雑で少ない手間(CISC)」か「単純で速い(RISC)」か:
- CISCはマイクロプログラム、RISCはワイヤードロジック。パイプライン向きなのはRISC
- 命令の実行は5つのステージ:
- 命令フェッチ → 命令解読 → オペランドのアドレス計算 → オペランドフェッチ → 実行
- アドレス指定方式は「有効アドレス=何+何か」で区別する:
- そのまま(直接)、2回たどる(間接)、データそのもの(即値)、基準+インデックス、ベース+差分、PC+変位(相対)
- バイト順序は「どっちの端から置くか」:
- 上位から(ビッグ)、下位から(リトル)。ネットワークはビッグ
- 割込みは「CPUの中(内部)」か「外(外部)」かで分ける:
- 内部はプログラムのせい(不正処理、SVC、ページフォールト)、外部は外の出来事(タイマ、コンソール、入出力、機械チェック)
プロセッサの種類と方式:CPUの種類と命令の作り方
- プロセッサ:
- 「命令を解釈し実行する処理装置」の総称。データや命令を処理する機能単位。厳密には「プロセッサ=CPU」ではないが、一般にはCPUと同じと考えてよい
- CPU(Central Processing Unit:中央処理装置):
- データの演算・変換・転送、命令の実行、他の装置の制御などを担う、コンピュータの中心的な処理装置
| 種類 | ざっくり |
|---|---|
| MPU(Micro Processing Unit) | CPUの機能を1つのLSIに実装したもの。マイクロプロセッサともいう |
| マルチコアプロセッサ | 1つのプロセッサの中に複数のCPUコアを実装。それぞれが同時に別の処理をして、消費電力を抑えながら全体の性能を上げる |
| DSP(Digital Signal Processor) | デジタル信号処理に特化したマイクロプロセッサ。音声や画像の計算に使う。積和演算の繰返しを高速に実行でき、必要な信号成分だけを取り出すデジタルフィルタを効率よく作れる |
| GPU(Graphics Processing Unit) | 3次元グラフィックスの画像処理などを、CPUの代わりに高速に行う演算装置 |
| FPU(Floating Point Unit) | 浮動小数点演算を専門に行う演算装置(浮動小数点演算処理装置) |
- ホモジニアスマルチコアプロセッサ:
- 同じタイプのCPUコアを多数載せたもの
- ヘテロジニアスマルチコアプロセッサ:
- 違うタイプのCPUコアを複数載せたもの(ヘテロジニアス=異種混合)
- 積和演算:
- 掛け算の結果を順に足していく処理。「S ← S + A × B」
- デジタル信号処理システムの流れ:
- アナログ入力 → A/D変換 → DSP処理 → D/A変換 → アナログ出力
- 命令セットアーキテクチャ:
- 設計の方向性で、CISCとRISCの2つに大きく分かれる
- CISC(Complex Instruction Set Computer:複合命令セットコンピュータ):
- 1つの機械語命令に高度な処理をさせて、処理効率を上げる方式。複雑で高機能な命令を多数持つ
- 命令が複雑なので、論理回路だけで実行するとハードウェアが複雑になる → ふつうはマイクロ命令を組み合わせたマイクロプログラムで処理する
- 短所:
- ハードウェアだけで実行するより遅い。命令ごとの実行時間の差が大きく、パイプラインに不向き
- マイクロプログラム:
- ハードウェアとソフトウェアの境界にあり、ファームウェアと呼ばれる。ワイヤードロジックより機能の追加が簡単
- RISC(Reduced Instruction Set Computer:縮小命令セットコンピュータ):
- CISCの欠点を改善するために作られた。命令の数や種類を減らし、各命令を単純にして(ハードウェアを簡素化して)、速さと効率を上げる
- 最大の特徴:
- 命令長を固定して効率よくパイプライン処理すること、ロードストアアーキテクチャで命令セットを単純にすること
- 命令はワイヤードロジック(結線論理)で実行する
- ロードストアアーキテクチャ:
- レジスタと主記憶の間のデータ転送はロード命令/ストア命令だけで行い、演算命令はレジスタ間だけで行う方式。パイプライン処理との相性がとても良い
- ワイヤードロジック(結線論理):
- 論理回路を組み合わせて必要な処理を実現すること
- RISC-V(リスクファイブ):
- RISCの原則に基づく、オープン標準の命令セットアーキテクチャ。命令を自由に追加でき、ライセンス料や契約が不要なので、安くCPUを開発できる
| CISC | RISC | |
|---|---|---|
| 命令 | 複雑で高機能な命令が多い | 単純な少数の命令だけ |
| 命令長 | 長く、命令ごとに違う | 短く、固定 |
| 実行のしかた | マイクロプログラム | ワイヤードロジック |
| 長所 | 高機能な命令を作れる | 各命令の実行時間がほぼ一定なのでパイプライン向き(高速化しやすい) |
| 短所 | パイプラインに不向き | 1命令では単純な処理しかできない |
プロセッサの構成と動作:CPUの中の部品と命令の実行手順
- CPUの構成:
- 制御装置、演算装置、各種のレジスタ
- 制御装置:
- 主記憶にあるプログラムの命令を1つずつ読み出して解読し、演算装置などに指示を出す
- 手順:
- 命令アドレスレジスタ(PC)が指すアドレスの命令を読み出す → 命令レジスタに入れる → 命令デコーダで解読 → 解読した機能に対応する処理を指示する
- 命令デコーダ:
- 命令解読器、復号器ともいう
- 演算装置:
- 算術論理演算装置(ALU:Arithmetic and Logic Unit)ともいう。算術演算、論理演算、比較、分岐などを行う
- レジスタ:
- CPUの中にある、少量で高速な記憶装置
| レジスタ | 役割 |
|---|---|
| 命令アドレスレジスタ | 次に読み出す命令のアドレスを持つ。読み出すと自動的に+1される。分岐命令を実行したら分岐先のアドレスに書き換わる |
| 命令レジスタ(IR) | 主記憶から読み出した命令を入れる |
| 汎用レジスタ(GR) | データの一時保管や演算結果の格納など、いろいろな用途に使う。ベースレジスタやインデックスレジスタに使うこともある |
| アキュムレータ | 演算データを記憶し、演算後にその内容を演算結果で置き換えられる。演算結果の保持に使う。累算器ともいう |
| フラグレジスタ | 演算結果の情報(正、負、ゼロ、桁上げやオーバフローの有無)をビット単位で入れる。ステータスレジスタともいう |
| ベースレジスタ | プログラムの先頭番地を持つ。基底レジスタともいう |
| インデックスレジスタ | アドレス修飾に使う。指標レジスタともいう |
| スタックポインタ(SP) | スタック領域の先頭アドレスを持つ |
| シフトレジスタ | 桁送りをするレジスタ。複数のFFをつないだ回路で、各FFの内容を隣のFFにずらしていく |
- 命令アドレスレジスタの別名:
- プログラムカウンタ(PC)、プログラムレジスタ、命令カウンタ、逐次制御カウンタ
- プログラムのロード:
- CPUがプログラムを実行するには、補助記憶装置から主記憶に読み込む必要がある
- 手順:
- 主記憶に領域を確保 → プログラムをロード → 「どこに読み込んだか、どこから実行するか」などの情報をレジスタに入れる → 実行を開始する
- 命令実行の5つのステージ(★順番ごと覚える)
- 命令フェッチ(命令読出し):
- PCが指すアドレスの命令を、命令レジスタに読み出す
- 命令解読:
- 読み出した命令を命令デコーダで解読する
- オペランドのアドレス計算:
- 処理するデータ(オペランド)のアドレスを計算する
- オペランドフェッチ:
- 計算したアドレスからデータを汎用レジスタに読み出す
- 実行:
- 命令を実行する
- 1つの命令実行サイクルが終わると、PCが指す次の命令を読み出し、新しいサイクルに移る
- 命令フェッチ(命令読出し):
- ストアドプログラム方式:
- 主記憶に入れたプログラムを、CPUが順に読み出しながら実行する方式。ノイマン型ともいう
- フォンノイマンボトルネック:
- ストアドプログラム方式で、CPUと主記憶の間のデータ転送能力がコンピュータの性能向上を妨げること
オペランドのアドレス計算:データの場所の指し方
- CPUが命令を実行するには、必要なデータが主記憶のどこにあるか(アドレス)を、CPUが解釈できる形で正しく伝える必要がある
- 命令の構成:
- 命令部(命令や演算を指示する)+ アドレス部(オペランド部)(処理対象の主記憶上のアドレスや、アドレス修飾に使うレジスタを指定する)
- アドレス部の数による分類:
- 0アドレス方式〜3アドレス方式の4つ。アドレス部を持たない0アドレス方式は、スタックポインタを使って演算する旧方式
- 有効アドレス:
- 実際にアクセスする主記憶上のアドレス。命令を解読すると、アドレス部のレジスタやアドレスから計算される
- アドレス指定:
- レジスタとアドレスで、有効アドレスをどう計算するかの指定
- アドレス修飾:
- アドレス部で指定したアドレスを、レジスタの値で修飾(変更)すること
- 直接アドレス指定方式の問題:
- アドレスをコンパイルの段階で決める必要があるので、主記憶上の読込み位置を固定しなければならない。その場所が使用中なら、空くまで待つことになる
- 再配置可能(リロケータブル):
- どのアドレスに置いてもプログラムを実行できること。そのためにベースアドレス指定方式などが考えられた
| 方式 | アドレス部に入っているもの | 有効アドレス |
|---|---|---|
| 即値アドレス指定方式 | 対象データそのもの | (主記憶を見に行かない) |
| 直接アドレス指定方式(絶対アドレス指定方式) | 対象データがある主記憶上のアドレス | アドレス部の値 |
| 間接アドレス指定方式 | 「対象データのアドレス」が入っている場所のアドレス | アドレス部が指す場所の中身(2回たどる) |
| インデックスアドレス指定方式(指標アドレス指定方式) | インデックスレジスタ番号と基準アドレス | 基準アドレス + インデックスレジスタの内容 |
| ベースアドレス指定方式(基底アドレス指定方式) | ベースレジスタ番号と、プログラムの先頭からの差分値 | ベースレジスタの内容 + 差分値 |
| 相対アドレス指定方式 | プログラムカウンタからの変位 | プログラムカウンタの値 + 変位値 |
- インデックスアドレス指定の使いどころ:
- インデックスレジスタに基準アドレスからの増減値を入れれば、アドレス部を変えずに、配列などの連続したアドレスを順に参照できる
- ベースアドレス指定:
- ベースレジスタには、再配置可能プログラムを主記憶に置いたときの先頭アドレスがOSによって設定される
- 例:
- 直接:
- アドレス部が400 → 400番地のデータを使う
- 間接:
- アドレス部が50、50番地の中身が80 → 80番地のデータを使う
- インデックス:
- アドレス部の基準アドレスが300、インデックスレジスタの内容が5 → 300+5=305番地
- 相対:
- PCの値が200、変位が+16 → 200+16=216番地
- 直接:
主記憶上のデータのバイト順序:データの並べ方
- 2バイト以上のデータを主記憶に置くとき、どちらを最上位バイト、どちらを最下位バイトとするかは、コンピュータのアーキテクチャによって違う
- バイト順序(バイトオーダ):
- 最上位と最下位、どちらのバイトから順に置くか。ビッグエンディアンとリトルエンディアンの2つ
- ビッグエンディアン(big endian):
- 最上位バイトから順に置く(人間が読む順と同じ)
- リトルエンディアン(little endian):
- 最下位バイトから順に置く
- 例:
- 5678(16)を2000番地から置く
- ビッグ:
- 2000番地=56、2001番地=78
- リトル:
- 2000番地=78、2001番地=56
- ビッグ:
- 89ABCDEF(16)の場合
- ビッグ:
- 89 AB CD EF
- リトル:
- EF CD AB 89(バイト単位で逆。「FE DC BA 98」ではない点に注意)
- ビッグ:
- 5678(16)を2000番地から置く
- ふだんのプログラムではあまり気にしなくてよいが、バイト順序が違うコンピュータ間でデータをやり取りするネットワークプログラムではとても重要
- ネットワークバイトオーダ:
- TCP/IPではビッグエンディアンと決まっている。ホストのバイトオーダからネットワークバイトオーダへの変換が必要になる
ウォッチドッグタイマ
- ウォッチドッグタイマ:
- ハードウェアタイマの一種。システムの異常や暴走など、予期しない動作を見つけるための時間計測の仕組み
- 動き方:
- 最初にセットした値から一定間隔でタイマ値を減らす → 0(タイムアップ)になったらノンマスカブル割込みを発生させ、例外処理ルーチンを実行する → ふつうはシステムをリセットまたは終了させる
- 使い方:
- 正常なプログラムは、タイマが0になる前にタイマをリセット(初期値でクリア)する。無限ループなどでリセットされなければ0になるので、そのとき異常とみなす(番犬に定期的にエサをやらないと吠える、のイメージ)
割込み制御:途中で割り込む仕組み
- 割込み(Interrupt):
- プログラムの実行中に何かの原因で、実行中のプログラムを一時中断し、その原因に応じた処理を行うこと
- 割込み処理ルーチン(割込みハンドラ):
- 割込み信号を受けたことをきっかけに起動されるプログラム
- マルチタスク:
- 見かけ上、複数のプログラムが同時に動いているように見せる処理形式
- CPUの中では同時に1つの処理しかできない。処理時間を細かく分けて交互に実行するので、同時に動いているように見える
- 割込みの仕組み:
- 機械の故障など緊急の作業があると、順番を待たずに割り込んで最優先で処理する
- 割込み処理のあとで元のプログラムをすぐ再開できるように、実行に必要な情報を持つPSW(Program Status Word:プログラム状態語)をスタックに退避しておく
- 流れ:
- プログラムAを実行中 → 割込み発生 → AのPSWを保存して中断 → 割込み処理 → PSWを読み込み直してAを再開
- 再開に必要な情報(PSWなど)を退避するには、ハードウェアの仕組みが必要
- 多重割込み:
- 割込みが同時に起きたり、割込み処理中に別の割込みが起きたりすること。優先順位をつけ、優先度の高いものから処理する
- マスカブル割込み:
- 発生をマスク(抑制)できる割込み。マスクされた割込みは、マスクが解除された時点で原因が残っていれば発生する
- ノンマスカブル割込み:
- マスクできない割込み
- 内部割込み(CPU内部の原因で起きる)
| 種類 | いつ起きる? |
|---|---|
| プログラム割込み | 0での除算、オーバフロー、記憶保護例外など、不正な処理をしたとき |
| SVC割込み(スーパバイザコール割込み) | カーネルに処理を頼むとき。入出力命令など、一般のプログラムからは制御できないOSの重要な機能を使いたいとき |
| ページフォールト | 主記憶上にないページにアクセスしたとき。補助記憶装置から実体を読み込まないと続けられないので、割込み処理で主記憶に読み込む |
- 外部割込み(CPU外部の原因で起きる)
| 種類 | いつ起きる? |
|---|---|
| タイマ割込み | プログラムに割り当てた所定時間が終わったとき。マルチタスクで使う |
| コンソール割込み | 操作員が手動で行う |
| 入出力割込み | キーボードなどの入力装置の操作や、ディスク装置からの読込みの終了に伴って起きる |
| 機械チェック割込み | ハードウェアに障害が起きたとき。優先順位が最も高い |
- 割込みコントローラ:
- CPUとデバイスの間を中継する、割込み専用の装置。CPUが直接デバイスの割込み処理をすると待ち時間がとても長くなるので置く
混同しやすいペア
- CISC(複雑な命令、可変長、マイクロプログラム)/RISC(単純な命令、固定長、ワイヤードロジック、パイプライン向き)
- ホモジニアス(同じタイプのコア)/ヘテロジニアス(違うタイプのコア)
- GPU(画像処理)/FPU(浮動小数点演算)/DSP(信号処理、積和演算)
- 命令アドレスレジスタ(PC)(次の命令のアドレス)/命令レジスタ(読み出した命令そのもの)
- アキュムレータ(演算結果で置き換わる)/フラグレジスタ(正・負・ゼロ・桁上げなどの状態)
- ベースレジスタ(プログラムの先頭番地)/インデックスレジスタ(アドレス修飾、配列の増減値)
- 即値(データそのもの)/直接(データのアドレス)/間接(アドレスのアドレス)
- ベースアドレス指定(ベースレジスタ+差分。再配置可能)/相対アドレス指定(PC+変位)
- ビッグエンディアン(上位から。ネットワーク)/リトルエンディアン(下位から)
- 内部割込み(プログラム割込み、SVC、ページフォールト)/外部割込み(タイマ、コンソール、入出力、機械チェック)
- SVC割込み(自分からOSに頼む)/プログラム割込み(不正な処理で起きる)
- マスカブル(抑制できる)/ノンマスカブル(抑制できない。ウォッチドッグタイマが使う)