スレッドとは(全体像)
スレッドは、プロセスの中で実際に処理を進める担当者のこと。1つのプロセスの中に複数のスレッドを置けば、その中で複数の作業を同時並行で進められる。
身近にたとえると、会社(プロセス)と作業員(スレッド)だ。プロセスが「別フロアの会社」だとすると、スレッドは「同じ部屋にいる複数の作業員」。同じ部屋なので机や書類(メモリ)を共有でき、連携が速い。
押さえるのは、スレッドはプロセスよりずっと軽いということ。メモリを共有するので、切り替えのコストが小さく、起動も速い。「軽量プロセス」とも呼ばれる。
詳しく:プロセスとの違いとスレッドの種類だけ覚えれば戦える
ここが記事の心臓部。まずプロセスとスレッドを比べましょう。
プロセスとスレッドの違い
| 項目 | プロセス | スレッド |
|---|---|---|
| メモリ | 完全に独立 | 同じプロセス内で共有 |
| 切り替えコスト | 大きい | 小さい(軽い) |
| データのやり取り | 手間がかかる | 共有メモリで直接・速い |
プロセスはメモリが完全に独立しているので独立性が高い反面、切り替えが重い。スレッドは同じプロセスの中でメモリを共有するので、軽くて速い。「スレッド=プロセス」ではなく、スレッドはプロセスの中で動く軽い実行単位です。
次に、スレッドの種類。大きく2つあります。
ユーザスレッドとカーネルスレッド
| 種類 | 管理する人 | 特徴 |
|---|---|---|
| ユーザスレッド | ライブラリ | 切り替えは速いが、マルチコアを活かせない(並行のみ) |
| カーネルスレッド | OS | 本当の並列ができる(マルチコアを活かせる) |
ユーザスレッドはライブラリが管理するので切り替えは速いのですが、複数のCPUコアで同時に動かす「本当の並列」はできません。カーネルスレッドはOSが管理するので、マルチコアで本当に同時に動かせます。現代の主流はカーネルスレッド(1対1モデル、Linuxのpthreadなど)です。
ここで取り違えやすいのが「スレッドは必ず本当に同時に動く」という思い込み。ユーザスレッドは時間で区切って交代しているだけ(並行)で、本当の同時実行(並列)にはカーネルスレッドとマルチコアが必要です。
並行と並列の違い
| 言葉 | 意味 |
|---|---|
| 並行 | 時間で区切って交代し、同時に進んでいるように見せる |
| 並列 | 複数のCPUコアで本当に同時に動かす |
わかりやすく言い換えると
要するに、オフィスのたとえで覚えるとラクです。
①プロセスとスレッド … プロセスは別フロアの会社(独立)、スレッドは同じ部屋の作業員(机・書類を共有・軽い)
②ユーザ/カーネル … ユーザスレッドは切り替え速いが1コアだけ(並行)、カーネルスレッドはマルチコアで本当に同時(並列)
③並行と並列 … 並行は交代で見せる、並列は本当に同時
つまり、「スレッドは共有で軽い」「本当の並列にはカーネルスレッド」、この2点が試験の急所です。
試験のツボ
🔴 一番出る:プロセスとスレッドの違い
①プロセス = メモリが完全独立・切り替えが重い
②スレッド = 同じプロセス内でメモリを共有・軽い
🔴 次に出る:ユーザスレッドとカーネルスレッド
①ユーザスレッド = ライブラリ管理・切り替え速いがマルチコア不可(並行のみ)
②カーネルスレッド = OS管理・本当の並列ができる
🟡 押さえると安定:並行と並列
①並行 = 時間で区切って交代し、同時に見せる
②並列 = 複数のCPUコアで本当に同時に動かす
よくある間違い
①「スレッドとプロセスは同じもの」→ ✗ スレッドは同じプロセス内でメモリを共有する軽い実行単位。プロセスはメモリが独立。
②「すべてのスレッドは本当に同時に動く」→ ✗ ユーザスレッドは交代で見せる並行のみ。本当の並列にはカーネルスレッドとマルチコアが必要。
③「スレッドはプロセスより切り替えが重い」→ ✗ スレッドはメモリを共有するので切り替えは軽い。重いのはプロセス。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(プロセスとスレッド)
プロセスとスレッドに関する次の記述のうち、正しいものはどれか。
- スレッドはメモリが完全に独立し、プロセスより切り替えが重い実行単位とされているのだ
- スレッドは同じプロセス内でメモリを共有する軽い実行単位で、切り替えのコストが小さい
- スレッドもプロセスもまったく同じもので、メモリの持ち方や軽さに違いはないものとされる
- スレッドは紙に印刷する装置のことで、プログラムの実行とは無関係なものとされているのだ
解答は 2 ですよ。
スレッドは同じプロセス内でメモリを共有する軽い実行単位で、切り替えのコストが小さいですね。「軽量プロセス」とも呼ばれます。
選択肢1の「メモリが独立で重い」、選択肢3の「同じもの」、選択肢4の「印刷する装置」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | スレッドはメモリ共有で軽い |
| 2 | ✓ | メモリ共有・切り替えが軽い |
| 3 | ✗ | メモリの持ち方も軽さも違う |
| 4 | ✗ | 印刷する装置ではない |
オリジナル問題2(ユーザとカーネル)
ユーザスレッドとカーネルスレッドに関する次の記述のうち、正しいものはどれか。
- ユーザスレッドはOSが管理して本当の並列ができ、カーネルスレッドは並行しかできないとされる
- ユーザスレッドもカーネルスレッドもまったく同じで、並列できるかに違いはないものとされる
- ユーザスレッドはライブラリ管理で並行のみ、カーネルスレッドはOS管理で本当の並列ができる
- ユーザスレッドもカーネルスレッドもハードウェアの一種で、ソフトとは無関係なものとされる
解答は 3 ですよ。
ユーザスレッドはライブラリ管理で並行のみ、カーネルスレッドはOS管理で本当の並列ができるですね。現代の主流はカーネルスレッドです。
選択肢1のユーザとカーネルが逆、選択肢2の「同じ」、選択肢4の「ハードウェア」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | ユーザとカーネルの説明が逆 |
| 2 | ✗ | 並列できるかが違う |
| 3 | ✓ | ユーザは並行のみ・カーネルは並列可 |
| 4 | ✗ | ソフトウェアの概念 |
オリジナル問題3(並行と並列)
並行と並列に関する次の記述のうち、正しいものはどれか。
- 並行は時間で区切って交代して見せ、並列は複数CPUコアで本当に同時に動かすことを指す
- 並行も並列もまったく同じ意味で、同時に動かすかどうかに違いはないものとされているのだ
- 並行は複数コアで本当に同時に動かし、並列は交代で見せるだけの方式とされているものだ
- 並行も並列も紙に印刷する手順のことで、プログラムの実行とは無関係なものとされている
解答は 1 ですよ。
並行は時間で区切って交代して見せ、並列は複数コアで本当に同時に動かすことを指しますね。ユーザスレッドは並行のみ、カーネルスレッドは並列も可能です。
選択肢2の「同じ意味」、選択肢3の並行と並列が逆、選択肢4の「印刷する手順」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | 並行は交代・並列は本当に同時 |
| 2 | ✗ | 同時に動かすかが違う |
| 3 | ✗ | 並行と並列の説明が逆 |
| 4 | ✗ | 印刷する手順ではない |
まとめ
押さえどころ
- 🔴 プロセスとスレッド = プロセスはメモリ独立で重い、スレッドは同じプロセス内でメモリを共有して軽い。
- 🔴 ユーザとカーネル = ユーザスレッドは並行のみ(マルチコア不可)、カーネルスレッドは本当の並列ができる。
- 🟡 並行と並列 = 並行は交代で見せる、並列は複数コアで本当に同時。
次に学ぶ
執筆: SikakuQuest編集部