スレッド すれっど
プロセスマルチスレッド並行処理並列処理同期デッドロック
スレッドについて教えて
簡単に言うとこんな感じ!
料理で言うと「手」みたいなもの! 1本の手(シングルスレッド)だとひとつの作業しかできないけど、両手(マルチスレッド)使えば音楽を聴きながら料理できるよね。プログラムの中で複数の処理を同時進行させる仕組み、それがスレッドなんだ!
スレッドとは
スレッド(Thread)とは、プログラムの実行単位のうち、最も小さい独立した処理の流れのことです。英語の「thread(糸)」が語源で、1本の処理の流れをひとすじの糸にたとえています。プログラムが動く大きな入れ物(プロセス)の中に、複数のスレッドが同時に走ることができます。
通常、ひとつのプログラムが起動するとひとつのスレッド(メインスレッド)が生まれます。しかし、動画のダウンロードをしながら再生もしたい、といった場面では1本の流れでは対応できません。そこで複数のスレッドを作り、それぞれ別の仕事を担当させる「マルチスレッド」という方式が使われます。
スレッドは同じプロセスのメモリを共有するため、プロセスを複数起動するよりも軽量・高速に並行処理を実現できます。その反面、複数のスレッドが同じデータを同時に書き換えようとする「競合状態(レースコンディション)」や、互いに相手の処理を待ち続ける「デッドロック」といった問題が起きやすく、設計の難しさも伴います。
スレッドの構造と種類
プロセスとスレッドの関係
| 単位 | たとえ | メモリ共有 | 切り替えコスト |
|---|---|---|---|
| プロセス | 工場(建物ごと独立) | ❌ 独立した空間 | 重い(コンテキストスイッチ大) |
| スレッド | 工場内の作業員 | ✅ 同じ工場を共有 | 軽い(コンテキストスイッチ小) |
スレッドの種類
| 種類 | 説明 | 主な使いどころ |
|---|---|---|
| ユーザースレッド | アプリ側で管理。OSに依存しない | Java, Python など |
| カーネルスレッド | OS(カーネル)が直接管理 | より細かいCPU制御が必要なとき |
| グリーンスレッド | OSとは別にランタイムが仮想的に管理 | Go のゴルーチン, Erlang など |
覚え方:「スレッドは糸、プロセスは布」
布(プロセス)は複数の糸(スレッド)で織られている。糸は布の素材(メモリ)を共有しながら、それぞれ独立した道筋を走る。
歴史と背景
- 1960年代 — IBMのOS/360で「タスク」という概念が登場。マルチプログラミング(複数プログラムの切り替え実行)が始まる
- 1980年代 — UNIXの普及とともに「プロセス」が主要な実行単位に。ただしプロセス生成コストが重い問題が明確化
- 1990年代初頭 — プロセスより軽量な実行単位として「スレッド」が注目。Pthreads(POSIX Threads)仕様が策定される(1995年)
- 1990年代後半 — Java(1995年)が言語レベルでマルチスレッドをサポート。開発者がスレッドを意識する時代に
- 2000年代 — マルチコアCPUの普及により、スレッドを使った真の並列処理が現実的になる
- 2010年代以降 — Go言語の「ゴルーチン」、JavaScript の「Web Workers」など、より扱いやすいスレッド代替技術が台頭
シングルスレッドとマルチスレッドの比較
シングルスレッドとマルチスレッドは、それぞれ向き不向きがあります。「とにかくマルチスレッドにすれば速い」は間違いで、設計コストやデバッグの難しさも考慮が必要です。
マルチスレッドを使う代表的なシーン
Webサーバー(例: Apache)
├── スレッド1 → ユーザーAのリクエストを処理
├── スレッド2 → ユーザーBのリクエストを処理
└── スレッド3 → ユーザーCのリクエストを処理
動画編集ソフト
├── スレッド1 → 映像のデコード
├── スレッド2 → エフェクト処理
└── スレッド3 → プレビュー表示
主要な同期・制御の仕組み
スレッドが増えると「同時に同じ場所を書き換えてしまう」問題が起きます。それを防ぐための仕組みが以下です。
| 仕組み | 読み方 | 役割 |
|---|---|---|
| ミューテックス(Mutex) | みゅーてっくす | 鍵をかけて1スレッドだけ通す。Mutual Exclusion の略 |
| セマフォ | せまふぉ | 同時に入れるスレッド数を制限する信号機 |
| ロック | ろっく | 特定リソースを占有する仕組みの総称 |
| アトミック操作 | あとみっくそうさ | 割り込み不可能な最小単位の操作 |
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| IEEE POSIX 1003.1c | Pthreads(POSIXスレッド)の標準仕様。C言語でのスレッドAPIを規定 |
関連用語
- プロセス — スレッドを格納するプログラムの実行単位。スレッドはプロセス内に存在する
- マルチスレッド — 複数のスレッドを同時に実行して並行処理を実現する技術
- 並行処理 — 複数の処理を交互・同時に進める考え方全般
- 並列処理 — 複数のCPUコアを使って文字通り同時に処理を実行すること
- デッドロック — 複数スレッドが互いにロック解放を待ち合い、永久に止まってしまう状態
- 非同期処理 — 処理の完了を待たず次に進む手法。シングルスレッドで並行性を得る代替手段
- コンテキストスイッチ — CPUが実行するスレッドを切り替える処理。頻繁すぎると性能低下の原因に
- ゴルーチン — Go言語独自の軽量スレッド。数千〜数万個を同時に生成できる