ISBN 9784873119595
並行プログラミング入門 : Rust、C、アセンブリによる実装からのアプローチ
- 著者
- 高野祐輝
- 出版社
- オライリー・ジャパン
- 刊行
- 2021-08
概要
RustとCで並行プログラミングを実装から理解する
想定読者
システムプログラミングの基礎を持ち、並行処理の内部動作をコードレベルで把握したいエンジニア
こんな人には向いていない
- プログラミング入門段階の学習者。RustまたはCのコードを読む最低限の素地と、OSのプロセス・スレッド概念の理解を前提としており、その下地がない状態では理論説明が抽象的に感じられる
- 並行処理のAPIを使えるようになれば十分で、アトミック命令やコンテキストスイッチの内部実装まで踏み込む必要のない開発者。実装コードとアセンブリが中心であり、ハイレベルなAPIの使い方は別書が適切
- アーキテクチャ設計やシステム設計の判断軸を学びたい人。本書は低レイヤの理論と実装に特化しており、設計パターンや運用観点のカバレッジは薄い
この本で身につくこと
- CPUのアトミック命令(CAS・fetch-and-add等)の仕組みをRust/Cで直接実装し、ロックフリー構造の原理を説明できる
- アセンブリを用いてグリーンスレッドをゼロから構築し、コンテキストスイッチがレジスタレベルでどう動くかを理解できる
- ミューテックス・セマフォなどの同期プリミティブを自前で実装し、デッドロックの発生条件を制御できる
- アクターモデルおよびソフトウェア・トランザクショナルメモリの設計思想と実装上のトレードオフを比較して選択できる
- async/awaitの非同期ランタイムが内部でどのようにタスクをスケジューリングしているかを実装ベースで把握できる
ハイライト(外部からの言及)
CPUのアトミック命令、グリーンスレッド、アクターモデル、ソフトウェア・トランザクショナルメモリ、async/awaitなど、並行プログラミングに関する理論的な背景から実装までを網羅的に扱います。 — 出典
本書がカバーする実装トピックの射程が端的に示されており、学習コストと得られる知識の範囲を判断しやすい
章立て
第1章 並行性と並列性
Concurrency vs Parallelism の概念整理。本書全体の前提
第2章 プログラミングの基本
Rust / C / アセンブリの基礎。後続章は 3 言語並行で実装する
第3章 同期処理1
Mutex / Semaphore / 条件変数。並行性の最低限の道具
第4章 並行プログラミング特有のバグと問題点
デッドロック / ライブロック / メモリオーダリング。本書の警鐘的な章
第5章 非同期プログラミング
Future / async-await の理論的背景
第6章 マルチタスク
プリエンプティブ vs 協調的スケジューリング
第7章 同期処理2
ロックフリーアルゴリズム / Atomic 操作。第 4 章を踏まえた高度な解
第8章 並行計算モデル
アクター / CSP / STM。本書の到達点
学習のヒント
- 最も難易度が高いのはアセンブリを用いたグリーンスレッド実装の章。まずRust/Cのコードを動かして概念を掴んでからアセンブリ実装に進むと詰まりにくい
- GitHub上のソースコードを手元でビルド・実行しながら読むことが想定された設計になっている。理論章だけ読み流すと概念の定着が薄くなるため、一章ごとにコードを動かす習慣をつける
- アトミック命令の章はx86のメモリモデル(ストアバッファ・キャッシュコヒーレンシ)の基礎知識で理解度が大きく変わる。難しく感じた場合はCPUアーキテクチャの入門書で下地を整えてから戻ると効率が良い
- async/awaitの章は他章と独立性が高い。非同期処理のランタイムを優先的に理解したい場合は先に進んでも支障が少ない
前提知識
- RustまたはCの基本文法(Rustは所有権・借用の概念程度まで)
- OSのプロセス・スレッド・メモリ管理に関する基礎概念
- スタックとヒープの違いなど、メモリ配置の基本的な理解
- 二進数・ビット演算の基礎(アトミック命令の理解に必要)
次に読む本
プログラミングRust 第2版
本書はRustの並行プリミティブをアセンブリレベルから自作実装で理解することに特化しているのに対し、プログラミングRust第2版はSend/Sync・Arc・Mutexを実務のアプリケーション設計文脈で体系的に扱う。低レイヤの原理理解を踏まえた上で読むと、設計判断の根拠が言語化しやすくなる
詳解Linuxカーネル
本書では協調スケジューリングとコンテキストスイッチをRust/アセンブリで自作実装するが、詳解Linuxカーネルはその同じ仕組みをLinuxカーネルがどう実現しているかを詳述する。自作実装とカーネル実装を対比することで、設計上の妥協点と本番OSの最適化の差分を具体的に把握できる
Rustで始めるネットワークプログラミング
本書のasync/await章ではFutureとタスクスケジューラの内部実装を解説するが、その理論を実際のTCP/UDPサーバー実装に落とし込む段階では応用書が必要になる。Rustで始めるネットワークプログラミングはその橋渡し役として、非同期I/Oの実務パターンを具体的なコードで習得できる
出版社による内容紹介
並行プログラミングの基礎的なアルゴリズムと実装方法について解説! 複数のプログラムを並列に実行する「並行プログラミング」は、処理速度を飛躍的に向上させる昔からある手法ですが、タスク管理、プロセス管理、スレッド管理をはじめ、複雑なしくみについての幅広い知識とテクニックが必要となります。本書はRustとCを使い、CPUのアトミック命令、グリーンスレッド、アクターモデル、ソフトウェア・トランザクショナルメモリ、async/awaitなど、並行プログラミングに関する理論的な背景から実装までを網羅的に扱います。ソースコードはGithub上で公開、実際に動作するソースコードを参考にしながら読み進められます。
この本がどの学習段階で役立つかは、 関連する ロードマップ から確認できます。