Async
DeepDive
before de:code
2016.05.23 DE:CODE前夜祭 KOUJI MATSUI (@KEKYO2)
自己紹介
けきょ (@kekyo2, www.kekyo.net)
ロードバイク乗り
Microsoft MVP for Visual Studio and Development Technology
認定スクラムマスター・スクラムプロダクトオーナー
Center CLRオーガナイザー
C#, F#, IL, C++
アジェンダ
なぜ非同期処理が必要なのか、上から下までをやります
細部はきりがないので、質問があれば随時受けます
こんな非同期処理のコード
非同期処理の実現には、
ワーカースレッドを使うのか?
ワーカースレッドを使わない
高いパフォーマンス
ユーザーモード
User mode thread context
Event Object
カーネルモード
User mode thread context
デバイス応答
Interrupt handler context
Come back Salmon
どのプロセスに戻せばいいのか?
どのスレッドに戻せばいいのか?
DPC context
(Unknown thread)
Event Object
I/O Completion port
Thread pool
再びユーザーモード I/O completion port
Managed thread
(Main/other)
Thread pool
CPS (Task.ContinueWith)
Worker thhread
context
I/O完了ポート
ここに至るまでの間、基本的にワー
カースレッドは全て解放され、ハー
ドウェア駆動による処理だけが実行
されている(→完全にハードウェア
オフロードされている)
だから完全に非同期処理でコードを
実現すると、高パフォーマンスが得
られる。いかにワーカースレッドを
「使わないか」が鍵。
カーネルイベントオブジェクトでI/O処理の完了が通知され、.NET
ThreadPoolからI/O完了ポートを使ってワーカースレッドが割り当てら
れて実行される。
という事は:
Task.Run() 使ったら負け
Task.Wait(), Task.Result 使ったら負け
Async.RunSyncronosly 使ったら負け
ご清聴ありがとうございました!
スライドはブログに上げます
◦ http://www.kekyo.net/
Async訪ねて3000里
◦ Async訪ねて3000里 (1): ユーザーモードのターン
Async訪ねて3000里 (2): ファイルシステム・パーティションマネージャ・物理
ディスクデバイスドライバ
Async訪ねて3000里 (3): ハードウェア割り込みとDPC
Async訪ねて3000里 (4): I/Oの完了とAPC
Async訪ねて3000里 (5): TaskCompletionSourceでTaskの継続へ
Async訪ねて3000里 (6): I/O完了ポートによるワーカースレッドの運用
Asyncの基礎
◦ これからの「async/await」の話をしよう
http://www.slideshare.net/kekyo/asyncawait-41353786
◦ async/awaitダークサイドis何
http://www.slideshare.net/kekyo/asyncawait-is

Async deepdive before de:code