関連サイト
本書の関連ページが用意されています。
内容紹介
Go言語の並行処理機能なら、直感的で把握しやすい! 複雑なテーマも多数の図と例でよりわかりやすく段階的に解説。
並行処理の原理とベストプラクティスを習得できる。より高速なプログラムが書きたい開発者に最適の書。
並行処理を導入することで、多数のアプリケーションのパフォーマンスと応答性を向上させることができます。
【本書を読めば、次のことを理解・実践できるようになります】
◆反応性が高く高性能でスケーラブルなソフトウェアを作成できるようになる
◆並行処理の利点・制限・特性を理解できるようになる
◆メモリ共有とメッセージパッシングを区別できるようになる
◆ゴルーチン、ミューテックス、リーダー/ライターロック、ウェイトグループ、チャネル、条件変数を利用できるようになる
◆並行処理で注意すべき典型的なエラーを特定できるようになる
◆より高度なマルチスレッディングでプログラミングのスキルアップが図れる
本書では、Goの構文と機能を説明することに焦点を当てているわけではなく、Go言語を使って並行処理の原則と技術を解説しています。これらの技術のほとんどは他の言語にも適用することができます。
※ 本書は『Learn Concurrent Programming with Go』(Manning Publications)の翻訳書です。
※ 本書では何らかのプログラミング言語の使用経験があることを前提としています(Go言語かC言語系の使用経験があれば本書の理想的な読者です)。
書誌情報
- 著者: James Cutajar(著), 柴田 芳樹(訳)
- 発行日: 2024-12-04 (紙書籍版発行日: 2024-12-04)
- 最終更新日: 2024-12-04
- バージョン: 1.0.0
- ページ数: 336ページ(PDF版換算)
- 対応フォーマット: PDF, EPUB
- 出版社: インプレス
対象読者
Go言語、C言語系、あるいは他の言語のプログラミング経験があり、並行性について学びたい方
著者について
James Cutajar
スケーラブルで高性能なコンピューティングと分散アルゴリズムに関心を持つソフトウェア開発者。20年以上にわたり、さまざまな業界の技術分野で活動してきた。彼のキャリアは、オープンソースのコントリビューター、ブロガー(cutajarjames.com)、技術エバンジェリスト、Udemy講師、書籍の著者である。ソフトウェアを書いていないときは、バイク、サーフィン、スキューバダイビング、軽飛行機を楽しむ。マルタで生まれ、ロンドンに10年近く住み、現在はポルトガルに住んで仕事をしている。
柴田 芳樹
1959年11月生まれ。九州工業大学情報工学科で情報工学を学び、1984年同大学大学院で情報工学修士課程を修了。パロアルト研究所を含む米国ゼロックス社での5年間のソフトウェア開発も含め、Unix(Solaris/Linux)、C、Mesa、C++、Java、Go、TypeScriptなどを用いたさまざまなソフトウェア開発に従事してきた。2017年9月以降、Go言語によるウェブサービスのバックエンドソフトウェア開発に携わっている。2000年以降、私的な時間に技術書の翻訳や講演なども多く行っている。
目次
推薦の言葉
- 著者紹介
目次
まえがき
- 謝辞
本書について
第1部 並行プログラミングの基礎
第1章 並行プログラミングへの第一歩
- 1.1 並行処理について
- 1.2 並行的な世界とのやり取り
- 1.3 スループットの向上
- 1.4 応答性の向上
- 1.5 Goで並行プログラミング
- 1.5.1 ゴルーチンの概要
- 1.5.2 CSPと基本操作による並行性のモデリング
- 1.5.3 独自の並行処理ツールの構築
- 1.6 性能のスケーリング
- 1.6.1 アムダールの法則
- 1.6.2 グスタフソンの法則
第2章 スレッドを扱う
- 2.1 オペレーティングシステムにおけるマルチプロセッシング
- 2.2 プロセスとスレッドによる並行処理の抽象化
- 2.2.1 プロセスによる並行処理
- 2.2.2 プロセスの生成
- 2.2.3 一般的なタスクにマルチプロセッシングを使う
- 2.2.4 スレッドでの並行処理
- 2.2.5 マルチスレッドアプリケーションの実際
- 2.2.6 複数のプロセスとスレッドを一緒に使う
- 2.3 ゴルーチンの何が特別なのか
- 2.3.1 ゴルーチンの生成
- 2.3.2 ユーザー空間でのゴルーチンの実装
- 2.3.3 ゴルーチンのスケジューリング
- 2.4 並行性と並列性
- 2.5 練習問題
第3章 メモリ共有を使ったスレッド間通信
- 3.1 メモリ共有
- 3.2 メモリ共有の実践
- 3.2.1 ゴルーチン間での変数の共有
- 3.2.2 エスケープ分析
- 3.2.3 複数のゴルーチンからの共有変数の更新
- 3.3 競合状態
- 3.3.1 StingyとSpendy:競合状態を作り出す
- 3.3.2 実行のイールドは競合状態には役立たない
- 3.3.3 適切な同期と通信による競合状態の排除
- 3.3.4 Goの競合検出器
- 3.4 練習問題
第4章 ミューテックスを使った同期
- 4.1 ミューテックスによるクリティカルセクションの保護
- 4.1.1 ミューテックスはどのように使うのか
- 4.1.2 ミューテックスと逐次処理
- 4.1.3 ノンブロッキング・ミューテックス・ロック
- 4.2 リーダー・ライター・ミューテックスによる性能向上
- 4.2.1 Goのリーダー・ライター・ミューテックス
- 4.2.2 独自の読み込み優先リーダー・ライター・ミューテックスの構築
- 4.3 練習問題
第5章 条件変数とセマフォ
- 5.1 条件変数
- 5.1.1 ミューテックスと条件変数の組み合わせ
- 5.1.2 シグナルを失う
- 5.1.3 ウェイトとブロードキャストによる複数ゴルーチンの同期
- 5.1.4 条件変数を使ったリーダー・ライター・ロックの再検討
- 5.2 カウンティングセマフォ
- 5.2.1 セマフォとは何か
- 5.2.2 セマフォの構築
- 5.2.3 セマフォで通知を失わない
- 5.3 練習問題
第6章 ウェイトグループとバリアを使った同期
- 6.1 Go のウェイトグループ
- 6.1.1 ウェイトグループでタスクの完了を待つ
- 6.1.2 セマフォを使ったウェイトグループの作成
- 6.1.3 待機中にウェイトグループのサイズを変更
- 6.1.4 柔軟なウェイトグループの構築
- 6.2 バリア
- 6.2.1 バリアとは何か
- 6.2.2 Go でバリアを実装する
- 6.2.3 バリアを使った並列行列乗算
- 6.3 練習問題
第2部 メッセージパッシング
第7章 メッセージパッシングを使った通信
- 7.1 メッセージの送受信
- 7.1.1 チャネルでメッセージの送受信
- 7.1.2 チャネルを使ったメッセージのバッファリング
- 7.1.3 チャネルに方向を与える
- 7.1.4 チャネルをクローズする
- 7.1.5 チャネル経由で関数の結果を受け取る
- 7.2 チャネルを実装する
- 7.2.1 セマフォでチャネルを作成する
- 7.2.2 独自のチャネルにSend()メソッドを実装する
- 7.2.3 独自のチャネルにReceive()メソッドを実装する
- 7.3 練習問題
第8章 チャネルをセレクト
- 8.1 複数のチャネルを組み合わせる
- 8.1.1 複数チャネルから読み込む
- 8.1.2 ノンブロッキングチャネル操作にselectを使う
- 8.1.3 defaultケースで並行計算を実行する
- 8.1.4 チャネルでのタイムアウト
- 8.1.5 selectでチャネルに書き込む
- 8.1.6 nilチャネルでselectのケースを無効化する
- 8.2 メッセージパッシングとメモリ共有のどちらかの選択
- 8.2.1 コードの簡素性を保つ
- 8.2.2 密結合システムと疎結合システムの設計
- 8.2.3 メモリ消費を最適化する
- 8.2.4 効率的なコミュニケーション
- 8.3 練習問題
第9章 チャネルを使ったプログラミング
- 9.1 CSP(communicating sequential processes)
- 9.1.1 不変性で干渉を避ける
- 9.1.2 CSPで並行プログラミング
- 9.2 チャネルで一般的なパターンを再利用
- 9.2.1 quitチャネル
- 9.2.2 チャネルとゴルーチンによるパイプライン化
- 9.2.3 ファンインとファンアウト
- 9.2.4 クローズ時に結果を出力する
- 9.2.5 複数のゴルーチンへブロードキャストする
- 9.2.6 条件成立後にチャネルをクローズする
- 9.2.7 ファーストクラス・オブジェクトとしてチャネルを採用する
- 9.3 練習問題
第3部 並行処理のさらなるトピック
第10章 並行処理パターン
- 10.1 プログラムを分解する
- 10.1.1 タスク分解
- 10.1.2 データ分解
- 10.1.3 粒度を考える
- 10.2 並行処理の実装パターン
- 10.2.1 ループレベル並列処理
- 10.2.2 フォーク/ジョイン・パターン
- 10.2.3 ワーカープールを使う
- 10.2.4 パイプライン処理
- 10.2.5 パイプライン化の特性
- 10.3 練習問題
第11章 デッドロックを回避
- 11.1 デッドロックの特定
- 11.1.1 資源割り当てグラフでデッドロックを可視化
- 11.1.2 台帳におけるデッドロック
- 11.2 デッドロックに対処する
- 11.2.1 デッドロックを検出する
- 11.2.2 デッドロックを回避する
- 11.2.3 デッドロックを防ぐ
- 11.3 チャネルでのデッドロック
- 11.4 練習問題
第12章 アトミック、スピンロック、フューテックス
- 12.1 アトミック変数を使ったロックフリーの同期
- 12.1.1 アトミックな数値で変数を共有
- 12.1.2 アトミックを使った場合の性能ペナルティ
- 12.1.3 アトミックの数値を使ってカウントする
- 12.2 スピンロックでミューテックスを実装する
- 12.2.1 比較とスワップ
- 12.2.2 ミューテックスを構築
- 12.3 スピンロックの改良
- 12.3.1 フューテックスによるロック
- 12.3.2 システムコールの削減
- 12.3.3 Goのミューテックス実装
- 12.4 練習問題