プログラミング基礎概念

プロセス ぷろせす

プログラム実行スレッドメモリ空間OSマルチプロセスタスク管理
プロセスについて教えて

簡単に言うとこんな感じ!

プロセスは「実行中のプログラムの1インスタンス」のことだよ!レシピ(プログラム)を実際に料理している状態(プロセス)、って感じ。同じレシピで複数の鍋を同時に使えるように、同じプログラムを複数同時に動かすこともできるんだ!


プロセスとは

プロセス(Process) とは、OSが管理する「実行中のプログラムの単位」のことです。ファイルとして保存されているプログラム(実行ファイル)は、あくまで「命令書」にすぎません。それをOSが読み込んでCPUやメモリを割り当て、実際に動き出した状態がプロセスです。

プロセスには、プログラムのコードだけでなく、現在の実行状態(レジスタ値)割り当てられたメモリ領域開いているファイルの情報など、プログラムが動くために必要な一切がセットになっています。いわばプログラムに「魂を吹き込んだもの」です。

現代のOSでは、複数のプロセスが同時に動いています(マルチプロセス)。ブラウザを開きながらメール、音楽再生……これらはそれぞれ別のプロセスとして管理されており、OSがスケジューリングによってCPUの処理時間を公平に割り振ることで、見かけ上「同時に動いている」ように見せています。


プロセスの構造と状態

プロセスは、OSによって以下の要素を持つ実行単位として管理されます。

構成要素説明
PID(プロセスID)OSがプロセスを識別するための番号。ユニークに割り当てられる
メモリ空間コード領域・データ領域・スタック・ヒープなど、プロセス専用の仮想メモリ
プログラムカウンタ次に実行する命令の場所(CPUレジスタに格納)
ファイルディスクリプタ開いているファイルやネットワーク接続の情報
プロセス状態現在の動作フェーズ(下表参照)

プロセスの5つの状態

プロセスは生まれてから終わるまで、以下の状態を遷移します。

 ┌─────────┐   生成    ┌─────────┐  スケジュール  ┌─────────┐
 │  新規   │ ────────> │  準備   │ ─────────────> │  実行   │
 │ (New)  │           │ (Ready) │ <───────────── │(Running)│
 └─────────┘           └─────────┘  割り込み      └────┬────┘
                            ^                          │
                            │  イベント発生             │ I/O待ちなど
                            │                          v
                       ┌────┴────┐             ┌─────────────┐
                       │  終了   │ <────────── │   待機      │
                       │(Exit)   │  終了要求   │ (Waiting)   │
                       └─────────┘             └─────────────┘

覚え方:「新・準・実・待・終」

規作成 → 備完了 → 行中 → 機 → 了」と流れると覚えると、状態遷移が頭に入りやすいですよ!


歴史と背景

  • 1960年代:IBMのOS/360などで「ジョブ(job)」という概念が登場。バッチ処理が主流で、1度に1つのプログラムを順番に動かしていた
  • 1970年代:UNIXの登場により「プロセス」という概念が確立。fork()システムコールでプロセスを複製する仕組みが生まれ、マルチプロセスの基礎が整う
  • 1980年代:パーソナルコンピュータの普及。MS-DOSはシングルタスクだったが、MacOSやWindows(初期)がマルチタスクを目指し始める
  • 1990年代:Windows NTやLinuxが本格的なマルチプロセス・マルチタスクを実現。プロセス管理がOSの中核機能として確立
  • 2000年代以降:マルチコアCPUの普及で真の並列実行が可能に。プロセスをより軽量に扱うスレッドコンテナDockerなどのLinux名前空間)の技術が重要性を増す

プロセスとスレッドの違い

プロセスと混同しやすいのがスレッドです。スレッドは「プロセスの中でさらに分割できる実行単位」で、同じプロセス内ではメモリ空間を共有します。

プロセス A 専用メモリ空間(仮想アドレス) ファイルディスクリプタ スレッド 1 独自スタック スレッド 2 独自スタック ↑ メモリ・リソースを共有 プロセス B 専用メモリ空間(独立) ファイルディスクリプタ スレッド 1 独自スタック スレッド 2 独自スタック ↑ メモリ・リソースを共有 独立 プロセス間はメモリが完全に独立(IPC等を使って通信) スレッド間は同一プロセス内のメモリを共有(速いが競合に注意)
比較項目プロセススレッド
メモリ空間完全に独立プロセス内で共有
生成コスト重い(メモリ確保が必要)軽い
独立性・安全性高い(クラッシュが他に影響しにくい)低い(バグが全体に波及しやすい)
通信方法IPC(パイプ、ソケット等)共有メモリ(直接アクセス)
代表例Chromeの各タブ(マルチプロセス設計)Webサーバの同時リクエスト処理

コンテナとの関係

Dockerなどのコンテナ技術は、Linuxの「名前空間(namespace)」という機能を使って、プロセスの見える範囲を分離したものです。仮想マシンとは異なり、ホストOSのカーネルを共有しているため「軽量な仮想化」とも呼ばれます。本質的にはプロセスの分離技術の延長線上にあります。


関連する規格・RFC

規格・RFC番号内容
RFC 8194YANG モデルを使ったプロセス管理インタフェースの定義

関連用語