Upgrade to Pro — share decks privately, control downloads, hide ads and more …

カーネルランド Rust 勉強会 #3: 並行処理における安全性

カーネルランド Rust 勉強会 #3: 並行処理における安全性

2026-07-03 に開催した勉強会のスライドに加筆したもの。

Avatar for Shin-ya Koga

Shin-ya Koga

July 05, 2026

More Decks by Shin-ya Koga

Other Decks in Technology

Transcript

  1. 並行処理に対する Rust の安全性 逐次処理でのメモリ安全性方策の援用 値の所有権と生存期間/スコープ move で、スレッドのクロージャに値を移動できる 参照の借用と生存期間/スコープ スレッドのクロージャによる参照の借用:禁止! 値をスレッドに移動した後はアクセスできない

    理由:スレッドの生存期間とスレッドを作った 側の生存期間の関係は一意に決まらない。 スレッド間でのデータ共有が許されない:不便では? マルチスレッドでの競合回避原則:排他制御の方策 ではあるけど、厳しすぎない?(※共有してない!)
  2. 並行処理に対する Rust の安全性 もっと柔軟に:スレッド間のデータ共有 mutable な大域変数に対するアクセス禁止の 解: Mutex<T> Mutex の

    lock() は、mutable な参照を返す。 ただし、Mutex も値であり、スレッド間で共有不可 ・・・どうすれば?
  3. 並行処理に対する Rust の安全性 もっと柔軟に:スレッド間のデータ共有 mutable な大域変数に対するアクセス禁止の 解: Mutex<T> Mutex の

    lock() は、mutable な参照を返す。 明示的な参照カウンタ型:マルチスレッド対応版 Arc<T> (instead Rc<T>) ただし、Mutex も値であり、スレッド間で共有不可 ・・・どうすれば?
  4. 並行処理に対する Rust の安全性 スレッド間「通信」用の二つの trait スレッド同士でチャネル通信できる Send と Sync (std::marker,

    core::marker) std::sync::mpsc の channel() と sync_channel() ・channel<T>() -> (Sender<T>, Receiver<T>) ・sync_channel<T>(bound) -> (SyncSender<T>, Receiver<T>) https://doc.rust-lang.org/std/sync/mpsc/fn.channel.html https://doc.rust-lang.org/std/sync/mpsc/fn.sync_channel.html channel: サイズが無限/未定義の「キュー」 sync_channel: サイズが有限の「キュー」 サイズが 1 の sync_channel では、送信と受信が 常に同期する。
  5. 並行処理に対する Rust の安全性 スレッド間「通信」用の二つの trait スレッド同士でチャネル通信できる Send と Sync (std::marker,

    core::marker) ラフな定義:ある型 T の参照が Send を満た すなら、T は Sync を満たす。 e.g. Rc<T> is not Send, Arc<T> is Send Send: スレッド間で転送できるものが満たす型 Sync: スレッド間で参照を共有できるものが満たす型 https://doc.rust-lang.org/std/marker/trait.Send.html https://doc.rust-lang.org/std/marker/trait.Sync.html
  6. 並行処理に対する Rust の安全性 スレッド間「通信」用の二つの trait スレッド同士でチャネル通信できる Send と Sync (std::marker,

    core::marker) ラフな定義:ある型 T の参照が Send を満た すなら、T は Sync を満たす。 Rc<T> is not Send, Arc<T> is Send 状況に応じて、ゼロコピーないし必要最小限の コピーしか起きないように実装されている(?)
  7. 並行処理に対する Rust の安全性 Eiffel 陣営からのコメント How DbC catches the security

    flaws that Rust misses https://www.eiffel.org/node/506 C 実装の XML パーザにあった三つの脆弱性のうち、 Rust に書き換えることで解消できるものと、できない ものを解説
  8. 並行処理に対する Rust の安全性 Eiffel 陣営からのコメント How DbC catches the security

    flaws that Rust misses https://www.eiffel.org/node/506 C 実装の XML パーザにあった三つの脆弱性のうち、 Rust に書き換えることで解消できるものと、できない ものを解説 DbC (Design by Contract) メモリ安全性の仕組みだけでは不十分であり、ロジックが 正しく設計されなければならない、という意見
  9. カーネル分野での Rust の現実 (2024) Rust for Linuxの現実:安全性・性能・開 発体制を実証研究から見る https://zenn.dev/su8/articles/7291385a521b62 An

    Empirical Study of Rust-for-Linux: The Success, Dissatisfaction, and Compromise https://www.usenix.org/conference/atc24/presentati on/li-hongyu
  10. 組み込み/エッジで Rust: どこから? nostd な Rust で何ができるの? 割り込みハンドラを Rust で書けるの?

    次回は、このあたりを取り上げてみます! core モジュールは使用可能