プロセスとスレッド
プロセスとは
プロセスは、実行中のプログラムそのものを指す単位です。エディタを開けば1つ、ブラウザを開けばまた1つ、というように、プログラムを起動するたびに OS がプロセスを作ります。
各プロセスには OS から独立したメモリ空間が割り当てられます。プロセス同士は互いのメモリを直接触れないため、あるプログラムが暴走しても他のプログラムを巻き込みにくい — これが [[OSの基礎]] で学ぶ保護の仕組みです。
スレッドとは
スレッドは、プロセスの中で実際に処理を進める実行の流れです。1つのプロセスは1本以上のスレッドを持ち、複数のスレッドを持てば同じメモリ空間を共有しながら並行して処理を進められます。
| プロセス | スレッド | |
|---|---|---|
| メモリ空間 | プロセスごとに独立 | 同じプロセス内で共有 |
| 生成・切り替えのコスト | 重い | 軽い |
| 片方の異常の影響 | 他プロセスに波及しにくい | 同じプロセスの全スレッドが道連れ |
| データの受け渡し | プロセス間通信が必要で手間 | 共有メモリで簡単(ただし競合に注意) |
「工場(プロセス)の中で複数の作業員(スレッド)が同じ倉庫(メモリ)を使って働く」とイメージすると分かりやすいでしょう。共有は便利な反面、同じデータを同時に触って壊す競合状態のリスクがあり、その制御は [[並行処理と非同期]] の主題になります。
実務・運用での関わり
- [[Linux]] では
psやtopコマンドで動作中のプロセスを一覧できる。各プロセスにはPID(プロセスID)という番号が振られる - 暴走したプロセスは
kill PIDで終了させる — 運用の基本操作 - サーバーの常駐サービスの実体もプロセスで、[[systemdとサービス管理]] が起動・監視を担う
- Web サーバーには「接続ごとにプロセスを分ける方式」「スレッドでさばく方式」などがあり、性能特性の違いにつながる([[Nginx]] は接続ごとにプロセスを増やさないイベント駆動型)
ps aux | grep nginx # nginx のプロセスを探す
top # CPU・メモリ使用量をプロセス単位で監視
kill 12345 # PID 12345 のプロセスに終了を要求
初学者向けポイント
- 「アプリが固まった」ときにタスクマネージャで終了させる対象がプロセス
- マルチコア CPU の性能を活かすには、複数のプロセスまたはスレッドで処理を分ける必要がある
- まず「メモリを分けるのがプロセス、共有するのがスレッド」の一文を軸に、コストと安全性のトレードオフとして整理する
関連技術とのつながり
- [[OSの基礎]] — プロセス管理は OS の中心的な仕事
- [[並行処理と非同期]] — スレッドの共有メモリと競合の制御を扱う開発側のテーマ
- [[Linux]] — ps・top・kill によるプロセス操作は運用の基本
- [[systemdとサービス管理]] — サービスとして動くプロセスの起動・監視を担う
Q: プロセスとスレッドの違いとして正しいのはどれ?
- [x] プロセスは独立したメモリ空間を持ち、スレッドは同じプロセス内でメモリを共有する
- [ ] スレッドは独立したメモリ空間を持ち、プロセスはメモリを共有する
- [ ] 両者に違いはなく呼び方が異なるだけ
解説: メモリを分けるのがプロセス、共有するのがスレッドです。この違いがコストと安全性のトレードオフを生みます。
Q: スレッドでメモリを共有することのリスクとして本文で挙げられているのはどれ?
- [ ] メモリの読み書きが極端に遅くなる
- [x] 同じデータを同時に触って壊す競合状態が起きうる
- [ ] 他のプロセスのメモリまで自由に書き換えてしまう
解説: 共有メモリは受け渡しが簡単な反面、同時アクセスによる競合状態のリスクがあります。
Q: Linux で動作中のプロセスを一覧するコマンドはどれ?
- [ ] chmod
- [ ] apt
- [x] ps
解説: ps(や top)でプロセスを一覧・監視できます。chmod は権限変更、apt はパッケージ管理のコマンドです。