はじめに
インフラエンジニアにとって、CPUやメモリといったコンピュータの主要機能を正しく理解することは非常に重要です。しかし、日々の業務の中でそれらの仕組みに触れる機会は意外と少なく、仕組みを深く理解していない方も多いのではないでしょうか。
本記事では、CPUがどのようにメモリを使うのか、といったCPUの基本的な動作原理を初心者の方にもわかりやすく解説します。基本的な仕組みから丁寧に説明していますので、ぜひ最後までお読みいただき、日々のインフラ運用やトラブルシューティングにお役立てください。
CPUの動作原理
CPUの動作原理はシンプルで、フェッチ(Fetch)、デコード(Decode)、エグゼキュート(Execute)、ストア(Store)という3つの処理が基本となります。それに加えて、命令の内容によってはロード(Load)、ストア(Store)が実行されます。

- フェッチ(Fetch)
メモリ上に保存されている命令を参照します。 - デコード(Decode)
命令デコーダにて命令を解読します。 - エグゼキュート(Execute)
解読した命令を実行します。演算が必要な場合はALU(算術論理演算器)によって処理されます。 - ロード(Load)
メモリ上のデータを使う命令が実行された場合に、メモリ上のデータを読み込みます。 - ストア(Store)
メモリ上にデータを保存する命令が実行された場合、データをメモリに格納します。
CPU処理におけるメモリ利用
もう少し具体的にCPUの処理の流れを見ながら、メモリの使われ方を理解してみましょう。CPUは「メモリアドレス」と呼ばれる番号でメモリ上の位置を指定し、そこに格納された命令やデータを読み書きしながら処理を進めていきます。イメージをつかみやすくするために、ここでは「数値の足し算」を例に、メモリがどのように使われるのかを見ていきましょう。

まず、メモリに格納されているデータ「5」を汎用レジスタに読み込みます。
1. 命令の参照・読み込み(フェッチ)
CPUがメモリ上に保存されている命令を参照します。この際、CPUにおけるレジスタの一種であるPC(プログラムカウンタ)に保存されているメモリアドレスに対応する命令を参照する動作となります。本例では、アドレス「0x00000000」に対応する命令「READ X, 0x00001000」を参照して、CPU上の命令レジスタに読み込みます。命令レジスタに「READ X, 0x00001000」が格納されます。
2. 命令の解読(デコード)
命令デコーダにて命令の内容「READ X, 0x00001000」を解読し、命令を実行するための制御信号を生成します。
3. 命令の実行(エグゼキュート)
命令「READ X, 0x00001000」が実行され、汎用レジスタにデータ「5」が格納されます。(ロード)

同様に、メモリに格納されているデータ「10」を汎用レジスタに読み込みます。処理の流れは先ほどと同じです。
4. プログラムカウンタ更新
プログラムカウンタを「0x00000000」から「0x00000001」に更新します。
5. 命令の参照・読み込み(フェッチ)
本例では、アドレス「0x00000001」に対応する命令「READ Y, 0x00001001」を参照し、CPU上の命令レジスタに読み込みます。命令レジスタに「READ Y, 10 0x00001001」が格納されます。
6. 命令の解読(デコード)
命令デコーダにて命令の内容「READ Y, 10 0x00001001」を解読し、命令を実行するための制御信号を生成します。
7. 命令の実行(エグゼキュート)
命令「READ Y, 10 0x00001001」が実行され、汎用レジスタにデータ「10」が格納されます。

続いて、ALU(算術論理演算器)によって演算を行い、汎用レジスタに演算結果を格納します。
8. プログラムカウンタ更新
プログラムカウンタを「0x00000001」から「0x00000010」に更新します。
9. 命令の参照・読み込み(フェッチ)
本例では、アドレス「0x00000010」に対応する命令「ADD X, Y」を参照し、CPU上の命令レジスタに読み込みます。命令レジスタに「ADD X, Y」が格納されます。
10. 命令の解読(デコード)
命令デコーダにて命令の内容「ADD X, Y」を解読し、命令を実行するための制御信号を生成します。
11. 命令の実行(エグゼキュート)
命令「ADD X, Y」が実行されるとALUにて演算が実行され、演算汎用レジスタに演算結果「15」が格納されます。

最後に、演算した結果をメモリに書き込みます。
12. プログラムカウンタ更新
プログラムカウンタを「0x00000010」から「0x00000011」に更新します。
13. 命令の参照・読み込み(フェッチ)
本例では、アドレス「0x00000011」に対応する命令「WRITE 0x00001002, Z」を参照し、CPU上の命令レジスタに読み込みます。命令レジスタに「WRITE 0x00001002, Z」が格納されます。
14. 命令の解読(デコード)
命令デコーダにて命令の内容「WRITE 0x00001002, Z」を解読し、命令を実行するための制御信号を生成します。
15. 命令の実行(エグゼキュート)
命令「WRITE 0x00001002, Z」が実行されると、汎用レジスタに格納されていたデータがメモリ上に書き込まれます。(ストア)
まとめ
CPUの処理原理とメモリの使い方についての解説は以上となります。このような低レイヤの技術を理解することは、インフラエンジニアとして大きな成長につながります。気になった技術があれば、ぜひ自分でも調べて深掘りしてみてください。
他にもLinux関連の記事を記載していますので、興味がある方は読んでみて下さい。
【インフラエンジニア入門】Linuxのプロセス管理をわかりやすく解説|プロセスの生成および状態遷移
【インフラエンジニア入門】Linuxのプロセス管理をわかりやすく解説|リソース制限
【インフラエンジニア入門】Linuxのプロセス管理をわかりやすく解説|スケジューラ機能
参考文献





コメント