Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rustから学ぶ 非同期処理の仕組み
Search
skanehira
September 10, 2025
Technology
1
370
Rustから学ぶ 非同期処理の仕組み
skanehira
September 10, 2025
Tweet
Share
More Decks by skanehira
See All by skanehira
Reactにおける 良いコンポーネントテストとはなにか
skanehira
1
420
vimconf2025.pdf
skanehira
0
34
findy-ai-terminal.pdf
skanehira
2
490
about_gorilla.vim.pdf
skanehira
0
120
if let temporary scopeについて
skanehira
0
200
build-debugger-in-rust.pdf
skanehira
1
270
Findy感謝祭2024 LT
skanehira
0
150
Rustではじめる負荷試験
skanehira
6
2.3k
Wellcome Vim World
skanehira
3
660
Other Decks in Technology
See All in Technology
TypeScript 7.0の現在地と備え方
uhyo
7
1.8k
Claude Code Skills 勉強会 (DevelersIO向けに調整済み) / claude code skills for devio
masahirokawahara
1
22k
(Test) ai-meetup slide creation
oikon48
3
460
複数クラスタ運用と検索の高度化:ビズリーチにおけるElastic活用事例 / ElasticON Tokyo2026
visional_engineering_and_design
0
170
エンジニアリングマネージャーの仕事
yuheinakasaka
0
110
OCHaCafe S11 #2 コンテナ時代の次の一手:Wasm 最前線
oracle4engineer
PRO
2
150
生成AIで速度と品質を両立する、QAエンジニア・開発者連携のAI協調型テストプロセス
shota_kusaba
0
200
決済サービスを支えるElastic Cloud - Elastic Cloudの導入と推進、決済サービスのObservability
suzukij
2
660
OpenClaw を Amazon Lightsail で動かす理由
uechishingo
0
200
SLI/SLO 導入で 避けるべきこと3選
yagikota
0
110
Tebiki Engineering Team Deck
tebiki
0
27k
社内レビューは機能しているのか
matsuba
0
150
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
Done Done
chrislema
186
16k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
180
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
85
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
How to make the Groovebox
asonas
2
2k
How GitHub (no longer) Works
holman
316
150k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.2k
How to Talk to Developers About Accessibility
jct
2
150
Building Applications with DynamoDB
mza
96
7k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
200
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Transcript
Rustから学ぶ 非同期処理の仕組み
自己紹介 ゴリラです。 株式会社テックリードという会社をやってい ます。 主にフロントエンド・バックエンドエンジニ アとして仕事しています。 好物は Vim, Go, Rust,
TypeScript, Deno, Wasm などです。 X : https://x.com/gorilla0513 zenn : https://zenn.dev/skanehira GitHub: https://github.com/skanehira
本日のテーマ • Rustのコードから非同期処理の仕組みについて解説 • 主に以下のことを話す • 非同期処理 • 並行処理・並列処理 •
async/await • コルーチン • ※専門分野ではないので間違ったことを言っていたら指摘ください
はじめに • コード1, 2はともに並行で実行される • しかし動作する仕組みが異なる
非同期処理とは
非同期処理とは • 1つのタスクが待機中でも他の処理を進められる仕組み • データベースからデータが返ってくるまで他のタスクを処理する • IO待ちしている間はCPUを有効活用する
並行・並列処理とは
並行処理と並列処理の違い • 並行処理 • 一度に複数のタスクを扱うやり方 • 1つのCPUでもタスクを切り替えながら進行する
並行処理と並列処理の違い • 並列処理 • 同時に複数の処理を実行する • 複数CPUコアで物理的に同時実行する
並行処理と並列処理の違い • 並行処理は概念と実装の2つの意味がある ここが混ざって説明されていることが多い印象 • 並行性と並行処理に分けて話したほうがわかりやすそう
並行処理と並列処理の違い • 並行性 : 一度にたくさんのことを扱う構造・やり方 • 並行処理: 1つのCPUでもタスクを切り替えながら同時進行する • Rustの場合、ランタイム次第でコードが並列に動くこともある
非同期、並行・並列処理の違い
非同期、並行・並列処理の違い • 非同期処理 • 単一のタスクに着目して、実行モデル(どう待つか)からの分類 • 並行・並列処理 • 複数のタスクに着目して実行形態(どう複数を扱うか)の分類 •
分類が違うが、日常会話であんまり気にしなくてもよさそう
カフェで例える 並行処理と並列処理
カフェで例える並行処理 店員が一人のみ場合、注文受付・ドリンク・食事用意・会計などを 順に処理する
カフェで例える並行処理 コーヒーを注いでいる間に、パンを電子レンジで温めつつ、会計をす る
カフェで例える並列処理 店員の数を増やして複数の注文を同時に処理する
Rustでの非同期処理
Rustでの非同期処理 OSスレッド
Rustでの非同期処理 async/await
Rustでの非同期処理 •Rustのasync関数はコンパイル時 次のFutureトレイトの実装に変換される •Futureは非同期タスクを抽象化して表現したもの
Rustでの非同期処理 •fetch_data()をコンパイラが次の ようなコードに変換する •poll()を呼ぶことで処理が実行さ れる
Rustでの非同期処理 •poll()は進行不能になったら Poll::Pendingを返し、処理が終わっ たらPoll::Ready(T)を返す •呼び出し側はPoll::Pendingが返っ てきたら別のFuture::poll()を実 行 •.awaitはpoll()の呼び出しに相当 する
Rustでの非同期処理 •Futureを実行するのが非同期ラン タイム •非同期ランタイムはRust本体含ま れておらず、一般的にtokioといっ たサードパーティ製の物を使う
tokioのアーキテクチャの概要
tokioのアーキテクチャの概要 •ワーカー : 各OSスレッドで動作、無限ループでタスクを処理 •ローカルキュー : 各ワーカーが持つタスクキュー、256個が上限 •グローバルキュー: tokio::spawnなどで生成されたタスク初期置き場
tokioのアーキテクチャの概要 •Work Stealing: ローカルキューが空のワーカーが他のワーカーorグ ローバルキューからタスクを盗む •特定のワーカーにタスクが 溜まりすぎないようにするため
•tokioは並列処理と並行処理を併用する •各スレッドは並行処理で、複数スレッドを使って並列処理する •ランタイムの実装によってはシングルスレッドでFutureを実行するシ ンプルなものもある tokioのアーキテクチャの概要
マルチタスクについて
•複数のタスクを効率的に実行する仕組みのこと •並行・並列処理との違い •並行・並列処理: 複数のタスクをどう扱うか(論理モデル) •マルチタスク : 並行処理どう実現するか(実装モデル) •これもあんまりそんなに細かく気にしなくて良さそう マルチタスクについて
•協調的マルチタスク(ノンプリエンプティブ) •非協調的マルチタスク(プリエンプティブ) マルチタスクは2種類ある
•協調的マルチタスク(ノンプリエンプティブ) •制御: プログラム自身が「明示的に」タスクを切り替える方式 •切り替わり: yield()や.awaitなど明示的なタイミング •例: コルーチン(RustのFuture、JSのPromiseなど) •メリット: コンテキストスイッチコストが低い、予測可能 •デメリット:
柔軟にタスクの組み換えができない マルチタスクは2種類ある
•非協調的マルチタスク(プリエンプティブ) •制御: OSやランタイムが「強制的に」タスクを切り替える方式 •切り替わり: シグナルによる割り込みなど •例: OSスレッド •メリット: 基本的に任意のタイミングでタスクを切り替えられる •デメリット:
コンテキストスイッチのコストが高い マルチタスクは2種類ある
コルーチンについて
•コルーチンとは「途中で実行を中断して、あとから再開できる関数」 •async/await, ジェネレーターなど コルーチンとは
•スタックフルコルーチン •コルーチンごとにスタックを持ち、スタックを保存・復元すること で基本的にどこでも中断・再開できる •例: グリーンスレッド(後で説明) •スタックレスコルーチン •コルーチンごとにスタックを持たない、中断点でのみ中断できる •RustのFutureはスタックレスコルーチン コルーチンについて
•関数呼び出しを管理するためのLIFO •各スタックは以下の情報を持つ •戻りアドレス •引数・ローカル変数 •CPUレジスタの値: pc, spなど •このスタックを保存・復元することで コンテキストスイッチする スタックとは
グリーンスレッドについて
•スタックフルコルーチン •ユーザ空間で実装されたOSスレッドのようなもの •OSスレッドと比べると •保存する情報量が少ない •カーネルの介在不要 •コンテキストスイッチコストが低い&作成可能な数多い グリーンスレッドとは
グリーンスレッドの実装
グリーンスレッドの実装
•空いているスレッドを取得 •スレッドのスタックに呼び出 す関数のアドレスを書き込む •コンテキストスイッチすると きに、呼び出す関数のアドレ スが格納されているスタック のアドレスをコンテキストに 配置 グリーンスレッドの実装
•スレッドごとにスタック、レ ジスタ情報などを持つ •スタックは実行関数のアドレ スを保持 •ThreadContextを保存・復元 することでコンテキストス イッチする グリーンスレッドの実装
•t_yield()で現在と切り替え 先のスレッドのコンテキスト を取得して、switchでコンテ キストスイッチ グリーンスレッドの実装
•アセンブリでThreadContext を使って実行する関数をス イッチする •rdiが現在、rsiが切り替え先 のThreadContext グリーンスレッドの実装
グリーンスレッドの実装 •より詳細を知りたい人は https://www.packtpub.com/en-us/product/ asynchronous-programming-in-rust-9781805128137 を買って読んでみ てください •本日の発表した内容がほとんどこの本に詰まっています
余談: Goのgoroutineについて
• Goのgoroutineはグリーンスレッドかつ、非協調的マルチタスク • 明示的に中断する必要はなく、Goランタイムがよしなに中断・再開してくれる • スタックを保存・復元することで基本的にどこでも中断・再開 • OSシグナルで強制中断 • ただし、中断ポイントが安全かどうかをチェックしている
• 例えばシステムコール中やアトミックな操作シーケンスの場合は安全ではないの で中断できない • この2つを組みわせることで、非協調的マルチタスクを実現している • goroutineはいわば、OSスレッドのようなものをGoランタイム上で実装している Goのgoroutineについて
• Rustにもgoroutineのようなスタックフルコルーチンのクレートがある • https://github.com/Xudong-Huang/may Goのgoroutineについて
• 非同期処理: 単一タスクが待機中でも他の処理を進められる仕組み • 並行処理: 一度に複数のタスクを扱うやり方(概念モデル) • 並列処理: 一度に複数のタスクを物理的に同時実行(実行モデル) •
マルチタスク: 複数のタスクを切り替える仕組み(実行モデル) • 協調的: 明示的に切り替え • コルーチン: 中断・再開できる関数 • スタックレス: await/yieldなどの中断点のみ再開可能 • スタックフル: 任意の場所で再開可能 • グリーンスレッド: ユーザ空間で実装されたスタックフルコルーチン • 非協調的: OSやランタイムで割り込みで強制的に切り替え • OSスレッド まとめ
ありがとうございました