はじめに
Goの並行処理をイメージできるようになりたく、以前は「CPU・OS・スレッド・プロセス」の関係性を少し深掘りました。
https://qiita.com/TechCraft/items/7c72b0ff74901b64de4e
今日は、その知識を使って、Goの並行処理について少し深掘ります。
並行処理と並列処理の違い
まず、CPUにはコアがあり、コアがスレッドを処理する。
- 1つのコアで複数のスレッドを切り替えながら処理することを「並行処理」と呼ぶ。
- 複数のコアで複数のスレッドを物理的に同時に処理することを「並列処理」と呼ぶ。
Goの並行処理の特徴
Goでは、並行処理に特徴的な仕組みがある。
- 1つのOSスレッドの中で、複数の小さなタスク(goroutine)を動かす。
- goroutineの管理は、Goランタイムが行っている。
つまり、
1つのコア → 1つのOSスレッド → 複数のgoroutine
という構成で、タスクを効率よく並行処理している。
メリットは?
普通、OSスレッドを増やして並行処理をしようとすると、
- スレッド作成コストが重い(システムコール)
- スレッド切り替えコストも高い(カーネルスケジューリング)
という問題がある。
Goの設計では、
- OSスレッドの数を最小限に抑え
-
goroutineという軽量なタスクを大量に回す
ことで、
スレッド作成・切り替えコストを削減しながら、
超大量の並行処理を高速に行える仕組みになっている。
まとめ
- CPUコアはOSスレッドを実行する
- Goでは、OSスレッドの上でさらに複数のgoroutineをGoランタイムが管理している
- goroutineは非常に軽量なため、スレッドをたくさん作る必要がない
- スレッド作成・切り替えコストを削減しながら、効率的な並行処理を実現している
Goの並行処理を理解するためには、
「CPU→スレッド→goroutine」の三層構造を意識することが大切だと感じました。