インプレス[コンピュータ・IT]ムック Go言語で学ぶ並行プログラミング 他言語にも適用できる原則とベストプラクティス
インプレス / 2024年12月04日 / 全335ページ
Go言語の並行処理機能なら、直感的で把握しやすい! 複雑なテーマも多数の図と例でよりわかりやすく段階的に解説。並行処理の原理とベストプラクティスを習得できる。より高速なプログラムが書きたい開発者に最適の書。並行処理を導入することで、多数のアプリケーションのパフォーマンスと応答性を向上させることができます。 ※本書は『Learn Concurrent Programming with Go』の翻訳書です。※本書ではGo言語かC言語系の基礎知識を前提としています。
目次
- サンプルコード・正誤表について
- 推薦の言葉
- 著者紹介
- 目次
- まえがき
- 謝辞
- 本書について
- 第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 プロセスによる並行処理
- サンプルコード・正誤表について
- 推薦の言葉
- 著者紹介
- 目次
- まえがき
- 謝辞
- 本書について
- 第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 練習問題
- 訳者あとがき
- 索引
- 訳者紹介・レビュアー
- 奥付
※このデジタル雑誌には目次に記載されているコンテンツが含まれています。それ以外のコンテンツは、本誌のコンテンツであっても含まれていません のでご注意ください。
※電子版では、紙の雑誌と内容が一部異なる場合や、掲載されないページがある場合があります。