見出し画像

【備忘録】コンピューターアーキテクチャを理解しよう

ここでは、高校生でもイメージがつかみやすいように、CPU(中央演算処理装置)メモリ管理OS(オペレーティングシステム)ネットワークといった低レイヤーの仕組みを、専門用語を隠さず、ただし用語が出るたびにきちんと解説しながら説明します。さらに、これらの技術がお互いにどう結びついているのか(相互作用)も丁寧に描き出していきます。必要に応じて具体例を挙げるので、ぜひ一歩ずつ理解してみてください。



1. CPU(中央演算処理装置)の仕組みと周辺技術

1-1. CPUってそもそも何をするもの?

  • CPU(中央演算処理装置 / Central Processing Unit) は、コンピュータの頭脳にあたる部分です。

  • わたしたちがプログラム(例えばゲームやアプリ)を動かすとき、実際に「足し算」や「引き算」「条件分岐(もし〇〇なら…)」「メモリへの読み書き」などをこまかく実行しているのがCPUです。

(1) 命令セットアーキテクチャ (Instruction Set Architecture, ISA)

  • CPUが理解できる機械語のルールや命令のことを「命令セットアーキテクチャ」と呼びます。

    • 例としては、x86ARMRISC-V などがあります。

  • たとえば「メモリのある場所から数値を取り出して足す」などの命令が定義されており、プログラムはこのルールに則って書かれています。

(2) マイクロアーキテクチャ (Microarchitecture)

  • CPU内部をもっと詳しく見たときの設計や構造を指します。

    • 同じx86命令セットでも、IntelのCoreシリーズAMDのRyzenシリーズ は内部構造が異なります。

    • 具体的には「パイプライン」「分岐予測」「アウト・オブ・オーダー実行(順番を入れ替えて並列処理する技術)」など、メーカー独自の工夫がたくさん詰まっています。

(3) パイプライン (Pipeline)

  • CPUが命令を実行するとき、「取りに行く(フェッチ)→ 解読する(デコード)→ 実行する(エグゼキュート)」という一連の流れがあります。

  • パイプラインとは、この流れを同時並行で処理する仕組みです。

    • 具体例:洗濯物を「入れる→洗う→干す」を同時並行ですすめるイメージ(入れている最中に、前の洗濯物は洗われている…など)。

(4) CPUキャッシュ

  • キャッシュ は、高速なメモリ(※「メモリ」は後で説明します)をCPUの近くに置くことで、何度もアクセスするデータを素早く取り出せるようにする仕組みです。

    • L1キャッシュ、L2キャッシュ、L3キャッシュと、段階的に容量と速度が異なる階層があります。

■CPUとキャッシュの相互作用

  • CPUはプログラムの命令を実行するとき、大量のデータをメモリから読み書きします。

  • メモリが遠い(アクセスに時間がかかる)場合、CPUは待ち時間が発生してしまうため、手元のキャッシュにデータを置いて高速にアクセスするのです。


2. OS(オペレーティングシステム)とメモリ管理

2-1. OSの基本役割

  • OS(オペレーティングシステム) は、コンピュータ全体を管理する「管制塔」のような存在です。

  • 具体的には、

    1. ハードウェアの抽象化 (CPUやメモリ、ディスク、ネットワークを使いやすい形にまとめる)

    2. プロセス(アプリケーション)の実行管理

    3. システムの保護 (暴走したアプリが他を壊さないようにする)

(1) ユーザーモードとカーネルモード

  • CPUには「特権モード(カーネルモード、Ring0などとも呼ぶ)」と「一般モード(ユーザーモード、Ring3などとも呼ぶ)」があります。

  • OS(カーネル)が持つ特別な権限でハードウェアを直接操作し、アプリケーション(ユーザープログラム)は基本的に制限されたモードで動く、という仕組みをとることでシステムを保護しています。

2-2. メモリ管理 (Memory Management)

  • コンピュータのメインメモリ(RAM)は、プログラムが使う作業領域です。

  • 複数のプログラムが同時に動く場合でも、「自分のプログラム領域」と「ほかのプログラム領域」が混ざらないように管理する必要があります。

  • そこで登場するのが 仮想メモリ (Virtual Memory) という概念です。

(1) 仮想メモリ (Virtual Memory)

  • 仮想メモリ とは、実際の物理メモリ(例えば8GBや16GBのRAM)とは別に、プログラムに「広大で連続したメモリ空間」を見せかける仕組みです。

  • たとえばプログラムは「アドレス 0 から 4GB まで使える」というように見えますが、実際には8GBの中の一部しか使っていないかもしれません。OSが裏でうまく割り当てています。

(2) ページング (Paging) とページテーブル (Page Table)

  • 仮想メモリを実現する方法のひとつが「ページング」です。

    • メモリを「ページ」と呼ばれる小さなブロック(たとえば4KBごと)に分割します。

    • ページテーブル という「仮想アドレスから物理アドレスを対応づける地図」のようなものを持ち、CPUの中の MMU(メモリ管理ユニット) がそれを利用します。

  • CPUが「仮想アドレス 0x00123ABC にアクセスしたい」となったとき、ページテーブルを参照して「物理メモリのどこにあるか」を探しにいきます。

(3) スワップ (Swap)

  • プログラムが大量のメモリを必要とするとき、実際の物理メモリだけでは足りなくなることがあります。

  • その際、OSはデータの一部をディスク(HDDやSSD)に退避させ、足りない分を補います。これが「スワップ」です。

    • ただしディスクは物理メモリよりもアクセス速度が遅いため、多用すると処理が遅くなるデメリットがあります。

■OSとメモリ管理の相互作用

  • プログラムの動的メモリ要求(mallocやnewなど)に応じて、OSはページテーブルをセットしていきます。

  • CPUが命令を実行するたびに「どのページを使っているか」「キャッシュに載っているか」を確認し、OSは必要に応じてスワップやページテーブルの更新を行います。


3. プロセス・スレッド・スケジューリング

3-1. プロセス (Process) とスレッド (Thread)

  • プロセス は、OSから見た「プログラムが動いている単位」のこと。

    • ゲーム.exeを起動すると、「ゲームのプロセス」が1つ立ち上がるイメージ。

  • スレッド は、プロセスの中で細分化された「処理の流れ」の単位です。

    • 1つのプロセスが「メインスレッド」と「サブスレッド」といった複数のスレッドを持っている場合があります。

3-2. スケジューラ (Scheduler)

  • パソコン上では複数のプロセスが同時に動いていますが、CPUは基本的に「同時に実行できる数」に限りがあります(物理コア数や論理コア数)。

  • OSは「このプロセスに0.01秒間CPUを割り当てる、その次は別のプロセスを…」というように、少しずつCPUの実行権を切り替えています。

  • この切り替えを コンテキストスイッチ (Context Switch) といいます。

    • 切り替えのときはレジスタ内容やページテーブルも変更されます。

■OSスケジューラとCPUの相互作用

  • CPUのコア数が4つあれば、同時に4つのスレッドまでが物理的に並列動作できます。

  • それ以上にプロセスやスレッドが走っている場合は、OSスケジューラが「誰を今動かすか」をフェア(公平)に決めています。

  • Linuxには「CFS(Completely Fair Scheduler)」など、様々なアルゴリズムが存在します。


4. ネットワーク(TCP/IP)の仕組み

4-1. ネットワークの基本

  • ネットワークは、別のコンピュータ同士がデータをやり取りする仕組みの総称です。

  • OSI参照モデル という概念的な仕分けでは、物理層・データリンク層・ネットワーク層・トランスポート層・アプリケーション層など、7つに分けて考えます。

(1) TCP/IPプロトコルスタック

  • 実際のインターネットでは、TCP/IP というプロトコル群が使われています。

    • TCP (Transmission Control Protocol) は、通信相手と「コネクション(通信路)」を確立して、お互いにデータの送受信を確認しながら正確に届ける仕組み。

    • UDP (User Datagram Protocol) は、コネクションを作らずに、相手に向けてただデータを投げる仕組み。ゲームなどリアルタイム性重視の場面で使われます。

  • ネットワーク層では IP (Internet Protocol) が使われ、パケットを宛先IPアドレスへ送る経路を決めています。

(2) ポート番号

  • パソコンの中には同時にたくさんの通信が混在します。例えばWebブラウザとオンラインゲームが同時に動いているかもしれません。

  • ポート番号 によって、どのアプリにデータを渡すかを区別しています。

    • 例:HTTPはデフォルトで80番、HTTPSは443番など。

■ネットワークとOSの相互作用

  • 通信には必ず「ハードウェア」が関わります。具体的には「NIC(Network Interface Card)」、いわゆるLANポートやWi-Fiモジュールです。

  • プログラムが「データを送信したい!」というと、OSがTCP/IPスタックでパケットを作り、NICに渡して外部へ送ります。

  • 逆に外からパケットが届けば、NICが受け取り、そのデータをOSカーネルへ渡します。そこからソケットAPIを通じてアプリ(ユーザーモード)に渡されます。


5. 入出力 (I/O) と割り込み、DMA

5-1. 割り込み (Interrupt)

  • 割り込み とは、CPUが何かを処理している最中に「ちょっと待って、優先度の高いイベントが起きたから先に処理して!」と知らせる仕組みです。

  • 例としては、マウスのクリックや、ネットワークカードが「パケットを受信し終わったよ!」と知らせる場合などがあります。

  • 割り込みが発生すると、CPUは今の作業を中断して、割り込みハンドラ(OSに登録されている特別な処理ルーチン)を実行します。

5-2. DMA (Direct Memory Access)

  • DMA(ダイレクト・メモリ・アクセス) は、ネットワークカードやディスクコントローラなどのハードウェアが、自分でメモリにアクセスする仕組みです。

  • 普通、メモリにデータを読み書きするのはCPUの役目ですが、CPUがずっと動かなくてはいけないと、CPUの負荷が高くなります。

  • DMAを使うと、ハードウェアが必要なときにメモリへ直接書き込みや読み出しを行い、終わったらCPUへ割り込みをかけて「終わりましたよ」と知らせるだけでOKです。

■I/OとCPU・OSの相互作用

  • NICがDMAでパケットデータをメモリに置く → 割り込みが発生 → OSは受け取ったパケットを処理し、対応するアプリへ渡す。

  • この際、CPUもメモリ管理のためのページテーブルを参照しつつ、正しいアドレスにアクセスできるようにする。


6. ここまでのまとめ — 相互作用をイメージしよう

  1. CPU はプログラムの命令を高速に実行するため、パイプラインキャッシュ を使っている。

  2. OS は「プロセス/スレッドの切り替え」「仮想メモリでのページ管理」「割り込みハンドラ」の実装など、多面的に動く。

  3. メモリ管理 は、CPUのMMU(メモリ管理ユニット)とページテーブルによって、仮想アドレスから物理アドレスへマッピングし、セキュリティと安定性を保つ。

  4. ネットワーク は、TCP/IPスタックの実装をOSカーネルが担当し、NICハードウェアと割り込みやDMAを駆使してデータを送受信する。

  5. スケジューラ は、CPU時間を公平に分配する。ネットワークI/O待ちをしているプロセスは待ち状態になり、ほかのプロセスにCPUを渡せる。


7. もう少し踏み込むためのロードマップ(具体例つき)

  1. CPUアーキテクチャの理解

    • 「コンピュータの構成と設計(パターソン&ヘネシー)」という教科書を読むと、パイプラインや命令セットの考え方が体系的にわかります。

    • 具体例:Intelの公式マニュアルを見て、x86でどうやって割り込みベクタが管理されるかを調べる。

  2. OS内部を体験する

    • 「自作OS」を小さく書いてみたり、Linuxカーネル のソースコードを覗いてみると、割り込みハンドラやスケジューラがどう実装されているか分かります。

    • 具体例:QEMUというエミュレータを使うと、実機を壊さずにカーネルをいじりやすいです。

  3. メモリ管理と最適化

    • OSの教科書(「Operating System Concepts(ガルビン本)」など)や、Linuxの/proc/[PID]/mapsファイルを覗くと、プロセスがどのメモリ領域を使っているかを調べられます。

    • 具体例:C言語で大量の配列をアクセスするコードを書き、行アクセスと列アクセスで速度に違いが出る(キャッシュの使われ方が違う)ことを確認してみる。

  4. ネットワークの深掘り

    • 「TCP/IP Illustrated」という本や、実際にtcpdumpやWiresharkなどを使い、自分のPCに来るパケットを解析してみる。

    • 具体例:pingを打ってみて、ICMPというプロトコルがどんな風にやり取りされているかを可視化して学ぶ。

  5. セキュリティや大規模システムでの応用

    • メモリ保護機構(NXビットやASLRなど)を詳しく学ぶと、悪意あるプログラムからシステムを守る仕組みが見えてきます。

    • 具体例:DockerやKubernetes上でコンテナを大量に走らせると、ネットワーク仮想化や名前空間分離など、OSの機能をフル活用しているのがわかります。


8. 最終的なイメージ

  • CPU は、命令セットに従って膨大な命令をものすごい速さで実行するけれど、メモリアクセスが遅いときはキャッシュが助ける。

  • OS は、複数プログラムがCPUやメモリを正しく安全に使えるように「管制官」として調整する。

  • メモリ管理 は、各プログラムに仮想アドレス空間を用意することで互いの領域を保護しつつ、必要に応じてスワップやページ割り当てを行う。

  • ネットワーク は、OSのTCP/IPスタックがNICなどのハードウェアと協力し、割り込みやDMAでデータをやりとりする。

  • これらが連携することで、わたしたちが普段使っているコンピュータは、同時並行で多くの処理をこなし、インターネットにつながり、高速でアプリを動かすことができるのです。


まとめ

  • CPUOSメモリ管理ネットワーク は互いに独立した要素ではなく、それぞれが深いところで結びついています。

  • プログラムが動くたびに、

    • CPU が命令を解釈して実行し、

    • OS はどのプロセスにCPUを使わせるか決め、割り込みを処理し、

    • メモリ管理 はページテーブルで仮想アドレスを物理アドレスに変換し、

    • ネットワーク スタックはパケットを受け取ってアプリケーションに渡します。

  • 世界で通用するレベルの理解を目指すなら、これらの仕組みを「理論だけでなく、実際のコードや実機(あるいはエミュレータ)を触って確認する」ことが大切です。

  • このように、低レイヤーの知識をしっかり身につけると、上位レイヤーのAI技術やクラウド技術を使うときも「なぜこうなるのか?」がわかり、より強力なシステム設計やトラブルシュートができるようになります。ぜひ、ステップを踏んで学習を続けてみてください。

いいなと思ったら応援しよう!