達人出版会 | 夏休みに読みたい!インプレス&近代科学社フェア
Go言語で学ぶ並行プログラミング  他言語にも適用できる原則とベストプラクティス

Go言語で学ぶ並行プログラミング 他言語にも適用できる原則とベストプラクティス

James Cutajar

インプレス

Go言語の並行処理機能なら、直感的で把握しやすい! 複雑なテーマも多数の図と例でよりわかりやすく段階的に解説。並行処理の原理とベストプラクティスを習得できる。より高速なプログラムが書きたい開発者に最適の書。

PDF EPUB固定
SALE 3,850円 1,925円 (税込)

【注意】本書のEPUB版は固定レイアウト型になっております。文字の大きさの変更や検索、引用などはお使いいただけません。画面の大きい端末でご利用ください。

ギフト用に購入

書籍情報

著者: James Cutajar
共著者: , 柴田 芳樹(訳)

発行日: 2024-12-04
最終更新日: 2024-12-04

バージョン: 1.0.0
ページ数: 336ページ(PDF版換算)ページ
対応フォーマット: PDF, EPUB
出版社: インプレス

対象読者

Go言語、C言語系、あるいは他の言語のプログラミング経験があり、並行性について学びたい方

著者について
James Cutajar

スケーラブルで高性能なコンピューティングと分散アルゴリズムに関心を持つソフトウェア開発者。20年以上にわたり、さまざまな業界の技術分野で活動してきた。彼のキャリアは、オープンソースのコントリビューター、ブロガー(cutajarjames.com)、技術エバンジェリスト、Udemy講師、書籍の著者である。ソフトウェアを書いていないときは、バイク、サーフィン、スキューバダイビング、軽飛行機を楽しむ。マルタで生まれ、ロンドンに10年近く住み、現在はポルトガルに住んで仕事をしている。

目次

推薦の言葉

  • 著者紹介

目次

まえがき

  • 謝辞

本書について

第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 練習問題

訳者あとがき

索引