goroutine はグリーンスレッドではない(『Go言語で学ぶ並行プログラミング』読書会1回目)
今日は「第1回『Go言語で学ぶ並行プログラミング』オンライン読書会」だった。
版元から PDF 版を購入した。 インプレス社って絶版でもないのにいつの間にか Kindle 版を引っ込めたりするそうで,デジタル版を買うなら PDF 版を買うのがオススメらしい。 まぁ,技術参考書は PDF 版のほうが取り回ししやすいからな。 紙はかさばるし。
事前にざっと斜め読みしたのだが,解説が丁寧という印象。 タイトル通り Go 言語を前提に書かれているが C/C++ や Java などの構文型のプログラミング言語に慣れているのなら難しくないと思う。
まずは1章から順に読むのがおすすめ。 「並行処理,完全に理解した」という人も復習のつもりで順に読んでいくのがいいだろう。
並行と並列
以前,読書感想文で『Go言語による並行処理』を大絶賛したのだが,その中の「2.1 並行性と並列性の違い」の中で
と書かれている。 『Go言語で学ぶ並行プログラミング』では更に具体的に
と書かれている。 たとえば
みたいな問題があったら
みたいに回答するのがいいだろうか(笑)
今回の読書会は第3章にかかった辺りまでだったが,今のところ『Go言語による並行処理』よりは『Go言語で学ぶ並行プログラミング』のほうがオススメな感じ。 まぁ,あとから出た本だからねぇ。
goroutine はグリーンスレッドではない
並行処理の仕組みとしてカーネルが用意している機能にはプロセスとスレッドがある。
各スレッドがどの CPU コアに割り当てられるかはカーネルが決定する。 このため上述のスレッドのことを特に「カーネルレベルスレッド」と呼ぶ。
カーネルレベルスレッドがあるということはユーザー空間で完全にアプリケーションが制御する「ユーザーレベルスレッド」もあるわけだ。
で, Go の goroutine はどれやねん? という話だが,実はカーネルレベルスレッドとユーザーレベルスレッドを組み合わせたハイブリッドな構成となっている。
これを「M:N スレッディングモデル」と呼ぶ。
一方で「グリーンスレッド」という言葉があるのだが,これは Java の用語らしい。
へー。 よその記事で goroutine をグリーンスレッドと書いてる気がするなぁ。 直すの面倒だし,過去記事は放置で,これから気をつけることにしよう。
ちなみに Java 21 からは Go に似たスレッドモデルが正式に導入されていて,これは「仮想スレッド(virtual thread)」と呼ぶそうな。
Go のメモリモデル
翻訳者で読書会の主催者である柴田芳樹さんが今回おっしゃっていたが(実は訳者あとがきでも言及されている),『Go言語で学ぶ並行プログラミング』にはメモリモデルについての解説がない。 並行処理とメモリ共有は密接な関係があるのでメモリモデルについても解説があればよかったのに,という感じ。
Go のメモリモデルについては公式のドキュメントがある。
このドキュメントの冒頭に
とか皮肉(?)な文章が書かれていて笑っちまったよ。
それはともかく,中身をちょろんと紹介すると,たとえば
var a string
func f() {
print(a)
}
func hello() {
a = "hello, world"
go f()
}
というコードがあったとき “hello, world
” と出力されることが保証されるというもの。
「当たり前やんけ!」と思うかもしれないが hello()
関数と f()
関数が異なる CPU コアで並列に実行される場合,この「保証」はかなり重要である。
マルチコアプロセッサでは(システムバスを通じて)メモリに直接アクセスするのではなく,メモリキャッシュを挟んだ間接的なアクセスになる。 この際に複数の CPU コアとメモリとの間にデータ競合が起きないよう「キャッシュ・コヒーレンシー・プロトコル(cache-coherency protocols)」が走るらしい。
このプロトコルが正しく働いて CPU レベルでのデータ競合が起きないことが保証できないと,並行処理下で「何も信用できない」ことになってしまう。
キャッシュ・コヒーレンシー・プロトコル周りの話を始めるとそれだけで本が書けるそうで,実際に紹介してもらったが,かなりの分量があって理解するのも大変とのこと。 たぶん『Go言語による並行処理』にメモリモデルの解説を入れると分量が1.5倍とか2倍とかになるんじゃないのかな(笑)
というわけで
次回以降の読書会も楽しみである。 記事にするかどうかは不明。
ブックマーク
参考図書
- Go言語で学ぶ並行プログラミング 他言語にも適用できる原則とベストプラクティス impress top gearシリーズ
- James Cutajar (著), 柴田 芳樹 (著)
- インプレス 2024-12-04 (Release 2024-12-04)
- Kindle版
- B0DNYMMBBQ (ASIN)
- 評価
読書会のために購入。インプレス社の本は Kindle 版より版元で PDF 版を買うのがオススメ。「並行処理」について原理的な解説から丁寧に書かれている。 Go で解説されているが Go 以外の言語でも応用できる。
- Go言語 100Tips ありがちなミスを把握し、実装を最適化する impress top gearシリーズ
- Teiva Harsanyi (著), 柴田 芳樹 (著)
- インプレス 2023-08-18 (Release 2023-08-18)
- Kindle版
- B0CFL1DK8Q (ASIN)
- 評価
版元で PDF 版を購入可能。事実上の Effective Go とも言える充実の内容。オリジナルは敢えてタイトルに “tips” という単語を入れるのを避けたのに邦題が「100 Tips」とかなっていて,原作者がお怒りとの噂(あくまで噂)
- Go言語による並行処理
- Katherine Cox-Buday (著), 山口 能迪 (翻訳)
- オライリージャパン 2018-10-26
- 単行本(ソフトカバー)
- 4873118468 (ASIN), 9784873118468 (EAN), 4873118468 (ISBN)
- 評価
- プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
- 丸善出版 2016-06-20
- 単行本(ソフトカバー)
- 4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN), 9784621300251 (ISBN)
- 評価
著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。
- へぇ~ボタン 懐かし玩具 リセットボタン
- ノーブランド品
- B0CX1NVW3F (ASIN)
へーへーへー