---
# System prepended metadata

title: 第17回 Go言語と並列処理（2）
tags: [Goならわかるシステムプログラミング]

---

###### tags: `Goならわかるシステムプログラミング`

# 第17回 Go言語と並列処理（2）
https://ascii.jp/elem/000/001/480/1480872/

goroutineは，goを付けて関数呼び出しを行うだけで使用可能．

## 1. スレッドとgoroutineの違い

スレッド：メモリにロードされたプログラムの現在の実行状態を持つ仮想CPU
* ランキューに入ったスレッドは，優先度ごとに時間分割されたCPUコアにマッピングされて実行される

goroutine：OSのスレッドに自動的にマッピングされる擬似スレッド
* 初期スタックメモリのサイズが小さく（2KB）、起動処理が軽い

## 2. GoのランタイムはミニOS
コンテクストスイッチ：スレッドごとの状態変数などの切り替え

1つのスレッドをCPUとみなし，ランタイムでgoroutineを管理できる

* 大量のクライアントを効率よくさばける
* ブロッキングがスレッド自体を占拠しないので，残りのタイムスライスで別の処理が可能
* ブロッキングされたgoroutineを網羅できる

## 3. runtimeパッケージのgoroutine関連の機能

* runtime.LockOSThread()：現在実行中のOSスレッドに限定
* runtime.Gosched()：現在実行中のgoroutineを一時中断．使わない．
* runtime.GOMAXPROCS(n)：同時に実行するOSスレッド数を制御．物理コア数に合わせたりなど

## 4. Race Detector

* -raceオプション：データ競合を発見する

## 5. syncパッケージ

チャネルとselectで並列処理は実装可能

既存の並列化のAPIに沿ったsyncパッケージ

* 無い機能
スレッドローカルストレージ：スレッドごとデータを保存．IDを持たないので無い
スピンロック：ビジーループによるロック.１つのgoroutineが軽いので無い．

* sync.Mutex
Mutex：マルチプレクサ．複数の入力を一つに絞る
メモリ空間への実行パスを保護(排他制御)する．

サンプルコード
idのインクリメント：メモリを読み込んで書き換えるgoroutineを１つに制限
main()が終了したらプログラムが終了してしまう

* sync.WaitGroup
goroutineのジョブ終了待ち
* sync.Once
処理を一度だけ実行．初期化処理の遅延などに使用．
* sync.Cond
タスクがが完了したら待っているすべてのgoroutineに通知．Cond.Broadcast()
* sync.Pool
オブジェクトのキャッシュ
WeakRef：弱参照のオブジェクトは，メモリが圧迫した場合GCで除去しうる．

## 6. sync/atomicパッケージ

不可分操作：
* 全操作が完了するまで、他のプロセスはその途中の状態を観測できない．
* 一部操作が失敗したら組合せ全体が失敗し、システムの状態は不可分操作を行う前の状態に戻る．


# 第18回 Go言語と並列処理（3）
https://ascii.jp/elem/000/001/486/1486902/

GPUのスレッディンングモデル

## 1. Goにおける並行・並列処理のパターン集

* 同期→非同期化
重い処理をgoroutineで分割実行して非同期化
* 非同期→同期化
selectやチャネルを使用して処理を同期させる
* タスク生成と処理を分ける: Producer-Consumer
goroutineならC側が余剰でも安全
プロセス間→メッセージキュー
メッセージキュー：ラムダ間の処理を協調させるためのデータの受け渡しを行うキュー
* 開始した順で処理する: チャネルのチャネル
チャネル：FIFOのキュー
チャネルのチャネルで処理の開始順に
* タスク処理が詰まったら待機: バックプレッシャー
送信量の逆向き制御．Goならチャネルにバッファをつける．
* 並列Forループ
CPUのコア数が上限
* 決まった数のgoroutineでタスクを消化: ワーカープール
事前に作られたワーカーが並列でタスクを消化．
* 依存関係のあるタスクを表現する: Future/Promise
依存関係のあるタスクをパイプラインとして表現．必要なデータがそろったタスクが逐次実行．
* イベントの流れを定義する: ReactiveX
オブザーバーパターン：監視している値が変更されると，監視している側に確実に通知を行う．
* 自立した複数のシステムで協調動作: アクターモデル


## 2. もう一つの並行・並列実行モデル
* マルチコア
* イベント駆動
* マルチスレッド

GPUによるスレッディング：
* 最大数のスレッドで同一のタスクを処理．
NVIDIA系：32スレッド
AMD系：64スレッド
* SMやCUという計算ユニットにランタイムがタスクを振り分ける
