詳解 Rustアトミック操作とロック

―並行処理実装のための低レイヤプログラミング

[cover photo]
TOPICS
Programming
発行年月日
PRINT LENGTH
236
ISBN
978-4-8144-0051-5
原書
Rust Atomics and Locks
FORMAT
Print PDF EPUB
Ebook
3,520円
Ebookを購入する
Print
3,520円

Rustでは並行性を持つプログラムを安全に記述することができます。本書はその並行プログラムの基盤となる、アトミック操作とロックの仕組みについての理解を深め、より安全で効率の良いコードを書くための指南書です。難解だと思われがちなアトミック処理、ロック、メモリオーダリングのような低レイヤを詳細に理解し、アーキテクチャやOSによる相違を知ることで、安全で高性能な並行処理プログラムを実装できるようになります。Rustユーザはもちろん非ユーザにとっても低レイヤプログラミングの優れたリソースとなる一冊です。

目次

序文
まえがき

1章 Rust並行性の基本 
    1.1 Rustのスレッド
    1.2 スコープ付きスレッド
    1.3 所有権の共有と参照カウント 
        1.3.1 static
        1.3.2 リーク 
        1.3.3 参照カウント 
    1.4 借用とデータ競合 
    1.5 内部可変性 
        1.5.1 Cell
        1.5.2 RefCell
        1.5.3 MutexとRwLock
        1.5.4 アトミック型 
        1.5.5 UnsafeCell
    1.6 スレッド安全性:SendとSync
    1.7 ロック:MutexとRwLock
        1.7.1 RustのMutex
        1.7.2 毒されたロック 
        1.7.3 リーダ・ライタ・ロック 
    1.8 待機:パーキングと条件変数 
        1.8.1 スレッドパーキング 
        1.8.2 条件変数 
    1.9 まとめ

2章 アトミック操作 
    2.1 アトミックロードとストア操作 
        2.1.1 例:ストップフラグ 
        2.1.2 例:進捗レポート 
        2.1.3 例:遅延初期化 
    2.2 読み込み更新操作 
        2.2.1 例:複数スレッドからの進捗レポート 
        2.2.2 例:統計値 
        2.2.3 例:IDの発行 
    2.3 比較交換操作 
        2.3.1 例:オーバフローのないIDの発行 
        2.3.2 例:一度だけ行われる遅延初期化 
    2.4 まとめ 

3章 メモリオーダリング 
    3.1 リオーダと最適化 
    3.2 メモリモデル 
    3.3 先行発生関係 
        3.3.1 スレッドの起動とジョイン 
    3.4 Relaxedオーダリング 
    3.5 Release/Acquireオーダリング
        3.5.1 例:ロック 
        3.5.2 例:間接参照を用いた遅延初期化 
    3.6 Consumeオーダリング 
    3.7 Sequentially Consistentオーダリング 
    3.8 フェンス 
    3.9 よくある誤解 
    3.10 まとめ 

4章 スピンロックの実装 
    4.1 最小限の実装 
    4.2 unsafeなスピンロック
    4.3 ロックガードを用いた安全なインターフェイス 
    4.4 まとめ 

5章 チャネルの実装 
    5.1 単純なMutexを用いたチャネル 
    5.2 unsafeなワンショットチャネル 
    5.3 実行時チェックによる安全性 
    5.4 型による安全性 
    5.5 借用を用いてメモリ確保を避ける 
    5.6 ブロッキング 
    5.7 まとめ 

6章 Arcの実装 
    6.1 基本的な参照カウント
        6.1.1 テスト 
        6.1.2 更新 
    6.2 weakポインタ 
        6.2.1 テスト 
    6.3 最適化 
    6.4 まとめ 

7章 プロセッサを理解する 
    7.1 プロセッサ命令 
        7.1.1 ロードとストア 
        7.1.2 リード・モディファイ・ライト 
        7.1.3 Load-Linked命令とStore-Conditional命令
    7.2 キャッシュ 
        7.2.1 キャッシュ一貫性 
        7.2.2 性能への影響 
    7.3 リオーダ 
    7.4 メモリオーダリング 
        7.4.1 x86-64:強く順序付けされたアーキテクチャ 
        7.4.2 ARM64:弱く順序付けされたアーキテクチャ 
        7.4.3 実験 
        7.4.4 メモリフェンス 
    7.5 まとめ 

8章 OSプリミティブ 
    8.1 カーネルとのインターフェイス 
    8.2 POSIX
        8.2.1 Rustでラップする 
    8.3 Linux
        8.3.1 Futex
        8.3.2 Futex操作
        8.3.3 Futex操作の優先度継承 
    8.4 macOS
        8.4.1 os_unfair_lock
    8.5 Windows
        8.5.1 重量カーネルオブジェクト 
        8.5.2 軽量オブジェクト 
        8.5.3 アドレスベースの待機 
    8.6 まとめ 

9章 ロックの実装 
    9.1 Mutex
        9.1.1 システムコールを避ける 
        9.1.2 さらなる改良 
        9.1.3 ベンチマーク 
    9.2 条件変数 
        9.2.1 システムコールを避ける 
        9.2.2 偽の待機解除を避ける 
    9.3 リーダ・ライタ・ロック
        9.3.1 ライタのビジーループを回避する 
        9.3.2 ライタ・スタベーションの回避 
    9.4 まとめ 

10章 アイディアとインスピレーション 
    10.1 セマフォ 
    10.2 RCU
    10.3 ロックフリー連結リスト 
    10.4 キューベースのロック 
    10.5 パーキングロットベースロック 
    10.6 シーケンスロック 
    10.7 学習教材

索引